| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/ppapi_plugin/ppapi_thread.h" | 5 #include "content/ppapi_plugin/ppapi_thread.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/process_util.h" | 10 #include "base/process_util.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 local_pp_module_( | 44 local_pp_module_( |
| 45 base::RandInt(0, std::numeric_limits<PP_Module>::max())), | 45 base::RandInt(0, std::numeric_limits<PP_Module>::max())), |
| 46 next_plugin_dispatcher_id_(1) { | 46 next_plugin_dispatcher_id_(1) { |
| 47 } | 47 } |
| 48 | 48 |
| 49 PpapiThread::~PpapiThread() { | 49 PpapiThread::~PpapiThread() { |
| 50 if (!library_.is_valid()) | 50 if (!library_.is_valid()) |
| 51 return; | 51 return; |
| 52 | 52 |
| 53 // The ShutdownModule/ShutdownBroker function is optional. | 53 // The ShutdownModule/ShutdownBroker function is optional. |
| 54 pp::proxy::ProxyChannel::ShutdownModuleFunc shutdown_function = | 54 ppapi::proxy::ProxyChannel::ShutdownModuleFunc shutdown_function = |
| 55 is_broker_ ? | 55 is_broker_ ? |
| 56 reinterpret_cast<pp::proxy::ProxyChannel::ShutdownModuleFunc>( | 56 reinterpret_cast<ppapi::proxy::ProxyChannel::ShutdownModuleFunc>( |
| 57 library_.GetFunctionPointer("PPP_ShutdownBroker")) : | 57 library_.GetFunctionPointer("PPP_ShutdownBroker")) : |
| 58 reinterpret_cast<pp::proxy::ProxyChannel::ShutdownModuleFunc>( | 58 reinterpret_cast<ppapi::proxy::ProxyChannel::ShutdownModuleFunc>( |
| 59 library_.GetFunctionPointer("PPP_ShutdownModule")); | 59 library_.GetFunctionPointer("PPP_ShutdownModule")); |
| 60 if (shutdown_function) | 60 if (shutdown_function) |
| 61 shutdown_function(); | 61 shutdown_function(); |
| 62 } | 62 } |
| 63 | 63 |
| 64 // The "regular" ChildThread implements this function and does some standard | 64 // The "regular" ChildThread implements this function and does some standard |
| 65 // dispatching, then uses the message router. We don't actually need any of | 65 // dispatching, then uses the message router. We don't actually need any of |
| 66 // this so this function just overrides that one. | 66 // this so this function just overrides that one. |
| 67 // | 67 // |
| 68 // Note that this function is called only for messages from the channel to the | 68 // Note that this function is called only for messages from the channel to the |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 const base::Closure& task) { | 105 const base::Closure& task) { |
| 106 if (!webkit_thread_.get()) | 106 if (!webkit_thread_.get()) |
| 107 webkit_thread_.reset(new PpapiWebKitThread); | 107 webkit_thread_.reset(new PpapiWebKitThread); |
| 108 webkit_thread_->PostTask(from_here, task); | 108 webkit_thread_->PostTask(from_here, task); |
| 109 } | 109 } |
| 110 | 110 |
| 111 bool PpapiThread::SendToBrowser(IPC::Message* msg) { | 111 bool PpapiThread::SendToBrowser(IPC::Message* msg) { |
| 112 return Send(msg); | 112 return Send(msg); |
| 113 } | 113 } |
| 114 | 114 |
| 115 uint32 PpapiThread::Register(pp::proxy::PluginDispatcher* plugin_dispatcher) { | 115 uint32 PpapiThread::Register(ppapi::proxy::PluginDispatcher* plugin_dispatcher)
{ |
| 116 if (!plugin_dispatcher || | 116 if (!plugin_dispatcher || |
| 117 plugin_dispatchers_.size() >= std::numeric_limits<uint32>::max()) { | 117 plugin_dispatchers_.size() >= std::numeric_limits<uint32>::max()) { |
| 118 return 0; | 118 return 0; |
| 119 } | 119 } |
| 120 | 120 |
| 121 uint32 id = 0; | 121 uint32 id = 0; |
| 122 do { | 122 do { |
| 123 // Although it is unlikely, make sure that we won't cause any trouble when | 123 // Although it is unlikely, make sure that we won't cause any trouble when |
| 124 // the counter overflows. | 124 // the counter overflows. |
| 125 id = next_plugin_dispatcher_id_++; | 125 id = next_plugin_dispatcher_id_++; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 LOG(WARNING) << "InitBroker failed with error " << init_error; | 172 LOG(WARNING) << "InitBroker failed with error " << init_error; |
| 173 return; | 173 return; |
| 174 } | 174 } |
| 175 if (!connect_instance_func_) { | 175 if (!connect_instance_func_) { |
| 176 LOG(WARNING) << "InitBroker did not provide PP_ConnectInstance_Func"; | 176 LOG(WARNING) << "InitBroker did not provide PP_ConnectInstance_Func"; |
| 177 return; | 177 return; |
| 178 } | 178 } |
| 179 } else { | 179 } else { |
| 180 // Get the GetInterface function (required). | 180 // Get the GetInterface function (required). |
| 181 get_plugin_interface_ = | 181 get_plugin_interface_ = |
| 182 reinterpret_cast<pp::proxy::Dispatcher::GetInterfaceFunc>( | 182 reinterpret_cast<ppapi::proxy::Dispatcher::GetInterfaceFunc>( |
| 183 library.GetFunctionPointer("PPP_GetInterface")); | 183 library.GetFunctionPointer("PPP_GetInterface")); |
| 184 if (!get_plugin_interface_) { | 184 if (!get_plugin_interface_) { |
| 185 LOG(WARNING) << "No PPP_GetInterface in plugin library"; | 185 LOG(WARNING) << "No PPP_GetInterface in plugin library"; |
| 186 return; | 186 return; |
| 187 } | 187 } |
| 188 | 188 |
| 189 #if defined(OS_MACOSX) | 189 #if defined(OS_MACOSX) |
| 190 // We need to do this after getting |PPP_GetInterface()| (or presumably | 190 // We need to do this after getting |PPP_GetInterface()| (or presumably |
| 191 // doing something nontrivial with the library), else the sandbox | 191 // doing something nontrivial with the library), else the sandbox |
| 192 // intercedes. | 192 // intercedes. |
| 193 CommandLine* parsed_command_line = CommandLine::ForCurrentProcess(); | 193 CommandLine* parsed_command_line = CommandLine::ForCurrentProcess(); |
| 194 SandboxInitWrapper sandbox_wrapper; | 194 SandboxInitWrapper sandbox_wrapper; |
| 195 if (!sandbox_wrapper.InitializeSandbox(*parsed_command_line, | 195 if (!sandbox_wrapper.InitializeSandbox(*parsed_command_line, |
| 196 switches::kPpapiPluginProcess)) | 196 switches::kPpapiPluginProcess)) |
| 197 LOG(WARNING) << "Failed to initialize sandbox"; | 197 LOG(WARNING) << "Failed to initialize sandbox"; |
| 198 #endif | 198 #endif |
| 199 | 199 |
| 200 // Get the InitializeModule function (required). | 200 // Get the InitializeModule function (required). |
| 201 pp::proxy::Dispatcher::InitModuleFunc init_module = | 201 ppapi::proxy::Dispatcher::InitModuleFunc init_module = |
| 202 reinterpret_cast<pp::proxy::Dispatcher::InitModuleFunc>( | 202 reinterpret_cast<ppapi::proxy::Dispatcher::InitModuleFunc>( |
| 203 library.GetFunctionPointer("PPP_InitializeModule")); | 203 library.GetFunctionPointer("PPP_InitializeModule")); |
| 204 if (!init_module) { | 204 if (!init_module) { |
| 205 LOG(WARNING) << "No PPP_InitializeModule in plugin library"; | 205 LOG(WARNING) << "No PPP_InitializeModule in plugin library"; |
| 206 return; | 206 return; |
| 207 } | 207 } |
| 208 int32_t init_error = init_module( | 208 int32_t init_error = init_module( |
| 209 local_pp_module_, | 209 local_pp_module_, |
| 210 &pp::proxy::PluginDispatcher::GetInterfaceFromDispatcher); | 210 &ppapi::proxy::PluginDispatcher::GetInterfaceFromDispatcher); |
| 211 if (init_error != PP_OK) { | 211 if (init_error != PP_OK) { |
| 212 LOG(WARNING) << "InitModule failed with error " << init_error; | 212 LOG(WARNING) << "InitModule failed with error " << init_error; |
| 213 return; | 213 return; |
| 214 } | 214 } |
| 215 } | 215 } |
| 216 | 216 |
| 217 library_.Reset(library.Release()); | 217 library_.Reset(library.Release()); |
| 218 } | 218 } |
| 219 | 219 |
| 220 void PpapiThread::OnMsgCreateChannel(base::ProcessHandle host_process_handle, | 220 void PpapiThread::OnMsgCreateChannel(base::ProcessHandle host_process_handle, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 240 } | 240 } |
| 241 | 241 |
| 242 void PpapiThread::OnPluginDispatcherMessageReceived(const IPC::Message& msg) { | 242 void PpapiThread::OnPluginDispatcherMessageReceived(const IPC::Message& msg) { |
| 243 // The first parameter should be a plugin dispatcher ID. | 243 // The first parameter should be a plugin dispatcher ID. |
| 244 void* iter = NULL; | 244 void* iter = NULL; |
| 245 uint32 id = 0; | 245 uint32 id = 0; |
| 246 if (!msg.ReadUInt32(&iter, &id)) { | 246 if (!msg.ReadUInt32(&iter, &id)) { |
| 247 NOTREACHED(); | 247 NOTREACHED(); |
| 248 return; | 248 return; |
| 249 } | 249 } |
| 250 std::map<uint32, pp::proxy::PluginDispatcher*>::iterator dispatcher = | 250 std::map<uint32, ppapi::proxy::PluginDispatcher*>::iterator dispatcher = |
| 251 plugin_dispatchers_.find(id); | 251 plugin_dispatchers_.find(id); |
| 252 if (dispatcher != plugin_dispatchers_.end()) | 252 if (dispatcher != plugin_dispatchers_.end()) |
| 253 dispatcher->second->OnMessageReceived(msg); | 253 dispatcher->second->OnMessageReceived(msg); |
| 254 } | 254 } |
| 255 | 255 |
| 256 bool PpapiThread::SetupRendererChannel(base::ProcessHandle host_process_handle, | 256 bool PpapiThread::SetupRendererChannel(base::ProcessHandle host_process_handle, |
| 257 int renderer_id, | 257 int renderer_id, |
| 258 IPC::ChannelHandle* handle) { | 258 IPC::ChannelHandle* handle) { |
| 259 DCHECK(is_broker_ == (connect_instance_func_ != NULL)); | 259 DCHECK(is_broker_ == (connect_instance_func_ != NULL)); |
| 260 DCHECK(is_broker_ == (get_plugin_interface_ == NULL)); | 260 DCHECK(is_broker_ == (get_plugin_interface_ == NULL)); |
| 261 IPC::ChannelHandle plugin_handle; | 261 IPC::ChannelHandle plugin_handle; |
| 262 plugin_handle.name = StringPrintf("%d.r%d", base::GetCurrentProcId(), | 262 plugin_handle.name = StringPrintf("%d.r%d", base::GetCurrentProcId(), |
| 263 renderer_id); | 263 renderer_id); |
| 264 | 264 |
| 265 pp::proxy::ProxyChannel* dispatcher = NULL; | 265 ppapi::proxy::ProxyChannel* dispatcher = NULL; |
| 266 bool init_result = false; | 266 bool init_result = false; |
| 267 if (is_broker_) { | 267 if (is_broker_) { |
| 268 BrokerProcessDispatcher* broker_dispatcher = | 268 BrokerProcessDispatcher* broker_dispatcher = |
| 269 new BrokerProcessDispatcher(host_process_handle, | 269 new BrokerProcessDispatcher(host_process_handle, |
| 270 connect_instance_func_); | 270 connect_instance_func_); |
| 271 init_result = broker_dispatcher->InitBrokerWithChannel(this, | 271 init_result = broker_dispatcher->InitBrokerWithChannel(this, |
| 272 plugin_handle, | 272 plugin_handle, |
| 273 false); | 273 false); |
| 274 dispatcher = broker_dispatcher; | 274 dispatcher = broker_dispatcher; |
| 275 } else { | 275 } else { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 290 #if defined(OS_POSIX) | 290 #if defined(OS_POSIX) |
| 291 // On POSIX, pass the renderer-side FD. | 291 // On POSIX, pass the renderer-side FD. |
| 292 handle->socket = base::FileDescriptor(::dup(dispatcher->GetRendererFD()), | 292 handle->socket = base::FileDescriptor(::dup(dispatcher->GetRendererFD()), |
| 293 true); | 293 true); |
| 294 #endif | 294 #endif |
| 295 | 295 |
| 296 // From here, the dispatcher will manage its own lifetime according to the | 296 // From here, the dispatcher will manage its own lifetime according to the |
| 297 // lifetime of the attached channel. | 297 // lifetime of the attached channel. |
| 298 return true; | 298 return true; |
| 299 } | 299 } |
| OLD | NEW |