Index: third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp |
diff --git a/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp b/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp |
index 655c19c487d6b2a50fb77b81a69265e21c3c15cd..3f1bb858dc5ace992f3aba7a13eb26f7da56d4cb 100644 |
--- a/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp |
+++ b/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp |
@@ -61,9 +61,8 @@ static std::unique_ptr<Vector<char>> createVectorFromMemoryRegion(const char* da |
WorkerThreadableLoader::WorkerThreadableLoader(WorkerGlobalScope& workerGlobalScope, ThreadableLoaderClient* client, const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions, BlockingBehavior blockingBehavior) |
: m_workerGlobalScope(&workerGlobalScope) |
- , m_workerClientWrapper(ThreadableLoaderClientWrapper::create(client)) |
+ , m_workerClientWrapper(new ThreadableLoaderClientWrapper(workerGlobalScope, client)) |
{ |
- m_workerClientWrapper->setResourceTimingClient(this); |
if (blockingBehavior == LoadAsynchronously) { |
m_bridge = new MainThreadAsyncBridge(workerGlobalScope, m_workerClientWrapper, options, resourceLoaderOptions); |
} else { |
@@ -79,7 +78,6 @@ void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& worker |
WorkerThreadableLoader::~WorkerThreadableLoader() |
{ |
- m_workerClientWrapper->clearResourceTimingClient(); |
m_bridge->destroy(); |
m_bridge = nullptr; |
} |
@@ -90,7 +88,6 @@ void WorkerThreadableLoader::start(const ResourceRequest& request) |
if (!requestToPass.didSetHTTPReferrer()) |
requestToPass.setHTTPReferrer(SecurityPolicy::generateReferrer(m_workerGlobalScope->getReferrerPolicy(), request.url(), m_workerGlobalScope->outgoingReferrer())); |
m_bridge->start(requestToPass, *m_workerGlobalScope); |
- m_workerClientWrapper->setResourceTimingClient(this); |
} |
void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds) |
@@ -105,13 +102,8 @@ void WorkerThreadableLoader::cancel() |
m_bridge->cancel(); |
} |
-void WorkerThreadableLoader::didReceiveResourceTiming(const ResourceTimingInfo& info) |
-{ |
- WorkerGlobalScopePerformance::performance(*m_workerGlobalScope)->addResourceTiming(info); |
-} |
- |
WorkerThreadableLoader::MainThreadBridgeBase::MainThreadBridgeBase( |
- PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, |
+ ThreadableLoaderClientWrapper* workerClientWrapper, |
PassRefPtr<WorkerLoaderProxy> loaderProxy) |
: m_workerClientWrapper(workerClientWrapper) |
, m_loaderProxy(loaderProxy) |
@@ -160,10 +152,15 @@ void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadDestroy(ExecutionCo |
void WorkerThreadableLoader::MainThreadBridgeBase::destroy() |
{ |
- // Ensure that no more client callbacks are done in the worker context's thread. |
+ // Ensure that no more client callbacks are done in the worker context's |
+ // thread. |
+ // ThreadableLoaderClientWrapper is an on-heap class and this function can |
+ // be called in the finalization step but it is safe because |
+ // m_workerClientWrapper is a CrossThreadPersistent. |
m_workerClientWrapper->clearClient(); |
- // "delete this" and m_mainThreadLoader::deref() on the worker object's thread. |
+ // "delete this" and m_mainThreadLoader::deref() on the worker object's |
+ // thread. |
m_loaderProxy->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase::mainThreadDestroy, crossThreadUnretained(this))); |
} |
@@ -196,10 +193,12 @@ void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadCancel(ExecutionCon |
void WorkerThreadableLoader::MainThreadBridgeBase::cancel() |
{ |
m_loaderProxy->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase::mainThreadCancel, crossThreadUnretained(this))); |
- RefPtr<ThreadableLoaderClientWrapper> clientWrapper = m_workerClientWrapper; |
+ ThreadableLoaderClientWrapper* clientWrapper = m_workerClientWrapper; |
if (!clientWrapper->done()) { |
- // If the client hasn't reached a termination state, then transition it by sending a cancellation error. |
- // Note: no more client callbacks will be done after this method -- the m_workerClientWrapper->clearClient() call ensures that. |
+ // If the client hasn't reached a termination state, then transition it |
+ // by sending a cancellation error. |
+ // Note: no more client callbacks will be done after this method -- the |
+ // m_workerClientWrapper->clearClient() call ensures that. |
ResourceError error(String(), 0, String(), String()); |
error.setIsCancellation(true); |
clientWrapper->didFail(error); |
@@ -264,7 +263,7 @@ void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveResourceTiming(cons |
WorkerThreadableLoader::MainThreadAsyncBridge::MainThreadAsyncBridge( |
WorkerGlobalScope& workerGlobalScope, |
- PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, |
+ ThreadableLoaderClientWrapper* workerClientWrapper, |
const ThreadableLoaderOptions& options, |
const ResourceLoaderOptions& resourceLoaderOptions) |
: MainThreadBridgeBase(workerClientWrapper, workerGlobalScope.thread()->workerLoaderProxy()) |
@@ -293,7 +292,7 @@ void WorkerThreadableLoader::MainThreadAsyncBridge::forwardTaskToWorkerOnLoaderD |
WorkerThreadableLoader::MainThreadSyncBridge::MainThreadSyncBridge( |
WorkerGlobalScope& workerGlobalScope, |
- PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, |
+ ThreadableLoaderClientWrapper* workerClientWrapper, |
const ThreadableLoaderOptions& options, |
const ResourceLoaderOptions& resourceLoaderOptions) |
: MainThreadBridgeBase(workerClientWrapper, workerGlobalScope.thread()->workerLoaderProxy()) |