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" |
| (...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 444 return; | 444 return; |
| 445 } | 445 } |
| 446 DCHECK(status_ == EmbeddedWorkerStatus::STOPPED); | 446 DCHECK(status_ == EmbeddedWorkerStatus::STOPPED); |
| 447 | 447 |
| 448 DCHECK(!params->pause_after_download || !params->is_installed); | 448 DCHECK(!params->pause_after_download || !params->is_installed); |
| 449 DCHECK_NE(kInvalidServiceWorkerVersionId, params->service_worker_version_id); | 449 DCHECK_NE(kInvalidServiceWorkerVersionId, params->service_worker_version_id); |
| 450 step_time_ = base::TimeTicks::Now(); | 450 step_time_ = base::TimeTicks::Now(); |
| 451 status_ = EmbeddedWorkerStatus::STARTING; | 451 status_ = EmbeddedWorkerStatus::STARTING; |
| 452 starting_phase_ = ALLOCATING_PROCESS; | 452 starting_phase_ = ALLOCATING_PROCESS; |
| 453 network_accessed_for_script_ = false; | 453 network_accessed_for_script_ = false; |
| 454 binding_.Close(); | |
| 454 interface_registry_.reset(new shell::InterfaceRegistry); | 455 interface_registry_.reset(new shell::InterfaceRegistry); |
| 455 remote_interfaces_.reset(new shell::InterfaceProvider); | 456 remote_interfaces_.reset(new shell::InterfaceProvider); |
| 456 FOR_EACH_OBSERVER(Listener, listener_list_, OnStarting()); | 457 FOR_EACH_OBSERVER(Listener, listener_list_, OnStarting()); |
| 457 | 458 |
| 458 params->embedded_worker_id = embedded_worker_id_; | 459 params->embedded_worker_id = embedded_worker_id_; |
| 459 params->worker_devtools_agent_route_id = MSG_ROUTING_NONE; | 460 params->worker_devtools_agent_route_id = MSG_ROUTING_NONE; |
| 460 params->wait_for_debugger = false; | 461 params->wait_for_debugger = false; |
| 461 params->settings.v8_cache_options = GetV8CacheOptions(); | 462 params->settings.v8_cache_options = GetV8CacheOptions(); |
| 462 | 463 |
| 464 interface_registry_->AddInterface( | |
| 465 base::Bind(&EmbeddedWorkerInstance::BindMojoRequest, AsWeakPtr())); | |
| 466 | |
| 463 mojom::EmbeddedWorkerInstanceClientRequest request = | 467 mojom::EmbeddedWorkerInstanceClientRequest request = |
| 464 GetProxy(&instance_client_); | 468 GetProxy(&instance_client_); |
| 465 instance_client_.set_connection_error_handler( | 469 instance_client_.set_connection_error_handler( |
| 466 base::Bind(&EmbeddedWorkerInstance::Detach, AsWeakPtr())); | 470 base::Bind(&EmbeddedWorkerInstance::Detach, AsWeakPtr())); |
| 467 | 471 |
| 468 inflight_start_task_.reset( | 472 inflight_start_task_.reset( |
| 469 new StartTask(this, params->script_url, std::move(request))); | 473 new StartTask(this, params->script_url, std::move(request))); |
| 470 inflight_start_task_->Start(std::move(params), callback); | 474 inflight_start_task_->Start(std::move(params), callback); |
| 471 } | 475 } |
| 472 | 476 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 558 | 562 |
| 559 EmbeddedWorkerInstance::EmbeddedWorkerInstance( | 563 EmbeddedWorkerInstance::EmbeddedWorkerInstance( |
| 560 base::WeakPtr<ServiceWorkerContextCore> context, | 564 base::WeakPtr<ServiceWorkerContextCore> context, |
| 561 int embedded_worker_id) | 565 int embedded_worker_id) |
| 562 : context_(context), | 566 : context_(context), |
| 563 registry_(context->embedded_worker_registry()), | 567 registry_(context->embedded_worker_registry()), |
| 564 embedded_worker_id_(embedded_worker_id), | 568 embedded_worker_id_(embedded_worker_id), |
| 565 status_(EmbeddedWorkerStatus::STOPPED), | 569 status_(EmbeddedWorkerStatus::STOPPED), |
| 566 starting_phase_(NOT_STARTING), | 570 starting_phase_(NOT_STARTING), |
| 567 thread_id_(kInvalidEmbeddedWorkerThreadId), | 571 thread_id_(kInvalidEmbeddedWorkerThreadId), |
| 572 binding_(this), | |
| 568 devtools_attached_(false), | 573 devtools_attached_(false), |
| 569 network_accessed_for_script_(false), | 574 network_accessed_for_script_(false), |
| 570 weak_factory_(this) {} | 575 weak_factory_(this) {} |
| 571 | 576 |
| 572 void EmbeddedWorkerInstance::OnProcessAllocated( | 577 void EmbeddedWorkerInstance::OnProcessAllocated( |
| 573 std::unique_ptr<WorkerProcessHandle> handle, | 578 std::unique_ptr<WorkerProcessHandle> handle, |
| 574 ServiceWorkerMetrics::StartSituation start_situation) { | 579 ServiceWorkerMetrics::StartSituation start_situation) { |
| 575 DCHECK_EQ(EmbeddedWorkerStatus::STARTING, status_); | 580 DCHECK_EQ(EmbeddedWorkerStatus::STARTING, status_); |
| 576 DCHECK(!process_handle_); | 581 DCHECK(!process_handle_); |
| 577 | 582 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 609 mojo_params->pause_after_download = params->pause_after_download; | 614 mojo_params->pause_after_download = params->pause_after_download; |
| 610 mojo_params->wait_for_debugger = params->wait_for_debugger; | 615 mojo_params->wait_for_debugger = params->wait_for_debugger; |
| 611 mojo_params->is_installed = params->is_installed; | 616 mojo_params->is_installed = params->is_installed; |
| 612 | 617 |
| 613 mojo_params->settings = mojom::EmbeddedWorkerSettings::New(); | 618 mojo_params->settings = mojom::EmbeddedWorkerSettings::New(); |
| 614 mojo_params->settings->data_saver_enabled = | 619 mojo_params->settings->data_saver_enabled = |
| 615 params->settings.data_saver_enabled; | 620 params->settings.data_saver_enabled; |
| 616 mojo_params->settings->v8_cache_options = | 621 mojo_params->settings->v8_cache_options = |
| 617 static_cast<mojom::V8CacheOptions>(params->settings.v8_cache_options); | 622 static_cast<mojom::V8CacheOptions>(params->settings.v8_cache_options); |
| 618 | 623 |
| 619 instance_client_->StartWorker(std::move(mojo_params)); | 624 shell::mojom::InterfaceProviderPtr exposed_interfaces; |
| 625 interface_registry_->Bind(GetProxy(&exposed_interfaces)); | |
| 626 | |
| 627 instance_client_->StartWorker(std::move(mojo_params), | |
| 628 std::move(exposed_interfaces)); | |
| 620 registry_->AddWorker(process_id(), embedded_worker_id()); | 629 registry_->AddWorker(process_id(), embedded_worker_id()); |
| 621 TRACE_EVENT_ASYNC_STEP_PAST1("ServiceWorker", "EmbeddedWorkerInstance::Start", | 630 TRACE_EVENT_ASYNC_STEP_PAST1("ServiceWorker", "EmbeddedWorkerInstance::Start", |
| 622 this, "SendStartWorker", "Status", "mojo"); | 631 this, "SendStartWorker", "Status", "mojo"); |
| 623 OnStartWorkerMessageSent(); | 632 OnStartWorkerMessageSent(); |
| 624 return; | 633 return; |
| 625 } | 634 } |
| 626 | 635 |
| 627 void EmbeddedWorkerInstance::OnStartWorkerMessageSent() { | 636 void EmbeddedWorkerInstance::OnStartWorkerMessageSent() { |
| 628 if (!step_time_.is_null()) { | 637 if (!step_time_.is_null()) { |
| 629 base::TimeDelta duration = UpdateStepTime(); | 638 base::TimeDelta duration = UpdateStepTime(); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 710 starting_phase_ = THREAD_STARTED; | 719 starting_phase_ = THREAD_STARTED; |
| 711 if (!step_time_.is_null()) { | 720 if (!step_time_.is_null()) { |
| 712 base::TimeDelta duration = UpdateStepTime(); | 721 base::TimeDelta duration = UpdateStepTime(); |
| 713 if (inflight_start_task_->is_installed()) | 722 if (inflight_start_task_->is_installed()) |
| 714 ServiceWorkerMetrics::RecordTimeToStartThread(duration, start_situation_); | 723 ServiceWorkerMetrics::RecordTimeToStartThread(duration, start_situation_); |
| 715 } | 724 } |
| 716 | 725 |
| 717 thread_id_ = thread_id; | 726 thread_id_ = thread_id; |
| 718 FOR_EACH_OBSERVER(Listener, listener_list_, OnThreadStarted()); | 727 FOR_EACH_OBSERVER(Listener, listener_list_, OnThreadStarted()); |
| 719 | 728 |
| 720 shell::mojom::InterfaceProviderPtr exposed_interfaces; | 729 if (!ServiceWorkerUtils::IsMojoForServiceWorkerEnabled()) { |
|
nhiroki
2016/09/06 01:38:05
This condition may make a code reader surprised be
shimazu
2016/09/21 07:00:51
Done.
| |
| 721 interface_registry_->Bind(GetProxy(&exposed_interfaces)); | 730 shell::mojom::InterfaceProviderPtr exposed_interfaces; |
| 722 shell::mojom::InterfaceProviderPtr remote_interfaces; | 731 interface_registry_->Bind(GetProxy(&exposed_interfaces)); |
| 723 shell::mojom::InterfaceProviderRequest request = GetProxy(&remote_interfaces); | 732 shell::mojom::InterfaceProviderPtr remote_interfaces; |
| 724 remote_interfaces_->Bind(std::move(remote_interfaces)); | 733 shell::mojom::InterfaceProviderRequest request = |
| 725 BrowserThread::PostTask( | 734 GetProxy(&remote_interfaces); |
| 726 BrowserThread::UI, FROM_HERE, | 735 remote_interfaces_->Bind(std::move(remote_interfaces)); |
| 727 base::Bind(SetupMojoOnUIThread, process_id(), thread_id_, | 736 BrowserThread::PostTask( |
| 728 base::Passed(&request), | 737 BrowserThread::UI, FROM_HERE, |
| 729 base::Passed(exposed_interfaces.PassInterface()))); | 738 base::Bind(SetupMojoOnUIThread, process_id(), thread_id_, |
| 739 base::Passed(&request), | |
| 740 base::Passed(exposed_interfaces.PassInterface()))); | |
| 741 } | |
| 730 } | 742 } |
| 731 | 743 |
| 732 void EmbeddedWorkerInstance::OnScriptLoadFailed() { | 744 void EmbeddedWorkerInstance::OnScriptLoadFailed() { |
| 733 if (!inflight_start_task_) | 745 if (!inflight_start_task_) |
| 734 return; | 746 return; |
| 735 TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker", "EmbeddedWorkerInstance::Start", | 747 TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker", "EmbeddedWorkerInstance::Start", |
| 736 inflight_start_task_.get(), | 748 inflight_start_task_.get(), |
| 737 "OnScriptLoadFailed"); | 749 "OnScriptLoadFailed"); |
| 738 FOR_EACH_OBSERVER(Listener, listener_list_, OnScriptLoadFailed()); | 750 FOR_EACH_OBSERVER(Listener, listener_list_, OnScriptLoadFailed()); |
| 739 } | 751 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 782 EmbeddedWorkerStatus old_status = status_; | 794 EmbeddedWorkerStatus old_status = status_; |
| 783 ReleaseProcess(); | 795 ReleaseProcess(); |
| 784 FOR_EACH_OBSERVER(Listener, listener_list_, OnDetached(old_status)); | 796 FOR_EACH_OBSERVER(Listener, listener_list_, OnDetached(old_status)); |
| 785 } | 797 } |
| 786 | 798 |
| 787 void EmbeddedWorkerInstance::Detach() { | 799 void EmbeddedWorkerInstance::Detach() { |
| 788 registry_->DetachWorker(process_id(), embedded_worker_id()); | 800 registry_->DetachWorker(process_id(), embedded_worker_id()); |
| 789 OnDetached(); | 801 OnDetached(); |
| 790 } | 802 } |
| 791 | 803 |
| 804 void EmbeddedWorkerInstance::BindMojoRequest( | |
| 805 mojom::EmbeddedWorkerInstanceRequest request) { | |
| 806 binding_.Bind(std::move(request)); | |
| 807 } | |
| 808 | |
| 792 base::WeakPtr<EmbeddedWorkerInstance> EmbeddedWorkerInstance::AsWeakPtr() { | 809 base::WeakPtr<EmbeddedWorkerInstance> EmbeddedWorkerInstance::AsWeakPtr() { |
| 793 return weak_factory_.GetWeakPtr(); | 810 return weak_factory_.GetWeakPtr(); |
| 794 } | 811 } |
| 795 | 812 |
| 813 void EmbeddedWorkerInstance::AttachClientInterfaceProvider( | |
| 814 shell::mojom::InterfaceProviderPtr client_interfaces) { | |
| 815 remote_interfaces_->Bind(std::move(client_interfaces)); | |
| 816 } | |
| 817 | |
| 796 bool EmbeddedWorkerInstance::OnMessageReceived(const IPC::Message& message) { | 818 bool EmbeddedWorkerInstance::OnMessageReceived(const IPC::Message& message) { |
| 797 ListenerList::Iterator it(&listener_list_); | 819 ListenerList::Iterator it(&listener_list_); |
| 798 while (Listener* listener = it.GetNext()) { | 820 while (Listener* listener = it.GetNext()) { |
| 799 if (listener->OnMessageReceived(message)) | 821 if (listener->OnMessageReceived(message)) |
| 800 return true; | 822 return true; |
| 801 } | 823 } |
| 802 return false; | 824 return false; |
| 803 } | 825 } |
| 804 | 826 |
| 805 void EmbeddedWorkerInstance::OnReportException( | 827 void EmbeddedWorkerInstance::OnReportException( |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 945 case SCRIPT_READ_FINISHED: | 967 case SCRIPT_READ_FINISHED: |
| 946 return "Script read finished"; | 968 return "Script read finished"; |
| 947 case STARTING_PHASE_MAX_VALUE: | 969 case STARTING_PHASE_MAX_VALUE: |
| 948 NOTREACHED(); | 970 NOTREACHED(); |
| 949 } | 971 } |
| 950 NOTREACHED() << phase; | 972 NOTREACHED() << phase; |
| 951 return std::string(); | 973 return std::string(); |
| 952 } | 974 } |
| 953 | 975 |
| 954 } // namespace content | 976 } // namespace content |
| OLD | NEW |