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