OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/service_worker/embedded_worker_registry.h" | 5 #include "content/browser/service_worker/embedded_worker_registry.h" |
6 | 6 |
7 #include "base/bind_helpers.h" | 7 #include "base/bind_helpers.h" |
8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "content/browser/renderer_host/render_widget_helper.h" |
9 #include "content/browser/service_worker/embedded_worker_instance.h" | 10 #include "content/browser/service_worker/embedded_worker_instance.h" |
10 #include "content/browser/service_worker/service_worker_context_core.h" | 11 #include "content/browser/service_worker/service_worker_context_core.h" |
11 #include "content/browser/service_worker/service_worker_context_wrapper.h" | 12 #include "content/browser/service_worker/service_worker_context_wrapper.h" |
12 #include "content/common/service_worker/embedded_worker_messages.h" | 13 #include "content/common/service_worker/embedded_worker_messages.h" |
13 #include "content/public/browser/browser_thread.h" | 14 #include "content/public/browser/browser_thread.h" |
14 #include "ipc/ipc_message.h" | 15 #include "ipc/ipc_message.h" |
15 #include "ipc/ipc_sender.h" | 16 #include "ipc/ipc_sender.h" |
16 | 17 |
17 namespace content { | 18 namespace content { |
18 | 19 |
(...skipping 12 matching lines...) Expand all Loading... |
31 void EmbeddedWorkerRegistry::StartWorker(const std::vector<int>& process_ids, | 32 void EmbeddedWorkerRegistry::StartWorker(const std::vector<int>& process_ids, |
32 int embedded_worker_id, | 33 int embedded_worker_id, |
33 int64 service_worker_version_id, | 34 int64 service_worker_version_id, |
34 const GURL& scope, | 35 const GURL& scope, |
35 const GURL& script_url, | 36 const GURL& script_url, |
36 const StatusCallback& callback) { | 37 const StatusCallback& callback) { |
37 if (!context_) { | 38 if (!context_) { |
38 callback.Run(SERVICE_WORKER_ERROR_ABORT); | 39 callback.Run(SERVICE_WORKER_ERROR_ABORT); |
39 return; | 40 return; |
40 } | 41 } |
| 42 scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( |
| 43 new EmbeddedWorkerMsg_StartWorker_Params()); |
| 44 params->embedded_worker_id = embedded_worker_id; |
| 45 params->service_worker_version_id = service_worker_version_id; |
| 46 params->scope = scope; |
| 47 params->script_url = script_url; |
| 48 params->worker_devtools_agent_route_id = MSG_ROUTING_NONE; |
41 context_->process_manager()->AllocateWorkerProcess( | 49 context_->process_manager()->AllocateWorkerProcess( |
42 process_ids, | 50 process_ids, |
43 script_url, | 51 script_url, |
44 base::Bind(&EmbeddedWorkerRegistry::StartWorkerWithProcessId, | 52 base::Bind(&EmbeddedWorkerRegistry::StartWorkerWithProcessId, |
45 this, | 53 this, |
46 embedded_worker_id, | 54 embedded_worker_id, |
47 base::Passed(make_scoped_ptr(new EmbeddedWorkerMsg_StartWorker( | 55 base::Passed(¶ms), |
48 embedded_worker_id, | |
49 service_worker_version_id, | |
50 scope, | |
51 script_url))), | |
52 callback)); | 56 callback)); |
53 } | 57 } |
54 | 58 |
55 ServiceWorkerStatusCode EmbeddedWorkerRegistry::StopWorker( | 59 ServiceWorkerStatusCode EmbeddedWorkerRegistry::StopWorker( |
56 int process_id, int embedded_worker_id) { | 60 int process_id, int embedded_worker_id) { |
57 if (context_) | 61 if (context_) |
58 context_->process_manager()->ReleaseWorkerProcess(process_id); | 62 context_->process_manager()->ReleaseWorkerProcess(process_id); |
59 return Send(process_id, | 63 return Send(process_id, |
60 new EmbeddedWorkerMsg_StopWorker(embedded_worker_id)); | 64 new EmbeddedWorkerMsg_StopWorker(embedded_worker_id)); |
61 } | 65 } |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 return NULL; | 171 return NULL; |
168 return found->second; | 172 return found->second; |
169 } | 173 } |
170 | 174 |
171 EmbeddedWorkerRegistry::~EmbeddedWorkerRegistry() { | 175 EmbeddedWorkerRegistry::~EmbeddedWorkerRegistry() { |
172 Shutdown(); | 176 Shutdown(); |
173 } | 177 } |
174 | 178 |
175 void EmbeddedWorkerRegistry::StartWorkerWithProcessId( | 179 void EmbeddedWorkerRegistry::StartWorkerWithProcessId( |
176 int embedded_worker_id, | 180 int embedded_worker_id, |
177 scoped_ptr<EmbeddedWorkerMsg_StartWorker> message, | 181 scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, |
178 const StatusCallback& callback, | 182 const StatusCallback& callback, |
179 ServiceWorkerStatusCode status, | 183 ServiceWorkerStatusCode status, |
180 int process_id) { | 184 int process_id) { |
181 WorkerInstanceMap::const_iterator worker = | 185 WorkerInstanceMap::const_iterator worker = |
182 worker_map_.find(embedded_worker_id); | 186 worker_map_.find(embedded_worker_id); |
183 if (worker == worker_map_.end()) { | 187 if (worker == worker_map_.end()) { |
184 // The Instance was destroyed before it could finish starting. Undo what | 188 // The Instance was destroyed before it could finish starting. Undo what |
185 // we've done so far. | 189 // we've done so far. |
186 if (context_) | 190 if (context_) |
187 context_->process_manager()->ReleaseWorkerProcess(process_id); | 191 context_->process_manager()->ReleaseWorkerProcess(process_id); |
188 callback.Run(SERVICE_WORKER_ERROR_ABORT); | 192 callback.Run(SERVICE_WORKER_ERROR_ABORT); |
189 return; | 193 return; |
190 } | 194 } |
191 worker->second->RecordProcessId(process_id, status); | 195 if (status == SERVICE_WORKER_OK) { |
| 196 // Gets the new routing id for the renderer process. |
| 197 scoped_refptr<RenderWidgetHelper> helper( |
| 198 RenderWidgetHelper::FromProcessHostID(process_id)); |
| 199 // |helper| may be NULL in unittest. |
| 200 params->worker_devtools_agent_route_id = |
| 201 helper ? helper->GetNextRoutingID() : MSG_ROUTING_NONE; |
| 202 } |
| 203 worker->second->RecordProcessId( |
| 204 process_id, status, params->worker_devtools_agent_route_id); |
192 | 205 |
193 if (status != SERVICE_WORKER_OK) { | 206 if (status != SERVICE_WORKER_OK) { |
194 callback.Run(status); | 207 callback.Run(status); |
195 return; | 208 return; |
196 } | 209 } |
197 // The ServiceWorkerDispatcherHost is supposed to be created when the process | 210 // The ServiceWorkerDispatcherHost is supposed to be created when the process |
198 // is created, and keep an entry in process_sender_map_ for its whole | 211 // is created, and keep an entry in process_sender_map_ for its whole |
199 // lifetime. | 212 // lifetime. |
200 DCHECK(ContainsKey(process_sender_map_, process_id)); | 213 DCHECK(ContainsKey(process_sender_map_, process_id)); |
201 callback.Run(Send(process_id, message.release())); | 214 callback.Run(Send(process_id, new EmbeddedWorkerMsg_StartWorker(*params))); |
202 } | 215 } |
203 | 216 |
204 ServiceWorkerStatusCode EmbeddedWorkerRegistry::Send( | 217 ServiceWorkerStatusCode EmbeddedWorkerRegistry::Send( |
205 int process_id, IPC::Message* message) { | 218 int process_id, IPC::Message* message) { |
206 if (!context_) | 219 if (!context_) |
207 return SERVICE_WORKER_ERROR_ABORT; | 220 return SERVICE_WORKER_ERROR_ABORT; |
208 ProcessToSenderMap::iterator found = process_sender_map_.find(process_id); | 221 ProcessToSenderMap::iterator found = process_sender_map_.find(process_id); |
209 if (found == process_sender_map_.end()) | 222 if (found == process_sender_map_.end()) |
210 return SERVICE_WORKER_ERROR_PROCESS_NOT_FOUND; | 223 return SERVICE_WORKER_ERROR_PROCESS_NOT_FOUND; |
211 if (!found->second->Send(message)) | 224 if (!found->second->Send(message)) |
212 return SERVICE_WORKER_ERROR_IPC_FAILED; | 225 return SERVICE_WORKER_ERROR_IPC_FAILED; |
213 return SERVICE_WORKER_OK; | 226 return SERVICE_WORKER_OK; |
214 } | 227 } |
215 | 228 |
216 void EmbeddedWorkerRegistry::RemoveWorker(int process_id, | 229 void EmbeddedWorkerRegistry::RemoveWorker(int process_id, |
217 int embedded_worker_id) { | 230 int embedded_worker_id) { |
218 DCHECK(ContainsKey(worker_map_, embedded_worker_id)); | 231 DCHECK(ContainsKey(worker_map_, embedded_worker_id)); |
219 worker_map_.erase(embedded_worker_id); | 232 worker_map_.erase(embedded_worker_id); |
220 worker_process_map_.erase(process_id); | 233 worker_process_map_.erase(process_id); |
221 } | 234 } |
222 | 235 |
223 } // namespace content | 236 } // namespace content |
OLD | NEW |