Home | History | Annotate | Download | only in bridge
      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