зеркало из https://github.com/mozilla/gecko-dev.git
Make |foo instanceof XOW| work as expected. bug 396849, r+sr=jst
This commit is contained in:
Родитель
f486de3a54
Коммит
c2be3e74a0
|
@ -85,6 +85,9 @@ JS_STATIC_DLL_CALLBACK(JSBool)
|
||||||
XPC_XOW_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
|
XPC_XOW_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
|
||||||
jsval *rval);
|
jsval *rval);
|
||||||
|
|
||||||
|
JS_STATIC_DLL_CALLBACK(JSBool)
|
||||||
|
XPC_XOW_HasInstance(JSContext *cx, JSObject *obj, jsval v, JSBool *bp);
|
||||||
|
|
||||||
JS_STATIC_DLL_CALLBACK(JSBool)
|
JS_STATIC_DLL_CALLBACK(JSBool)
|
||||||
XPC_XOW_Equality(JSContext *cx, JSObject *obj, jsval v, JSBool *bp);
|
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,
|
XPC_XOW_Convert, XPC_XOW_Finalize,
|
||||||
nsnull, XPC_XOW_CheckAccess,
|
nsnull, XPC_XOW_CheckAccess,
|
||||||
XPC_XOW_Call, XPC_XOW_Construct,
|
XPC_XOW_Call, XPC_XOW_Construct,
|
||||||
nsnull, nsnull,
|
nsnull, XPC_XOW_HasInstance,
|
||||||
nsnull, nsnull
|
nsnull, nsnull
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -919,6 +922,40 @@ XPC_XOW_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
|
||||||
return XPC_XOW_RewrapIfNeeded(cx, callee, rval);
|
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)
|
JS_STATIC_DLL_CALLBACK(JSBool)
|
||||||
XPC_XOW_Equality(JSContext *cx, JSObject *obj, jsval v, JSBool *bp)
|
XPC_XOW_Equality(JSContext *cx, JSObject *obj, jsval v, JSBool *bp)
|
||||||
{
|
{
|
||||||
|
|
Загрузка…
Ссылка в новой задаче