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)// Note that the single accessor, Module::Get(), is not actually implemented 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in this file. This is an intentional hook that allows users of ppapi's 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C++ wrapper objects to provide different semantics for how the singleton 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// object is accessed. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In general, users of ppapi will also link in ppp_entrypoints.cc, which 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// provides a simple default implementation of Module::Get(). 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A notable exception where the default ppp_entrypoints will not work is 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// when implementing "internal plugins" that are statically linked into the 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// browser. In this case, the process may actually have multiple Modules 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// loaded at once making a traditional "singleton" unworkable. To get around 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this, the users of ppapi need to get creative about how to properly 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implement the Module::Get() so that ppapi's C++ wrappers can find the 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// right Module object. One example solution is to use thread local storage 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to change the Module* returned based on which thread is invoking the 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function. Leaving Module::Get() unimplemented provides a hook for 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementing such behavior. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_instance.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_var.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_input_event.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_instance.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_messaging.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/input_event.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/instance.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/rect.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/resource.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/url_loader.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/var.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/view.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PPP_InputEvent implementation ----------------------------------------------- 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool InputEvent_HandleEvent(PP_Instance pp_instance, PP_Resource resource) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Module* module_singleton = Module::Get(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!module_singleton) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Instance* instance = module_singleton->InstanceForPPInstance(pp_instance); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FromBool(instance->HandleInputEvent(InputEvent(resource))); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPP_InputEvent input_event_interface = { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &InputEvent_HandleEvent 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PPP_Instance implementation ------------------------------------------------- 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool Instance_DidCreate(PP_Instance pp_instance, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t argc, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* argn[], 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* argv[]) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Module* module_singleton = Module::Get(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!module_singleton) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Instance* instance = module_singleton->CreateInstance(pp_instance); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_singleton->current_instances_[pp_instance] = instance; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FromBool(instance->Init(argc, argn, argv)); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Instance_DidDestroy(PP_Instance instance) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Module* module_singleton = Module::Get(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!module_singleton) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Module::InstanceMap::iterator found = 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_singleton->current_instances_.find(instance); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (found == module_singleton->current_instances_.end()) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove it from the map before deleting to try to catch reentrancy. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Instance* obj = found->second; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_singleton->current_instances_.erase(found); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete obj; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Instance_DidChangeView(PP_Instance pp_instance, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource view_resource) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Module* module_singleton = Module::Get(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!module_singleton) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Instance* instance = module_singleton->InstanceForPPInstance(pp_instance); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->DidChangeView(View(view_resource)); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Instance_DidChangeFocus(PP_Instance pp_instance, PP_Bool has_focus) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Module* module_singleton = Module::Get(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!module_singleton) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Instance* instance = module_singleton->InstanceForPPInstance(pp_instance); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->DidChangeFocus(PP_ToBool(has_focus)); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool Instance_HandleDocumentLoad(PP_Instance pp_instance, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource pp_url_loader) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Module* module_singleton = Module::Get(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!module_singleton) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Instance* instance = module_singleton->InstanceForPPInstance(pp_instance); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FromBool(instance->HandleDocumentLoad(URLLoader(pp_url_loader))); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PPP_Instance instance_interface = { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Instance_DidCreate, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Instance_DidDestroy, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Instance_DidChangeView, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Instance_DidChangeFocus, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Instance_HandleDocumentLoad 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PPP_Messaging implementation ------------------------------------------------ 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Messaging_HandleMessage(PP_Instance pp_instance, PP_Var var) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Module* module_singleton = Module::Get(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!module_singleton) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Instance* instance = module_singleton->InstanceForPPInstance(pp_instance); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->HandleMessage(Var(PASS_REF, var)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PPP_Messaging instance_messaging_interface = { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Messaging_HandleMessage 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Module ---------------------------------------------------------------------- 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Module::Module() : pp_module_(0), get_browser_interface_(NULL), core_(NULL) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Module::~Module() { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete core_; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) core_ = NULL; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Module::Init() { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* Module::GetPluginInterface(const char* interface_name) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(interface_name, PPP_INPUT_EVENT_INTERFACE) == 0) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &input_event_interface; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &instance_interface; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(interface_name, PPP_MESSAGING_INTERFACE) == 0) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &instance_messaging_interface; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now see if anything was dynamically registered. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InterfaceMap::const_iterator found = additional_interfaces_.find( 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string(interface_name)); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (found != additional_interfaces_.end()) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return found->second; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* Module::GetBrowserInterface(const char* interface_name) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_browser_interface_(interface_name); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Instance* Module::InstanceForPPInstance(PP_Instance instance) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstanceMap::iterator found = current_instances_.find(instance); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (found == current_instances_.end()) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return found->second; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Module::AddPluginInterface(const std::string& interface_name, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* vtable) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that we're not trying to register an interface that's already 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handled, and if it is, that we're re-registering with the same vtable. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calling GetPluginInterface rather than looking it up in the map allows 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // us to also catch "internal" ones in addition to just previously added ones. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* existing_interface = GetPluginInterface(interface_name.c_str()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (existing_interface) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DCHECK(vtable == existing_interface); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) additional_interfaces_[interface_name] = vtable; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Module::InternalInit(PP_Module mod, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPB_GetInterface get_browser_interface) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_module_ = mod; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_browser_interface_ = get_browser_interface; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the core interface which we require to run. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPB_Core* core = reinterpret_cast<const PPB_Core*>(GetBrowserInterface( 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPB_CORE_INTERFACE)); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!core) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) core_ = new Core(core); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Init(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace pp 220