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/proxy/host_dispatcher.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_dispatcher.h" 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/proxy/plugin_globals.h" 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/proxy/plugin_proxy_delegate.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_resource_tracker.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/proxy/url_loader_resource.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_globals.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_view_shared.h" 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/shared_impl/resource_tracker.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/scoped_pp_resource.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/thunk/ppb_flash_fullscreen_api.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_view_api.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using thunk::EnterInstanceAPINoLock; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using thunk::EnterInstanceNoLock; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using thunk::EnterResourceNoLock; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using thunk::PPB_Flash_Fullscreen_API; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using thunk::PPB_Instance_API; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using thunk::PPB_View_API; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_NACL) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool DidCreate(PP_Instance instance, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t argc, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* argn[], 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* argv[]) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> argn_vect; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> argv_vect; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32_t i = 0; i < argc; i++) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argn_vect.push_back(std::string(argn[i])); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argv_vect.push_back(std::string(argv[i])); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool result = PP_FALSE; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher::GetForInstance(instance)->Send( 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PpapiMsg_PPPInstance_DidCreate(API_ID_PPP_INSTANCE, instance, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argn_vect, argv_vect, &result)); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DidDestroy(PP_Instance instance) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher::GetForInstance(instance)->Send( 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PpapiMsg_PPPInstance_DidDestroy(API_ID_PPP_INSTANCE, instance)); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DidChangeView(PP_Instance instance, PP_Resource view_resource) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterResourceNoLock<PPB_View_API> enter_view(view_resource, false); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter_view.failed()) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Bool flash_fullscreen = PP_FALSE; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterInstanceNoLock enter_instance(instance); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!enter_instance.failed()) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) flash_fullscreen = enter_instance.functions()->FlashIsFullscreen(instance); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send(new PpapiMsg_PPPInstance_DidChangeView( 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) API_ID_PPP_INSTANCE, instance, enter_view.object()->GetData(), 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) flash_fullscreen)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DidChangeFocus(PP_Instance instance, PP_Bool has_focus) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher::GetForInstance(instance)->Send( 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PpapiMsg_PPPInstance_DidChangeFocus(API_ID_PPP_INSTANCE, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, has_focus)); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)PP_Bool HandleDocumentLoad(PP_Instance instance, PP_Resource url_loader) { 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This should never get called. Out-of-process document loads are handled 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // specially. 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED(); 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return PP_FALSE; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const PPP_Instance_1_1 instance_interface = { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &DidCreate, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &DidDestroy, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &DidChangeView, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &DidChangeFocus, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HandleDocumentLoad 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // !defined(OS_NACL) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_Instance_Proxy::PPP_Instance_Proxy(Dispatcher* dispatcher) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : InterfaceProxy(dispatcher) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dispatcher->IsPlugin()) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The PPP_Instance proxy works by always proxying the 1.1 version of the 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interface, and then detecting in the plugin process which one to use. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PPP_Instance_Combined handles dispatching to whatever interface is 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // supported. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This means that if the plugin supports either 1.0 or 1.1 version of 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the interface, we want to say it supports the 1.1 version since we'll 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // convert it here. This magic conversion code is hardcoded into 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PluginDispatcher::OnMsgSupportsInterface. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) combined_interface_.reset(PPP_Instance_Combined::Create( 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(dispatcher->local_get_interface()))); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_Instance_Proxy::~PPP_Instance_Proxy() { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_NACL) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPP_Instance* PPP_Instance_Proxy::GetInstanceInterface() { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &instance_interface; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // !defined(OS_NACL) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PPP_Instance_Proxy::OnMessageReceived(const IPC::Message& msg) { 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!dispatcher()->IsPlugin()) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(PPP_Instance_Proxy, msg) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidCreate, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPluginMsgDidCreate) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidDestroy, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPluginMsgDidDestroy) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidChangeView, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPluginMsgDidChangeView) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidChangeFocus, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPluginMsgDidChangeFocus) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_HandleDocumentLoad, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPluginMsgHandleDocumentLoad) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Proxy::OnPluginMsgDidCreate( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& argn, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& argv, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool* result) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = PP_FALSE; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (argn.size() != argv.size()) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up the routing associating this new instance with the dispatcher we 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just got the message from. This must be done before calling into the 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // plugin so it can in turn call PPAPI functions. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginDispatcher* plugin_dispatcher = 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<PluginDispatcher*>(dispatcher()); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_dispatcher->DidCreateInstance(instance); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->DidCreateInstance(instance); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the arrays always have at least one element so we can take the 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // address below. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<const char*> argn_array( 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(static_cast<size_t>(1), argn.size())); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<const char*> argv_array( 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(static_cast<size_t>(1), argn.size())); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < argn.size(); i++) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argn_array[i] = argn[i].c_str(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argv_array[i] = argv[i].c_str(); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(combined_interface_.get()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = combined_interface_->DidCreate(instance, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<uint32_t>(argn.size()), 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &argn_array[0], &argv_array[0]); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Proxy::OnPluginMsgDidDestroy(PP_Instance instance) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) combined_interface_->DidDestroy(instance); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals* globals = PpapiGlobals::Get(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) globals->GetResourceTracker()->DidDeleteInstance(instance); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) globals->GetVarTracker()->DidDeleteInstance(instance); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<PluginDispatcher*>(dispatcher())->DidDestroyInstance(instance); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Proxy::OnPluginMsgDidChangeView( 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ViewData& new_data, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool flash_fullscreen) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstanceData* data = dispatcher->GetInstanceData(instance); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!data) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data->view = new_data; 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_NACL) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterInstanceAPINoLock<PPB_Flash_Fullscreen_API> enter(instance); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!enter.failed()) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enter.functions()->SetLocalIsFullscreen(instance, flash_fullscreen); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // !defined(OS_NACL) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedPPResource resource( 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedPPResource::PassRef(), 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (new PPB_View_Shared(OBJECT_IS_PROXY, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, new_data))->GetReference()); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) combined_interface_->DidChangeView(instance, resource, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &new_data.rect, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &new_data.clip_rect); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Proxy::OnPluginMsgDidChangeFocus(PP_Instance instance, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool has_focus) { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) combined_interface_->DidChangeFocus(instance, has_focus); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Proxy::OnPluginMsgHandleDocumentLoad( 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int pending_loader_host_id, 23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const URLResponseInfoData& data) { 23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); 23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!dispatcher) 23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Connection connection(PluginGlobals::Get()->GetBrowserSender(), 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) dispatcher); 24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<URLLoaderResource> loader_resource( 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new URLLoaderResource(connection, instance, 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) pending_loader_host_id, data)); 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PP_Resource loader_pp_resource = loader_resource->GetReference(); 24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!combined_interface_->HandleDocumentLoad(instance, loader_pp_resource)) 24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) loader_resource->Close(); 24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // We don't pass a ref into the plugin, if it wants one, it will have taken 25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // an additional one. 25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource( 25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) loader_pp_resource); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace proxy 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 257