Chromium Code Reviews| 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/service_worker_types.h" | 23 #include "content/common/service_worker/service_worker_types.h" |
| 24 #include "content/common/service_worker/service_worker_utils.h" | |
| 24 #include "content/public/browser/browser_thread.h" | 25 #include "content/public/browser/browser_thread.h" |
| 25 #include "content/public/browser/content_browser_client.h" | 26 #include "content/public/browser/content_browser_client.h" |
| 26 #include "content/public/browser/render_process_host.h" | 27 #include "content/public/browser/render_process_host.h" |
| 27 #include "content/public/common/child_process_host.h" | 28 #include "content/public/common/child_process_host.h" |
| 29 #include "content/public/common/content_switches.h" | |
| 28 #include "ipc/ipc_message.h" | 30 #include "ipc/ipc_message.h" |
| 29 #include "services/shell/public/cpp/interface_provider.h" | 31 #include "services/shell/public/cpp/interface_provider.h" |
| 30 #include "services/shell/public/cpp/interface_registry.h" | 32 #include "services/shell/public/cpp/interface_registry.h" |
| 31 #include "url/gurl.h" | 33 #include "url/gurl.h" |
| 32 | 34 |
| 33 namespace content { | 35 namespace content { |
| 34 | 36 |
| 35 namespace { | 37 namespace { |
| 36 | 38 |
| 37 // When a service worker version's failure count exceeds | 39 // When a service worker version's failure count exceeds |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 62 ServiceWorkerDevToolsManager::GetInstance()->WorkerVersionInstalled( | 64 ServiceWorkerDevToolsManager::GetInstance()->WorkerVersionInstalled( |
| 63 worker_process_id, worker_route_id); | 65 worker_process_id, worker_route_id); |
| 64 } | 66 } |
| 65 | 67 |
| 66 void NotifyWorkerVersionDoomedOnUI(int worker_process_id, int worker_route_id) { | 68 void NotifyWorkerVersionDoomedOnUI(int worker_process_id, int worker_route_id) { |
| 67 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 69 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 68 ServiceWorkerDevToolsManager::GetInstance()->WorkerVersionDoomed( | 70 ServiceWorkerDevToolsManager::GetInstance()->WorkerVersionDoomed( |
| 69 worker_process_id, worker_route_id); | 71 worker_process_id, worker_route_id); |
| 70 } | 72 } |
| 71 | 73 |
| 72 void RegisterToWorkerDevToolsManagerOnUI( | 74 void RegisterToWorkerDevToolsManagerAndBindInterfaceOnUI( |
|
falken
2016/09/07 05:01:41
These are now two pretty unrelated tasks. Maybe ju
shimazu
2016/09/12 06:28:19
Done.
| |
| 73 int process_id, | 75 int process_id, |
| 74 const ServiceWorkerContextCore* service_worker_context, | 76 const ServiceWorkerContextCore* service_worker_context, |
| 75 const base::WeakPtr<ServiceWorkerContextCore>& service_worker_context_weak, | 77 const base::WeakPtr<ServiceWorkerContextCore>& service_worker_context_weak, |
| 76 int64_t service_worker_version_id, | 78 int64_t service_worker_version_id, |
| 77 const GURL& url, | 79 const GURL& url, |
| 78 const GURL& scope, | 80 const GURL& scope, |
| 79 bool is_installed, | 81 bool is_installed, |
| 82 mojom::EmbeddedWorkerInstanceClientRequest request, | |
| 80 const base::Callback<void(int worker_devtools_agent_route_id, | 83 const base::Callback<void(int worker_devtools_agent_route_id, |
| 81 bool wait_for_debugger)>& callback) { | 84 bool wait_for_debugger)>& callback) { |
| 82 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 85 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 83 int worker_devtools_agent_route_id = MSG_ROUTING_NONE; | 86 int worker_devtools_agent_route_id = MSG_ROUTING_NONE; |
| 84 bool wait_for_debugger = false; | 87 bool wait_for_debugger = false; |
| 85 if (RenderProcessHost* rph = RenderProcessHost::FromID(process_id)) { | 88 if (RenderProcessHost* rph = RenderProcessHost::FromID(process_id)) { |
| 86 // |rph| may be NULL in unit tests. | 89 // |rph| may be NULL in unit tests. |
| 87 worker_devtools_agent_route_id = rph->GetNextRoutingID(); | 90 worker_devtools_agent_route_id = rph->GetNextRoutingID(); |
| 88 wait_for_debugger = | 91 wait_for_debugger = |
| 89 ServiceWorkerDevToolsManager::GetInstance()->WorkerCreated( | 92 ServiceWorkerDevToolsManager::GetInstance()->WorkerCreated( |
| 90 process_id, worker_devtools_agent_route_id, | 93 process_id, worker_devtools_agent_route_id, |
| 91 ServiceWorkerDevToolsManager::ServiceWorkerIdentifier( | 94 ServiceWorkerDevToolsManager::ServiceWorkerIdentifier( |
| 92 service_worker_context, service_worker_context_weak, | 95 service_worker_context, service_worker_context_weak, |
| 93 service_worker_version_id, url, scope), | 96 service_worker_version_id, url, scope), |
| 94 is_installed); | 97 is_installed); |
| 98 rph->GetRemoteInterfaces()->GetInterface(std::move(request)); | |
| 95 } | 99 } |
| 96 BrowserThread::PostTask( | 100 BrowserThread::PostTask( |
| 97 BrowserThread::IO, | 101 BrowserThread::IO, |
| 98 FROM_HERE, | 102 FROM_HERE, |
| 99 base::Bind(callback, worker_devtools_agent_route_id, wait_for_debugger)); | 103 base::Bind(callback, worker_devtools_agent_route_id, wait_for_debugger)); |
| 100 } | 104 } |
| 101 | 105 |
| 102 void SetupMojoOnUIThread( | 106 void SetupMojoOnUIThread( |
| 103 int process_id, | 107 int process_id, |
| 104 int thread_id, | 108 int thread_id, |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 204 | 208 |
| 205 // A task to allocate a worker process and to send a start worker message. This | 209 // A task to allocate a worker process and to send a start worker message. This |
| 206 // is created on EmbeddedWorkerInstance::Start(), owned by the instance and | 210 // is created on EmbeddedWorkerInstance::Start(), owned by the instance and |
| 207 // destroyed on EmbeddedWorkerInstance::OnScriptEvaluated(). | 211 // destroyed on EmbeddedWorkerInstance::OnScriptEvaluated(). |
| 208 // We can abort starting worker by destroying this task anytime during the | 212 // We can abort starting worker by destroying this task anytime during the |
| 209 // sequence. | 213 // sequence. |
| 210 class EmbeddedWorkerInstance::StartTask { | 214 class EmbeddedWorkerInstance::StartTask { |
| 211 public: | 215 public: |
| 212 enum class ProcessAllocationState { NOT_ALLOCATED, ALLOCATING, ALLOCATED }; | 216 enum class ProcessAllocationState { NOT_ALLOCATED, ALLOCATING, ALLOCATED }; |
| 213 | 217 |
| 214 StartTask(EmbeddedWorkerInstance* instance, const GURL& script_url) | 218 StartTask(EmbeddedWorkerInstance* instance, |
| 219 const GURL& script_url, | |
| 220 mojom::EmbeddedWorkerInstanceClientRequest request) | |
| 215 : instance_(instance), | 221 : instance_(instance), |
| 222 request_(std::move(request)), | |
| 216 state_(ProcessAllocationState::NOT_ALLOCATED), | 223 state_(ProcessAllocationState::NOT_ALLOCATED), |
| 217 is_installed_(false), | 224 is_installed_(false), |
| 218 started_during_browser_startup_(false), | 225 started_during_browser_startup_(false), |
| 219 weak_factory_(this) { | 226 weak_factory_(this) { |
| 220 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", "EmbeddedWorkerInstance::Start", | 227 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", "EmbeddedWorkerInstance::Start", |
| 221 this, "Script", script_url.spec()); | 228 this, "Script", script_url.spec()); |
| 222 } | 229 } |
| 223 | 230 |
| 224 ~StartTask() { | 231 ~StartTask() { |
| 225 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 232 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 335 // TODO(bengr): Support changes to this setting while the worker | 342 // TODO(bengr): Support changes to this setting while the worker |
| 336 // is running. | 343 // is running. |
| 337 params->settings.data_saver_enabled = settings.data_saver_enabled; | 344 params->settings.data_saver_enabled = settings.data_saver_enabled; |
| 338 | 345 |
| 339 // Register the instance to DevToolsManager on UI thread. | 346 // Register the instance to DevToolsManager on UI thread. |
| 340 const int64_t service_worker_version_id = params->service_worker_version_id; | 347 const int64_t service_worker_version_id = params->service_worker_version_id; |
| 341 const GURL& scope = params->scope; | 348 const GURL& scope = params->scope; |
| 342 GURL script_url(params->script_url); | 349 GURL script_url(params->script_url); |
| 343 BrowserThread::PostTask( | 350 BrowserThread::PostTask( |
| 344 BrowserThread::UI, FROM_HERE, | 351 BrowserThread::UI, FROM_HERE, |
| 345 base::Bind(RegisterToWorkerDevToolsManagerOnUI, process_id, | 352 base::Bind( |
| 346 instance_->context_.get(), instance_->context_, | 353 RegisterToWorkerDevToolsManagerAndBindInterfaceOnUI, process_id, |
| 347 service_worker_version_id, script_url, scope, is_installed_, | 354 instance_->context_.get(), instance_->context_, |
| 348 base::Bind(&StartTask::OnRegisteredToDevToolsManager, | 355 service_worker_version_id, script_url, scope, is_installed_, |
| 349 weak_factory_.GetWeakPtr(), base::Passed(¶ms), | 356 base::Passed(&request_), |
| 350 is_new_process))); | 357 base::Bind( |
| 358 &StartTask::OnRegisteredToDevToolsManagerAndBoundInterface, | |
| 359 weak_factory_.GetWeakPtr(), base::Passed(¶ms), | |
| 360 is_new_process))); | |
| 351 } | 361 } |
| 352 | 362 |
| 353 void OnRegisteredToDevToolsManager( | 363 void OnRegisteredToDevToolsManagerAndBoundInterface( |
| 354 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, | 364 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, |
| 355 bool is_new_process, | 365 bool is_new_process, |
| 356 int worker_devtools_agent_route_id, | 366 int worker_devtools_agent_route_id, |
| 357 bool wait_for_debugger) { | 367 bool wait_for_debugger) { |
| 358 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 368 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 359 TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker", | 369 TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker", |
| 360 "EmbeddedWorkerInstance::Start", this, | 370 "EmbeddedWorkerInstance::Start", this, |
| 361 "OnRegisteredToDevToolsManager"); | 371 "OnRegisteredToDevToolsManager"); |
| 362 | 372 |
| 363 // Notify the instance that it is registered to the devtools manager. | 373 // Notify the instance that it is registered to the devtools manager. |
| 364 instance_->OnRegisteredToDevToolsManager( | 374 instance_->OnRegisteredToDevToolsManager( |
| 365 is_new_process, worker_devtools_agent_route_id, wait_for_debugger); | 375 is_new_process, worker_devtools_agent_route_id, wait_for_debugger); |
| 366 | 376 |
| 367 params->worker_devtools_agent_route_id = worker_devtools_agent_route_id; | 377 params->worker_devtools_agent_route_id = worker_devtools_agent_route_id; |
| 368 params->wait_for_debugger = wait_for_debugger; | 378 params->wait_for_debugger = wait_for_debugger; |
| 369 SendStartWorker(std::move(params)); | 379 |
| 380 if (ServiceWorkerUtils::IsMojoForServiceWorkerEnabled()) | |
| 381 instance_->SendMojoStartWorker(std::move(params)); | |
| 382 else | |
| 383 SendStartWorker(std::move(params)); | |
| 370 } | 384 } |
| 371 | 385 |
| 372 void SendStartWorker( | 386 void SendStartWorker( |
| 373 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params) { | 387 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params) { |
| 374 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 388 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 375 ServiceWorkerStatusCode status = instance_->registry_->SendStartWorker( | 389 ServiceWorkerStatusCode status = instance_->registry_->SendStartWorker( |
| 376 std::move(params), instance_->process_id()); | 390 std::move(params), instance_->process_id()); |
| 377 TRACE_EVENT_ASYNC_STEP_PAST1( | 391 TRACE_EVENT_ASYNC_STEP_PAST1( |
| 378 "ServiceWorker", "EmbeddedWorkerInstance::Start", this, | 392 "ServiceWorker", "EmbeddedWorkerInstance::Start", this, |
| 379 "SendStartWorker", "Status", ServiceWorkerStatusToString(status)); | 393 "SendStartWorker", "Status", ServiceWorkerStatusToString(status)); |
| 380 if (status != SERVICE_WORKER_OK) { | 394 if (status != SERVICE_WORKER_OK) { |
| 381 StatusCallback callback = start_callback_; | 395 StatusCallback callback = start_callback_; |
| 382 start_callback_.Reset(); | 396 start_callback_.Reset(); |
| 383 instance_->OnStartFailed(callback, status); | 397 instance_->OnStartFailed(callback, status); |
| 384 // |this| may be destroyed. | 398 // |this| may be destroyed. |
| 385 return; | 399 return; |
| 386 } | 400 } |
| 387 instance_->OnStartWorkerMessageSent(); | 401 instance_->OnStartWorkerMessageSent(); |
| 388 | 402 |
| 389 // |start_callback_| will be called via RunStartCallback() when the script | 403 // |start_callback_| will be called via RunStartCallback() when the script |
| 390 // is evaluated. | 404 // is evaluated. |
| 391 } | 405 } |
| 392 | 406 |
| 393 // |instance_| must outlive |this|. | 407 // |instance_| must outlive |this|. |
| 394 EmbeddedWorkerInstance* instance_; | 408 EmbeddedWorkerInstance* instance_; |
| 409 mojom::EmbeddedWorkerInstanceClientRequest request_; | |
| 395 | 410 |
| 396 StatusCallback start_callback_; | 411 StatusCallback start_callback_; |
| 397 ProcessAllocationState state_; | 412 ProcessAllocationState state_; |
| 398 | 413 |
| 399 // Used for UMA. | 414 // Used for UMA. |
| 400 bool is_installed_; | 415 bool is_installed_; |
| 401 bool started_during_browser_startup_; | 416 bool started_during_browser_startup_; |
| 402 | 417 |
| 403 base::WeakPtrFactory<StartTask> weak_factory_; | 418 base::WeakPtrFactory<StartTask> weak_factory_; |
| 404 | 419 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 438 network_accessed_for_script_ = false; | 453 network_accessed_for_script_ = false; |
| 439 interface_registry_.reset(new shell::InterfaceRegistry); | 454 interface_registry_.reset(new shell::InterfaceRegistry); |
| 440 remote_interfaces_.reset(new shell::InterfaceProvider); | 455 remote_interfaces_.reset(new shell::InterfaceProvider); |
| 441 FOR_EACH_OBSERVER(Listener, listener_list_, OnStarting()); | 456 FOR_EACH_OBSERVER(Listener, listener_list_, OnStarting()); |
| 442 | 457 |
| 443 params->embedded_worker_id = embedded_worker_id_; | 458 params->embedded_worker_id = embedded_worker_id_; |
| 444 params->worker_devtools_agent_route_id = MSG_ROUTING_NONE; | 459 params->worker_devtools_agent_route_id = MSG_ROUTING_NONE; |
| 445 params->wait_for_debugger = false; | 460 params->wait_for_debugger = false; |
| 446 params->settings.v8_cache_options = GetV8CacheOptions(); | 461 params->settings.v8_cache_options = GetV8CacheOptions(); |
| 447 | 462 |
| 448 inflight_start_task_.reset(new StartTask(this, params->script_url)); | 463 mojom::EmbeddedWorkerInstanceClientRequest request = |
| 464 GetProxy(&instance_client_); | |
|
falken
2016/09/07 05:01:41
Where is GetProxy from? should this be mojo::GetPr
shimazu
2016/09/12 06:28:19
Done.
| |
| 465 | |
| 466 inflight_start_task_.reset( | |
| 467 new StartTask(this, params->script_url, std::move(request))); | |
| 449 inflight_start_task_->Start(std::move(params), callback); | 468 inflight_start_task_->Start(std::move(params), callback); |
| 450 } | 469 } |
| 451 | 470 |
| 452 ServiceWorkerStatusCode EmbeddedWorkerInstance::Stop() { | 471 ServiceWorkerStatusCode EmbeddedWorkerInstance::Stop() { |
| 453 DCHECK(status_ == EmbeddedWorkerStatus::STARTING || | 472 DCHECK(status_ == EmbeddedWorkerStatus::STARTING || |
| 454 status_ == EmbeddedWorkerStatus::RUNNING) | 473 status_ == EmbeddedWorkerStatus::RUNNING) |
| 455 << static_cast<int>(status_); | 474 << static_cast<int>(status_); |
| 456 | 475 |
| 457 // Abort an inflight start task. | 476 // Abort an inflight start task. |
| 458 inflight_start_task_.reset(); | 477 inflight_start_task_.reset(); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after 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<EmbeddedWorkerMsg_StartWorker_Params> params) { | |
| 589 auto mojo_params = mojom::EmbeddedWorkerStartWorkerParams::New(); | |
|
dcheng
2016/09/07 07:51:09
It might be slightly simpler to just declare Embed
shimazu
2016/09/12 06:28:19
Done.
| |
| 590 mojo_params->embedded_worker_id = params->embedded_worker_id; | |
| 591 mojo_params->service_worker_version_id = params->service_worker_version_id; | |
| 592 mojo_params->scope = params->scope; | |
| 593 mojo_params->script_url = params->script_url; | |
| 594 mojo_params->worker_devtools_agent_route_id = | |
| 595 params->worker_devtools_agent_route_id; | |
| 596 mojo_params->pause_after_download = params->pause_after_download; | |
| 597 mojo_params->wait_for_debugger = params->wait_for_debugger; | |
| 598 mojo_params->is_installed = params->is_installed; | |
| 599 | |
| 600 mojo_params->settings = mojom::EmbeddedWorkerSettings::New(); | |
| 601 mojo_params->settings->data_saver_enabled = | |
| 602 params->settings.data_saver_enabled; | |
| 603 mojo_params->settings->v8_cache_options = | |
| 604 static_cast<mojom::V8CacheOptions>(params->settings.v8_cache_options); | |
| 605 | |
| 606 instance_client_->StartWorker(std::move(mojo_params)); | |
| 607 registry_->AddWorker(process_id(), embedded_worker_id()); | |
|
falken
2016/09/07 05:01:41
The registry already holds all workers, even ones
shimazu
2016/09/12 06:28:19
Done.
| |
| 608 TRACE_EVENT_ASYNC_STEP_PAST1("ServiceWorker", "EmbeddedWorkerInstance::Start", | |
| 609 this, "SendStartWorker", "Status", "mojo"); | |
| 610 OnStartWorkerMessageSent(); | |
| 611 return; | |
| 612 } | |
| 613 | |
| 568 void EmbeddedWorkerInstance::OnStartWorkerMessageSent() { | 614 void EmbeddedWorkerInstance::OnStartWorkerMessageSent() { |
| 569 if (!step_time_.is_null()) { | 615 if (!step_time_.is_null()) { |
| 570 base::TimeDelta duration = UpdateStepTime(); | 616 base::TimeDelta duration = UpdateStepTime(); |
| 571 if (inflight_start_task_->is_installed()) { | 617 if (inflight_start_task_->is_installed()) { |
| 572 ServiceWorkerMetrics::RecordTimeToSendStartWorker(duration, | 618 ServiceWorkerMetrics::RecordTimeToSendStartWorker(duration, |
| 573 start_situation_); | 619 start_situation_); |
| 574 } | 620 } |
| 575 } | 621 } |
| 576 | 622 |
| 577 starting_phase_ = SENT_START_WORKER; | 623 starting_phase_ = SENT_START_WORKER; |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 885 case SCRIPT_READ_FINISHED: | 931 case SCRIPT_READ_FINISHED: |
| 886 return "Script read finished"; | 932 return "Script read finished"; |
| 887 case STARTING_PHASE_MAX_VALUE: | 933 case STARTING_PHASE_MAX_VALUE: |
| 888 NOTREACHED(); | 934 NOTREACHED(); |
| 889 } | 935 } |
| 890 NOTREACHED() << phase; | 936 NOTREACHED() << phase; |
| 891 return std::string(); | 937 return std::string(); |
| 892 } | 938 } |
| 893 | 939 |
| 894 } // namespace content | 940 } // namespace content |
| OLD | NEW |