| 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 |