Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Side by Side Diff: content/browser/service_worker/embedded_worker_instance.cc

Issue 2227593002: ServiceWorker: Implement StartWorker by using mojo (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added argument check and updated comment and BUILD.gn Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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(&params), 356 base::Passed(&request_),
350 is_new_process))); 357 base::Bind(
358 &StartTask::OnRegisteredToDevToolsManagerAndBoundInterface,
359 weak_factory_.GetWeakPtr(), base::Passed(&params),
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698