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_instance.h" | 5 #include "content/browser/service_worker/embedded_worker_instance.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
12 #include "base/metrics/histogram_macros.h" | 12 #include "base/metrics/histogram_macros.h" |
13 #include "base/threading/non_thread_safe.h" | 13 #include "base/threading/non_thread_safe.h" |
14 #include "base/trace_event/trace_event.h" | 14 #include "base/trace_event/trace_event.h" |
15 #include "content/browser/devtools/service_worker_devtools_manager.h" | 15 #include "content/browser/devtools/service_worker_devtools_manager.h" |
16 #include "content/browser/service_worker/embedded_worker_registry.h" | 16 #include "content/browser/service_worker/embedded_worker_registry.h" |
17 #include "content/browser/service_worker/embedded_worker_status.h" | 17 #include "content/browser/service_worker/embedded_worker_status.h" |
18 #include "content/browser/service_worker/service_worker_context_core.h" | 18 #include "content/browser/service_worker/service_worker_context_core.h" |
19 #include "content/common/content_switches_internal.h" | 19 #include "content/common/content_switches_internal.h" |
20 #include "content/common/service_worker/embedded_worker_messages.h" | 20 #include "content/common/service_worker/embedded_worker_messages.h" |
21 #include "content/common/service_worker/embedded_worker_settings.h" | 21 #include "content/common/service_worker/embedded_worker_settings.h" |
22 #include "content/common/service_worker/embedded_worker_setup.mojom.h" | 22 #include "content/common/service_worker/embedded_worker_setup.mojom.h" |
| 23 #include "content/common/service_worker/embedded_worker_start_params.h" |
23 #include "content/common/service_worker/service_worker_types.h" | 24 #include "content/common/service_worker/service_worker_types.h" |
| 25 #include "content/common/service_worker/service_worker_utils.h" |
24 #include "content/public/browser/browser_thread.h" | 26 #include "content/public/browser/browser_thread.h" |
25 #include "content/public/browser/content_browser_client.h" | 27 #include "content/public/browser/content_browser_client.h" |
26 #include "content/public/browser/render_process_host.h" | 28 #include "content/public/browser/render_process_host.h" |
27 #include "content/public/common/child_process_host.h" | 29 #include "content/public/common/child_process_host.h" |
| 30 #include "content/public/common/content_switches.h" |
28 #include "ipc/ipc_message.h" | 31 #include "ipc/ipc_message.h" |
29 #include "services/shell/public/cpp/interface_provider.h" | 32 #include "services/shell/public/cpp/interface_provider.h" |
30 #include "services/shell/public/cpp/interface_registry.h" | 33 #include "services/shell/public/cpp/interface_registry.h" |
31 #include "url/gurl.h" | 34 #include "url/gurl.h" |
32 | 35 |
33 namespace content { | 36 namespace content { |
34 | 37 |
35 namespace { | 38 namespace { |
36 | 39 |
37 // When a service worker version's failure count exceeds | 40 // When a service worker version's failure count exceeds |
(...skipping 24 matching lines...) Expand all Loading... |
62 ServiceWorkerDevToolsManager::GetInstance()->WorkerVersionInstalled( | 65 ServiceWorkerDevToolsManager::GetInstance()->WorkerVersionInstalled( |
63 worker_process_id, worker_route_id); | 66 worker_process_id, worker_route_id); |
64 } | 67 } |
65 | 68 |
66 void NotifyWorkerVersionDoomedOnUI(int worker_process_id, int worker_route_id) { | 69 void NotifyWorkerVersionDoomedOnUI(int worker_process_id, int worker_route_id) { |
67 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 70 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
68 ServiceWorkerDevToolsManager::GetInstance()->WorkerVersionDoomed( | 71 ServiceWorkerDevToolsManager::GetInstance()->WorkerVersionDoomed( |
69 worker_process_id, worker_route_id); | 72 worker_process_id, worker_route_id); |
70 } | 73 } |
71 | 74 |
72 void RegisterToWorkerDevToolsManagerOnUI( | 75 void SetupOnUI( |
73 int process_id, | 76 int process_id, |
74 const ServiceWorkerContextCore* service_worker_context, | 77 const ServiceWorkerContextCore* service_worker_context, |
75 const base::WeakPtr<ServiceWorkerContextCore>& service_worker_context_weak, | 78 const base::WeakPtr<ServiceWorkerContextCore>& service_worker_context_weak, |
76 int64_t service_worker_version_id, | 79 int64_t service_worker_version_id, |
77 const GURL& url, | 80 const GURL& url, |
78 const GURL& scope, | 81 const GURL& scope, |
79 bool is_installed, | 82 bool is_installed, |
| 83 mojom::EmbeddedWorkerInstanceClientRequest request, |
80 const base::Callback<void(int worker_devtools_agent_route_id, | 84 const base::Callback<void(int worker_devtools_agent_route_id, |
81 bool wait_for_debugger)>& callback) { | 85 bool wait_for_debugger)>& callback) { |
82 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 86 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
83 int worker_devtools_agent_route_id = MSG_ROUTING_NONE; | 87 int worker_devtools_agent_route_id = MSG_ROUTING_NONE; |
84 bool wait_for_debugger = false; | 88 bool wait_for_debugger = false; |
85 if (RenderProcessHost* rph = RenderProcessHost::FromID(process_id)) { | 89 if (RenderProcessHost* rph = RenderProcessHost::FromID(process_id)) { |
86 // |rph| may be NULL in unit tests. | 90 // |rph| may be NULL in unit tests. |
87 worker_devtools_agent_route_id = rph->GetNextRoutingID(); | 91 worker_devtools_agent_route_id = rph->GetNextRoutingID(); |
88 wait_for_debugger = | 92 wait_for_debugger = |
89 ServiceWorkerDevToolsManager::GetInstance()->WorkerCreated( | 93 ServiceWorkerDevToolsManager::GetInstance()->WorkerCreated( |
90 process_id, worker_devtools_agent_route_id, | 94 process_id, worker_devtools_agent_route_id, |
91 ServiceWorkerDevToolsManager::ServiceWorkerIdentifier( | 95 ServiceWorkerDevToolsManager::ServiceWorkerIdentifier( |
92 service_worker_context, service_worker_context_weak, | 96 service_worker_context, service_worker_context_weak, |
93 service_worker_version_id, url, scope), | 97 service_worker_version_id, url, scope), |
94 is_installed); | 98 is_installed); |
| 99 if (request.is_pending()) |
| 100 rph->GetRemoteInterfaces()->GetInterface(std::move(request)); |
95 } | 101 } |
96 BrowserThread::PostTask( | 102 BrowserThread::PostTask( |
97 BrowserThread::IO, | 103 BrowserThread::IO, |
98 FROM_HERE, | 104 FROM_HERE, |
99 base::Bind(callback, worker_devtools_agent_route_id, wait_for_debugger)); | 105 base::Bind(callback, worker_devtools_agent_route_id, wait_for_debugger)); |
100 } | 106 } |
101 | 107 |
102 void SetupMojoOnUIThread( | 108 void SetupMojoOnUIThread( |
103 int process_id, | 109 int process_id, |
104 int thread_id, | 110 int thread_id, |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 | 210 |
205 // A task to allocate a worker process and to send a start worker message. This | 211 // A task to allocate a worker process and to send a start worker message. This |
206 // is created on EmbeddedWorkerInstance::Start(), owned by the instance and | 212 // is created on EmbeddedWorkerInstance::Start(), owned by the instance and |
207 // destroyed on EmbeddedWorkerInstance::OnScriptEvaluated(). | 213 // destroyed on EmbeddedWorkerInstance::OnScriptEvaluated(). |
208 // We can abort starting worker by destroying this task anytime during the | 214 // We can abort starting worker by destroying this task anytime during the |
209 // sequence. | 215 // sequence. |
210 class EmbeddedWorkerInstance::StartTask { | 216 class EmbeddedWorkerInstance::StartTask { |
211 public: | 217 public: |
212 enum class ProcessAllocationState { NOT_ALLOCATED, ALLOCATING, ALLOCATED }; | 218 enum class ProcessAllocationState { NOT_ALLOCATED, ALLOCATING, ALLOCATED }; |
213 | 219 |
214 StartTask(EmbeddedWorkerInstance* instance, const GURL& script_url) | 220 StartTask(EmbeddedWorkerInstance* instance, |
| 221 const GURL& script_url, |
| 222 mojom::EmbeddedWorkerInstanceClientRequest request) |
215 : instance_(instance), | 223 : instance_(instance), |
| 224 request_(std::move(request)), |
216 state_(ProcessAllocationState::NOT_ALLOCATED), | 225 state_(ProcessAllocationState::NOT_ALLOCATED), |
217 is_installed_(false), | 226 is_installed_(false), |
218 started_during_browser_startup_(false), | 227 started_during_browser_startup_(false), |
219 weak_factory_(this) { | 228 weak_factory_(this) { |
220 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", "EmbeddedWorkerInstance::Start", | 229 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", "EmbeddedWorkerInstance::Start", |
221 this, "Script", script_url.spec()); | 230 this, "Script", script_url.spec()); |
222 } | 231 } |
223 | 232 |
224 ~StartTask() { | 233 ~StartTask() { |
225 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 234 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
(...skipping 21 matching lines...) Expand all Loading... |
247 // EmbeddedWorkerInstance::Start(), that is, ServiceWorkerVersion does not | 256 // EmbeddedWorkerInstance::Start(), that is, ServiceWorkerVersion does not |
248 // expect it when the start worker sequence is canceled by Stop() because | 257 // expect it when the start worker sequence is canceled by Stop() because |
249 // the callback, ServiceWorkerVersion::OnStartSentAndScriptEvaluated(), | 258 // the callback, ServiceWorkerVersion::OnStartSentAndScriptEvaluated(), |
250 // could drain valid start requests queued in the version. After the worker | 259 // could drain valid start requests queued in the version. After the worker |
251 // is stopped, the version attempts to restart the worker if there are | 260 // is stopped, the version attempts to restart the worker if there are |
252 // requests in the queue. See ServiceWorkerVersion::OnStoppedInternal() for | 261 // requests in the queue. See ServiceWorkerVersion::OnStoppedInternal() for |
253 // details. | 262 // details. |
254 // TODO(nhiroki): Reconsider this bizarre layering. | 263 // TODO(nhiroki): Reconsider this bizarre layering. |
255 } | 264 } |
256 | 265 |
257 void Start(std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, | 266 void Start(std::unique_ptr<EmbeddedWorkerStartParams> params, |
258 const StatusCallback& callback) { | 267 const StatusCallback& callback) { |
259 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 268 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
260 state_ = ProcessAllocationState::ALLOCATING; | 269 state_ = ProcessAllocationState::ALLOCATING; |
261 start_callback_ = callback; | 270 start_callback_ = callback; |
262 is_installed_ = params->is_installed; | 271 is_installed_ = params->is_installed; |
263 | 272 |
264 if (!GetContentClient()->browser()->IsBrowserStartupComplete()) | 273 if (!GetContentClient()->browser()->IsBrowserStartupComplete()) |
265 started_during_browser_startup_ = true; | 274 started_during_browser_startup_ = true; |
266 | 275 |
267 GURL scope(params->scope); | 276 GURL scope(params->scope); |
(...skipping 14 matching lines...) Expand all Loading... |
282 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 291 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
283 StatusCallback callback = task->start_callback_; | 292 StatusCallback callback = task->start_callback_; |
284 task->start_callback_.Reset(); | 293 task->start_callback_.Reset(); |
285 callback.Run(status); | 294 callback.Run(status); |
286 // |task| may be destroyed. | 295 // |task| may be destroyed. |
287 } | 296 } |
288 | 297 |
289 bool is_installed() const { return is_installed_; } | 298 bool is_installed() const { return is_installed_; } |
290 | 299 |
291 private: | 300 private: |
292 void OnProcessAllocated( | 301 void OnProcessAllocated(std::unique_ptr<EmbeddedWorkerStartParams> params, |
293 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, | 302 ServiceWorkerStatusCode status, |
294 ServiceWorkerStatusCode status, | 303 int process_id, |
295 int process_id, | 304 bool is_new_process, |
296 bool is_new_process, | 305 const EmbeddedWorkerSettings& settings) { |
297 const EmbeddedWorkerSettings& settings) { | |
298 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 306 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
299 | 307 |
300 if (status != SERVICE_WORKER_OK) { | 308 if (status != SERVICE_WORKER_OK) { |
301 TRACE_EVENT_ASYNC_STEP_PAST1( | 309 TRACE_EVENT_ASYNC_STEP_PAST1( |
302 "ServiceWorker", "EmbeddedWorkerInstance::Start", this, | 310 "ServiceWorker", "EmbeddedWorkerInstance::Start", this, |
303 "OnProcessAllocated", "Error", ServiceWorkerStatusToString(status)); | 311 "OnProcessAllocated", "Error", ServiceWorkerStatusToString(status)); |
304 DCHECK_EQ(ChildProcessHost::kInvalidUniqueID, process_id); | 312 DCHECK_EQ(ChildProcessHost::kInvalidUniqueID, process_id); |
305 StatusCallback callback = start_callback_; | 313 StatusCallback callback = start_callback_; |
306 start_callback_.Reset(); | 314 start_callback_.Reset(); |
307 instance_->OnStartFailed(callback, status); | 315 instance_->OnStartFailed(callback, status); |
(...skipping 27 matching lines...) Expand all Loading... |
335 // TODO(bengr): Support changes to this setting while the worker | 343 // TODO(bengr): Support changes to this setting while the worker |
336 // is running. | 344 // is running. |
337 params->settings.data_saver_enabled = settings.data_saver_enabled; | 345 params->settings.data_saver_enabled = settings.data_saver_enabled; |
338 | 346 |
339 // Register the instance to DevToolsManager on UI thread. | 347 // Register the instance to DevToolsManager on UI thread. |
340 const int64_t service_worker_version_id = params->service_worker_version_id; | 348 const int64_t service_worker_version_id = params->service_worker_version_id; |
341 const GURL& scope = params->scope; | 349 const GURL& scope = params->scope; |
342 GURL script_url(params->script_url); | 350 GURL script_url(params->script_url); |
343 BrowserThread::PostTask( | 351 BrowserThread::PostTask( |
344 BrowserThread::UI, FROM_HERE, | 352 BrowserThread::UI, FROM_HERE, |
345 base::Bind(RegisterToWorkerDevToolsManagerOnUI, process_id, | 353 base::Bind(&SetupOnUI, process_id, instance_->context_.get(), |
346 instance_->context_.get(), instance_->context_, | 354 instance_->context_, service_worker_version_id, script_url, |
347 service_worker_version_id, script_url, scope, is_installed_, | 355 scope, is_installed_, base::Passed(&request_), |
348 base::Bind(&StartTask::OnRegisteredToDevToolsManager, | 356 base::Bind(&StartTask::OnSetupOnUICompleted, |
349 weak_factory_.GetWeakPtr(), base::Passed(¶ms), | 357 weak_factory_.GetWeakPtr(), base::Passed(¶ms), |
350 is_new_process))); | 358 is_new_process))); |
351 } | 359 } |
352 | 360 |
353 void OnRegisteredToDevToolsManager( | 361 void OnSetupOnUICompleted(std::unique_ptr<EmbeddedWorkerStartParams> params, |
354 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, | 362 bool is_new_process, |
355 bool is_new_process, | 363 int worker_devtools_agent_route_id, |
356 int worker_devtools_agent_route_id, | 364 bool wait_for_debugger) { |
357 bool wait_for_debugger) { | |
358 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 365 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
359 TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker", | 366 TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker", |
360 "EmbeddedWorkerInstance::Start", this, | 367 "EmbeddedWorkerInstance::Start", this, |
361 "OnRegisteredToDevToolsManager"); | 368 "OnSetupOnUICompleted"); |
362 | 369 |
363 // Notify the instance that it is registered to the devtools manager. | 370 // Notify the instance that it is registered to the devtools manager. |
364 instance_->OnRegisteredToDevToolsManager( | 371 instance_->OnRegisteredToDevToolsManager( |
365 is_new_process, worker_devtools_agent_route_id, wait_for_debugger); | 372 is_new_process, worker_devtools_agent_route_id, wait_for_debugger); |
366 | 373 |
367 params->worker_devtools_agent_route_id = worker_devtools_agent_route_id; | 374 params->worker_devtools_agent_route_id = worker_devtools_agent_route_id; |
368 params->wait_for_debugger = wait_for_debugger; | 375 params->wait_for_debugger = wait_for_debugger; |
369 SendStartWorker(std::move(params)); | 376 |
| 377 if (ServiceWorkerUtils::IsMojoForServiceWorkerEnabled()) |
| 378 instance_->SendMojoStartWorker(std::move(params)); |
| 379 else |
| 380 SendStartWorker(std::move(params)); |
370 } | 381 } |
371 | 382 |
372 void SendStartWorker( | 383 void SendStartWorker(std::unique_ptr<EmbeddedWorkerStartParams> params) { |
373 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params) { | |
374 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 384 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
375 ServiceWorkerStatusCode status = instance_->registry_->SendStartWorker( | 385 ServiceWorkerStatusCode status = instance_->registry_->SendStartWorker( |
376 std::move(params), instance_->process_id()); | 386 std::move(params), instance_->process_id()); |
377 TRACE_EVENT_ASYNC_STEP_PAST1( | 387 TRACE_EVENT_ASYNC_STEP_PAST1( |
378 "ServiceWorker", "EmbeddedWorkerInstance::Start", this, | 388 "ServiceWorker", "EmbeddedWorkerInstance::Start", this, |
379 "SendStartWorker", "Status", ServiceWorkerStatusToString(status)); | 389 "SendStartWorker", "Status", ServiceWorkerStatusToString(status)); |
380 if (status != SERVICE_WORKER_OK) { | 390 if (status != SERVICE_WORKER_OK) { |
381 StatusCallback callback = start_callback_; | 391 StatusCallback callback = start_callback_; |
382 start_callback_.Reset(); | 392 start_callback_.Reset(); |
383 instance_->OnStartFailed(callback, status); | 393 instance_->OnStartFailed(callback, status); |
384 // |this| may be destroyed. | 394 // |this| may be destroyed. |
385 return; | 395 return; |
386 } | 396 } |
387 instance_->OnStartWorkerMessageSent(); | 397 instance_->OnStartWorkerMessageSent(); |
388 | 398 |
389 // |start_callback_| will be called via RunStartCallback() when the script | 399 // |start_callback_| will be called via RunStartCallback() when the script |
390 // is evaluated. | 400 // is evaluated. |
391 } | 401 } |
392 | 402 |
393 // |instance_| must outlive |this|. | 403 // |instance_| must outlive |this|. |
394 EmbeddedWorkerInstance* instance_; | 404 EmbeddedWorkerInstance* instance_; |
395 | 405 |
| 406 // Ownership is transferred by base::Passed() to a task after process |
| 407 // allocation. |
| 408 mojom::EmbeddedWorkerInstanceClientRequest request_; |
| 409 |
396 StatusCallback start_callback_; | 410 StatusCallback start_callback_; |
397 ProcessAllocationState state_; | 411 ProcessAllocationState state_; |
398 | 412 |
399 // Used for UMA. | 413 // Used for UMA. |
400 bool is_installed_; | 414 bool is_installed_; |
401 bool started_during_browser_startup_; | 415 bool started_during_browser_startup_; |
402 | 416 |
403 base::WeakPtrFactory<StartTask> weak_factory_; | 417 base::WeakPtrFactory<StartTask> weak_factory_; |
404 | 418 |
405 DISALLOW_COPY_AND_ASSIGN(StartTask); | 419 DISALLOW_COPY_AND_ASSIGN(StartTask); |
406 }; | 420 }; |
407 | 421 |
408 bool EmbeddedWorkerInstance::Listener::OnMessageReceived( | 422 bool EmbeddedWorkerInstance::Listener::OnMessageReceived( |
409 const IPC::Message& message) { | 423 const IPC::Message& message) { |
410 return false; | 424 return false; |
411 } | 425 } |
412 | 426 |
413 EmbeddedWorkerInstance::~EmbeddedWorkerInstance() { | 427 EmbeddedWorkerInstance::~EmbeddedWorkerInstance() { |
414 DCHECK(status_ == EmbeddedWorkerStatus::STOPPING || | 428 DCHECK(status_ == EmbeddedWorkerStatus::STOPPING || |
415 status_ == EmbeddedWorkerStatus::STOPPED) | 429 status_ == EmbeddedWorkerStatus::STOPPED) |
416 << static_cast<int>(status_); | 430 << static_cast<int>(status_); |
417 devtools_proxy_.reset(); | 431 devtools_proxy_.reset(); |
418 if (registry_->GetWorker(embedded_worker_id_)) | 432 if (registry_->GetWorker(embedded_worker_id_)) |
419 registry_->RemoveWorker(process_id(), embedded_worker_id_); | 433 registry_->RemoveWorker(process_id(), embedded_worker_id_); |
420 process_handle_.reset(); | 434 process_handle_.reset(); |
421 } | 435 } |
422 | 436 |
423 void EmbeddedWorkerInstance::Start( | 437 void EmbeddedWorkerInstance::Start( |
424 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, | 438 std::unique_ptr<EmbeddedWorkerStartParams> params, |
425 const StatusCallback& callback) { | 439 const StatusCallback& callback) { |
426 if (!context_) { | 440 if (!context_) { |
427 callback.Run(SERVICE_WORKER_ERROR_ABORT); | 441 callback.Run(SERVICE_WORKER_ERROR_ABORT); |
428 // |this| may be destroyed by the callback. | 442 // |this| may be destroyed by the callback. |
429 return; | 443 return; |
430 } | 444 } |
431 DCHECK(status_ == EmbeddedWorkerStatus::STOPPED); | 445 DCHECK(status_ == EmbeddedWorkerStatus::STOPPED); |
432 | 446 |
433 DCHECK(!params->pause_after_download || !params->is_installed); | 447 DCHECK(!params->pause_after_download || !params->is_installed); |
434 DCHECK_NE(kInvalidServiceWorkerVersionId, params->service_worker_version_id); | 448 DCHECK_NE(kInvalidServiceWorkerVersionId, params->service_worker_version_id); |
435 step_time_ = base::TimeTicks::Now(); | 449 step_time_ = base::TimeTicks::Now(); |
436 status_ = EmbeddedWorkerStatus::STARTING; | 450 status_ = EmbeddedWorkerStatus::STARTING; |
437 starting_phase_ = ALLOCATING_PROCESS; | 451 starting_phase_ = ALLOCATING_PROCESS; |
438 network_accessed_for_script_ = false; | 452 network_accessed_for_script_ = false; |
439 interface_registry_.reset(new shell::InterfaceRegistry); | 453 interface_registry_.reset(new shell::InterfaceRegistry); |
440 remote_interfaces_.reset(new shell::InterfaceProvider); | 454 remote_interfaces_.reset(new shell::InterfaceProvider); |
441 FOR_EACH_OBSERVER(Listener, listener_list_, OnStarting()); | 455 FOR_EACH_OBSERVER(Listener, listener_list_, OnStarting()); |
442 | 456 |
443 params->embedded_worker_id = embedded_worker_id_; | 457 params->embedded_worker_id = embedded_worker_id_; |
444 params->worker_devtools_agent_route_id = MSG_ROUTING_NONE; | 458 params->worker_devtools_agent_route_id = MSG_ROUTING_NONE; |
445 params->wait_for_debugger = false; | 459 params->wait_for_debugger = false; |
446 params->settings.v8_cache_options = GetV8CacheOptions(); | 460 params->settings.v8_cache_options = GetV8CacheOptions(); |
447 | 461 |
448 inflight_start_task_.reset(new StartTask(this, params->script_url)); | 462 mojom::EmbeddedWorkerInstanceClientRequest request; |
| 463 if (ServiceWorkerUtils::IsMojoForServiceWorkerEnabled()) |
| 464 request = mojo::GetProxy(&client_); |
| 465 |
| 466 inflight_start_task_.reset( |
| 467 new StartTask(this, params->script_url, std::move(request))); |
449 inflight_start_task_->Start(std::move(params), callback); | 468 inflight_start_task_->Start(std::move(params), callback); |
450 } | 469 } |
451 | 470 |
452 ServiceWorkerStatusCode EmbeddedWorkerInstance::Stop() { | 471 ServiceWorkerStatusCode EmbeddedWorkerInstance::Stop() { |
453 DCHECK(status_ == EmbeddedWorkerStatus::STARTING || | 472 DCHECK(status_ == EmbeddedWorkerStatus::STARTING || |
454 status_ == EmbeddedWorkerStatus::RUNNING) | 473 status_ == EmbeddedWorkerStatus::RUNNING) |
455 << static_cast<int>(status_); | 474 << static_cast<int>(status_); |
456 | 475 |
457 // Abort an inflight start task. | 476 // Abort an inflight start task. |
458 inflight_start_task_.reset(); | 477 inflight_start_task_.reset(); |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 devtools_proxy_.reset( | 577 devtools_proxy_.reset( |
559 new DevToolsProxy(process_id(), worker_devtools_agent_route_id)); | 578 new DevToolsProxy(process_id(), worker_devtools_agent_route_id)); |
560 } | 579 } |
561 if (wait_for_debugger) { | 580 if (wait_for_debugger) { |
562 // We don't measure the start time when wait_for_debugger flag is set. So | 581 // We don't measure the start time when wait_for_debugger flag is set. So |
563 // we set the NULL time here. | 582 // we set the NULL time here. |
564 step_time_ = base::TimeTicks(); | 583 step_time_ = base::TimeTicks(); |
565 } | 584 } |
566 } | 585 } |
567 | 586 |
| 587 void EmbeddedWorkerInstance::SendMojoStartWorker( |
| 588 std::unique_ptr<EmbeddedWorkerStartParams> params) { |
| 589 client_->StartWorker(*params); |
| 590 registry_->BindWorkerToProcess(process_id(), embedded_worker_id()); |
| 591 TRACE_EVENT_ASYNC_STEP_PAST1("ServiceWorker", "EmbeddedWorkerInstance::Start", |
| 592 this, "SendStartWorker", "Status", "mojo"); |
| 593 OnStartWorkerMessageSent(); |
| 594 } |
| 595 |
568 void EmbeddedWorkerInstance::OnStartWorkerMessageSent() { | 596 void EmbeddedWorkerInstance::OnStartWorkerMessageSent() { |
569 if (!step_time_.is_null()) { | 597 if (!step_time_.is_null()) { |
570 base::TimeDelta duration = UpdateStepTime(); | 598 base::TimeDelta duration = UpdateStepTime(); |
571 if (inflight_start_task_->is_installed()) { | 599 if (inflight_start_task_->is_installed()) { |
572 ServiceWorkerMetrics::RecordTimeToSendStartWorker(duration, | 600 ServiceWorkerMetrics::RecordTimeToSendStartWorker(duration, |
573 start_situation_); | 601 start_situation_); |
574 } | 602 } |
575 } | 603 } |
576 | 604 |
577 starting_phase_ = SENT_START_WORKER; | 605 starting_phase_ = SENT_START_WORKER; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
652 if (!step_time_.is_null()) { | 680 if (!step_time_.is_null()) { |
653 base::TimeDelta duration = UpdateStepTime(); | 681 base::TimeDelta duration = UpdateStepTime(); |
654 if (inflight_start_task_->is_installed()) | 682 if (inflight_start_task_->is_installed()) |
655 ServiceWorkerMetrics::RecordTimeToStartThread(duration, start_situation_); | 683 ServiceWorkerMetrics::RecordTimeToStartThread(duration, start_situation_); |
656 } | 684 } |
657 | 685 |
658 thread_id_ = thread_id; | 686 thread_id_ = thread_id; |
659 FOR_EACH_OBSERVER(Listener, listener_list_, OnThreadStarted()); | 687 FOR_EACH_OBSERVER(Listener, listener_list_, OnThreadStarted()); |
660 | 688 |
661 shell::mojom::InterfaceProviderPtr exposed_interfaces; | 689 shell::mojom::InterfaceProviderPtr exposed_interfaces; |
662 interface_registry_->Bind(GetProxy(&exposed_interfaces)); | 690 interface_registry_->Bind(mojo::GetProxy(&exposed_interfaces)); |
663 shell::mojom::InterfaceProviderPtr remote_interfaces; | 691 shell::mojom::InterfaceProviderPtr remote_interfaces; |
664 shell::mojom::InterfaceProviderRequest request = GetProxy(&remote_interfaces); | 692 shell::mojom::InterfaceProviderRequest request = |
| 693 mojo::GetProxy(&remote_interfaces); |
665 remote_interfaces_->Bind(std::move(remote_interfaces)); | 694 remote_interfaces_->Bind(std::move(remote_interfaces)); |
666 BrowserThread::PostTask( | 695 BrowserThread::PostTask( |
667 BrowserThread::UI, FROM_HERE, | 696 BrowserThread::UI, FROM_HERE, |
668 base::Bind(SetupMojoOnUIThread, process_id(), thread_id_, | 697 base::Bind(SetupMojoOnUIThread, process_id(), thread_id_, |
669 base::Passed(&request), | 698 base::Passed(&request), |
670 base::Passed(exposed_interfaces.PassInterface()))); | 699 base::Passed(exposed_interfaces.PassInterface()))); |
671 } | 700 } |
672 | 701 |
673 void EmbeddedWorkerInstance::OnScriptLoadFailed() { | 702 void EmbeddedWorkerInstance::OnScriptLoadFailed() { |
674 if (!inflight_start_task_) | 703 if (!inflight_start_task_) |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
885 case SCRIPT_READ_FINISHED: | 914 case SCRIPT_READ_FINISHED: |
886 return "Script read finished"; | 915 return "Script read finished"; |
887 case STARTING_PHASE_MAX_VALUE: | 916 case STARTING_PHASE_MAX_VALUE: |
888 NOTREACHED(); | 917 NOTREACHED(); |
889 } | 918 } |
890 NOTREACHED() << phase; | 919 NOTREACHED() << phase; |
891 return std::string(); | 920 return std::string(); |
892 } | 921 } |
893 | 922 |
894 } // namespace content | 923 } // namespace content |
OLD | NEW |