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

Unified Diff: chrome/browser/nacl_host/nacl_process_host.cc

Issue 10912011: Change NaCl IPC PPAPI proxy startup to support a NaCl-Browser process (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 4 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/nacl_host/nacl_process_host.cc
===================================================================
--- chrome/browser/nacl_host/nacl_process_host.cc (revision 154143)
+++ chrome/browser/nacl_host/nacl_process_host.cc (working copy)
@@ -18,7 +18,9 @@
#include "base/utf_string_conversions.h"
#include "base/win/windows_version.h"
#include "build/build_config.h"
+#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/extension_info_map.h"
+#include "chrome/browser/io_thread.h"
#include "chrome/browser/nacl_host/nacl_browser.h"
#include "chrome/browser/renderer_host/chrome_render_message_filter.h"
#include "chrome/common/chrome_constants.h"
@@ -33,9 +35,11 @@
#include "content/public/browser/browser_child_process_host.h"
#include "content/public/browser/child_process_data.h"
#include "content/public/common/child_process_host.h"
+#include "ipc/ipc_channel.h"
#include "ipc/ipc_switches.h"
#include "native_client/src/shared/imc/nacl_imc.h"
#include "net/base/net_util.h"
+#include "ppapi/proxy/ppapi_messages.h"
#if defined(OS_POSIX)
#include <fcntl.h>
@@ -55,6 +59,7 @@
using content::BrowserThread;
using content::ChildProcessData;
using content::ChildProcessHost;
+using ppapi::proxy::SerializedHandle;
namespace {
@@ -114,6 +119,15 @@
// -----------------------------------------------------------------------------
+NaClProcessHost::PluginListener::PluginListener(NaClProcessHost* host)
+ : host_(host) {
+}
+
+bool NaClProcessHost::PluginListener::OnMessageReceived(
+ const IPC::Message& msg) {
+ return host_->OnUntrustedMessageForwarded(msg);
+}
+
NaClProcessHost::NaClProcessHost(const GURL& manifest_url, bool off_the_record)
: manifest_url_(manifest_url),
#if defined(OS_WIN)
@@ -129,7 +143,9 @@
ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)),
enable_exception_handling_(false),
enable_debug_stub_(false),
- off_the_record_(off_the_record) {
+ off_the_record_(off_the_record),
+ enable_ipc_proxy_(false),
+ ALLOW_THIS_IN_INITIALIZER_LIST(ipc_plugin_listener_(this)) {
process_.reset(content::BrowserChildProcessHost::Create(
content::PROCESS_TYPE_NACL_LOADER, this));
@@ -681,12 +697,50 @@
return StartNaClExecution();
}
+// This method is called when NaClProcessHostMsg_PpapiChannelCreated is
+// received or PpapiHostMsg_ChannelCreated is forwarded by our plugin
+// listener.
void NaClProcessHost::OnPpapiChannelCreated(
const IPC::ChannelHandle& channel_handle) {
DCHECK(enable_ipc_proxy_);
- ReplyToRenderer(channel_handle);
+ // If the proxy channel is null, this must be the initial NaCl-Browser IPC
+ // channel.
+ if (!ipc_proxy_channel_.get()) {
+ ipc_proxy_channel_.reset(
+ new IPC::ChannelProxy(channel_handle,
+ IPC::Channel::MODE_CLIENT,
+ &ipc_plugin_listener_,
+ base::MessageLoopProxy::current()));
+ // Send a message to create the NaCl-Renderer channel. The handle is just
+ // a place holder.
+ ipc_proxy_channel_->Send(
+ new PpapiMsg_CreateNaClChannel(
+ chrome_render_message_filter_->render_process_id(),
+ chrome_render_message_filter_->off_the_record(),
+ SerializedHandle(SerializedHandle::CHANNEL_HANDLE,
+ IPC::InvalidPlatformFileForTransit())));
+ } else if (reply_msg_) {
+ // Otherwise, this must be a renderer channel.
+ ReplyToRenderer(channel_handle);
+ } else {
+ // Attempt to open more than 1 renderer channel is not supported.
+ // Shut down the NaCl process.
+ process_->GetHost()->ForceShutdown();
+ }
}
+bool NaClProcessHost::OnUntrustedMessageForwarded(const IPC::Message& msg) {
+ // Handle messages that have been forwarded from our PluginListener.
+ // These messages come from untrusted code so should be handled with care.
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP(NaClProcessHost, msg)
+ IPC_MESSAGE_HANDLER(PpapiHostMsg_ChannelCreated,
+ OnPpapiChannelCreated)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+ return handled;
+}
+
bool NaClProcessHost::StartWithLaunchedProcess() {
#if defined(OS_LINUX)
if (wait_for_nacl_gdb_) {
« no previous file with comments | « chrome/browser/nacl_host/nacl_process_host.h ('k') | chrome/browser/renderer_host/chrome_render_message_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698