Chromium Code Reviews| Index: content/ppapi_plugin/ppapi_thread.cc |
| =================================================================== |
| --- content/ppapi_plugin/ppapi_thread.cc (revision 136164) |
| +++ content/ppapi_plugin/ppapi_thread.cc (working copy) |
| @@ -18,6 +18,7 @@ |
| #include "content/ppapi_plugin/ppapi_webkitplatformsupport_impl.h" |
| #include "content/public/common/sandbox_init.h" |
| #include "ipc/ipc_channel_handle.h" |
| +#include "ipc/ipc_platform_file.h" |
| #include "ipc/ipc_sync_channel.h" |
| #include "ppapi/c/dev/ppp_network_state_dev.h" |
| #include "ppapi/c/pp_errors.h" |
| @@ -49,7 +50,8 @@ |
| connect_instance_func_(NULL), |
| local_pp_module_( |
| base::RandInt(0, std::numeric_limits<PP_Module>::max())), |
| - next_plugin_dispatcher_id_(1) { |
| + next_plugin_dispatcher_id_(1), |
| + peer_handle_(base::kNullProcessHandle) { |
| ppapi::proxy::PluginGlobals* globals = ppapi::proxy::PluginGlobals::Get(); |
| globals->set_plugin_proxy_delegate(this); |
| globals->set_command_line( |
| @@ -117,6 +119,12 @@ |
| IPC_END_MESSAGE_MAP() |
| return true; |
| } |
| +void PpapiThread::OnChannelConnected(int32 peer_pid) { |
|
jschuh
2012/05/10 00:10:57
We cache a handle to the other end here, because i
|
| +#if defined(OS_WIN) |
| + if (is_broker_) |
| + peer_handle_ = ::OpenProcess(PROCESS_DUP_HANDLE, FALSE, peer_pid); |
|
cpu_(ooo_6.6-7.5)
2012/05/10 22:10:43
do we ever close the peer handle? base::ProcessHan
jschuh
2012/05/10 22:16:28
D'oh. I thought I'd made that a scoped handle. Fix
|
| +#endif |
| +} |
| base::MessageLoopProxy* PpapiThread::GetIPCMessageLoop() { |
| return ChildProcess::current()->io_message_loop_proxy(); |
| @@ -126,6 +134,23 @@ |
| return ChildProcess::current()->GetShutDownEvent(); |
| } |
| +IPC::PlatformFileForTransit PpapiThread::ShareHandleWithRemote( |
|
jschuh
2012/05/10 00:10:57
Here's the handle duping logic.
|
| + base::PlatformFile handle, |
| + const IPC::SyncChannel& channel, |
| + bool should_close_source) { |
| + IPC::PlatformFileForTransit out_handle; |
| + if (peer_handle_) { |
| + DCHECK(is_broker_); |
| + return IPC::GetFileHandleForProcess(handle, peer_handle_, |
| + should_close_source); |
| + } else { |
| + DCHECK(!is_broker_); |
| + return content::BrokerGetFileHandleForProcess(handle, channel.peer_pid(), |
| + should_close_source); |
| + } |
| + return out_handle; |
| +} |
| + |
| std::set<PP_Instance>* PpapiThread::GetGloballySeenInstanceIDSet() { |
| return &globally_seen_instance_ids_; |
| } |
| @@ -247,13 +272,11 @@ |
| library_.Reset(library.Release()); |
| } |
| -void PpapiThread::OnMsgCreateChannel(base::ProcessHandle host_process_handle, |
| - int renderer_id, |
| +void PpapiThread::OnMsgCreateChannel(int renderer_id, |
| bool incognito) { |
| IPC::ChannelHandle channel_handle; |
| if (!library_.is_valid() || // Plugin couldn't be loaded. |
| - !SetupRendererChannel(host_process_handle, renderer_id, incognito, |
| - &channel_handle)) { |
| + !SetupRendererChannel(renderer_id, incognito, &channel_handle)) { |
| Send(new PpapiHostMsg_ChannelCreated(IPC::ChannelHandle())); |
| return; |
| } |
| @@ -284,8 +307,7 @@ |
| dispatcher->second->OnMessageReceived(msg); |
| } |
| -bool PpapiThread::SetupRendererChannel(base::ProcessHandle host_process_handle, |
| - int renderer_id, |
| +bool PpapiThread::SetupRendererChannel(int renderer_id, |
| bool incognito, |
| IPC::ChannelHandle* handle) { |
| DCHECK(is_broker_ == (connect_instance_func_ != NULL)); |
| @@ -297,8 +319,7 @@ |
| bool init_result = false; |
| if (is_broker_) { |
| BrokerProcessDispatcher* broker_dispatcher = |
| - new BrokerProcessDispatcher(host_process_handle, |
| - get_plugin_interface_, |
| + new BrokerProcessDispatcher(get_plugin_interface_, |
| connect_instance_func_); |
| init_result = broker_dispatcher->InitBrokerWithChannel(this, |
| plugin_handle, |
| @@ -306,8 +327,7 @@ |
| dispatcher = broker_dispatcher; |
| } else { |
| PluginProcessDispatcher* plugin_dispatcher = |
| - new PluginProcessDispatcher(host_process_handle, get_plugin_interface_, |
| - incognito); |
| + new PluginProcessDispatcher(get_plugin_interface_, incognito); |
| init_result = plugin_dispatcher->InitPluginWithChannel(this, |
| plugin_handle, |
| false); |