Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(746)

Side by Side Diff: third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp

Issue 2709193002: WorkerLoaderProxy: stop accessing cross-thread execution context (Closed)
Patch Set: . Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009, 2010 Google Inc. All rights reserved. 2 * Copyright (C) 2009, 2010 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 13 matching lines...) Expand all
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #include "core/loader/WorkerThreadableLoader.h" 31 #include "core/loader/WorkerThreadableLoader.h"
32 32
33 #include "core/dom/Document.h" 33 #include "core/dom/Document.h"
34 #include "core/dom/ExecutionContextTask.h"
35 #include "core/loader/DocumentThreadableLoader.h" 34 #include "core/loader/DocumentThreadableLoader.h"
36 #include "core/timing/WorkerGlobalScopePerformance.h" 35 #include "core/timing/WorkerGlobalScopePerformance.h"
37 #include "core/workers/WorkerGlobalScope.h" 36 #include "core/workers/WorkerGlobalScope.h"
38 #include "core/workers/WorkerLoaderProxy.h" 37 #include "core/workers/WorkerLoaderProxy.h"
39 #include "platform/CrossThreadFunctional.h" 38 #include "platform/CrossThreadFunctional.h"
40 #include "platform/heap/SafePoint.h" 39 #include "platform/heap/SafePoint.h"
41 #include "platform/network/ResourceError.h" 40 #include "platform/network/ResourceError.h"
42 #include "platform/network/ResourceRequest.h" 41 #include "platform/network/ResourceRequest.h"
43 #include "platform/network/ResourceResponse.h" 42 #include "platform/network/ResourceResponse.h"
44 #include "platform/network/ResourceTimingInfo.h" 43 #include "platform/network/ResourceTimingInfo.h"
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 m_workerGlobalScope->outgoingReferrer())); 228 m_workerGlobalScope->outgoingReferrer()));
230 } 229 }
231 230
232 DCHECK(!isMainThread()); 231 DCHECK(!isMainThread());
233 RefPtr<WaitableEventWithTasks> eventWithTasks; 232 RefPtr<WaitableEventWithTasks> eventWithTasks;
234 if (m_blockingBehavior == LoadSynchronously) 233 if (m_blockingBehavior == LoadSynchronously)
235 eventWithTasks = WaitableEventWithTasks::create(); 234 eventWithTasks = WaitableEventWithTasks::create();
236 235
237 m_workerLoaderProxy->postTaskToLoader( 236 m_workerLoaderProxy->postTaskToLoader(
238 BLINK_FROM_HERE, 237 BLINK_FROM_HERE,
239 createCrossThreadTask( 238 crossThreadBind(
240 &MainThreadLoaderHolder::createAndStart, 239 &MainThreadLoaderHolder::createAndStart,
241 wrapCrossThreadPersistent(this), m_workerLoaderProxy, 240 wrapCrossThreadPersistent(this), m_workerLoaderProxy,
242 wrapCrossThreadPersistent( 241 wrapCrossThreadPersistent(
243 m_workerGlobalScope->thread()->getWorkerThreadLifecycleContext()), 242 m_workerGlobalScope->thread()->getWorkerThreadLifecycleContext()),
244 request, m_threadableLoaderOptions, m_resourceLoaderOptions, 243 request, m_threadableLoaderOptions, m_resourceLoaderOptions,
245 eventWithTasks)); 244 eventWithTasks));
246 245
247 if (m_blockingBehavior == LoadAsynchronously) 246 if (m_blockingBehavior == LoadAsynchronously)
248 return; 247 return;
249 248
(...skipping 15 matching lines...) Expand all
265 } 264 }
266 } 265 }
267 266
268 void WorkerThreadableLoader::overrideTimeout( 267 void WorkerThreadableLoader::overrideTimeout(
269 unsigned long timeoutMilliseconds) { 268 unsigned long timeoutMilliseconds) {
270 DCHECK(!isMainThread()); 269 DCHECK(!isMainThread());
271 if (!m_mainThreadLoaderHolder) 270 if (!m_mainThreadLoaderHolder)
272 return; 271 return;
273 m_workerLoaderProxy->postTaskToLoader( 272 m_workerLoaderProxy->postTaskToLoader(
274 BLINK_FROM_HERE, 273 BLINK_FROM_HERE,
275 createCrossThreadTask(&MainThreadLoaderHolder::overrideTimeout, 274 crossThreadBind(&MainThreadLoaderHolder::overrideTimeout,
276 m_mainThreadLoaderHolder, timeoutMilliseconds)); 275 m_mainThreadLoaderHolder, timeoutMilliseconds));
277 } 276 }
278 277
279 void WorkerThreadableLoader::cancel() { 278 void WorkerThreadableLoader::cancel() {
280 DCHECK(!isMainThread()); 279 DCHECK(!isMainThread());
281 if (m_mainThreadLoaderHolder) { 280 if (m_mainThreadLoaderHolder) {
282 m_workerLoaderProxy->postTaskToLoader( 281 m_workerLoaderProxy->postTaskToLoader(
283 BLINK_FROM_HERE, createCrossThreadTask(&MainThreadLoaderHolder::cancel, 282 BLINK_FROM_HERE,
284 m_mainThreadLoaderHolder)); 283 crossThreadBind(&MainThreadLoaderHolder::cancel,
284 m_mainThreadLoaderHolder));
285 m_mainThreadLoaderHolder = nullptr; 285 m_mainThreadLoaderHolder = nullptr;
286 } 286 }
287 287
288 if (!m_client) 288 if (!m_client)
289 return; 289 return;
290 290
291 // If the client hasn't reached a termination state, then transition it 291 // If the client hasn't reached a termination state, then transition it
292 // by sending a cancellation error. 292 // by sending a cancellation error.
293 // Note: no more client callbacks will be done after this method -- the 293 // Note: no more client callbacks will be done after this method -- the
294 // clearClient() call ensures that. 294 // clearClient() call ensures that.
295 ResourceError error(String(), 0, String(), String()); 295 ResourceError error(String(), 0, String(), String());
296 error.setIsCancellation(true); 296 error.setIsCancellation(true);
297 didFail(error); 297 didFail(error);
298 DCHECK(!m_client); 298 DCHECK(!m_client);
299 } 299 }
300 300
301 void WorkerThreadableLoader::didStart( 301 void WorkerThreadableLoader::didStart(
302 MainThreadLoaderHolder* mainThreadLoaderHolder) { 302 MainThreadLoaderHolder* mainThreadLoaderHolder) {
303 DCHECK(!isMainThread()); 303 DCHECK(!isMainThread());
304 DCHECK(!m_mainThreadLoaderHolder); 304 DCHECK(!m_mainThreadLoaderHolder);
305 DCHECK(mainThreadLoaderHolder); 305 DCHECK(mainThreadLoaderHolder);
306 if (!m_client) { 306 if (!m_client) {
307 // The thread is terminating. 307 // The thread is terminating.
308 m_workerLoaderProxy->postTaskToLoader( 308 m_workerLoaderProxy->postTaskToLoader(
309 BLINK_FROM_HERE, createCrossThreadTask(&MainThreadLoaderHolder::cancel, 309 BLINK_FROM_HERE,
310 wrapCrossThreadPersistent( 310 crossThreadBind(&MainThreadLoaderHolder::cancel,
311 mainThreadLoaderHolder))); 311 wrapCrossThreadPersistent(mainThreadLoaderHolder)));
312 return; 312 return;
313 } 313 }
314 314
315 m_mainThreadLoaderHolder = mainThreadLoaderHolder; 315 m_mainThreadLoaderHolder = mainThreadLoaderHolder;
316 } 316 }
317 317
318 void WorkerThreadableLoader::didSendData( 318 void WorkerThreadableLoader::didSendData(
319 unsigned long long bytesSent, 319 unsigned long long bytesSent,
320 unsigned long long totalBytesToBeSent) { 320 unsigned long long totalBytesToBeSent) {
321 DCHECK(!isMainThread()); 321 DCHECK(!isMainThread());
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 ThreadableLoader::trace(visitor); 425 ThreadableLoader::trace(visitor);
426 } 426 }
427 427
428 void WorkerThreadableLoader::MainThreadLoaderHolder::createAndStart( 428 void WorkerThreadableLoader::MainThreadLoaderHolder::createAndStart(
429 WorkerThreadableLoader* workerLoader, 429 WorkerThreadableLoader* workerLoader,
430 PassRefPtr<WorkerLoaderProxy> passLoaderProxy, 430 PassRefPtr<WorkerLoaderProxy> passLoaderProxy,
431 WorkerThreadLifecycleContext* workerThreadLifecycleContext, 431 WorkerThreadLifecycleContext* workerThreadLifecycleContext,
432 std::unique_ptr<CrossThreadResourceRequestData> request, 432 std::unique_ptr<CrossThreadResourceRequestData> request,
433 const ThreadableLoaderOptions& options, 433 const ThreadableLoaderOptions& options,
434 const ResourceLoaderOptions& resourceLoaderOptions, 434 const ResourceLoaderOptions& resourceLoaderOptions,
435 PassRefPtr<WaitableEventWithTasks> eventWithTasks, 435 PassRefPtr<WaitableEventWithTasks> eventWithTasks) {
436 ExecutionContext* executionContext) {
437 DCHECK(isMainThread()); 436 DCHECK(isMainThread());
438 TaskForwarder* forwarder; 437 TaskForwarder* forwarder;
439 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy; 438 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy;
439 ExecutionContext* loaderContext = loaderProxy->getLoaderExecutionContext();
440 if (!loaderContext)
441 return;
440 if (eventWithTasks) 442 if (eventWithTasks)
441 forwarder = new SyncTaskForwarder(std::move(eventWithTasks)); 443 forwarder = new SyncTaskForwarder(std::move(eventWithTasks));
442 else 444 else
443 forwarder = new AsyncTaskForwarder(loaderProxy); 445 forwarder = new AsyncTaskForwarder(loaderProxy);
444 446
445 MainThreadLoaderHolder* mainThreadLoaderHolder = 447 MainThreadLoaderHolder* mainThreadLoaderHolder =
446 new MainThreadLoaderHolder(forwarder, workerThreadLifecycleContext); 448 new MainThreadLoaderHolder(forwarder, workerThreadLifecycleContext);
447 if (mainThreadLoaderHolder->wasContextDestroyedBeforeObserverCreation()) { 449 if (mainThreadLoaderHolder->wasContextDestroyedBeforeObserverCreation()) {
448 // The thread is already terminating. 450 // The thread is already terminating.
449 forwarder->abort(); 451 forwarder->abort();
450 mainThreadLoaderHolder->m_forwarder = nullptr; 452 mainThreadLoaderHolder->m_forwarder = nullptr;
451 return; 453 return;
452 } 454 }
453 mainThreadLoaderHolder->m_workerLoader = workerLoader; 455 mainThreadLoaderHolder->m_workerLoader = workerLoader;
454 forwarder->forwardTask( 456 forwarder->forwardTask(
455 BLINK_FROM_HERE, 457 BLINK_FROM_HERE,
456 crossThreadBind(&WorkerThreadableLoader::didStart, 458 crossThreadBind(&WorkerThreadableLoader::didStart,
457 wrapCrossThreadPersistent(workerLoader), 459 wrapCrossThreadPersistent(workerLoader),
458 wrapCrossThreadPersistent(mainThreadLoaderHolder))); 460 wrapCrossThreadPersistent(mainThreadLoaderHolder)));
459 mainThreadLoaderHolder->start(*toDocument(executionContext), 461 mainThreadLoaderHolder->start(*toDocument(loaderContext), std::move(request),
460 std::move(request), options, 462 options, resourceLoaderOptions);
461 resourceLoaderOptions);
462 } 463 }
463 464
464 WorkerThreadableLoader::MainThreadLoaderHolder::~MainThreadLoaderHolder() { 465 WorkerThreadableLoader::MainThreadLoaderHolder::~MainThreadLoaderHolder() {
465 DCHECK(isMainThread()); 466 DCHECK(isMainThread());
466 DCHECK(!m_workerLoader); 467 DCHECK(!m_workerLoader);
467 } 468 }
468 469
469 void WorkerThreadableLoader::MainThreadLoaderHolder::overrideTimeout( 470 void WorkerThreadableLoader::MainThreadLoaderHolder::overrideTimeout(
470 unsigned long timeoutMilliseconds) { 471 unsigned long timeoutMilliseconds) {
471 DCHECK(isMainThread()); 472 DCHECK(isMainThread());
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
665 const ResourceLoaderOptions& originalResourceLoaderOptions) { 666 const ResourceLoaderOptions& originalResourceLoaderOptions) {
666 DCHECK(isMainThread()); 667 DCHECK(isMainThread());
667 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions; 668 ResourceLoaderOptions resourceLoaderOptions = originalResourceLoaderOptions;
668 resourceLoaderOptions.requestInitiatorContext = WorkerContext; 669 resourceLoaderOptions.requestInitiatorContext = WorkerContext;
669 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, options, 670 m_mainThreadLoader = DocumentThreadableLoader::create(document, this, options,
670 resourceLoaderOptions); 671 resourceLoaderOptions);
671 m_mainThreadLoader->start(ResourceRequest(request.get())); 672 m_mainThreadLoader->start(ResourceRequest(request.get()));
672 } 673 }
673 674
674 } // namespace blink 675 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698