From 3fb149d9d73289ba0d68c50d7fdf8c88394c07ae Mon Sep 17 00:00:00 2001 From: Bobby Holley Date: Fri, 21 Feb 2014 15:55:31 -0800 Subject: [PATCH] Bug 975277 - Clean up the XPCWN XrayHolder a bit. r=gabor --- js/xpconnect/wrappers/AccessCheck.cpp | 2 +- js/xpconnect/wrappers/WrapperFactory.cpp | 2 +- js/xpconnect/wrappers/XrayWrapper.cpp | 31 +++++++++++++++--------- js/xpconnect/wrappers/XrayWrapper.h | 2 +- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/js/xpconnect/wrappers/AccessCheck.cpp b/js/xpconnect/wrappers/AccessCheck.cpp index c1e48a6e3920..5363afadc7bf 100644 --- a/js/xpconnect/wrappers/AccessCheck.cpp +++ b/js/xpconnect/wrappers/AccessCheck.cpp @@ -205,7 +205,7 @@ AccessCheck::isCrossOriginAccessPermitted(JSContext *cx, JSObject *wrapperArg, j const char *name; const js::Class *clasp = js::GetObjectClass(obj); - MOZ_ASSERT(Jsvalify(clasp) != &XrayUtils::HolderClass, "shouldn't have a holder here"); + MOZ_ASSERT(!XrayUtils::IsXPCWNHolderClass(Jsvalify(clasp)), "shouldn't have a holder here"); if (clasp->ext.innerObject) name = "Window"; else diff --git a/js/xpconnect/wrappers/WrapperFactory.cpp b/js/xpconnect/wrappers/WrapperFactory.cpp index fba833c9ab39..ebad2e187638 100644 --- a/js/xpconnect/wrappers/WrapperFactory.cpp +++ b/js/xpconnect/wrappers/WrapperFactory.cpp @@ -374,7 +374,7 @@ WrapperFactory::Rewrap(JSContext *cx, HandleObject existing, HandleObject obj, GetProxyHandler(obj) == &XrayWaiver || js::GetObjectClass(obj)->ext.innerObject, "wrapped object passed to rewrap"); - MOZ_ASSERT(JS_GetClass(obj) != &XrayUtils::HolderClass, "trying to wrap a holder"); + MOZ_ASSERT(!XrayUtils::IsXPCWNHolderClass(JS_GetClass(obj)), "trying to wrap a holder"); MOZ_ASSERT(!js::IsInnerObject(obj)); // We sometimes end up here after nsContentUtils has been shut down but before // XPConnect has been shut down, so check the context stack the roundabout way. diff --git a/js/xpconnect/wrappers/XrayWrapper.cpp b/js/xpconnect/wrappers/XrayWrapper.cpp index 79bfd7f5e105..9aa45ac2c0bd 100644 --- a/js/xpconnect/wrappers/XrayWrapper.cpp +++ b/js/xpconnect/wrappers/XrayWrapper.cpp @@ -37,18 +37,6 @@ using js::CheckedUnwrap; namespace xpc { -static const uint32_t JSSLOT_RESOLVING = 0; - -namespace XrayUtils { - -const JSClass HolderClass = { - "NativePropertyHolder", - JSCLASS_HAS_RESERVED_SLOTS(2), - JS_PropertyStub, JS_DeletePropertyStub, holder_get, holder_set, - JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub -}; -} - using namespace XrayUtils; XrayType @@ -65,6 +53,7 @@ GetXrayType(JSObject *obj) return NotXray; } +const uint32_t JSSLOT_RESOLVING = 0; ResolvingId::ResolvingId(JSContext *cx, HandleObject wrapper, HandleId id) : mId(id), mHolder(cx, getHolderObject(wrapper)), @@ -231,9 +220,16 @@ public: virtual JSObject* createHolder(JSContext *cx, JSObject *wrapper); + static const JSClass HolderClass; static XPCWrappedNativeXrayTraits singleton; }; +const JSClass XPCWrappedNativeXrayTraits::HolderClass = { + "NativePropertyHolder", JSCLASS_HAS_RESERVED_SLOTS(2), + JS_PropertyStub, JS_DeletePropertyStub, holder_get, holder_set, + JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub +}; + class DOMXrayTraits : public XrayTraits { public: @@ -535,6 +531,17 @@ XPCWrappedNativeXrayTraits::isResolving(JSContext *cx, JSObject *holder, return cur->isResolving(id); } +namespace XrayUtils { + +bool +IsXPCWNHolderClass(const JSClass *clasp) +{ + return clasp == &XPCWrappedNativeXrayTraits::HolderClass; +} + +} + + // Some DOM objects have shared properties that don't have an explicit // getter/setter and rely on the class getter/setter. We install a // class getter/setter on the holder object to trigger them. diff --git a/js/xpconnect/wrappers/XrayWrapper.h b/js/xpconnect/wrappers/XrayWrapper.h index 9b1cee748232..3910aca5bf87 100644 --- a/js/xpconnect/wrappers/XrayWrapper.h +++ b/js/xpconnect/wrappers/XrayWrapper.h @@ -28,7 +28,7 @@ holder_set(JSContext *cx, JS::HandleObject holder, JS::HandleId id, bool strict, namespace XrayUtils { -extern const JSClass HolderClass; +bool IsXPCWNHolderClass(const JSClass *clasp); bool CloneExpandoChain(JSContext *cx, JSObject *src, JSObject *dst);