Fixing bug 257191. Adding NPN_InvokeDefault() and renaming NPN_Call() to NPN_Invoke() in the npruntime plugin scriptability API. Also fix a problem with property getters on plugin objects. r+sr=brendan@mozilla.org

git-svn-id: svn://10.0.0.236/trunk@161466 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
jst%mozilla.jstenback.com
2004-08-30 04:31:16 +00:00
parent f067094033
commit 7c3d6831bb
8 changed files with 199 additions and 39 deletions

View File

@@ -281,6 +281,10 @@ typedef bool (*NPHasMethodFunctionPtr)(NPObject *npobj, NPIdentifier name);
typedef bool (*NPInvokeFunctionPtr)(NPObject *npobj, NPIdentifier name,
const NPVariant *args, uint32_t argCount,
NPVariant *result);
typedef bool (*NPInvokeDefaultFunctionPtr)(NPObject *npobj,
const NPVariant *args,
uint32_t argCount,
NPVariant *result);
typedef bool (*NPHasPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name);
typedef bool (*NPGetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name,
NPVariant *result);
@@ -315,6 +319,7 @@ struct NPClass
NPInvalidateFunctionPtr invalidate;
NPHasMethodFunctionPtr hasMethod;
NPInvokeFunctionPtr invoke;
NPInvokeDefaultFunctionPtr invokeDefault;
NPHasPropertyFunctionPtr hasProperty;
NPGetPropertyFunctionPtr getProperty;
NPSetPropertyFunctionPtr setProperty;
@@ -363,8 +368,10 @@ void NPN_ReleaseObject(NPObject *npobj);
on which the plugin was initialized.
*/
bool NPN_Call(NPP npp, NPObject *npobj, NPIdentifier methodName,
const NPVariant *args, uint32_t argCount, NPVariant *result);
bool NPN_Invoke(NPP npp, NPObject *npobj, NPIdentifier methodName,
const NPVariant *args, uint32_t argCount, NPVariant *result);
bool NPN_InvokeDefault(NPP npp, NPObject *npobj, const NPVariant *args,
uint32_t argCount, NPVariant *result);
bool NPN_Evaluate(NPP npp, NPObject *npobj, NPString *script,
NPVariant *result);
bool NPN_GetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName,

View File

@@ -37,7 +37,7 @@
/*
* npupp.h $Revision: 3.18 $
* npupp.h $Revision: 3.19 $
* function call mecahnics needed by platform specific glue code.
*/
@@ -1300,13 +1300,13 @@ typedef void (* NP_LOADDS NPN_ReleaseObjectUPP)(NPObject *obj);
#endif
/* NPN_Call */
/* NPN_Invoke */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_CallUPP;
typedef UniversalProcPtr NPN_InvokeUPP;
enum {
uppNPN_CallProcInfo = kThinkCStackBased
uppNPN_InvokeProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NPP)))
| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(NPObject*)))
| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(NPIdentifier)))
@@ -1316,21 +1316,51 @@ enum {
| 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, ARG6) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_CallProcInfo, (ARG1), (ARG2), (ARG3), (ARG4), (ARG5), (ARG6))
#define NewNPN_InvokeProc(FUNC) \
(NPN_InvokeUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_InvokeProcInfo, GetCurrentArchitecture())
#define CallNPN_InvokeProc(FUNC, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_InvokeProcInfo, (ARG1), (ARG2), (ARG3), (ARG4), (ARG5), (ARG6))
#else
typedef bool (* NP_LOADDS NPN_CallUPP)(NPP npp, 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, ARG6) \
typedef bool (* NP_LOADDS NPN_InvokeUPP)(NPP npp, NPObject* obj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result);
#define NewNPN_InvokeProc(FUNC) \
((NPN_InvokeUPP) (FUNC))
#define CallNPN_InvokeProc(FUNC, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) \
(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4), (ARG5), (ARG6))
#endif
/* NPN_InvokeDefault */
#if _NPUPP_USE_UPP_
typedef UniversalProcPtr NPN_InvokeDefaultUPP;
enum {
uppNPN_InvokeDefaultProcInfo = kThinkCStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(NPP)))
| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(NPObject*)))
| STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(const NPVariant*)))
| STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(uint32_t)))
| STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(NPVariant*)))
| RESULT_SIZE(SIZE_CODE(sizeof(bool)))
};
#define NewNPN_InvokeDefaultProc(FUNC) \
(NPN_InvokeDefaultUPP) NewRoutineDescriptor((ProcPtr)(FUNC), uppNPN_InvokeDefaultProcInfo, GetCurrentArchitecture())
#define CallNPN_InvokeDefaultProc(FUNC, ARG1, ARG2, ARG3, ARG4, ARG5) \
(jref)CallUniversalProc((UniversalProcPtr)(FUNC), uppNPN_InvokeDefaultProcInfo, (ARG1), (ARG2), (ARG3), (ARG4), (ARG5))
#else
typedef bool (* NP_LOADDS NPN_InvokeDefaultUPP)(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result);
#define NewNPN_InvokeDefaultProc(FUNC) \
((NPN_InvokeDefaultUPP) (FUNC))
#define CallNPN_InvokeDefaultProc(FUNC, ARG1, ARG2, ARG3, ARG4, ARG5) \
(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4), (ARG5))
#endif
/* NPN_Evaluate */
#if _NPUPP_USE_UPP_
@@ -1620,7 +1650,8 @@ typedef struct _NPNetscapeFuncs {
NPN_CreateObjectUPP createobject;
NPN_RetainObjectUPP retainobject;
NPN_ReleaseObjectUPP releaseobject;
NPN_CallUPP call;
NPN_InvokeUPP invoke;
NPN_InvokeDefaultUPP invokeDefault;
NPN_EvaluateUPP evaluate;
NPN_GetPropertyUPP getproperty;
NPN_SetPropertyUPP setproperty;

View File

@@ -350,8 +350,11 @@ ns4xPlugin::CheckClassInitialized(void)
CALLBACKS.releaseobject =
NewNPN_ReleaseObjectProc(FP2TV(_releaseobject));
CALLBACKS.call =
NewNPN_CallProc(FP2TV(_call));
CALLBACKS.invoke =
NewNPN_InvokeProc(FP2TV(_invoke));
CALLBACKS.invokeDefault =
NewNPN_InvokeDefaultProc(FP2TV(_invokeDefault));
CALLBACKS.evaluate =
NewNPN_EvaluateProc(FP2TV(_evaluate));
@@ -1507,8 +1510,8 @@ _releaseobject(NPObject* npobj)
}
bool NP_EXPORT
_call(NPP npp, NPObject* npobj, NPIdentifier method, const NPVariant *args,
uint32_t argCount, NPVariant *result)
_invoke(NPP npp, NPObject* npobj, NPIdentifier method, const NPVariant *args,
uint32_t argCount, NPVariant *result)
{
if (!npp || !npobj || !npobj->_class || !npobj->_class->invoke)
return false;
@@ -1519,6 +1522,19 @@ _call(NPP npp, NPObject* npobj, NPIdentifier method, const NPVariant *args,
return npobj->_class->invoke(npobj, method, args, argCount, result);
}
bool NP_EXPORT
_invokeDefault(NPP npp, NPObject* npobj, const NPVariant *args,
uint32_t argCount, NPVariant *result)
{
if (!npp || !npobj || !npobj->_class || !npobj->_class->invokeDefault)
return false;
NPPExceptionAutoHolder nppExceptionHolder;
NPPAutoPusher nppPusher(npp);
return npobj->_class->invokeDefault(npobj, args, argCount, result);
}
bool NP_EXPORT
_evaluate(NPP npp, NPObject* npobj, NPString *script, NPVariant *result)
{

View File

@@ -216,8 +216,12 @@ void NP_EXPORT
_releaseobject(NPObject* npobj);
bool NP_EXPORT
_call(NPP npp, NPObject* npobj, NPIdentifier method, const NPVariant *args,
uint32_t argCount, NPVariant *result);
_invoke(NPP npp, NPObject* npobj, NPIdentifier method, const NPVariant *args,
uint32_t argCount, NPVariant *result);
bool NP_EXPORT
_invokeDefault(NPP npp, NPObject* npobj, const NPVariant *args,
uint32_t argCount, NPVariant *result);
bool NP_EXPORT
_evaluate(NPP npp, NPObject* npobj, NPString *script, NPVariant *result);

View File

@@ -96,6 +96,7 @@ NPClass nsJSObjWrapper::sJSObjWrapperNPClass =
nsJSObjWrapper::NP_Invalidate,
nsJSObjWrapper::NP_HasMethod,
nsJSObjWrapper::NP_Invoke,
nsJSObjWrapper::NP_InvokeDefault,
nsJSObjWrapper::NP_HasProperty,
nsJSObjWrapper::NP_GetProperty,
nsJSObjWrapper::NP_SetProperty,
@@ -121,13 +122,18 @@ NPObjWrapper_NewResolve(JSContext *cx, JSObject *obj, jsval id, uintN flags,
JS_STATIC_DLL_CALLBACK(void)
NPObjWrapper_Finalize(JSContext *cx, JSObject *obj);
JS_STATIC_DLL_CALLBACK(JSBool)
NPObjWrapper_Call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
jsval *rval);
static JSClass sNPObjectJSWrapperClass =
{
"NPObject JS wrapper class", JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE,
NPObjWrapper_AddProperty, NPObjWrapper_DelProperty,
NPObjWrapper_GetProperty, NPObjWrapper_SetProperty, JS_EnumerateStub,
(JSResolveOp)NPObjWrapper_NewResolve, JS_ConvertStub,
NPObjWrapper_Finalize, nsnull, nsnull, nsnull, nsnull, nsnull, nsnull
NPObjWrapper_Finalize, nsnull, nsnull, NPObjWrapper_Call, nsnull, nsnull,
nsnull
};
@@ -464,11 +470,9 @@ nsJSObjWrapper::NP_HasMethod(NPObject *npobj, NPIdentifier identifier)
::JS_ObjectIsFunction(cx, JSVAL_TO_OBJECT(v));
}
// static
bool
nsJSObjWrapper::NP_Invoke(NPObject *npobj, NPIdentifier identifier,
const NPVariant *args, uint32_t argCount,
NPVariant *result)
static bool
doInvoke(NPObject *npobj, NPIdentifier method, const NPVariant *args,
uint32_t argCount, NPVariant *result)
{
NPP npp = NPPStack::Peek();
JSContext *cx = GetJSContext(npp);
@@ -487,9 +491,13 @@ nsJSObjWrapper::NP_Invoke(NPObject *npobj, NPIdentifier identifier,
AutoCXPusher pusher(cx);
if (!GetProperty(cx, npjsobj->mJSObj, identifier, &fv) ||
::JS_TypeOfValue(cx, fv) != JSTYPE_FUNCTION) {
return PR_FALSE;
if ((jsval)method != JSVAL_VOID) {
if (!GetProperty(cx, npjsobj->mJSObj, method, &fv) ||
::JS_TypeOfValue(cx, fv) != JSTYPE_FUNCTION) {
return PR_FALSE;
}
} else {
fv = OBJECT_TO_JSVAL(npjsobj->mJSObj);
}
jsval jsargs_buf[8];
@@ -527,6 +535,27 @@ nsJSObjWrapper::NP_Invoke(NPObject *npobj, NPIdentifier identifier,
return ok == JS_TRUE;
}
// static
bool
nsJSObjWrapper::NP_Invoke(NPObject *npobj, NPIdentifier method,
const NPVariant *args, uint32_t argCount,
NPVariant *result)
{
if ((jsval)method == JSVAL_VOID) {
return PR_FALSE;
}
return doInvoke(npobj, method, args, argCount, result);
}
// static
bool
nsJSObjWrapper::NP_InvokeDefault(NPObject *npobj, const NPVariant *args,
uint32_t argCount, NPVariant *result)
{
return doInvoke(npobj, (NPIdentifier)JSVAL_VOID, args, argCount, result);
}
// static
bool
nsJSObjWrapper::NP_HasProperty(NPObject *npobj, NPIdentifier identifier)
@@ -982,11 +1011,6 @@ CallNPMethod(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
return JS_FALSE;
}
JSObject *funobj = JSVAL_TO_OBJECT(argv[-2]);
JSFunction *fun = (JSFunction *)::JS_GetPrivate(cx, funobj);
jsval method = STRING_TO_JSVAL(::JS_GetFunctionId(fun));
NPVariant npargs_buf[8];
NPVariant *npargs = npargs_buf;
@@ -1015,8 +1039,23 @@ CallNPMethod(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
NPVariant v;
VOID_TO_NPVARIANT(v);
JSBool ok = npobj->_class->invoke(npobj, (NPIdentifier)method, npargs, argc,
&v);
JSObject *funobj = JSVAL_TO_OBJECT(argv[-2]);
JSBool ok;
if (funobj != obj) {
// A obj.function() style call is made, get the method name from
// the function object.
JSFunction *fun = (JSFunction *)::JS_GetPrivate(cx, funobj);
jsval method = STRING_TO_JSVAL(::JS_GetFunctionId(fun));
ok = npobj->_class->invoke(npobj, (NPIdentifier)method, npargs, argc, &v);
} else {
// obj is a callable object that is being called, no method name
// available then. Invoke the default method.
ok = npobj->_class->invokeDefault(npobj, npargs, argc, &v);
}
// Release arguments.
for (i = 0; i < argc; ++i) {
@@ -1056,6 +1095,24 @@ NPObjWrapper_NewResolve(JSContext *cx, JSObject *obj, jsval id, uintN flags,
}
if (npobj->_class->hasProperty(npobj, (NPIdentifier)id)) {
JSBool ok;
if (JSVAL_IS_STRING(id)) {
JSString *str = JSVAL_TO_STRING(id);
ok = ::JS_DefineUCProperty(cx, obj, ::JS_GetStringChars(str),
::JS_GetStringLength(str), JSVAL_VOID, nsnull,
nsnull, JSPROP_ENUMERATE);
} else {
ok = ::JS_DefineElement(cx, obj, JSVAL_TO_INT(id), JSVAL_VOID, nsnull,
nsnull, JSPROP_ENUMERATE);
}
if (!ok) {
return JS_FALSE;
}
*objp = obj;
} else if (npobj->_class->hasMethod(npobj, (NPIdentifier)id)) {
JSString *str = nsnull;
@@ -1104,6 +1161,12 @@ NPObjWrapper_Finalize(JSContext *cx, JSObject *obj)
OnWrapperDestroyed();
}
JS_STATIC_DLL_CALLBACK(JSBool)
NPObjWrapper_Call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
jsval *rval)
{
return CallNPMethod(cx, JSVAL_TO_OBJECT(argv[-2]), argc, argv, rval);
}
class NPObjWrapperHashEntry : public PLDHashEntryHdr
{

View File

@@ -80,6 +80,8 @@ protected:
static bool NP_Invoke(NPObject *obj, NPIdentifier method,
const NPVariant *args, uint32_t argCount,
NPVariant *result);
static bool NP_InvokeDefault(NPObject *obj, 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);