| 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 26 matching lines...) Expand all Loading... |
| 37 #include "core/workers/WorkerGlobalScope.h" | 37 #include "core/workers/WorkerGlobalScope.h" |
| 38 #include "core/workers/WorkerLoaderProxy.h" | 38 #include "core/workers/WorkerLoaderProxy.h" |
| 39 #include "platform/CrossThreadFunctional.h" | 39 #include "platform/CrossThreadFunctional.h" |
| 40 #include "platform/heap/SafePoint.h" | 40 #include "platform/heap/SafePoint.h" |
| 41 #include "platform/network/ResourceError.h" | 41 #include "platform/network/ResourceError.h" |
| 42 #include "platform/network/ResourceRequest.h" | 42 #include "platform/network/ResourceRequest.h" |
| 43 #include "platform/network/ResourceResponse.h" | 43 #include "platform/network/ResourceResponse.h" |
| 44 #include "platform/network/ResourceTimingInfo.h" | 44 #include "platform/network/ResourceTimingInfo.h" |
| 45 #include "platform/weborigin/KURL.h" | 45 #include "platform/weborigin/KURL.h" |
| 46 #include "platform/weborigin/SecurityPolicy.h" | 46 #include "platform/weborigin/SecurityPolicy.h" |
| 47 #include "wtf/Functional.h" |
| 47 #include "wtf/debug/Alias.h" | 48 #include "wtf/debug/Alias.h" |
| 48 #include <memory> | 49 #include <memory> |
| 49 | 50 |
| 50 namespace blink { | 51 namespace blink { |
| 51 | 52 |
| 52 namespace { | 53 namespace { |
| 53 | 54 |
| 54 std::unique_ptr<Vector<char>> createVectorFromMemoryRegion( | 55 std::unique_ptr<Vector<char>> createVectorFromMemoryRegion( |
| 55 const char* data, | 56 const char* data, |
| 56 unsigned dataLength) { | 57 unsigned dataLength) { |
| 57 std::unique_ptr<Vector<char>> buffer = | 58 std::unique_ptr<Vector<char>> buffer = |
| 58 WTF::makeUnique<Vector<char>>(dataLength); | 59 WTF::makeUnique<Vector<char>>(dataLength); |
| 59 memcpy(buffer->data(), data, dataLength); | 60 memcpy(buffer->data(), data, dataLength); |
| 60 return buffer; | 61 return buffer; |
| 61 } | 62 } |
| 62 | 63 |
| 63 } // namespace | 64 } // namespace |
| 64 | 65 |
| 65 class WorkerThreadableLoader::AsyncTaskForwarder final | 66 class WorkerThreadableLoader::AsyncTaskForwarder final |
| 66 : public WorkerThreadableLoader::TaskForwarder { | 67 : public WorkerThreadableLoader::TaskForwarder { |
| 67 public: | 68 public: |
| 68 explicit AsyncTaskForwarder(PassRefPtr<WorkerLoaderProxy> loaderProxy) | 69 explicit AsyncTaskForwarder(PassRefPtr<WorkerLoaderProxy> loaderProxy) |
| 69 : m_loaderProxy(loaderProxy) { | 70 : m_loaderProxy(loaderProxy) { |
| 70 DCHECK(isMainThread()); | 71 DCHECK(isMainThread()); |
| 71 } | 72 } |
| 72 ~AsyncTaskForwarder() override { DCHECK(isMainThread()); } | 73 ~AsyncTaskForwarder() override { DCHECK(isMainThread()); } |
| 73 | 74 |
| 74 void forwardTask(const WebTraceLocation& location, | 75 void forwardTask(const WebTraceLocation& location, |
| 75 std::unique_ptr<ExecutionContextTask> task) override { | 76 std::unique_ptr<CrossThreadClosure> task) override { |
| 76 DCHECK(isMainThread()); | 77 DCHECK(isMainThread()); |
| 77 m_loaderProxy->postTaskToWorkerGlobalScope(location, std::move(task)); | 78 m_loaderProxy->postTaskToWorkerGlobalScope(location, std::move(task)); |
| 78 } | 79 } |
| 79 void forwardTaskWithDoneSignal( | 80 void forwardTaskWithDoneSignal( |
| 80 const WebTraceLocation& location, | 81 const WebTraceLocation& location, |
| 81 std::unique_ptr<ExecutionContextTask> task) override { | 82 std::unique_ptr<CrossThreadClosure> task) override { |
| 82 DCHECK(isMainThread()); | 83 DCHECK(isMainThread()); |
| 83 m_loaderProxy->postTaskToWorkerGlobalScope(location, std::move(task)); | 84 m_loaderProxy->postTaskToWorkerGlobalScope(location, std::move(task)); |
| 84 } | 85 } |
| 85 void abort() override { DCHECK(isMainThread()); } | 86 void abort() override { DCHECK(isMainThread()); } |
| 86 | 87 |
| 87 private: | 88 private: |
| 88 RefPtr<WorkerLoaderProxy> m_loaderProxy; | 89 RefPtr<WorkerLoaderProxy> m_loaderProxy; |
| 89 }; | 90 }; |
| 90 | 91 |
| 91 struct WorkerThreadableLoader::TaskWithLocation final { | 92 struct WorkerThreadableLoader::TaskWithLocation final { |
| 92 TaskWithLocation(const WebTraceLocation& location, | 93 TaskWithLocation(const WebTraceLocation& location, |
| 93 std::unique_ptr<ExecutionContextTask> task) | 94 std::unique_ptr<CrossThreadClosure> task) |
| 94 : m_location(location), m_task(std::move(task)) {} | 95 : m_location(location), m_task(std::move(task)) {} |
| 95 TaskWithLocation(TaskWithLocation&& task) | 96 TaskWithLocation(TaskWithLocation&& task) |
| 96 : TaskWithLocation(task.m_location, std::move(task.m_task)) {} | 97 : TaskWithLocation(task.m_location, std::move(task.m_task)) {} |
| 97 ~TaskWithLocation() = default; | 98 ~TaskWithLocation() = default; |
| 98 | 99 |
| 99 WebTraceLocation m_location; | 100 WebTraceLocation m_location; |
| 100 std::unique_ptr<ExecutionContextTask> m_task; | 101 std::unique_ptr<CrossThreadClosure> m_task; |
| 101 }; | 102 }; |
| 102 | 103 |
| 103 // Observing functions and wait() need to be called on the worker thread. | 104 // Observing functions and wait() need to be called on the worker thread. |
| 104 // Setting functions and signal() need to be called on the main thread. | 105 // Setting functions and signal() need to be called on the main thread. |
| 105 // All observing functions must be called after wait() returns, and all | 106 // All observing functions must be called after wait() returns, and all |
| 106 // setting functions must be called before signal() is called. | 107 // setting functions must be called before signal() is called. |
| 107 class WorkerThreadableLoader::WaitableEventWithTasks final | 108 class WorkerThreadableLoader::WaitableEventWithTasks final |
| 108 : public ThreadSafeRefCounted<WaitableEventWithTasks> { | 109 : public ThreadSafeRefCounted<WaitableEventWithTasks> { |
| 109 public: | 110 public: |
| 110 static PassRefPtr<WaitableEventWithTasks> create() { | 111 static PassRefPtr<WaitableEventWithTasks> create() { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 class WorkerThreadableLoader::SyncTaskForwarder final | 162 class WorkerThreadableLoader::SyncTaskForwarder final |
| 162 : public WorkerThreadableLoader::TaskForwarder { | 163 : public WorkerThreadableLoader::TaskForwarder { |
| 163 public: | 164 public: |
| 164 explicit SyncTaskForwarder(PassRefPtr<WaitableEventWithTasks> eventWithTasks) | 165 explicit SyncTaskForwarder(PassRefPtr<WaitableEventWithTasks> eventWithTasks) |
| 165 : m_eventWithTasks(eventWithTasks) { | 166 : m_eventWithTasks(eventWithTasks) { |
| 166 DCHECK(isMainThread()); | 167 DCHECK(isMainThread()); |
| 167 } | 168 } |
| 168 ~SyncTaskForwarder() override { DCHECK(isMainThread()); } | 169 ~SyncTaskForwarder() override { DCHECK(isMainThread()); } |
| 169 | 170 |
| 170 void forwardTask(const WebTraceLocation& location, | 171 void forwardTask(const WebTraceLocation& location, |
| 171 std::unique_ptr<ExecutionContextTask> task) override { | 172 std::unique_ptr<CrossThreadClosure> task) override { |
| 172 DCHECK(isMainThread()); | 173 DCHECK(isMainThread()); |
| 173 m_eventWithTasks->append(TaskWithLocation(location, std::move(task))); | 174 m_eventWithTasks->append(TaskWithLocation(location, std::move(task))); |
| 174 } | 175 } |
| 175 void forwardTaskWithDoneSignal( | 176 void forwardTaskWithDoneSignal( |
| 176 const WebTraceLocation& location, | 177 const WebTraceLocation& location, |
| 177 std::unique_ptr<ExecutionContextTask> task) override { | 178 std::unique_ptr<CrossThreadClosure> task) override { |
| 178 DCHECK(isMainThread()); | 179 DCHECK(isMainThread()); |
| 179 m_eventWithTasks->append(TaskWithLocation(location, std::move(task))); | 180 m_eventWithTasks->append(TaskWithLocation(location, std::move(task))); |
| 180 m_eventWithTasks->signal(); | 181 m_eventWithTasks->signal(); |
| 181 } | 182 } |
| 182 void abort() override { | 183 void abort() override { |
| 183 DCHECK(isMainThread()); | 184 DCHECK(isMainThread()); |
| 184 m_eventWithTasks->setIsAborted(); | 185 m_eventWithTasks->setIsAborted(); |
| 185 m_eventWithTasks->signal(); | 186 m_eventWithTasks->signal(); |
| 186 } | 187 } |
| 187 | 188 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 cancel(); | 254 cancel(); |
| 254 return; | 255 return; |
| 255 } | 256 } |
| 256 | 257 |
| 257 for (const auto& task : eventWithTasks->take()) { | 258 for (const auto& task : eventWithTasks->take()) { |
| 258 // Store the program counter where the task is posted from, and alias | 259 // Store the program counter where the task is posted from, and alias |
| 259 // it to ensure it is stored in the crash dump. | 260 // it to ensure it is stored in the crash dump. |
| 260 const void* programCounter = task.m_location.program_counter(); | 261 const void* programCounter = task.m_location.program_counter(); |
| 261 WTF::debug::alias(&programCounter); | 262 WTF::debug::alias(&programCounter); |
| 262 | 263 |
| 263 // m_clientTask contains only CallClosureTasks. So, it's ok to pass | 264 (*task.m_task)(); |
| 264 // the nullptr. | |
| 265 task.m_task->performTask(nullptr); | |
| 266 } | 265 } |
| 267 } | 266 } |
| 268 | 267 |
| 269 void WorkerThreadableLoader::overrideTimeout( | 268 void WorkerThreadableLoader::overrideTimeout( |
| 270 unsigned long timeoutMilliseconds) { | 269 unsigned long timeoutMilliseconds) { |
| 271 DCHECK(!isMainThread()); | 270 DCHECK(!isMainThread()); |
| 272 if (!m_mainThreadLoaderHolder) | 271 if (!m_mainThreadLoaderHolder) |
| 273 return; | 272 return; |
| 274 m_workerLoaderProxy->postTaskToLoader( | 273 m_workerLoaderProxy->postTaskToLoader( |
| 275 BLINK_FROM_HERE, | 274 BLINK_FROM_HERE, |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 new MainThreadLoaderHolder(forwarder, workerThreadLifecycleContext); | 446 new MainThreadLoaderHolder(forwarder, workerThreadLifecycleContext); |
| 448 if (mainThreadLoaderHolder->wasContextDestroyedBeforeObserverCreation()) { | 447 if (mainThreadLoaderHolder->wasContextDestroyedBeforeObserverCreation()) { |
| 449 // The thread is already terminating. | 448 // The thread is already terminating. |
| 450 forwarder->abort(); | 449 forwarder->abort(); |
| 451 mainThreadLoaderHolder->m_forwarder = nullptr; | 450 mainThreadLoaderHolder->m_forwarder = nullptr; |
| 452 return; | 451 return; |
| 453 } | 452 } |
| 454 mainThreadLoaderHolder->m_workerLoader = workerLoader; | 453 mainThreadLoaderHolder->m_workerLoader = workerLoader; |
| 455 forwarder->forwardTask( | 454 forwarder->forwardTask( |
| 456 BLINK_FROM_HERE, | 455 BLINK_FROM_HERE, |
| 457 createCrossThreadTask(&WorkerThreadableLoader::didStart, | 456 crossThreadBind(&WorkerThreadableLoader::didStart, |
| 458 wrapCrossThreadPersistent(workerLoader), | 457 wrapCrossThreadPersistent(workerLoader), |
| 459 wrapCrossThreadPersistent(mainThreadLoaderHolder))); | 458 wrapCrossThreadPersistent(mainThreadLoaderHolder))); |
| 460 mainThreadLoaderHolder->start(*toDocument(executionContext), | 459 mainThreadLoaderHolder->start(*toDocument(executionContext), |
| 461 std::move(request), options, | 460 std::move(request), options, |
| 462 resourceLoaderOptions); | 461 resourceLoaderOptions); |
| 463 } | 462 } |
| 464 | 463 |
| 465 WorkerThreadableLoader::MainThreadLoaderHolder::~MainThreadLoaderHolder() { | 464 WorkerThreadableLoader::MainThreadLoaderHolder::~MainThreadLoaderHolder() { |
| 466 DCHECK(isMainThread()); | 465 DCHECK(isMainThread()); |
| 467 DCHECK(!m_workerLoader); | 466 DCHECK(!m_workerLoader); |
| 468 } | 467 } |
| 469 | 468 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 487 void WorkerThreadableLoader::MainThreadLoaderHolder::didSendData( | 486 void WorkerThreadableLoader::MainThreadLoaderHolder::didSendData( |
| 488 unsigned long long bytesSent, | 487 unsigned long long bytesSent, |
| 489 unsigned long long totalBytesToBeSent) { | 488 unsigned long long totalBytesToBeSent) { |
| 490 DCHECK(isMainThread()); | 489 DCHECK(isMainThread()); |
| 491 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = | 490 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = |
| 492 m_workerLoader.get(); | 491 m_workerLoader.get(); |
| 493 if (!workerLoader || !m_forwarder) | 492 if (!workerLoader || !m_forwarder) |
| 494 return; | 493 return; |
| 495 m_forwarder->forwardTask( | 494 m_forwarder->forwardTask( |
| 496 BLINK_FROM_HERE, | 495 BLINK_FROM_HERE, |
| 497 createCrossThreadTask(&WorkerThreadableLoader::didSendData, workerLoader, | 496 crossThreadBind(&WorkerThreadableLoader::didSendData, workerLoader, |
| 498 bytesSent, totalBytesToBeSent)); | 497 bytesSent, totalBytesToBeSent)); |
| 499 } | 498 } |
| 500 | 499 |
| 501 void WorkerThreadableLoader::MainThreadLoaderHolder::didReceiveRedirectTo( | 500 void WorkerThreadableLoader::MainThreadLoaderHolder::didReceiveRedirectTo( |
| 502 const KURL& url) { | 501 const KURL& url) { |
| 503 DCHECK(isMainThread()); | 502 DCHECK(isMainThread()); |
| 504 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = | 503 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = |
| 505 m_workerLoader.get(); | 504 m_workerLoader.get(); |
| 506 if (!workerLoader || !m_forwarder) | 505 if (!workerLoader || !m_forwarder) |
| 507 return; | 506 return; |
| 508 m_forwarder->forwardTask( | 507 m_forwarder->forwardTask( |
| 509 BLINK_FROM_HERE, | 508 BLINK_FROM_HERE, |
| 510 createCrossThreadTask(&WorkerThreadableLoader::didReceiveRedirectTo, | 509 crossThreadBind(&WorkerThreadableLoader::didReceiveRedirectTo, |
| 511 workerLoader, url)); | 510 workerLoader, url)); |
| 512 } | 511 } |
| 513 | 512 |
| 514 void WorkerThreadableLoader::MainThreadLoaderHolder::didReceiveResponse( | 513 void WorkerThreadableLoader::MainThreadLoaderHolder::didReceiveResponse( |
| 515 unsigned long identifier, | 514 unsigned long identifier, |
| 516 const ResourceResponse& response, | 515 const ResourceResponse& response, |
| 517 std::unique_ptr<WebDataConsumerHandle> handle) { | 516 std::unique_ptr<WebDataConsumerHandle> handle) { |
| 518 DCHECK(isMainThread()); | 517 DCHECK(isMainThread()); |
| 519 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = | 518 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = |
| 520 m_workerLoader.get(); | 519 m_workerLoader.get(); |
| 521 if (!workerLoader || !m_forwarder) | 520 if (!workerLoader || !m_forwarder) |
| 522 return; | 521 return; |
| 523 m_forwarder->forwardTask( | 522 m_forwarder->forwardTask( |
| 524 BLINK_FROM_HERE, | 523 BLINK_FROM_HERE, |
| 525 createCrossThreadTask(&WorkerThreadableLoader::didReceiveResponse, | 524 crossThreadBind(&WorkerThreadableLoader::didReceiveResponse, workerLoader, |
| 526 workerLoader, identifier, response, | 525 identifier, response, WTF::passed(std::move(handle)))); |
| 527 WTF::passed(std::move(handle)))); | |
| 528 } | 526 } |
| 529 | 527 |
| 530 void WorkerThreadableLoader::MainThreadLoaderHolder::didReceiveData( | 528 void WorkerThreadableLoader::MainThreadLoaderHolder::didReceiveData( |
| 531 const char* data, | 529 const char* data, |
| 532 unsigned dataLength) { | 530 unsigned dataLength) { |
| 533 DCHECK(isMainThread()); | 531 DCHECK(isMainThread()); |
| 534 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = | 532 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = |
| 535 m_workerLoader.get(); | 533 m_workerLoader.get(); |
| 536 if (!workerLoader || !m_forwarder) | 534 if (!workerLoader || !m_forwarder) |
| 537 return; | 535 return; |
| 538 m_forwarder->forwardTask( | 536 m_forwarder->forwardTask( |
| 539 BLINK_FROM_HERE, | 537 BLINK_FROM_HERE, |
| 540 createCrossThreadTask( | 538 crossThreadBind( |
| 541 &WorkerThreadableLoader::didReceiveData, workerLoader, | 539 &WorkerThreadableLoader::didReceiveData, workerLoader, |
| 542 WTF::passed(createVectorFromMemoryRegion(data, dataLength)))); | 540 WTF::passed(createVectorFromMemoryRegion(data, dataLength)))); |
| 543 } | 541 } |
| 544 | 542 |
| 545 void WorkerThreadableLoader::MainThreadLoaderHolder::didDownloadData( | 543 void WorkerThreadableLoader::MainThreadLoaderHolder::didDownloadData( |
| 546 int dataLength) { | 544 int dataLength) { |
| 547 DCHECK(isMainThread()); | 545 DCHECK(isMainThread()); |
| 548 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = | 546 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = |
| 549 m_workerLoader.get(); | 547 m_workerLoader.get(); |
| 550 if (!workerLoader || !m_forwarder) | 548 if (!workerLoader || !m_forwarder) |
| 551 return; | 549 return; |
| 552 m_forwarder->forwardTask( | 550 m_forwarder->forwardTask( |
| 553 BLINK_FROM_HERE, | 551 BLINK_FROM_HERE, crossThreadBind(&WorkerThreadableLoader::didDownloadData, |
| 554 createCrossThreadTask(&WorkerThreadableLoader::didDownloadData, | 552 workerLoader, dataLength)); |
| 555 workerLoader, dataLength)); | |
| 556 } | 553 } |
| 557 | 554 |
| 558 void WorkerThreadableLoader::MainThreadLoaderHolder::didReceiveCachedMetadata( | 555 void WorkerThreadableLoader::MainThreadLoaderHolder::didReceiveCachedMetadata( |
| 559 const char* data, | 556 const char* data, |
| 560 int dataLength) { | 557 int dataLength) { |
| 561 DCHECK(isMainThread()); | 558 DCHECK(isMainThread()); |
| 562 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = | 559 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = |
| 563 m_workerLoader.get(); | 560 m_workerLoader.get(); |
| 564 if (!workerLoader || !m_forwarder) | 561 if (!workerLoader || !m_forwarder) |
| 565 return; | 562 return; |
| 566 m_forwarder->forwardTask( | 563 m_forwarder->forwardTask( |
| 567 BLINK_FROM_HERE, | 564 BLINK_FROM_HERE, |
| 568 createCrossThreadTask( | 565 crossThreadBind( |
| 569 &WorkerThreadableLoader::didReceiveCachedMetadata, workerLoader, | 566 &WorkerThreadableLoader::didReceiveCachedMetadata, workerLoader, |
| 570 WTF::passed(createVectorFromMemoryRegion(data, dataLength)))); | 567 WTF::passed(createVectorFromMemoryRegion(data, dataLength)))); |
| 571 } | 568 } |
| 572 | 569 |
| 573 void WorkerThreadableLoader::MainThreadLoaderHolder::didFinishLoading( | 570 void WorkerThreadableLoader::MainThreadLoaderHolder::didFinishLoading( |
| 574 unsigned long identifier, | 571 unsigned long identifier, |
| 575 double finishTime) { | 572 double finishTime) { |
| 576 DCHECK(isMainThread()); | 573 DCHECK(isMainThread()); |
| 577 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = | 574 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = |
| 578 m_workerLoader.release(); | 575 m_workerLoader.release(); |
| 579 if (!workerLoader || !m_forwarder) | 576 if (!workerLoader || !m_forwarder) |
| 580 return; | 577 return; |
| 581 m_forwarder->forwardTaskWithDoneSignal( | 578 m_forwarder->forwardTaskWithDoneSignal( |
| 582 BLINK_FROM_HERE, | 579 BLINK_FROM_HERE, |
| 583 createCrossThreadTask(&WorkerThreadableLoader::didFinishLoading, | 580 crossThreadBind(&WorkerThreadableLoader::didFinishLoading, workerLoader, |
| 584 workerLoader, identifier, finishTime)); | 581 identifier, finishTime)); |
| 585 m_forwarder = nullptr; | 582 m_forwarder = nullptr; |
| 586 } | 583 } |
| 587 | 584 |
| 588 void WorkerThreadableLoader::MainThreadLoaderHolder::didFail( | 585 void WorkerThreadableLoader::MainThreadLoaderHolder::didFail( |
| 589 const ResourceError& error) { | 586 const ResourceError& error) { |
| 590 DCHECK(isMainThread()); | 587 DCHECK(isMainThread()); |
| 591 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = | 588 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = |
| 592 m_workerLoader.release(); | 589 m_workerLoader.release(); |
| 593 if (!workerLoader || !m_forwarder) | 590 if (!workerLoader || !m_forwarder) |
| 594 return; | 591 return; |
| 595 m_forwarder->forwardTaskWithDoneSignal( | 592 m_forwarder->forwardTaskWithDoneSignal( |
| 596 BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreadableLoader::didFail, | 593 BLINK_FROM_HERE, |
| 597 workerLoader, error)); | 594 crossThreadBind(&WorkerThreadableLoader::didFail, workerLoader, error)); |
| 598 m_forwarder = nullptr; | 595 m_forwarder = nullptr; |
| 599 } | 596 } |
| 600 | 597 |
| 601 void WorkerThreadableLoader::MainThreadLoaderHolder::didFailAccessControlCheck( | 598 void WorkerThreadableLoader::MainThreadLoaderHolder::didFailAccessControlCheck( |
| 602 const ResourceError& error) { | 599 const ResourceError& error) { |
| 603 DCHECK(isMainThread()); | 600 DCHECK(isMainThread()); |
| 604 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = | 601 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = |
| 605 m_workerLoader.release(); | 602 m_workerLoader.release(); |
| 606 if (!workerLoader || !m_forwarder) | 603 if (!workerLoader || !m_forwarder) |
| 607 return; | 604 return; |
| 608 m_forwarder->forwardTaskWithDoneSignal( | 605 m_forwarder->forwardTaskWithDoneSignal( |
| 609 BLINK_FROM_HERE, | 606 BLINK_FROM_HERE, |
| 610 createCrossThreadTask(&WorkerThreadableLoader::didFailAccessControlCheck, | 607 crossThreadBind(&WorkerThreadableLoader::didFailAccessControlCheck, |
| 611 workerLoader, error)); | 608 workerLoader, error)); |
| 612 m_forwarder = nullptr; | 609 m_forwarder = nullptr; |
| 613 } | 610 } |
| 614 | 611 |
| 615 void WorkerThreadableLoader::MainThreadLoaderHolder::didFailRedirectCheck() { | 612 void WorkerThreadableLoader::MainThreadLoaderHolder::didFailRedirectCheck() { |
| 616 DCHECK(isMainThread()); | 613 DCHECK(isMainThread()); |
| 617 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = | 614 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = |
| 618 m_workerLoader.release(); | 615 m_workerLoader.release(); |
| 619 if (!workerLoader || !m_forwarder) | 616 if (!workerLoader || !m_forwarder) |
| 620 return; | 617 return; |
| 621 m_forwarder->forwardTaskWithDoneSignal( | 618 m_forwarder->forwardTaskWithDoneSignal( |
| 622 BLINK_FROM_HERE, | 619 BLINK_FROM_HERE, |
| 623 createCrossThreadTask(&WorkerThreadableLoader::didFailRedirectCheck, | 620 crossThreadBind(&WorkerThreadableLoader::didFailRedirectCheck, |
| 624 workerLoader)); | 621 workerLoader)); |
| 625 m_forwarder = nullptr; | 622 m_forwarder = nullptr; |
| 626 } | 623 } |
| 627 | 624 |
| 628 void WorkerThreadableLoader::MainThreadLoaderHolder::didReceiveResourceTiming( | 625 void WorkerThreadableLoader::MainThreadLoaderHolder::didReceiveResourceTiming( |
| 629 const ResourceTimingInfo& info) { | 626 const ResourceTimingInfo& info) { |
| 630 DCHECK(isMainThread()); | 627 DCHECK(isMainThread()); |
| 631 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = | 628 CrossThreadPersistent<WorkerThreadableLoader> workerLoader = |
| 632 m_workerLoader.get(); | 629 m_workerLoader.get(); |
| 633 if (!workerLoader || !m_forwarder) | 630 if (!workerLoader || !m_forwarder) |
| 634 return; | 631 return; |
| 635 m_forwarder->forwardTask( | 632 m_forwarder->forwardTask( |
| 636 BLINK_FROM_HERE, | 633 BLINK_FROM_HERE, |
| 637 createCrossThreadTask(&WorkerThreadableLoader::didReceiveResourceTiming, | 634 crossThreadBind(&WorkerThreadableLoader::didReceiveResourceTiming, |
| 638 workerLoader, info)); | 635 workerLoader, info)); |
| 639 } | 636 } |
| 640 | 637 |
| 641 void WorkerThreadableLoader::MainThreadLoaderHolder::contextDestroyed( | 638 void WorkerThreadableLoader::MainThreadLoaderHolder::contextDestroyed( |
| 642 WorkerThreadLifecycleContext*) { | 639 WorkerThreadLifecycleContext*) { |
| 643 DCHECK(isMainThread()); | 640 DCHECK(isMainThread()); |
| 644 if (m_forwarder) { | 641 if (m_forwarder) { |
| 645 m_forwarder->abort(); | 642 m_forwarder->abort(); |
| 646 m_forwarder = nullptr; | 643 m_forwarder = nullptr; |
| 647 } | 644 } |
| 648 cancel(); | 645 cancel(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 671 resourceLoaderOptions.requestInitiatorContext = WorkerContext; | 668 resourceLoaderOptions.requestInitiatorContext = WorkerContext; |
| 672 // TODO(yhirano): Remove this CHECK once https://crbug.com/667254 is fixed. | 669 // TODO(yhirano): Remove this CHECK once https://crbug.com/667254 is fixed. |
| 673 CHECK(!m_mainThreadLoader); | 670 CHECK(!m_mainThreadLoader); |
| 674 m_mainThreadLoader = DocumentThreadableLoader::create( | 671 m_mainThreadLoader = DocumentThreadableLoader::create( |
| 675 document, this, options, resourceLoaderOptions, | 672 document, this, options, resourceLoaderOptions, |
| 676 ThreadableLoader::ClientSpec::kMainThreadLoaderHolder); | 673 ThreadableLoader::ClientSpec::kMainThreadLoaderHolder); |
| 677 m_mainThreadLoader->start(ResourceRequest(request.get())); | 674 m_mainThreadLoader->start(ResourceRequest(request.get())); |
| 678 } | 675 } |
| 679 | 676 |
| 680 } // namespace blink | 677 } // namespace blink |
| OLD | NEW |