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