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));
54 static PluginTest* create(NPP, const std::string& identifier);
55 virtual ~PluginTest();
58 virtual NPError NPP_Destroy(NPSavedData**);
59 virtual NPError NPP_DestroyStream(NPStream* stream, NPReason reason);
60 virtual NPError NPP_GetValue(NPPVariable, void* value);
61 virtual NPError NPP_SetWindow(NPP, NPWindow*);
64 void NPN_InvalidateRect(NPRect* invalidRect);
65 NPIdentifier NPN_GetStringIdentifier(const NPUTF8* name);
66 NPIdentifier NPN_GetIntIdentifier(int32_t intid);
67 NPError NPN_GetValue(NPNVariable, void* value);
68 NPObject* NPN_CreateObject(NPClass*);
69 bool NPN_RemoveProperty(NPObject*, NPIdentifier propertyName);
71 void executeScript(const char*);
73 template<typename TestClassTy> class Register {
75 Register(const std::string& identifier)
77 registerCreateTestFunction(identifier, Register::create);
81 static PluginTest* create(NPP npp, const std::string& identifier)
83 return new TestClassTy(npp, identifier);
88 PluginTest(NPP npp, const std::string& identifier);
90 // FIXME: A plug-in test shouldn't need to know about it's NPP. Make this private.
93 const std::string& identifier() const { return m_identifier; }
98 // NPObject helper template.
99 template<typename T> struct Object : NPObject {
101 static NPObject* create(PluginTest* pluginTest)
103 Object* object = static_cast<Object*>(pluginTest->NPN_CreateObject(npClass()));
105 object->m_pluginTest = pluginTest;
109 // These should never be called.
110 bool hasMethod(NPIdentifier methodName)
116 bool invoke(NPIdentifier methodName, const NPVariant*, uint32_t, NPVariant* result)
122 bool invokeDefault(const NPVariant*, uint32_t, NPVariant* result)
128 bool hasProperty(NPIdentifier propertyName)
134 bool getProperty(NPIdentifier propertyName, NPVariant* result)
150 PluginTest* pluginTest() const { return m_pluginTest; }
153 static NPObject* NP_Allocate(NPP npp, NPClass* aClass)
158 static void NP_Deallocate(NPObject* npObject)
160 delete static_cast<T*>(npObject);
163 static bool NP_HasMethod(NPObject* npObject, NPIdentifier methodName)
165 return static_cast<T*>(npObject)->hasMethod(methodName);
168 static bool NP_Invoke(NPObject* npObject, NPIdentifier methodName, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
170 return static_cast<T*>(npObject)->invoke(methodName, arguments, argumentCount, result);
173 static bool NP_InvokeDefault(NPObject* npObject, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
175 return static_cast<T*>(npObject)->invokeDefault(arguments, argumentCount, result);
178 static bool NP_HasProperty(NPObject* npObject, NPIdentifier propertyName)
180 return static_cast<T*>(npObject)->hasProperty(propertyName);
183 static bool NP_GetProperty(NPObject* npObject, NPIdentifier propertyName, NPVariant* result)
185 return static_cast<T*>(npObject)->getProperty(propertyName, result);
188 static NPClass* npClass()
190 static NPClass npClass = {
191 NP_CLASS_STRUCT_VERSION,
194 0, // NPClass::invalidate
195 has_member_hasMethod<T>::value ? NP_HasMethod : 0,
196 has_member_invoke<T>::value ? NP_Invoke : 0,
197 has_member_invokeDefault<T>::value ? NP_InvokeDefault : 0,
198 has_member_hasProperty<T>::value ? NP_HasProperty : 0,
199 has_member_getProperty<T>::value ? NP_GetProperty : 0,
200 0, // NPClass::setProperty
201 0, // NPClass::removeProperty
202 0, // NPClass::enumerate
203 0 // NPClass::construct
209 PluginTest* m_pluginTest;
213 typedef PluginTest* (*CreateTestFunction)(NPP, const std::string&);
215 static void registerCreateTestFunction(const std::string&, CreateTestFunction);
216 static std::map<std::string, CreateTestFunction>& createTestFunctions();
218 std::string m_identifier;
221 #endif // PluginTest_h