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

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, 9 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, crossThreadBind(&MainThreadLoaderHolder::cancel,
284 m_mainThreadLoaderHolder)); 283 m_mainThreadLoaderHolder));
285 m_mainThreadLoaderHolder = nullptr; 284 m_mainThreadLoaderHolder = nullptr;
286 } 285 }
287 286
288 if (!m_client) 287 if (!m_client)
289 return; 288 return;
290 289
291 // If the client hasn't reached a termination state, then transition it 290 // If the client hasn't reached a termination state, then transition it
292 // by sending a cancellation error. 291 // by sending a cancellation error.
293 // Note: no more client callbacks will be done after this method -- the 292 // Note: no more client callbacks will be done after this method -- the
294 // clearClient() call ensures that. 293 // clearClient() call ensures that.
295 ResourceError error(String(), 0, String(), String()); 294 ResourceError error(String(), 0, String(), String());
296 error.setIsCancellation(true); 295 error.setIsCancellation(true);
297 didFail(error); 296 didFail(error);
298 DCHECK(!m_client); 297 DCHECK(!m_client);
299 } 298 }
300 299
301 void WorkerThreadableLoader::didStart( 300 void WorkerThreadableLoader::didStart(
302 MainThreadLoaderHolder* mainThreadLoaderHolder) { 301 MainThreadLoaderHolder* mainThreadLoaderHolder) {
303 DCHECK(!isMainThread()); 302 DCHECK(!isMainThread());
304 DCHECK(!m_mainThreadLoaderHolder); 303 DCHECK(!m_mainThreadLoaderHolder);
305 DCHECK(mainThreadLoaderHolder); 304 DCHECK(mainThreadLoaderHolder);
306 if (!m_client) { 305 if (!m_client) {
307 // The thread is terminating. 306 // The thread is terminating.
308 m_workerLoaderProxy->postTaskToLoader( 307 m_workerLoaderProxy->postTaskToLoader(
309 BLINK_FROM_HERE, createCrossThreadTask(&MainThreadLoaderHolder::cancel, 308 BLINK_FROM_HERE,
310 wrapCrossThreadPersistent( 309 crossThreadBind(&MainThreadLoaderHolder::cancel,
311 mainThreadLoaderHolder))); 310 wrapCrossThreadPersistent(mainThreadLoaderHolder)));
312 return; 311 return;
313 } 312 }
314 313
315 m_mainThreadLoaderHolder = mainThreadLoaderHolder; 314 m_mainThreadLoaderHolder = mainThreadLoaderHolder;
316 } 315 }
317 316
318 void WorkerThreadableLoader::didSendData( 317 void WorkerThreadableLoader::didSendData(
319 unsigned long long bytesSent, 318 unsigned long long bytesSent,
320 unsigned long long totalBytesToBeSent) { 319 unsigned long long totalBytesToBeSent) {
321 DCHECK(!isMainThread()); 320 DCHECK(!isMainThread());
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 ThreadableLoader::trace(visitor); 424 ThreadableLoader::trace(visitor);
426 } 425 }
427 426
428 void WorkerThreadableLoader::MainThreadLoaderHolder::createAndStart( 427 void WorkerThreadableLoader::MainThreadLoaderHolder::createAndStart(
429 WorkerThreadableLoader* workerLoader, 428 WorkerThreadableLoader* workerLoader,
430 PassRefPtr<WorkerLoaderProxy> passLoaderProxy, 429 PassRefPtr<WorkerLoaderProxy> passLoaderProxy,
431 WorkerThreadLifecycleContext* workerThreadLifecycleContext, 430 WorkerThreadLifecycleContext* workerThreadLifecycleContext,
432 std::unique_ptr<CrossThreadResourceRequestData> request, 431 std::unique_ptr<CrossThreadResourceRequestData> request,
433 const ThreadableLoaderOptions& options, 432 const ThreadableLoaderOptions& options,
434 const ResourceLoaderOptions& resourceLoaderOptions, 433 const ResourceLoaderOptions& resourceLoaderOptions,
435 PassRefPtr<WaitableEventWithTasks> eventWithTasks, 434 PassRefPtr<WaitableEventWithTasks> eventWithTasks) {
436 ExecutionContext* executionContext) {
437 DCHECK(isMainThread()); 435 DCHECK(isMainThread());
438 TaskForwarder* forwarder; 436 TaskForwarder* forwarder;
439 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy; 437 RefPtr<WorkerLoaderProxy> loaderProxy = passLoaderProxy;
438 ExecutionContext* loaderContext = loaderProxy->getLoaderExecutionContext();
439 if (!loaderContext)
440 return;
440 if (eventWithTasks) 441 if (eventWithTasks)
441 forwarder = new SyncTaskForwarder(std::move(eventWithTasks)); 442 forwarder = new SyncTaskForwarder(std::move(eventWithTasks));
442 else 443 else
443 forwarder = new AsyncTaskForwarder(loaderProxy); 444 forwarder = new AsyncTaskForwarder(loaderProxy);
444 445
445 MainThreadLoaderHolder* mainThreadLoaderHolder = 446 MainThreadLoaderHolder* mainThreadLoaderHolder =
446 new MainThreadLoaderHolder(forwarder, workerThreadLifecycleContext); 447 new MainThreadLoaderHolder(forwarder, workerThreadLifecycleContext);
447 if (mainThreadLoaderHolder->wasContextDestroyedBeforeObserverCreation()) { 448 if (mainThreadLoaderHolder->wasContextDestroyedBeforeObserverCreation()) {
448 // The thread is already terminating. 449 // The thread is already terminating.
449 forwarder->abort(); 450 forwarder->abort();
450 mainThreadLoaderHolder->m_forwarder = nullptr; 451 mainThreadLoaderHolder->m_forwarder = nullptr;
451 return; 452 return;
452 } 453 }
453 mainThreadLoaderHolder->m_workerLoader = workerLoader; 454 mainThreadLoaderHolder->m_workerLoader = workerLoader;
454 forwarder->forwardTask( 455 forwarder->forwardTask(
455 BLINK_FROM_HERE, 456 BLINK_FROM_HERE,
456 crossThreadBind(&WorkerThreadableLoader::didStart, 457 crossThreadBind(&WorkerThreadableLoader::didStart,
457 wrapCrossThreadPersistent(workerLoader), 458 wrapCrossThreadPersistent(workerLoader),
458 wrapCrossThreadPersistent(mainThreadLoaderHolder))); 459 wrapCrossThreadPersistent(mainThreadLoaderHolder)));
459 mainThreadLoaderHolder->start(*toDocument(executionContext), 460 mainThreadLoaderHolder->start(
460 std::move(request), options, 461 *toDocument(loaderProxy->getLoaderExecutionContext()), std::move(request),
yhirano 2017/02/23 05:55:58 loaderContext
kinuko 2017/02/23 07:35:29 Done.
461 resourceLoaderOptions); 462 options, 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