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 |