summaryrefslogtreecommitdiffstats
path: root/content/browser/mojo
diff options
context:
space:
mode:
authordarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-23 18:36:44 +0000
committerdarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-23 18:36:44 +0000
commit1a8abcd89ed65e236433e081c72aee0336782e19 (patch)
tree1783ead2c39dfe00e6755f08b4ec432da49c3c46 /content/browser/mojo
parentb682464d884a69481d16179f66f463bf2702bb5e (diff)
downloadchromium_src-1a8abcd89ed65e236433e081c72aee0336782e19.zip
chromium_src-1a8abcd89ed65e236433e081c72aee0336782e19.tar.gz
chromium_src-1a8abcd89ed65e236433e081c72aee0336782e19.tar.bz2
Move Mojo channel initialization closer to IPC::Channel setup
This CL introduces two new content classes: - MojoApplicationHost encapsulates what's needed to host a Mojo App using Chrome IPC to bootstrap. - MojoApplication represents what's needed to be a Mojo App using Chrome IPC to bootstrap. The RenderProcess and RenderProcessHost interfaces are replaced with WebUISetup and WebUISetupClient interfaces. This way the interface is more specific to the service of setting up WebUI. WebUISetupClient is empty and uninteresting. RenderProcessHostImpl no longer deals with WebUI setup. That is all done directly by RenderViewHostImpl by talking to the WebUISetup service. Service names get defined in content/common/mojo/mojo_service_names.{h,cc}. R=sky@chromium.org, tsepez@chromium.org Review URL: https://codereview.chromium.org/236813002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@265693 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/mojo')
-rw-r--r--content/browser/mojo/mojo_application_host.cc65
-rw-r--r--content/browser/mojo/mojo_application_host.h51
2 files changed, 116 insertions, 0 deletions
diff --git a/content/browser/mojo/mojo_application_host.cc b/content/browser/mojo/mojo_application_host.cc
new file mode 100644
index 0000000..48d343a
--- /dev/null
+++ b/content/browser/mojo/mojo_application_host.cc
@@ -0,0 +1,65 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/mojo/mojo_application_host.h"
+
+#include "content/common/mojo/mojo_messages.h"
+#include "content/public/browser/browser_thread.h"
+#include "ipc/ipc_sender.h"
+#include "mojo/embedder/platform_channel_pair.h"
+
+namespace content {
+namespace {
+
+base::PlatformFile PlatformFileFromScopedPlatformHandle(
+ mojo::embedder::ScopedPlatformHandle handle) {
+#if defined(OS_POSIX)
+ return handle.release().fd;
+#elif defined(OS_WIN)
+ return handle.release().handle;
+#endif
+}
+
+} // namespace
+
+MojoApplicationHost::MojoApplicationHost() : did_activate_(false) {
+}
+
+MojoApplicationHost::~MojoApplicationHost() {
+}
+
+bool MojoApplicationHost::Init() {
+ DCHECK(shell_client_.is_null()) << "Already initialized!";
+
+ mojo::embedder::PlatformChannelPair channel_pair;
+
+ mojo::ScopedMessagePipeHandle message_pipe = channel_init_.Init(
+ PlatformFileFromScopedPlatformHandle(channel_pair.PassServerHandle()),
+ BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO));
+ if (!message_pipe.is_valid())
+ return false;
+
+ // Forward this to the client once we know its process handle.
+ client_handle_ = channel_pair.PassClientHandle();
+
+ // TODO(darin): Provide a Shell implementation
+ shell_client_.reset(
+ mojo::ScopedShellClientHandle::From(message_pipe.Pass()), NULL);
+
+ return true;
+}
+
+bool MojoApplicationHost::Activate(IPC::Sender* sender,
+ base::ProcessHandle process_handle) {
+ DCHECK(!did_activate_);
+ DCHECK(client_handle_.is_valid());
+
+ base::PlatformFile client_file =
+ PlatformFileFromScopedPlatformHandle(client_handle_.Pass());
+ did_activate_ = sender->Send(new MojoMsg_Activate(
+ IPC::GetFileHandleForProcess(client_file, process_handle, true)));
+ return did_activate_;
+}
+
+} // namespace content
diff --git a/content/browser/mojo/mojo_application_host.h b/content/browser/mojo/mojo_application_host.h
new file mode 100644
index 0000000..68f6c32
--- /dev/null
+++ b/content/browser/mojo/mojo_application_host.h
@@ -0,0 +1,51 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_MOJO_MOJO_APPLICATION_HOST_H_
+#define CONTENT_BROWSER_MOJO_MOJO_APPLICATION_HOST_H_
+
+#include "base/process/process_handle.h"
+#include "mojo/common/channel_init.h"
+#include "mojo/embedder/scoped_platform_handle.h"
+#include "mojo/public/cpp/bindings/remote_ptr.h"
+#include "mojo/public/interfaces/shell/shell.mojom.h"
+
+namespace IPC {
+class Sender;
+}
+
+namespace content {
+
+// MojoApplicationHost represents the code needed on the browser side to setup
+// a child process as a Mojo application via Chrome IPC. The child process
+// should use MojoApplication to handle messages generated by an instance of
+// MojoApplicationHost. MojoApplicationHost makes the mojo::ShellClient
+// interface available so that child-provided services can be invoked.
+class MojoApplicationHost {
+ public:
+ MojoApplicationHost();
+ ~MojoApplicationHost();
+
+ // Two-phase initialization:
+ // 1- Init makes the shell_client() available synchronously.
+ // 2- Activate establishes the actual connection to the peer process.
+ bool Init();
+ bool Activate(IPC::Sender* sender, base::ProcessHandle process_handle);
+
+ bool did_activate() const { return did_activate_; }
+
+ mojo::ShellClient* shell_client() { return shell_client_.get(); }
+
+ private:
+ mojo::common::ChannelInit channel_init_;
+ mojo::embedder::ScopedPlatformHandle client_handle_;
+ mojo::RemotePtr<mojo::ShellClient> shell_client_;
+ bool did_activate_;
+
+ DISALLOW_COPY_AND_ASSIGN(MojoApplicationHost);
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_MOJO_MOJO_APPLICATION_HOST_H_