| 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" |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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(¶ms), | 357 weak_factory_.GetWeakPtr(), base::Passed(¶ms), |
| 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 Loading... |
| 558 devtools_proxy_.reset( | 577 devtools_proxy_.reset( |
| 559 new DevToolsProxy(process_id(), worker_devtools_agent_route_id)); | 578 new DevToolsProxy(process_id(), worker_devtools_agent_route_id)); |
| 560 } | 579 } |
| 561 if (wait_for_debugger) { | 580 if (wait_for_debugger) { |
| 562 // We don't measure the start time when wait_for_debugger flag is set. So | 581 // We don't measure the start time when wait_for_debugger flag is set. So |
| 563 // we set the NULL time here. | 582 // we set the NULL time here. |
| 564 step_time_ = base::TimeTicks(); | 583 step_time_ = base::TimeTicks(); |
| 565 } | 584 } |
| 566 } | 585 } |
| 567 | 586 |
| 587 void EmbeddedWorkerInstance::SendMojoStartWorker( |
| 588 std::unique_ptr<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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |