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/service_worker_types.h" | 23 #include "content/common/service_worker/service_worker_types.h" |
24 #include "content/common/service_worker/service_worker_utils.h" | |
24 #include "content/public/browser/browser_thread.h" | 25 #include "content/public/browser/browser_thread.h" |
25 #include "content/public/browser/content_browser_client.h" | 26 #include "content/public/browser/content_browser_client.h" |
26 #include "content/public/browser/render_process_host.h" | 27 #include "content/public/browser/render_process_host.h" |
27 #include "content/public/common/child_process_host.h" | 28 #include "content/public/common/child_process_host.h" |
29 #include "content/public/common/content_switches.h" | |
28 #include "ipc/ipc_message.h" | 30 #include "ipc/ipc_message.h" |
29 #include "services/shell/public/cpp/interface_provider.h" | 31 #include "services/shell/public/cpp/interface_provider.h" |
30 #include "services/shell/public/cpp/interface_registry.h" | 32 #include "services/shell/public/cpp/interface_registry.h" |
31 #include "url/gurl.h" | 33 #include "url/gurl.h" |
32 | 34 |
33 namespace content { | 35 namespace content { |
34 | 36 |
35 namespace { | 37 namespace { |
36 | 38 |
37 // When a service worker version's failure count exceeds | 39 // When a service worker version's failure count exceeds |
(...skipping 24 matching lines...) Expand all Loading... | |
62 ServiceWorkerDevToolsManager::GetInstance()->WorkerVersionInstalled( | 64 ServiceWorkerDevToolsManager::GetInstance()->WorkerVersionInstalled( |
63 worker_process_id, worker_route_id); | 65 worker_process_id, worker_route_id); |
64 } | 66 } |
65 | 67 |
66 void NotifyWorkerVersionDoomedOnUI(int worker_process_id, int worker_route_id) { | 68 void NotifyWorkerVersionDoomedOnUI(int worker_process_id, int worker_route_id) { |
67 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 69 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
68 ServiceWorkerDevToolsManager::GetInstance()->WorkerVersionDoomed( | 70 ServiceWorkerDevToolsManager::GetInstance()->WorkerVersionDoomed( |
69 worker_process_id, worker_route_id); | 71 worker_process_id, worker_route_id); |
70 } | 72 } |
71 | 73 |
72 void RegisterToWorkerDevToolsManagerOnUI( | 74 void RegisterToWorkerDevToolsManagerAndBindInterfaceOnUI( |
falken
2016/09/07 05:01:41
These are now two pretty unrelated tasks. Maybe ju
shimazu
2016/09/12 06:28:19
Done.
| |
73 int process_id, | 75 int process_id, |
74 const ServiceWorkerContextCore* service_worker_context, | 76 const ServiceWorkerContextCore* service_worker_context, |
75 const base::WeakPtr<ServiceWorkerContextCore>& service_worker_context_weak, | 77 const base::WeakPtr<ServiceWorkerContextCore>& service_worker_context_weak, |
76 int64_t service_worker_version_id, | 78 int64_t service_worker_version_id, |
77 const GURL& url, | 79 const GURL& url, |
78 const GURL& scope, | 80 const GURL& scope, |
79 bool is_installed, | 81 bool is_installed, |
82 mojom::EmbeddedWorkerInstanceClientRequest request, | |
80 const base::Callback<void(int worker_devtools_agent_route_id, | 83 const base::Callback<void(int worker_devtools_agent_route_id, |
81 bool wait_for_debugger)>& callback) { | 84 bool wait_for_debugger)>& callback) { |
82 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 85 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
83 int worker_devtools_agent_route_id = MSG_ROUTING_NONE; | 86 int worker_devtools_agent_route_id = MSG_ROUTING_NONE; |
84 bool wait_for_debugger = false; | 87 bool wait_for_debugger = false; |
85 if (RenderProcessHost* rph = RenderProcessHost::FromID(process_id)) { | 88 if (RenderProcessHost* rph = RenderProcessHost::FromID(process_id)) { |
86 // |rph| may be NULL in unit tests. | 89 // |rph| may be NULL in unit tests. |
87 worker_devtools_agent_route_id = rph->GetNextRoutingID(); | 90 worker_devtools_agent_route_id = rph->GetNextRoutingID(); |
88 wait_for_debugger = | 91 wait_for_debugger = |
89 ServiceWorkerDevToolsManager::GetInstance()->WorkerCreated( | 92 ServiceWorkerDevToolsManager::GetInstance()->WorkerCreated( |
90 process_id, worker_devtools_agent_route_id, | 93 process_id, worker_devtools_agent_route_id, |
91 ServiceWorkerDevToolsManager::ServiceWorkerIdentifier( | 94 ServiceWorkerDevToolsManager::ServiceWorkerIdentifier( |
92 service_worker_context, service_worker_context_weak, | 95 service_worker_context, service_worker_context_weak, |
93 service_worker_version_id, url, scope), | 96 service_worker_version_id, url, scope), |
94 is_installed); | 97 is_installed); |
98 rph->GetRemoteInterfaces()->GetInterface(std::move(request)); | |
95 } | 99 } |
96 BrowserThread::PostTask( | 100 BrowserThread::PostTask( |
97 BrowserThread::IO, | 101 BrowserThread::IO, |
98 FROM_HERE, | 102 FROM_HERE, |
99 base::Bind(callback, worker_devtools_agent_route_id, wait_for_debugger)); | 103 base::Bind(callback, worker_devtools_agent_route_id, wait_for_debugger)); |
100 } | 104 } |
101 | 105 |
102 void SetupMojoOnUIThread( | 106 void SetupMojoOnUIThread( |
103 int process_id, | 107 int process_id, |
104 int thread_id, | 108 int thread_id, |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
204 | 208 |
205 // A task to allocate a worker process and to send a start worker message. This | 209 // 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 | 210 // is created on EmbeddedWorkerInstance::Start(), owned by the instance and |
207 // destroyed on EmbeddedWorkerInstance::OnScriptEvaluated(). | 211 // destroyed on EmbeddedWorkerInstance::OnScriptEvaluated(). |
208 // We can abort starting worker by destroying this task anytime during the | 212 // We can abort starting worker by destroying this task anytime during the |
209 // sequence. | 213 // sequence. |
210 class EmbeddedWorkerInstance::StartTask { | 214 class EmbeddedWorkerInstance::StartTask { |
211 public: | 215 public: |
212 enum class ProcessAllocationState { NOT_ALLOCATED, ALLOCATING, ALLOCATED }; | 216 enum class ProcessAllocationState { NOT_ALLOCATED, ALLOCATING, ALLOCATED }; |
213 | 217 |
214 StartTask(EmbeddedWorkerInstance* instance, const GURL& script_url) | 218 StartTask(EmbeddedWorkerInstance* instance, |
219 const GURL& script_url, | |
220 mojom::EmbeddedWorkerInstanceClientRequest request) | |
215 : instance_(instance), | 221 : instance_(instance), |
222 request_(std::move(request)), | |
216 state_(ProcessAllocationState::NOT_ALLOCATED), | 223 state_(ProcessAllocationState::NOT_ALLOCATED), |
217 is_installed_(false), | 224 is_installed_(false), |
218 started_during_browser_startup_(false), | 225 started_during_browser_startup_(false), |
219 weak_factory_(this) { | 226 weak_factory_(this) { |
220 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", "EmbeddedWorkerInstance::Start", | 227 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", "EmbeddedWorkerInstance::Start", |
221 this, "Script", script_url.spec()); | 228 this, "Script", script_url.spec()); |
222 } | 229 } |
223 | 230 |
224 ~StartTask() { | 231 ~StartTask() { |
225 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 232 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
335 // TODO(bengr): Support changes to this setting while the worker | 342 // TODO(bengr): Support changes to this setting while the worker |
336 // is running. | 343 // is running. |
337 params->settings.data_saver_enabled = settings.data_saver_enabled; | 344 params->settings.data_saver_enabled = settings.data_saver_enabled; |
338 | 345 |
339 // Register the instance to DevToolsManager on UI thread. | 346 // Register the instance to DevToolsManager on UI thread. |
340 const int64_t service_worker_version_id = params->service_worker_version_id; | 347 const int64_t service_worker_version_id = params->service_worker_version_id; |
341 const GURL& scope = params->scope; | 348 const GURL& scope = params->scope; |
342 GURL script_url(params->script_url); | 349 GURL script_url(params->script_url); |
343 BrowserThread::PostTask( | 350 BrowserThread::PostTask( |
344 BrowserThread::UI, FROM_HERE, | 351 BrowserThread::UI, FROM_HERE, |
345 base::Bind(RegisterToWorkerDevToolsManagerOnUI, process_id, | 352 base::Bind( |
346 instance_->context_.get(), instance_->context_, | 353 RegisterToWorkerDevToolsManagerAndBindInterfaceOnUI, process_id, |
347 service_worker_version_id, script_url, scope, is_installed_, | 354 instance_->context_.get(), instance_->context_, |
348 base::Bind(&StartTask::OnRegisteredToDevToolsManager, | 355 service_worker_version_id, script_url, scope, is_installed_, |
349 weak_factory_.GetWeakPtr(), base::Passed(¶ms), | 356 base::Passed(&request_), |
350 is_new_process))); | 357 base::Bind( |
358 &StartTask::OnRegisteredToDevToolsManagerAndBoundInterface, | |
359 weak_factory_.GetWeakPtr(), base::Passed(¶ms), | |
360 is_new_process))); | |
351 } | 361 } |
352 | 362 |
353 void OnRegisteredToDevToolsManager( | 363 void OnRegisteredToDevToolsManagerAndBoundInterface( |
354 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, | 364 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, |
355 bool is_new_process, | 365 bool is_new_process, |
356 int worker_devtools_agent_route_id, | 366 int worker_devtools_agent_route_id, |
357 bool wait_for_debugger) { | 367 bool wait_for_debugger) { |
358 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 368 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
359 TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker", | 369 TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker", |
360 "EmbeddedWorkerInstance::Start", this, | 370 "EmbeddedWorkerInstance::Start", this, |
361 "OnRegisteredToDevToolsManager"); | 371 "OnRegisteredToDevToolsManager"); |
362 | 372 |
363 // Notify the instance that it is registered to the devtools manager. | 373 // Notify the instance that it is registered to the devtools manager. |
364 instance_->OnRegisteredToDevToolsManager( | 374 instance_->OnRegisteredToDevToolsManager( |
365 is_new_process, worker_devtools_agent_route_id, wait_for_debugger); | 375 is_new_process, worker_devtools_agent_route_id, wait_for_debugger); |
366 | 376 |
367 params->worker_devtools_agent_route_id = worker_devtools_agent_route_id; | 377 params->worker_devtools_agent_route_id = worker_devtools_agent_route_id; |
368 params->wait_for_debugger = wait_for_debugger; | 378 params->wait_for_debugger = wait_for_debugger; |
369 SendStartWorker(std::move(params)); | 379 |
380 if (ServiceWorkerUtils::IsMojoForServiceWorkerEnabled()) | |
381 instance_->SendMojoStartWorker(std::move(params)); | |
382 else | |
383 SendStartWorker(std::move(params)); | |
370 } | 384 } |
371 | 385 |
372 void SendStartWorker( | 386 void SendStartWorker( |
373 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params) { | 387 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params) { |
374 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 388 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
375 ServiceWorkerStatusCode status = instance_->registry_->SendStartWorker( | 389 ServiceWorkerStatusCode status = instance_->registry_->SendStartWorker( |
376 std::move(params), instance_->process_id()); | 390 std::move(params), instance_->process_id()); |
377 TRACE_EVENT_ASYNC_STEP_PAST1( | 391 TRACE_EVENT_ASYNC_STEP_PAST1( |
378 "ServiceWorker", "EmbeddedWorkerInstance::Start", this, | 392 "ServiceWorker", "EmbeddedWorkerInstance::Start", this, |
379 "SendStartWorker", "Status", ServiceWorkerStatusToString(status)); | 393 "SendStartWorker", "Status", ServiceWorkerStatusToString(status)); |
380 if (status != SERVICE_WORKER_OK) { | 394 if (status != SERVICE_WORKER_OK) { |
381 StatusCallback callback = start_callback_; | 395 StatusCallback callback = start_callback_; |
382 start_callback_.Reset(); | 396 start_callback_.Reset(); |
383 instance_->OnStartFailed(callback, status); | 397 instance_->OnStartFailed(callback, status); |
384 // |this| may be destroyed. | 398 // |this| may be destroyed. |
385 return; | 399 return; |
386 } | 400 } |
387 instance_->OnStartWorkerMessageSent(); | 401 instance_->OnStartWorkerMessageSent(); |
388 | 402 |
389 // |start_callback_| will be called via RunStartCallback() when the script | 403 // |start_callback_| will be called via RunStartCallback() when the script |
390 // is evaluated. | 404 // is evaluated. |
391 } | 405 } |
392 | 406 |
393 // |instance_| must outlive |this|. | 407 // |instance_| must outlive |this|. |
394 EmbeddedWorkerInstance* instance_; | 408 EmbeddedWorkerInstance* instance_; |
409 mojom::EmbeddedWorkerInstanceClientRequest request_; | |
395 | 410 |
396 StatusCallback start_callback_; | 411 StatusCallback start_callback_; |
397 ProcessAllocationState state_; | 412 ProcessAllocationState state_; |
398 | 413 |
399 // Used for UMA. | 414 // Used for UMA. |
400 bool is_installed_; | 415 bool is_installed_; |
401 bool started_during_browser_startup_; | 416 bool started_during_browser_startup_; |
402 | 417 |
403 base::WeakPtrFactory<StartTask> weak_factory_; | 418 base::WeakPtrFactory<StartTask> weak_factory_; |
404 | 419 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
438 network_accessed_for_script_ = false; | 453 network_accessed_for_script_ = false; |
439 interface_registry_.reset(new shell::InterfaceRegistry); | 454 interface_registry_.reset(new shell::InterfaceRegistry); |
440 remote_interfaces_.reset(new shell::InterfaceProvider); | 455 remote_interfaces_.reset(new shell::InterfaceProvider); |
441 FOR_EACH_OBSERVER(Listener, listener_list_, OnStarting()); | 456 FOR_EACH_OBSERVER(Listener, listener_list_, OnStarting()); |
442 | 457 |
443 params->embedded_worker_id = embedded_worker_id_; | 458 params->embedded_worker_id = embedded_worker_id_; |
444 params->worker_devtools_agent_route_id = MSG_ROUTING_NONE; | 459 params->worker_devtools_agent_route_id = MSG_ROUTING_NONE; |
445 params->wait_for_debugger = false; | 460 params->wait_for_debugger = false; |
446 params->settings.v8_cache_options = GetV8CacheOptions(); | 461 params->settings.v8_cache_options = GetV8CacheOptions(); |
447 | 462 |
448 inflight_start_task_.reset(new StartTask(this, params->script_url)); | 463 mojom::EmbeddedWorkerInstanceClientRequest request = |
464 GetProxy(&instance_client_); | |
falken
2016/09/07 05:01:41
Where is GetProxy from? should this be mojo::GetPr
shimazu
2016/09/12 06:28:19
Done.
| |
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<EmbeddedWorkerMsg_StartWorker_Params> params) { | |
589 auto mojo_params = mojom::EmbeddedWorkerStartWorkerParams::New(); | |
dcheng
2016/09/07 07:51:09
It might be slightly simpler to just declare Embed
shimazu
2016/09/12 06:28:19
Done.
| |
590 mojo_params->embedded_worker_id = params->embedded_worker_id; | |
591 mojo_params->service_worker_version_id = params->service_worker_version_id; | |
592 mojo_params->scope = params->scope; | |
593 mojo_params->script_url = params->script_url; | |
594 mojo_params->worker_devtools_agent_route_id = | |
595 params->worker_devtools_agent_route_id; | |
596 mojo_params->pause_after_download = params->pause_after_download; | |
597 mojo_params->wait_for_debugger = params->wait_for_debugger; | |
598 mojo_params->is_installed = params->is_installed; | |
599 | |
600 mojo_params->settings = mojom::EmbeddedWorkerSettings::New(); | |
601 mojo_params->settings->data_saver_enabled = | |
602 params->settings.data_saver_enabled; | |
603 mojo_params->settings->v8_cache_options = | |
604 static_cast<mojom::V8CacheOptions>(params->settings.v8_cache_options); | |
605 | |
606 instance_client_->StartWorker(std::move(mojo_params)); | |
607 registry_->AddWorker(process_id(), embedded_worker_id()); | |
falken
2016/09/07 05:01:41
The registry already holds all workers, even ones
shimazu
2016/09/12 06:28:19
Done.
| |
608 TRACE_EVENT_ASYNC_STEP_PAST1("ServiceWorker", "EmbeddedWorkerInstance::Start", | |
609 this, "SendStartWorker", "Status", "mojo"); | |
610 OnStartWorkerMessageSent(); | |
611 return; | |
612 } | |
613 | |
568 void EmbeddedWorkerInstance::OnStartWorkerMessageSent() { | 614 void EmbeddedWorkerInstance::OnStartWorkerMessageSent() { |
569 if (!step_time_.is_null()) { | 615 if (!step_time_.is_null()) { |
570 base::TimeDelta duration = UpdateStepTime(); | 616 base::TimeDelta duration = UpdateStepTime(); |
571 if (inflight_start_task_->is_installed()) { | 617 if (inflight_start_task_->is_installed()) { |
572 ServiceWorkerMetrics::RecordTimeToSendStartWorker(duration, | 618 ServiceWorkerMetrics::RecordTimeToSendStartWorker(duration, |
573 start_situation_); | 619 start_situation_); |
574 } | 620 } |
575 } | 621 } |
576 | 622 |
577 starting_phase_ = SENT_START_WORKER; | 623 starting_phase_ = SENT_START_WORKER; |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
885 case SCRIPT_READ_FINISHED: | 931 case SCRIPT_READ_FINISHED: |
886 return "Script read finished"; | 932 return "Script read finished"; |
887 case STARTING_PHASE_MAX_VALUE: | 933 case STARTING_PHASE_MAX_VALUE: |
888 NOTREACHED(); | 934 NOTREACHED(); |
889 } | 935 } |
890 NOTREACHED() << phase; | 936 NOTREACHED() << phase; |
891 return std::string(); | 937 return std::string(); |
892 } | 938 } |
893 | 939 |
894 } // namespace content | 940 } // namespace content |
OLD | NEW |