diff --git a/js/src/xpconnect/src/XPCWrapper.h b/js/src/xpconnect/src/XPCWrapper.h index 8b077cb679a..756b88161d1 100644 --- a/js/src/xpconnect/src/XPCWrapper.h +++ b/js/src/xpconnect/src/XPCWrapper.h @@ -215,15 +215,6 @@ public: return JS_TRUE; } - static JSBool IsSecurityWrapper(JSObject *wrapper) - { - JSClass *clasp = STOBJ_GET_CLASS(wrapper); - return clasp == &sXPC_COW_JSClass.base || - clasp == &sXPC_SJOW_JSClass.base || - clasp == &sXPC_SOW_JSClass.base || - clasp == &sXPC_XOW_JSClass.base; - } - /** * Given an arbitrary object, Unwrap will return the wrapped object if the * passed-in object is a wrapper that Unwrap knows about *and* the diff --git a/js/src/xpconnect/src/xpcconvert.cpp b/js/src/xpconnect/src/xpcconvert.cpp index e1db5deefa3..40d247a4764 100644 --- a/js/src/xpconnect/src/xpcconvert.cpp +++ b/js/src/xpconnect/src/xpcconvert.cpp @@ -149,6 +149,24 @@ XPCConvert::IsMethodReflectable(const XPTMethodDescriptor& info) /***************************************************************************/ +// static +JSBool +XPCConvert::GetISupportsFromJSObject(JSObject* obj, nsISupports** iface) +{ + JSClass* jsclass = STOBJ_GET_CLASS(obj); + NS_ASSERTION(jsclass, "obj has no class"); + if(jsclass && + (jsclass->flags & JSCLASS_HAS_PRIVATE) && + (jsclass->flags & JSCLASS_PRIVATE_IS_NSISUPPORTS)) + { + *iface = (nsISupports*) xpc_GetJSPrivate(obj); + return JS_TRUE; + } + return JS_FALSE; +} + +/***************************************************************************/ + static void FinalizeXPCOMUCString(JSContext *cx, JSString *str) { @@ -1441,39 +1459,32 @@ XPCConvert::JSObject2NativeInterface(XPCCallContext& ccx, // wrappedNative or other wise has 'nsISupportness'. // This allows wrapJSAggregatedToNative to work. - // If we're looking at a security wrapper, see now if we're allowed to - // pass it to C++. If we are, then fall through to the code below. If - // we aren't, throw an exception eagerly. - JSObject* inner = nsnull; - if(XPCWrapper::IsSecurityWrapper(src)) - { - inner = XPCWrapper::Unwrap(cx, src); - if(!inner) - { - if(pErr) - *pErr = NS_ERROR_XPC_SECURITY_MANAGER_VETO; - return JS_FALSE; - } - } - // Is this really a native xpcom object with a wrapper? XPCWrappedNative* wrappedNative = - XPCWrappedNative::GetWrappedNativeOfJSObject(cx, - inner - ? inner - : src); + XPCWrappedNative::GetWrappedNativeOfJSObject(cx, src); if(wrappedNative) { iface = wrappedNative->GetIdentityObject(); return NS_SUCCEEDED(iface->QueryInterface(*iid, dest)); } // else... - + // XXX E4X breaks the world. Don't try wrapping E4X objects! // This hack can be removed (or changed accordingly) when the // DOM <-> E4X bindings are complete, see bug 270553 if(JS_TypeOfValue(cx, OBJECT_TO_JSVAL(src)) == JSTYPE_XML) return JS_FALSE; + + // Does the JSObject have 'nsISupportness'? + // XXX hmm, I wonder if this matters anymore with no + // oldstyle DOM objects around. + if(GetISupportsFromJSObject(src, &iface)) + { + if(iface) + return NS_SUCCEEDED(iface->QueryInterface(*iid, dest)); + + return JS_FALSE; + } } // else... diff --git a/js/src/xpconnect/src/xpcprivate.h b/js/src/xpconnect/src/xpcprivate.h index 9c2fad0d342..6636cee429f 100644 --- a/js/src/xpconnect/src/xpcprivate.h +++ b/js/src/xpconnect/src/xpcprivate.h @@ -3037,6 +3037,7 @@ public: const nsID* iid, nsISupports* aOuter, nsresult* pErr); + static JSBool GetISupportsFromJSObject(JSObject* obj, nsISupports** iface); /** * Convert a native array into a jsval. diff --git a/js/src/xpconnect/src/xpcquickstubs.cpp b/js/src/xpconnect/src/xpcquickstubs.cpp index ec4e6014ab8..710789c87bc 100644 --- a/js/src/xpconnect/src/xpcquickstubs.cpp +++ b/js/src/xpconnect/src/xpcquickstubs.cpp @@ -839,13 +839,6 @@ xpc_qsUnwrapThisImpl(JSContext *cx, jsval *vp, XPCLazyCallContext *lccx) { - if(XPCWrapper::IsSecurityWrapper(obj)) - { - obj = XPCWrapper::Unwrap(cx, obj); - if(!obj) - return xpc_qsThrow(cx, NS_ERROR_XPC_SECURITY_MANAGER_VETO); - } - JSObject *cur = obj; XPCWrappedNativeTearOff *tearoff; XPCWrappedNative *wrapper = @@ -934,17 +927,9 @@ xpc_qsUnwrapArgImpl(JSContext *cx, return NS_OK; } - JSObject *inner = nsnull; - if(XPCWrapper::IsSecurityWrapper(src)) - { - inner = XPCWrapper::Unwrap(cx, src); - if(!inner) - return NS_ERROR_XPC_SECURITY_MANAGER_VETO; - } - // From XPCConvert::JSObject2NativeInterface XPCWrappedNative* wrappedNative = - XPCWrappedNative::GetWrappedNativeOfJSObject(cx, inner ? inner : src); + XPCWrappedNative::GetWrappedNativeOfJSObject(cx, src); nsISupports *iface; if(wrappedNative) { @@ -966,6 +951,21 @@ xpc_qsUnwrapArgImpl(JSContext *cx, return NS_ERROR_XPC_BAD_CONVERT_JS; } + // Does the JSObject have 'nsISupportness'? + // XXX hmm, I wonder if this matters anymore with no + // oldstyle DOM objects around. + if(XPCConvert::GetISupportsFromJSObject(src, &iface)) + { + if(!iface || NS_FAILED(iface->QueryInterface(iid, ppArg))) + { + *ppArgRef = nsnull; + return NS_ERROR_XPC_BAD_CONVERT_JS; + } + + *ppArgRef = static_cast(*ppArg); + return NS_OK; + } + // Create the ccx needed for quick stubs. XPCCallContext ccx(JS_CALLER, cx); if(!ccx.IsValid()) diff --git a/js/src/xpconnect/tests/mochitest/Makefile.in b/js/src/xpconnect/tests/mochitest/Makefile.in index 30804909601..9e6d1e84d4c 100644 --- a/js/src/xpconnect/tests/mochitest/Makefile.in +++ b/js/src/xpconnect/tests/mochitest/Makefile.in @@ -64,7 +64,6 @@ _TEST_FILES = bug500931_helper.html \ test_bug500691.html \ test_bug502959.html \ test_bug503926.html \ - test_bug505915.html \ test_bug517163.html \ $(NULL) diff --git a/js/src/xpconnect/tests/mochitest/test_bug505915.html b/js/src/xpconnect/tests/mochitest/test_bug505915.html deleted file mode 100644 index cfba3d001c1..00000000000 --- a/js/src/xpconnect/tests/mochitest/test_bug505915.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - Test for Bug 505915 - - - - - -Mozilla Bug 505915 -

- -
-
-
- - - - -