1db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block/*
2db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * Copyright (C) 2010 Apple Inc. All rights reserved.
3db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block *
4db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * Redistribution and use in source and binary forms, with or without
5db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * modification, are permitted provided that the following conditions
6db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * are met:
7db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * 1. Redistributions of source code must retain the above copyright
8db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block *    notice, this list of conditions and the following disclaimer.
9db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * 2. Redistributions in binary form must reproduce the above copyright
10db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block *    notice, this list of conditions and the following disclaimer in the
11db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block *    documentation and/or other materials provided with the distribution.
12db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block *
13db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * THE POSSIBILITY OF SUCH DAMAGE.
24db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block */
25db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
26db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#ifndef PluginTest_h
27db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#define PluginTest_h
28db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
29db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include <WebKit/npfunctions.h>
30db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include <assert.h>
31db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include <map>
32db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include <string>
33db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
34db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block// Helper classes for implementing has_member
35db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blocktypedef char (&no_tag)[1];
36db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blocktypedef char (&yes_tag)[2];
37db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
38db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#define DEFINE_HAS_MEMBER_CHECK(member, returnType, argumentTypes) \
39db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blocktemplate<typename T, returnType (T::*member) argumentTypes> struct pmf_##member##_helper {}; \
40db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blocktemplate<typename T> no_tag has_member_##member##_helper(...); \
41db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blocktemplate<typename T> yes_tag has_member_##member##_helper(pmf_##member##_helper<T, &T::member >*); \
42db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blocktemplate<typename T> struct has_member_##member { \
43db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockstatic const bool value = sizeof(has_member_##member##_helper<T>(0)) == sizeof(yes_tag); \
44db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block};
45db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
46db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockDEFINE_HAS_MEMBER_CHECK(hasMethod, bool, (NPIdentifier methodName));
47db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockDEFINE_HAS_MEMBER_CHECK(invoke, bool, (NPIdentifier methodName, const NPVariant*, uint32_t, NPVariant* result));
48db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockDEFINE_HAS_MEMBER_CHECK(invokeDefault, bool, (const NPVariant*, uint32_t, NPVariant* result));
49db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockDEFINE_HAS_MEMBER_CHECK(hasProperty, bool, (NPIdentifier propertyName));
50db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockDEFINE_HAS_MEMBER_CHECK(getProperty, bool, (NPIdentifier propertyName, NPVariant* result));
51db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
52db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockclass PluginTest {
53db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockpublic:
54db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    static PluginTest* create(NPP, const std::string& identifier);
55db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    virtual ~PluginTest();
56db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
572bde8e466a4451c7319e3a072d118917957d6554Steve Block    static void NP_Shutdown();
582bde8e466a4451c7319e3a072d118917957d6554Steve Block
59db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    // NPP functions.
60f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual NPError NPP_New(NPMIMEType pluginType, uint16_t mode, int16_t argc, char *argn[], char *argv[], NPSavedData *saved);
61e14391e94c850b8bd03680c23b38978db68687a8John Reck    virtual NPError NPP_Destroy(NPSavedData**);
62db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    virtual NPError NPP_DestroyStream(NPStream* stream, NPReason reason);
63db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    virtual NPError NPP_GetValue(NPPVariable, void* value);
64bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual NPError NPP_SetWindow(NPP, NPWindow*);
6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    virtual int16_t NPP_HandleEvent(void* event);
66db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
67db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    // NPN functions.
6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    NPError NPN_GetURL(const char* url, const char* target);
6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
70e14391e94c850b8bd03680c23b38978db68687a8John Reck    void NPN_InvalidateRect(NPRect* invalidRect);
71db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    NPIdentifier NPN_GetStringIdentifier(const NPUTF8* name);
72db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    NPIdentifier NPN_GetIntIdentifier(int32_t intid);
73a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    NPError NPN_GetValue(NPNVariable, void* value);
74db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    NPObject* NPN_CreateObject(NPClass*);
75db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    bool NPN_RemoveProperty(NPObject*, NPIdentifier propertyName);
762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#ifdef XP_MACOSX
772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool NPN_ConvertPoint(double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double *destX, double *destY, NPCoordinateSpace destSpace);
782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void executeScript(const char*);
812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void log(const char* format, ...);
8228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
832bde8e466a4451c7319e3a072d118917957d6554Steve Block    void registerNPShutdownFunction(void (*)());
842bde8e466a4451c7319e3a072d118917957d6554Steve Block
852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void indicateTestFailure();
862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
87db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    template<typename TestClassTy> class Register {
88db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    public:
89db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        Register(const std::string& identifier)
90db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
91db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            registerCreateTestFunction(identifier, Register::create);
92db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
93db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
94db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    private:
95db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        static PluginTest* create(NPP npp, const std::string& identifier)
96db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
97db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return new TestClassTy(npp, identifier);
98db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
99db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    };
100db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
101db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockprotected:
102db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    PluginTest(NPP npp, const std::string& identifier);
103db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
104db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    // FIXME: A plug-in test shouldn't need to know about it's NPP. Make this private.
105db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    NPP m_npp;
106db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
107db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    const std::string& identifier() const { return m_identifier; }
108db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
109e14391e94c850b8bd03680c23b38978db68687a8John Reck    void waitUntilDone();
110e14391e94c850b8bd03680c23b38978db68687a8John Reck    void notifyDone();
111e14391e94c850b8bd03680c23b38978db68687a8John Reck
112db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    // NPObject helper template.
113db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    template<typename T> struct Object : NPObject {
114db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    public:
115db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        static NPObject* create(PluginTest* pluginTest)
116db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
117db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            Object* object = static_cast<Object*>(pluginTest->NPN_CreateObject(npClass()));
118db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
119db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            object->m_pluginTest = pluginTest;
120db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return object;
121db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
122db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
123db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        // These should never be called.
124db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        bool hasMethod(NPIdentifier methodName)
125db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
126db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            assert(false);
127db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return false;
128db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
129db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
130db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        bool invoke(NPIdentifier methodName, const NPVariant*, uint32_t, NPVariant* result)
131db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
132db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            assert(false);
133db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return false;
134db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
135db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
136db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        bool invokeDefault(const NPVariant*, uint32_t, NPVariant* result)
137db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
138db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            assert(false);
139db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return false;
140db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
141db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
142db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        bool hasProperty(NPIdentifier propertyName)
143db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
144db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            assert(false);
145db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return false;
146db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
147db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
148db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        bool getProperty(NPIdentifier propertyName, NPVariant* result)
149db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
150db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            assert(false);
151db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return false;
152db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
153db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
154db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    protected:
155db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        Object()
156db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            : m_pluginTest(0)
157db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
158db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
159db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
160db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        virtual ~Object()
161db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
162db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
163db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
164db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        PluginTest* pluginTest() const { return m_pluginTest; }
165db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
166db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    private:
167db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        static NPObject* NP_Allocate(NPP npp, NPClass* aClass)
168db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
169db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return new T;
170db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
171db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
172db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        static void NP_Deallocate(NPObject* npObject)
173db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
174db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            delete static_cast<T*>(npObject);
175db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
176db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
177db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        static bool NP_HasMethod(NPObject* npObject, NPIdentifier methodName)
178db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
179db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return static_cast<T*>(npObject)->hasMethod(methodName);
180db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
181db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
182db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        static bool NP_Invoke(NPObject* npObject, NPIdentifier methodName, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
183db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
184db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return static_cast<T*>(npObject)->invoke(methodName, arguments, argumentCount, result);
185db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
186db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
187db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        static bool NP_InvokeDefault(NPObject* npObject, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
188db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
189db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return static_cast<T*>(npObject)->invokeDefault(arguments, argumentCount, result);
190db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
191db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
192db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        static bool NP_HasProperty(NPObject* npObject, NPIdentifier propertyName)
193db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
194db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return static_cast<T*>(npObject)->hasProperty(propertyName);
195db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
196db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
197db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        static bool NP_GetProperty(NPObject* npObject, NPIdentifier propertyName, NPVariant* result)
198db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
199db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return static_cast<T*>(npObject)->getProperty(propertyName, result);
200db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        }
201db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
202db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        static NPClass* npClass()
203db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        {
204db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            static NPClass npClass = {
205db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                NP_CLASS_STRUCT_VERSION,
206db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                NP_Allocate,
207db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                NP_Deallocate,
208db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                0, // NPClass::invalidate
209db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                has_member_hasMethod<T>::value ? NP_HasMethod : 0,
210db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                has_member_invoke<T>::value ? NP_Invoke : 0,
211db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                has_member_invokeDefault<T>::value ? NP_InvokeDefault : 0,
212db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                has_member_hasProperty<T>::value ? NP_HasProperty : 0,
213db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                has_member_getProperty<T>::value ? NP_GetProperty : 0,
214db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                0, // NPClass::setProperty
215db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                0, // NPClass::removeProperty
216db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                0, // NPClass::enumerate
217db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                0  // NPClass::construct
218db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            };
219db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
220db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return &npClass;
221db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        };
222db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
223db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        PluginTest* m_pluginTest;
224db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    };
225db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
226db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockprivate:
227db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    typedef PluginTest* (*CreateTestFunction)(NPP, const std::string&);
228db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
229db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    static void registerCreateTestFunction(const std::string&, CreateTestFunction);
230db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    static std::map<std::string, CreateTestFunction>& createTestFunctions();
231db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
232db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    std::string m_identifier;
233db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block};
234db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
235db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#endif // PluginTest_h
236