| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |