Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(128)

Side by Side Diff: content/browser/service_worker/embedded_worker_instance.cc

Issue 2313653002: ServiceWorker: Exchange InterfaceProviders when starting worker thread (Closed)
Patch Set: Indent Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698