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

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

Issue 2378073002: Reland of ServiceWorker: Implement StartWorker by using mojo (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 2 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/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
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
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
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
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
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(&params), 357 weak_factory_.GetWeakPtr(), base::Passed(&params),
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698