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 |