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