Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1587)

Unified Diff: content/browser/worker_host/worker_process_host.cc

Issue 133093003: Move the worker script loading code to the worker process (phase:4/5) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@02ScriptLoadInWorkerChrome
Patch Set: change comments in worker_webapplicationcachehost_impl.h and rebase. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/worker_host/worker_process_host.cc
diff --git a/content/browser/worker_host/worker_process_host.cc b/content/browser/worker_host/worker_process_host.cc
index 2ba32e24121bd131f490db5f85ea373268abc5a7..d672028e70455bca8e7cf07419bae5aebbd419f6 100644
--- a/content/browser/worker_host/worker_process_host.cc
+++ b/content/browser/worker_host/worker_process_host.cc
@@ -130,14 +130,16 @@ WorkerProcessHost::WorkerProcessHost(
WorkerProcessHost::~WorkerProcessHost() {
// If we crashed, tell the RenderViewHosts.
for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) {
- const WorkerDocumentSet::DocumentInfoSet& parents =
- i->worker_document_set()->documents();
- for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter =
- parents.begin(); parent_iter != parents.end(); ++parent_iter) {
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&WorkerCrashCallback, parent_iter->render_process_id(),
- parent_iter->render_frame_id()));
+ if (!i->load_failed()) {
+ const WorkerDocumentSet::DocumentInfoSet& parents =
+ i->worker_document_set()->documents();
+ for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter =
+ parents.begin(); parent_iter != parents.end(); ++parent_iter) {
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&WorkerCrashCallback, parent_iter->render_process_id(),
+ parent_iter->render_frame_id()));
+ }
}
WorkerServiceImpl::GetInstance()->NotifyWorkerDestroyed(
this, i->worker_route_id());
@@ -317,8 +319,6 @@ void WorkerProcessHost::CreateWorker(const WorkerInstance& instance) {
params.content_security_policy = instance.content_security_policy();
params.security_policy_type = instance.security_policy_type();
params.route_id = instance.worker_route_id();
- params.creator_process_id = instance.parent_process_id();
- params.shared_worker_appcache_id = instance.main_resource_appcache_id();
Send(new WorkerProcessMsg_CreateWorker(params));
UpdateTitle();
@@ -329,8 +329,7 @@ void WorkerProcessHost::CreateWorker(const WorkerInstance& instance) {
for (WorkerInstance::FilterList::const_iterator i =
instance.filters().begin();
i != instance.filters().end(); ++i) {
- CHECK(i->first);
- i->first->Send(new ViewMsg_WorkerCreated(i->second));
+ i->filter()->Send(new ViewMsg_WorkerCreated(i->route_id()));
}
}
@@ -338,7 +337,7 @@ bool WorkerProcessHost::FilterMessage(const IPC::Message& message,
WorkerMessageFilter* filter) {
for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) {
if (!i->closed() && i->HasFilter(filter, message.routing_id())) {
- RelayMessage(message, worker_message_filter_.get(), i->worker_route_id());
+ RelayMessage(message, filter, &(*i));
return true;
}
}
@@ -358,6 +357,12 @@ bool WorkerProcessHost::OnMessageReceived(const IPC::Message& message) {
IPC_BEGIN_MESSAGE_MAP_EX(WorkerProcessHost, message, msg_is_ok)
IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerContextClosed,
OnWorkerContextClosed)
+ IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerScriptLoaded,
+ OnWorkerScriptLoaded)
+ IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerScriptLoadFailed,
+ OnWorkerScriptLoadFailed)
+ IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerConnected,
+ OnWorkerConnected)
IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_AllowDatabase, OnAllowDatabase)
IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_AllowFileSystem, OnAllowFileSystem)
IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_AllowIndexedDB, OnAllowIndexedDB)
@@ -407,6 +412,45 @@ void WorkerProcessHost::OnWorkerContextClosed(int worker_route_id) {
}
}
+void WorkerProcessHost::OnWorkerScriptLoaded(int worker_route_id) {
+ WorkerDevToolsManager::GetInstance()->WorkerContextStarted(this,
+ worker_route_id);
+}
+
+void WorkerProcessHost::OnWorkerScriptLoadFailed(int worker_route_id) {
+ bool shutdown = true;
+ for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) {
+ if (i->worker_route_id() != worker_route_id) {
+ shutdown = false;
+ continue;
+ }
+ i->set_load_failed(true);
+ for (WorkerInstance::FilterList::const_iterator j = i->filters().begin();
+ j != i->filters().end(); ++j) {
+ j->filter()->Send(new ViewMsg_WorkerScriptLoadFailed(j->route_id()));
+ }
+ }
+ if (shutdown) {
+ base::KillProcess(
+ process_->GetData().handle, RESULT_CODE_NORMAL_EXIT, false);
+ }
+}
+
+void WorkerProcessHost::OnWorkerConnected(int message_port_id,
+ int worker_route_id) {
+ for (Instances::iterator i = instances_.begin(); i != instances_.end(); ++i) {
+ if (i->worker_route_id() != worker_route_id)
+ continue;
+ for (WorkerInstance::FilterList::const_iterator j = i->filters().begin();
+ j != i->filters().end(); ++j) {
+ if (j->message_port_id() != message_port_id)
+ continue;
+ j->filter()->Send(new ViewMsg_WorkerConnected(j->route_id()));
+ return;
+ }
+ }
+}
+
void WorkerProcessHost::OnAllowDatabase(int worker_route_id,
const GURL& url,
const base::string16& name,
@@ -444,8 +488,8 @@ void WorkerProcessHost::OnForceKillWorkerProcess() {
void WorkerProcessHost::RelayMessage(
const IPC::Message& message,
- WorkerMessageFilter* filter,
- int route_id) {
+ WorkerMessageFilter* incoming_filter,
+ WorkerInstance* instance) {
if (message.type() == WorkerMsg_Connect::ID) {
// Crack the SharedWorker Connect message to setup routing for the port.
int sent_message_port_id;
@@ -454,27 +498,26 @@ void WorkerProcessHost::RelayMessage(
&message, &sent_message_port_id, &new_routing_id)) {
return;
}
- new_routing_id = filter->GetNextRoutingID();
+ new_routing_id = worker_message_filter_->GetNextRoutingID();
MessagePortService::GetInstance()->UpdateMessagePort(
sent_message_port_id,
- filter->message_port_message_filter(),
+ worker_message_filter_->message_port_message_filter(),
new_routing_id);
+ instance->SetMessagePortID(incoming_filter,
+ message.routing_id(),
+ sent_message_port_id);
// Resend the message with the new routing id.
- filter->Send(new WorkerMsg_Connect(
- route_id, sent_message_port_id, new_routing_id));
+ worker_message_filter_->Send(new WorkerMsg_Connect(
+ instance->worker_route_id(), sent_message_port_id, new_routing_id));
// Send any queued messages for the sent port.
MessagePortService::GetInstance()->SendQueuedMessagesIfPossible(
sent_message_port_id);
} else {
IPC::Message* new_message = new IPC::Message(message);
- new_message->set_routing_id(route_id);
- filter->Send(new_message);
- if (message.type() == WorkerMsg_StartWorkerContext::ID) {
- WorkerDevToolsManager::GetInstance()->WorkerContextStarted(
- this, route_id);
- }
+ new_message->set_routing_id(instance->worker_route_id());
+ worker_message_filter_->Send(new_message);
return;
}
}
@@ -646,9 +689,7 @@ WorkerProcessHost::WorkerInstance::WorkerInstance(
const base::string16& content_security_policy,
blink::WebContentSecurityPolicyType security_policy_type,
int worker_route_id,
- int parent_process_id,
int render_frame_id,
- int64 main_resource_appcache_id,
ResourceContext* resource_context,
const WorkerStoragePartition& partition)
: url_(url),
@@ -657,34 +698,27 @@ WorkerProcessHost::WorkerInstance::WorkerInstance(
content_security_policy_(content_security_policy),
security_policy_type_(security_policy_type),
worker_route_id_(worker_route_id),
- parent_process_id_(parent_process_id),
render_frame_id_(render_frame_id),
- main_resource_appcache_id_(main_resource_appcache_id),
worker_document_set_(new WorkerDocumentSet()),
resource_context_(resource_context),
- partition_(partition) {
+ partition_(partition),
+ load_failed_(false) {
DCHECK(resource_context_);
}
-WorkerProcessHost::WorkerInstance::WorkerInstance(
- const GURL& url,
- bool shared,
- const base::string16& name,
- ResourceContext* resource_context,
- const WorkerStoragePartition& partition)
- : url_(url),
- closed_(false),
- name_(name),
- worker_route_id_(MSG_ROUTING_NONE),
- parent_process_id_(0),
- main_resource_appcache_id_(0),
- worker_document_set_(new WorkerDocumentSet()),
- resource_context_(resource_context),
- partition_(partition) {
- DCHECK(resource_context_);
+WorkerProcessHost::WorkerInstance::~WorkerInstance() {
}
-WorkerProcessHost::WorkerInstance::~WorkerInstance() {
+void WorkerProcessHost::WorkerInstance::SetMessagePortID(
+ WorkerMessageFilter* 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;
+ }
+ }
}
// Compares an instance based on the algorithm in the WebWorkers spec - an
@@ -732,7 +766,7 @@ void WorkerProcessHost::WorkerInstance::AddFilter(WorkerMessageFilter* filter,
void WorkerProcessHost::WorkerInstance::RemoveFilter(
WorkerMessageFilter* filter, int route_id) {
for (FilterList::iterator i = filters_.begin(); i != filters_.end();) {
- if (i->first == filter && i->second == route_id)
+ if (i->filter() == filter && i->route_id() == route_id)
i = filters_.erase(i);
else
++i;
@@ -744,7 +778,7 @@ void WorkerProcessHost::WorkerInstance::RemoveFilter(
void WorkerProcessHost::WorkerInstance::RemoveFilters(
WorkerMessageFilter* filter) {
for (FilterList::iterator i = filters_.begin(); i != filters_.end();) {
- if (i->first == filter)
+ if (i->filter() == filter)
i = filters_.erase(i);
else
++i;
@@ -755,7 +789,7 @@ bool WorkerProcessHost::WorkerInstance::HasFilter(
WorkerMessageFilter* filter, int route_id) const {
for (FilterList::const_iterator i = filters_.begin(); i != filters_.end();
++i) {
- if (i->first == filter && i->second == route_id)
+ if (i->filter() == filter && i->route_id() == route_id)
return true;
}
return false;

Powered by Google App Engine
This is Rietveld 408576698