| 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 1f81ca30ee834b6b56bcef27b0a4ad03597a81a4..0d0e0c651cdf22c43c0a9318fa0ea1eed80e9dbc 100644
 | 
| --- a/content/browser/shared_worker/shared_worker_service_impl.cc
 | 
| +++ b/content/browser/shared_worker/shared_worker_service_impl.cc
 | 
| @@ -9,6 +9,7 @@
 | 
|  #include <set>
 | 
|  #include <vector>
 | 
|  
 | 
| +#include "content/browser/devtools/shared_worker_devtools_manager.h"
 | 
|  #include "content/browser/renderer_host/render_process_host_impl.h"
 | 
|  #include "content/browser/shared_worker/shared_worker_host.h"
 | 
|  #include "content/browser/shared_worker/shared_worker_instance.h"
 | 
| @@ -61,6 +62,29 @@ void UpdateWorkerDependency(const std::vector<int>& added_ids,
 | 
|        base::Bind(&UpdateWorkerDependencyOnUI, added_ids, removed_ids));
 | 
|  }
 | 
|  
 | 
| +void WorkerCreatedResultCallbackOnIO(int worker_process_id,
 | 
| +                                     int worker_route_id,
 | 
| +                                     bool pause_on_start) {
 | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
 | 
| +  SharedWorkerServiceImpl::GetInstance()->WorkerCreatedResultCallback(
 | 
| +      worker_process_id, worker_route_id, pause_on_start);
 | 
| +}
 | 
| +
 | 
| +void NotifyWorkerCreatedOnUI(int worker_process_id,
 | 
| +                             int worker_route_id,
 | 
| +                             const SharedWorkerInstance& instance) {
 | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 | 
| +  bool pause_on_start =
 | 
| +      SharedWorkerDevToolsManager::GetInstance()->WorkerCreated(
 | 
| +          worker_process_id, worker_route_id, instance);
 | 
| +  BrowserThread::PostTask(BrowserThread::IO,
 | 
| +                          FROM_HERE,
 | 
| +                          base::Bind(&WorkerCreatedResultCallbackOnIO,
 | 
| +                                     worker_process_id,
 | 
| +                                     worker_route_id,
 | 
| +                                     pause_on_start));
 | 
| +}
 | 
| +
 | 
|  }  // namespace
 | 
|  
 | 
|  SharedWorkerServiceImpl* SharedWorkerServiceImpl::GetInstance() {
 | 
| @@ -130,7 +154,7 @@ void SharedWorkerServiceImpl::CreateWorker(
 | 
|    ScopedWorkerDependencyChecker checker(this);
 | 
|    *url_mismatch = false;
 | 
|    SharedWorkerHost* existing_host = FindSharedWorkerHost(
 | 
| -      params.url, params.name, partition, resource_context);
 | 
| +      worker_hosts_, params.url, params.name, partition, resource_context);
 | 
|    if (existing_host) {
 | 
|      if (params.url != existing_host->instance()->url()) {
 | 
|        *url_mismatch = true;
 | 
| @@ -148,6 +172,23 @@ void SharedWorkerServiceImpl::CreateWorker(
 | 
|      filter->Send(new ViewMsg_WorkerCreated(route_id));
 | 
|      return;
 | 
|    }
 | 
| +  SharedWorkerHost* pending_host = FindSharedWorkerHost(pending_worker_hosts_,
 | 
| +                                                        params.url,
 | 
| +                                                        params.name,
 | 
| +                                                        partition,
 | 
| +                                                        resource_context);
 | 
| +  if (pending_host) {
 | 
| +    if (params.url != pending_host->instance()->url()) {
 | 
| +      *url_mismatch = true;
 | 
| +      return;
 | 
| +    }
 | 
| +    pending_host->AddFilter(filter, route_id);
 | 
| +    pending_host->worker_document_set()->Add(filter,
 | 
| +                                             params.document_id,
 | 
| +                                             filter->render_process_id(),
 | 
| +                                             params.render_frame_route_id);
 | 
| +    return;
 | 
| +  }
 | 
|  
 | 
|    scoped_ptr<SharedWorkerInstance> instance(new SharedWorkerInstance(
 | 
|        params.url,
 | 
| @@ -156,25 +197,42 @@ void SharedWorkerServiceImpl::CreateWorker(
 | 
|        params.security_policy_type,
 | 
|        resource_context,
 | 
|        partition));
 | 
| -  scoped_ptr<SharedWorkerHost> host(new SharedWorkerHost(instance.release()));
 | 
| +  scoped_ptr<SharedWorkerHost> host(
 | 
| +      new SharedWorkerHost(instance.release(), filter));
 | 
|    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(),
 | 
| -                                   worker_route_id),
 | 
| -                    host.Pass());
 | 
| +  // We need to call SharedWorkerDevToolsManager::WorkerCreated() on UI thread
 | 
| +  // to know whether the worker should be paused on start or not.
 | 
| +  // WorkerCreatedResultCallback() will be called with the result.
 | 
| +  BrowserThread::PostTask(BrowserThread::UI,
 | 
| +                          FROM_HERE,
 | 
| +                          base::Bind(&NotifyWorkerCreatedOnUI,
 | 
| +                                     filter->render_process_id(),
 | 
| +                                     worker_route_id,
 | 
| +                                     *host->instance()));
 | 
| +  pending_worker_hosts_.set(
 | 
| +      std::make_pair(filter->render_process_id(), worker_route_id),
 | 
| +      host.Pass());
 | 
| +}
 | 
|  
 | 
| +void SharedWorkerServiceImpl::WorkerCreatedResultCallback(int worker_process_id,
 | 
| +                                                          int worker_route_id,
 | 
| +                                                          bool pause_on_start) {
 | 
| +  scoped_ptr<SharedWorkerHost> host = pending_worker_hosts_.take_and_erase(
 | 
| +      std::make_pair(worker_process_id, worker_route_id));
 | 
| +  const GURL url = host->instance()->url();
 | 
| +  const base::string16 name = host->instance()->name();
 | 
| +  host->Start(pause_on_start);
 | 
| +  worker_hosts_.set(std::make_pair(worker_process_id, worker_route_id),
 | 
| +                    host.Pass());
 | 
|    FOR_EACH_OBSERVER(
 | 
| -      WorkerServiceObserver, observers_,
 | 
| -      WorkerCreated(params.url,
 | 
| -                    params.name,
 | 
| -                    filter->render_process_id(),
 | 
| -                    worker_route_id));
 | 
| +      WorkerServiceObserver,
 | 
| +      observers_,
 | 
| +      WorkerCreated(url, name, worker_process_id, worker_route_id));
 | 
|  }
 | 
|  
 | 
|  void SharedWorkerServiceImpl::ForwardToWorker(
 | 
| @@ -288,8 +346,17 @@ void SharedWorkerServiceImpl::OnSharedWorkerMessageFilterClosing(
 | 
|      if (iter->first.first == filter->render_process_id())
 | 
|        remove_list.push_back(iter->first);
 | 
|    }
 | 
| -  for (size_t i = 0; i < remove_list.size(); ++i)
 | 
| -    worker_hosts_.erase(remove_list[i]);
 | 
| +  for (size_t i = 0; i < remove_list.size(); ++i) {
 | 
| +    scoped_ptr<SharedWorkerHost> host =
 | 
| +        worker_hosts_.take_and_erase(remove_list[i]);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +void SharedWorkerServiceImpl::NotifyWorkerDestroyed(int worker_process_id,
 | 
| +                                                    int worker_route_id) {
 | 
| +  FOR_EACH_OBSERVER(WorkerServiceObserver,
 | 
| +                    observers_,
 | 
| +                    WorkerDestroyed(worker_process_id, worker_route_id));
 | 
|  }
 | 
|  
 | 
|  SharedWorkerHost* SharedWorkerServiceImpl::FindSharedWorkerHost(
 | 
| @@ -299,13 +366,14 @@ SharedWorkerHost* SharedWorkerServiceImpl::FindSharedWorkerHost(
 | 
|                                            worker_route_id));
 | 
|  }
 | 
|  
 | 
| +// static
 | 
|  SharedWorkerHost* SharedWorkerServiceImpl::FindSharedWorkerHost(
 | 
| +    const WorkerHostMap& hosts,
 | 
|      const GURL& url,
 | 
|      const base::string16& name,
 | 
|      const WorkerStoragePartition& partition,
 | 
|      ResourceContext* resource_context) {
 | 
| -  for (WorkerHostMap::const_iterator iter = worker_hosts_.begin();
 | 
| -       iter != worker_hosts_.end();
 | 
| +  for (WorkerHostMap::const_iterator iter = hosts.begin(); iter != hosts.end();
 | 
|         ++iter) {
 | 
|      SharedWorkerInstance* instance = iter->second->instance();
 | 
|      if (instance && !iter->second->closed() &&
 | 
| 
 |