summaryrefslogtreecommitdiffstats
path: root/content/child/service_worker
diff options
context:
space:
mode:
authorkinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-22 00:10:10 +0000
committerkinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-22 00:10:10 +0000
commit447741dcbfc8088854b701d0e6bd726ad308c449 (patch)
tree7e63def79d9378b7a5d1cc9f35e30b85c768ba1d /content/child/service_worker
parent0318f92ba7c54fc5ef6397c6d58250fea95c7196 (diff)
downloadchromium_src-447741dcbfc8088854b701d0e6bd726ad308c449.zip
chromium_src-447741dcbfc8088854b701d0e6bd726ad308c449.tar.gz
chromium_src-447741dcbfc8088854b701d0e6bd726ad308c449.tar.bz2
Don't try to create ServiceWorkerDispatcher in destruction path
If dispatcher is already deleted we don't need to bother re-creating it (as it could lead to a leak in worker shutdown sequence). BUG=364822 Review URL: https://codereview.chromium.org/243123002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@265121 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/child/service_worker')
-rw-r--r--content/child/service_worker/service_worker_dispatcher.cc7
-rw-r--r--content/child/service_worker/web_service_worker_provider_impl.cc13
-rw-r--r--content/child/service_worker/web_service_worker_provider_impl.h1
3 files changed, 19 insertions, 2 deletions
diff --git a/content/child/service_worker/service_worker_dispatcher.cc b/content/child/service_worker/service_worker_dispatcher.cc
index fe665cb..100693b 100644
--- a/content/child/service_worker/service_worker_dispatcher.cc
+++ b/content/child/service_worker/service_worker_dispatcher.cc
@@ -39,6 +39,13 @@ ServiceWorkerDispatcher::ServiceWorkerDispatcher(
}
ServiceWorkerDispatcher::~ServiceWorkerDispatcher() {
+ for (ScriptClientMap::iterator it = script_clients_.begin();
+ it != script_clients_.end();
+ ++it) {
+ Send(new ServiceWorkerHostMsg_RemoveScriptClient(
+ CurrentWorkerId(), it->first));
+ }
+
g_dispatcher_tls.Pointer()->Set(kHasBeenDeleted);
}
diff --git a/content/child/service_worker/web_service_worker_provider_impl.cc b/content/child/service_worker/web_service_worker_provider_impl.cc
index e1bcfb5..99f9738 100644
--- a/content/child/service_worker/web_service_worker_provider_impl.cc
+++ b/content/child/service_worker/web_service_worker_provider_impl.cc
@@ -24,7 +24,7 @@ WebServiceWorkerProviderImpl::WebServiceWorkerProviderImpl(
WebServiceWorkerProviderImpl::~WebServiceWorkerProviderImpl() {
// Make sure the script client is removed.
- GetDispatcher()->RemoveScriptClient(provider_id_);
+ RemoveScriptClient();
}
void WebServiceWorkerProviderImpl::setClient(
@@ -32,7 +32,7 @@ void WebServiceWorkerProviderImpl::setClient(
if (client)
GetDispatcher()->AddScriptClient(provider_id_, client);
else
- GetDispatcher()->RemoveScriptClient(provider_id_);
+ RemoveScriptClient();
}
void WebServiceWorkerProviderImpl::registerServiceWorker(
@@ -50,6 +50,15 @@ void WebServiceWorkerProviderImpl::unregisterServiceWorker(
provider_id_, pattern, callbacks);
}
+void WebServiceWorkerProviderImpl::RemoveScriptClient() {
+ // Remove the script client, but only if the dispatcher is still there.
+ // (For cleanup path we don't need to bother creating a new dispatcher)
+ ServiceWorkerDispatcher* dispatcher =
+ ServiceWorkerDispatcher::GetThreadSpecificInstance();
+ if (dispatcher)
+ dispatcher->RemoveScriptClient(provider_id_);
+}
+
ServiceWorkerDispatcher* WebServiceWorkerProviderImpl::GetDispatcher() {
return ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance(
thread_safe_sender_);
diff --git a/content/child/service_worker/web_service_worker_provider_impl.h b/content/child/service_worker/web_service_worker_provider_impl.h
index d0a641f..69aeed6 100644
--- a/content/child/service_worker/web_service_worker_provider_impl.h
+++ b/content/child/service_worker/web_service_worker_provider_impl.h
@@ -37,6 +37,7 @@ class WebServiceWorkerProviderImpl
WebServiceWorkerCallbacks*);
private:
+ void RemoveScriptClient();
ServiceWorkerDispatcher* GetDispatcher();
scoped_refptr<ThreadSafeSender> thread_safe_sender_;