| Index: content/browser/service_worker/embedded_worker_instance.cc
|
| diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc
|
| index 6c9dc1fc4e9250e9f9781c117285d15aa9745d5e..f2365771a03cdc888ea505ca6626c0771e68c0c6 100644
|
| --- a/content/browser/service_worker/embedded_worker_instance.cc
|
| +++ b/content/browser/service_worker/embedded_worker_instance.cc
|
| @@ -20,11 +20,14 @@
|
| #include "content/common/service_worker/embedded_worker_messages.h"
|
| #include "content/common/service_worker/embedded_worker_settings.h"
|
| #include "content/common/service_worker/embedded_worker_setup.mojom.h"
|
| +#include "content/common/service_worker/embedded_worker_start_params.h"
|
| #include "content/common/service_worker/service_worker_types.h"
|
| +#include "content/common/service_worker/service_worker_utils.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/content_browser_client.h"
|
| #include "content/public/browser/render_process_host.h"
|
| #include "content/public/common/child_process_host.h"
|
| +#include "content/public/common/content_switches.h"
|
| #include "ipc/ipc_message.h"
|
| #include "services/shell/public/cpp/interface_provider.h"
|
| #include "services/shell/public/cpp/interface_registry.h"
|
| @@ -69,7 +72,7 @@
|
| worker_process_id, worker_route_id);
|
| }
|
|
|
| -void RegisterToWorkerDevToolsManagerOnUI(
|
| +void SetupOnUI(
|
| int process_id,
|
| const ServiceWorkerContextCore* service_worker_context,
|
| const base::WeakPtr<ServiceWorkerContextCore>& service_worker_context_weak,
|
| @@ -77,6 +80,7 @@
|
| const GURL& url,
|
| const GURL& scope,
|
| bool is_installed,
|
| + mojom::EmbeddedWorkerInstanceClientRequest request,
|
| const base::Callback<void(int worker_devtools_agent_route_id,
|
| bool wait_for_debugger)>& callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| @@ -92,6 +96,8 @@
|
| service_worker_context, service_worker_context_weak,
|
| service_worker_version_id, url, scope),
|
| is_installed);
|
| + if (request.is_pending())
|
| + rph->GetRemoteInterfaces()->GetInterface(std::move(request));
|
| }
|
| BrowserThread::PostTask(
|
| BrowserThread::IO,
|
| @@ -211,8 +217,11 @@
|
| public:
|
| enum class ProcessAllocationState { NOT_ALLOCATED, ALLOCATING, ALLOCATED };
|
|
|
| - StartTask(EmbeddedWorkerInstance* instance, const GURL& script_url)
|
| + StartTask(EmbeddedWorkerInstance* instance,
|
| + const GURL& script_url,
|
| + mojom::EmbeddedWorkerInstanceClientRequest request)
|
| : instance_(instance),
|
| + request_(std::move(request)),
|
| state_(ProcessAllocationState::NOT_ALLOCATED),
|
| is_installed_(false),
|
| started_during_browser_startup_(false),
|
| @@ -254,7 +263,7 @@
|
| // TODO(nhiroki): Reconsider this bizarre layering.
|
| }
|
|
|
| - void Start(std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params,
|
| + void Start(std::unique_ptr<EmbeddedWorkerStartParams> params,
|
| const StatusCallback& callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| state_ = ProcessAllocationState::ALLOCATING;
|
| @@ -289,12 +298,11 @@
|
| bool is_installed() const { return is_installed_; }
|
|
|
| private:
|
| - void OnProcessAllocated(
|
| - std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params,
|
| - ServiceWorkerStatusCode status,
|
| - int process_id,
|
| - bool is_new_process,
|
| - const EmbeddedWorkerSettings& settings) {
|
| + void OnProcessAllocated(std::unique_ptr<EmbeddedWorkerStartParams> params,
|
| + ServiceWorkerStatusCode status,
|
| + int process_id,
|
| + bool is_new_process,
|
| + const EmbeddedWorkerSettings& settings) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
|
|
| if (status != SERVICE_WORKER_OK) {
|
| @@ -342,23 +350,22 @@
|
| GURL script_url(params->script_url);
|
| BrowserThread::PostTask(
|
| BrowserThread::UI, FROM_HERE,
|
| - base::Bind(RegisterToWorkerDevToolsManagerOnUI, process_id,
|
| - instance_->context_.get(), instance_->context_,
|
| - service_worker_version_id, script_url, scope, is_installed_,
|
| - base::Bind(&StartTask::OnRegisteredToDevToolsManager,
|
| + base::Bind(&SetupOnUI, process_id, instance_->context_.get(),
|
| + instance_->context_, service_worker_version_id, script_url,
|
| + scope, is_installed_, base::Passed(&request_),
|
| + base::Bind(&StartTask::OnSetupOnUICompleted,
|
| weak_factory_.GetWeakPtr(), base::Passed(¶ms),
|
| is_new_process)));
|
| }
|
|
|
| - void OnRegisteredToDevToolsManager(
|
| - std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params,
|
| - bool is_new_process,
|
| - int worker_devtools_agent_route_id,
|
| - bool wait_for_debugger) {
|
| + void OnSetupOnUICompleted(std::unique_ptr<EmbeddedWorkerStartParams> params,
|
| + bool is_new_process,
|
| + int worker_devtools_agent_route_id,
|
| + bool wait_for_debugger) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker",
|
| "EmbeddedWorkerInstance::Start", this,
|
| - "OnRegisteredToDevToolsManager");
|
| + "OnSetupOnUICompleted");
|
|
|
| // Notify the instance that it is registered to the devtools manager.
|
| instance_->OnRegisteredToDevToolsManager(
|
| @@ -366,11 +373,14 @@
|
|
|
| params->worker_devtools_agent_route_id = worker_devtools_agent_route_id;
|
| params->wait_for_debugger = wait_for_debugger;
|
| - SendStartWorker(std::move(params));
|
| - }
|
| -
|
| - void SendStartWorker(
|
| - std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params) {
|
| +
|
| + if (ServiceWorkerUtils::IsMojoForServiceWorkerEnabled())
|
| + instance_->SendMojoStartWorker(std::move(params));
|
| + else
|
| + SendStartWorker(std::move(params));
|
| + }
|
| +
|
| + void SendStartWorker(std::unique_ptr<EmbeddedWorkerStartParams> params) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| ServiceWorkerStatusCode status = instance_->registry_->SendStartWorker(
|
| std::move(params), instance_->process_id());
|
| @@ -393,6 +403,10 @@
|
| // |instance_| must outlive |this|.
|
| EmbeddedWorkerInstance* instance_;
|
|
|
| + // Ownership is transferred by base::Passed() to a task after process
|
| + // allocation.
|
| + mojom::EmbeddedWorkerInstanceClientRequest request_;
|
| +
|
| StatusCallback start_callback_;
|
| ProcessAllocationState state_;
|
|
|
| @@ -421,7 +435,7 @@
|
| }
|
|
|
| void EmbeddedWorkerInstance::Start(
|
| - std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params,
|
| + std::unique_ptr<EmbeddedWorkerStartParams> params,
|
| const StatusCallback& callback) {
|
| if (!context_) {
|
| callback.Run(SERVICE_WORKER_ERROR_ABORT);
|
| @@ -445,7 +459,12 @@
|
| params->wait_for_debugger = false;
|
| params->settings.v8_cache_options = GetV8CacheOptions();
|
|
|
| - inflight_start_task_.reset(new StartTask(this, params->script_url));
|
| + mojom::EmbeddedWorkerInstanceClientRequest request;
|
| + if (ServiceWorkerUtils::IsMojoForServiceWorkerEnabled())
|
| + request = mojo::GetProxy(&client_);
|
| +
|
| + inflight_start_task_.reset(
|
| + new StartTask(this, params->script_url, std::move(request)));
|
| inflight_start_task_->Start(std::move(params), callback);
|
| }
|
|
|
| @@ -565,6 +584,15 @@
|
| }
|
| }
|
|
|
| +void EmbeddedWorkerInstance::SendMojoStartWorker(
|
| + std::unique_ptr<EmbeddedWorkerStartParams> params) {
|
| + client_->StartWorker(*params);
|
| + registry_->BindWorkerToProcess(process_id(), embedded_worker_id());
|
| + TRACE_EVENT_ASYNC_STEP_PAST1("ServiceWorker", "EmbeddedWorkerInstance::Start",
|
| + this, "SendStartWorker", "Status", "mojo");
|
| + OnStartWorkerMessageSent();
|
| +}
|
| +
|
| void EmbeddedWorkerInstance::OnStartWorkerMessageSent() {
|
| if (!step_time_.is_null()) {
|
| base::TimeDelta duration = UpdateStepTime();
|
| @@ -659,9 +687,10 @@
|
| FOR_EACH_OBSERVER(Listener, listener_list_, OnThreadStarted());
|
|
|
| shell::mojom::InterfaceProviderPtr exposed_interfaces;
|
| - interface_registry_->Bind(GetProxy(&exposed_interfaces));
|
| + interface_registry_->Bind(mojo::GetProxy(&exposed_interfaces));
|
| shell::mojom::InterfaceProviderPtr remote_interfaces;
|
| - shell::mojom::InterfaceProviderRequest request = GetProxy(&remote_interfaces);
|
| + shell::mojom::InterfaceProviderRequest request =
|
| + mojo::GetProxy(&remote_interfaces);
|
| remote_interfaces_->Bind(std::move(remote_interfaces));
|
| BrowserThread::PostTask(
|
| BrowserThread::UI, FROM_HERE,
|
|
|