Index: content/browser/shared_worker/shared_worker_service_impl.cc |
diff --git a/content/browser/shared_worker/shared_worker_service_impl.cc b/content/browser/shared_worker/shared_worker_service_impl.cc |
index e48add9263e453184df2c7697c2c552ca50d66af..1f81ca30ee834b6b56bcef27b0a4ad03597a81a4 100644 |
--- a/content/browser/shared_worker/shared_worker_service_impl.cc |
+++ b/content/browser/shared_worker/shared_worker_service_impl.cc |
@@ -129,22 +129,22 @@ void SharedWorkerServiceImpl::CreateWorker( |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
ScopedWorkerDependencyChecker checker(this); |
*url_mismatch = false; |
- SharedWorkerInstance* existing_instance = |
- FindSharedWorkerInstance( |
- params.url, params.name, partition, resource_context); |
- if (existing_instance) { |
- if (params.url != existing_instance->url()) { |
+ SharedWorkerHost* existing_host = FindSharedWorkerHost( |
+ params.url, params.name, partition, resource_context); |
+ if (existing_host) { |
+ if (params.url != existing_host->instance()->url()) { |
*url_mismatch = true; |
return; |
} |
- if (existing_instance->load_failed()) { |
+ if (existing_host->load_failed()) { |
filter->Send(new ViewMsg_WorkerScriptLoadFailed(route_id)); |
return; |
} |
- existing_instance->AddFilter(filter, route_id); |
- existing_instance->worker_document_set()->Add( |
- filter, params.document_id, filter->render_process_id(), |
- params.render_frame_route_id); |
+ existing_host->AddFilter(filter, route_id); |
+ existing_host->worker_document_set()->Add(filter, |
+ params.document_id, |
+ filter->render_process_id(), |
+ params.render_frame_route_id); |
filter->Send(new ViewMsg_WorkerCreated(route_id)); |
return; |
} |
@@ -156,12 +156,13 @@ void SharedWorkerServiceImpl::CreateWorker( |
params.security_policy_type, |
resource_context, |
partition)); |
- instance->AddFilter(filter, route_id); |
- instance->worker_document_set()->Add( |
- filter, params.document_id, filter->render_process_id(), |
- params.render_frame_route_id); |
- |
scoped_ptr<SharedWorkerHost> host(new SharedWorkerHost(instance.release())); |
+ host->AddFilter(filter, route_id); |
+ host->worker_document_set()->Add(filter, |
+ params.document_id, |
+ filter->render_process_id(), |
+ params.render_frame_route_id); |
+ |
host->Init(filter); |
const int worker_route_id = host->worker_route_id(); |
worker_hosts_.set(std::make_pair(filter->render_process_id(), |
@@ -298,7 +299,7 @@ SharedWorkerHost* SharedWorkerServiceImpl::FindSharedWorkerHost( |
worker_route_id)); |
} |
-SharedWorkerInstance* SharedWorkerServiceImpl::FindSharedWorkerInstance( |
+SharedWorkerHost* SharedWorkerServiceImpl::FindSharedWorkerHost( |
const GURL& url, |
const base::string16& name, |
const WorkerStoragePartition& partition, |
@@ -307,8 +308,9 @@ SharedWorkerInstance* SharedWorkerServiceImpl::FindSharedWorkerInstance( |
iter != worker_hosts_.end(); |
++iter) { |
SharedWorkerInstance* instance = iter->second->instance(); |
- if (instance && instance->Matches(url, name, partition, resource_context)) |
- return instance; |
+ if (instance && !iter->second->closed() && |
+ instance->Matches(url, name, partition, resource_context)) |
+ return iter->second; |
} |
return NULL; |
} |
@@ -322,9 +324,9 @@ SharedWorkerServiceImpl::GetRenderersWithWorkerDependency() { |
const int process_id = host_iter->first.first; |
if (dependent_renderers.count(process_id)) |
continue; |
- SharedWorkerInstance* instance = host_iter->second->instance(); |
- if (instance && |
- instance->worker_document_set()->ContainsExternalRenderer(process_id)) { |
+ if (host_iter->second->instance() && |
+ host_iter->second->worker_document_set()->ContainsExternalRenderer( |
+ process_id)) { |
dependent_renderers.insert(process_id); |
} |
} |