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 1e78b20545b3cc5244ac2099cd7d5179a9716d06..0cf1087a866cc5009323d3a8d5f69cb7f15963b6 100644 |
--- a/content/browser/service_worker/embedded_worker_instance.cc |
+++ b/content/browser/service_worker/embedded_worker_instance.cc |
@@ -21,10 +21,12 @@ |
#include "content/common/service_worker/embedded_worker_settings.h" |
#include "content/common/service_worker/embedded_worker_setup.mojom.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" |
@@ -115,6 +117,22 @@ void SetupMojoOnUIThread( |
mojo::MakeProxy(std::move(exposed_interfaces))); |
} |
+void GetRemoteEmbeddededWorkerInstanceClientOnUIThread( |
+ int process_id, |
+ const base::Callback<void(mojom::EmbeddedWorkerInstanceClientPtr)>& |
+ callback_on_io) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ RenderProcessHost* rph = RenderProcessHost::FromID(process_id); |
+ // |rph| or its InterfaceProvider may be NULL in unit tests. |
+ if (!rph || !rph->GetRemoteInterfaces()) |
+ return; |
+ mojom::EmbeddedWorkerInstanceClientPtr instance_client; |
+ rph->GetRemoteInterfaces()->GetInterface(&instance_client); |
Marijn Kruisselbrink
2016/08/23 18:56:08
Rather than creating and binding the InterfacePtr
shimazu
2016/08/25 05:14:52
Thanks, it seems better. Updated.
|
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(callback_on_io, base::Passed(&instance_client))); |
+} |
+ |
} // namespace |
// Lives on IO thread, proxies notifications to DevToolsManager that lives on |
@@ -366,7 +384,18 @@ class EmbeddedWorkerInstance::StartTask { |
params->worker_devtools_agent_route_id = worker_devtools_agent_route_id; |
params->wait_for_debugger = wait_for_debugger; |
- SendStartWorker(std::move(params)); |
+ |
+ if (ServiceWorkerUtils::IsMojoForServiceWorkerEnabled()) { |
+ auto callback = base::Bind( |
+ &EmbeddedWorkerInstance::OnGotRemoteEmbeddedWorkerInstanceClient, |
+ instance_->weak_factory_.GetWeakPtr(), base::Passed(¶ms)); |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&GetRemoteEmbeddededWorkerInstanceClientOnUIThread, |
+ instance_->process_id(), callback)); |
+ } else { |
+ SendStartWorker(std::move(params)); |
+ } |
} |
void SendStartWorker( |
@@ -565,6 +594,42 @@ void EmbeddedWorkerInstance::OnRegisteredToDevToolsManager( |
} |
} |
+void EmbeddedWorkerInstance::OnGotRemoteEmbeddedWorkerInstanceClient( |
+ std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, |
+ mojom::EmbeddedWorkerInstanceClientPtr instance_client) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ // Bind again for thread hop of the mojo interface pointer |
+ instance_client_.Bind(instance_client.PassInterface()); |
+ SendMojoStartWorker(std::move(params)); |
+} |
+ |
+void EmbeddedWorkerInstance::SendMojoStartWorker( |
+ std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params) { |
+ auto mojo_params = mojom::EmbeddedWorkerStartWorkerParams::New(); |
+ mojo_params->embedded_worker_id = params->embedded_worker_id; |
+ mojo_params->service_worker_version_id = params->service_worker_version_id; |
+ mojo_params->scope = params->scope; |
+ mojo_params->script_url = params->script_url; |
+ mojo_params->worker_devtools_agent_route_id = |
+ params->worker_devtools_agent_route_id; |
+ mojo_params->pause_after_download = params->pause_after_download; |
+ mojo_params->wait_for_debugger = params->wait_for_debugger; |
+ mojo_params->is_installed = params->is_installed; |
+ |
+ mojo_params->settings = mojom::EmbeddedWorkerSettings::New(); |
+ mojo_params->settings->data_saver_enabled = |
+ params->settings.data_saver_enabled; |
+ mojo_params->settings->v8_cache_options = |
+ static_cast<mojom::V8CacheOptions>(params->settings.v8_cache_options); |
horo
2016/08/24 04:59:16
We should have static_assert() for mojo::V8CacheOp
shimazu
2016/08/25 05:14:52
Done.
|
+ |
+ instance_client_->StartWorker(std::move(mojo_params)); |
+ registry_->AddWorker(process_id(), embedded_worker_id()); |
+ TRACE_EVENT_ASYNC_STEP_PAST1("ServiceWorker", "EmbeddedWorkerInstance::Start", |
+ this, "SendStartWorker", "Status", "mojo"); |
+ OnStartWorkerMessageSent(); |
+ return; |
+} |
+ |
void EmbeddedWorkerInstance::OnStartWorkerMessageSent() { |
if (!step_time_.is_null()) { |
base::TimeDelta duration = UpdateStepTime(); |