Index: content/browser/service_worker/service_worker_context_wrapper.cc |
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc |
index 0687f40fc631d145cf1823428b8073a89470c832..713290e0a13a8f9a537ec10a09ca0157391eaaaa 100644 |
--- a/content/browser/service_worker/service_worker_context_wrapper.cc |
+++ b/content/browser/service_worker/service_worker_context_wrapper.cc |
@@ -18,7 +18,7 @@ |
BrowserContext* browser_context) |
: observer_list_( |
new ObserverListThreadSafe<ServiceWorkerContextObserver>()), |
- process_manager_(new ServiceWorkerProcessManager(browser_context)) { |
+ browser_context_(browser_context) { |
} |
ServiceWorkerContextWrapper::~ServiceWorkerContextWrapper() { |
@@ -39,12 +39,16 @@ |
} |
void ServiceWorkerContextWrapper::Shutdown() { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- process_manager_->Shutdown(); |
- BrowserThread::PostTask( |
- BrowserThread::IO, |
- FROM_HERE, |
- base::Bind(&ServiceWorkerContextWrapper::ShutdownOnIO, this)); |
+ if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ browser_context_ = NULL; |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&ServiceWorkerContextWrapper::Shutdown, this)); |
+ return; |
+ } |
+ // Breaks the reference cycle through ServiceWorkerProcessManager. |
+ context_core_.reset(); |
} |
ServiceWorkerContextCore* ServiceWorkerContextWrapper::context() { |
@@ -145,17 +149,13 @@ |
return; |
} |
DCHECK(!context_core_); |
- context_core_.reset(new ServiceWorkerContextCore(user_data_directory, |
- database_task_runner, |
- disk_cache_thread, |
- quota_manager_proxy, |
- observer_list_, |
- this)); |
-} |
- |
-void ServiceWorkerContextWrapper::ShutdownOnIO() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- context_core_.reset(); |
+ context_core_.reset(new ServiceWorkerContextCore( |
+ user_data_directory, |
+ database_task_runner, |
+ disk_cache_thread, |
+ quota_manager_proxy, |
+ observer_list_, |
+ make_scoped_ptr(new ServiceWorkerProcessManager(this)))); |
} |
} // namespace content |