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