| Index: content/browser/worker_host/worker_service_impl.cc
|
| diff --git a/content/browser/worker_host/worker_service_impl.cc b/content/browser/worker_host/worker_service_impl.cc
|
| index d03364998a862410d78629b5b37ebc1d69c9616d..13f3021bc5c3802583e7800d8be20c802ef678ab 100644
|
| --- a/content/browser/worker_host/worker_service_impl.cc
|
| +++ b/content/browser/worker_host/worker_service_impl.cc
|
| @@ -96,7 +96,9 @@ void WorkerServiceImpl::CreateWorker(
|
| const ViewHostMsg_CreateWorker_Params& params,
|
| int route_id,
|
| WorkerMessageFilter* filter,
|
| - ResourceContext* resource_context) {
|
| + ResourceContext* resource_context,
|
| + const WorkerStoragePartition& partition) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| // Generate a unique route id for the browser-worker communication that's
|
| // unique among all worker processes. That way when the worker process sends
|
| // a wrapped IPC message through us, we know which WorkerProcessHost to give
|
| @@ -107,7 +109,8 @@ void WorkerServiceImpl::CreateWorker(
|
| next_worker_route_id(),
|
| 0,
|
| params.script_resource_appcache_id,
|
| - resource_context);
|
| + resource_context,
|
| + partition);
|
| instance.AddFilter(filter, route_id);
|
| instance.worker_document_set()->Add(
|
| filter, params.document_id, filter->render_process_id(),
|
| @@ -121,11 +124,12 @@ void WorkerServiceImpl::LookupSharedWorker(
|
| int route_id,
|
| WorkerMessageFilter* filter,
|
| ResourceContext* resource_context,
|
| + const WorkerStoragePartition& partition,
|
| bool* exists,
|
| bool* url_mismatch) {
|
| *exists = true;
|
| WorkerProcessHost::WorkerInstance* instance = FindSharedWorkerInstance(
|
| - params.url, params.name, resource_context);
|
| + params.url, params.name, partition, resource_context);
|
|
|
| if (!instance) {
|
| // If no worker instance currently exists, we need to create a pending
|
| @@ -133,7 +137,8 @@ void WorkerServiceImpl::LookupSharedWorker(
|
| // mismatched URL get the appropriate url_mismatch error at lookup time.
|
| // Having named shared workers was a Really Bad Idea due to details like
|
| // this.
|
| - instance = CreatePendingInstance(params.url, params.name, resource_context);
|
| + instance = CreatePendingInstance(params.url, params.name,
|
| + resource_context, partition);
|
| *exists = false;
|
| }
|
|
|
| @@ -231,7 +236,8 @@ bool WorkerServiceImpl::CreateWorkerFromInstance(
|
| // See if a worker with this name already exists.
|
| WorkerProcessHost::WorkerInstance* existing_instance =
|
| FindSharedWorkerInstance(
|
| - instance.url(), instance.name(), instance.resource_context());
|
| + instance.url(), instance.name(), instance.partition(),
|
| + instance.resource_context());
|
| WorkerProcessHost::WorkerInstance::FilterInfo filter_info =
|
| instance.GetFilter();
|
| // If this worker is already running, no need to create a new copy. Just
|
| @@ -248,7 +254,8 @@ bool WorkerServiceImpl::CreateWorkerFromInstance(
|
|
|
| // Look to see if there's a pending instance.
|
| WorkerProcessHost::WorkerInstance* pending = FindPendingInstance(
|
| - instance.url(), instance.name(), instance.resource_context());
|
| + instance.url(), instance.name(), instance.partition(),
|
| + 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
|
| @@ -269,15 +276,15 @@ bool WorkerServiceImpl::CreateWorkerFromInstance(
|
| i != pending->filters().end(); ++i) {
|
| instance.AddFilter(i->first, i->second);
|
| }
|
| - RemovePendingInstances(
|
| - instance.url(), instance.name(), instance.resource_context());
|
| + RemovePendingInstances(instance.url(), instance.name(),
|
| + instance.partition(), 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())) {
|
| + instance.partition(), instance.resource_context())) {
|
| DCHECK(iter->NumFilters() == 1);
|
| WorkerProcessHost::WorkerInstance::FilterInfo filter_info =
|
| iter->GetFilter();
|
| @@ -290,7 +297,8 @@ bool WorkerServiceImpl::CreateWorkerFromInstance(
|
|
|
| if (!worker) {
|
| WorkerMessageFilter* first_filter = instance.filters().begin()->first;
|
| - worker = new WorkerProcessHost(instance.resource_context());
|
| + worker = new WorkerProcessHost(instance.resource_context(),
|
| + instance.partition());
|
| // 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
|
| @@ -517,13 +525,14 @@ void WorkerServiceImpl::NotifyWorkerDestroyed(
|
| WorkerProcessHost::WorkerInstance* WorkerServiceImpl::FindSharedWorkerInstance(
|
| const GURL& url,
|
| const string16& name,
|
| + const WorkerStoragePartition& partition,
|
| ResourceContext* resource_context) {
|
| for (WorkerProcessHostIterator iter; !iter.Done(); ++iter) {
|
| for (WorkerProcessHost::Instances::iterator instance_iter =
|
| iter->mutable_instances().begin();
|
| instance_iter != iter->mutable_instances().end();
|
| ++instance_iter) {
|
| - if (instance_iter->Matches(url, name, resource_context))
|
| + if (instance_iter->Matches(url, name, partition, resource_context))
|
| return &(*instance_iter);
|
| }
|
| }
|
| @@ -533,15 +542,15 @@ WorkerProcessHost::WorkerInstance* WorkerServiceImpl::FindSharedWorkerInstance(
|
| WorkerProcessHost::WorkerInstance* WorkerServiceImpl::FindPendingInstance(
|
| const GURL& url,
|
| const string16& name,
|
| + const WorkerStoragePartition& partition,
|
| ResourceContext* resource_context) {
|
| // Walk the pending instances looking for a matching pending worker.
|
| for (WorkerProcessHost::Instances::iterator iter =
|
| pending_shared_workers_.begin();
|
| iter != pending_shared_workers_.end();
|
| ++iter) {
|
| - if (iter->Matches(url, name, resource_context)) {
|
| + if (iter->Matches(url, name, partition, resource_context))
|
| return &(*iter);
|
| - }
|
| }
|
| return NULL;
|
| }
|
| @@ -550,12 +559,13 @@ WorkerProcessHost::WorkerInstance* WorkerServiceImpl::FindPendingInstance(
|
| void WorkerServiceImpl::RemovePendingInstances(
|
| const GURL& url,
|
| const string16& name,
|
| + const WorkerStoragePartition& partition,
|
| ResourceContext* resource_context) {
|
| // Walk the pending instances looking for a matching pending worker.
|
| for (WorkerProcessHost::Instances::iterator iter =
|
| pending_shared_workers_.begin();
|
| iter != pending_shared_workers_.end(); ) {
|
| - if (iter->Matches(url, name, resource_context)) {
|
| + if (iter->Matches(url, name, partition, resource_context)) {
|
| iter = pending_shared_workers_.erase(iter);
|
| } else {
|
| ++iter;
|
| @@ -566,15 +576,17 @@ void WorkerServiceImpl::RemovePendingInstances(
|
| WorkerProcessHost::WorkerInstance* WorkerServiceImpl::CreatePendingInstance(
|
| const GURL& url,
|
| const string16& name,
|
| - ResourceContext* resource_context) {
|
| + ResourceContext* resource_context,
|
| + const WorkerStoragePartition& partition) {
|
| // Look for an existing pending shared worker.
|
| WorkerProcessHost::WorkerInstance* instance =
|
| - FindPendingInstance(url, name, resource_context);
|
| + FindPendingInstance(url, name, partition, resource_context);
|
| if (instance)
|
| return instance;
|
|
|
| // No existing pending worker - create a new one.
|
| - WorkerProcessHost::WorkerInstance pending(url, true, name, resource_context);
|
| + WorkerProcessHost::WorkerInstance pending(
|
| + url, true, name, resource_context, partition);
|
| pending_shared_workers_.push_back(pending);
|
| return &pending_shared_workers_.back();
|
| }
|
|
|