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 1eb6a66f335ffafb04c3ee8ffb530a0c05c47581..837971e8ae55c0b34915802a852607359acd32e2 100644 |
--- a/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp |
+++ b/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp |
@@ -208,74 +208,42 @@ WorkerThreadableLoader::WorkerThreadableLoader( |
const ResourceLoaderOptions& resourceLoaderOptions, |
BlockingBehavior blockingBehavior) |
: m_workerGlobalScope(&workerGlobalScope) |
- , m_workerClientWrapper(new ThreadableLoaderClientWrapper(workerGlobalScope, client)) |
- , m_bridge(new Bridge(m_workerClientWrapper, workerGlobalScope.thread()->workerLoaderProxy(), options, resourceLoaderOptions, blockingBehavior)) |
+ , m_workerLoaderProxy(workerGlobalScope.thread()->workerLoaderProxy()) |
+ , m_client(client) |
+ , m_threadableLoaderOptions(options) |
+ , m_resourceLoaderOptions(resourceLoaderOptions) |
+ , m_blockingBehavior(blockingBehavior) |
{ |
+ DCHECK(client); |
} |
void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& workerGlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions) |
{ |
- std::unique_ptr<WorkerThreadableLoader> loader = wrapUnique(new WorkerThreadableLoader(workerGlobalScope, &client, options, resourceLoaderOptions, LoadSynchronously)); |
- loader->start(request); |
+ (new WorkerThreadableLoader(workerGlobalScope, &client, options, resourceLoaderOptions, LoadSynchronously))->start(request); |
} |
WorkerThreadableLoader::~WorkerThreadableLoader() |
{ |
- DCHECK(m_workerClientWrapper->done()); |
- m_bridge->destroy(); |
-} |
- |
-void WorkerThreadableLoader::start(const ResourceRequest& request) |
-{ |
- ResourceRequest requestToPass(request); |
- if (!requestToPass.didSetHTTPReferrer()) |
- requestToPass.setHTTPReferrer(SecurityPolicy::generateReferrer(m_workerGlobalScope->getReferrerPolicy(), request.url(), m_workerGlobalScope->outgoingReferrer())); |
- m_bridge->start(requestToPass, *m_workerGlobalScope); |
-} |
- |
-void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds) |
-{ |
- m_bridge->overrideTimeout(timeoutMilliseconds); |
-} |
- |
-void WorkerThreadableLoader::cancel() |
-{ |
- m_bridge->cancel(); |
-} |
- |
-WorkerThreadableLoader::Bridge::Bridge( |
- ThreadableLoaderClientWrapper* clientWrapper, |
- PassRefPtr<WorkerLoaderProxy> loaderProxy, |
- const ThreadableLoaderOptions& threadableLoaderOptions, |
- const ResourceLoaderOptions& resourceLoaderOptions, |
- BlockingBehavior blockingBehavior) |
- : m_clientWrapper(clientWrapper) |
- , m_loaderProxy(loaderProxy) |
- , m_threadableLoaderOptions(threadableLoaderOptions) |
- , m_resourceLoaderOptions(resourceLoaderOptions) |
- , m_blockingBehavior(blockingBehavior) |
-{ |
- DCHECK(!isMainThread()); |
-} |
- |
-WorkerThreadableLoader::Bridge::~Bridge() |
-{ |
- DCHECK(!isMainThread()); |
DCHECK(!m_peer); |
+ DCHECK(!m_client); |
} |
-void WorkerThreadableLoader::Bridge::start(const ResourceRequest& request, const WorkerGlobalScope& workerGlobalScope) |
+void WorkerThreadableLoader::start(const ResourceRequest& originalRequest) |
{ |
+ ResourceRequest request(originalRequest); |
+ if (!request.didSetHTTPReferrer()) |
+ request.setHTTPReferrer(SecurityPolicy::generateReferrer(m_workerGlobalScope->getReferrerPolicy(), request.url(), m_workerGlobalScope->outgoingReferrer())); |
+ |
DCHECK(!isMainThread()); |
RefPtr<WaitableEventWithTasks> eventWithTasks; |
if (m_blockingBehavior == LoadSynchronously) |
eventWithTasks = WaitableEventWithTasks::create(); |
- m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask( |
+ m_workerLoaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask( |
&Peer::createAndStart, |
wrapCrossThreadPersistent(this), |
- m_loaderProxy, |
- wrapCrossThreadPersistent(workerGlobalScope.thread()->getWorkerThreadLifecycleContext()), |
+ m_workerLoaderProxy, |
+ wrapCrossThreadPersistent(m_workerGlobalScope->thread()->getWorkerThreadLifecycleContext()), |
request, |
m_threadableLoaderOptions, |
m_resourceLoaderOptions, |
@@ -307,68 +275,153 @@ void WorkerThreadableLoader::Bridge::start(const ResourceRequest& request, const |
} |
} |
-void WorkerThreadableLoader::Bridge::overrideTimeout(unsigned long timeoutMilliseconds) |
+void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds) |
{ |
DCHECK(!isMainThread()); |
if (!m_peer) |
return; |
- m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&Peer::overrideTimeout, m_peer, timeoutMilliseconds)); |
+ m_workerLoaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&Peer::overrideTimeout, m_peer, timeoutMilliseconds)); |
} |
-void WorkerThreadableLoader::Bridge::cancel() |
+void WorkerThreadableLoader::cancel() |
{ |
DCHECK(!isMainThread()); |
- cancelPeer(); |
+ if (m_peer) { |
+ m_workerLoaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&Peer::cancel, m_peer)); |
+ m_peer = nullptr; |
+ } |
- if (m_clientWrapper->done()) |
+ if (!m_client) |
return; |
+ |
// 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 |
// clearClient() call ensures that. |
ResourceError error(String(), 0, String(), String()); |
error.setIsCancellation(true); |
- m_clientWrapper->didFail(error); |
- m_clientWrapper->clearClient(); |
+ didFail(error); |
+ DCHECK(!m_client); |
} |
-void WorkerThreadableLoader::Bridge::destroy() |
-{ |
- DCHECK(!isMainThread()); |
- cancelPeer(); |
- m_clientWrapper->clearClient(); |
-} |
- |
-void WorkerThreadableLoader::Bridge::didStart(Peer* peer) |
+void WorkerThreadableLoader::didStart(Peer* peer) |
{ |
DCHECK(!isMainThread()); |
DCHECK(!m_peer); |
DCHECK(peer); |
- if (m_clientWrapper->done()) { |
+ if (!m_client) { |
// The thread is terminating. |
- m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&Peer::cancel, wrapCrossThreadPersistent(peer))); |
+ m_workerLoaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&Peer::cancel, wrapCrossThreadPersistent(peer))); |
return; |
} |
m_peer = peer; |
} |
-DEFINE_TRACE(WorkerThreadableLoader::Bridge) |
+void WorkerThreadableLoader::didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) |
{ |
- visitor->trace(m_clientWrapper); |
+ DCHECK(!isMainThread()); |
+ if (!m_client) |
+ return; |
+ m_client->didSendData(bytesSent, totalBytesToBeSent); |
} |
-void WorkerThreadableLoader::Bridge::cancelPeer() |
+void WorkerThreadableLoader::didReceiveResponse(unsigned long identifier, std::unique_ptr<CrossThreadResourceResponseData> responseData, std::unique_ptr<WebDataConsumerHandle> handle) |
{ |
DCHECK(!isMainThread()); |
- if (!m_peer) |
+ if (!m_client) |
+ return; |
+ ResourceResponse response(responseData.get()); |
+ m_client->didReceiveResponse(identifier, response, std::move(handle)); |
+} |
+ |
+void WorkerThreadableLoader::didReceiveData(std::unique_ptr<Vector<char>> data) |
+{ |
+ DCHECK(!isMainThread()); |
+ CHECK_LE(data->size(), std::numeric_limits<unsigned>::max()); |
+ if (!m_client) |
return; |
- m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&Peer::cancel, m_peer)); |
+ m_client->didReceiveData(data->data(), data->size()); |
+} |
+ |
+void WorkerThreadableLoader::didReceiveCachedMetadata(std::unique_ptr<Vector<char>> data) |
+{ |
+ DCHECK(!isMainThread()); |
+ if (!m_client) |
+ return; |
+ m_client->didReceiveCachedMetadata(data->data(), data->size()); |
+} |
+ |
+void WorkerThreadableLoader::didFinishLoading(unsigned long identifier, double finishTime) |
+{ |
+ DCHECK(!isMainThread()); |
+ if (!m_client) |
+ return; |
+ auto* client = m_client; |
+ m_client = nullptr; |
m_peer = nullptr; |
+ client->didFinishLoading(identifier, finishTime); |
+} |
+ |
+void WorkerThreadableLoader::didFail(const ResourceError& error) |
+{ |
+ DCHECK(!isMainThread()); |
+ if (!m_client) |
+ return; |
+ auto* client = m_client; |
+ m_client = nullptr; |
+ m_peer = nullptr; |
+ client->didFail(error); |
+} |
+ |
+void WorkerThreadableLoader::didFailAccessControlCheck(const ResourceError& error) |
+{ |
+ DCHECK(!isMainThread()); |
+ if (!m_client) |
+ return; |
+ auto* client = m_client; |
+ m_client = nullptr; |
+ m_peer = nullptr; |
+ client->didFailAccessControlCheck(error); |
+} |
+ |
+void WorkerThreadableLoader::didFailRedirectCheck() |
+{ |
+ DCHECK(!isMainThread()); |
+ if (!m_client) |
+ return; |
+ auto* client = m_client; |
+ m_client = nullptr; |
+ m_peer = nullptr; |
+ client->didFailRedirectCheck(); |
+} |
+ |
+void WorkerThreadableLoader::didDownloadData(int dataLength) |
+{ |
+ DCHECK(!isMainThread()); |
+ if (!m_client) |
+ return; |
+ m_client->didDownloadData(dataLength); |
+} |
+ |
+void WorkerThreadableLoader::didReceiveResourceTiming(std::unique_ptr<CrossThreadResourceTimingInfoData> timingData) |
+{ |
+ DCHECK(!isMainThread()); |
+ if (!m_client) |
+ return; |
+ std::unique_ptr<ResourceTimingInfo> info(ResourceTimingInfo::adopt(std::move(timingData))); |
+ WorkerGlobalScopePerformance::performance(*m_workerGlobalScope)->addResourceTiming(*info); |
+ m_client->didReceiveResourceTiming(*info); |
+} |
+ |
+DEFINE_TRACE(WorkerThreadableLoader) |
+{ |
+ visitor->trace(m_workerGlobalScope); |
+ ThreadableLoader::trace(visitor); |
} |
void WorkerThreadableLoader::Peer::createAndStart( |
- Bridge* bridge, |
+ WorkerThreadableLoader* workerLoader, |
PassRefPtr<WorkerLoaderProxy> passLoaderProxy, |
WorkerThreadLifecycleContext* workerThreadLifecycleContext, |
std::unique_ptr<CrossThreadResourceRequestData> request, |
@@ -392,15 +445,15 @@ void WorkerThreadableLoader::Peer::createAndStart( |
peer->m_forwarder = nullptr; |
return; |
} |
- peer->m_clientWrapper = bridge->clientWrapper(); |
+ peer->m_workerLoader = workerLoader; |
peer->start(*toDocument(executionContext), std::move(request), options, resourceLoaderOptions); |
- forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&Bridge::didStart, wrapCrossThreadPersistent(bridge), wrapCrossThreadPersistent(peer))); |
+ forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreadableLoader::didStart, wrapCrossThreadPersistent(workerLoader), wrapCrossThreadPersistent(peer))); |
} |
WorkerThreadableLoader::Peer::~Peer() |
{ |
DCHECK(isMainThread()); |
- DCHECK(!m_mainThreadLoader); |
+ DCHECK(!m_workerLoader); |
} |
void WorkerThreadableLoader::Peer::overrideTimeout(unsigned long timeoutMilliseconds) |
@@ -423,95 +476,95 @@ void WorkerThreadableLoader::Peer::cancel() |
void WorkerThreadableLoader::Peer::didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) |
{ |
DCHECK(isMainThread()); |
- CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clientWrapper.get(); |
- if (!clientWrapper || !m_forwarder) |
+ CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.get(); |
+ if (!workerLoader || !m_forwarder) |
return; |
- m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didSendData, clientWrapper, bytesSent, totalBytesToBeSent)); |
+ m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreadableLoader::didSendData, workerLoader, bytesSent, totalBytesToBeSent)); |
} |
void WorkerThreadableLoader::Peer::didReceiveResponse(unsigned long identifier, const ResourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle) |
{ |
DCHECK(isMainThread()); |
- CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clientWrapper.get(); |
- if (!clientWrapper || !m_forwarder) |
+ CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.get(); |
+ if (!workerLoader || !m_forwarder) |
return; |
- m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveResponse, clientWrapper, identifier, response, passed(std::move(handle)))); |
+ m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreadableLoader::didReceiveResponse, workerLoader, identifier, response, passed(std::move(handle)))); |
} |
void WorkerThreadableLoader::Peer::didReceiveData(const char* data, unsigned dataLength) |
{ |
DCHECK(isMainThread()); |
- CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clientWrapper.get(); |
- if (!clientWrapper || !m_forwarder) |
+ CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.get(); |
+ if (!workerLoader || !m_forwarder) |
return; |
- m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveData, clientWrapper, passed(createVectorFromMemoryRegion(data, dataLength)))); |
+ m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreadableLoader::didReceiveData, workerLoader, passed(createVectorFromMemoryRegion(data, dataLength)))); |
} |
void WorkerThreadableLoader::Peer::didDownloadData(int dataLength) |
{ |
DCHECK(isMainThread()); |
- CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clientWrapper.get(); |
- if (!clientWrapper || !m_forwarder) |
+ CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.get(); |
+ if (!workerLoader || !m_forwarder) |
return; |
- m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didDownloadData, clientWrapper, dataLength)); |
+ m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreadableLoader::didDownloadData, workerLoader, dataLength)); |
} |
void WorkerThreadableLoader::Peer::didReceiveCachedMetadata(const char* data, int dataLength) |
{ |
DCHECK(isMainThread()); |
- CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clientWrapper.get(); |
- if (!clientWrapper || !m_forwarder) |
+ CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.get(); |
+ if (!workerLoader || !m_forwarder) |
return; |
- m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveCachedMetadata, clientWrapper, passed(createVectorFromMemoryRegion(data, dataLength)))); |
+ m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreadableLoader::didReceiveCachedMetadata, workerLoader, passed(createVectorFromMemoryRegion(data, dataLength)))); |
} |
void WorkerThreadableLoader::Peer::didFinishLoading(unsigned long identifier, double finishTime) |
{ |
DCHECK(isMainThread()); |
- CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clientWrapper.get(); |
- if (!clientWrapper || !m_forwarder) |
+ CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.get(); |
+ if (!workerLoader || !m_forwarder) |
return; |
- m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didFinishLoading, clientWrapper, identifier, finishTime)); |
+ m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreadableLoader::didFinishLoading, workerLoader, identifier, finishTime)); |
m_forwarder = nullptr; |
} |
void WorkerThreadableLoader::Peer::didFail(const ResourceError& error) |
{ |
DCHECK(isMainThread()); |
- CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clientWrapper.get(); |
- if (!clientWrapper || !m_forwarder) |
+ CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.get(); |
+ if (!workerLoader || !m_forwarder) |
return; |
- m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didFail, clientWrapper, error)); |
+ m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreadableLoader::didFail, workerLoader, error)); |
m_forwarder = nullptr; |
} |
void WorkerThreadableLoader::Peer::didFailAccessControlCheck(const ResourceError& error) |
{ |
DCHECK(isMainThread()); |
- CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clientWrapper.get(); |
- if (!clientWrapper || !m_forwarder) |
+ CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.get(); |
+ if (!workerLoader || !m_forwarder) |
return; |
- m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didFailAccessControlCheck, clientWrapper, error)); |
+ m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreadableLoader::didFailAccessControlCheck, workerLoader, error)); |
m_forwarder = nullptr; |
} |
void WorkerThreadableLoader::Peer::didFailRedirectCheck() |
{ |
DCHECK(isMainThread()); |
- CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clientWrapper.get(); |
- if (!clientWrapper || !m_forwarder) |
+ CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.get(); |
+ if (!workerLoader || !m_forwarder) |
return; |
- m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didFailRedirectCheck, clientWrapper)); |
+ m_forwarder->forwardTaskWithDoneSignal(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreadableLoader::didFailRedirectCheck, workerLoader)); |
m_forwarder = nullptr; |
} |
void WorkerThreadableLoader::Peer::didReceiveResourceTiming(const ResourceTimingInfo& info) |
{ |
DCHECK(isMainThread()); |
- CrossThreadPersistent<ThreadableLoaderClientWrapper> clientWrapper = m_clientWrapper.get(); |
- if (!clientWrapper || !m_forwarder) |
+ CrossThreadPersistent<WorkerThreadableLoader> workerLoader = m_workerLoader.get(); |
+ if (!workerLoader || !m_forwarder) |
return; |
- m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveResourceTiming, clientWrapper, info)); |
+ m_forwarder->forwardTask(BLINK_FROM_HERE, createCrossThreadTask(&WorkerThreadableLoader::didReceiveResourceTiming, workerLoader, info)); |
} |
void WorkerThreadableLoader::Peer::contextDestroyed() |
@@ -521,13 +574,14 @@ void WorkerThreadableLoader::Peer::contextDestroyed() |
m_forwarder->abort(); |
m_forwarder = nullptr; |
} |
- m_clientWrapper = nullptr; |
+ m_workerLoader = nullptr; |
cancel(); |
} |
DEFINE_TRACE(WorkerThreadableLoader::Peer) |
{ |
visitor->trace(m_forwarder); |
+ visitor->trace(m_mainThreadLoader); |
WorkerThreadLifecycleObserver::trace(visitor); |
} |