summaryrefslogtreecommitdiffstats
path: root/chrome/browser/worker_host/worker_process_host.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/worker_host/worker_process_host.cc')
-rw-r--r--chrome/browser/worker_host/worker_process_host.cc117
1 files changed, 51 insertions, 66 deletions
diff --git a/chrome/browser/worker_host/worker_process_host.cc b/chrome/browser/worker_host/worker_process_host.cc
index 562daea..4f6d5ae 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());
@@ -331,8 +337,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) {
@@ -375,28 +381,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) {
@@ -415,8 +430,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);
@@ -431,17 +446,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
@@ -469,48 +481,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)) {
@@ -553,6 +523,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);