| 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 dd30448d2a2ccc96f39d615fc3deafbd61e7f2c4..dd2e09c37353dfdd9c86e3e3e74cb40562814419 100644 | 
| --- a/content/browser/worker_host/worker_service.cc | 
| +++ b/content/browser/worker_host/worker_service.cc | 
| @@ -7,6 +7,7 @@ | 
| #include <string> | 
|  | 
| #include "base/command_line.h" | 
| +#include "base/logging.h" | 
| #include "base/sys_info.h" | 
| #include "base/threading/thread.h" | 
| #include "chrome/common/chrome_switches.h" | 
| @@ -21,6 +22,7 @@ const int WorkerService::kMaxWorkersWhenSeparate = 64; | 
| const int WorkerService::kMaxWorkersPerTabWhenSeparate = 16; | 
|  | 
| WorkerService* WorkerService::GetInstance() { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| return Singleton<WorkerService>::get(); | 
| } | 
|  | 
| @@ -28,9 +30,12 @@ WorkerService::WorkerService() : next_worker_route_id_(0) { | 
| } | 
|  | 
| WorkerService::~WorkerService() { | 
| +  // Since we're a Singleton, we are deleted on the UI thread instead. | 
| +  DetachFromThread(); | 
| } | 
|  | 
| void WorkerService::OnWorkerMessageFilterClosing(WorkerMessageFilter* filter) { | 
| +  DCHECK(CalledOnValidThread()); | 
| for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS); | 
| !iter.Done(); ++iter) { | 
| WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter); | 
| @@ -71,10 +76,12 @@ void WorkerService::CreateWorker( | 
| const ViewHostMsg_CreateWorker_Params& params, | 
| int route_id, | 
| WorkerMessageFilter* filter, | 
| -    net::URLRequestContextGetter* request_context) { | 
| - | 
| +    net::URLRequestContextGetter* request_context_getter, | 
| +    const content::ResourceContext& resource_context) { | 
| +  DCHECK(CalledOnValidThread()); | 
| +  // TODO(willchan): Eliminate the need for this downcast. | 
| ChromeURLRequestContext* context = static_cast<ChromeURLRequestContext*>( | 
| -      request_context->GetURLRequestContext()); | 
| +      request_context_getter->GetURLRequestContext()); | 
|  | 
| // Generate a unique route id for the browser-worker communication that's | 
| // unique among all worker processes.  That way when the worker process sends | 
| @@ -89,7 +96,8 @@ void WorkerService::CreateWorker( | 
| 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, | 
| -      request_context); | 
| +      request_context_getter, | 
| +      resource_context); | 
| instance.AddFilter(filter, route_id); | 
| instance.worker_document_set()->Add( | 
| filter, params.document_id, filter->render_process_id(), | 
| @@ -105,7 +113,7 @@ void WorkerService::LookupSharedWorker( | 
| bool incognito, | 
| bool* exists, | 
| bool* url_mismatch) { | 
| - | 
| +  DCHECK(CalledOnValidThread()); | 
| *exists = true; | 
| WorkerProcessHost::WorkerInstance* instance = FindSharedWorkerInstance( | 
| params.url, params.name, incognito); | 
| @@ -144,6 +152,7 @@ void WorkerService::LookupSharedWorker( | 
| void WorkerService::CancelCreateDedicatedWorker( | 
| int route_id, | 
| WorkerMessageFilter* filter) { | 
| +  DCHECK(CalledOnValidThread()); | 
| for (WorkerProcessHost::Instances::iterator i = queued_workers_.begin(); | 
| i != queued_workers_.end(); ++i) { | 
| if (i->HasFilter(filter, route_id)) { | 
| @@ -177,6 +186,7 @@ void WorkerService::CancelCreateDedicatedWorker( | 
|  | 
| void WorkerService::ForwardToWorker(const IPC::Message& message, | 
| WorkerMessageFilter* filter) { | 
| +  DCHECK(CalledOnValidThread()); | 
| for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS); | 
| !iter.Done(); ++iter) { | 
| WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter); | 
| @@ -189,6 +199,7 @@ void WorkerService::ForwardToWorker(const IPC::Message& message, | 
|  | 
| void WorkerService::DocumentDetached(unsigned long long document_id, | 
| WorkerMessageFilter* filter) { | 
| +  DCHECK(CalledOnValidThread()); | 
| // Any associated shared workers can be shut down. | 
| for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS); | 
| !iter.Done(); ++iter) { | 
| @@ -224,6 +235,7 @@ void WorkerService::DocumentDetached(unsigned long long document_id, | 
|  | 
| bool WorkerService::CreateWorkerFromInstance( | 
| WorkerProcessHost::WorkerInstance instance) { | 
| +  DCHECK(CalledOnValidThread()); | 
| // TODO(michaeln): We need to ensure that a process is working | 
| // on behalf of a single profile. The process sharing logic below | 
| // does not ensure that. Consider making WorkerService a per profile | 
| @@ -309,8 +321,9 @@ bool WorkerService::CreateWorkerFromInstance( | 
| if (!worker) { | 
| WorkerMessageFilter* first_filter = instance.filters().begin()->first; | 
| worker = new WorkerProcessHost( | 
| -        first_filter->resource_dispatcher_host(), | 
| -        instance.request_context()); | 
| +        instance.request_context_getter(), | 
| +        instance.resource_context(), | 
| +        first_filter->resource_dispatcher_host()); | 
| // TODO(atwilson): This won't work if the message is from a worker process. | 
| // We don't support that yet though (this message is only sent from | 
| // renderers) but when we do, we'll need to add code to pass in the current | 
| @@ -330,6 +343,7 @@ bool WorkerService::CreateWorkerFromInstance( | 
| } | 
|  | 
| WorkerProcessHost* WorkerService::GetProcessForDomain(const GURL& url) { | 
| +  DCHECK(CalledOnValidThread()); | 
| int num_processes = 0; | 
| std::string domain = | 
| net::RegistryControlledDomainService::GetDomainAndRegistry(url); | 
| @@ -354,6 +368,7 @@ WorkerProcessHost* WorkerService::GetProcessForDomain(const GURL& url) { | 
| } | 
|  | 
| WorkerProcessHost* WorkerService::GetProcessToFillUpCores() { | 
| +  DCHECK(CalledOnValidThread()); | 
| int num_processes = 0; | 
| BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS); | 
| for (; !iter.Done(); ++iter) | 
| @@ -366,6 +381,7 @@ WorkerProcessHost* WorkerService::GetProcessToFillUpCores() { | 
| } | 
|  | 
| WorkerProcessHost* WorkerService::GetLeastLoadedWorker() { | 
| +  DCHECK(CalledOnValidThread()); | 
| WorkerProcessHost* smallest = NULL; | 
| for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS); | 
| !iter.Done(); ++iter) { | 
| @@ -379,6 +395,7 @@ WorkerProcessHost* WorkerService::GetLeastLoadedWorker() { | 
|  | 
| bool WorkerService::CanCreateWorkerProcess( | 
| const WorkerProcessHost::WorkerInstance& instance) { | 
| +  DCHECK(CalledOnValidThread()); | 
| // Worker can be fired off if *any* parent has room. | 
| const WorkerDocumentSet::DocumentInfoSet& parents = | 
| instance.worker_document_set()->documents(); | 
| @@ -405,6 +422,7 @@ bool WorkerService::CanCreateWorkerProcess( | 
| bool WorkerService::TabCanCreateWorkerProcess(int render_process_id, | 
| int render_view_id, | 
| bool* hit_total_worker_limit) { | 
| +  DCHECK(CalledOnValidThread()); | 
| int total_workers = 0; | 
| int workers_per_tab = 0; | 
| *hit_total_worker_limit = false; | 
| @@ -431,6 +449,7 @@ bool WorkerService::TabCanCreateWorkerProcess(int render_process_id, | 
| } | 
|  | 
| void WorkerService::TryStartingQueuedWorker() { | 
| +  DCHECK(CalledOnValidThread()); | 
| if (queued_workers_.empty()) | 
| return; | 
|  | 
| @@ -456,6 +475,7 @@ void WorkerService::TryStartingQueuedWorker() { | 
| bool WorkerService::GetRendererForWorker(int worker_process_id, | 
| int* render_process_id, | 
| int* render_view_id) const { | 
| +  DCHECK(CalledOnValidThread()); | 
| for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS); | 
| !iter.Done(); ++iter) { | 
| if (iter->id() != worker_process_id) | 
| @@ -479,6 +499,7 @@ bool WorkerService::GetRendererForWorker(int worker_process_id, | 
|  | 
| const WorkerProcessHost::WorkerInstance* WorkerService::FindWorkerInstance( | 
| int worker_process_id) { | 
| +  DCHECK(CalledOnValidThread()); | 
| for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS); | 
| !iter.Done(); ++iter) { | 
| if (iter->id() != worker_process_id) | 
| @@ -495,6 +516,7 @@ const WorkerProcessHost::WorkerInstance* WorkerService::FindWorkerInstance( | 
| WorkerProcessHost::WorkerInstance* | 
| WorkerService::FindSharedWorkerInstance(const GURL& url, const string16& name, | 
| bool incognito) { | 
| +  DCHECK(CalledOnValidThread()); | 
| for (BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS); | 
| !iter.Done(); ++iter) { | 
| WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter); | 
| @@ -512,6 +534,7 @@ WorkerService::FindSharedWorkerInstance(const GURL& url, const string16& name, | 
| WorkerProcessHost::WorkerInstance* | 
| WorkerService::FindPendingInstance(const GURL& url, const string16& name, | 
| bool incognito) { | 
| +  DCHECK(CalledOnValidThread()); | 
| // Walk the pending instances looking for a matching pending worker. | 
| for (WorkerProcessHost::Instances::iterator iter = | 
| pending_shared_workers_.begin(); | 
| @@ -528,6 +551,7 @@ WorkerService::FindPendingInstance(const GURL& url, const string16& name, | 
| void WorkerService::RemovePendingInstances(const GURL& url, | 
| const string16& name, | 
| bool incognito) { | 
| +  DCHECK(CalledOnValidThread()); | 
| // Walk the pending instances looking for a matching pending worker. | 
| for (WorkerProcessHost::Instances::iterator iter = | 
| pending_shared_workers_.begin(); | 
| @@ -544,6 +568,7 @@ WorkerProcessHost::WorkerInstance* | 
| WorkerService::CreatePendingInstance(const GURL& url, | 
| const string16& name, | 
| bool incognito) { | 
| +  DCHECK(CalledOnValidThread()); | 
| // Look for an existing pending shared worker. | 
| WorkerProcessHost::WorkerInstance* instance = | 
| FindPendingInstance(url, name, incognito); | 
| @@ -551,8 +576,7 @@ WorkerService::CreatePendingInstance(const GURL& url, | 
| return instance; | 
|  | 
| // No existing pending worker - create a new one. | 
| -  WorkerProcessHost::WorkerInstance pending( | 
| -      url, true, incognito, name, MSG_ROUTING_NONE, 0, 0, 0, NULL); | 
| +  WorkerProcessHost::WorkerInstance pending(url, true, incognito, name); | 
| pending_shared_workers_.push_back(pending); | 
| return &pending_shared_workers_.back(); | 
| } | 
|  |