diff options
author | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-20 03:10:51 +0000 |
---|---|---|
committer | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-20 03:10:51 +0000 |
commit | 76724d00d3498f952d945d775a3f33f751624121 (patch) | |
tree | aa28e1bb6656708708780693443a275a2d5d43d8 /chrome/plugin | |
parent | dd86209f364eb604bb42a47dea7ae177d7166632 (diff) | |
download | chromium_src-76724d00d3498f952d945d775a3f33f751624121.zip chromium_src-76724d00d3498f952d945d775a3f33f751624121.tar.gz chromium_src-76724d00d3498f952d945d775a3f33f751624121.tar.bz2 |
posix: two related changes to make plugin IPC work on POSIX.
[retry, fix windows compile failure]
* use a new ChannelHandle type when passing IPC channels over IPC
The current POSIX code assumes that one end of a channel is always a new
child process (a renderer). For plugins we need to be able to construct
channels between each of the browser, plugin, and renderer.
This change augments the messages related to creating channels to allow
passing in a base::FileDescriptor containing the socket. The intent is
that the browser process, as the initial interchange between plugin and
renderer, creates the socketpair() on their behalf and hands each their
respective end of the connection.
* register channel endpoint names in the global pipe map
The plugin code assumes it can map from a string to a channel endpoint
at basically any time. So whenever we get a channel endpoint over IPC,
we install it in a global map of channel endpoints.
Review URL: http://codereview.chromium.org/113157
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18888 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/plugin')
-rw-r--r-- | chrome/plugin/plugin_channel.cc | 14 | ||||
-rw-r--r-- | chrome/plugin/plugin_channel.h | 8 | ||||
-rw-r--r-- | chrome/plugin/plugin_thread.cc | 13 | ||||
-rw-r--r-- | chrome/plugin/plugin_thread.h | 14 | ||||
-rw-r--r-- | chrome/plugin/webplugin_delegate_stub.cc | 6 |
5 files changed, 46 insertions, 9 deletions
diff --git a/chrome/plugin/plugin_channel.cc b/chrome/plugin/plugin_channel.cc index 4ff7b2b..b9e7a52 100644 --- a/chrome/plugin/plugin_channel.cc +++ b/chrome/plugin/plugin_channel.cc @@ -7,17 +7,29 @@ #include "base/command_line.h" #include "base/process_util.h" #include "base/string_util.h" +#include "build/build_config.h" #include "chrome/common/child_process.h" #include "chrome/common/plugin_messages.h" #include "chrome/common/chrome_switches.h" #include "chrome/plugin/plugin_thread.h" +#if defined(OS_POSIX) +#include "chrome/common/ipc_channel_posix.h" +#endif + PluginChannel* PluginChannel::GetPluginChannel( - int process_id, MessageLoop* ipc_message_loop) { + int process_id, MessageLoop* ipc_message_loop, int channel_fd) { // map renderer's process id to a (single) channel to that process std::string channel_name = StringPrintf( "%d.r%d", base::GetCurrentProcId(), process_id); +#if defined(OS_POSIX) + // If we were provided an already-open channel, associate it with + // the channel name in this process's name<->socket map. + if (channel_fd > 0) + IPC::AddChannelSocket(channel_name, channel_fd); +#endif + return static_cast<PluginChannel*>(PluginChannelBase::GetChannel( channel_name, IPC::Channel::MODE_SERVER, diff --git a/chrome/plugin/plugin_channel.h b/chrome/plugin/plugin_channel.h index f0bba80..21373fb 100644 --- a/chrome/plugin/plugin_channel.h +++ b/chrome/plugin/plugin_channel.h @@ -15,8 +15,12 @@ // process. On the renderer side there's a corresponding PluginChannelHost. class PluginChannel : public PluginChannelBase { public: - static PluginChannel* GetPluginChannel( - int process_id, MessageLoop* ipc_message_loop); + // Get a new PluginChannel object for the current process. + // POSIX only: If |channel_fd| > 0, use that file descriptor for the + // channel socket. + static PluginChannel* GetPluginChannel(int process_id, + MessageLoop* ipc_message_loop, + int channel_fd); ~PluginChannel(); diff --git a/chrome/plugin/plugin_thread.cc b/chrome/plugin/plugin_thread.cc index cb92de4..2f9c2ec 100644 --- a/chrome/plugin/plugin_thread.cc +++ b/chrome/plugin/plugin_thread.cc @@ -102,10 +102,19 @@ void PluginThread::CleanUp() { lazy_tls.Pointer()->Set(NULL); } -void PluginThread::OnCreateChannel(int process_id, bool off_the_record) { +void PluginThread::OnCreateChannel( +#if defined(OS_POSIX) + base::FileDescriptor socket, +#endif + int process_id, + bool off_the_record) { + int fd = -1; +#if defined(OS_POSIX) + fd = socket.fd; +#endif std::string channel_name; scoped_refptr<PluginChannel> channel = - PluginChannel::GetPluginChannel(process_id, owner_loop()); + PluginChannel::GetPluginChannel(process_id, owner_loop(), fd); if (channel.get()) { channel_name = channel->channel_name(); channel->set_off_the_record(off_the_record); diff --git a/chrome/plugin/plugin_thread.h b/chrome/plugin/plugin_thread.h index 052be0a..911940a 100644 --- a/chrome/plugin/plugin_thread.h +++ b/chrome/plugin/plugin_thread.h @@ -7,10 +7,15 @@ #include "base/file_path.h" #include "base/native_library.h" +#include "build/build_config.h" #include "chrome/common/child_thread.h" #include "chrome/plugin/plugin_channel.h" #include "webkit/glue/plugins/plugin_lib.h" +#if defined(OS_POSIX) +#include "base/file_descriptor_posix.h" +#endif + class NotificationService; // The PluginThread class represents a background thread where plugin instances @@ -31,7 +36,14 @@ class PluginThread : public ChildThread { virtual void Init(); virtual void CleanUp(); - void OnCreateChannel(int process_id, bool off_the_record); + // Callback for when a channel has been created. + // On POSIX, |socket| is the channel endpoint socket. + void OnCreateChannel( +#if defined(OS_POSIX) + base::FileDescriptor socket, +#endif + int process_id, + bool off_the_record); void OnPluginMessage(const std::vector<uint8> &data); scoped_ptr<NotificationService> notification_service_; diff --git a/chrome/plugin/webplugin_delegate_stub.cc b/chrome/plugin/webplugin_delegate_stub.cc index 800db41..8cc3273 100644 --- a/chrome/plugin/webplugin_delegate_stub.cc +++ b/chrome/plugin/webplugin_delegate_stub.cc @@ -135,9 +135,9 @@ void WebPluginDelegateStub::OnInit(const PluginMsg_Init_Params& params, delegate_ = WebPluginDelegate::Create( path, mime_type_, gfx::NativeViewFromId(params.containing_window)); #else - // We don't have gfx::NativeViewFromId on Linux - NOTIMPLEMENTED(); - delegate_ = NULL; + NOTIMPLEMENTED() << " need to figure out nativeview id business"; + delegate_ = WebPluginDelegate::Create( + path, mime_type_, NULL); #endif if (delegate_) { |