15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/* 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Copyright (C) 2010 Apple Inc. All rights reserved. 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * modification, are permitted provided that the following conditions 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * are met: 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * notice, this list of conditions and the following disclaimer. 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * documentation and/or other materials provided with the distribution. 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * THE POSSIBILITY OF SUCH DAMAGE. 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */ 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef PluginTest_h 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define PluginTest_h 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <assert.h> 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <bindings/npfunctions.h> 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <map> 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string> 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Helper classes for implementing has_member 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef char (&no_tag)[1]; 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef char (&yes_tag)[2]; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define DEFINE_HAS_MEMBER_CHECK(member, returnType, argumentTypes) \ 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) template <typename T, returnType(T::*member) argumentTypes> \ 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct pmf_##member##_helper {}; \ 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) template <typename T> \ 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) no_tag has_member_##member##_helper(...); \ 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) template <typename T> \ 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) yes_tag has_member_##member##_helper(pmf_##member##_helper<T, &T::member>*); \ 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) template <typename T> \ 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct has_member_##member { \ 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static const bool value = \ 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sizeof(has_member_##member##_helper<T>(0)) == sizeof(yes_tag); \ 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DEFINE_HAS_MEMBER_CHECK(hasMethod, bool, (NPIdentifier methodName)); 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DEFINE_HAS_MEMBER_CHECK( 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) invoke, 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool, 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (NPIdentifier methodName, const NPVariant*, uint32_t, NPVariant* result)); 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DEFINE_HAS_MEMBER_CHECK(invokeDefault, 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool, 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (const NPVariant*, uint32_t, NPVariant* result)); 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DEFINE_HAS_MEMBER_CHECK(hasProperty, bool, (NPIdentifier propertyName)); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DEFINE_HAS_MEMBER_CHECK(getProperty, 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool, 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (NPIdentifier propertyName, NPVariant* result)); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DEFINE_HAS_MEMBER_CHECK(removeProperty, bool, (NPIdentifier propertyName)); 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PluginTest { 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static PluginTest* create(NPP, const std::string& identifier); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~PluginTest(); 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void NP_Shutdown(); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // NPP functions. 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual NPError NPP_New(NPMIMEType pluginType, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint16_t mode, 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int16_t argc, 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) char* argn[], 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) char* argv[], 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPSavedData* saved); 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual NPError NPP_Destroy(NPSavedData**); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual NPError NPP_SetWindow(NPWindow*); 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual NPError NPP_NewStream(NPMIMEType, 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPStream*, 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPBool seekable, 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint16_t* stype); 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual NPError NPP_DestroyStream(NPStream*, NPReason); 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual int32_t NPP_WriteReady(NPStream*); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual int32_t NPP_Write(NPStream*, 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32_t offset, 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32_t len, 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void* buffer); 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual int16_t NPP_HandleEvent(void* event); 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool NPP_URLNotify(const char* url, NPReason, void* notifyData); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual NPError NPP_GetValue(NPPVariable, void* value); 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual NPError NPP_SetValue(NPNVariable, void* value); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // NPN functions. 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPError NPN_GetURL(const char* url, const char* target); 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPError NPN_GetURLNotify(const char* url, 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* target, 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void* notifyData); 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPError NPN_GetValue(NPNVariable, void* value); 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void NPN_InvalidateRect(NPRect* invalidRect); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool NPN_Invoke(NPObject*, 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPIdentifier methodName, 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const NPVariant* args, 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32_t argCount, 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPVariant* result); 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void* NPN_MemAlloc(uint32_t size); 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // NPRuntime NPN functions. 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPIdentifier NPN_GetStringIdentifier(const NPUTF8* name); 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPIdentifier NPN_GetIntIdentifier(int32_t intid); 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool NPN_IdentifierIsString(NPIdentifier); 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPUTF8* NPN_UTF8FromIdentifier(NPIdentifier); 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32_t NPN_IntFromIdentifier(NPIdentifier); 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPObject* NPN_CreateObject(NPClass*); 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPObject* NPN_RetainObject(NPObject*); 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void NPN_ReleaseObject(NPObject*); 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool NPN_GetProperty(NPObject*, NPIdentifier propertyName, NPVariant* value); 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool NPN_RemoveProperty(NPObject*, NPIdentifier propertyName); 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void NPN_ReleaseVariantValue(NPVariant*); 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_MACOSX 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool NPN_ConvertPoint(double sourceX, 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double sourceY, 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPCoordinateSpace sourceSpace, 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double* destX, 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double* destY, 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPCoordinateSpace destSpace); 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool executeScript(const NPString*, NPVariant* result); 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void executeScript(const char*); 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void log(const char* format, ...); 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void registerNPShutdownFunction(void (*)()); 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void indicateTestFailure(); 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) template <typename TestClassTy> 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class Register { 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Register(const std::string& identifier) { 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registerCreateTestFunction(identifier, Register::create); 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static PluginTest* create(NPP npp, const std::string& identifier) { 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new TestClassTy(npp, identifier); 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginTest(NPP npp, const std::string& identifier); 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // FIXME: A plug-in test shouldn't need to know about it's NPP. Make this 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // private. 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPP m_npp; 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& identifier() const { return m_identifier; } 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static NPNetscapeFuncs* netscapeFuncs(); 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void waitUntilDone(); 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void notifyDone(); 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // NPObject helper template. 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) template <typename T> 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct Object : NPObject { 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static NPObject* create(PluginTest* pluginTest) { 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Object* object = 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<Object*>(pluginTest->NPN_CreateObject(npClass())); 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) object->m_pluginTest = pluginTest; 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return object; 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // These should never be called. 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool hasMethod(NPIdentifier methodName) { 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(false); 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool invoke(NPIdentifier methodName, 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const NPVariant*, 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32_t, 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPVariant* result) { 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(false); 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool invokeDefault(const NPVariant*, uint32_t, NPVariant* result) { 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(false); 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool hasProperty(NPIdentifier propertyName) { 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(false); 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool getProperty(NPIdentifier propertyName, NPVariant* result) { 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(false); 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool removeProperty(NPIdentifier propertyName) { 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(false); 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Helper functions. 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool identifierIs(NPIdentifier identifier, const char* value) { 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return pluginTest()->NPN_GetStringIdentifier(value) == identifier; 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Object() : m_pluginTest(0) {} 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~Object() {} 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginTest* pluginTest() const { return m_pluginTest; } 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static NPObject* NP_Allocate(NPP npp, NPClass* aClass) { return new T; } 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void NP_Deallocate(NPObject* npObject) { 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete static_cast<T*>(npObject); 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool NP_HasMethod(NPObject* npObject, NPIdentifier methodName) { 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return static_cast<T*>(npObject)->hasMethod(methodName); 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool NP_Invoke(NPObject* npObject, 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPIdentifier methodName, 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const NPVariant* arguments, 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32_t argumentCount, 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPVariant* result) { 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return static_cast<T*>(npObject) 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->invoke(methodName, arguments, argumentCount, result); 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool NP_InvokeDefault(NPObject* npObject, 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const NPVariant* arguments, 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32_t argumentCount, 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPVariant* result) { 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return static_cast<T*>(npObject) 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->invokeDefault(arguments, argumentCount, result); 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool NP_HasProperty(NPObject* npObject, NPIdentifier propertyName) { 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return static_cast<T*>(npObject)->hasProperty(propertyName); 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool NP_GetProperty(NPObject* npObject, 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPIdentifier propertyName, 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPVariant* result) { 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return static_cast<T*>(npObject)->getProperty(propertyName, result); 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool NP_RemoveProperty(NPObject* npObject, 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NPIdentifier propertyName) { 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return static_cast<T*>(npObject)->removeProperty(propertyName); 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static NPClass* npClass() { 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static NPClass npClass = { 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NP_CLASS_STRUCT_VERSION, NP_Allocate, NP_Deallocate, 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // NPClass::invalidate 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) has_member_hasMethod<T>::value ? NP_HasMethod : 0, 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) has_member_invoke<T>::value ? NP_Invoke : 0, 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) has_member_invokeDefault<T>::value ? NP_InvokeDefault : 0, 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) has_member_hasProperty<T>::value ? NP_HasProperty : 0, 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) has_member_getProperty<T>::value ? NP_GetProperty : 0, 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // NPClass::setProperty 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) has_member_removeProperty<T>::value ? NP_RemoveProperty : 0, 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // NPClass::enumerate 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0 // NPClass::construct 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return &npClass; 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginTest* m_pluginTest; 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef PluginTest* (*CreateTestFunction)(NPP, const std::string&); 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void registerCreateTestFunction(const std::string&, 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateTestFunction); 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static std::map<std::string, CreateTestFunction>& createTestFunctions(); 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string m_identifier; 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // PluginTest_h 305