2 * Copyright (C) 2010 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
29 #include <WebKit/npfunctions.h>
34 // Helper classes for implementing has_member
35 typedef char (&no_tag)[1];
36 typedef char (&yes_tag)[2];
38 #define DEFINE_HAS_MEMBER_CHECK(member, returnType, argumentTypes) \
39 template<typename T, returnType (T::*member) argumentTypes> struct pmf_##member##_helper {}; \
40 template<typename T> no_tag has_member_##member##_helper(...); \
41 template<typename T> yes_tag has_member_##member##_helper(pmf_##member##_helper<T, &T::member >*); \
42 template<typename T> struct has_member_##member { \
43 static const bool value = sizeof(has_member_##member##_helper<T>(0)) == sizeof(yes_tag); \
46 DEFINE_HAS_MEMBER_CHECK(hasMethod, bool, (NPIdentifier methodName));
47 DEFINE_HAS_MEMBER_CHECK(invoke, bool, (NPIdentifier methodName, const NPVariant*, uint32_t, NPVariant* result));
48 DEFINE_HAS_MEMBER_CHECK(invokeDefault, bool, (const NPVariant*, uint32_t, NPVariant* result));
49 DEFINE_HAS_MEMBER_CHECK(hasProperty, bool, (NPIdentifier propertyName));
50 DEFINE_HAS_MEMBER_CHECK(getProperty, bool, (NPIdentifier propertyName, NPVariant* result));
51 DEFINE_HAS_MEMBER_CHECK(removeProperty, bool, (NPIdentifier propertyName));
55 static PluginTest* create(NPP, const std::string& identifier);
56 virtual ~PluginTest();
58 static void NP_Shutdown();
61 virtual NPError NPP_New(NPMIMEType pluginType, uint16_t mode, int16_t argc, char *argn[], char *argv[], NPSavedData *saved);
62 virtual NPError NPP_Destroy(NPSavedData**);
63 virtual NPError NPP_SetWindow(NPP, NPWindow*);
64 virtual NPError NPP_NewStream(NPMIMEType, NPStream*, NPBool seekable, uint16_t* stype);
65 virtual NPError NPP_DestroyStream(NPStream*, NPReason);
66 virtual int32_t NPP_WriteReady(NPStream*);
67 virtual int32_t NPP_Write(NPStream*, int32_t offset, int32_t len, void* buffer);
69 virtual int16_t NPP_HandleEvent(void* event);
70 virtual bool NPP_URLNotify(const char* url, NPReason, void* notifyData);
71 virtual NPError NPP_GetValue(NPPVariable, void* value);
72 virtual NPError NPP_SetValue(NPNVariable, void *value);
75 NPError NPN_GetURL(const char* url, const char* target);
76 NPError NPN_GetURLNotify(const char* url, const char* target, void* notifyData);
77 NPError NPN_GetValue(NPNVariable, void* value);
78 void NPN_InvalidateRect(NPRect* invalidRect);
80 // NPRuntime NPN functions.
81 NPIdentifier NPN_GetStringIdentifier(const NPUTF8* name);
82 NPIdentifier NPN_GetIntIdentifier(int32_t intid);
83 bool NPN_IdentifierIsString(NPIdentifier);
84 NPUTF8* NPN_UTF8FromIdentifier(NPIdentifier);
85 int32_t NPN_IntFromIdentifier(NPIdentifier);
87 NPObject* NPN_CreateObject(NPClass*);
88 NPObject* NPN_RetainObject(NPObject*);
89 void NPN_ReleaseObject(NPObject*);
90 bool NPN_RemoveProperty(NPObject*, NPIdentifier propertyName);
93 bool NPN_ConvertPoint(double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double *destX, double *destY, NPCoordinateSpace destSpace);
96 void executeScript(const char*);
97 void log(const char* format, ...);
99 void registerNPShutdownFunction(void (*)());
101 static void indicateTestFailure();
103 template<typename TestClassTy> class Register {
105 Register(const std::string& identifier)
107 registerCreateTestFunction(identifier, Register::create);
111 static PluginTest* create(NPP npp, const std::string& identifier)
113 return new TestClassTy(npp, identifier);
118 PluginTest(NPP npp, const std::string& identifier);
120 // FIXME: A plug-in test shouldn't need to know about it's NPP. Make this private.
123 const std::string& identifier() const { return m_identifier; }
125 void waitUntilDone();
128 // NPObject helper template.
129 template<typename T> struct Object : NPObject {
131 static NPObject* create(PluginTest* pluginTest)
133 Object* object = static_cast<Object*>(pluginTest->NPN_CreateObject(npClass()));
135 object->m_pluginTest = pluginTest;
139 // These should never be called.
140 bool hasMethod(NPIdentifier methodName)
146 bool invoke(NPIdentifier methodName, const NPVariant*, uint32_t, NPVariant* result)
152 bool invokeDefault(const NPVariant*, uint32_t, NPVariant* result)
158 bool hasProperty(NPIdentifier propertyName)
164 bool getProperty(NPIdentifier propertyName, NPVariant* result)
170 bool removeProperty(NPIdentifier propertyName)
177 bool identifierIs(NPIdentifier identifier, const char* value)
179 return pluginTest()->NPN_GetStringIdentifier(value) == identifier;
192 PluginTest* pluginTest() const { return m_pluginTest; }
195 static NPObject* NP_Allocate(NPP npp, NPClass* aClass)
200 static void NP_Deallocate(NPObject* npObject)
202 delete static_cast<T*>(npObject);
205 static bool NP_HasMethod(NPObject* npObject, NPIdentifier methodName)
207 return static_cast<T*>(npObject)->hasMethod(methodName);
210 static bool NP_Invoke(NPObject* npObject, NPIdentifier methodName, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
212 return static_cast<T*>(npObject)->invoke(methodName, arguments, argumentCount, result);
215 static bool NP_InvokeDefault(NPObject* npObject, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
217 return static_cast<T*>(npObject)->invokeDefault(arguments, argumentCount, result);
220 static bool NP_HasProperty(NPObject* npObject, NPIdentifier propertyName)
222 return static_cast<T*>(npObject)->hasProperty(propertyName);
225 static bool NP_GetProperty(NPObject* npObject, NPIdentifier propertyName, NPVariant* result)
227 return static_cast<T*>(npObject)->getProperty(propertyName, result);
230 static bool NP_RemoveProperty(NPObject* npObject, NPIdentifier propertyName)
232 return static_cast<T*>(npObject)->removeProperty(propertyName);
235 static NPClass* npClass()
237 static NPClass npClass = {
238 NP_CLASS_STRUCT_VERSION,
241 0, // NPClass::invalidate
242 has_member_hasMethod<T>::value ? NP_HasMethod : 0,
243 has_member_invoke<T>::value ? NP_Invoke : 0,
244 has_member_invokeDefault<T>::value ? NP_InvokeDefault : 0,
245 has_member_hasProperty<T>::value ? NP_HasProperty : 0,
246 has_member_getProperty<T>::value ? NP_GetProperty : 0,
247 0, // NPClass::setProperty
248 has_member_removeProperty<T>::value ? NP_RemoveProperty : 0,
249 0, // NPClass::enumerate
250 0 // NPClass::construct
256 PluginTest* m_pluginTest;
260 typedef PluginTest* (*CreateTestFunction)(NPP, const std::string&);
262 static void registerCreateTestFunction(const std::string&, CreateTestFunction);
263 static std::map<std::string, CreateTestFunction>& createTestFunctions();
265 std::string m_identifier;
268 #endif // PluginTest_h