1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * Copyright (c) 2004, Apple Computer, Inc. and The Mozilla Foundation.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the names of Apple Computer, Inc. ("Apple") or The Mozilla
16 * Foundation ("Mozilla") nor the names of their contributors may be used
17 * to endorse or promote products derived from this software without
18 * specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY APPLE, MOZILLA AND THEIR CONTRIBUTORS "AS
21 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
23 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE, MOZILLA OR
24 * THEIR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
26 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #ifndef _NP_RUNTIME_H_
34 #define _NP_RUNTIME_H_
36 // BEGIN GOOGLE MODIFICATIONS
38 // END GOOGLE MODIFICATIONS
47 This API is used to facilitate binding code written in C to script
48 objects. The API in this header does not assume the presence of a
49 user agent. That is, it can be used to bind C code to scripting
50 environments outside of the context of a user agent.
52 However, the normal use of the this API is in the context of a
53 scripting environment running in a browser or other user agent.
54 In particular it is used to support the extended Netscape
55 script-ability API for plugins (NP-SAP). NP-SAP is an extension
56 of the Netscape plugin API. As such we have adopted the use of
57 the "NP" prefix for this API.
59 The following NP{N|P}Variables were added to the Netscape plugin
63 NPNVPluginElementNPObject
64 NPPVpluginScriptableNPObject
66 These variables are exposed through NPN_GetValue() and
67 NPP_GetValue() (respectively) and are used to establish the
68 initial binding between the user agent and native code. The DOM
69 objects in the user agent can be examined and manipulated using
70 the NPN_ functions that operate on NPObjects described in this
73 To the extent possible the assumptions about the scripting
74 language used by the scripting environment have been minimized.
77 #define NP_BEGIN_MACRO do {
78 #define NP_END_MACRO } while (0)
81 Objects (non-primitive data) passed between 'C' and script is
82 always wrapped in an NPObject. The 'interface' of an NPObject is
83 described by an NPClass.
85 typedef struct NPObject NPObject
;
86 typedef struct NPClass NPClass
;
89 typedef struct _NPString
{
90 const NPUTF8
*UTF8Characters
;
100 NPVariantType_String
,
104 typedef struct _NPVariant
{
110 NPString stringValue
;
111 NPObject
*objectValue
;
116 NPN_ReleaseVariantValue is called on all 'out' parameters
117 references. Specifically it is to be called on variants that own
118 their value, as is the case with all non-const NPVariant*
119 arguments after a successful call to any methods (except this one)
122 After calling NPN_ReleaseVariantValue, the type of the variant
123 will be NPVariantType_Void.
125 void NPN_ReleaseVariantValue(NPVariant
*variant
);
127 #define NPVARIANT_IS_VOID(_v) ((_v).type == NPVariantType_Void)
128 #define NPVARIANT_IS_NULL(_v) ((_v).type == NPVariantType_Null)
129 #define NPVARIANT_IS_BOOLEAN(_v) ((_v).type == NPVariantType_Bool)
130 #define NPVARIANT_IS_INT32(_v) ((_v).type == NPVariantType_Int32)
131 #define NPVARIANT_IS_DOUBLE(_v) ((_v).type == NPVariantType_Double)
132 #define NPVARIANT_IS_STRING(_v) ((_v).type == NPVariantType_String)
133 #define NPVARIANT_IS_OBJECT(_v) ((_v).type == NPVariantType_Object)
135 #define NPVARIANT_TO_BOOLEAN(_v) ((_v).value.boolValue)
136 #define NPVARIANT_TO_INT32(_v) ((_v).value.intValue)
137 #define NPVARIANT_TO_DOUBLE(_v) ((_v).value.doubleValue)
138 #define NPVARIANT_TO_STRING(_v) ((_v).value.stringValue)
139 #define NPVARIANT_TO_OBJECT(_v) ((_v).value.objectValue)
141 #define VOID_TO_NPVARIANT(_v) \
143 (_v).type = NPVariantType_Void; \
144 (_v).value.objectValue = NULL; \
147 #define NULL_TO_NPVARIANT(_v) \
149 (_v).type = NPVariantType_Null; \
150 (_v).value.objectValue = NULL; \
153 #define BOOLEAN_TO_NPVARIANT(_val, _v) \
155 (_v).type = NPVariantType_Bool; \
156 (_v).value.boolValue = !!(_val); \
159 #define INT32_TO_NPVARIANT(_val, _v) \
161 (_v).type = NPVariantType_Int32; \
162 (_v).value.intValue = _val; \
165 #define DOUBLE_TO_NPVARIANT(_val, _v) \
167 (_v).type = NPVariantType_Double; \
168 (_v).value.doubleValue = _val; \
171 #define STRINGZ_TO_NPVARIANT(_val, _v) \
173 (_v).type = NPVariantType_String; \
174 NPString str = { _val, (uint32_t)(strlen(_val)) }; \
175 (_v).value.stringValue = str; \
178 #define STRINGN_TO_NPVARIANT(_val, _len, _v) \
180 (_v).type = NPVariantType_String; \
181 NPString str = { _val, (uint32_t)(_len) }; \
182 (_v).value.stringValue = str; \
185 #define OBJECT_TO_NPVARIANT(_val, _v) \
187 (_v).type = NPVariantType_Object; \
188 (_v).value.objectValue = _val; \
193 Type mappings (JavaScript types have been used for illustration
196 JavaScript to C (NPVariant with type:)
197 undefined NPVariantType_Void
198 null NPVariantType_Null
199 Boolean NPVariantType_Bool
200 Number NPVariantType_Double or NPVariantType_Int32
201 String NPVariantType_String
202 Object NPVariantType_Object
204 C (NPVariant with type:) to JavaScript
205 NPVariantType_Void undefined
206 NPVariantType_Null null
207 NPVariantType_Bool Boolean
208 NPVariantType_Int32 Number
209 NPVariantType_Double Number
210 NPVariantType_String String
211 NPVariantType_Object Object
214 typedef void *NPIdentifier
;
217 NPObjects have methods and properties. Methods and properties are
218 identified with NPIdentifiers. These identifiers may be reflected
219 in script. NPIdentifiers can be either strings or integers, IOW,
220 methods and properties can be identified by either strings or
221 integers (i.e. foo["bar"] vs foo[1]). NPIdentifiers can be
222 compared using ==. In case of any errors, the requested
223 NPIdentifier(s) will be NULL. NPIdentifier lifetime is controlled
224 by the browser. Plugins do not need to worry about memory management
225 with regards to NPIdentifiers.
227 NPIdentifier
NPN_GetStringIdentifier(const NPUTF8
*name
);
228 void NPN_GetStringIdentifiers(const NPUTF8
**names
, int32_t nameCount
,
229 NPIdentifier
*identifiers
);
230 NPIdentifier
NPN_GetIntIdentifier(int32_t intid
);
231 bool NPN_IdentifierIsString(NPIdentifier identifier
);
234 The NPUTF8 returned from NPN_UTF8FromIdentifier SHOULD be freed.
236 NPUTF8
*NPN_UTF8FromIdentifier(NPIdentifier identifier
);
239 Get the integer represented by identifier. If identifier is not an
240 integer identifier, the behaviour is undefined.
242 int32_t NPN_IntFromIdentifier(NPIdentifier identifier
);
245 NPObject behavior is implemented using the following set of
248 The NPVariant *result argument of these functions (where
249 applicable) should be released using NPN_ReleaseVariantValue().
251 typedef NPObject
*(*NPAllocateFunctionPtr
)(NPP npp
, NPClass
*aClass
);
252 typedef void (*NPDeallocateFunctionPtr
)(NPObject
*npobj
);
253 typedef void (*NPInvalidateFunctionPtr
)(NPObject
*npobj
);
254 typedef bool (*NPHasMethodFunctionPtr
)(NPObject
*npobj
, NPIdentifier name
);
255 typedef bool (*NPInvokeFunctionPtr
)(NPObject
*npobj
, NPIdentifier name
,
256 const NPVariant
*args
, uint32_t argCount
,
258 typedef bool (*NPInvokeDefaultFunctionPtr
)(NPObject
*npobj
,
259 const NPVariant
*args
,
262 typedef bool (*NPHasPropertyFunctionPtr
)(NPObject
*npobj
, NPIdentifier name
);
263 typedef bool (*NPGetPropertyFunctionPtr
)(NPObject
*npobj
, NPIdentifier name
,
265 typedef bool (*NPSetPropertyFunctionPtr
)(NPObject
*npobj
, NPIdentifier name
,
266 const NPVariant
*value
);
267 typedef bool (*NPRemovePropertyFunctionPtr
)(NPObject
*npobj
,
269 typedef bool (*NPEnumerationFunctionPtr
)(NPObject
*npobj
, NPIdentifier
**value
,
271 typedef bool (*NPConstructFunctionPtr
)(NPObject
*npobj
,
272 const NPVariant
*args
,
277 NPObjects returned by create, retain, invoke, and getProperty pass
278 a reference count to the caller. That is, the callee adds a
279 reference count which passes to the caller. It is the caller's
280 responsibility to release the returned object.
282 NPInvokeFunctionPtr function may return 0 to indicate a void
285 NPInvalidateFunctionPtr is called by the scripting environment
286 when the native code is shutdown. Any attempt to message a
287 NPObject instance after the invalidate callback has been
288 called will result in undefined behavior, even if the native code
289 is still retaining those NPObject instances. (The runtime
290 will typically return immediately, with 0 or NULL, from an attempt
291 to dispatch to a NPObject, but this behavior should not be
294 The NPEnumerationFunctionPtr function may pass an array of
295 NPIdentifiers back to the caller. The callee allocs the memory of
296 the array using NPN_MemAlloc(), and it's the caller's responsibility
297 to release it using NPN_MemFree().
301 uint32_t structVersion
;
302 NPAllocateFunctionPtr allocate
;
303 NPDeallocateFunctionPtr deallocate
;
304 NPInvalidateFunctionPtr invalidate
;
305 NPHasMethodFunctionPtr hasMethod
;
306 NPInvokeFunctionPtr invoke
;
307 NPInvokeDefaultFunctionPtr invokeDefault
;
308 NPHasPropertyFunctionPtr hasProperty
;
309 NPGetPropertyFunctionPtr getProperty
;
310 NPSetPropertyFunctionPtr setProperty
;
311 NPRemovePropertyFunctionPtr removeProperty
;
312 NPEnumerationFunctionPtr enumerate
;
313 NPConstructFunctionPtr construct
;
316 #define NP_CLASS_STRUCT_VERSION 3
318 #define NP_CLASS_STRUCT_VERSION_ENUM 2
319 #define NP_CLASS_STRUCT_VERSION_CTOR 3
321 #define NP_CLASS_STRUCT_VERSION_HAS_ENUM(npclass) \
322 ((npclass)->structVersion >= NP_CLASS_STRUCT_VERSION_ENUM)
324 #define NP_CLASS_STRUCT_VERSION_HAS_CTOR(npclass) \
325 ((npclass)->structVersion >= NP_CLASS_STRUCT_VERSION_CTOR)
329 uint32_t referenceCount
;
331 * Additional space may be allocated here by types of NPObjects
336 If the class has an allocate function, NPN_CreateObject invokes
337 that function, otherwise a NPObject is allocated and
338 returned. This method will initialize the referenceCount member of
341 NPObject
*NPN_CreateObject(NPP npp
, NPClass
*aClass
);
344 Increment the NPObject's reference count.
346 NPObject
*NPN_RetainObject(NPObject
*npobj
);
349 Decremented the NPObject's reference count. If the reference
350 count goes to zero, the class's destroy function is invoke if
351 specified, otherwise the object is freed directly.
353 void NPN_ReleaseObject(NPObject
*npobj
);
356 Functions to access script objects represented by NPObject.
358 Calls to script objects are synchronous. If a function returns a
359 value, it will be supplied via the result NPVariant
360 argument. Successful calls will return true, false will be
361 returned in case of an error.
363 Calls made from plugin code to script must be made from the thread
364 on which the plugin was initialized.
367 bool NPN_Invoke(NPP npp
, NPObject
*npobj
, NPIdentifier methodName
,
368 const NPVariant
*args
, uint32_t argCount
, NPVariant
*result
);
369 bool NPN_InvokeDefault(NPP npp
, NPObject
*npobj
, const NPVariant
*args
,
370 uint32_t argCount
, NPVariant
*result
);
371 bool NPN_Evaluate(NPP npp
, NPObject
*npobj
, NPString
*script
,
373 bool NPN_GetProperty(NPP npp
, NPObject
*npobj
, NPIdentifier propertyName
,
375 bool NPN_SetProperty(NPP npp
, NPObject
*npobj
, NPIdentifier propertyName
,
376 const NPVariant
*value
);
377 bool NPN_RemoveProperty(NPP npp
, NPObject
*npobj
, NPIdentifier propertyName
);
378 bool NPN_HasProperty(NPP npp
, NPObject
*npobj
, NPIdentifier propertyName
);
379 bool NPN_HasMethod(NPP npp
, NPObject
*npobj
, NPIdentifier methodName
);
380 bool NPN_Enumerate(NPP npp
, NPObject
*npobj
, NPIdentifier
**identifier
,
382 bool NPN_Construct(NPP npp
, NPObject
*npobj
, const NPVariant
*args
,
383 uint32_t argCount
, NPVariant
*result
);
386 NPN_SetException may be called to trigger a script exception upon
387 return from entry points into NPObjects. Typical usage:
389 NPN_SetException (npobj, message);
391 void NPN_SetException(NPObject
*npobj
, const NPUTF8
*message
);