[Session restore] Rename group name Enabled to Restore.
[chromium-blink-merge.git] / third_party / npapi / bindings / npruntime.h
blob9f7848c639ed2ef35809554f751b0360ab7b4972
1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * Copyright (c) 2004, Apple Computer, Inc. and The Mozilla Foundation.
4 * All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
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
37 #include "npapi.h"
38 // END GOOGLE MODIFICATIONS
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
44 #include "nptypes.h"
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
60 API (in npapi.h):
62 NPNVWindowNPObject
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
71 header.
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;
88 typedef char NPUTF8;
89 typedef struct _NPString {
90 const NPUTF8 *UTF8Characters;
91 uint32_t UTF8Length;
92 } NPString;
94 typedef enum {
95 NPVariantType_Void,
96 NPVariantType_Null,
97 NPVariantType_Bool,
98 NPVariantType_Int32,
99 NPVariantType_Double,
100 NPVariantType_String,
101 NPVariantType_Object
102 } NPVariantType;
104 typedef struct _NPVariant {
105 NPVariantType type;
106 union {
107 bool boolValue;
108 int32_t intValue;
109 double doubleValue;
110 NPString stringValue;
111 NPObject *objectValue;
112 } value;
113 } NPVariant;
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)
120 in this API.
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) \
142 NP_BEGIN_MACRO \
143 (_v).type = NPVariantType_Void; \
144 (_v).value.objectValue = NULL; \
145 NP_END_MACRO
147 #define NULL_TO_NPVARIANT(_v) \
148 NP_BEGIN_MACRO \
149 (_v).type = NPVariantType_Null; \
150 (_v).value.objectValue = NULL; \
151 NP_END_MACRO
153 #define BOOLEAN_TO_NPVARIANT(_val, _v) \
154 NP_BEGIN_MACRO \
155 (_v).type = NPVariantType_Bool; \
156 (_v).value.boolValue = !!(_val); \
157 NP_END_MACRO
159 #define INT32_TO_NPVARIANT(_val, _v) \
160 NP_BEGIN_MACRO \
161 (_v).type = NPVariantType_Int32; \
162 (_v).value.intValue = _val; \
163 NP_END_MACRO
165 #define DOUBLE_TO_NPVARIANT(_val, _v) \
166 NP_BEGIN_MACRO \
167 (_v).type = NPVariantType_Double; \
168 (_v).value.doubleValue = _val; \
169 NP_END_MACRO
171 #define STRINGZ_TO_NPVARIANT(_val, _v) \
172 NP_BEGIN_MACRO \
173 (_v).type = NPVariantType_String; \
174 NPString str = { _val, (uint32_t)(strlen(_val)) }; \
175 (_v).value.stringValue = str; \
176 NP_END_MACRO
178 #define STRINGN_TO_NPVARIANT(_val, _len, _v) \
179 NP_BEGIN_MACRO \
180 (_v).type = NPVariantType_String; \
181 NPString str = { _val, (uint32_t)(_len) }; \
182 (_v).value.stringValue = str; \
183 NP_END_MACRO
185 #define OBJECT_TO_NPVARIANT(_val, _v) \
186 NP_BEGIN_MACRO \
187 (_v).type = NPVariantType_Object; \
188 (_v).value.objectValue = _val; \
189 NP_END_MACRO
193 Type mappings (JavaScript types have been used for illustration
194 purposes):
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
246 callback functions.
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,
257 NPVariant *result);
258 typedef bool (*NPInvokeDefaultFunctionPtr)(NPObject *npobj,
259 const NPVariant *args,
260 uint32_t argCount,
261 NPVariant *result);
262 typedef bool (*NPHasPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name);
263 typedef bool (*NPGetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name,
264 NPVariant *result);
265 typedef bool (*NPSetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name,
266 const NPVariant *value);
267 typedef bool (*NPRemovePropertyFunctionPtr)(NPObject *npobj,
268 NPIdentifier name);
269 typedef bool (*NPEnumerationFunctionPtr)(NPObject *npobj, NPIdentifier **value,
270 uint32_t *count);
271 typedef bool (*NPConstructFunctionPtr)(NPObject *npobj,
272 const NPVariant *args,
273 uint32_t argCount,
274 NPVariant *result);
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
283 result.
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
292 depended upon.)
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().
299 struct NPClass
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)
327 struct NPObject {
328 NPClass *_class;
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
339 the NPObject to 1.
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,
372 NPVariant *result);
373 bool NPN_GetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName,
374 NPVariant *result);
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,
381 uint32_t *count);
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);
393 #ifdef __cplusplus
395 #endif
397 #endif