summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp')
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp156
1 files changed, 59 insertions, 97 deletions
diff --git a/chromium/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp b/chromium/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp
index ad16a0f36d0..b4ee50843c9 100644
--- a/chromium/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp
@@ -35,26 +35,26 @@
#include "core/dom/CrossThreadTask.h"
#include "core/dom/Document.h"
#include "core/loader/DocumentThreadableLoader.h"
+#include "core/loader/WorkerLoaderClientBridgeSyncHelper.h"
#include "core/workers/WorkerGlobalScope.h"
#include "core/workers/WorkerLoaderProxy.h"
#include "core/workers/WorkerThread.h"
#include "platform/network/ResourceError.h"
#include "platform/network/ResourceRequest.h"
#include "platform/network/ResourceResponse.h"
+#include "platform/weborigin/Referrer.h"
+#include "public/platform/Platform.h"
+#include "public/platform/WebWaitableEvent.h"
#include "wtf/MainThread.h"
#include "wtf/OwnPtr.h"
#include "wtf/Vector.h"
-using namespace std;
-
namespace WebCore {
-static const char loadResourceSynchronouslyMode[] = "loadResourceSynchronouslyMode";
-
-WorkerThreadableLoader::WorkerThreadableLoader(WorkerGlobalScope* workerGlobalScope, ThreadableLoaderClient* client, const String& taskMode, const ResourceRequest& request, const ThreadableLoaderOptions& options)
- : m_workerGlobalScope(workerGlobalScope)
- , m_workerClientWrapper(ThreadableLoaderClientWrapper::create(client))
- , m_bridge(*(new MainThreadBridge(m_workerClientWrapper, m_workerGlobalScope->thread()->workerLoaderProxy(), taskMode, request, options, workerGlobalScope->url().strippedForUseAsReferrer())))
+WorkerThreadableLoader::WorkerThreadableLoader(WorkerGlobalScope& workerGlobalScope, PassRefPtr<ThreadableLoaderClientWrapper> clientWrapper, PassOwnPtr<ThreadableLoaderClient> clientBridge, const ResourceRequest& request, const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions)
+ : m_workerGlobalScope(&workerGlobalScope)
+ , m_workerClientWrapper(clientWrapper)
+ , m_bridge(*(new MainThreadBridge(m_workerClientWrapper, clientBridge, workerGlobalScope.thread()->workerLoaderProxy(), request, options, resourceLoaderOptions, workerGlobalScope.url().strippedForUseAsReferrer())))
{
}
@@ -63,21 +63,36 @@ WorkerThreadableLoader::~WorkerThreadableLoader()
m_bridge.destroy();
}
-void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope* workerGlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, const ThreadableLoaderOptions& options)
+void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& workerGlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions)
{
- WorkerRunLoop& runLoop = workerGlobalScope->thread()->runLoop();
+ blink::WebWaitableEvent* shutdownEvent =
+ workerGlobalScope.thread()->shutdownEvent();
+ OwnPtr<blink::WebWaitableEvent> loaderDone =
+ adoptPtr(blink::Platform::current()->createWaitableEvent());
+
+ Vector<blink::WebWaitableEvent*> events;
+ events.append(shutdownEvent);
+ events.append(loaderDone.get());
- // Create a unique mode just for this synchronous resource load.
- String mode = loadResourceSynchronouslyMode;
- mode.append(String::number(runLoop.createUniqueId()));
+ RefPtr<ThreadableLoaderClientWrapper> clientWrapper(ThreadableLoaderClientWrapper::create(&client));
+ OwnPtr<WorkerLoaderClientBridgeSyncHelper> clientBridge(WorkerLoaderClientBridgeSyncHelper::create(client, loaderDone.release()));
- RefPtr<WorkerThreadableLoader> loader = WorkerThreadableLoader::create(workerGlobalScope, &client, mode, request, options);
- MessageQueueWaitResult result = MessageQueueMessageReceived;
- while (!loader->done() && result != MessageQueueTerminated)
- result = runLoop.runInMode(workerGlobalScope, mode);
+ // This must be valid while loader is around.
+ WorkerLoaderClientBridgeSyncHelper* clientBridgePtr = clientBridge.get();
- if (!loader->done() && result == MessageQueueTerminated)
+ RefPtr<WorkerThreadableLoader> loader = WorkerThreadableLoader::create(workerGlobalScope, clientWrapper, clientBridge.release(), request, options, resourceLoaderOptions);
+
+ blink::WebWaitableEvent* signalled;
+ {
+ ThreadState::SafePointScope scope(ThreadState::HeapPointersOnStack);
+ signalled = blink::Platform::current()->waitMultipleEvents(events);
+ }
+ if (signalled == shutdownEvent) {
loader->cancel();
+ return;
+ }
+
+ clientBridgePtr->run();
}
void WorkerThreadableLoader::cancel()
@@ -85,31 +100,37 @@ void WorkerThreadableLoader::cancel()
m_bridge.cancel();
}
-WorkerThreadableLoader::MainThreadBridge::MainThreadBridge(PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, WorkerLoaderProxy& loaderProxy, const String& taskMode,
- const ResourceRequest& request, const ThreadableLoaderOptions& options, const String& outgoingReferrer)
- : m_workerClientWrapper(workerClientWrapper)
+WorkerThreadableLoader::MainThreadBridge::MainThreadBridge(
+ PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper,
+ PassOwnPtr<ThreadableLoaderClient> clientBridge,
+ WorkerLoaderProxy& loaderProxy,
+ const ResourceRequest& request,
+ const ThreadableLoaderOptions& options,
+ const ResourceLoaderOptions& resourceLoaderOptions,
+ const String& outgoingReferrer)
+ : m_clientBridge(clientBridge)
+ , m_workerClientWrapper(workerClientWrapper)
, m_loaderProxy(loaderProxy)
- , m_taskMode(taskMode.isolatedCopy())
{
ASSERT(m_workerClientWrapper.get());
+ ASSERT(m_clientBridge.get());
m_loaderProxy.postTaskToLoader(
- createCallbackTask(&MainThreadBridge::mainThreadCreateLoader,
- AllowCrossThreadAccess(this), request, options, outgoingReferrer));
+ createCallbackTask(&MainThreadBridge::mainThreadCreateLoader, AllowCrossThreadAccess(this), request, options, resourceLoaderOptions, outgoingReferrer));
}
WorkerThreadableLoader::MainThreadBridge::~MainThreadBridge()
{
}
-void WorkerThreadableLoader::MainThreadBridge::mainThreadCreateLoader(ExecutionContext* context, MainThreadBridge* thisPtr, PassOwnPtr<CrossThreadResourceRequestData> requestData, ThreadableLoaderOptions options, const String& outgoingReferrer)
+void WorkerThreadableLoader::MainThreadBridge::mainThreadCreateLoader(ExecutionContext* context, MainThreadBridge* thisPtr, PassOwnPtr<CrossThreadResourceRequestData> requestData, ThreadableLoaderOptions options, ResourceLoaderOptions resourceLoaderOptions, const String& outgoingReferrer)
{
ASSERT(isMainThread());
Document* document = toDocument(context);
OwnPtr<ResourceRequest> request(ResourceRequest::adopt(requestData));
- request->setHTTPReferrer(outgoingReferrer);
- options.requestInitiatorContext = WorkerContext;
- thisPtr->m_mainThreadLoader = DocumentThreadableLoader::create(document, thisPtr, *request, options);
+ request->setHTTPReferrer(Referrer(outgoingReferrer, ReferrerPolicyDefault));
+ resourceLoaderOptions.requestInitiatorContext = WorkerContext;
+ thisPtr->m_mainThreadLoader = DocumentThreadableLoader::create(*document, thisPtr, *request, options, resourceLoaderOptions);
if (!thisPtr->m_mainThreadLoader) {
// DocumentThreadableLoader::create may return 0 when the document loader has been already changed.
thisPtr->didFail(ResourceError(errorDomainBlinkInternal, 0, request->url().string(), "Can't create DocumentThreadableLoader"));
@@ -141,7 +162,7 @@ void WorkerThreadableLoader::MainThreadBridge::mainThreadCancel(ExecutionContext
if (!thisPtr->m_mainThreadLoader)
return;
thisPtr->m_mainThreadLoader->cancel();
- thisPtr->m_mainThreadLoader = 0;
+ thisPtr->m_mainThreadLoader = nullptr;
}
void WorkerThreadableLoader::MainThreadBridge::cancel()
@@ -164,108 +185,49 @@ void WorkerThreadableLoader::MainThreadBridge::clearClientWrapper()
m_workerClientWrapper->clearClient();
}
-static void workerGlobalScopeDidSendData(ExecutionContext* context, PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
-{
- ASSERT_UNUSED(context, context->isWorkerGlobalScope());
- workerClientWrapper->didSendData(bytesSent, totalBytesToBeSent);
-}
-
void WorkerThreadableLoader::MainThreadBridge::didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
{
- m_loaderProxy.postTaskForModeToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidSendData, m_workerClientWrapper, bytesSent, totalBytesToBeSent), m_taskMode);
-}
-
-static void workerGlobalScopeDidReceiveResponse(ExecutionContext* context, PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, unsigned long identifier, PassOwnPtr<CrossThreadResourceResponseData> responseData)
-{
- ASSERT_UNUSED(context, context->isWorkerGlobalScope());
- OwnPtr<ResourceResponse> response(ResourceResponse::adopt(responseData));
- workerClientWrapper->didReceiveResponse(identifier, *response);
+ m_clientBridge->didSendData(bytesSent, totalBytesToBeSent);
}
void WorkerThreadableLoader::MainThreadBridge::didReceiveResponse(unsigned long identifier, const ResourceResponse& response)
{
- m_loaderProxy.postTaskForModeToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidReceiveResponse, m_workerClientWrapper, identifier, response), m_taskMode);
-}
-
-static void workerGlobalScopeDidReceiveData(ExecutionContext* context, PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, PassOwnPtr<Vector<char> > vectorData)
-{
- ASSERT_UNUSED(context, context->isWorkerGlobalScope());
- workerClientWrapper->didReceiveData(vectorData->data(), vectorData->size());
+ m_clientBridge->didReceiveResponse(identifier, response);
}
void WorkerThreadableLoader::MainThreadBridge::didReceiveData(const char* data, int dataLength)
{
- OwnPtr<Vector<char> > vector = adoptPtr(new Vector<char>(dataLength)); // needs to be an OwnPtr for usage with createCallbackTask.
- memcpy(vector->data(), data, dataLength);
- m_loaderProxy.postTaskForModeToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidReceiveData, m_workerClientWrapper, vector.release()), m_taskMode);
-}
-
-static void workerGlobalScopeDidDownloadData(ExecutionContext* context, PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, int dataLength)
-{
- ASSERT_UNUSED(context, context->isWorkerGlobalScope());
- workerClientWrapper->didDownloadData(dataLength);
+ m_clientBridge->didReceiveData(data, dataLength);
}
void WorkerThreadableLoader::MainThreadBridge::didDownloadData(int dataLength)
{
- m_loaderProxy.postTaskForModeToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidDownloadData, m_workerClientWrapper, dataLength), m_taskMode);
-}
-
-static void workerGlobalScopeDidReceiveCachedMetadata(ExecutionContext* context, PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, PassOwnPtr<Vector<char> > vectorData)
-{
- ASSERT_UNUSED(context, context->isWorkerGlobalScope());
- workerClientWrapper->didReceiveCachedMetadata(vectorData->data(), vectorData->size());
+ m_clientBridge->didDownloadData(dataLength);
}
void WorkerThreadableLoader::MainThreadBridge::didReceiveCachedMetadata(const char* data, int dataLength)
{
- OwnPtr<Vector<char> > vector = adoptPtr(new Vector<char>(dataLength)); // needs to be an OwnPtr for usage with createCallbackTask.
- memcpy(vector->data(), data, dataLength);
- m_loaderProxy.postTaskForModeToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidReceiveCachedMetadata, m_workerClientWrapper, vector.release()), m_taskMode);
-}
-
-static void workerGlobalScopeDidFinishLoading(ExecutionContext* context, PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, unsigned long identifier, double finishTime)
-{
- ASSERT_UNUSED(context, context->isWorkerGlobalScope());
- workerClientWrapper->didFinishLoading(identifier, finishTime);
+ m_clientBridge->didReceiveCachedMetadata(data, dataLength);
}
void WorkerThreadableLoader::MainThreadBridge::didFinishLoading(unsigned long identifier, double finishTime)
{
- m_loaderProxy.postTaskForModeToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidFinishLoading, m_workerClientWrapper, identifier, finishTime), m_taskMode);
-}
-
-static void workerGlobalScopeDidFail(ExecutionContext* context, PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, const ResourceError& error)
-{
- ASSERT_UNUSED(context, context->isWorkerGlobalScope());
- workerClientWrapper->didFail(error);
+ m_clientBridge->didFinishLoading(identifier, finishTime);
}
void WorkerThreadableLoader::MainThreadBridge::didFail(const ResourceError& error)
{
- m_loaderProxy.postTaskForModeToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidFail, m_workerClientWrapper, error), m_taskMode);
-}
-
-static void workerGlobalScopeDidFailAccessControlCheck(ExecutionContext* context, PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, const ResourceError& error)
-{
- ASSERT_UNUSED(context, context->isWorkerGlobalScope());
- workerClientWrapper->didFailAccessControlCheck(error);
+ m_clientBridge->didFail(error);
}
void WorkerThreadableLoader::MainThreadBridge::didFailAccessControlCheck(const ResourceError& error)
{
- m_loaderProxy.postTaskForModeToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidFailAccessControlCheck, m_workerClientWrapper, error), m_taskMode);
-}
-
-static void workerGlobalScopeDidFailRedirectCheck(ExecutionContext* context, PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper)
-{
- ASSERT_UNUSED(context, context->isWorkerGlobalScope());
- workerClientWrapper->didFailRedirectCheck();
+ m_clientBridge->didFailAccessControlCheck(error);
}
void WorkerThreadableLoader::MainThreadBridge::didFailRedirectCheck()
{
- m_loaderProxy.postTaskForModeToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidFailRedirectCheck, m_workerClientWrapper), m_taskMode);
+ m_clientBridge->didFailRedirectCheck();
}
} // namespace WebCore