Make |foo instanceof XOW| work as expected. bug 396849, r+sr=jst

This commit is contained in:
mrbkap@gmail.com 2007-12-18 13:06:44 -08:00
Родитель f486de3a54
Коммит c2be3e74a0
1 изменённых файлов: 38 добавлений и 1 удалений

Просмотреть файл

@ -85,6 +85,9 @@ JS_STATIC_DLL_CALLBACK(JSBool)
XPC_XOW_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
jsval *rval);
JS_STATIC_DLL_CALLBACK(JSBool)
XPC_XOW_HasInstance(JSContext *cx, JSObject *obj, jsval v, JSBool *bp);
JS_STATIC_DLL_CALLBACK(JSBool)
XPC_XOW_Equality(JSContext *cx, JSObject *obj, jsval v, JSBool *bp);
@ -102,7 +105,7 @@ JSExtendedClass sXPC_XOW_JSClass = {
XPC_XOW_Convert, XPC_XOW_Finalize,
nsnull, XPC_XOW_CheckAccess,
XPC_XOW_Call, XPC_XOW_Construct,
nsnull, nsnull,
nsnull, XPC_XOW_HasInstance,
nsnull, nsnull
},
@ -919,6 +922,40 @@ XPC_XOW_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
return XPC_XOW_RewrapIfNeeded(cx, callee, rval);
}
JS_STATIC_DLL_CALLBACK(JSBool)
XPC_XOW_HasInstance(JSContext *cx, JSObject *obj, jsval v, JSBool *bp)
{
JSObject *iface = GetWrappedObject(cx, obj);
nsresult rv = IsWrapperSameOrigin(cx, iface);
if (NS_FAILED(rv)) {
if (rv == NS_ERROR_DOM_PROP_ACCESS_DENIED) {
// Don't do this test across origins.
return ThrowException(rv, cx);
}
return JS_FALSE;
}
JSClass *clasp = JS_GET_CLASS(cx, iface);
*bp = JS_FALSE;
if (!clasp->hasInstance) {
return JS_TRUE;
}
// Prematurely unwrap the left hand side.
if (!JSVAL_IS_PRIMITIVE(v)) {
JSObject *test = JSVAL_TO_OBJECT(v);
// GetWrappedObject does an instanceof check.
test = GetWrappedObject(cx, test);
if (test) {
v = OBJECT_TO_JSVAL(test);
}
}
return clasp->hasInstance(cx, iface, v, bp);
}
JS_STATIC_DLL_CALLBACK(JSBool)
XPC_XOW_Equality(JSContext *cx, JSObject *obj, jsval v, JSBool *bp)
{