ppp_instance_proxy.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppp_instance_proxy.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_var.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_core.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_fullscreen.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_instance.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_flash_fullscreen.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/host_dispatcher.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_dispatcher.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_resource_tracker.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppb_url_loader_proxy.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_globals.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_view_shared.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/scoped_pp_resource.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_view_api.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool IsFlashFullscreen(PP_Instance instance, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher* dispatcher) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPB_FlashFullscreen* flash_fullscreen_interface = 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPB_FlashFullscreen*>( 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->local_get_interface()(PPB_FLASHFULLSCREEN_INTERFACE)); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(flash_fullscreen_interface); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return flash_fullscreen_interface->IsFullscreen(instance); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool DidCreate(PP_Instance instance, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t argc, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* argn[], 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* argv[]) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> argn_vect; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> argv_vect; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32_t i = 0; i < argc; i++) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argn_vect.push_back(std::string(argn[i])); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argv_vect.push_back(std::string(argv[i])); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool result = PP_FALSE; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher::GetForInstance(instance)->Send( 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PpapiMsg_PPPInstance_DidCreate(API_ID_PPP_INSTANCE, instance, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argn_vect, argv_vect, &result)); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DidDestroy(PP_Instance instance) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher::GetForInstance(instance)->Send( 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PpapiMsg_PPPInstance_DidDestroy(API_ID_PPP_INSTANCE, instance)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DidChangeView(PP_Instance instance, PP_Resource view_resource) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thunk::EnterResourceNoLock<thunk::PPB_View_API> enter(view_resource, false); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send(new PpapiMsg_PPPInstance_DidChangeView( 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPP_INSTANCE, instance, enter.object()->GetData(), 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsFlashFullscreen(instance, dispatcher))); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DidChangeFocus(PP_Instance instance, PP_Bool has_focus) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher::GetForInstance(instance)->Send( 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PpapiMsg_PPPInstance_DidChangeFocus(API_ID_PPP_INSTANCE, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, has_focus)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool HandleDocumentLoad(PP_Instance instance, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource url_loader) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool result = PP_FALSE; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up the URLLoader for proxying. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPB_URLLoader_Proxy* url_loader_proxy = static_cast<PPB_URLLoader_Proxy*>( 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->GetInterfaceProxy(API_ID_PPB_URL_LOADER)); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_loader_proxy->PrepareURLLoaderForSendingToPlugin(url_loader); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PluginResourceTracker in the plugin process assumes that resources that it 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tracks have been addrefed on behalf of the plugin at the renderer side. So 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we explicitly do it for |url_loader| here. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Please also see comments in PPP_Instance_Proxy::OnMsgHandleDocumentLoad() 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // about releasing of this extra reference. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPB_Core* core = reinterpret_cast<const PPB_Core*>( 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->local_get_interface()(PPB_CORE_INTERFACE)); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!core) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) core->AddRefResource(url_loader); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostResource serialized_loader; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_loader.SetHostResource(instance, url_loader); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send(new PpapiMsg_PPPInstance_HandleDocumentLoad( 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPP_INSTANCE, instance, serialized_loader, &result)); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const PPP_Instance_1_1 instance_interface = { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &DidCreate, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &DidDestroy, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &DidChangeView, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &DidChangeFocus, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HandleDocumentLoad 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_Instance_Proxy::PPP_Instance_Proxy(Dispatcher* dispatcher) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : InterfaceProxy(dispatcher) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dispatcher->IsPlugin()) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The PPP_Instance proxy works by always proxying the 1.1 version of the 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interface, and then detecting in the plugin process which one to use. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PPP_Instance_Combined handles dispatching to whatever interface is 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // supported. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This means that if the plugin supports either 1.0 or 1.1 version of 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the interface, we want to say it supports the 1.1 version since we'll 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // convert it here. This magic conversion code is hardcoded into 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PluginDispatcher::OnMsgSupportsInterface. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) combined_interface_.reset(PPP_Instance_Combined::Create( 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(dispatcher->local_get_interface()))); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_Instance_Proxy::~PPP_Instance_Proxy() { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPP_Instance* PPP_Instance_Proxy::GetInstanceInterface() { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &instance_interface; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PPP_Instance_Proxy::OnMessageReceived(const IPC::Message& msg) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(PPP_Instance_Proxy, msg) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidCreate, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPluginMsgDidCreate) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidDestroy, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPluginMsgDidDestroy) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidChangeView, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPluginMsgDidChangeView) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidChangeFocus, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPluginMsgDidChangeFocus) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_HandleDocumentLoad, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPluginMsgHandleDocumentLoad) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Proxy::OnPluginMsgDidCreate( 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& argn, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& argv, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool* result) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = PP_FALSE; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (argn.size() != argv.size()) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up the routing associating this new instance with the dispatcher we 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just got the message from. This must be done before calling into the 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // plugin so it can in turn call PPAPI functions. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginDispatcher* plugin_dispatcher = 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<PluginDispatcher*>(dispatcher()); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_dispatcher->DidCreateInstance(instance); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->DidCreateInstance(instance); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the arrays always have at least one element so we can take the 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // address below. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<const char*> argn_array( 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(static_cast<size_t>(1), argn.size())); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<const char*> argv_array( 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(static_cast<size_t>(1), argn.size())); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < argn.size(); i++) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argn_array[i] = argn[i].c_str(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argv_array[i] = argv[i].c_str(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(combined_interface_.get()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = combined_interface_->DidCreate(instance, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<uint32_t>(argn.size()), 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &argn_array[0], &argv_array[0]); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Proxy::OnPluginMsgDidDestroy(PP_Instance instance) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) combined_interface_->DidDestroy(instance); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals* globals = PpapiGlobals::Get(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) globals->GetResourceTracker()->DidDeleteInstance(instance); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) globals->GetVarTracker()->DidDeleteInstance(instance); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<PluginDispatcher*>(dispatcher())->DidDestroyInstance(instance); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Proxy::OnPluginMsgDidChangeView( 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewData& new_data, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool flash_fullscreen) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstanceData* data = dispatcher->GetInstanceData(instance); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!data) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data->view = new_data; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data->flash_fullscreen = flash_fullscreen; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedPPResource resource( 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedPPResource::PassRef(), 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (new PPB_View_Shared(OBJECT_IS_PROXY, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, new_data))->GetReference()); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) combined_interface_->DidChangeView(instance, resource, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &new_data.rect, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &new_data.clip_rect); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Proxy::OnPluginMsgDidChangeFocus(PP_Instance instance, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool has_focus) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) combined_interface_->DidChangeFocus(instance, has_focus); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Proxy::OnPluginMsgHandleDocumentLoad( 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HostResource& url_loader, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool* result) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource plugin_loader = 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPB_URLLoader_Proxy::TrackPluginResource(url_loader); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = combined_interface_->HandleDocumentLoad(instance, plugin_loader); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This balances the one reference that TrackPluginResource() initialized it 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with. The plugin will normally take an additional reference which will keep 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the resource alive in the plugin (and the one reference in the renderer 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // representing all plugin references). 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once all references at the plugin side are released, the renderer side will 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be notified and release the reference added in HandleDocumentLoad() above. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(plugin_loader); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace proxy 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 260