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 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 params.security_policy_type = instance_->security_policy_type(); | 91 params.security_policy_type = instance_->security_policy_type(); |
92 params.creation_address_space = instance_->creation_address_space(); | 92 params.creation_address_space = instance_->creation_address_space(); |
93 params.pause_on_start = pause_on_start; | 93 params.pause_on_start = pause_on_start; |
94 params.route_id = worker_route_id_; | 94 params.route_id = worker_route_id_; |
95 Send(new WorkerProcessMsg_CreateWorker(params)); | 95 Send(new WorkerProcessMsg_CreateWorker(params)); |
96 | 96 |
97 for (const FilterInfo& info : filters_) | 97 for (const FilterInfo& info : filters_) |
98 info.filter()->Send(new ViewMsg_WorkerCreated(info.route_id())); | 98 info.filter()->Send(new ViewMsg_WorkerCreated(info.route_id())); |
99 } | 99 } |
100 | 100 |
101 bool SharedWorkerHost::FilterMessage(const IPC::Message& message, | 101 bool SharedWorkerHost::FilterConnectionMessage( |
102 SharedWorkerMessageFilter* filter) { | 102 int route_id, |
103 if (!IsAvailable() || !HasFilter(filter, message.routing_id())) | 103 int sent_message_port_id, |
| 104 SharedWorkerMessageFilter* incoming_filter) { |
| 105 if (!IsAvailable() || !HasFilter(incoming_filter, route_id)) |
104 return false; | 106 return false; |
105 | 107 |
106 RelayMessage(message, filter); | 108 Connect(route_id, sent_message_port_id, incoming_filter); |
107 return true; | 109 return true; |
108 } | 110 } |
109 | 111 |
110 void SharedWorkerHost::FilterShutdown(SharedWorkerMessageFilter* filter) { | 112 void SharedWorkerHost::FilterShutdown(SharedWorkerMessageFilter* filter) { |
111 if (!instance_) | 113 if (!instance_) |
112 return; | 114 return; |
113 RemoveFilters(filter); | 115 RemoveFilters(filter); |
114 worker_document_set_->RemoveAll(filter); | 116 worker_document_set_->RemoveAll(filter); |
115 if (worker_document_set_->IsEmpty()) { | 117 if (worker_document_set_->IsEmpty()) { |
116 // This worker has no more associated documents - shut it down. | 118 // This worker has no more associated documents - shut it down. |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 | 217 |
216 void SharedWorkerHost::AllowIndexedDB(const GURL& url, | 218 void SharedWorkerHost::AllowIndexedDB(const GURL& url, |
217 const base::string16& name, | 219 const base::string16& name, |
218 bool* result) { | 220 bool* result) { |
219 if (!instance_) | 221 if (!instance_) |
220 return; | 222 return; |
221 *result = GetContentClient()->browser()->AllowWorkerIndexedDB( | 223 *result = GetContentClient()->browser()->AllowWorkerIndexedDB( |
222 url, name, instance_->resource_context(), GetRenderFrameIDsForWorker()); | 224 url, name, instance_->resource_context(), GetRenderFrameIDsForWorker()); |
223 } | 225 } |
224 | 226 |
225 void SharedWorkerHost::RelayMessage( | |
226 const IPC::Message& message, | |
227 SharedWorkerMessageFilter* incoming_filter) { | |
228 if (!instance_) | |
229 return; | |
230 if (message.type() == WorkerMsg_Connect::ID) { | |
231 // Crack the SharedWorker Connect message to setup routing for the port. | |
232 WorkerMsg_Connect::Param param; | |
233 if (!WorkerMsg_Connect::Read(&message, ¶m)) | |
234 return; | |
235 int sent_message_port_id = std::get<0>(param); | |
236 int new_routing_id = std::get<1>(param); | |
237 | |
238 DCHECK(container_render_filter_); | |
239 new_routing_id = container_render_filter_->GetNextRoutingID(); | |
240 MessagePortService::GetInstance()->UpdateMessagePort( | |
241 sent_message_port_id, | |
242 container_render_filter_->message_port_message_filter(), | |
243 new_routing_id); | |
244 SetMessagePortID( | |
245 incoming_filter, message.routing_id(), sent_message_port_id); | |
246 // Resend the message with the new routing id. | |
247 Send(new WorkerMsg_Connect( | |
248 worker_route_id_, sent_message_port_id, new_routing_id)); | |
249 | |
250 // Send any queued messages for the sent port. | |
251 MessagePortService::GetInstance()->SendQueuedMessagesIfPossible( | |
252 sent_message_port_id); | |
253 } else { | |
254 IPC::Message* new_message = new IPC::Message(message); | |
255 new_message->set_routing_id(worker_route_id_); | |
256 Send(new_message); | |
257 return; | |
258 } | |
259 } | |
260 | |
261 void SharedWorkerHost::TerminateWorker() { | 227 void SharedWorkerHost::TerminateWorker() { |
262 termination_message_sent_ = true; | 228 termination_message_sent_ = true; |
263 if (!closed_) | 229 if (!closed_) |
264 NotifyWorkerDestroyed(worker_process_id_, worker_route_id_); | 230 NotifyWorkerDestroyed(worker_process_id_, worker_route_id_); |
265 Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); | 231 Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_)); |
266 } | 232 } |
267 | 233 |
268 std::vector<std::pair<int, int> > | 234 std::vector<std::pair<int, int> > |
269 SharedWorkerHost::GetRenderFrameIDsForWorker() { | 235 SharedWorkerHost::GetRenderFrameIDsForWorker() { |
270 std::vector<std::pair<int, int> > result; | 236 std::vector<std::pair<int, int> > result; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 bool SharedWorkerHost::HasFilter(SharedWorkerMessageFilter* filter, | 270 bool SharedWorkerHost::HasFilter(SharedWorkerMessageFilter* filter, |
305 int route_id) const { | 271 int route_id) const { |
306 for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); | 272 for (FilterList::const_iterator i = filters_.begin(); i != filters_.end(); |
307 ++i) { | 273 ++i) { |
308 if (i->filter() == filter && i->route_id() == route_id) | 274 if (i->filter() == filter && i->route_id() == route_id) |
309 return true; | 275 return true; |
310 } | 276 } |
311 return false; | 277 return false; |
312 } | 278 } |
313 | 279 |
| 280 void SharedWorkerHost::Connect(int route_id, |
| 281 int sent_message_port_id, |
| 282 SharedWorkerMessageFilter* incoming_filter) { |
| 283 DCHECK(IsAvailable()); |
| 284 DCHECK(HasFilter(incoming_filter, route_id)); |
| 285 DCHECK(container_render_filter_); |
| 286 |
| 287 int new_routing_id = container_render_filter_->GetNextRoutingID(); |
| 288 MessagePortService::GetInstance()->UpdateMessagePort( |
| 289 sent_message_port_id, |
| 290 container_render_filter_->message_port_message_filter(), new_routing_id); |
| 291 SetMessagePortID(incoming_filter, route_id, sent_message_port_id); |
| 292 Send(new WorkerMsg_Connect(worker_route_id_, sent_message_port_id, |
| 293 new_routing_id)); |
| 294 |
| 295 // Send any queued messages for the sent port. |
| 296 MessagePortService::GetInstance()->SendQueuedMessagesIfPossible( |
| 297 sent_message_port_id); |
| 298 } |
| 299 |
314 void SharedWorkerHost::SetMessagePortID(SharedWorkerMessageFilter* filter, | 300 void SharedWorkerHost::SetMessagePortID(SharedWorkerMessageFilter* filter, |
315 int route_id, | 301 int route_id, |
316 int message_port_id) { | 302 int message_port_id) { |
317 for (FilterList::iterator i = filters_.begin(); i != filters_.end(); ++i) { | 303 for (FilterList::iterator i = filters_.begin(); i != filters_.end(); ++i) { |
318 if (i->filter() == filter && i->route_id() == route_id) { | 304 if (i->filter() == filter && i->route_id() == route_id) { |
319 i->set_message_port_id(message_port_id); | 305 i->set_message_port_id(message_port_id); |
320 return; | 306 return; |
321 } | 307 } |
322 } | 308 } |
323 } | 309 } |
324 | 310 |
325 } // namespace content | 311 } // namespace content |
OLD | NEW |