| Index: ppapi/proxy/ppp_instance_proxy.cc
|
| ===================================================================
|
| --- ppapi/proxy/ppp_instance_proxy.cc (revision 74021)
|
| +++ ppapi/proxy/ppp_instance_proxy.cc (working copy)
|
| @@ -1,4 +1,4 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| @@ -100,6 +100,11 @@
|
| &GetInstanceObject
|
| };
|
|
|
| +InterfaceProxy* CreateInstanceProxy(Dispatcher* dispatcher,
|
| + const void* target_interface) {
|
| + return new PPP_Instance_Proxy(dispatcher, target_interface);
|
| +}
|
| +
|
| } // namespace
|
|
|
| PPP_Instance_Proxy::PPP_Instance_Proxy(Dispatcher* dispatcher,
|
| @@ -110,14 +115,18 @@
|
| PPP_Instance_Proxy::~PPP_Instance_Proxy() {
|
| }
|
|
|
| -const void* PPP_Instance_Proxy::GetSourceInterface() const {
|
| - return &instance_interface;
|
| +// static
|
| +const InterfaceProxy::Info* PPP_Instance_Proxy::GetInfo() {
|
| + static const Info info = {
|
| + &instance_interface,
|
| + PPP_INSTANCE_INTERFACE,
|
| + INTERFACE_ID_PPP_INSTANCE,
|
| + false,
|
| + &CreateInstanceProxy,
|
| + };
|
| + return &info;
|
| }
|
|
|
| -InterfaceID PPP_Instance_Proxy::GetInterfaceId() const {
|
| - return INTERFACE_ID_PPP_INSTANCE;
|
| -}
|
| -
|
| bool PPP_Instance_Proxy::OnMessageReceived(const IPC::Message& msg) {
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(PPP_Instance_Proxy, msg)
|
| @@ -149,10 +158,12 @@
|
| if (argn.size() != argv.size())
|
| return;
|
|
|
| - PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
|
| - if (!dispatcher)
|
| - return;
|
| - dispatcher->DidCreateInstance(instance);
|
| + // Set up the routing associating this new instance with the dispatcher we
|
| + // just got the message from. This must be done before calling into the
|
| + // plugin so it can in turn call PPAPI functions.
|
| + PluginDispatcher* plugin_dispatcher =
|
| + static_cast<PluginDispatcher*>(dispatcher());
|
| + plugin_dispatcher->DidCreateInstance(instance);
|
|
|
| // Make sure the arrays always have at least one element so we can take the
|
| // address below.
|
| @@ -169,16 +180,16 @@
|
| *result = ppp_instance_target()->DidCreate(instance,
|
| static_cast<uint32_t>(argn.size()),
|
| &argn_array[0], &argv_array[0]);
|
| - DCHECK(*result);
|
| + if (!*result) {
|
| + // In the failure to create case, this plugin instance will be torn down
|
| + // without further notification, so we also need to undo the routing.
|
| + plugin_dispatcher->DidDestroyInstance(instance);
|
| + }
|
| }
|
|
|
| void PPP_Instance_Proxy::OnMsgDidDestroy(PP_Instance instance) {
|
| ppp_instance_target()->DidDestroy(instance);
|
| - PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
|
| - if (!dispatcher)
|
| - return;
|
| -
|
| - dispatcher->DidDestroyInstance(instance);
|
| + static_cast<PluginDispatcher*>(dispatcher())->DidDestroyInstance(instance);
|
| }
|
|
|
| void PPP_Instance_Proxy::OnMsgDidChangeView(PP_Instance instance,
|
|
|