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_macros.h" | 7 #include "base/metrics/histogram_macros.h" |
8 #include "content/browser/devtools/shared_worker_devtools_manager.h" | 8 #include "content/browser/devtools/shared_worker_devtools_manager.h" |
9 #include "content/browser/message_port_message_filter.h" | 9 #include "content/browser/message_port_message_filter.h" |
10 #include "content/browser/message_port_service.h" | 10 #include "content/browser/message_port_service.h" |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 SharedWorkerHost::~SharedWorkerHost() { | 68 SharedWorkerHost::~SharedWorkerHost() { |
69 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 69 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
70 UMA_HISTOGRAM_LONG_TIMES("SharedWorker.TimeToDeleted", | 70 UMA_HISTOGRAM_LONG_TIMES("SharedWorker.TimeToDeleted", |
71 base::TimeTicks::Now() - creation_time_); | 71 base::TimeTicks::Now() - creation_time_); |
72 if (!closed_ && !termination_message_sent_) | 72 if (!closed_ && !termination_message_sent_) |
73 NotifyWorkerDestroyed(worker_process_id_, worker_route_id_); | 73 NotifyWorkerDestroyed(worker_process_id_, worker_route_id_); |
74 SharedWorkerServiceImpl::GetInstance()->NotifyWorkerDestroyed( | 74 SharedWorkerServiceImpl::GetInstance()->NotifyWorkerDestroyed( |
75 worker_process_id_, worker_route_id_); | 75 worker_process_id_, worker_route_id_); |
76 } | 76 } |
77 | 77 |
78 bool SharedWorkerHost::Send(IPC::Message* message) { | 78 bool SharedWorkerHost::Send(std::unique_ptr<IPC::Message> message) { |
79 if (!container_render_filter_) { | 79 if (!container_render_filter_) |
80 delete message; | |
81 return false; | 80 return false; |
82 } | 81 return container_render_filter_->Send(message.release()); |
83 return container_render_filter_->Send(message); | |
84 } | 82 } |
85 | 83 |
86 void SharedWorkerHost::Start(bool pause_on_start) { | 84 void SharedWorkerHost::Start(bool pause_on_start) { |
87 WorkerProcessMsg_CreateWorker_Params params; | 85 WorkerProcessMsg_CreateWorker_Params params; |
88 params.url = instance_->url(); | 86 params.url = instance_->url(); |
89 params.name = instance_->name(); | 87 params.name = instance_->name(); |
90 params.content_security_policy = instance_->content_security_policy(); | 88 params.content_security_policy = instance_->content_security_policy(); |
91 params.security_policy_type = instance_->security_policy_type(); | 89 params.security_policy_type = instance_->security_policy_type(); |
92 params.creation_address_space = instance_->creation_address_space(); | 90 params.creation_address_space = instance_->creation_address_space(); |
93 params.pause_on_start = pause_on_start; | 91 params.pause_on_start = pause_on_start; |
94 params.route_id = worker_route_id_; | 92 params.route_id = worker_route_id_; |
95 Send(new WorkerProcessMsg_CreateWorker(params)); | 93 Send(base::MakeUnique<WorkerProcessMsg_CreateWorker>(params)); |
96 | 94 |
97 for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); | 95 for (const FilterInfo& info : filters_) |
98 ++i) { | 96 info.filter()->Send(new ViewMsg_WorkerCreated(info.route_id())); |
99 i->filter()->Send(new ViewMsg_WorkerCreated(i->route_id())); | |
100 } | |
101 } | 97 } |
102 | 98 |
103 bool SharedWorkerHost::FilterMessage(const IPC::Message& message, | 99 bool SharedWorkerHost::FilterMessage(const IPC::Message& message, |
104 SharedWorkerMessageFilter* filter) { | 100 SharedWorkerMessageFilter* filter) { |
105 if (!IsAvailable() || !HasFilter(filter, message.routing_id())) | 101 if (!IsAvailable() || !HasFilter(filter, message.routing_id())) |
106 return false; | 102 return false; |
107 | 103 |
108 RelayMessage(message, filter); | 104 RelayMessage(message, filter); |
109 return true; | 105 return true; |
110 } | 106 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 void SharedWorkerHost::WorkerScriptLoaded() { | 166 void SharedWorkerHost::WorkerScriptLoaded() { |
171 UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoaded", | 167 UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoaded", |
172 base::TimeTicks::Now() - creation_time_); | 168 base::TimeTicks::Now() - creation_time_); |
173 } | 169 } |
174 | 170 |
175 void SharedWorkerHost::WorkerScriptLoadFailed() { | 171 void SharedWorkerHost::WorkerScriptLoadFailed() { |
176 UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoadFailed", | 172 UMA_HISTOGRAM_TIMES("SharedWorker.TimeToScriptLoadFailed", |
177 base::TimeTicks::Now() - creation_time_); | 173 base::TimeTicks::Now() - creation_time_); |
178 if (!instance_) | 174 if (!instance_) |
179 return; | 175 return; |
180 for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); | 176 for (const FilterInfo& info : filters_) |
181 ++i) { | 177 info.filter()->Send(new ViewMsg_WorkerScriptLoadFailed(info.route_id())); |
182 i->filter()->Send(new ViewMsg_WorkerScriptLoadFailed(i->route_id())); | |
183 } | |
184 } | 178 } |
185 | 179 |
186 void SharedWorkerHost::WorkerConnected(int message_port_id) { | 180 void SharedWorkerHost::WorkerConnected(int message_port_id) { |
187 if (!instance_) | 181 if (!instance_) |
188 return; | 182 return; |
189 for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); | 183 for (const FilterInfo& info : filters_) { |
190 ++i) { | 184 if (info.message_port_id() != message_port_id) |
191 if (i->message_port_id() != message_port_id) | |
192 continue; | 185 continue; |
193 i->filter()->Send(new ViewMsg_WorkerConnected(i->route_id())); | 186 info.filter()->Send(new ViewMsg_WorkerConnected(info.route_id())); |
194 return; | 187 return; |
195 } | 188 } |
196 } | 189 } |
197 | 190 |
198 void SharedWorkerHost::AllowFileSystem( | 191 void SharedWorkerHost::AllowFileSystem( |
199 const GURL& url, | 192 const GURL& url, |
200 std::unique_ptr<IPC::Message> reply_msg) { | 193 std::unique_ptr<IPC::Message> reply_msg) { |
201 if (!instance_) | 194 if (!instance_) |
202 return; | 195 return; |
203 GetContentClient()->browser()->AllowWorkerFileSystem( | 196 GetContentClient()->browser()->AllowWorkerFileSystem( |
204 url, | 197 url, |
205 instance_->resource_context(), | 198 instance_->resource_context(), |
206 GetRenderFrameIDsForWorker(), | 199 GetRenderFrameIDsForWorker(), |
207 base::Bind(&SharedWorkerHost::AllowFileSystemResponse, | 200 base::Bind(&SharedWorkerHost::AllowFileSystemResponse, |
208 weak_factory_.GetWeakPtr(), | 201 weak_factory_.GetWeakPtr(), |
209 base::Passed(&reply_msg))); | 202 base::Passed(&reply_msg))); |
210 } | 203 } |
211 | 204 |
212 void SharedWorkerHost::AllowFileSystemResponse( | 205 void SharedWorkerHost::AllowFileSystemResponse( |
213 std::unique_ptr<IPC::Message> reply_msg, | 206 std::unique_ptr<IPC::Message> reply_msg, |
214 bool allowed) { | 207 bool allowed) { |
215 WorkerProcessHostMsg_RequestFileSystemAccessSync::WriteReplyParams( | 208 WorkerProcessHostMsg_RequestFileSystemAccessSync::WriteReplyParams( |
216 reply_msg.get(), | 209 reply_msg.get(), |
217 allowed); | 210 allowed); |
218 Send(reply_msg.release()); | 211 Send(std::move(reply_msg)); |
219 } | 212 } |
220 | 213 |
221 void SharedWorkerHost::AllowIndexedDB(const GURL& url, | 214 void SharedWorkerHost::AllowIndexedDB(const GURL& url, |
222 const base::string16& name, | 215 const base::string16& name, |
223 bool* result) { | 216 bool* result) { |
224 if (!instance_) | 217 if (!instance_) |
225 return; | 218 return; |
226 *result = GetContentClient()->browser()->AllowWorkerIndexedDB( | 219 *result = GetContentClient()->browser()->AllowWorkerIndexedDB( |
227 url, name, instance_->resource_context(), GetRenderFrameIDsForWorker()); | 220 url, name, instance_->resource_context(), GetRenderFrameIDsForWorker()); |
228 } | 221 } |
(...skipping 13 matching lines...) Expand all Loading... |
242 | 235 |
243 DCHECK(container_render_filter_); | 236 DCHECK(container_render_filter_); |
244 new_routing_id = container_render_filter_->GetNextRoutingID(); | 237 new_routing_id = container_render_filter_->GetNextRoutingID(); |
245 MessagePortService::GetInstance()->UpdateMessagePort( | 238 MessagePortService::GetInstance()->UpdateMessagePort( |
246 sent_message_port_id, | 239 sent_message_port_id, |
247 container_render_filter_->message_port_message_filter(), | 240 container_render_filter_->message_port_message_filter(), |
248 new_routing_id); | 241 new_routing_id); |
249 SetMessagePortID( | 242 SetMessagePortID( |
250 incoming_filter, message.routing_id(), sent_message_port_id); | 243 incoming_filter, message.routing_id(), sent_message_port_id); |
251 // Resend the message with the new routing id. | 244 // Resend the message with the new routing id. |
252 Send(new WorkerMsg_Connect( | 245 Send(base::MakeUnique<WorkerMsg_Connect>( |
253 worker_route_id_, sent_message_port_id, new_routing_id)); | 246 worker_route_id_, sent_message_port_id, new_routing_id)); |
254 | 247 |
255 // Send any queued messages for the sent port. | 248 // Send any queued messages for the sent port. |
256 MessagePortService::GetInstance()->SendQueuedMessagesIfPossible( | 249 MessagePortService::GetInstance()->SendQueuedMessagesIfPossible( |
257 sent_message_port_id); | 250 sent_message_port_id); |
258 } else { | 251 } else { |
259 IPC::Message* new_message = new IPC::Message(message); | 252 std::unique_ptr<IPC::Message> new_message = |
| 253 base::MakeUnique<IPC::Message>(message); |
260 new_message->set_routing_id(worker_route_id_); | 254 new_message->set_routing_id(worker_route_id_); |
261 Send(new_message); | 255 Send(std::move(new_message)); |
262 return; | 256 return; |
263 } | 257 } |
264 } | 258 } |
265 | 259 |
266 void SharedWorkerHost::TerminateWorker() { | 260 void SharedWorkerHost::TerminateWorker() { |
267 termination_message_sent_ = true; | 261 termination_message_sent_ = true; |
268 if (!closed_) | 262 if (!closed_) |
269 NotifyWorkerDestroyed(worker_process_id_, worker_route_id_); | 263 NotifyWorkerDestroyed(worker_process_id_, worker_route_id_); |
270 Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); | 264 Send(base::MakeUnique<WorkerMsg_TerminateWorkerContext>(worker_route_id_)); |
271 } | 265 } |
272 | 266 |
273 std::vector<std::pair<int, int> > | 267 std::vector<std::pair<int, int> > |
274 SharedWorkerHost::GetRenderFrameIDsForWorker() { | 268 SharedWorkerHost::GetRenderFrameIDsForWorker() { |
275 std::vector<std::pair<int, int> > result; | 269 std::vector<std::pair<int, int> > result; |
276 if (!instance_) | 270 if (!instance_) |
277 return result; | 271 return result; |
278 const WorkerDocumentSet::DocumentInfoSet& documents = | 272 const WorkerDocumentSet::DocumentInfoSet& documents = |
279 worker_document_set_->documents(); | 273 worker_document_set_->documents(); |
280 for (WorkerDocumentSet::DocumentInfoSet::const_iterator doc = | 274 for (const WorkerDocumentSet::DocumentInfo& doc : documents) { |
281 documents.begin(); | |
282 doc != documents.end(); | |
283 ++doc) { | |
284 result.push_back( | 275 result.push_back( |
285 std::make_pair(doc->render_process_id(), doc->render_frame_id())); | 276 std::make_pair(doc.render_process_id(), doc.render_frame_id())); |
286 } | 277 } |
287 return result; | 278 return result; |
288 } | 279 } |
289 | 280 |
290 bool SharedWorkerHost::IsAvailable() const { | 281 bool SharedWorkerHost::IsAvailable() const { |
291 return instance_ && !termination_message_sent_ && !closed_; | 282 return instance_ && !termination_message_sent_ && !closed_; |
292 } | 283 } |
293 | 284 |
294 void SharedWorkerHost::AddFilter(SharedWorkerMessageFilter* filter, | 285 void SharedWorkerHost::AddFilter(SharedWorkerMessageFilter* filter, |
295 int route_id) { | 286 int route_id) { |
(...skipping 28 matching lines...) Expand all Loading... |
324 int message_port_id) { | 315 int message_port_id) { |
325 for (FilterList::iterator i = filters_.begin(); i != filters_.end(); ++i) { | 316 for (FilterList::iterator i = filters_.begin(); i != filters_.end(); ++i) { |
326 if (i->filter() == filter && i->route_id() == route_id) { | 317 if (i->filter() == filter && i->route_id() == route_id) { |
327 i->set_message_port_id(message_port_id); | 318 i->set_message_port_id(message_port_id); |
328 return; | 319 return; |
329 } | 320 } |
330 } | 321 } |
331 } | 322 } |
332 | 323 |
333 } // namespace content | 324 } // namespace content |
OLD | NEW |