Index: content/browser/shared_worker/shared_worker_host.cc |
diff --git a/content/browser/shared_worker/shared_worker_host.cc b/content/browser/shared_worker/shared_worker_host.cc |
index 60189139b9463b758783c5be3b5aa86f6e5afbd9..78ffb4b5cb32015291ff42d37120ba44140de1c5 100644 |
--- a/content/browser/shared_worker/shared_worker_host.cc |
+++ b/content/browser/shared_worker/shared_worker_host.cc |
@@ -10,6 +10,7 @@ |
#include "content/browser/message_port_service.h" |
#include "content/browser/shared_worker/shared_worker_instance.h" |
#include "content/browser/shared_worker/shared_worker_message_filter.h" |
+#include "content/browser/worker_host/worker_document_set.h" |
#include "content/common/view_messages.h" |
#include "content/common/worker_messages.h" |
#include "content/public/browser/browser_thread.h" |
@@ -31,8 +32,11 @@ void WorkerCrashCallback(int render_process_unique_id, int render_frame_id) { |
SharedWorkerHost::SharedWorkerHost(SharedWorkerInstance* instance) |
: instance_(instance), |
+ worker_document_set_(new WorkerDocumentSet()), |
container_render_filter_(NULL), |
worker_route_id_(MSG_ROUTING_NONE), |
+ load_failed_(false), |
+ closed_(false), |
creation_time_(base::TimeTicks::Now()) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
} |
@@ -42,9 +46,9 @@ SharedWorkerHost::~SharedWorkerHost() { |
UMA_HISTOGRAM_LONG_TIMES("SharedWorker.TimeToDeleted", |
base::TimeTicks::Now() - creation_time_); |
// If we crashed, tell the RenderViewHosts. |
- if (instance_ && !instance_->load_failed()) { |
+ if (instance_ && !load_failed_) { |
const WorkerDocumentSet::DocumentInfoSet& parents = |
- instance_->worker_document_set()->documents(); |
+ worker_document_set_->documents(); |
for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter = |
parents.begin(); |
parent_iter != parents.end(); |
@@ -80,9 +84,8 @@ void SharedWorkerHost::Init(SharedWorkerMessageFilter* filter) { |
params.route_id = worker_route_id_; |
Send(new WorkerProcessMsg_CreateWorker(params)); |
- for (SharedWorkerInstance::FilterList::const_iterator i = |
- instance_->filters().begin(); |
- i != instance_->filters().end(); ++i) { |
+ for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); |
+ ++i) { |
i->filter()->Send(new ViewMsg_WorkerCreated(i->route_id())); |
} |
} |
@@ -92,8 +95,7 @@ bool SharedWorkerHost::FilterMessage(const IPC::Message& message, |
if (!instance_) |
return false; |
- if (!instance_->closed() && |
- instance_->HasFilter(filter, message.routing_id())) { |
+ if (!closed_ && HasFilter(filter, message.routing_id())) { |
RelayMessage(message, filter); |
return true; |
} |
@@ -104,9 +106,9 @@ bool SharedWorkerHost::FilterMessage(const IPC::Message& message, |
void SharedWorkerHost::FilterShutdown(SharedWorkerMessageFilter* filter) { |
if (!instance_) |
return; |
- instance_->RemoveFilters(filter); |
- instance_->worker_document_set()->RemoveAll(filter); |
- if (instance_->worker_document_set()->IsEmpty()) { |
+ RemoveFilters(filter); |
+ worker_document_set_->RemoveAll(filter); |
+ if (worker_document_set_->IsEmpty()) { |
// This worker has no more associated documents - shut it down. |
Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); |
} |
@@ -117,8 +119,8 @@ void SharedWorkerHost::DocumentDetached(SharedWorkerMessageFilter* filter, |
if (!instance_) |
return; |
// Walk all instances and remove the document from their document set. |
- instance_->worker_document_set()->Remove(filter, document_id); |
- if (instance_->worker_document_set()->IsEmpty()) { |
+ worker_document_set_->Remove(filter, document_id); |
+ if (worker_document_set_->IsEmpty()) { |
// This worker has no more associated documents - shut it down. |
Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); |
} |
@@ -130,13 +132,14 @@ void SharedWorkerHost::WorkerContextClosed() { |
// Set the closed flag - this will stop any further messages from |
// being sent to the worker (messages can still be sent from the worker, |
// for exception reporting, etc). |
- instance_->set_closed(true); |
+ closed_ = true; |
} |
void SharedWorkerHost::WorkerContextDestroyed() { |
if (!instance_) |
return; |
instance_.reset(); |
+ worker_document_set_ = NULL; |
} |
void SharedWorkerHost::WorkerScriptLoaded() { |
@@ -150,10 +153,9 @@ void SharedWorkerHost::WorkerScriptLoadFailed() { |
base::TimeTicks::Now() - creation_time_); |
if (!instance_) |
return; |
- instance_->set_load_failed(true); |
- for (SharedWorkerInstance::FilterList::const_iterator i = |
- instance_->filters().begin(); |
- i != instance_->filters().end(); ++i) { |
+ load_failed_ = true; |
+ for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); |
+ ++i) { |
i->filter()->Send(new ViewMsg_WorkerScriptLoadFailed(i->route_id())); |
} |
} |
@@ -161,9 +163,8 @@ void SharedWorkerHost::WorkerScriptLoadFailed() { |
void SharedWorkerHost::WorkerConnected(int message_port_id) { |
if (!instance_) |
return; |
- for (SharedWorkerInstance::FilterList::const_iterator i = |
- instance_->filters().begin(); |
- i != instance_->filters().end(); ++i) { |
+ for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); |
+ ++i) { |
if (i->message_port_id() != message_port_id) |
continue; |
i->filter()->Send(new ViewMsg_WorkerConnected(i->route_id())); |
@@ -223,9 +224,8 @@ void SharedWorkerHost::RelayMessage( |
sent_message_port_id, |
container_render_filter_->message_port_message_filter(), |
new_routing_id); |
- instance_->SetMessagePortID(incoming_filter, |
- message.routing_id(), |
- sent_message_port_id); |
+ SetMessagePortID( |
+ incoming_filter, message.routing_id(), sent_message_port_id); |
// Resend the message with the new routing id. |
Send(new WorkerMsg_Connect( |
worker_route_id_, sent_message_port_id, new_routing_id)); |
@@ -251,7 +251,7 @@ SharedWorkerHost::GetRenderFrameIDsForWorker() { |
if (!instance_) |
return result; |
const WorkerDocumentSet::DocumentInfoSet& documents = |
- instance_->worker_document_set()->documents(); |
+ worker_document_set_->documents(); |
for (WorkerDocumentSet::DocumentInfoSet::const_iterator doc = |
documents.begin(); |
doc != documents.end(); |
@@ -262,4 +262,43 @@ SharedWorkerHost::GetRenderFrameIDsForWorker() { |
return result; |
} |
+void SharedWorkerHost::AddFilter(SharedWorkerMessageFilter* filter, |
+ int route_id) { |
+ CHECK(filter); |
+ if (!HasFilter(filter, route_id)) { |
+ FilterInfo info(filter, route_id); |
+ filters_.push_back(info); |
+ } |
+} |
+ |
+void SharedWorkerHost::RemoveFilters(SharedWorkerMessageFilter* filter) { |
+ for (FilterList::iterator i = filters_.begin(); i != filters_.end();) { |
+ if (i->filter() == filter) |
+ i = filters_.erase(i); |
+ else |
+ ++i; |
+ } |
+} |
+ |
+bool SharedWorkerHost::HasFilter(SharedWorkerMessageFilter* filter, |
+ int route_id) const { |
+ for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); |
+ ++i) { |
+ if (i->filter() == filter && i->route_id() == route_id) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+void SharedWorkerHost::SetMessagePortID(SharedWorkerMessageFilter* filter, |
+ int route_id, |
+ int message_port_id) { |
+ for (FilterList::iterator i = filters_.begin(); i != filters_.end(); ++i) { |
+ if (i->filter() == filter && i->route_id() == route_id) { |
+ i->set_message_port_id(message_port_id); |
+ return; |
+ } |
+ } |
+} |
+ |
} // namespace content |