| Index: content/browser/mojo/mojo_shell_context.cc
|
| diff --git a/content/browser/mojo/mojo_shell_context.cc b/content/browser/mojo/mojo_shell_context.cc
|
| index db77c35f4e5985c85594eab894d91f5e95fae11b..77e34e8a69be88b9aff4d39a51e737b402800e2f 100644
|
| --- a/content/browser/mojo/mojo_shell_context.cc
|
| +++ b/content/browser/mojo/mojo_shell_context.cc
|
| @@ -9,6 +9,8 @@
|
| #include "base/path_service.h"
|
| #include "base/single_thread_task_runner.h"
|
| #include "base/thread_task_runner_handle.h"
|
| +#include "content/browser/gpu/gpu_process_host.h"
|
| +#include "content/common/gpu/gpu_process_launch_causes.h"
|
| #include "content/common/process_control.mojom.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/content_browser_client.h"
|
| @@ -37,9 +39,10 @@ namespace {
|
| // An extra set of apps to register on initialization, if set by a test.
|
| const MojoShellContext::StaticApplicationMap* g_applications_for_test;
|
|
|
| -void StartProcessOnIOThread(mojo::InterfaceRequest<ProcessControl> request,
|
| - const base::string16& process_name,
|
| - bool use_sandbox) {
|
| +void StartUtilityProcessOnIOThread(
|
| + mojo::InterfaceRequest<ProcessControl> request,
|
| + const base::string16& process_name,
|
| + bool use_sandbox) {
|
| UtilityProcessHost* process_host =
|
| UtilityProcessHost::Create(nullptr, nullptr);
|
| process_host->SetName(process_name);
|
| @@ -88,10 +91,10 @@ class UtilityProcessLoader : public mojo::shell::ApplicationLoader {
|
| mojo::InterfaceRequest<mojo::Application> application_request) override {
|
| ProcessControlPtr process_control;
|
| auto process_request = mojo::GetProxy(&process_control);
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&StartProcessOnIOThread, base::Passed(&process_request),
|
| - process_name_, use_sandbox_));
|
| + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&StartUtilityProcessOnIOThread,
|
| + base::Passed(&process_request),
|
| + process_name_, use_sandbox_));
|
| process_control->LoadApplication(url.spec(), application_request.Pass(),
|
| base::Bind(&OnApplicationLoaded, url));
|
| }
|
| @@ -102,6 +105,46 @@ class UtilityProcessLoader : public mojo::shell::ApplicationLoader {
|
| DISALLOW_COPY_AND_ASSIGN(UtilityProcessLoader);
|
| };
|
|
|
| +// Request ProcessControl from GPU process host. Must be called on IO thread.
|
| +void RequestGpuProcessControl(mojo::InterfaceRequest<ProcessControl> request) {
|
| + BrowserChildProcessHostDelegate* process_host =
|
| + GpuProcessHost::Get(GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED,
|
| + CAUSE_FOR_GPU_LAUNCH_MOJO_SETUP);
|
| + if (!process_host) {
|
| + DLOG(ERROR) << "GPU process host not available.";
|
| + return;
|
| + }
|
| +
|
| + // TODO(xhwang): It's possible that |process_host| is non-null, but the actual
|
| + // process is dead. In that case, |request| will be dropped and application
|
| + // load requests through ProcessControl will also fail. Make sure we handle
|
| + // these cases correctly.
|
| + process_host->GetServiceRegistry()->ConnectToRemoteService(request.Pass());
|
| +}
|
| +
|
| +// Forwards the load request to the GPU process.
|
| +class GpuProcessLoader : public mojo::shell::ApplicationLoader {
|
| + public:
|
| + GpuProcessLoader() {}
|
| + ~GpuProcessLoader() override {}
|
| +
|
| + private:
|
| + // mojo::shell::ApplicationLoader:
|
| + void Load(
|
| + const GURL& url,
|
| + mojo::InterfaceRequest<mojo::Application> application_request) override {
|
| + ProcessControlPtr process_control;
|
| + auto process_request = mojo::GetProxy(&process_control);
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&RequestGpuProcessControl, base::Passed(&process_request)));
|
| + process_control->LoadApplication(url.spec(), application_request.Pass(),
|
| + base::Bind(&OnApplicationLoaded, url));
|
| + }
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(GpuProcessLoader);
|
| +};
|
| +
|
| } // namespace
|
|
|
| // Thread-safe proxy providing access to the shell context from any thread.
|
|
|