| Index: ppapi/native_client/tests/ppapi_test_lib/module_instance.cc
|
| ===================================================================
|
| --- ppapi/native_client/tests/ppapi_test_lib/module_instance.cc (revision 0)
|
| +++ ppapi/native_client/tests/ppapi_test_lib/module_instance.cc (revision 0)
|
| @@ -0,0 +1,175 @@
|
| +// Copyright (c) 2011 The Native Client Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +//
|
| +// This implements the required interfaces for representing a plugin module
|
| +// instance in browser interactions and provides a way to register custom
|
| +// plugin interfaces.
|
| +//
|
| +
|
| +#include <stdio.h>
|
| +#include <string.h>
|
| +
|
| +#include <map>
|
| +
|
| +#include "native_client/src/include/nacl_macros.h"
|
| +#include "native_client/src/shared/platform/nacl_check.h"
|
| +#include "native_client/tests/ppapi_test_lib/get_browser_interface.h"
|
| +#include "native_client/tests/ppapi_test_lib/internal_utils.h"
|
| +#include "native_client/tests/ppapi_test_lib/test_interface.h"
|
| +
|
| +#include "ppapi/c/dev/ppb_var_deprecated.h"
|
| +#include "ppapi/c/pp_errors.h"
|
| +#include "ppapi/c/pp_instance.h"
|
| +#include "ppapi/c/pp_module.h"
|
| +#include "ppapi/c/pp_var.h"
|
| +#include "ppapi/c/ppb.h"
|
| +#include "ppapi/c/ppb_var.h"
|
| +#include "ppapi/c/ppp.h"
|
| +#include "ppapi/c/ppp_instance.h"
|
| +#include "ppapi/c/ppp_messaging.h"
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +// Plugin interface registration
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +namespace {
|
| +
|
| +class PluginInterfaceTable {
|
| + public:
|
| + // Return singleton intsance.
|
| + static PluginInterfaceTable* Get() {
|
| + static PluginInterfaceTable table;
|
| + return &table;
|
| + }
|
| +
|
| + void AddInterface(const char* interface_name, const void* ppp_interface) {
|
| + interface_map_[nacl::string(interface_name)] = ppp_interface;
|
| + }
|
| + const void* GetInterface(const char* interface_name) {
|
| + // This will add a NULL element for missing interfaces.
|
| + return interface_map_[nacl::string(interface_name)];
|
| + }
|
| +
|
| + private:
|
| + NACL_DISALLOW_COPY_AND_ASSIGN(PluginInterfaceTable);
|
| +
|
| + PluginInterfaceTable() {}
|
| +
|
| + typedef std::map<nacl::string, const void*> InterfaceMap;
|
| + InterfaceMap interface_map_;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +void RegisterPluginInterface(const char* interface_name,
|
| + const void* ppp_interface) {
|
| + PluginInterfaceTable::Get()->AddInterface(interface_name, ppp_interface);
|
| +}
|
| +
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +// PPP_Instance implementation
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +PP_Bool DidCreateDefault(PP_Instance instance,
|
| + uint32_t /*argc*/,
|
| + const char* /*argn*/[],
|
| + const char* /*argv*/[]) {
|
| + CHECK(ppb_get_interface() != NULL);
|
| + CHECK(PPBCore() != NULL);
|
| + CHECK(PPBGraphics2D() != NULL);
|
| + CHECK(PPBImageData() != NULL);
|
| + CHECK(PPBInstance() != NULL);
|
| + CHECK(PPBMessaging() != NULL);
|
| + CHECK(PPBURLLoader() != NULL);
|
| + CHECK(PPBURLRequestInfo() != NULL);
|
| + CHECK(PPBURLResponseInfo() != NULL);
|
| + CHECK(PPBVar() != NULL);
|
| +
|
| + set_pp_instance(instance);
|
| + SetupTests();
|
| +
|
| + return PP_TRUE;
|
| +}
|
| +
|
| +namespace {
|
| +
|
| +void DidDestroy(PP_Instance /*instance*/) {
|
| +}
|
| +
|
| +void DidChangeView(PP_Instance /*instance*/,
|
| + const struct PP_Rect* /*position*/,
|
| + const struct PP_Rect* /*clip*/) {
|
| +}
|
| +
|
| +void DidChangeFocus(PP_Instance /*instance*/,
|
| + PP_Bool /*has_focus*/) {
|
| +}
|
| +
|
| +PP_Bool HandleDocumentLoad(PP_Instance instance,
|
| + PP_Resource url_loader) {
|
| + return PP_TRUE;
|
| +}
|
| +
|
| +const PPP_Instance ppp_instance_interface = {
|
| + DidCreateDefault,
|
| + DidDestroy,
|
| + DidChangeView,
|
| + DidChangeFocus,
|
| + HandleDocumentLoad
|
| +};
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +// PPP_Messaging implementation
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +void HandleMessage(PP_Instance instance, PP_Var message) {
|
| + if (message.type != PP_VARTYPE_STRING)
|
| + return;
|
| + uint32_t len = 0;
|
| + const char* test_name = PPBVar()->VarToUtf8(message, &len);
|
| + RunTest(test_name);
|
| +}
|
| +
|
| +const PPP_Messaging ppp_messaging_interface = {
|
| + HandleMessage
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +// PPP implementation
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +int32_t PPP_InitializeModule(PP_Module module,
|
| + PPB_GetInterface get_browser_interface) {
|
| + set_pp_module(module);
|
| + set_ppb_get_interface(get_browser_interface);
|
| + SetupPluginInterfaces();
|
| + return PP_OK;
|
| +}
|
| +
|
| +void PPP_ShutdownModule() {
|
| +}
|
| +
|
| +const void* PPP_GetInterface(const char* interface_name) {
|
| + const void* ppp = PluginInterfaceTable::Get()->GetInterface(interface_name);
|
| +
|
| + // The PPP_Instance interface is required for every plugin,
|
| + // so supply one if the tester has not.
|
| + if (ppp == NULL && 0 == strncmp(PPP_INSTANCE_INTERFACE, interface_name,
|
| + strlen(PPP_INSTANCE_INTERFACE))) {
|
| + return &ppp_instance_interface;
|
| + }
|
| + // The PPP_Messaging interface is required for the test set-up,
|
| + // so we supply our own.
|
| + if (0 == strncmp(PPP_MESSAGING_INTERFACE, interface_name,
|
| + strlen(PPP_MESSAGING_INTERFACE))) {
|
| + CHECK(ppp == NULL);
|
| + return &ppp_messaging_interface;
|
| + }
|
| + // All other interfaces are to be optionally supplied by the tester,
|
| + // so we return whatever was added in SetupPluginInterfaces() (if anything).
|
| + return ppp;
|
| +}
|
|
|