Fixing bug 250666. Implementing the NPAPI extensions for npruntime plugin scriptability. r+sr=brendan@mozilla.org, a=asa@mozilla.org

This commit is contained in:
jst%mozilla.jstenback.com 2004-07-12 15:53:22 +00:00
parent cefc94128c
commit 1e5db1bfa7
17 changed files with 2974 additions and 268 deletions

View File

@ -124,6 +124,7 @@
// HTMLEmbed/ObjectElement helper includes
#include "nsIPluginInstance.h"
#include "nsIObjectFrame.h"
#include "nsINPRuntimePlugin.h"
#include "nsIScriptablePlugin.h"
#include "nsIPluginHost.h"
#include "nsPIPluginHost.h"
@ -6174,6 +6175,19 @@ nsHTMLPluginObjElementSH::GetPluginJSObject(JSContext *cx, JSObject *obj,
*plugin_obj = nsnull;
*plugin_proto = nsnull;
nsCOMPtr<nsINPRuntimePlugin> npruntime_plugin =
do_QueryInterface(plugin_inst);
if (npruntime_plugin) {
*plugin_obj = npruntime_plugin->GetJSObject(cx);
if (*plugin_obj) {
*plugin_proto = ::JS_GetPrototype(cx, *plugin_obj);
return NS_OK;
}
}
// Check if the plugin object has the nsIScriptablePlugin interface,
// describing how to expose it to JavaScript. Given this interface,
// use it to get the scriptable peer object (possibly the plugin

View File

@ -55,11 +55,16 @@ EXPORTS = \
nsPluginsCID.h \
npapi.h \
npupp.h \
npruntime.h \
nptypes.h \
nsINPRuntimePlugin.h \
$(NULL)
SDK_HEADERS = \
npapi.h \
npupp.h \
nptypes.h \
npruntime.h \
$(NULL)
XPIDLSRCS = \

View File

@ -37,7 +37,7 @@
/*
* npapi.h $Revision: 3.34 $
* npapi.h $Revision: 3.35 $
* Netscape client plug-in API spec
*/
@ -125,7 +125,7 @@
/*----------------------------------------------------------------------*/
#define NP_VERSION_MAJOR 0
#define NP_VERSION_MINOR 13
#define NP_VERSION_MINOR 14
/* The OS/2 version of Netscape uses RC_DATA to define the
@ -186,7 +186,7 @@ typedef unsigned short uint16;
#endif
#ifndef _UINT32
# if defined(__alpha)
# if defined(__alpha) || defined(__amd64__) defined(__x86_64__)
typedef unsigned int uint32;
# else /* __alpha */
typedef unsigned long uint32;
@ -202,7 +202,7 @@ typedef short int16;
#endif
#ifndef _INT32
# if defined(__alpha)
# if defined(__alpha) || defined(__amd64__) defined(__x86_64__)
typedef int int32;
# else /* __alpha */
typedef long int32;
@ -387,7 +387,10 @@ typedef enum {
/* 12 and over are available on Mozilla builds starting with 0.9.9 */
NPPVjavascriptPushCallerBool = 12,
NPPVpluginKeepLibraryInMemory = 13, /* available in Mozilla 1.0 */
NPPVpluginNeedsXEmbed = 14
NPPVpluginNeedsXEmbed = 14,
/* Get the NPObject for scripting the plugin. */
NPPVpluginScriptableNPObject = 15
} NPPVariable;
/*
@ -406,7 +409,13 @@ typedef enum {
NPNVDOMElement = (11 | NP_ABI_MASK), /* available in Mozilla 1.2 */
NPNVDOMWindow = (12 | NP_ABI_MASK),
NPNVToolkit = (13 | NP_ABI_MASK),
NPNVSupportsXEmbedBool = 14
NPNVSupportsXEmbedBool = 14,
/* Get the NPObject wrapper for the browser window. */
NPNVWindowNPObject = 15,
/* Get the NPObject wrapper for the plugins DOM element. */
NPNVPluginElementNPObject = 16
} NPNVariable;
/*
@ -653,6 +662,9 @@ void NP_LOADDS NPP_URLNotify(NPP instance, const char* url,
jref NP_LOADDS NPP_GetJavaClass(void);
#endif
NPError NP_LOADDS NPP_GetValue(NPP instance, NPPVariable variable, void *value);
/*
* Uh, shouldn't NPP_SetValue() take an NPPVariable and not an NPNVariable?
*/
NPError NP_LOADDS NPP_SetValue(NPP instance, NPNVariable variable, void *value);
/*

View File

@ -0,0 +1,389 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* Copyright © 2004, Apple Computer, Inc. and The Mozilla Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the names of Apple Computer, Inc. ("Apple") or The Mozilla
* Foundation ("Mozilla") nor the names of their contributors may be used
* to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY APPLE, MOZILLA AND THEIR CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE, MOZILLA OR
* THEIR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Revision 1 (March 4, 2004):
* Initial proposal.
*
* Revision 2 (March 10, 2004):
* All calls into script were made asynchronous. Results are
* provided via the NPScriptResultFunctionPtr callback.
*
* Revision 3 (March 10, 2004):
* Corrected comments to not refer to class retain/release FunctionPtrs.
*
* Revision 4 (March 11, 2004):
* Added additional convenience NPN_SetExceptionWithUTF8().
* Changed NPHasPropertyFunctionPtr and NPHasMethodFunctionPtr to take NPClass
* pointers instead of NPObject pointers.
* Added NPIsValidIdentifier().
*
* Revision 5 (March 17, 2004):
* Added context parameter to result callbacks from ScriptObject functions.
*
* Revision 6 (March 29, 2004):
* Renamed functions implemented by user agent to NPN_*. Removed _ from
* type names.
* Renamed "JavaScript" types to "Script".
*
* Revision 7 (April 21, 2004):
* NPIdentifier becomes a void*, was int32_t
* Remove NP_IsValidIdentifier, renamed NP_IdentifierFromUTF8 to NP_GetIdentifier
* Added NPVariant and modified functions to use this new type.
*
* Revision 8 (July 9, 2004):
* Updated to joint Apple-Mozilla license.
*
*/
#ifndef _NP_RUNTIME_H_
#define _NP_RUNTIME_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "nptypes.h"
/*
This API is used to facilitate binding code written in C to script
objects. The API in this header does not assume the presence of a
user agent. That is, it can be used to bind C code to scripting
environments outside of the context of a user agent.
However, the normal use of the this API is in the context of a
scripting environment running in a browser or other user agent.
In particular it is used to support the extended Netscape
script-ability API for plugins (NP-SAP). NP-SAP is an extension
of the Netscape plugin API. As such we have adopted the use of
the "NP" prefix for this API.
The following NP{N|P}Variables were added to the Netscape plugin
API (in npapi.h):
NPNVWindowNPObject
NPNVPluginElementNPObject
NPPVpluginScriptableNPObject
These variables are exposed through NPN_GetValue() and
NPP_GetValue() (respectively) and are used to establish the
initial binding between the user agent and native code. The DOM
objects in the user agent can be examined and manipulated using
the NPN_ functions that operate on NPObjects described in this
header.
To the extent possible the assumptions about the scripting
language used by the scripting environment have been minimized.
*/
#define NP_BEGIN_MACRO do {
#define NP_END_MACRO } while (0)
/*
Objects (non-primitive data) passed between 'C' and script is
always wrapped in an NPObject. The 'interface' of an NPObject is
described by an NPClass.
*/
typedef struct NPObject NPObject;
typedef struct NPClass NPClass;
typedef char NPUTF8;
typedef struct _NPString {
const NPUTF8 *utf8characters;
uint32_t utf8length;
} NPString;
typedef enum {
NPVariantType_Void,
NPVariantType_Null,
NPVariantType_Bool,
NPVariantType_Int32,
NPVariantType_Double,
NPVariantType_String,
NPVariantType_Object
} NPVariantType;
typedef struct _NPVariant {
NPVariantType type;
union {
bool boolValue;
uint32_t intValue;
double doubleValue;
NPString stringValue;
NPObject *objectValue;
} value;
} NPVariant;
/*
NPN_ReleaseVariantValue is called on all 'out' parameters
references. Specifically it is to be called on variants that own
their value, as is the case with all non-const NPVariant*
arguments after a successful call to any methods (except this one)
in this API.
After calling NPN_ReleaseVariantValue, the type of the variant
will be NPVariantType_Void.
*/
void NPN_ReleaseVariantValue(NPVariant *variant);
#define NPVARIANT_IS_VOID(_v) ((_v).type == NPVariantType_Void)
#define NPVARIANT_IS_NULL(_v) ((_v).type == NPVariantType_Null)
#define NPVARIANT_IS_BOOLEAN(_v) ((_v).type == NPVariantType_Bool)
#define NPVARIANT_IS_INT32(_v) ((_v).type == NPVariantType_Int32)
#define NPVARIANT_IS_DOUBLE(_v) ((_v).type == NPVariantType_Double)
#define NPVARIANT_IS_STRING(_v) ((_v).type == NPVariantType_String)
#define NPVARIANT_IS_OBJECT(_v) ((_v).type == NPVariantType_Object)
#define NPVARIANT_TO_BOOLEAN(_v) ((_v).value.boolValue)
#define NPVARIANT_TO_INT32(_v) ((_v).value.intValue)
#define NPVARIANT_TO_DOUBLE(_v) ((_v).value.doubleValue)
#define NPVARIANT_TO_STRING(_v) ((_v).value.stringValue)
#define NPVARIANT_TO_OBJECT(_v) ((_v).value.objectValue)
#define VOID_TO_NPVARIANT(_v) \
NP_BEGIN_MACRO \
(_v).type = NPVariantType_Void; \
(_v).value.objectValue = NULL; \
NP_END_MACRO
#define NULL_TO_NPVARIANT(_v) \
NP_BEGIN_MACRO \
(_v).type = NPVariantType_Null; \
(_v).value.objectValue = NULL; \
NP_END_MACRO
#define BOOLEAN_TO_NPVARIANT(_val, _v) \
NP_BEGIN_MACRO \
(_v).type = NPVariantType_Bool; \
(_v).value.boolValue = !!(_val); \
NP_END_MACRO
#define INT32_TO_NPVARIANT(_val, _v) \
NP_BEGIN_MACRO \
(_v).type = NPVariantType_Int32; \
(_v).value.intValue = _val; \
NP_END_MACRO
#define DOUBLE_TO_NPVARIANT(_val, _v) \
NP_BEGIN_MACRO \
(_v).type = NPVariantType_Double; \
(_v).value.doubleValue = _val; \
NP_END_MACRO
#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
#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
#define OBJECT_TO_NPVARIANT(_val, _v) \
NP_BEGIN_MACRO \
(_v).type = NPVariantType_Object; \
(_v).value.objectValue = _val; \
NP_END_MACRO
/*
Type mappings (JavaScript types have been used for illustration
purposes):
JavaScript to C (NPVariant with type:)
undefined NPVariantType_Void
null NPVariantType_Null
Boolean NPVariantType_Bool
Number NPVariantType_Double or NPVariantType_Int32
String NPVariantType_String
Object NPVariantType_Object
C (NPVariant with type:) to JavaScript
NPVariantType_Void undefined
NPVariantType_Null null
NPVariantType_Bool Boolean
NPVariantType_Int32 Number
NPVariantType_Double Number
NPVariantType_String String
NPVariantType_Object Object
*/
typedef void *NPIdentifier;
/*
NPObjects have methods and properties. Methods and properties are
identified with NPIdentifiers. These identifiers may be reflected
in script. NPIdentifiers can be either strings or integers, IOW,
methods and properties can be identified by either strings or
integers (i.e. foo["bar"] vs foo[1]). NPIdentifiers can be
compared using ==. In case of any errors, the requested
NPIdentifier(s) will be NULL.
*/
NPIdentifier NPN_GetStringIdentifier(const NPUTF8 *name);
void NPN_GetStringIdentifiers(const NPUTF8 **names, int32_t nameCount,
NPIdentifier *identifiers);
NPIdentifier NPN_GetIntIdentifier(int32_t intid);
bool NPN_IdentifierIsString(NPIdentifier *identifier);
/*
The NPUTF8 returned from NPN_UTF8FromIdentifier SHOULD be freed.
*/
NPUTF8 *NPN_UTF8FromIdentifier(NPIdentifier identifier);
/*
Get the integer represented by identifier. If identifier is not an
integer identifier, the behaviour is undefined.
*/
int32_t NPN_IntFromIdentifier(NPIdentifier identifier);
/*
NPObject behavior is implemented using the following set of
callback functions.
The NPVariant *result argument of these functions (where
applicable) should be released using NPN_ReleaseVariantValue().
*/
typedef NPObject *(*NPAllocateFunctionPtr)();
typedef void (*NPDeallocateFunctionPtr)(NPObject *npobj);
typedef void (*NPInvalidateFunctionPtr)(NPObject *npobj);
typedef bool (*NPHasMethodFunctionPtr)(NPObject *npobj, NPIdentifier name);
typedef bool (*NPInvokeFunctionPtr)(NPObject *npobj, NPIdentifier name,
const NPVariant *args, uint32_t argCount,
NPVariant *result);
typedef bool (*NPHasPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name);
typedef bool (*NPGetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name,
NPVariant *result);
typedef bool (*NPSetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name,
const NPVariant *value);
typedef bool (*NPRemovePropertyFunctionPtr)(NPObject *npobj, NPIdentifier name);
/*
NPObjects returned by create, retain, invoke, and getProperty pass
a reference count to the caller. That is, the callee adds a
reference count which passes to the caller. It is the caller's
responsibility to release the returned object.
NPInvokeFunctionPtr function may return 0 to indicate a void
result.
NPInvalidateFunctionPtr is called by the scripting environment
when the native code is shutdown. Any attempt to message a
NPObject instance after the invalidate callback has been
called will result in undefined behavior, even if the native code
is still retaining those NPObject instances. (The runtime
will typically return immediately, with 0 or NULL, from an attempt
to dispatch to a NPObject, but this behavior should not be
depended upon.)
*/
struct NPClass
{
uint32_t structVersion;
NPAllocateFunctionPtr allocate;
NPDeallocateFunctionPtr deallocate;
NPInvalidateFunctionPtr invalidate;
NPHasMethodFunctionPtr hasMethod;
NPInvokeFunctionPtr invoke;
NPHasPropertyFunctionPtr hasProperty;
NPGetPropertyFunctionPtr getProperty;
NPSetPropertyFunctionPtr setProperty;
NPRemovePropertyFunctionPtr removeProperty;
};
#define NP_CLASS_STRUCT_VERSION 1
struct NPObject {
NPClass *_class;
uint32_t referenceCount;
/*
* Additional space may be allocated here by types of NPObjects
*/
};
/*
If the class has an allocate function, NPN_CreateObject invokes
that function, otherwise a NPObject is allocated and
returned. This method will initialize the referenceCount member of
the NPObject to 1.
*/
NPObject *NPN_CreateObject(NPClass *aClass);
/*
Increment the NPObject's reference count.
*/
NPObject *NPN_RetainObject(NPObject *npobj);
/*
Decremented the NPObject's reference count. If the reference
count goes to zero, the class's destroy function is invoke if
specified, otherwise the object is freed directly.
*/
void NPN_ReleaseObject(NPObject *npobj);
/*
Functions to access script objects represented by NPObject.
Calls to script objects are synchronous. If a function returns a
value, it will be supplied via the result NPVariant
argument. Successful calls will return true, false will be
returned in case of an error.
Calls made from plugin code to script must be made from the thread
on which the plugin was initialized.
*/
bool NPN_Call(NPObject *npobj, NPIdentifier methodName,
const NPVariant *args, uint32_t argCount, NPVariant *result);
bool NPN_Evaluate(NPP npp, NPObject *npobj, NPString *script,
NPVariant *result);
bool NPN_GetProperty(NPObject *npobj, NPIdentifier propertyName,
NPVariant *result);
bool NPN_SetProperty(NPObject *npobj, NPIdentifier propertyName,
const NPVariant *value);
bool NPN_RemoveProperty(NPObject *npobj, NPIdentifier propertyName);
bool NPN_HasProperty(NPObject *npobj, NPIdentifier propertyName);
bool NPN_HasMethod(NPObject *npobj, NPIdentifier methodName);
/*
NPN_SetException may be called to trigger a script exception upon
return from entry points into NPObjects. Typical usage:
NPN_SetException (npobj, message);
*/
void NPN_SetException(NPObject *npobj, const NPUTF8 *message);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,51 @@
/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* mozilla.org.
* Portions created by the Initial Developer are Copyright (C) 2004
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Johnny Stenback <jst@mozilla.org> (Original author)
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/*
* Header file for ensuring that C99 types ([u]int32_t and boolean)
* are available.
*/
#if defined(WIN32) || defined(OS2)
typedef int int32_t;
typedef unsigned int uint32_t;
#else
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
#endif

View File

@ -1,4 +1,4 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -37,7 +37,7 @@
/*
* npupp.h $Revision: 3.16 $
* npupp.h $Revision: 3.17 $
* function call mecahnics needed by platform specific glue code.
*/
@ -57,6 +57,8 @@
#include "npapi.h"
#endif
#include "npruntime.h"
#include "jri.h"
/******************************************************************************************
@ -486,8 +488,6 @@ typedef NPError (* NP_LOADDS NPP_SetValueUPP)(NPP instance, NPNVariable variable
#endif
/*
* Netscape entry points
*/
@ -1061,6 +1061,441 @@ typedef void (* NP_LOADDS NPN_ForceRedrawUPP)(NPP instance);
#endif
/* NPN_GetStringIdentifier */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_GetStringIdentifierUPP;
enum {
uppNPN_GetStringIdentifierProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(const NPUTF8*)))
| RESULT_SIZE(SIZE_CODE(sizeof(NPIdentifier)))
};
#define NewNPN_GetStringIdentifierProc(FUNC) \
(NPN_GetStringIdentifierUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_GetStringIdentifierProcInfo, GetCurrentArchitecture())
#define CallNPN_GetStringIdentifierProc(FUNC, ARG1) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_GetStringIdentifierProcInfo, (ARG1))
#else
typedef NPIdentifier (* NP_LOADDS NPN_GetStringIdentifierUPP)(const NPUTF8* name);
#define NewNPN_GetStringIdentifierProc(FUNC) \
((NPN_GetStringIdentifierUPP) (FUNC))
#define CallNPN_GetStringIdentifierProc(FUNC, ARG1) \
(*(FUNC))((ARG1))
#endif
/* NPN_GetStringIdentifiers */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_GetStringIdentifiersUPP;
enum {
uppNPN_GetStringIdentifiersProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(const NPUTF8**)))
| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(int32_t)))
| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(NPIdentifier*)))
| RESULT_SIZE(SIZE_CODE(0))
};
#define NewNPN_GetStringIdentifiersProc(FUNC) \
(NPN_GetStringIdentifiersUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_GetStringIdentifiersProcInfo, GetCurrentArchitecture())
#define CallNPN_GetStringIdentifiersProc(FUNC, ARG1, ARG2, ARG3) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_GetStringIdentifiersProcInfo, (ARG1), (ARG2), (ARG3))
#else
typedef void (* NP_LOADDS NPN_GetStringIdentifiersUPP)(const NPUTF8** names,
int32_t nameCount,
NPIdentifier* identifiers);
#define NewNPN_GetStringIdentifiersProc(FUNC) \
((NPN_GetStringIdentifiersUPP) (FUNC))
#define CallNPN_GetStringIdentifiersProc(FUNC, ARG1, ARG2, ARG3) \
(*(FUNC))((ARG1), (ARG2), (ARG3))
#endif
/* NPN_GetIntIdentifier */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_GetIntIdentifierUPP;
enum {
uppNPN_GetIntIdentifierProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int32_t)))
| RESULT_SIZE(SIZE_CODE(sizeof(NPIdentifier)))
};
#define NewNPN_GetIntIdentifierProc(FUNC) \
(NPN_GetIntIdentifierUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_GetIntIdentifierProcInfo, GetCurrentArchitecture())
#define CallNPN_GetIntIdentifierProc(FUNC, ARG1) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_GetIntIdentifierProcInfo, (ARG1))
#else
typedef NPIdentifier (* NP_LOADDS NPN_GetIntIdentifierUPP)(int32_t intid);
#define NewNPN_GetIntIdentifierProc(FUNC) \
((NPN_GetIntIdentifierUPP) (FUNC))
#define CallNPN_GetIntIdentifierProc(FUNC, ARG1) \
(*(FUNC))((ARG1))
#endif
/* NPN_IdentifierIsString */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_IdentifierIsStringUPP;
enum {
uppNPN_IdentifierIsStringProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NPIdentifier identifier)))
| RESULT_SIZE(SIZE_CODE(sizeof(bool)))
};
#define NewNPN_IdentifierIsStringProc(FUNC) \
(NPN_IdentifierIsStringUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_IdentifierIsStringProcInfo, GetCurrentArchitecture())
#define CallNPN_IdentifierIsStringProc(FUNC, ARG1) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_IdentifierIsStringProcInfo, (ARG1))
#else
typedef bool (* NP_LOADDS NPN_IdentifierIsStringUPP)(NPIdentifier identifier);
#define NewNPN_IdentifierIsStringProc(FUNC) \
((NPN_IdentifierIsStringUPP) (FUNC))
#define CallNPN_IdentifierIsStringProc(FUNC, ARG1) \
(*(FUNC))((ARG1))
#endif
/* NPN_UTF8FromIdentifier */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_UTF8FromIdentifierUPP;
enum {
uppNPN_UTF8FromIdentifierProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NPIdentifier)))
| RESULT_SIZE(SIZE_CODE(sizeof(NPUTF8*)))
};
#define NewNPN_UTF8FromIdentifierProc(FUNC) \
(NPN_UTF8FromIdentifierUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_UTF8FromIdentifierProcInfo, GetCurrentArchitecture())
#define CallNPN_UTF8FromIdentifierProc(FUNC, ARG1) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_UTF8FromIdentifierProcInfo, (ARG1))
#else
typedef NPUTF8* (* NP_LOADDS NPN_UTF8FromIdentifierUPP)(NPIdentifier identifier);
#define NewNPN_UTF8FromIdentifierProc(FUNC) \
((NPN_UTF8FromIdentifierUPP) (FUNC))
#define CallNPN_UTF8FromIdentifierProc(FUNC, ARG1) \
(*(FUNC))((ARG1))
#endif
/* NPN_IntFromIdentifier */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_IntFromIdentifierUPP;
enum {
uppNPN_IntFromIdentifierProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NPIdentifier)))
| RESULT_SIZE(SIZE_CODE(sizeof(int32_t)))
};
#define NewNPN_IntFromIdentifierProc(FUNC) \
(NPN_IntFromIdentifierUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_IntFromIdentifierProcInfo, GetCurrentArchitecture())
#define CallNPN_IntFromIdentifierProc(FUNC, ARG1) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_IntFromIdentifierProcInfo, (ARG1))
#else
typedef int32_t (* NP_LOADDS NPN_IntFromIdentifierUPP)(NPIdentifier identifier);
#define NewNPN_IntFromIdentifierProc(FUNC) \
((NPN_IntFromIdentifierUPP) (FUNC))
#define CallNPN_IntFromIdentifierProc(FUNC, ARG1) \
(*(FUNC))((ARG1))
#endif
/* NPN_CreateObject */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_CreateObjectUPP;
enum {
uppNPN_CreateObjectProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NPClass*)))
| RESULT_SIZE(SIZE_CODE(sizeof(NPObject*)))
};
#define NewNPN_CreateObjectProc(FUNC) \
(NPN_CreateObjectUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_CreateObjectProcInfo, GetCurrentArchitecture())
#define CallNPN_CreateObjectProc(FUNC, ARG1) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_CreateObjectProcInfo, (ARG1))
#else
typedef NPObject* (* NP_LOADDS NPN_CreateObjectUPP)(NPClass *aClass);
#define NewNPN_CreateObjectProc(FUNC) \
((NPN_CreateObjectUPP) (FUNC))
#define CallNPN_CreateObjectProc(FUNC, ARG1) \
(*(FUNC))((ARG1))
#endif
/* NPN_RetainObject */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_RetainObjectUPP;
enum {
uppNPN_RetainObjectProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NPObject*)))
| RESULT_SIZE(SIZE_CODE(sizeof(NPObject*)))
};
#define NewNPN_RetainObjectProc(FUNC) \
(NPN_RetainObjectUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_RetainObjectProcInfo, GetCurrentArchitecture())
#define CallNPN_RetainObjectProc(FUNC, ARG1) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_RetainObjectProcInfo, (ARG1))
#else
typedef NPObject* (* NP_LOADDS NPN_RetainObjectUPP)(NPObject *obj);
#define NewNPN_RetainObjectProc(FUNC) \
((NPN_RetainObjectUPP) (FUNC))
#define CallNPN_RetainObjectProc(FUNC, ARG1) \
(*(FUNC))((ARG1))
#endif
/* NPN_ReleaseObject */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_ReleaseObjectUPP;
enum {
uppNPN_ReleaseObjectProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NPObject*)))
| RESULT_SIZE(SIZE_CODE(0))
};
#define NewNPN_ReleaseObjectProc(FUNC) \
(NPN_ReleaseObjectUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_ReleaseObjectProcInfo, GetCurrentArchitecture())
#define CallNPN_ReleaseObjectProc(FUNC, ARG1) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_ReleaseObjectProcInfo, (ARG1))
#else
typedef void (* NP_LOADDS NPN_ReleaseObjectUPP)(NPObject *obj);
#define NewNPN_ReleaseObjectProc(FUNC) \
((NPN_ReleaseObjectUPP) (FUNC))
#define CallNPN_ReleaseObjectProc(FUNC, ARG1) \
(*(FUNC))((ARG1))
#endif
/* NPN_Call */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_CallUPP;
enum {
uppNPN_CallProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NPObject*)))
| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(NPIdentifier)))
| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(const NPVariant*)))
| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(uint32_t)))
| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(NPVariant*)))
| RESULT_SIZE(SIZE_CODE(sizeof(bool)))
};
#define NewNPN_CallProc(FUNC) \
(NPN_CallUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_CallProcInfo, GetCurrentArchitecture())
#define CallNPN_CallProc(FUNC, ARG1, ARG2, ARG3, ARG4, ARG5) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_CallProcInfo, (ARG1), (ARG2), (ARG3), (ARG4), (ARG5))
#else
typedef bool (* NP_LOADDS NPN_CallUPP)(NPObject* obj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result);
#define NewNPN_CallProc(FUNC) \
((NPN_CallUPP) (FUNC))
#define CallNPN_CallProc(FUNC, ARG1, ARG2, ARG3, ARG4, ARG5) \
(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4), (ARG5))
#endif
/* NPN_Evaluate */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_EvaluateUPP;
enum {
uppNPN_EvaluateProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NPP)))
| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(NPObject*)))
| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(NPString*)))
| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(NPVariant*)))
| RESULT_SIZE(SIZE_CODE(sizeof(bool)))
};
#define NewNPN_EvaluateProc(FUNC) \
(NPN_EvaluateUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_EvaluateProcInfo, GetCurrentArchitecture())
#define CallNPN_EvaluateProc(FUNC, ARG1, ARG2, ARG3, ARG4) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_EvaluateProcInfo, (ARG1), (ARG2), (ARG3), (ARG4))
#else
typedef bool (* NP_LOADDS NPN_EvaluateUPP)(NPP npp, NPObject *obj, NPString *script, NPVariant *result);
#define NewNPN_EvaluateProc(FUNC) \
((NPN_EvaluateUPP) (FUNC))
#define CallNPN_EvaluateProc(FUNC, ARG1, ARG2, ARG3, ARG4) \
(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4))
#endif
/* NPN_GetProperty */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_GetPropertyUPP;
enum {
uppNPN_GetPropertyProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NPObject*)))
| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(NPIdentifier)))
| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(NPVariant*)))
| RESULT_SIZE(SIZE_CODE(sizeof(bool)))
};
#define NewNPN_GetPropertyProc(FUNC) \
(NPN_GetPropertyUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_GetPropertyProcInfo, GetCurrentArchitecture())
#define CallNPN_GetPropertyProc(FUNC, ARG1, ARG2, ARG3) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_GetPropertyProcInfo, (ARG1), (ARG2), (ARG3))
#else
typedef bool (* NP_LOADDS NPN_GetPropertyUPP)(NPObject *obj, NPIdentifier propertyName, NPVariant *result);
#define NewNPN_GetPropertyProc(FUNC) \
((NPN_GetPropertyUPP) (FUNC))
#define CallNPN_GetPropertyProc(FUNC, ARG1, ARG2, ARG3) \
(*(FUNC))((ARG1), (ARG2), (ARG3))
#endif
/* NPN_SetProperty */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_SetPropertyUPP;
enum {
uppNPN_SetPropertyProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NPObject*)))
| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(NPIdentifier)))
| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(const NPVariant*)))
| RESULT_SIZE(SIZE_CODE(sizeof(bool)))
};
#define NewNPN_SetPropertyProc(FUNC) \
(NPN_SetPropertyUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_SetPropertyProcInfo, GetCurrentArchitecture())
#define CallNPN_SetPropertyProc(FUNC, ARG1, ARG2, ARG3) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_SetPropertyProcInfo, (ARG1), (ARG2), (ARG3))
#else
typedef bool (* NP_LOADDS NPN_SetPropertyUPP)(NPObject *obj, NPIdentifier propertyName, const NPVariant *value);
#define NewNPN_SetPropertyProc(FUNC) \
((NPN_SetPropertyUPP) (FUNC))
#define CallNPN_SetPropertyProc(FUNC, ARG1, ARG2, ARG3) \
(*(FUNC))((ARG1), (ARG2), (ARG3))
#endif
/* NPN_RemoveProperty */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_RemovePropertyUPP;
enum {
uppNPN_RemovePropertyProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NPObject*)))
| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(NPIdentifier)))
| RESULT_SIZE(SIZE_CODE(sizeof(bool)))
};
#define NewNPN_RemovePropertyProc(FUNC) \
(NPN_RemovePropertyUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_RemovePropertyProcInfo, GetCurrentArchitecture())
#define CallNPN_RemovePropertyProc(FUNC, ARG1, ARG2) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_RemovePropertyProcInfo, (ARG1), (ARG2))
#else
typedef bool (* NP_LOADDS NPN_RemovePropertyUPP)(NPObject *obj, NPIdentifier propertyName);
#define NewNPN_RemovePropertyProc(FUNC) \
((NPN_RemovePropertyUPP) (FUNC))
#define CallNPN_RemovePropertyProc(FUNC, ARG1, ARG2) \
(*(FUNC))((ARG1), (ARG2))
#endif
/* NPN_ReleaseVariantValue */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_ReleaseVariantValue;
enum {
uppNPN_ReleaseVariantValueProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NPVariant*)))
| RESULT_SIZE(SIZE_CODE(0))
};
#define NewNPN_ReleaseVariantValueProc(FUNC) \
(NPN_ReleaseVariantValueUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_ReleaseVariantValueProcInfo, GetCurrentArchitecture())
#define CallNPN_ReleaseVariantValueProc(FUNC, ARG1) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_ReleaseVariantValueProcInfo, (ARG1))
#else
typedef void (* NP_LOADDS NPN_ReleaseVariantValueUPP)(NPVariant *variant);
#define NewNPN_ReleaseVariantValueProc(FUNC) \
((NPN_ReleaseVariantValueUPP) (FUNC))
#define CallNPN_ReleaseVariantValueProc(FUNC, ARG1) \
(*(FUNC))((ARG1))
#endif
/* NPN_SetException */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_SetExceptionUPP;
enum {
uppNPN_SetExceptionProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NPObject*)))
| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(const NPUTF8*)))
| RESULT_SIZE(SIZE_CODE(0))
};
#define NewNPN_SetExceptionProc(FUNC) \
(NPN_SetExceptionUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_SetExceptionProcInfo, GetCurrentArchitecture())
#define CallNPN_SetExceptionProc(FUNC, ARG1, ARG2) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_SetExceptionProcInfo, (ARG1), (ARG2))
#else
typedef void (* NP_LOADDS NPN_SetExceptionUPP)(NPObject *obj, const NPUTF8 *message);
#define NewNPN_SetExceptionProc(FUNC) \
((NPN_SetExceptionUPP) (FUNC))
#define CallNPN_SetExceptionProc(FUNC, ARG1, ARG2) \
(*(FUNC))((ARG1), (ARG2))
#endif
/******************************************************************************************
* The actual plugin function table definitions
@ -1115,6 +1550,22 @@ typedef struct _NPNetscapeFuncs {
NPN_InvalidateRectUPP invalidaterect;
NPN_InvalidateRegionUPP invalidateregion;
NPN_ForceRedrawUPP forceredraw;
NPN_GetStringIdentifierUPP getstringidentifier;
NPN_GetStringIdentifiersUPP getstringidentifiers;
NPN_GetIntIdentifierUPP getintidentifier;
NPN_IdentifierIsStringUPP identifierisstring;
NPN_UTF8FromIdentifierUPP utf8fromidentifier;
NPN_IntFromIdentifierUPP intfromidentifier;
NPN_CreateObjectUPP createobject;
NPN_RetainObjectUPP retainobject;
NPN_ReleaseObjectUPP releaseobject;
NPN_CallUPP call;
NPN_EvaluateUPP evaluate;
NPN_GetPropertyUPP getproperty;
NPN_SetPropertyUPP setproperty;
NPN_RemovePropertyUPP removeproperty;
NPN_ReleaseVariantValueUPP releasevariantvalue;
NPN_SetExceptionUPP setexception;
} NPNetscapeFuncs;
#ifdef XP_MAC

View File

@ -0,0 +1,57 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsINPRuntimePlugin_h___
#define nsINPRuntimePlugin_h___
#include "nsISupports.h"
struct JSObject;
struct JSContext;
#define NS_INPRUNTIMEPLUGIN_IID \
{0xbd962bb4, 0x54c3, 0x4d23, \
{ 0xa8, 0xca, 0x54, 0x16, 0x08, 0x02, 0xc2, 0x59 }}
class NS_NO_VTABLE nsINPRuntimePlugin : public nsISupports
{
public:
NS_DEFINE_STATIC_IID_ACCESSOR(NS_INPRUNTIMEPLUGIN_IID)
virtual JSObject *GetJSObject(JSContext *cx) = 0;
};
#endif /* nsINPRuntimePlugin_h___ */

View File

@ -75,13 +75,14 @@ interface nsIPluginInstancePeer;
interface nsIPluginInstance : nsISupports
{
/**
* Initializes a newly created plugin instance, passing to it the plugin
* instance peer which it should use for all communication back to the browser.
* Initializes a newly created plugin instance, passing to it the
* plugin instance peer which it should use for all communication
* back to the browser.
*
* @param aPeer - the corresponding plugin instance peer
* @result - NS_OK if this operation was successful
* @param aPeer - the corresponding plugin instance peer
* @result - NS_OK if this operation was successful
*/
void initialize(in nsIPluginInstancePeer aPeer);
void initialize(in nsIPluginInstancePeer aPeer);
/**
* Returns a reference back to the plugin instance peer. This method is
@ -89,38 +90,40 @@ interface nsIPluginInstance : nsISupports
* instance. The implementation of this method should be sure to increment
* the reference count on the peer by calling AddRef.
*
* @param aPeer - the resulting plugin instance peer
* @result - NS_OK if this operation was successful
* @param aPeer - the resulting plugin instance peer
* @result - NS_OK if this operation was successful
*/
readonly attribute nsIPluginInstancePeer peer;
/**
* Called to instruct the plugin instance to start. This will be called after
* the plugin is first created and initialized, and may be called after the
* plugin is stopped (via the Stop method) if the plugin instance is returned
* to in the browser window's history.
*
* @result - NS_OK if this operation was successful
* Called to instruct the plugin instance to start. This will be
* called after the plugin is first created and initialized, and
* may be called after the plugin is stopped (via the Stop method)
* if the plugin instance is returned to in the browser window's
* history.
*
* @result - NS_OK if this operation was successful
*/
void start();
/**
* Called to instruct the plugin instance to stop, thereby suspending its state.
* This method will be called whenever the browser window goes on to display
* another page and the page containing the plugin goes into the window's history
* list.
*
* @result - NS_OK if this operation was successful
* Called to instruct the plugin instance to stop, thereby
* suspending its state. This method will be called whenever the
* browser window goes on to display another page and the page
* containing the plugin goes into the window's history list.
*
* @result - NS_OK if this operation was successful
*/
void stop();
/**
* Called to instruct the plugin instance to destroy itself. This is called when
* it become no longer possible to return to the plugin instance, either because
* the browser window's history list of pages is being trimmed, or because the
* window containing this page in the history is being closed.
*
* @result - NS_OK if this operation was successful
* Called to instruct the plugin instance to destroy itself. This
* is called when it become no longer possible to return to the
* plugin instance, either because the browser window's history
* list of pages is being trimmed, or because the window
* containing this page in the history is being closed.
*
* @result - NS_OK if this operation was successful
*/
void destroy();
@ -129,10 +132,10 @@ interface nsIPluginInstance : nsISupports
*
* (Corresponds to NPP_SetWindow.)
*
* @param aWindow - the plugin window structure
* @result - NS_OK if this operation was successful
* @param aWindow - the plugin window structure
* @result - NS_OK if this operation was successful
*/
void setWindow(in nsPluginWindowPtr aWindow);
void setWindow(in nsPluginWindowPtr aWindow);
/**
* Called to tell the plugin that the initial src/data stream is
@ -140,46 +143,46 @@ interface nsIPluginInstance : nsISupports
*
* (Corresponds to NPP_NewStream.)
*
* @param aListener - listener the browser will use to give the plugin the data
* @result - NS_OK if this operation was successful
* @param aListener - listener the browser will use to give the plugin the data
* @result - NS_OK if this operation was successful
*/
void newStream(out nsIPluginStreamListener aListener);
void newStream(out nsIPluginStreamListener aListener);
/**
* Called to instruct the plugin instance to print itself to a printer.
*
* (Corresponds to NPP_Print.)
*
* @param aPlatformPrint - platform-specific printing information
* @result - NS_OK if this operation was successful
*/
void print(in nsPluginPrintPtr aPlatformPrint);
* @param aPlatformPrint - platform-specific printing information
* @result - NS_OK if this operation was successful
*/
void print(in nsPluginPrintPtr aPlatformPrint);
/**
* Returns the value of a variable associated with the plugin instance.
*
* @param aVariable - the plugin instance variable to get
* @param aValue - the address of where to store the resulting value
* @result - NS_OK if this operation was successful
*/
void getValue(in nsPluginInstanceVariable aVariable, in voidPtr aValue);
/**
* Returns the value of a variable associated with the plugin instance.
*
* @param aVariable - the plugin instance variable to get
* @param aValue - the address of where to store the resulting value
* @result - NS_OK if this operation was successful
*/
void getValue(in nsPluginInstanceVariable aVariable, in voidPtr aValue);
/**
* Handles an event. An nsIEventHandler can also get registered with with
* nsIPluginManager2::RegisterWindow and will be called whenever an event
* comes in for that window.
*
* Note that for Unix and Mac the nsPluginEvent structure is different
* from the old NPEvent structure -- it's no longer the native event
* record, but is instead a struct. This was done for future extensibility,
* and so that the Mac could receive the window argument too. For Windows
* and OS2, it's always been a struct, so there's no change for them.
*
* (Corresponds to NPP_HandleEvent.)
*
* @param aEvent - the event to be handled
* @param aHandled - set to PR_TRUE if event was handled
/**
* Handles an event. An nsIEventHandler can also get registered with with
* nsIPluginManager2::RegisterWindow and will be called whenever an event
* comes in for that window.
*
* Note that for Unix and Mac the nsPluginEvent structure is different
* from the old NPEvent structure -- it's no longer the native event
* record, but is instead a struct. This was done for future extensibility,
* and so that the Mac could receive the window argument too. For Windows
* and OS2, it's always been a struct, so there's no change for them.
*
* (Corresponds to NPP_HandleEvent.)
*
* @param aEvent - the event to be handled
* @param aHandled - set to PR_TRUE if event was handled
* @result - NS_OK if this operation was successful
*/
void handleEvent(in nsPluginEventPtr aEvent, out boolean aHandled);
void handleEvent(in nsPluginEventPtr aEvent, out boolean aHandled);
};

View File

@ -46,7 +46,7 @@ interface nsIScriptablePlugin : nsISupports
{
/**
* The object to be wrapped and exposed to JavaScript. It should
* be an XPCOM object, and it can be the same object as the plugin.
* be an XPCOM object, and it can be the same object as the plugin.
*/
readonly attribute nsQIResult scriptablePeer;

View File

@ -91,6 +91,7 @@ CPPSRCS = \
nsPluginModule.cpp \
nsPluginInstancePeer.cpp \
nsPluginDirServiceProvider.cpp \
nsJSNPRuntime.cpp \
$(NULL)
ifeq ($(OS_ARCH), BeOS)
@ -131,6 +132,7 @@ EXTRA_DSO_LDOPTS = \
$(MOZ_NECKO_UTIL_LIBS) \
$(MOZ_UNICHARUTIL_LIBS) \
$(MOZ_COMPONENT_LIBS) \
$(MOZ_JS_LIBS) \
$(NULL)
ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT)))

View File

@ -38,6 +38,7 @@
// TODO: Implement Java callbacks
#include "prtypes.h"
#include "prmem.h"
#include "ns4xPlugin.h"
#include "ns4xPluginInstance.h"
#include "ns4xPluginStreamListener.h"
@ -59,6 +60,9 @@
#include "nsIDOMWindow.h"
#include "nsIDocument.h"
#include "nsIScriptGlobalObject.h"
#include "nsIScriptContext.h"
#include "nsIXPConnect.h"
#if defined(XP_MAC) || defined(XP_MACOSX)
#include <Resources.h>
@ -77,6 +81,7 @@
#include "gtk2xtbin.h"
#endif
#include "nsJSNPRuntime.h"
// POST/GET stream type
enum eNPPStreamTypeInternal {
@ -187,9 +192,6 @@ PR_BEGIN_EXTERN_C
static jref NP_EXPORT
_getJavaPeer(NPP npp);
static java_lang_Class* NP_EXPORT
_getJavaClass(void* handle);
#endif
#endif /* OJI */
@ -241,7 +243,6 @@ static void* FP2TV(void *fp)
////////////////////////////////////////////////////////////////////////
// Globals
NPNetscapeFuncs ns4xPlugin::CALLBACKS;
static nsIServiceManagerObsolete* gServiceMgr = nsnull;
static nsIMemory* gMalloc = nsnull;
////////////////////////////////////////////////////////////////////////
@ -257,29 +258,115 @@ ns4xPlugin::CheckClassInitialized(void)
CALLBACKS.size = sizeof(CALLBACKS);
CALLBACKS.version = (NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR;
CALLBACKS.geturl = NewNPN_GetURLProc(FP2TV(_geturl));
CALLBACKS.posturl = NewNPN_PostURLProc(FP2TV(_posturl));
CALLBACKS.requestread = NewNPN_RequestReadProc(FP2TV(_requestread));
CALLBACKS.newstream = NewNPN_NewStreamProc(FP2TV(_newstream));
CALLBACKS.write = NewNPN_WriteProc(FP2TV(_write));
CALLBACKS.destroystream = NewNPN_DestroyStreamProc(FP2TV(_destroystream));
CALLBACKS.status = NewNPN_StatusProc(FP2TV(_status));
CALLBACKS.uagent = NewNPN_UserAgentProc(FP2TV(_useragent));
CALLBACKS.memalloc = NewNPN_MemAllocProc(FP2TV(_memalloc));
CALLBACKS.memfree = NewNPN_MemFreeProc(FP2TV(_memfree));
CALLBACKS.memflush = NewNPN_MemFlushProc(FP2TV(_memflush));
CALLBACKS.reloadplugins = NewNPN_ReloadPluginsProc(FP2TV(_reloadplugins));
CALLBACKS.geturl =
NewNPN_GetURLProc(FP2TV(_geturl));
CALLBACKS.posturl =
NewNPN_PostURLProc(FP2TV(_posturl));
CALLBACKS.requestread =
NewNPN_RequestReadProc(FP2TV(_requestread));
CALLBACKS.newstream =
NewNPN_NewStreamProc(FP2TV(_newstream));
CALLBACKS.write =
NewNPN_WriteProc(FP2TV(_write));
CALLBACKS.destroystream =
NewNPN_DestroyStreamProc(FP2TV(_destroystream));
CALLBACKS.status =
NewNPN_StatusProc(FP2TV(_status));
CALLBACKS.uagent =
NewNPN_UserAgentProc(FP2TV(_useragent));
CALLBACKS.memalloc =
NewNPN_MemAllocProc(FP2TV(_memalloc));
CALLBACKS.memfree =
NewNPN_MemFreeProc(FP2TV(_memfree));
CALLBACKS.memflush =
NewNPN_MemFlushProc(FP2TV(_memflush));
CALLBACKS.reloadplugins =
NewNPN_ReloadPluginsProc(FP2TV(_reloadplugins));
#ifdef OJI
CALLBACKS.getJavaEnv = NewNPN_GetJavaEnvProc(FP2TV(_getJavaEnv));
CALLBACKS.getJavaPeer = NewNPN_GetJavaPeerProc(FP2TV(_getJavaPeer));
CALLBACKS.getJavaEnv =
NewNPN_GetJavaEnvProc(FP2TV(_getJavaEnv));
CALLBACKS.getJavaPeer =
NewNPN_GetJavaPeerProc(FP2TV(_getJavaPeer));
#endif
CALLBACKS.geturlnotify = NewNPN_GetURLNotifyProc(FP2TV(_geturlnotify));
CALLBACKS.posturlnotify = NewNPN_PostURLNotifyProc(FP2TV(_posturlnotify));
CALLBACKS.getvalue = NewNPN_GetValueProc(FP2TV(_getvalue));
CALLBACKS.setvalue = NewNPN_SetValueProc(FP2TV(_setvalue));
CALLBACKS.invalidaterect = NewNPN_InvalidateRectProc(FP2TV(_invalidaterect));
CALLBACKS.invalidateregion = NewNPN_InvalidateRegionProc(FP2TV(_invalidateregion));
CALLBACKS.forceredraw = NewNPN_ForceRedrawProc(FP2TV(_forceredraw));
CALLBACKS.geturlnotify =
NewNPN_GetURLNotifyProc(FP2TV(_geturlnotify));
CALLBACKS.posturlnotify =
NewNPN_PostURLNotifyProc(FP2TV(_posturlnotify));
CALLBACKS.getvalue =
NewNPN_GetValueProc(FP2TV(_getvalue));
CALLBACKS.setvalue =
NewNPN_SetValueProc(FP2TV(_setvalue));
CALLBACKS.invalidaterect =
NewNPN_InvalidateRectProc(FP2TV(_invalidaterect));
CALLBACKS.invalidateregion =
NewNPN_InvalidateRegionProc(FP2TV(_invalidateregion));
CALLBACKS.forceredraw =
NewNPN_ForceRedrawProc(FP2TV(_forceredraw));
CALLBACKS.getstringidentifier =
NewNPN_GetStringIdentifierProc(FP2TV(_getstringidentifier));
CALLBACKS.getstringidentifiers =
NewNPN_GetStringIdentifiersProc(FP2TV(_getstringidentifiers));
CALLBACKS.getintidentifier =
NewNPN_GetIntIdentifierProc(FP2TV(_getintidentifier));
CALLBACKS.identifierisstring =
NewNPN_IdentifierIsStringProc(FP2TV(_identifierisstring));
CALLBACKS.utf8fromidentifier =
NewNPN_UTF8FromIdentifierProc(FP2TV(_utf8fromidentifier));
CALLBACKS.createobject =
NewNPN_CreateObjectProc(FP2TV(_createobject));
CALLBACKS.retainobject =
NewNPN_RetainObjectProc(FP2TV(_retainobject));
CALLBACKS.releaseobject =
NewNPN_ReleaseObjectProc(FP2TV(_releaseobject));
CALLBACKS.call =
NewNPN_CallProc(FP2TV(_call));
CALLBACKS.evaluate =
NewNPN_EvaluateProc(FP2TV(_evaluate));
CALLBACKS.getproperty =
NewNPN_GetPropertyProc(FP2TV(_getproperty));
CALLBACKS.setproperty =
NewNPN_SetPropertyProc(FP2TV(_setproperty));
CALLBACKS.removeproperty =
NewNPN_RemovePropertyProc(FP2TV(_removeproperty));
CALLBACKS.releasevariantvalue =
NewNPN_ReleaseVariantValueProc(FP2TV(_releasevariantvalue));
CALLBACKS.setexception =
NewNPN_SetExceptionProc(FP2TV(_setexception));
initialized = TRUE;
@ -294,7 +381,6 @@ NS_IMPL_ISUPPORTS2(ns4xPlugin, nsIPlugin, nsIFactory)
ns4xPlugin::ns4xPlugin(NPPluginFuncs* callbacks, PRLibrary* aLibrary, NP_PLUGINSHUTDOWN aShutdown, nsIServiceManagerObsolete* serviceMgr)
{
memset((void*) &fCallbacks, 0, sizeof(fCallbacks));
gServiceMgr = serviceMgr;
fLibrary = nsnull;
#if defined(XP_WIN) || defined(XP_OS2)
@ -801,9 +887,8 @@ ns4xPlugin::GetValue(nsPluginVariable variable, void *value)
if (npGetValue && NPERR_NO_ERROR == npGetValue(nsnull, variable, value)) {
return NS_OK;
}
else {
return NS_ERROR_FAILURE;
}
return NS_ERROR_FAILURE;
}
// Create a new NPP GET or POST url stream that may have a notify callback
@ -1106,10 +1191,6 @@ void NP_EXPORT
_reloadplugins(NPBool reloadPages)
{
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("NPN_ReloadPlugins: reloadPages=%d\n", reloadPages));
NS_ASSERTION(gServiceMgr != NULL, "null service manager");
if(gServiceMgr == nsnull)
return;
nsCOMPtr<nsIPluginManager> pm(do_GetService(kPluginManagerCID));
@ -1190,6 +1271,375 @@ _forceredraw(NPP npp)
}
}
static JSContext *
GetJSContextFromNPP(NPP npp)
{
NS_ENSURE_TRUE(npp, nsnull);
ns4xPluginInstance *inst = (ns4xPluginInstance *)npp->ndata;
NS_ENSURE_TRUE(inst, nsnull);
nsCOMPtr<nsIPluginInstancePeer> pip;
inst->GetPeer(getter_AddRefs(pip));
nsCOMPtr<nsPIPluginInstancePeer> pp(do_QueryInterface(pip));
NS_ENSURE_TRUE(pp, nsnull);
nsCOMPtr<nsIPluginInstanceOwner> owner;
pp->GetOwner(getter_AddRefs(owner));
NS_ENSURE_TRUE(owner, nsnull);
nsCOMPtr<nsIDocument> doc;
owner->GetDocument(getter_AddRefs(doc));
NS_ENSURE_TRUE(doc, nsnull);
nsIScriptGlobalObject *sgo = doc->GetScriptGlobalObject();
NS_ENSURE_TRUE(sgo, nsnull);
nsIScriptContext *scx = sgo->GetContext();
NS_ENSURE_TRUE(scx, nsnull);
return (JSContext *)scx->GetNativeContext();
}
NPObject* NP_EXPORT
_getwindowobject(NPP npp)
{
JSContext *cx = GetJSContextFromNPP(npp);
NS_ENSURE_TRUE(cx, nsnull);
return nsJSObjWrapper::GetNewOrUsed(npp, cx, ::JS_GetGlobalObject(cx));
}
NPObject* NP_EXPORT
_getpluginelement(NPP npp)
{
nsIDOMElement *elementp = nsnull;
NPError nperr = _getvalue(npp, NPNVDOMElement, &elementp);
if (nperr != NPERR_NO_ERROR) {
return nsnull;
}
// Pass ownership of elementp to element
nsCOMPtr<nsIDOMElement> element;
element.swap(elementp);
JSContext *cx = GetJSContextFromNPP(npp);
NS_ENSURE_TRUE(cx, nsnull);
nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID()));
NS_ENSURE_TRUE(xpc, nsnull);
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
xpc->WrapNative(cx, ::JS_GetGlobalObject(cx), element,
NS_GET_IID(nsIDOMElement),
getter_AddRefs(holder));
NS_ENSURE_TRUE(holder, nsnull);
JSObject* obj = nsnull;
holder->GetJSObject(&obj);
NS_ENSURE_TRUE(obj, nsnull);
return nsJSObjWrapper::GetNewOrUsed(npp, cx, obj);
}
static NPIdentifier
doGetIdentifier(JSContext *cx, const NPUTF8* name)
{
NS_ConvertUTF8toUTF16 utf16name(name);
JSString *str = ::JS_InternUCStringN(cx, (jschar *)utf16name.get(),
utf16name.Length());
if (!str)
return nsnull;
return (NPIdentifier)STRING_TO_JSVAL(str);
}
NPIdentifier NP_EXPORT
_getstringidentifier(const NPUTF8* name)
{
nsCOMPtr<nsIThreadJSContextStack> stack =
do_GetService("@mozilla.org/js/xpc/ContextStack;1");
if (!stack)
return NULL;
JSContext *cx = nsnull;
stack->GetSafeJSContext(&cx);
if (!cx)
return NULL;
return doGetIdentifier(cx, name);
}
void NP_EXPORT
_getstringidentifiers(const NPUTF8** names, int32_t nameCount,
NPIdentifier *identifiers)
{
nsCOMPtr<nsIThreadJSContextStack> stack =
do_GetService("@mozilla.org/js/xpc/ContextStack;1");
if (!stack)
return;
JSContext *cx = nsnull;
stack->GetSafeJSContext(&cx);
if (!cx)
return;
for (int32_t i = 0; i < nameCount; ++i) {
identifiers[i] = doGetIdentifier(cx, names[i]);
}
}
NPIdentifier NP_EXPORT
_getintidentifier(int32_t intid)
{
return (NPIdentifier)INT_TO_JSVAL(intid);
}
NPUTF8* NP_EXPORT
_utf8fromidentifier(NPIdentifier identifier)
{
if (!identifier)
return NULL;
jsval v = (jsval)identifier;
if (!JSVAL_IS_STRING(v)) {
return nsnull;
}
JSString *str = JSVAL_TO_STRING(v);
return
ToNewUTF8String(nsDependentString((PRUnichar *)::JS_GetStringChars(str),
::JS_GetStringLength(str)));
}
int32_t NP_EXPORT
_intfromidentifier(NPIdentifier identifier)
{
jsval v = (jsval)identifier;
if (!JSVAL_IS_INT(v)) {
return PR_INT32_MIN;
}
return JSVAL_TO_INT(v);
}
bool NP_EXPORT
_identifierisstring(NPIdentifier identifier)
{
jsval v = (jsval)identifier;
return JSVAL_IS_STRING(v);
}
NPObject* NP_EXPORT
_createobject(NPClass* aClass)
{
if (!aClass) {
NS_ERROR("Null class passed to _createobject()!");
return 0;
}
NPObject *npobj;
if (aClass->allocate) {
npobj = aClass->allocate();
} else {
npobj = (NPObject *)PR_Malloc(sizeof(NPObject));
}
if (npobj) {
npobj->_class = aClass;
npobj->referenceCount = 1;
}
return npobj;
}
NPObject* NP_EXPORT
_retainobject(NPObject* npobj)
{
if (npobj) {
PR_AtomicIncrement((PRInt32*)&npobj->referenceCount);
}
return npobj;
}
void NP_EXPORT
_releaseobject(NPObject* npobj)
{
if (!npobj)
return;
int32_t refCnt = PR_AtomicDecrement((PRInt32*)&npobj->referenceCount);
if (refCnt == 0) {
if (npobj->_class && npobj->_class->deallocate) {
npobj->_class->deallocate(npobj);
} else {
PR_Free(npobj);
}
}
}
bool NP_EXPORT
_call(NPObject* npobj, NPIdentifier method, const NPVariant *args,
uint32_t argCount, NPVariant *result)
{
if (!npobj || !npobj->_class || !npobj->_class->invoke)
return PR_FALSE;
return npobj->_class->invoke(npobj, method, args, argCount, result);
}
bool NP_EXPORT
_evaluate(NPP npp, NPObject* npobj, NPString *script, NPVariant *result)
{
JSContext *cx = GetJSContextFromNPP(npp);
NS_ENSURE_TRUE(cx, false);
JSObject *obj =
nsNPObjWrapper::GetNewOrUsed(npp, cx, npobj);
if (!obj) {
return false;
}
if (result) {
// Initialize the out param to void
VOID_TO_NPVARIANT(*result);
}
if (!script || !script->utf8length || !script->utf8characters) {
// Nothing to evaluate.
return true;
}
NS_ConvertUTF8toUTF16 utf16script(script->utf8characters,
script->utf8length);
nsCOMPtr<nsIScriptContext> scx = GetScriptContextFromJSContext(cx);
NS_ENSURE_TRUE(scx, false);
nsIPrincipal *principal = nsnull;
// XXX: Get the principal from the security stack (TBD)
jsval rval;
nsresult rv = scx->EvaluateStringWithValue(utf16script, obj, principal,
nsnull, 0, nsnull, &rval,
nsnull);
NS_ENSURE_SUCCESS(rv, false);
if (result) {
return JSValToNPVariant(npp, cx, rval, result);
}
return true;
}
bool NP_EXPORT
_getproperty(NPObject* npobj, NPIdentifier property, NPVariant *result)
{
if (!npobj || !npobj->_class || !npobj->_class->getProperty)
return PR_FALSE;
return npobj->_class->getProperty(npobj, property, result);
}
bool NP_EXPORT
_setproperty(NPObject* npobj, NPIdentifier property,
const NPVariant *value)
{
if (!npobj || !npobj->_class || !npobj->_class->setProperty)
return PR_FALSE;
return npobj->_class->setProperty(npobj, property, value);
}
bool NP_EXPORT
_removeproperty(NPObject* npobj, NPIdentifier property)
{
if (!npobj || !npobj->_class || !npobj->_class->removeProperty)
return PR_FALSE;
return npobj->_class->removeProperty(npobj, property);
}
bool NP_EXPORT
_hasproperty(NPObject* npobj, NPIdentifier propertyName)
{
if (!npobj || !npobj->_class || !npobj->_class->hasProperty)
return PR_FALSE;
return npobj->_class->hasProperty(npobj, propertyName);
}
bool NP_EXPORT
_hasmethod(NPObject* npobj, NPIdentifier methodName)
{
if (!npobj || !npobj->_class || !npobj->_class->hasMethod)
return PR_FALSE;
return npobj->_class->hasProperty(npobj, methodName);
}
void NP_EXPORT
_releasevariantvalue(NPVariant* variant)
{
switch (variant->type) {
case NPVariantType_Void :
case NPVariantType_Null :
case NPVariantType_Bool :
case NPVariantType_Int32 :
case NPVariantType_Double :
break;
case NPVariantType_String :
{
const NPString *s = &NPVARIANT_TO_STRING(*variant);
if (s->utf8characters)
PR_Free((void *)s->utf8characters);
break;
}
case NPVariantType_Object:
{
NPObject *npobj = NPVARIANT_TO_OBJECT(*variant);
if (npobj)
_releaseobject(npobj);
break;
}
default:
NS_ERROR("Unknown NPVariant type!");
}
VOID_TO_NPVARIANT(*variant);
}
bool NP_EXPORT
_tostring(NPObject* npobj, NPVariant *result)
{
NS_ERROR("Write me!");
return PR_FALSE;
}
void NP_EXPORT
_setexception(NPObject* npobj, const NPUTF8 *message)
{
// XXX: Write me!
}
////////////////////////////////////////////////////////////////////////
NPError NP_EXPORT
@ -1347,6 +1797,19 @@ _getvalue(NPP npp, NPNVariable variable, void *result)
#endif
return NPERR_NO_ERROR;
}
case NPNVWindowNPObject: {
*(NPObject **)result = _getwindowobject(npp);
return NPERR_NO_ERROR;
}
case NPNVPluginElementNPObject: {
*(NPObject **)result = _getpluginelement(npp);
return NPERR_NO_ERROR;
}
default : return NPERR_GENERIC_ERROR;
}
}
@ -1482,10 +1945,6 @@ _useragent(NPP npp)
{
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("NPN_UserAgent: npp=%p\n", (void*)npp));
NS_ASSERTION(gServiceMgr != NULL, "null service manager");
if (gServiceMgr == NULL)
return NULL;
char *retstr;
nsCOMPtr<nsIPluginManager> pm(do_GetService(kPluginManagerCID));
@ -1505,15 +1964,6 @@ _memalloc (uint32 size)
}
#ifdef OJI
////////////////////////////////////////////////////////////////////////
java_lang_Class* NP_EXPORT
_getJavaClass(void* handle)
{
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("NPN_GetJavaClass\n"));
return NULL;
}
////////////////////////////////////////////////////////////////////////
jref NP_EXPORT
_getJavaPeer(NPP npp)

View File

@ -1,4 +1,4 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -96,8 +96,9 @@ class nsIMemory;
class ns4xPlugin : public nsIPlugin
{
public:
ns4xPlugin(NPPluginFuncs* callbacks, PRLibrary* aLibrary, NP_PLUGINSHUTDOWN aShutdown, nsIServiceManagerObsolete* serviceMgr);
ns4xPlugin(NPPluginFuncs* callbacks, PRLibrary* aLibrary,
NP_PLUGINSHUTDOWN aShutdown,
nsIServiceManagerObsolete* serviceMgr);
virtual ~ns4xPlugin(void);
static void ReleaseStatics();
@ -123,17 +124,13 @@ public:
const char* aPluginMIMEType,
void **aResult);
NS_IMETHOD
Initialize(void);
NS_IMETHOD Initialize(void);
NS_IMETHOD
Shutdown(void);
NS_IMETHOD Shutdown(void);
NS_IMETHOD
GetMIMEDescription(const char* *resultingDesc);
NS_IMETHOD GetMIMEDescription(const char* *resultingDesc);
NS_IMETHOD
GetValue(nsPluginVariable variable, void *value);
NS_IMETHOD GetValue(nsPluginVariable variable, void *value);
////////////////////////////////////////////////////////////////////
// ns4xPlugin-specific methods
@ -182,4 +179,70 @@ protected:
static NPNetscapeFuncs CALLBACKS;
};
PR_BEGIN_EXTERN_C
NPObject* NP_EXPORT
_getwindowobject(NPP npp);
NPObject* NP_EXPORT
_getpluginelement(NPP npp);
NPIdentifier NP_EXPORT
_getstringidentifier(const NPUTF8* name);
void NP_EXPORT
_getstringidentifiers(const NPUTF8** names, int32_t nameCount,
NPIdentifier *identifiers);
bool NP_EXPORT
_identifierisstring(NPIdentifier identifiers);
NPIdentifier NP_EXPORT
_getintidentifier(int32_t intid);
NPUTF8* NP_EXPORT
_utf8fromidentifier(NPIdentifier identifier);
int32_t NP_EXPORT
_intfromidentifier(NPIdentifier identifier);
NPObject* NP_EXPORT
_createobject(NPClass* aClass);
NPObject* NP_EXPORT
_retainobject(NPObject* npobj);
void NP_EXPORT
_releaseobject(NPObject* npobj);
bool NP_EXPORT
_call(NPObject* npobj, NPIdentifier method, const NPVariant *args,
uint32_t argCount, NPVariant *result);
bool NP_EXPORT
_evaluate(NPP npp, NPObject* npobj, NPString *script, NPVariant *result);
bool NP_EXPORT
_getproperty(NPObject* npobj, NPIdentifier property, NPVariant *result);
bool NP_EXPORT
_setproperty(NPObject* npobj, NPIdentifier property, const NPVariant *value);
bool NP_EXPORT
_removeproperty(NPObject* npobj, NPIdentifier property);
bool NP_EXPORT
_hasproperty(NPObject* npobj, NPIdentifier propertyName);
bool NP_EXPORT
_hasmethod(NPObject* npobj, NPIdentifier methodName);
void NP_EXPORT
_releasevariantvalue(NPVariant *variant);
void NP_EXPORT
_setexception(NPObject* npobj, const NPUTF8 *message);
PR_END_EXTERN_C
#endif // ns4xPlugin_h__

View File

@ -48,6 +48,8 @@
#include "nsPluginSafety.h"
#include "nsPluginLogging.h"
#include "nsJSNPRuntime.h"
#ifdef XP_OS2
#include "nsILegacyPluginWrapperOS2.h"
#endif
@ -760,7 +762,8 @@ nsInstanceStream::~nsInstanceStream()
///////////////////////////////////////////////////////////////////////////////
NS_IMPL_ISUPPORTS2(ns4xPluginInstance, nsIPluginInstance, nsIScriptablePlugin)
NS_IMPL_ISUPPORTS3(ns4xPluginInstance, nsIPluginInstance, nsIScriptablePlugin,
nsINPRuntimePlugin)
///////////////////////////////////////////////////////////////////////////////
@ -915,6 +918,8 @@ NS_IMETHODIMP ns4xPluginInstance::Stop(void)
mStarted = PR_FALSE;
nsJSNPRuntime::OnPluginDestroy(&fNPP);
if(error != NPERR_NO_ERROR)
return NS_ERROR_FAILURE;
else
@ -1512,6 +1517,9 @@ NS_IMETHODIMP ns4xPluginInstance::GetScriptablePeer(void * *aScriptablePeer)
return GetValueInternal(NPPVpluginScriptableInstance, aScriptablePeer);
}
PR_BEGIN_EXTERN_C
void _releaseobject(NPObject *obj);
PR_END_EXTERN_C
////////////////////////////////////////////////////////////////////////
/* readonly attribute nsIIDPtr scriptableInterface; */
@ -1523,3 +1531,20 @@ NS_IMETHODIMP ns4xPluginInstance::GetScriptableInterface(nsIID * *aScriptableInt
*aScriptableInterface = nsnull;
return GetValueInternal(NPPVpluginScriptableIID, (void*)aScriptableInterface);
}
JSObject *
ns4xPluginInstance::GetJSObject(JSContext *cx)
{
JSObject *obj = nsnull;
NPObject *npobj = nsnull;
nsresult rv = GetValueInternal(NPPVpluginScriptableNPObject, &npobj);
if (NS_SUCCEEDED(rv) && npobj) {
obj = nsNPObjWrapper::GetNewOrUsed(&fNPP, cx, npobj);
_releaseobject(npobj);
}
return obj;
}

View File

@ -1,4 +1,4 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -54,6 +54,7 @@
#include "nsIPluginInstancePeer.h"
#include "nsIPluginTagInfo2.h"
#include "nsIScriptablePlugin.h"
#include "nsINPRuntimePlugin.h"
#include "npupp.h"
#ifdef OJI
@ -73,15 +74,16 @@ class ns4xPluginStreamListener;
struct nsInstanceStream
{
nsInstanceStream *mNext;
ns4xPluginStreamListener *mPluginStreamListener;
nsInstanceStream *mNext;
ns4xPluginStreamListener *mPluginStreamListener;
nsInstanceStream();
~nsInstanceStream();
nsInstanceStream();
~nsInstanceStream();
};
class ns4xPluginInstance : public nsIPluginInstance,
public nsIScriptablePlugin
public nsIScriptablePlugin,
public nsINPRuntimePlugin
{
public:
@ -159,6 +161,8 @@ public:
// cache this 4.x plugin like an XPCOM plugin
nsresult SetCached(PRBool aCache) { mCached = aCache; return NS_OK; };
virtual JSObject *GetJSObject(JSContext *cx);
protected:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,93 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsJSNPRuntime_h__
#define nsJSNPRuntime_h__
#include "nscore.h"
#include "jsapi.h"
#include "npapi.h"
#include "npruntime.h"
#include "pldhash.h"
class nsJSNPRuntime
{
public:
static void OnPluginDestroy(NPP npp);
};
class nsJSObjWrapper : public NPObject
{
public:
static NPObject *GetNewOrUsed(NPP npp, JSContext *cx, JSObject *obj);
protected:
nsJSObjWrapper();
~nsJSObjWrapper();
static NPObject * NP_Allocate();
static void NP_Deallocate(NPObject *obj);
static void NP_Invalidate(NPObject *obj);
static bool NP_HasMethod(NPObject *, NPIdentifier identifier);
static bool NP_Invoke(NPObject *obj, NPIdentifier method,
const NPVariant *args, uint32_t argCount,
NPVariant *result);
static bool NP_HasProperty(NPObject * obj, NPIdentifier property);
static bool NP_GetProperty(NPObject *obj, NPIdentifier property,
NPVariant *result);
static bool NP_SetProperty(NPObject *obj, NPIdentifier property,
const NPVariant *value);
static bool NP_RemoveProperty(NPObject *obj, NPIdentifier property);
public:
JSObject *mJSObj;
JSContext *mCx;
NPP mNpp;
static NPClass sJSObjWrapperNPClass;
};
class nsNPObjWrapper
{
public:
static JSObject *GetNewOrUsed(NPP npp, JSContext *cx, NPObject *npobj);
};
bool
JSValToNPVariant(NPP npp, JSContext *cx, jsval val, NPVariant *variant);
#endif // nsJSNPRuntime_h__

View File

@ -1,134 +0,0 @@
?do_GetService@@YA?BVnsGetServiceByCID@@ABUnsID@@PAI@Z ; 566
?GetCallbacks@ns4xPluginInstance@@QAEIPAPBU_NPPluginFuncs@@@Z ; 281
?GetURL@nsPluginStreamInfo@@UAGIPAPBD@Z ; 281
?GetNPP@ns4xPluginInstance@@QAEIPAPAU_NPP@@@Z ; 281
?IsStarted@ns4xPluginInstance@@QAEHXZ ; 281
?GetLastModified@nsPluginStreamInfo@@UAGIPAI@Z ; 280
?SetURL@nsPluginStreamInfo@@QAEXPBD@Z ; 280
?OnDataAvailable@nsPluginStreamListenerPeer@@UAGIPAVnsIRequest@@PAVnsISupports@@PAVnsIInputStream@@II@Z ; 278
?OnDataAvailable@ns4xPluginStreamListener@@UAGIPAVnsIPluginStreamInfo@@PAVnsIInputStream@@I@Z ; 278
?new_str@@YAPADPBD@Z ; 252
?OnDataAvailable@nsPluginCacheListener@@UAGIPAVnsIRequest@@PAVnsISupports@@PAVnsIInputStream@@II@Z ; 57
?IsPluginFile@nsPluginsDir@@QAEHABVnsFileSpec@@@Z ; 22
?LoadPlugins@nsPluginHostImpl@@UAGIXZ ; 21
?AddRef@ns4xPluginStreamListener@@UAGKXZ ; 18
?AddRef@nsPluginHostImpl@@UAGKXZ ; 15
??0nsPluginFile@@QAE@ABVnsFileSpec@@@Z ; 15
??1nsPluginFile@@UAE@XZ ; 15
?GetPluginCount@nsPluginHostImpl@@UAGIPAI@Z ; 15
?GetPluginInfo@nsPluginFile@@QAEIAAUnsPluginInfo@@@Z ; 14
??1nsPluginTag@@QAE@XZ ; 14
??0nsPluginTag@@QAE@PAUnsPluginInfo@@@Z ; 14
?FreePluginInfo@nsPluginFile@@QAEIAAUnsPluginInfo@@@Z ; 14
?Release@nsPluginHostImpl@@UAGKXZ ; 13
?AddRef@ns4xPluginInstance@@UAGKXZ ; 13
?Release@ns4xPluginInstance@@UAGKXZ ; 11
?QueryInterface@nsPluginHostImpl@@UAGIABUnsID@@PAPAX@Z ; 9
?GetLength@DOMPluginImpl@@UAGIPAI@Z ; 9
?GetName@DOMPluginImpl@@UAGIAAVnsAString@@@Z ; 9
??0nsPluginTag@@QAE@PAV0@@Z ; 6
?Item@DOMPluginImpl@@UAGIIPAPAVnsIDOMMimeType@@@Z ; 4
?AddRef@nsPluginInstancePeerImpl@@UAGKXZ ; 4
?SetWindow@ns4xPluginInstance@@UAGIPAUnsPluginWindow@@@Z ; 4
?Release@ns4xPlugin@@UAGKXZ ; 4
?Release@nsPluginInstancePeerImpl@@UAGKXZ ; 4
??0DOMMimeTypeImpl@@QAE@PAVnsPluginTag@@I@Z ; 4
?do_GetService@@YA?BVnsGetServiceByContractID@@PBDPAI@Z ; 3
?RegisterPluginMimeTypesWithLayout@nsPluginHostImpl@@AAEIPAVnsPluginTag@@PAVnsIComponentManager@@PAVnsIFile@@@Z ; 3
?GetValue@ns4xPluginInstance@@UAGIW4nsPluginInstanceVariable@@PAX@Z ; 3
?Release@nsPluginStreamListenerPeer@@UAGKXZ ; 2
?QueryInterface@nsPluginInstancePeerImpl@@UAGIABUnsID@@PAPAX@Z ; 2
?GetType@DOMMimeTypeImpl@@UAGIAAVnsAString@@@Z ; 2
?IsPluginEnabledForType@nsPluginHostImpl@@UAGIPBD@Z ; 2
?NS_OpenURI@@YAIPAPAVnsIChannel@@PAVnsIURI@@PAVnsIIOService@@PAVnsILoadGroup@@PAVnsIInterfaceRequestor@@I@Z ; 2
?GetPlugins@nsPluginHostImpl@@UAGIIQAPAVnsIDOMPlugin@@@Z ; 2
?Release@ns4xPluginStreamListener@@UAGKXZ ; 2
?CleanUnloadedLibraries@nsPluginHostImpl@@AAEXXZ ; 2
?assign_assuming_AddRef@nsCOMPtr_base@@IAEXPAVnsISupports@@@Z ; 2
??0nsPluginsDir@@QAE@G@Z ; 2
?do_GetIOService@@YA?BVnsGetServiceByCID@@PAI@Z ; 2
?ScanPluginsDirectory@nsPluginHostImpl@@AAEIAAVnsPluginsDir@@PAVnsIComponentManager@@PAVnsIFile@@H@Z ; 2
?SetContentType@nsPluginStreamInfo@@QAEXQBD@Z ; 2
??1nsPluginsDir@@UAE@XZ ; 2
?QueryInterface@ns4xPluginStreamListener@@UAGIABUnsID@@PAPAX@Z ; 2
??0?$nsCOMPtr@VnsIPlugin@@@@QAE@ABV0@@Z ; 2
?Init@nsPluginHostImpl@@UAGIXZ ; 2
?NS_OpenURI@@YAIPAVnsIStreamListener@@PAVnsISupports@@PAVnsIURI@@PAVnsIIOService@@PAVnsILoadGroup@@PAVnsIInterfaceRequestor@@I@Z ; 2
?GetDescription@DOMPluginImpl@@UAGIAAVnsAString@@@Z ; 2
??_GnsPluginInstancePeerImpl@@UAEPAXI@Z ; 1
?GetMode@nsPluginInstancePeerImpl@@UAGIPAW4nsPluginMode@@@Z ; 1
?IsLastInstance@nsActivePluginList@@QAEHPAUnsActivePlugin@@@Z ; 1
?Shutdown@ns4xPlugin@@UAGIXZ ; 1
??1nsPluginCacheListener@@UAE@XZ ; 1
??_GnsPluginStreamListenerPeer@@UAEPAXI@Z ; 1
??2PluginViewerImpl@@SAPAXI@Z ; 1
?QueryInterface@ns4xPluginInstance@@UAGIABUnsID@@PAPAX@Z ; 1
?NewEmbededPluginStream@nsPluginHostImpl@@AAEIPAVnsIURI@@PAUnsIPluginInstanceOwner@@PAVnsIPluginInstance@@@Z ; 1
??_GnsPluginCacheListener@@UAEPAXI@Z ; 1
?Destroy@nsPluginHostImpl@@UAGIXZ ; 1
?OnStopRequest@nsPluginStreamListenerPeer@@UAGIPAVnsIRequest@@PAVnsISupports@@IPBG@Z ; 1
?OnStartRequest@nsPluginStreamListenerPeer@@UAGIPAVnsIRequest@@PAVnsISupports@@@Z ; 1
?find@nsActivePluginList@@QAEPAUnsActivePlugin@@PAVnsIPluginInstance@@@Z ; 1
?CreatePlugin@ns4xPlugin@@SAIPAVnsIServiceManager@@PBDPAUPRLibrary@@PAPAVnsIPlugin@@@Z ; 1
?OnStopBinding@ns4xPluginStreamListener@@UAGIPAVnsIPluginStreamInfo@@I@Z ; 1
?SetUpStreamListener@nsPluginStreamListenerPeer@@AAEIPAVnsIRequest@@PAVnsIURI@@@Z ; 1
?OnStopRequest@nsPluginCacheListener@@UAGIPAVnsIRequest@@PAVnsISupports@@IPBG@Z ; 1
?SetLastModified@nsPluginStreamInfo@@QAEXI@Z ; 1
?AddInstanceToActiveList@nsPluginHostImpl@@AAEXV?$nsCOMPtr@VnsIPlugin@@@@PAVnsIPluginInstance@@PAVnsIURI@@H@Z ; 1
??0nsPluginCacheListener@@QAE@PAVnsPluginStreamListenerPeer@@@Z ; 1
?GetLength@nsPluginStreamInfo@@UAGIPAI@Z ; 1
??_Ens4xPluginInstance@@UAEPAXI@Z ; 1
?findStopped@nsActivePluginList@@QAEPAUnsActivePlugin@@PAD@Z ; 1
??0nsPluginStreamInfo@@QAE@XZ ; 1
?OnStartBinding@ns4xPluginStreamListener@@UAGIPAVnsIPluginStreamInfo@@@Z ; 1
?remove@nsActivePluginList@@QAEHPAUnsActivePlugin@@PAH@Z ; 1
?GetStreamType@ns4xPluginStreamListener@@UAGIPAW4nsPluginStreamType@@@Z ; 1
?StopPluginInstance@nsPluginHostImpl@@UAGIPAVnsIPluginInstance@@@Z ; 1
?InitializeEmbeded@nsPluginStreamListenerPeer@@QAEIPAVnsIURI@@PAVnsIPluginInstance@@PAUnsIPluginInstanceOwner@@PAUnsIPluginHost@@@Z ; 1
?GetMIMEType@nsPluginInstancePeerImpl@@UAGIPAPBD@Z ; 1
??_Ens4xPluginStreamListener@@UAEPAXI@Z ; 1
?GetAttributes@nsPluginInstancePeerImpl@@UAGIAAGAAPBQBD1@Z ; 1
?Observe@nsPluginHostImpl@@UAGIPAVnsISupports@@PBG1@Z ; 1
?NewStream@ns4xPluginInstance@@UAGIPAPAVnsIPluginStreamListener@@@Z ; 1
?OnFileAvailable@ns4xPluginStreamListener@@UAGIPAVnsIPluginStreamInfo@@PBD@Z ; 1
?LoadXPCOMPlugins@nsPluginHostImpl@@AAEIPAVnsIComponentManager@@PAVnsIFile@@@Z ; 1
??1ns4xPluginStreamListener@@UAE@XZ ; 1
?Release@PluginListener@@UAGKXZ ; 1
_NSGetModule ; 1
?LoadPlugin@nsPluginFile@@QAEIAAPAUPRLibrary@@@Z ; 1
?SetSeekable@nsPluginStreamInfo@@QAEXH@Z ; 1
?GetPeer@ns4xPluginInstance@@UAGIPAPAVnsIPluginInstancePeer@@@Z ; 1
?Initialize@nsPluginInstancePeerImpl@@QAEIPAUnsIPluginInstanceOwner@@QBD@Z ; 1
??1nsPluginInstancePeerImpl@@UAE@XZ ; 1
??0nsPluginInstancePeerImpl@@QAE@XZ ; 1
?InitializePlugin@ns4xPluginInstance@@IAEIPAVnsIPluginInstancePeer@@@Z ; 1
?InstantiateEmbededPlugin@nsPluginHostImpl@@UAGIPBDPAVnsIURI@@PAUnsIPluginInstanceOwner@@@Z ; 1
??0ns4xPluginStreamListener@@QAE@PAVnsIPluginInstance@@PAX@Z ; 1
??0ns4xPluginInstance@@QAE@PAU_NPPluginFuncs@@PAUPRLibrary@@@Z ; 1
?IsSeekable@nsPluginStreamInfo@@UAGIPAH@Z ; 1
?SetUpCache@nsPluginStreamListenerPeer@@AAEIPAVnsIURI@@@Z ; 1
?OnStartRequest@nsPluginCacheListener@@UAGIPAVnsIRequest@@PAVnsISupports@@@Z ; 1
?Initialize@ns4xPluginInstance@@UAGIPAVnsIPluginInstancePeer@@@Z ; 1
?Stop@ns4xPluginInstance@@UAGIXZ ; 1
?CreateInstance@ns4xPlugin@@UAGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 1
?OnFileAvailable@nsPluginStreamListenerPeer@@QAEIPBD@Z ; 1
??0nsActivePluginList@@QAE@XZ ; 1
?SetUpPluginInstance@nsPluginHostImpl@@UAGIPBDPAVnsIURI@@PAUnsIPluginInstanceOwner@@@Z ; 1
?FindStoppedPluginForURL@nsPluginHostImpl@@AAEIPAVnsIURI@@PAUnsIPluginInstanceOwner@@@Z ; 1
?SetLength@nsPluginStreamInfo@@QAEXI@Z ; 1
?GetContentType@nsPluginStreamInfo@@UAGIPAPBD@Z ; 1
??1ns4xPluginInstance@@UAE@XZ ; 1
?add@nsActivePluginList@@QAEHPAUnsActivePlugin@@@Z ; 1
?Start@ns4xPluginInstance@@UAGIXZ ; 1
?FindPluginEnabledForType@nsPluginHostImpl@@AAEIPBDAAPAVnsPluginTag@@@Z ; 1
??0ns4xPlugin@@QAE@PAU_NPPluginFuncs@@PAUPRLibrary@@P6GFXZPAVnsIServiceManager@@@Z ; 1
?Create@nsPluginHostImpl@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 1
??0nsActivePlugin@@QAE@V?$nsCOMPtr@VnsIPlugin@@@@PAVnsIPluginInstance@@PADH@Z ; 1
??0nsPluginHostImpl@@QAE@XZ ; 1
??1nsPluginStreamListenerPeer@@UAE@XZ ; 1
?GetPluginFactory@nsPluginHostImpl@@UAGIPBDPAPAVnsIPlugin@@@Z ; 1
?ReleaseStatics@ns4xPlugin@@SAXXZ ; 1
?CheckClassInitialized@ns4xPlugin@@KAXXZ ; 1
?shut@nsActivePluginList@@QAEXXZ ; 1
??1nsActivePlugin@@QAE@XZ ; 1
??0nsPluginStreamListenerPeer@@QAE@XZ ; 1