Index: chrome/browser/worker_host/worker_process_host.cc |
diff --git a/chrome/browser/worker_host/worker_process_host.cc b/chrome/browser/worker_host/worker_process_host.cc |
index 3373e2f77b7728205493964c55ac04125696c641..59f81497d75b27155b87857e6ce76ee226f6b117 100644 |
--- a/chrome/browser/worker_host/worker_process_host.cc |
+++ b/chrome/browser/worker_host/worker_process_host.cc |
@@ -65,11 +65,17 @@ WorkerProcessHost::~WorkerProcessHost() { |
Source<WorkerProcessHost>(this), |
NotificationService::NoDetails()); |
- // If we crashed, tell the RenderViewHost. |
+ // If we crashed, tell the RenderViewHosts. |
for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) { |
- ChromeThread::PostTask( |
- ChromeThread::UI, FROM_HERE, |
- new WorkerCrashTask(i->renderer_id(), i->render_view_route_id())); |
+ const WorkerDocumentSet::DocumentInfoSet& parents = |
+ i->worker_document_set()->documents(); |
+ for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter = |
+ parents.begin(); parent_iter != parents.end(); ++parent_iter) { |
+ ChromeThread::PostTask( |
+ ChromeThread::UI, FROM_HERE, |
+ new WorkerCrashTask(parent_iter->renderer_id(), |
+ parent_iter->render_view_route_id())); |
+ } |
} |
ChildProcessSecurityPolicy::GetInstance()->Remove(id()); |
@@ -330,8 +336,8 @@ void WorkerProcessHost::SenderShutdown(IPC::Message::Sender* sender) { |
bool shutdown = false; |
i->RemoveSenders(sender); |
if (i->shared()) { |
- i->RemoveAllAssociatedDocuments(sender); |
- if (i->IsDocumentSetEmpty()) { |
+ i->worker_document_set()->RemoveAll(sender); |
+ if (i->worker_document_set()->IsEmpty()) { |
shutdown = true; |
} |
} else if (i->NumSenders() == 0) { |
@@ -374,28 +380,37 @@ void WorkerProcessHost::UpdateTitle() { |
void WorkerProcessHost::OnLookupSharedWorker(const GURL& url, |
const string16& name, |
unsigned long long document_id, |
+ int render_view_route_id, |
int* route_id, |
bool* url_mismatch) { |
int new_route_id = WorkerService::GetInstance()->next_worker_route_id(); |
- // TODO(atwilson): Add code to merge document sets for nested shared workers. |
+ // TODO(atwilson): Add code to pass in the current worker's document set for |
+ // these nested workers. Code below will not work for SharedWorkers as it |
+ // only looks at a single parent. |
+ DCHECK(instances_.front().worker_document_set()->documents().size() == 1); |
+ WorkerDocumentSet::DocumentInfoSet::const_iterator first_parent = |
+ instances_.front().worker_document_set()->documents().begin(); |
bool worker_found = WorkerService::GetInstance()->LookupSharedWorker( |
- url, name, instances_.front().off_the_record(), document_id, this, |
+ url, name, instances_.front().off_the_record(), document_id, |
+ first_parent->renderer_id(), first_parent->render_view_route_id(), this, |
new_route_id, url_mismatch); |
*route_id = worker_found ? new_route_id : MSG_ROUTING_NONE; |
} |
-void WorkerProcessHost::OnCreateWorker(const GURL& url, |
- bool shared, |
- const string16& name, |
- int render_view_route_id, |
- int* route_id) { |
+void WorkerProcessHost::OnCreateWorker( |
+ const ViewHostMsg_CreateWorker_Params& params, int* route_id) { |
DCHECK(instances_.size() == 1); // Only called when one process per worker. |
+ // TODO(atwilson): Add code to pass in the current worker's document set for |
+ // these nested workers. Code below will not work for SharedWorkers as it |
+ // only looks at a single parent. |
+ DCHECK(instances_.front().worker_document_set()->documents().size() == 1); |
+ WorkerDocumentSet::DocumentInfoSet::const_iterator first_parent = |
+ instances_.front().worker_document_set()->documents().begin(); |
*route_id = WorkerService::GetInstance()->next_worker_route_id(); |
WorkerService::GetInstance()->CreateWorker( |
- url, shared, instances_.front().off_the_record(), name, |
- instances_.front().renderer_id(), |
- instances_.front().render_view_route_id(), this, *route_id); |
- // TODO(atwilson): Add code to merge document sets for nested shared workers. |
+ params.url, params.is_shared, instances_.front().off_the_record(), |
+ params.name, params.document_id, first_parent->renderer_id(), |
+ first_parent->render_view_route_id(), this, *route_id); |
} |
void WorkerProcessHost::OnCancelCreateDedicatedWorker(int route_id) { |
@@ -414,8 +429,8 @@ void WorkerProcessHost::DocumentDetached(IPC::Message::Sender* parent, |
if (!i->shared()) { |
++i; |
} else { |
- i->RemoveFromDocumentSet(parent, document_id); |
- if (i->IsDocumentSetEmpty()) { |
+ i->worker_document_set()->Remove(parent, document_id); |
+ if (i->worker_document_set()->IsEmpty()) { |
// This worker has no more associated documents - shut it down. |
Send(new WorkerMsg_TerminateWorkerContext(i->worker_route_id())); |
i = instances_.erase(i); |
@@ -430,17 +445,14 @@ WorkerProcessHost::WorkerInstance::WorkerInstance(const GURL& url, |
bool shared, |
bool off_the_record, |
const string16& name, |
- int renderer_id, |
- int render_view_route_id, |
int worker_route_id) |
: url_(url), |
shared_(shared), |
off_the_record_(off_the_record), |
closed_(false), |
name_(name), |
- renderer_id_(renderer_id), |
- render_view_route_id_(render_view_route_id), |
- worker_route_id_(worker_route_id) { |
+ worker_route_id_(worker_route_id), |
+ worker_document_set_(new WorkerDocumentSet()) { |
} |
// Compares an instance based on the algorithm in the WebWorkers spec - an |
@@ -468,48 +480,6 @@ bool WorkerProcessHost::WorkerInstance::Matches( |
return name_ == match_name; |
} |
-void WorkerProcessHost::WorkerInstance::AddToDocumentSet( |
- IPC::Message::Sender* parent, unsigned long long document_id) { |
- if (!IsInDocumentSet(parent, document_id)) { |
- DocumentInfo info(parent, document_id); |
- document_set_.push_back(info); |
- } |
-} |
- |
-bool WorkerProcessHost::WorkerInstance::IsInDocumentSet( |
- IPC::Message::Sender* parent, unsigned long long document_id) const { |
- for (DocumentSet::const_iterator i = document_set_.begin(); |
- i != document_set_.end(); ++i) { |
- if (i->first == parent && i->second == document_id) |
- return true; |
- } |
- return false; |
-} |
- |
-void WorkerProcessHost::WorkerInstance::RemoveFromDocumentSet( |
- IPC::Message::Sender* parent, unsigned long long document_id) { |
- for (DocumentSet::iterator i = document_set_.begin(); |
- i != document_set_.end(); i++) { |
- if (i->first == parent && i->second == document_id) { |
- document_set_.erase(i); |
- break; |
- } |
- } |
- // Should not be duplicate copies in the document set. |
- DCHECK(!IsInDocumentSet(parent, document_id)); |
-} |
- |
-void WorkerProcessHost::WorkerInstance::RemoveAllAssociatedDocuments( |
- IPC::Message::Sender* parent) { |
- for (DocumentSet::iterator i = document_set_.begin(); |
- i != document_set_.end();) { |
- if (i->first == parent) |
- i = document_set_.erase(i); |
- else |
- ++i; |
- } |
-} |
- |
void WorkerProcessHost::WorkerInstance::AddSender(IPC::Message::Sender* sender, |
int sender_route_id) { |
if (!HasSender(sender, sender_route_id)) { |
@@ -552,6 +522,21 @@ bool WorkerProcessHost::WorkerInstance::HasSender( |
return false; |
} |
+bool WorkerProcessHost::WorkerInstance::RendererIsParent( |
+ int renderer_id, int render_view_route_id) const { |
+ const WorkerDocumentSet::DocumentInfoSet& parents = |
+ worker_document_set()->documents(); |
+ for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter = |
+ parents.begin(); |
+ parent_iter != parents.end(); ++parent_iter) { |
+ if (parent_iter->renderer_id() == renderer_id && |
+ parent_iter->render_view_route_id() == render_view_route_id) { |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+ |
WorkerProcessHost::WorkerInstance::SenderInfo |
WorkerProcessHost::WorkerInstance::GetSender() const { |
DCHECK(NumSenders() == 1); |