• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2004, Apple Computer, Inc. and The Mozilla Foundation.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  * 3. Neither the names of Apple Computer, Inc. ("Apple") or The Mozilla
15  * Foundation ("Mozilla") nor the names of their contributors may be used
16  * to endorse or promote products derived from this software without
17  * specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY APPLE, MOZILLA AND THEIR CONTRIBUTORS "AS
20  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
22  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE, MOZILLA OR
23  * THEIR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
25  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  *
31  * Revision 1 (March 4, 2004):
32  * Initial proposal.
33  *
34  * Revision 2 (March 10, 2004):
35  * All calls into script were made asynchronous.  Results are
36  * provided via the NPScriptResultFunctionPtr callback.
37  *
38  * Revision 3 (March 10, 2004):
39  * Corrected comments to not refer to class retain/release FunctionPtrs.
40  *
41  * Revision 4 (March 11, 2004):
42  * Added additional convenience NPN_SetExceptionWithUTF8().
43  * Changed NPHasPropertyFunctionPtr and NPHasMethodFunctionPtr to take NPClass
44  * pointers instead of NPObject pointers.
45  * Added NPIsValidIdentifier().
46  *
47  * Revision 5 (March 17, 2004):
48  * Added context parameter to result callbacks from ScriptObject functions.
49  *
50  * Revision 6 (March 29, 2004):
51  * Renamed functions implemented by user agent to NPN_*.  Removed _ from
52  * type names.
53  * Renamed "JavaScript" types to "Script".
54  *
55  * Revision 7 (April 21, 2004):
56  * NPIdentifier becomes a void*, was int32_t
57  * Remove NP_IsValidIdentifier, renamed NP_IdentifierFromUTF8 to NP_GetIdentifier
58  * Added NPVariant and modified functions to use this new type.
59  *
60  * Revision 8 (July 9, 2004):
61  * Updated to joint Apple-Mozilla license.
62  *
63  * Revision 9 (August 12, 2004):
64  * Changed NPVariantType enum values to form PVariantType_XXX
65  * Added NPP arguments to NPObject functions.
66  * Replaced NPVariant functions with macros.
67  */
68 #ifndef _NP_RUNTIME_H_
69 #define _NP_RUNTIME_H_
70 
71 #ifdef __cplusplus
72 extern "C" {
73 #endif
74 
75 #include <stdint.h>
76 #include "npapi.h"
77 
78 /*
79     This API is used to facilitate binding code written in C to script
80     objects.  The API in this header does not assume the presence of a
81     user agent.  That is, it can be used to bind C code to scripting
82     environments outside of the context of a user agent.
83 
84     However, the normal use of the this API is in the context of a
85     scripting environment running in a browser or other user agent.
86     In particular it is used to support the extended Netscape
87     script-ability API for plugins (NP-SAP).  NP-SAP is an extension
88     of the Netscape plugin API.  As such we have adopted the use of
89     the "NP" prefix for this API.
90 
91     The following NP{N|P}Variables were added to the Netscape plugin
92     API (in npapi.h):
93 
94     NPNVWindowNPObject
95     NPNVPluginElementNPObject
96     NPPVpluginScriptableNPObject
97 
98     These variables are exposed through NPN_GetValue() and
99     NPP_GetValue() (respectively) and are used to establish the
100     initial binding between the user agent and native code.  The DOM
101     objects in the user agent can be examined and manipulated using
102     the NPN_ functions that operate on NPObjects described in this
103     header.
104 
105     To the extent possible the assumptions about the scripting
106     language used by the scripting environment have been minimized.
107 */
108 
109 
110 /*
111     Objects (non-primitive data) passed between 'C' and script is
112     always wrapped in an NPObject.  The 'interface' of an NPObject is
113     described by an NPClass.
114 */
115 typedef struct NPObject NPObject;
116 typedef struct NPClass NPClass;
117 
118 typedef char NPUTF8;
119 typedef struct _NPString {
120     const NPUTF8 *UTF8Characters;
121     uint32_t UTF8Length;
122 } NPString;
123 
124 typedef enum {
125     NPVariantType_Void,
126     NPVariantType_Null,
127     NPVariantType_Bool,
128     NPVariantType_Int32,
129     NPVariantType_Double,
130     NPVariantType_String,
131     NPVariantType_Object
132 } NPVariantType;
133 
134 typedef struct _NPVariant {
135     NPVariantType type;
136     union {
137         bool boolValue;
138         int32_t intValue;
139         double doubleValue;
140         NPString stringValue;
141         NPObject *objectValue;
142     } value;
143 } NPVariant;
144 
145 /*
146     NPN_ReleaseVariantValue is called on all 'out' parameters references.
147     Specifically it is called on variants that are resultant out parameters
148     in NPGetPropertyFunctionPtr and NPInvokeFunctionPtr.  Resultant variants
149     from these two functions should be initialized using the
150     NPN_InitializeVariantXXX() functions.
151 
152     After calling NPReleaseVariantValue, the type of the variant will
153     be set to NPVariantUndefinedType.
154 */
155 void NPN_ReleaseVariantValue (NPVariant *variant);
156 
157 #define NPVARIANT_IS_VOID(_v)    ((_v).type == NPVariantType_Void)
158 #define NPVARIANT_IS_NULL(_v)    ((_v).type == NPVariantType_Null)
159 #define NPVARIANT_IS_BOOLEAN(_v) ((_v).type == NPVariantType_Bool)
160 #define NPVARIANT_IS_INT32(_v)   ((_v).type == NPVariantType_Int32)
161 #define NPVARIANT_IS_DOUBLE(_v)  ((_v).type == NPVariantType_Double)
162 #define NPVARIANT_IS_STRING(_v)  ((_v).type == NPVariantType_String)
163 #define NPVARIANT_IS_OBJECT(_v)  ((_v).type == NPVariantType_Object)
164 
165 #define NPVARIANT_TO_BOOLEAN(_v) ((_v).value.boolValue)
166 #define NPVARIANT_TO_INT32(_v)   ((_v).value.intValue)
167 #define NPVARIANT_TO_DOUBLE(_v)  ((_v).value.doubleValue)
168 #define NPVARIANT_TO_STRING(_v)  ((_v).value.stringValue)
169 #define NPVARIANT_TO_OBJECT(_v)  ((_v).value.objectValue)
170 
171 #define NP_BEGIN_MACRO  do {
172 #define NP_END_MACRO    } while (0)
173 
174 #define VOID_TO_NPVARIANT(_v)                NP_BEGIN_MACRO (_v).type = NPVariantType_Void; (_v).value.objectValue = NULL; NP_END_MACRO
175 #define NULL_TO_NPVARIANT(_v)                NP_BEGIN_MACRO (_v).type = NPVariantType_Null; (_v).value.objectValue = NULL; NP_END_MACRO
176 #define BOOLEAN_TO_NPVARIANT(_val, _v)       NP_BEGIN_MACRO (_v).type = NPVariantType_Bool; (_v).value.boolValue = !!(_val); NP_END_MACRO
177 #define INT32_TO_NPVARIANT(_val, _v)         NP_BEGIN_MACRO (_v).type = NPVariantType_Int32; (_v).value.intValue = _val; NP_END_MACRO
178 #define DOUBLE_TO_NPVARIANT(_val, _v)        NP_BEGIN_MACRO (_v).type = NPVariantType_Double; (_v).value.doubleValue = _val; NP_END_MACRO
179 #define STRINGZ_TO_NPVARIANT(_val, _v)       NP_BEGIN_MACRO (_v).type = NPVariantType_String; NPString str = { _val, strlen(_val) }; (_v).value.stringValue = str; NP_END_MACRO
180 #define STRINGN_TO_NPVARIANT(_val, _len, _v) NP_BEGIN_MACRO (_v).type = NPVariantType_String; NPString str = { _val, _len }; (_v).value.stringValue = str; NP_END_MACRO
181 #define OBJECT_TO_NPVARIANT(_val, _v)        NP_BEGIN_MACRO (_v).type = NPVariantType_Object; (_v).value.objectValue = _val; NP_END_MACRO
182 
183 /*
184         Type mappings (JavaScript types have been used for illustration
185     purposes):
186 
187         JavaScript       to             C (NPVariant with type:)
188         undefined                       NPVariantType_Void
189         null                            NPVariantType_Null
190         Boolean                         NPVariantType_Bool
191         Number                          NPVariantType_Double or NPVariantType_Int32
192         String                          NPVariantType_String
193         Object                          NPVariantType_Object
194 
195         C (NPVariant with type:)   to   JavaScript
196         NPVariantType_Void              undefined
197         NPVariantType_Null              null
198         NPVariantType_Bool              Boolean
199         NPVariantType_Int32             Number
200         NPVariantType_Double            Number
201         NPVariantType_String            String
202         NPVariantType_Object            Object
203 */
204 
205 typedef void *NPIdentifier;
206 
207 /*
208     NPObjects have methods and properties.  Methods and properties are
209     identified with NPIdentifiers.  These identifiers may be reflected
210     in script.  NPIdentifiers can be either strings or integers, IOW,
211     methods and properties can be identified by either strings or
212     integers (i.e. foo["bar"] vs foo[1]). NPIdentifiers can be
213     compared using ==.  In case of any errors, the requested
214     NPIdentifier(s) will be NULL.
215 */
216 NPIdentifier NPN_GetStringIdentifier(const NPUTF8 *name);
217 void NPN_GetStringIdentifiers(const NPUTF8 **names, int32_t nameCount, NPIdentifier *identifiers);
218 NPIdentifier NPN_GetIntIdentifier(int32_t intid);
219 bool NPN_IdentifierIsString(NPIdentifier identifier);
220 
221 /*
222     The NPUTF8 returned from NPN_UTF8FromIdentifier SHOULD be freed.
223 */
224 NPUTF8 *NPN_UTF8FromIdentifier(NPIdentifier identifier);
225 
226 /*
227     Get the integer represented by identifier. If identifier is not an
228     integer identifier, the behaviour is undefined.
229 */
230 int32_t NPN_IntFromIdentifier(NPIdentifier identifier);
231 
232 /*
233     NPObject behavior is implemented using the following set of
234     callback functions.
235 
236     The NPVariant *result argument of these functions (where
237     applicable) should be released using NPN_ReleaseVariantValue().
238 */
239 typedef NPObject *(*NPAllocateFunctionPtr)(NPP npp, NPClass *aClass);
240 typedef void (*NPDeallocateFunctionPtr)(NPObject *obj);
241 typedef void (*NPInvalidateFunctionPtr)(NPObject *obj);
242 typedef bool (*NPHasMethodFunctionPtr)(NPObject *obj, NPIdentifier name);
243 typedef bool (*NPInvokeFunctionPtr)(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result);
244 typedef bool (*NPInvokeDefaultFunctionPtr)(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result);
245 typedef bool (*NPHasPropertyFunctionPtr)(NPObject *obj, NPIdentifier name);
246 typedef bool (*NPGetPropertyFunctionPtr)(NPObject *obj, NPIdentifier name, NPVariant *result);
247 typedef bool (*NPSetPropertyFunctionPtr)(NPObject *obj, NPIdentifier name, const NPVariant *value);
248 typedef bool (*NPRemovePropertyFunctionPtr)(NPObject *npobj, NPIdentifier name);
249 typedef bool (*NPEnumerationFunctionPtr)(NPObject *npobj, NPIdentifier **value, uint32_t *count);
250 typedef bool (*NPConstructFunctionPtr)(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result);
251 
252 /*
253     NPObjects returned by create have a reference count of one.  It is the caller's responsibility
254     to release the returned object.
255 
256     NPInvokeFunctionPtr function may return false to indicate a the method could not be invoked.
257 
258     NPGetPropertyFunctionPtr and NPSetPropertyFunctionPtr may return false to indicate a property doesn't
259     exist.
260 
261     NPInvalidateFunctionPtr is called by the scripting environment when the native code is
262     shutdown.  Any attempt to message a NPObject instance after the invalidate
263     callback has been called will result in undefined behavior, even if the
264     native code is still retaining those NPObject instances.
265     (The runtime will typically return immediately, with 0 or NULL, from an attempt to
266     dispatch to a NPObject, but this behavior should not be depended upon.)
267 
268     The NPEnumerationFunctionPtr function may pass an array of
269     NPIdentifiers back to the caller. The callee allocs the memory of
270     the array using NPN_MemAlloc(), and it's the caller's responsibility
271     to release it using NPN_MemFree().
272 */
273 struct NPClass
274 {
275     uint32_t structVersion;
276     NPAllocateFunctionPtr allocate;
277     NPDeallocateFunctionPtr deallocate;
278     NPInvalidateFunctionPtr invalidate;
279     NPHasMethodFunctionPtr hasMethod;
280     NPInvokeFunctionPtr invoke;
281     NPInvokeDefaultFunctionPtr invokeDefault;
282     NPHasPropertyFunctionPtr hasProperty;
283     NPGetPropertyFunctionPtr getProperty;
284     NPSetPropertyFunctionPtr setProperty;
285     NPRemovePropertyFunctionPtr removeProperty;
286     NPEnumerationFunctionPtr enumerate;
287     NPConstructFunctionPtr construct;
288 };
289 
290 #define NP_CLASS_STRUCT_VERSION      3
291 #define NP_CLASS_STRUCT_VERSION_ENUM 2
292 #define NP_CLASS_STRUCT_VERSION_CTOR 3
293 
294 #define NP_CLASS_STRUCT_VERSION_HAS_ENUM(npclass)   \
295     ((npclass)->structVersion >= NP_CLASS_STRUCT_VERSION_ENUM)
296 #define NP_CLASS_STRUCT_VERSION_HAS_CTOR(npclass)   \
297     ((npclass)->structVersion >= NP_CLASS_STRUCT_VERSION_CTOR)
298 
299 struct NPObject {
300     NPClass *_class;
301     uint32_t referenceCount;
302     // Additional space may be allocated here by types of NPObjects
303 };
304 
305 /*
306     If the class has an allocate function, NPN_CreateObject invokes that function,
307     otherwise a NPObject is allocated and returned.  If a class has an allocate
308     function it is the responsibility of that implementation to set the initial retain
309     count to 1.
310 */
311 NPObject *NPN_CreateObject(NPP npp, NPClass *aClass);
312 
313 /*
314     Increment the NPObject's reference count.
315 */
316 NPObject *NPN_RetainObject (NPObject *obj);
317 
318 /*
319     Decremented the NPObject's reference count.  If the reference
320     count goes to zero, the class's destroy function is invoke if
321     specified, otherwise the object is freed directly.
322 */
323 void NPN_ReleaseObject (NPObject *obj);
324 
325 /*
326     Functions to access script objects represented by NPObject.
327 
328     Calls to script objects are synchronous.  If a function returns a
329     value, it will be supplied via the result NPVariant
330     argument. Successful calls will return true, false will be
331     returned in case of an error.
332 
333     Calls made from plugin code to script must be made from the thread
334     on which the plugin was initialized.
335 */
336 bool NPN_Invoke(NPP npp, NPObject *npobj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result);
337 bool NPN_InvokeDefault(NPP npp, NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result);
338 bool NPN_Evaluate(NPP npp, NPObject *npobj, NPString *script, NPVariant *result);
339 bool NPN_GetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, NPVariant *result);
340 bool NPN_SetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, const NPVariant *value);
341 bool NPN_RemoveProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName);
342 bool NPN_HasProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName);
343 bool NPN_HasMethod(NPP npp, NPObject *npobj, NPIdentifier methodName);
344 bool NPN_Enumerate(NPP npp, NPObject *npobj, NPIdentifier **identifier, uint32_t *count);
345 bool NPN_Construct(NPP npp, NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result);
346 
347 /*
348     NPN_SetException may be called to trigger a script exception upon return
349     from entry points into NPObjects.
350 */
351 void NPN_SetException (NPObject *obj, const NPUTF8 *message);
352 
353 #ifdef __cplusplus
354 }
355 #endif
356 
357 #endif
358