| Index: ppapi/proxy/plugin_dispatcher.cc
|
| ===================================================================
|
| --- ppapi/proxy/plugin_dispatcher.cc (revision 100758)
|
| +++ ppapi/proxy/plugin_dispatcher.cc (working copy)
|
| @@ -13,6 +13,7 @@
|
| #include "ipc/ipc_sync_channel.h"
|
| #include "base/debug/trace_event.h"
|
| #include "ppapi/c/pp_errors.h"
|
| +#include "ppapi/proxy/interface_list.h"
|
| #include "ppapi/proxy/interface_proxy.h"
|
| #include "ppapi/proxy/plugin_message_filter.h"
|
| #include "ppapi/proxy/plugin_resource_tracker.h"
|
| @@ -49,11 +50,6 @@
|
| received_preferences_(false),
|
| plugin_dispatcher_id_(0) {
|
| SetSerializationRules(new PluginVarSerializationRules);
|
| -
|
| - // As a plugin, we always support the PPP_Class interface. There's no
|
| - // GetInterface call or name for it, so we insert it into our table now.
|
| - target_proxies_[INTERFACE_ID_PPP_CLASS].reset(new PPP_Class_Proxy(this));
|
| -
|
| TrackerBase::Init(&PluginResourceTracker::GetTrackerBaseInstance);
|
| }
|
|
|
| @@ -79,15 +75,21 @@
|
| }
|
|
|
| // static
|
| -const void* PluginDispatcher::GetInterfaceFromDispatcher(
|
| - const char* dispatcher_interface) {
|
| - // All interfaces the plugin requests of the browser are "PPB".
|
| - const InterfaceProxy::Info* info = GetPPBInterfaceInfo(dispatcher_interface);
|
| - if (!info)
|
| - return NULL;
|
| - return info->interface_ptr;
|
| +const void* PluginDispatcher::GetBrowserInterface(const char* interface) {
|
| + return InterfaceList::GetInstance()->GetInterfaceForPPB(interface);
|
| }
|
|
|
| +const void* PluginDispatcher::GetPluginInterface(
|
| + const std::string& interface_name) {
|
| + InterfaceMap::iterator found = plugin_interfaces_.find(interface_name);
|
| + if (found == plugin_interfaces_.end()) {
|
| + const void* ret = local_get_interface()(interface_name.c_str());
|
| + plugin_interfaces_.insert(std::make_pair(interface_name, ret));
|
| + return ret;
|
| + }
|
| + return found->second;
|
| +}
|
| +
|
| bool PluginDispatcher::InitPluginWithChannel(
|
| PluginDelegate* delegate,
|
| const IPC::ChannelHandle& channel_handle,
|
| @@ -127,56 +129,18 @@
|
| TRACE_EVENT2("ppapi proxy", "PluginDispatcher::OnMessageReceived",
|
| "Class", IPC_MESSAGE_ID_CLASS(msg.type()),
|
| "Line", IPC_MESSAGE_ID_LINE(msg.type()));
|
| - // Handle common control messages.
|
| - if (Dispatcher::OnMessageReceived(msg))
|
| - return true;
|
| -
|
| if (msg.routing_id() == MSG_ROUTING_CONTROL) {
|
| // Handle some plugin-specific control messages.
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(PluginDispatcher, msg)
|
| IPC_MESSAGE_HANDLER(PpapiMsg_SupportsInterface, OnMsgSupportsInterface)
|
| IPC_MESSAGE_HANDLER(PpapiMsg_SetPreferences, OnMsgSetPreferences)
|
| + IPC_MESSAGE_UNHANDLED(handled = false);
|
| IPC_END_MESSAGE_MAP()
|
| - return handled;
|
| - }
|
| -
|
| - if (msg.routing_id() <= 0 || msg.routing_id() >= INTERFACE_ID_COUNT) {
|
| - // Host is sending us garbage. Since it's supposed to be trusted, this
|
| - // isn't supposed to happen. Crash here in all builds in case the renderer
|
| - // is compromised.
|
| - CHECK(false);
|
| - return true;
|
| - }
|
| -
|
| - // There are two cases:
|
| - //
|
| - // * The first case is that the host is calling a PPP interface. It will
|
| - // always do a check for the interface before sending messages, and this
|
| - // will create the necessary interface proxy at that time. So when we
|
| - // actually receive a message, we know such a proxy will exist.
|
| - //
|
| - // * The second case is that the host is sending a response to the plugin
|
| - // side of a PPB interface (some, like the URL loader, have complex
|
| - // response messages). Since the host is trusted and not supposed to be
|
| - // doing silly things, we can just create a PPB proxy project on demand the
|
| - // first time it's needed.
|
| -
|
| - InterfaceProxy* proxy = target_proxies_[msg.routing_id()].get();
|
| - if (!proxy) {
|
| - // Handle the first time the host calls a PPB reply interface by
|
| - // autocreating it.
|
| - const InterfaceProxy::Info* info = GetPPBInterfaceInfo(
|
| - static_cast<InterfaceID>(msg.routing_id()));
|
| - if (!info) {
|
| - NOTREACHED();
|
| + if (handled)
|
| return true;
|
| - }
|
| - proxy = info->create_proxy(this, NULL);
|
| - target_proxies_[info->id].reset(proxy);
|
| }
|
| -
|
| - return proxy->OnMessageReceived(msg);
|
| + return Dispatcher::OnMessageReceived(msg);
|
| }
|
|
|
| void PluginDispatcher::OnChannelError() {
|
| @@ -234,23 +198,7 @@
|
| }
|
|
|
| FunctionGroupBase* PluginDispatcher::GetFunctionAPI(InterfaceID id) {
|
| - scoped_ptr<FunctionGroupBase >& proxy = function_proxies_[id];
|
| -
|
| - if (proxy.get())
|
| - return proxy.get();
|
| -
|
| - if (id == INTERFACE_ID_PPB_CHAR_SET)
|
| - proxy.reset(new PPB_CharSet_Proxy(this, NULL));
|
| - else if(id == INTERFACE_ID_PPB_CURSORCONTROL)
|
| - proxy.reset(new PPB_CursorControl_Proxy(this, NULL));
|
| - else if (id == INTERFACE_ID_PPB_FONT)
|
| - proxy.reset(new PPB_Font_Proxy(this, NULL));
|
| - else if (id == INTERFACE_ID_PPB_INSTANCE)
|
| - proxy.reset(new PPB_Instance_Proxy(this, NULL));
|
| - else if (id == INTERFACE_ID_RESOURCE_CREATION)
|
| - proxy.reset(new ResourceCreationProxy(this));
|
| -
|
| - return proxy.get();
|
| + return GetInterfaceProxy(id);
|
| }
|
|
|
| void PluginDispatcher::ForceFreeAllInstances() {
|
| @@ -274,26 +222,7 @@
|
| void PluginDispatcher::OnMsgSupportsInterface(
|
| const std::string& interface_name,
|
| bool* result) {
|
| - *result = false;
|
| -
|
| - // Setup a proxy for receiving the messages from this interface.
|
| - const InterfaceProxy::Info* info = GetPPPInterfaceInfo(interface_name);
|
| - if (!info)
|
| - return; // Interface not supported by proxy.
|
| -
|
| - // Check for a cached result.
|
| - if (target_proxies_[info->id].get()) {
|
| - *result = true;
|
| - return;
|
| - }
|
| -
|
| - // Query the plugin & cache the result.
|
| - const void* interface_functions = GetLocalInterface(interface_name.c_str());
|
| - if (!interface_functions)
|
| - return;
|
| - target_proxies_[info->id].reset(
|
| - info->create_proxy(this, interface_functions));
|
| - *result = true;
|
| + *result = !!GetPluginInterface(interface_name);
|
| }
|
|
|
| void PluginDispatcher::OnMsgSetPreferences(const Preferences& prefs) {
|
|
|