| 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 909e09c62cd479b53be6a052ed72d56cb3d6b647..e109d21b7f41e65815d24e7e0567b1e02840708d 100644
|
| --- a/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp
|
| +++ b/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp
|
| @@ -59,21 +59,22 @@ static PassOwnPtr<Vector<char>> createVectorFromMemoryRegion(const char* data, u
|
| return buffer.release();
|
| }
|
|
|
| -WorkerThreadableLoader::WorkerThreadableLoader(WorkerGlobalScope& workerGlobalScope, ThreadableLoaderClient* client, const ResourceRequest& request, const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions, BlockingBehavior blockingBehavior)
|
| +WorkerThreadableLoader::WorkerThreadableLoader(WorkerGlobalScope& workerGlobalScope, ThreadableLoaderClient* client, const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions, BlockingBehavior blockingBehavior)
|
| : m_workerGlobalScope(&workerGlobalScope)
|
| , m_workerClientWrapper(ThreadableLoaderClientWrapper::create(client))
|
| {
|
| m_workerClientWrapper->setResourceTimingClient(this);
|
| if (blockingBehavior == LoadAsynchronously) {
|
| - m_bridge = new MainThreadAsyncBridge(workerGlobalScope, m_workerClientWrapper, request, options, resourceLoaderOptions, workerGlobalScope.referrerPolicy(), workerGlobalScope.url().strippedForUseAsReferrer());
|
| + m_bridge = new MainThreadAsyncBridge(workerGlobalScope, m_workerClientWrapper, options, resourceLoaderOptions);
|
| } else {
|
| - m_bridge = new MainThreadSyncBridge(workerGlobalScope, m_workerClientWrapper, request, options, resourceLoaderOptions, workerGlobalScope.referrerPolicy(), workerGlobalScope.url().strippedForUseAsReferrer());
|
| + m_bridge = new MainThreadSyncBridge(workerGlobalScope, m_workerClientWrapper, options, resourceLoaderOptions);
|
| }
|
| }
|
|
|
| void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& workerGlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions)
|
| {
|
| - RefPtr<WorkerThreadableLoader> loader = adoptRef(new WorkerThreadableLoader(workerGlobalScope, &client, request, options, resourceLoaderOptions, LoadSynchronously));
|
| + RefPtr<WorkerThreadableLoader> loader = adoptRef(new WorkerThreadableLoader(workerGlobalScope, &client, options, resourceLoaderOptions, LoadSynchronously));
|
| + loader->start(request);
|
| }
|
|
|
| WorkerThreadableLoader::~WorkerThreadableLoader()
|
| @@ -83,6 +84,12 @@ WorkerThreadableLoader::~WorkerThreadableLoader()
|
| m_bridge = nullptr;
|
| }
|
|
|
| +void WorkerThreadableLoader::start(const ResourceRequest& request)
|
| +{
|
| + m_bridge->start(request, *m_workerGlobalScope);
|
| + m_workerClientWrapper->setResourceTimingClient(this);
|
| +}
|
| +
|
| void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds)
|
| {
|
| ASSERT(m_bridge);
|
| @@ -114,25 +121,35 @@ WorkerThreadableLoader::MainThreadBridgeBase::~MainThreadBridgeBase()
|
| {
|
| }
|
|
|
| -void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadCreateLoader(PassOwnPtr<CrossThreadResourceRequestData> requestData, ThreadableLoaderOptions options, ResourceLoaderOptions resourceLoaderOptions, const ReferrerPolicy referrerPolicy, const String& outgoingReferrer, ExecutionContext* context)
|
| +void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadCreateLoader(ThreadableLoaderOptions options, ResourceLoaderOptions resourceLoaderOptions, ExecutionContext* context)
|
| {
|
| ASSERT(isMainThread());
|
| Document* document = toDocument(context);
|
|
|
| + resourceLoaderOptions.requestInitiatorContext = WorkerContext;
|
| + m_mainThreadLoader = DocumentThreadableLoader::create(*document, this, options, resourceLoaderOptions);
|
| + ASSERT(m_mainThreadLoader);
|
| +}
|
| +
|
| +void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadStart(PassOwnPtr<CrossThreadResourceRequestData> requestData, const ReferrerPolicy referrerPolicy, const String& outgoingReferrer)
|
| +{
|
| + ASSERT(isMainThread());
|
| + ASSERT(m_mainThreadLoader);
|
| +
|
| ResourceRequest request(requestData.get());
|
| if (!request.didSetHTTPReferrer())
|
| request.setHTTPReferrer(SecurityPolicy::generateReferrer(referrerPolicy, request.url(), outgoingReferrer));
|
| - resourceLoaderOptions.requestInitiatorContext = WorkerContext;
|
| - m_mainThreadLoader = DocumentThreadableLoader::create(*document, this, request, options, resourceLoaderOptions);
|
| - if (!m_mainThreadLoader) {
|
| - // DocumentThreadableLoader::create may return 0 when the document loader has been already changed.
|
| - didFail(ResourceError(errorDomainBlinkInternal, 0, request.url().string(), "The parent document page has been unloaded."));
|
| - }
|
| + m_mainThreadLoader->start(request);
|
| }
|
|
|
| -void WorkerThreadableLoader::MainThreadBridgeBase::createLoader(const ResourceRequest& request, const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions, const ReferrerPolicy& referrerPolicy, const String& outgoingReferrer)
|
| +void WorkerThreadableLoader::MainThreadBridgeBase::createLoaderInMainThread(const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions)
|
| {
|
| - m_loaderProxy->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase::mainThreadCreateLoader, this, request, options, resourceLoaderOptions, referrerPolicy, outgoingReferrer));
|
| + m_loaderProxy->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase::mainThreadCreateLoader, this, options, resourceLoaderOptions));
|
| +}
|
| +
|
| +void WorkerThreadableLoader::MainThreadBridgeBase::startInMainThread(const ResourceRequest& request, const WorkerGlobalScope& workerGlobalScope)
|
| +{
|
| + loaderProxy()->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase::mainThreadStart, this, request, workerGlobalScope.referrerPolicy(), workerGlobalScope.url().strippedForUseAsReferrer()));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadDestroy(ExecutionContext* context)
|
| @@ -198,65 +215,67 @@ void WorkerThreadableLoader::MainThreadBridgeBase::cancel()
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
|
| {
|
| - forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didSendData, workerClientWrapper(), bytesSent, totalBytesToBeSent));
|
| + forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didSendData, m_workerClientWrapper, bytesSent, totalBytesToBeSent));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveResponse(unsigned long identifier, const ResourceResponse& response, PassOwnPtr<WebDataConsumerHandle> handle)
|
| {
|
| - forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveResponse, workerClientWrapper(), identifier, response, handle));
|
| + forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveResponse, m_workerClientWrapper, identifier, response, handle));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveData(const char* data, unsigned dataLength)
|
| {
|
| - forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveData, workerClientWrapper(), createVectorFromMemoryRegion(data, dataLength)));
|
| + forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveData, m_workerClientWrapper, createVectorFromMemoryRegion(data, dataLength)));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didDownloadData(int dataLength)
|
| {
|
| - forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didDownloadData, workerClientWrapper(), dataLength));
|
| + forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didDownloadData, m_workerClientWrapper, dataLength));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveCachedMetadata(const char* data, int dataLength)
|
| {
|
| - forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveCachedMetadata, workerClientWrapper(), createVectorFromMemoryRegion(data, dataLength)));
|
| + forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveCachedMetadata, m_workerClientWrapper, createVectorFromMemoryRegion(data, dataLength)));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didFinishLoading(unsigned long identifier, double finishTime)
|
| {
|
| - forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClientWrapper::didFinishLoading, workerClientWrapper(), identifier, finishTime));
|
| + forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClientWrapper::didFinishLoading, m_workerClientWrapper, identifier, finishTime));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didFail(const ResourceError& error)
|
| {
|
| - forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClientWrapper::didFail, workerClientWrapper(), error));
|
| + forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClientWrapper::didFail, m_workerClientWrapper, error));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didFailAccessControlCheck(const ResourceError& error)
|
| {
|
| - forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClientWrapper::didFailAccessControlCheck, workerClientWrapper(), error));
|
| + forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClientWrapper::didFailAccessControlCheck, m_workerClientWrapper, error));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didFailRedirectCheck()
|
| {
|
| - forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClientWrapper::didFailRedirectCheck, workerClientWrapper()));
|
| + forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClientWrapper::didFailRedirectCheck, m_workerClientWrapper));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveResourceTiming(const ResourceTimingInfo& info)
|
| {
|
| - forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveResourceTiming, workerClientWrapper(), info));
|
| + forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveResourceTiming, m_workerClientWrapper, info));
|
| }
|
|
|
| WorkerThreadableLoader::MainThreadAsyncBridge::MainThreadAsyncBridge(
|
| WorkerGlobalScope& workerGlobalScope,
|
| PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper,
|
| - const ResourceRequest& request,
|
| const ThreadableLoaderOptions& options,
|
| - const ResourceLoaderOptions& resourceLoaderOptions,
|
| - const ReferrerPolicy referrerPolicy,
|
| - const String& outgoingReferrer)
|
| + const ResourceLoaderOptions& resourceLoaderOptions)
|
| : MainThreadBridgeBase(workerClientWrapper, workerGlobalScope.thread()->workerLoaderProxy())
|
| {
|
| - createLoader(request, options, resourceLoaderOptions, referrerPolicy, outgoingReferrer);
|
| + createLoaderInMainThread(options, resourceLoaderOptions);
|
| +}
|
| +
|
| +void WorkerThreadableLoader::MainThreadAsyncBridge::start(const ResourceRequest& request, const WorkerGlobalScope& workerGlobalScope)
|
| +{
|
| + startInMainThread(request, workerGlobalScope);
|
| }
|
|
|
| WorkerThreadableLoader::MainThreadAsyncBridge::~MainThreadAsyncBridge()
|
| @@ -276,18 +295,20 @@ void WorkerThreadableLoader::MainThreadAsyncBridge::forwardTaskToWorkerOnLoaderD
|
| WorkerThreadableLoader::MainThreadSyncBridge::MainThreadSyncBridge(
|
| WorkerGlobalScope& workerGlobalScope,
|
| PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper,
|
| - const ResourceRequest& request,
|
| const ThreadableLoaderOptions& options,
|
| - const ResourceLoaderOptions& resourceLoaderOptions,
|
| - const ReferrerPolicy referrerPolicy,
|
| - const String& outgoingReferrer)
|
| + const ResourceLoaderOptions& resourceLoaderOptions)
|
| : MainThreadBridgeBase(workerClientWrapper, workerGlobalScope.thread()->workerLoaderProxy())
|
| , m_done(false)
|
| {
|
| + createLoaderInMainThread(options, resourceLoaderOptions);
|
| +}
|
| +
|
| +void WorkerThreadableLoader::MainThreadSyncBridge::start(const ResourceRequest& request, const WorkerGlobalScope& workerGlobalScope)
|
| +{
|
| WaitableEvent* shutdownEvent = workerGlobalScope.thread()->shutdownEvent();
|
| m_loaderDoneEvent = adoptPtr(new WaitableEvent());
|
|
|
| - createLoader(request, options, resourceLoaderOptions, referrerPolicy, outgoingReferrer);
|
| + startInMainThread(request, workerGlobalScope);
|
|
|
| size_t signaledIndex;
|
| {
|
|
|