| Index: Source/web/WebEmbeddedWorkerImpl.cpp
|
| diff --git a/Source/web/WebEmbeddedWorkerImpl.cpp b/Source/web/WebEmbeddedWorkerImpl.cpp
|
| index bbdea4eebd7a85f6ef92e289b2127efb71d83680..998955367dc26d81532381dbe716c8fd06a52617 100644
|
| --- a/Source/web/WebEmbeddedWorkerImpl.cpp
|
| +++ b/Source/web/WebEmbeddedWorkerImpl.cpp
|
| @@ -31,6 +31,7 @@
|
| #include "config.h"
|
| #include "WebEmbeddedWorkerImpl.h"
|
|
|
| +#include "ServiceWorkerGlobalScopeProxy.h"
|
| #include "WebDataSourceImpl.h"
|
| #include "WebFrameImpl.h"
|
| #include "WebServiceWorkerContextClient.h"
|
| @@ -41,9 +42,11 @@
|
| #include "core/loader/FrameLoadRequest.h"
|
| #include "core/loader/SubstituteData.h"
|
| #include "core/workers/WorkerClients.h"
|
| +#include "core/workers/WorkerLoaderProxy.h"
|
| #include "core/workers/WorkerScriptLoader.h"
|
| #include "core/workers/WorkerScriptLoaderClient.h"
|
| #include "core/workers/WorkerThreadStartupData.h"
|
| +#include "modules/serviceworkers/ServiceWorkerThread.h"
|
| #include "platform/NotImplemented.h"
|
| #include "platform/SharedBuffer.h"
|
| #include "wtf/Functional.h"
|
| @@ -76,6 +79,7 @@ public:
|
| }
|
|
|
| bool failed() const { return m_scriptLoader->failed(); }
|
| + const KURL& url() const { return m_scriptLoader->responseURL(); }
|
| String script() const { return m_scriptLoader->script(); }
|
|
|
| private:
|
| @@ -92,6 +96,35 @@ private:
|
| Closure m_callback;
|
| };
|
|
|
| +class WebEmbeddedWorkerImpl::LoaderProxy : public WorkerLoaderProxy {
|
| +public:
|
| + static PassOwnPtr<LoaderProxy> create(WebEmbeddedWorkerImpl& embeddedWorker)
|
| + {
|
| + return adoptPtr(new LoaderProxy(embeddedWorker));
|
| + }
|
| +
|
| + virtual void postTaskToLoader(PassOwnPtr<ExecutionContextTask> task) OVERRIDE
|
| + {
|
| + m_embeddedWorker.m_loadingContext->postTask(task);
|
| + }
|
| +
|
| + virtual bool postTaskForModeToWorkerGlobalScope(PassOwnPtr<ExecutionContextTask> task, const String& mode) OVERRIDE
|
| + {
|
| + if (m_embeddedWorker.m_askedToTerminate || !m_embeddedWorker.m_workerThread)
|
| + return false;
|
| + return m_embeddedWorker.m_workerThread->runLoop().postTaskForMode(task, mode);
|
| + }
|
| +
|
| +private:
|
| + explicit LoaderProxy(WebEmbeddedWorkerImpl& embeddedWorker)
|
| + : m_embeddedWorker(embeddedWorker)
|
| + {
|
| + }
|
| +
|
| + // Not owned, embedded worker owns this.
|
| + WebEmbeddedWorkerImpl& m_embeddedWorker;
|
| +};
|
| +
|
| WebEmbeddedWorker* WebEmbeddedWorker::create(
|
| WebServiceWorkerContextClient* client,
|
| WebWorkerPermissionClientProxy* permissionClient)
|
| @@ -188,12 +221,31 @@ void WebEmbeddedWorkerImpl::onScriptLoaderFinished()
|
| return;
|
| }
|
|
|
| - // FIXME: Create WorkerReportingProxy, set up WorkerThreadStartupData,
|
| - // create ServiceWorkerThread and start it with m_scripLoader->script().
|
| + WorkerThreadStartMode startMode =
|
| + (m_workerStartData.startMode == WebEmbeddedWorkerStartModePauseOnStart)
|
| + ? PauseWorkerGlobalScopeOnStart : DontPauseWorkerGlobalScopeOnStart;
|
| +
|
| + OwnPtr<WorkerClients> workerClients = WorkerClients::create();
|
| + providePermissionClientToWorker(workerClients.get(), m_permissionClient.release());
|
| +
|
| + OwnPtr<WorkerThreadStartupData> startupData =
|
| + WorkerThreadStartupData::create(
|
| + m_mainScriptLoader->url(),
|
| + m_workerStartData.userAgent,
|
| + m_mainScriptLoader->script(),
|
| + startMode,
|
| + // FIXME: fill appropriate CSP info and policy type.
|
| + String(),
|
| + ContentSecurityPolicy::Enforce,
|
| + workerClients.release());
|
|
|
| m_mainScriptLoader.clear();
|
|
|
| - notImplemented();
|
| + m_workerGlobalScopeProxy = ServiceWorkerGlobalScopeProxy::create(*this, *m_loadingContext, m_workerContextClient.release());
|
| + m_loaderProxy = LoaderProxy::create(*this);
|
| +
|
| + m_workerThread = ServiceWorkerThread::create(*m_loaderProxy, *m_workerGlobalScopeProxy, startupData.release());
|
| + m_workerThread->start();
|
| }
|
|
|
| } // namespace blink
|
|
|