| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/shared_worker/shared_worker_host.h" | 5 #include "content/browser/shared_worker/shared_worker_host.h" |
| 6 | 6 |
| 7 #include "base/metrics/histogram.h" | 7 #include "base/metrics/histogram.h" |
| 8 #include "content/browser/devtools/shared_worker_devtools_manager.h" | |
| 9 #include "content/browser/frame_host/render_frame_host_delegate.h" | 8 #include "content/browser/frame_host/render_frame_host_delegate.h" |
| 10 #include "content/browser/frame_host/render_frame_host_impl.h" | 9 #include "content/browser/frame_host/render_frame_host_impl.h" |
| 11 #include "content/browser/message_port_service.h" | 10 #include "content/browser/message_port_service.h" |
| 12 #include "content/browser/shared_worker/shared_worker_instance.h" | 11 #include "content/browser/shared_worker/shared_worker_instance.h" |
| 13 #include "content/browser/shared_worker/shared_worker_message_filter.h" | 12 #include "content/browser/shared_worker/shared_worker_message_filter.h" |
| 14 #include "content/browser/shared_worker/shared_worker_service_impl.h" | |
| 15 #include "content/browser/worker_host/worker_document_set.h" | 13 #include "content/browser/worker_host/worker_document_set.h" |
| 16 #include "content/common/view_messages.h" | 14 #include "content/common/view_messages.h" |
| 17 #include "content/common/worker_messages.h" | 15 #include "content/common/worker_messages.h" |
| 18 #include "content/public/browser/browser_thread.h" | 16 #include "content/public/browser/browser_thread.h" |
| 19 #include "content/public/browser/content_browser_client.h" | 17 #include "content/public/browser/content_browser_client.h" |
| 20 #include "content/public/browser/render_process_host.h" | |
| 21 #include "content/public/common/content_client.h" | 18 #include "content/public/common/content_client.h" |
| 22 | 19 |
| 23 namespace content { | 20 namespace content { |
| 24 namespace { | 21 namespace { |
| 25 | 22 |
| 26 // Notifies RenderViewHost that one or more worker objects crashed. | 23 // Notifies RenderViewHost that one or more worker objects crashed. |
| 27 void WorkerCrashCallback(int render_process_unique_id, int render_frame_id) { | 24 void WorkerCrashCallback(int render_process_unique_id, int render_frame_id) { |
| 28 RenderFrameHostImpl* host = | 25 RenderFrameHostImpl* host = |
| 29 RenderFrameHostImpl::FromID(render_process_unique_id, render_frame_id); | 26 RenderFrameHostImpl::FromID(render_process_unique_id, render_frame_id); |
| 30 if (host) | 27 if (host) |
| 31 host->delegate()->WorkerCrashed(host); | 28 host->delegate()->WorkerCrashed(host); |
| 32 } | 29 } |
| 33 | 30 |
| 34 void NotifyWorkerScriptLoadedOnUI(int worker_process_id, int worker_route_id) { | |
| 35 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 36 SharedWorkerDevToolsManager::GetInstance()->WorkerContextStarted( | |
| 37 worker_process_id, worker_route_id); | |
| 38 } | |
| 39 | |
| 40 void NotifyWorkerDestroyedOnUI(int worker_process_id, int worker_route_id) { | |
| 41 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 42 SharedWorkerDevToolsManager::GetInstance()->WorkerDestroyed(worker_process_id, | |
| 43 worker_route_id); | |
| 44 } | |
| 45 | |
| 46 } // namespace | 31 } // namespace |
| 47 | 32 |
| 48 SharedWorkerHost::SharedWorkerHost(SharedWorkerInstance* instance, | 33 SharedWorkerHost::SharedWorkerHost(SharedWorkerInstance* instance) |
| 49 SharedWorkerMessageFilter* filter) | |
| 50 : instance_(instance), | 34 : instance_(instance), |
| 51 worker_document_set_(new WorkerDocumentSet()), | 35 worker_document_set_(new WorkerDocumentSet()), |
| 52 container_render_filter_(filter), | 36 container_render_filter_(NULL), |
| 53 worker_process_id_(filter->render_process_id()), | 37 worker_route_id_(MSG_ROUTING_NONE), |
| 54 worker_route_id_(filter->GetNextRoutingID()), | |
| 55 load_failed_(false), | 38 load_failed_(false), |
| 56 closed_(false), | 39 closed_(false), |
| 57 creation_time_(base::TimeTicks::Now()) { | 40 creation_time_(base::TimeTicks::Now()) { |
| 58 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 41 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 59 } | 42 } |
| 60 | 43 |
| 61 SharedWorkerHost::~SharedWorkerHost() { | 44 SharedWorkerHost::~SharedWorkerHost() { |
| 62 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 45 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 63 UMA_HISTOGRAM_LONG_TIMES("SharedWorker.TimeToDeleted", | 46 UMA_HISTOGRAM_LONG_TIMES("SharedWorker.TimeToDeleted", |
| 64 base::TimeTicks::Now() - creation_time_); | 47 base::TimeTicks::Now() - creation_time_); |
| 65 // If we crashed, tell the RenderViewHosts. | 48 // If we crashed, tell the RenderViewHosts. |
| 66 if (instance_ && !load_failed_) { | 49 if (instance_ && !load_failed_) { |
| 67 const WorkerDocumentSet::DocumentInfoSet& parents = | 50 const WorkerDocumentSet::DocumentInfoSet& parents = |
| 68 worker_document_set_->documents(); | 51 worker_document_set_->documents(); |
| 69 for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter = | 52 for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter = |
| 70 parents.begin(); | 53 parents.begin(); |
| 71 parent_iter != parents.end(); | 54 parent_iter != parents.end(); |
| 72 ++parent_iter) { | 55 ++parent_iter) { |
| 73 BrowserThread::PostTask(BrowserThread::UI, | 56 BrowserThread::PostTask(BrowserThread::UI, |
| 74 FROM_HERE, | 57 FROM_HERE, |
| 75 base::Bind(&WorkerCrashCallback, | 58 base::Bind(&WorkerCrashCallback, |
| 76 parent_iter->render_process_id(), | 59 parent_iter->render_process_id(), |
| 77 parent_iter->render_frame_id())); | 60 parent_iter->render_frame_id())); |
| 78 } | 61 } |
| 79 } | 62 } |
| 80 BrowserThread::PostTask( | |
| 81 BrowserThread::UI, | |
| 82 FROM_HERE, | |
| 83 base::Bind( | |
| 84 &NotifyWorkerDestroyedOnUI, worker_process_id_, worker_route_id_)); | |
| 85 SharedWorkerServiceImpl::GetInstance()->NotifyWorkerDestroyed( | |
| 86 worker_process_id_, worker_route_id_); | |
| 87 } | 63 } |
| 88 | 64 |
| 89 bool SharedWorkerHost::Send(IPC::Message* message) { | 65 bool SharedWorkerHost::Send(IPC::Message* message) { |
| 90 if (!container_render_filter_) { | 66 if (!container_render_filter_) { |
| 91 delete message; | 67 delete message; |
| 92 return false; | 68 return false; |
| 93 } | 69 } |
| 94 return container_render_filter_->Send(message); | 70 return container_render_filter_->Send(message); |
| 95 } | 71 } |
| 96 | 72 |
| 97 void SharedWorkerHost::Start(bool pause_on_start) { | 73 void SharedWorkerHost::Init(SharedWorkerMessageFilter* filter) { |
| 74 CHECK(instance_); |
| 75 DCHECK(worker_route_id_ == MSG_ROUTING_NONE); |
| 76 container_render_filter_ = filter; |
| 77 worker_route_id_ = filter->GetNextRoutingID(); |
| 78 |
| 98 WorkerProcessMsg_CreateWorker_Params params; | 79 WorkerProcessMsg_CreateWorker_Params params; |
| 99 params.url = instance_->url(); | 80 params.url = instance_->url(); |
| 100 params.name = instance_->name(); | 81 params.name = instance_->name(); |
| 101 params.content_security_policy = instance_->content_security_policy(); | 82 params.content_security_policy = instance_->content_security_policy(); |
| 102 params.security_policy_type = instance_->security_policy_type(); | 83 params.security_policy_type = instance_->security_policy_type(); |
| 103 params.pause_on_start = pause_on_start; | |
| 104 params.route_id = worker_route_id_; | 84 params.route_id = worker_route_id_; |
| 105 Send(new WorkerProcessMsg_CreateWorker(params)); | 85 Send(new WorkerProcessMsg_CreateWorker(params)); |
| 106 | 86 |
| 107 for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); | 87 for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); |
| 108 ++i) { | 88 ++i) { |
| 109 i->filter()->Send(new ViewMsg_WorkerCreated(i->route_id())); | 89 i->filter()->Send(new ViewMsg_WorkerCreated(i->route_id())); |
| 110 } | 90 } |
| 111 } | 91 } |
| 112 | 92 |
| 113 bool SharedWorkerHost::FilterMessage(const IPC::Message& message, | 93 bool SharedWorkerHost::FilterMessage(const IPC::Message& message, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 } | 136 } |
| 157 | 137 |
| 158 void SharedWorkerHost::WorkerContextDestroyed() { | 138 void SharedWorkerHost::WorkerContextDestroyed() { |
| 159 if (!instance_) | 139 if (!instance_) |
| 160 return; | 140 return; |
| 161 instance_.reset(); | 141 instance_.reset(); |
| 162 worker_document_set_ = NULL; | 142 worker_document_set_ = NULL; |
| 163 } | 143 } |
| 164 | 144 |
| 165 void SharedWorkerHost::WorkerScriptLoaded() { | 145 void SharedWorkerHost::WorkerScriptLoaded() { |
| 146 // TODO(horo): implement this. |
| 166 UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoaded", | 147 UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoaded", |
| 167 base::TimeTicks::Now() - creation_time_); | 148 base::TimeTicks::Now() - creation_time_); |
| 168 BrowserThread::PostTask( | |
| 169 BrowserThread::UI, | |
| 170 FROM_HERE, | |
| 171 base::Bind( | |
| 172 &NotifyWorkerScriptLoadedOnUI, worker_process_id_, worker_route_id_)); | |
| 173 } | 149 } |
| 174 | 150 |
| 175 void SharedWorkerHost::WorkerScriptLoadFailed() { | 151 void SharedWorkerHost::WorkerScriptLoadFailed() { |
| 176 UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoadFailed", | 152 UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoadFailed", |
| 177 base::TimeTicks::Now() - creation_time_); | 153 base::TimeTicks::Now() - creation_time_); |
| 178 if (!instance_) | 154 if (!instance_) |
| 179 return; | 155 return; |
| 180 load_failed_ = true; | 156 load_failed_ = true; |
| 181 for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); | 157 for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); |
| 182 ++i) { | 158 ++i) { |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 int message_port_id) { | 295 int message_port_id) { |
| 320 for (FilterList::iterator i = filters_.begin(); i != filters_.end(); ++i) { | 296 for (FilterList::iterator i = filters_.begin(); i != filters_.end(); ++i) { |
| 321 if (i->filter() == filter && i->route_id() == route_id) { | 297 if (i->filter() == filter && i->route_id() == route_id) { |
| 322 i->set_message_port_id(message_port_id); | 298 i->set_message_port_id(message_port_id); |
| 323 return; | 299 return; |
| 324 } | 300 } |
| 325 } | 301 } |
| 326 } | 302 } |
| 327 | 303 |
| 328 } // namespace content | 304 } // namespace content |
| OLD | NEW |