From bf45df1be231b277bcfef4fa1744ba2b72db74b8 Mon Sep 17 00:00:00 2001 From: "mrbkap%gmail.com" Date: Thu, 6 Mar 2008 19:58:28 +0000 Subject: [PATCH] Propagate getters and setters onto the inner object. bug 420585, r+sr=jst git-svn-id: svn://10.0.0.236/trunk@247223 18797224-902f-48f8-a5cc-f745e15eee43 --- .../xpconnect/src/XPCCrossOriginWrapper.cpp | 2 +- .../xpconnect/src/XPCSafeJSObjectWrapper.cpp | 2 +- mozilla/js/src/xpconnect/src/XPCWrapper.cpp | 60 ++++++++++++++----- mozilla/js/src/xpconnect/src/XPCWrapper.h | 3 +- 4 files changed, 50 insertions(+), 17 deletions(-) diff --git a/mozilla/js/src/xpconnect/src/XPCCrossOriginWrapper.cpp b/mozilla/js/src/xpconnect/src/XPCCrossOriginWrapper.cpp index 56fe5a2e5b0..08810107a45 100644 --- a/mozilla/js/src/xpconnect/src/XPCCrossOriginWrapper.cpp +++ b/mozilla/js/src/xpconnect/src/XPCCrossOriginWrapper.cpp @@ -561,7 +561,7 @@ XPC_XOW_AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) } // Same origin, pass this request along. - return XPCWrapper::AddProperty(cx, wrappedObj, id, vp); + return XPCWrapper::AddProperty(cx, obj, wrappedObj, id, vp); } JS_STATIC_DLL_CALLBACK(JSBool) diff --git a/mozilla/js/src/xpconnect/src/XPCSafeJSObjectWrapper.cpp b/mozilla/js/src/xpconnect/src/XPCSafeJSObjectWrapper.cpp index 92ceb3e7f40..a93f7899106 100644 --- a/mozilla/js/src/xpconnect/src/XPCSafeJSObjectWrapper.cpp +++ b/mozilla/js/src/xpconnect/src/XPCSafeJSObjectWrapper.cpp @@ -496,7 +496,7 @@ XPC_SJOW_AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) return JS_FALSE; } - return XPCWrapper::AddProperty(cx, unsafeObj, id, vp); + return XPCWrapper::AddProperty(cx, obj, unsafeObj, id, vp); } JS_STATIC_DLL_CALLBACK(JSBool) diff --git a/mozilla/js/src/xpconnect/src/XPCWrapper.cpp b/mozilla/js/src/xpconnect/src/XPCWrapper.cpp index d41ea6bf825..63369a2bf77 100644 --- a/mozilla/js/src/xpconnect/src/XPCWrapper.cpp +++ b/mozilla/js/src/xpconnect/src/XPCWrapper.cpp @@ -188,23 +188,56 @@ XPCWrapper::CreateIteratorObj(JSContext *cx, JSObject *tempWrapper, // static JSBool -XPCWrapper::AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) +XPCWrapper::AddProperty(JSContext *cx, JSObject *wrapperObj, + JSObject *innerObj, jsval id, jsval *vp) { - if (JSVAL_IS_STRING(id)) { - JSString *str = JSVAL_TO_STRING(id); - jschar *chars = ::JS_GetStringChars(str); - size_t length = ::JS_GetStringLength(str); - - return ::JS_DefineUCProperty(cx, obj, chars, length, *vp, nsnull, - nsnull, JSPROP_ENUMERATE); + jsid interned_id; + if (!::JS_ValueToId(cx, id, &interned_id)) { + return JS_FALSE; } - if (!JSVAL_IS_INT(id)) { - return ThrowException(NS_ERROR_NOT_IMPLEMENTED, cx); + JSProperty *prop; + JSObject *wrapperObjp; + if (!OBJ_LOOKUP_PROPERTY(cx, wrapperObj, interned_id, &wrapperObjp, &prop)) { + return JS_FALSE; } - return ::JS_DefineElement(cx, obj, JSVAL_TO_INT(id), *vp, nsnull, - nsnull, JSPROP_ENUMERATE); + NS_ASSERTION(prop && OBJ_IS_NATIVE(wrapperObjp), + "What weird wrapper are we using?"); + + JSBool isXOW = (STOBJ_GET_CLASS(wrapperObj) == &sXPC_XOW_JSClass.base); + uintN attrs = JSPROP_ENUMERATE; + JSPropertyOp getter = nsnull; + JSPropertyOp setter = nsnull; + jsval v; + if (isXOW) { + JSScopeProperty *sprop = reinterpret_cast(prop); + + attrs = sprop->attrs; + if (attrs & JSPROP_GETTER) { + getter = sprop->getter; + } + if (attrs & JSPROP_SETTER) { + setter = sprop->setter; + } + + if (SPROP_HAS_VALID_SLOT(sprop, OBJ_SCOPE(wrapperObjp))) { + v = OBJ_GET_SLOT(cx, wrapperObjp, sprop->slot); + } + } + + OBJ_DROP_PROPERTY(cx, wrapperObjp, prop); + + const uintN interesting_attrs = isXOW + ? (JSPROP_ENUMERATE | + JSPROP_READONLY | + JSPROP_PERMANENT | + JSPROP_SHARED | + JSPROP_GETTER | + JSPROP_SETTER) + : JSPROP_ENUMERATE; + return OBJ_DEFINE_PROPERTY(cx, innerObj, interned_id, v, getter, + setter, (attrs & interesting_attrs), nsnull); } // static @@ -313,8 +346,7 @@ XPCWrapper::NewResolve(JSContext *cx, JSObject *wrapperObj, setter = sprop->setter; } - if ((preserveVal || isXOW) && - SPROP_HAS_VALID_SLOT(sprop, OBJ_SCOPE(innerObjp))) { + if (preserveVal && SPROP_HAS_VALID_SLOT(sprop, OBJ_SCOPE(innerObjp))) { v = OBJ_GET_SLOT(cx, innerObjp, sprop->slot); } } diff --git a/mozilla/js/src/xpconnect/src/XPCWrapper.h b/mozilla/js/src/xpconnect/src/XPCWrapper.h index 17be98bb665..19363df3964 100644 --- a/mozilla/js/src/xpconnect/src/XPCWrapper.h +++ b/mozilla/js/src/xpconnect/src/XPCWrapper.h @@ -258,7 +258,8 @@ public: /** * Called for the common part of adding a property to obj. */ - static JSBool AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp); + static JSBool AddProperty(JSContext *cx, JSObject *wrapperObj, + JSObject *innerObj, jsval id, jsval *vp); /** * Called for the common part of deleting a property from obj.