Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(319)

Unified Diff: Source/web/WebEmbeddedWorkerImpl.cpp

Issue 887463003: Turn WorkerLoaderProxy into a threadsafe, ref-counted object. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Clarify WorkerLoaderProxyProvider's obligations on shutdown Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/web/WebEmbeddedWorkerImpl.h ('k') | Source/web/WebSharedWorkerImpl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/web/WebEmbeddedWorkerImpl.cpp
diff --git a/Source/web/WebEmbeddedWorkerImpl.cpp b/Source/web/WebEmbeddedWorkerImpl.cpp
index 04083c122948b97f2e4385a562341954d9692b9e..2859e49573d147c7b90c81bba82fa2928568e6c7 100644
--- a/Source/web/WebEmbeddedWorkerImpl.cpp
+++ b/Source/web/WebEmbeddedWorkerImpl.cpp
@@ -122,39 +122,7 @@ private:
RefPtr<ContentSecurityPolicy> m_contentSecurityPolicy;
};
-class WebEmbeddedWorkerImpl::LoaderProxy : public WorkerLoaderProxy {
-public:
- static PassOwnPtr<LoaderProxy> create(WebEmbeddedWorkerImpl& embeddedWorker)
- {
- return adoptPtr(new LoaderProxy(embeddedWorker));
- }
-
- virtual void postTaskToLoader(PassOwnPtr<ExecutionContextTask> task) override
- {
- toWebLocalFrameImpl(m_embeddedWorker.m_mainFrame)->frame()->document()->postTask(task);
- }
-
- virtual bool postTaskToWorkerGlobalScope(PassOwnPtr<ExecutionContextTask> task) override
- {
- if (m_embeddedWorker.m_askedToTerminate || !m_embeddedWorker.m_workerThread)
- return false;
- m_embeddedWorker.m_workerThread->postTask(task);
- return !m_embeddedWorker.m_workerThread->terminated();
- }
-
-private:
- explicit LoaderProxy(WebEmbeddedWorkerImpl& embeddedWorker)
- : m_embeddedWorker(embeddedWorker)
- {
- }
-
- // Not owned, embedded worker owns this.
- WebEmbeddedWorkerImpl& m_embeddedWorker;
-};
-
-WebEmbeddedWorker* WebEmbeddedWorker::create(
- WebServiceWorkerContextClient* client,
- WebWorkerPermissionClientProxy* permissionClient)
+WebEmbeddedWorker* WebEmbeddedWorker::create(WebServiceWorkerContextClient* client, WebWorkerPermissionClientProxy* permissionClient)
{
return new WebEmbeddedWorkerImpl(adoptPtr(client), adoptPtr(permissionClient));
}
@@ -165,9 +133,7 @@ static HashSet<WebEmbeddedWorkerImpl*>& runningWorkerInstances()
return set;
}
-WebEmbeddedWorkerImpl::WebEmbeddedWorkerImpl(
- PassOwnPtr<WebServiceWorkerContextClient> client,
- PassOwnPtr<WebWorkerPermissionClientProxy> permissionClient)
+WebEmbeddedWorkerImpl::WebEmbeddedWorkerImpl(PassOwnPtr<WebServiceWorkerContextClient> client, PassOwnPtr<WebWorkerPermissionClientProxy> permissionClient)
: m_workerContextClient(client)
, m_permissionClient(permissionClient)
, m_workerInspectorProxy(WorkerInspectorProxy::create())
@@ -197,6 +163,8 @@ WebEmbeddedWorkerImpl::~WebEmbeddedWorkerImpl()
m_webView->close();
m_mainFrame->close();
+ if (m_loaderProxy)
+ m_loaderProxy->detachProvider(this);
}
void WebEmbeddedWorkerImpl::terminateAll()
@@ -294,6 +262,20 @@ void WebEmbeddedWorkerImpl::postMessageToPageInspector(const String& message)
pageInspector->dispatchMessageFromWorker(message);
}
+void WebEmbeddedWorkerImpl::postTaskToLoader(PassOwnPtr<ExecutionContextTask> task)
+{
+ toWebLocalFrameImpl(m_mainFrame)->frame()->document()->postTask(task);
+}
+
+bool WebEmbeddedWorkerImpl::postTaskToWorkerGlobalScope(PassOwnPtr<ExecutionContextTask> task)
+{
+ if (m_askedToTerminate || !m_workerThread)
+ return false;
+
+ m_workerThread->postTask(task);
+ return !m_workerThread->terminated();
+}
+
void WebEmbeddedWorkerImpl::prepareShadowPageForLoader()
{
// Create 'shadow page', which is never displayed and is used mainly to
@@ -441,8 +423,8 @@ void WebEmbeddedWorkerImpl::startWorkerThread()
m_mainScriptLoader.clear();
m_workerGlobalScopeProxy = ServiceWorkerGlobalScopeProxy::create(*this, *document, *m_workerContextClient);
- m_loaderProxy = LoaderProxy::create(*this);
- m_workerThread = ServiceWorkerThread::create(*m_loaderProxy, *m_workerGlobalScopeProxy, startupData.release());
+ m_loaderProxy = WorkerLoaderProxy::create(this);
+ m_workerThread = ServiceWorkerThread::create(m_loaderProxy, *m_workerGlobalScopeProxy, startupData.release());
m_workerThread->start();
m_workerInspectorProxy->workerThreadCreated(document, m_workerThread.get(), scriptURL);
}
« no previous file with comments | « Source/web/WebEmbeddedWorkerImpl.h ('k') | Source/web/WebSharedWorkerImpl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698