1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file. 4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/nacl_irt/ppapi_dispatcher.h" 6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <map> 8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <set> 9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "build/build_config.h" 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Need to include this before most other files because it defines 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// IPC_MESSAGE_LOG_ENABLED. We need to use it to define 13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// IPC_MESSAGE_MACROS_LOG_ENABLED so ppapi_messages.h will generate the 14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// ViewMsgLog et al. functions. 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/command_line.h" 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/memory/ref_counted.h" 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/message_loop/message_loop.h" 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/synchronization/waitable_event.h" 20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "components/tracing/child_trace_message_filter.h" 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ipc/ipc_channel_handle.h" 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ipc/ipc_logging.h" 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ipc/ipc_message.h" 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/c/ppp.h" 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/c/ppp_instance.h" 260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ppapi/nacl_irt/manifest_service.h" 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ppapi/nacl_irt/plugin_startup.h" 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/proxy/plugin_dispatcher.h" 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/proxy/plugin_globals.h" 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/proxy/plugin_message_filter.h" 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/proxy/plugin_proxy_delegate.h" 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/proxy/resource_reply_thread_registrar.h" 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(IPC_MESSAGE_LOG_ENABLED) 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/containers/hash_tables.h" 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochLogFunctionMap g_log_function_mapping; 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define IPC_MESSAGE_MACROS_LOG_ENABLED 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define IPC_LOG_TABLE_ADD_ENTRY(msg_id, logger) \ 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch g_log_function_mapping[msg_id] = logger 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/proxy/ppapi_messages.h" 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace ppapi { 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochPpapiDispatcher::PpapiDispatcher(scoped_refptr<base::MessageLoopProxy> io_loop, 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::WaitableEvent* shutdown_event, 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int browser_ipc_fd, 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int renderer_ipc_fd) 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : next_plugin_dispatcher_id_(0), 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch message_loop_(io_loop), 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch shutdown_event_(shutdown_event), 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch renderer_ipc_fd_(renderer_ipc_fd) { 56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(IPC_MESSAGE_LOG_ENABLED) 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC::Logging::set_log_function_map(&g_log_function_mapping); 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC::ChannelHandle channel_handle( 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "NaCl IPC", base::FileDescriptor(browser_ipc_fd, false)); 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Delay initializing the SyncChannel until after we add filters. This 64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // ensures that the filters won't miss any messages received by 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // the channel. 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) channel_ = 6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IPC::SyncChannel::Create(this, GetIPCMessageLoop(), GetShutdownEvent()); 68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch channel_->AddFilter(new proxy::PluginMessageFilter( 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NULL, proxy::PluginGlobals::Get()->resource_reply_thread_registrar())); 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch channel_->AddFilter( 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new tracing::ChildTraceMessageFilter(message_loop_.get())); 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch channel_->Init(channel_handle, IPC::Channel::MODE_SERVER, true); 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbase::MessageLoopProxy* PpapiDispatcher::GetIPCMessageLoop() { 76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return message_loop_.get(); 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbase::WaitableEvent* PpapiDispatcher::GetShutdownEvent() { 80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return shutdown_event_; 81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIPC::PlatformFileForTransit PpapiDispatcher::ShareHandleWithRemote( 84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::PlatformFile handle, 85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::ProcessId peer_pid, 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool should_close_source) { 87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return IPC::InvalidPlatformFileForTransit(); 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::set<PP_Instance>* PpapiDispatcher::GetGloballySeenInstanceIDSet() { 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return &instances_; 92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochuint32 PpapiDispatcher::Register(proxy::PluginDispatcher* plugin_dispatcher) { 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!plugin_dispatcher || 96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch plugin_dispatchers_.size() >= std::numeric_limits<uint32>::max()) { 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return 0; 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch uint32 id = 0; 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch do { 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Although it is unlikely, make sure that we won't cause any trouble 103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // when the counter overflows. 104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch id = next_plugin_dispatcher_id_++; 105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } while (id == 0 || 106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch plugin_dispatchers_.find(id) != plugin_dispatchers_.end()); 107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch plugin_dispatchers_[id] = plugin_dispatcher; 108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return id; 109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid PpapiDispatcher::Unregister(uint32 plugin_dispatcher_id) { 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch plugin_dispatchers_.erase(plugin_dispatcher_id); 113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIPC::Sender* PpapiDispatcher::GetBrowserSender() { 116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return this; 117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::string PpapiDispatcher::GetUILanguage() { 120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NOTIMPLEMENTED(); 121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return std::string(); 122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid PpapiDispatcher::PreCacheFont(const void* logfontw) { 125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NOTIMPLEMENTED(); 126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid PpapiDispatcher::SetActiveURL(const std::string& url) { 129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NOTIMPLEMENTED(); 130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochPP_Resource PpapiDispatcher::CreateBrowserFont( 133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch proxy::Connection connection, 134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PP_Instance instance, 135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const PP_BrowserFont_Trusted_Description& desc, 136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const Preferences& prefs) { 137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NOTIMPLEMENTED(); 138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return 0; 139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool PpapiDispatcher::OnMessageReceived(const IPC::Message& msg) { 142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC_BEGIN_MESSAGE_MAP(PpapiDispatcher, msg) 143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC_MESSAGE_HANDLER(PpapiMsg_InitializeNaClDispatcher, 144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OnMsgInitializeNaClDispatcher) 145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // All other messages are simply forwarded to a PluginDispatcher. 146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC_MESSAGE_UNHANDLED(OnPluginDispatcherMessageReceived(msg)) 147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC_END_MESSAGE_MAP() 148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid PpapiDispatcher::OnChannelError() { 152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch exit(1); 153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool PpapiDispatcher::Send(IPC::Message* msg) { 156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return channel_->Send(msg); 157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid PpapiDispatcher::OnMsgInitializeNaClDispatcher( 160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const PpapiNaClPluginArgs& args) { 161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static bool command_line_and_logging_initialized = false; 162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (command_line_and_logging_initialized) { 163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch LOG(FATAL) << "InitializeNaClDispatcher must be called once per plugin."; 164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch command_line_and_logging_initialized = true; 168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CommandLine::Init(0, NULL); 169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for (size_t i = 0; i < args.switch_names.size(); ++i) { 170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(i < args.switch_values.size()); 171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CommandLine::ForCurrentProcess()->AppendSwitchASCII( 172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch args.switch_names[i], args.switch_values[i]); 173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch logging::LoggingSettings settings; 175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; 176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch logging::InitLogging(settings); 177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch proxy::PluginGlobals::Get()->set_keepalive_throttle_interval_milliseconds( 179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch args.keepalive_throttle_interval_milliseconds); 180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Tell the process-global GetInterface which interfaces it can return to the 182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // plugin. 183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch proxy::InterfaceList::SetProcessGlobalPermissions(args.permissions); 184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int32_t error = ::PPP_InitializeModule( 186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 0 /* module */, 187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &proxy::PluginDispatcher::GetBrowserInterface); 188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (error) 189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ::exit(error); 190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch proxy::PluginDispatcher* dispatcher = 192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new proxy::PluginDispatcher(::PPP_GetInterface, args.permissions, 193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch args.off_the_record); 194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IPC::ChannelHandle channel_handle( 195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "nacl", 196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::FileDescriptor(renderer_ipc_fd_, false)); 197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!dispatcher->InitPluginWithChannel(this, base::kNullProcessId, 198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch channel_handle, false)) { 199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch delete dispatcher; 200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // From here, the dispatcher will manage its own lifetime according to the 203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // lifetime of the attached channel. 2040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Notify the renderer process, if necessary. 2060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ManifestService* manifest_service = GetManifestService(); 2070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (manifest_service) 2080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manifest_service->StartupInitializationComplete(); 209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid PpapiDispatcher::OnPluginDispatcherMessageReceived( 212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const IPC::Message& msg) { 213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The first parameter should be a plugin dispatcher ID. 214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PickleIterator iter(msg); 215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch uint32 id = 0; 216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!msg.ReadUInt32(&iter, &id)) { 217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NOTREACHED(); 218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::map<uint32, proxy::PluginDispatcher*>::iterator dispatcher = 221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch plugin_dispatchers_.find(id); 222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (dispatcher != plugin_dispatchers_.end()) 223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dispatcher->second->OnMessageReceived(msg); 224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // namespace ppapi 227