Chromium Code Reviews| Index: content/browser/worker_host/worker_service.cc |
| diff --git a/content/browser/worker_host/worker_service.cc b/content/browser/worker_host/worker_service.cc |
| index d33ebcca5ad86b5267f34032184a1ceee1aa9b0a..b82a78c9e440377acc42db069b914dff33257124 100644 |
| --- a/content/browser/worker_host/worker_service.cc |
| +++ b/content/browser/worker_host/worker_service.cc |
| @@ -84,12 +84,10 @@ void WorkerService::CreateWorker( |
| // it to. |
| WorkerProcessHost::WorkerInstance instance( |
| params.url, |
| - params.is_shared, |
| params.name, |
| next_worker_route_id(), |
| - params.is_shared ? 0 : filter->render_process_id(), |
| - params.is_shared ? 0 : params.parent_appcache_host_id, |
| - params.is_shared ? params.script_resource_appcache_id : 0, |
| + 0, |
| + params.script_resource_appcache_id, |
| &resource_context); |
| instance.AddFilter(filter, route_id); |
| instance.worker_document_set()->Add( |
| @@ -144,35 +142,8 @@ void WorkerService::LookupSharedWorker( |
| void WorkerService::CancelCreateDedicatedWorker( |
|
jam
2011/10/26 22:25:38
i guess this is second round?
|
| int route_id, |
| WorkerMessageFilter* filter) { |
| - for (WorkerProcessHost::Instances::iterator i = queued_workers_.begin(); |
| - i != queued_workers_.end(); ++i) { |
| - if (i->HasFilter(filter, route_id)) { |
| - DCHECK(!i->shared()); |
| - queued_workers_.erase(i); |
| - return; |
| - } |
| - } |
| - // There could be a race condition where the WebWorkerProxy told us to cancel |
| - // the worker right as we sent it a message say it's been created. Look at |
| - // the running workers. |
| - for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS); |
| - !iter.Done(); ++iter) { |
| - WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter); |
| - for (WorkerProcessHost::Instances::const_iterator instance = |
| - worker->instances().begin(); |
| - instance != worker->instances().end(); ++instance) { |
| - if (instance->HasFilter(filter, route_id)) { |
| - // Fake a worker destroyed message so that WorkerProcessHost cleans up |
| - // properly. |
| - WorkerMsg_TerminateWorkerContext message(route_id); |
| - ForwardToWorker(message, filter); |
| - return; |
| - } |
| - } |
| - } |
| - |
| - DCHECK(false) << "Couldn't find worker to cancel"; |
| + NOTREACHED(); |
| } |
| void WorkerService::ForwardToWorker(const IPC::Message& message, |
| @@ -199,12 +170,11 @@ void WorkerService::DocumentDetached(unsigned long long document_id, |
| // Remove any queued shared workers for this document. |
| for (WorkerProcessHost::Instances::iterator iter = queued_workers_.begin(); |
| iter != queued_workers_.end();) { |
| - if (iter->shared()) { |
| - iter->worker_document_set()->Remove(filter, document_id); |
| - if (iter->worker_document_set()->IsEmpty()) { |
| - iter = queued_workers_.erase(iter); |
| - continue; |
| - } |
| + |
| + iter->worker_document_set()->Remove(filter, document_id); |
| + if (iter->worker_document_set()->IsEmpty()) { |
| + iter = queued_workers_.erase(iter); |
| + continue; |
| } |
| ++iter; |
| } |
| @@ -244,65 +214,63 @@ bool WorkerService::CreateWorkerFromInstance( |
| // Check to see if this shared worker is already running (two pages may have |
| // tried to start up the worker simultaneously). |
| - if (instance.shared()) { |
| - // See if a worker with this name already exists. |
| - WorkerProcessHost::WorkerInstance* existing_instance = |
| - FindSharedWorkerInstance( |
| - instance.url(), instance.name(), instance.resource_context()); |
| - WorkerProcessHost::WorkerInstance::FilterInfo filter_info = |
| - instance.GetFilter(); |
| - // If this worker is already running, no need to create a new copy. Just |
| - // inform the caller that the worker has been created. |
| - if (existing_instance) { |
| - // Walk the worker's filter list to see if this client is listed. If not, |
| - // then it means that the worker started by the client already exited so |
| - // we should not attach to this new one (http://crbug.com/29243). |
| - if (!existing_instance->HasFilter(filter_info.first, filter_info.second)) |
| - return false; |
| - filter_info.first->Send(new ViewMsg_WorkerCreated(filter_info.second)); |
| - return true; |
| - } |
| - |
| - // Look to see if there's a pending instance. |
| - WorkerProcessHost::WorkerInstance* pending = FindPendingInstance( |
| - instance.url(), instance.name(), instance.resource_context()); |
| - // If there's no instance *and* no pending instance (or there is a pending |
| - // instance but it does not contain our filter info), then it means the |
| - // worker started up and exited already. Log a warning because this should |
| - // be a very rare occurrence and is probably a bug, but it *can* happen so |
| - // handle it gracefully. |
| - if (!pending || |
| - !pending->HasFilter(filter_info.first, filter_info.second)) { |
| - DLOG(WARNING) << "Pending worker already exited"; |
| + // See if a worker with this name already exists. |
| + WorkerProcessHost::WorkerInstance* existing_instance = |
| + FindSharedWorkerInstance( |
| + instance.url(), instance.name(), instance.resource_context()); |
| + WorkerProcessHost::WorkerInstance::FilterInfo filter_info = |
| + instance.GetFilter(); |
| + // If this worker is already running, no need to create a new copy. Just |
| + // inform the caller that the worker has been created. |
| + if (existing_instance) { |
| + // Walk the worker's filter list to see if this client is listed. If not, |
| + // then it means that the worker started by the client already exited so |
| + // we should not attach to this new one (http://crbug.com/29243). |
| + if (!existing_instance->HasFilter(filter_info.first, filter_info.second)) |
| return false; |
| - } |
| + filter_info.first->Send(new ViewMsg_WorkerCreated(filter_info.second)); |
| + return true; |
| + } |
| - // Assign the accumulated document set and filter list for this pending |
| - // worker to the new instance. |
| - DCHECK(!pending->worker_document_set()->IsEmpty()); |
| - instance.ShareDocumentSet(*pending); |
| - for (WorkerProcessHost::WorkerInstance::FilterList::const_iterator i = |
| - pending->filters().begin(); |
| - i != pending->filters().end(); ++i) { |
| - instance.AddFilter(i->first, i->second); |
| - } |
| - RemovePendingInstances( |
| - instance.url(), instance.name(), instance.resource_context()); |
| - |
| - // Remove any queued instances of this worker and copy over the filter to |
| - // this instance. |
| - for (WorkerProcessHost::Instances::iterator iter = queued_workers_.begin(); |
| - iter != queued_workers_.end();) { |
| - if (iter->Matches(instance.url(), instance.name(), |
| - instance.resource_context())) { |
| - DCHECK(iter->NumFilters() == 1); |
| - WorkerProcessHost::WorkerInstance::FilterInfo filter_info = |
| - iter->GetFilter(); |
| - instance.AddFilter(filter_info.first, filter_info.second); |
| - iter = queued_workers_.erase(iter); |
| - } else { |
| - ++iter; |
| - } |
| + // Look to see if there's a pending instance. |
| + WorkerProcessHost::WorkerInstance* pending = FindPendingInstance( |
| + instance.url(), instance.name(), instance.resource_context()); |
| + // If there's no instance *and* no pending instance (or there is a pending |
| + // instance but it does not contain our filter info), then it means the |
| + // worker started up and exited already. Log a warning because this should |
| + // be a very rare occurrence and is probably a bug, but it *can* happen so |
| + // handle it gracefully. |
| + if (!pending || |
| + !pending->HasFilter(filter_info.first, filter_info.second)) { |
| + DLOG(WARNING) << "Pending worker already exited"; |
| + return false; |
| + } |
| + |
| + // Assign the accumulated document set and filter list for this pending |
| + // worker to the new instance. |
| + DCHECK(!pending->worker_document_set()->IsEmpty()); |
| + instance.ShareDocumentSet(*pending); |
| + for (WorkerProcessHost::WorkerInstance::FilterList::const_iterator i = |
| + pending->filters().begin(); |
| + i != pending->filters().end(); ++i) { |
| + instance.AddFilter(i->first, i->second); |
| + } |
| + RemovePendingInstances( |
| + instance.url(), instance.name(), instance.resource_context()); |
| + |
| + // Remove any queued instances of this worker and copy over the filter to |
| + // this instance. |
| + for (WorkerProcessHost::Instances::iterator iter = queued_workers_.begin(); |
| + iter != queued_workers_.end();) { |
| + if (iter->Matches(instance.url(), instance.name(), |
| + instance.resource_context())) { |
| + DCHECK(iter->NumFilters() == 1); |
| + WorkerProcessHost::WorkerInstance::FilterInfo filter_info = |
| + iter->GetFilter(); |
| + instance.AddFilter(filter_info.first, filter_info.second); |
| + iter = queued_workers_.erase(iter); |
| + } else { |
| + ++iter; |
| } |
| } |