Bug 761695 - Put Proxy and DOM expandos on the expando object, rather than the holder. r=peterv

This commit is contained in:
Bobby Holley 2012-10-05 18:59:24 +02:00
Родитель 54f0bae85b
Коммит 3e2bc99f16
2 изменённых файлов: 40 добавлений и 88 удалений

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

@ -54,10 +54,9 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=758415
window.gWinC = document.getElementById('frameC').contentWindow;
// Test expando sharing with a JSM for different types of Xrays.
// Note that we don't yet support it for nodelists and new bindings.
testJSM(XPCNativeWrapper(gWinC.wrappedJSObject.targetWN), is);
testJSM(XPCNativeWrapper(gWinC.wrappedJSObject.targetNodeList), todo_is);
testJSM(XPCNativeWrapper(gWinC.wrappedJSObject.targetXHR), todo_is);
testJSM(XPCNativeWrapper(gWinC.wrappedJSObject.targetNodeList), is);
testJSM(XPCNativeWrapper(gWinC.wrappedJSObject.targetXHR), is);
// Make sure sandboxes never share expandos with anyone else.
testSandbox(XPCNativeWrapper(gWinB.wrappedJSObject.targetWN));

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

@ -148,6 +148,14 @@ public:
MOZ_NOT_REACHED("Call trap currently implemented only for XPCWNs");
}
// Only XPCWrappedNativeXrayTraits needs this hook.
static bool defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
JSPropertyDescriptor *desc, bool *defined)
{
*defined = false;
return true;
}
virtual void preserveWrapper(JSObject *target) = 0;
JSObject* getExpandoObject(JSContext *cx, JSObject *target,
@ -184,8 +192,7 @@ public:
JSObject *holder, jsid id, bool set,
JSPropertyDescriptor *desc);
static bool defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
JSPropertyDescriptor *desc);
static bool delete_(JSContext *cx, JSObject *wrapper, jsid id, bool *bp);
JSPropertyDescriptor *desc, bool *defined);
static bool enumerateNames(JSContext *cx, JSObject *wrapper, unsigned flags,
JS::AutoIdVector &props);
static bool call(JSContext *cx, JSObject *wrapper, unsigned argc, Value *vp);
@ -224,9 +231,6 @@ public:
virtual bool resolveOwnProperty(JSContext *cx, js::Wrapper &jsWrapper, JSObject *wrapper,
JSObject *holder, jsid id, bool set,
JSPropertyDescriptor *desc);
static bool defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
JSPropertyDescriptor *desc);
static bool delete_(JSContext *cx, JSObject *wrapper, jsid id, bool *bp);
static bool enumerateNames(JSContext *cx, JSObject *wrapper, unsigned flags,
JS::AutoIdVector &props);
@ -259,9 +263,6 @@ public:
virtual bool resolveOwnProperty(JSContext *cx, js::Wrapper &jsWrapper, JSObject *wrapper,
JSObject *holder, jsid id, bool set,
JSPropertyDescriptor *desc);
static bool defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
JSPropertyDescriptor *desc);
static bool delete_(JSContext *cx, JSObject *wrapper, jsid id, bool *bp);
static bool enumerateNames(JSContext *cx, JSObject *wrapper, unsigned flags,
JS::AutoIdVector &props);
@ -1076,8 +1077,9 @@ XPCWrappedNativeXrayTraits::resolveOwnProperty(JSContext *cx, js::Wrapper &jsWra
bool
XPCWrappedNativeXrayTraits::defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
PropertyDescriptor *desc)
PropertyDescriptor *desc, bool *defined)
{
*defined = false;
JSObject *holder = singleton.ensureHolder(cx, wrapper);
if (isResolving(cx, holder, id)) {
if (!(desc->attrs & (JSPROP_GETTER | JSPROP_SETTER))) {
@ -1087,34 +1089,10 @@ XPCWrappedNativeXrayTraits::defineProperty(JSContext *cx, JSObject *wrapper, jsi
desc->setter = holder_set;
}
*defined = true;
return JS_DefinePropertyById(cx, holder, id, desc->value, desc->getter, desc->setter,
desc->attrs);
}
// We're placing an expando. The expando objects live in the target
// compartment, so we need to enter it.
JSObject *target = getTargetObject(wrapper);
JSAutoCompartment ac(cx, target);
// Grab the relevant expando object.
JSObject *expandoObject = singleton.ensureExpandoObject(cx, wrapper, target);
if (!expandoObject)
return false;
// Wrap the property descriptor for the target compartment.
PropertyDescriptor wrappedDesc = *desc;
if (!JS_WrapPropertyDescriptor(cx, &wrappedDesc))
return false;
return JS_DefinePropertyById(cx, expandoObject, id, wrappedDesc.value,
wrappedDesc.getter, wrappedDesc.setter,
wrappedDesc.attrs);
}
bool
XPCWrappedNativeXrayTraits::delete_(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
{
// For us, *bp was already set to the appropriate value in the caller.
return true;
}
@ -1235,32 +1213,6 @@ ProxyXrayTraits::resolveOwnProperty(JSContext *cx, js::Wrapper &jsWrapper, JSObj
return ok;
}
bool
ProxyXrayTraits::defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
PropertyDescriptor *desc)
{
JSObject *holder = singleton.ensureHolder(cx, wrapper);
if (!holder)
return false;
return JS_DefinePropertyById(cx, holder, id, desc->value, desc->getter, desc->setter,
desc->attrs);
}
bool
ProxyXrayTraits::delete_(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
{
JSObject *obj = getTargetObject(wrapper);
if (!js::GetProxyHandler(obj)->delete_(cx, wrapper, id, bp))
return false;
JSObject *holder;
if (*bp && (holder = singleton.getHolder(wrapper)))
JS_DeletePropertyById(cx, holder, id);
return true;
}
bool
ProxyXrayTraits::enumerateNames(JSContext *cx, JSObject *wrapper, unsigned flags,
JS::AutoIdVector &props)
@ -1326,27 +1278,6 @@ DOMXrayTraits::resolveOwnProperty(JSContext *cx, js::Wrapper &jsWrapper, JSObjec
return true;
}
bool
DOMXrayTraits::defineProperty(JSContext *cx, JSObject *wrapper, jsid id, PropertyDescriptor *desc)
{
JSObject *holder = singleton.ensureHolder(cx, wrapper);
if (!holder)
return false;
return JS_DefinePropertyById(cx, holder, id, desc->value, desc->getter, desc->setter,
desc->attrs);
}
bool
DOMXrayTraits::delete_(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
{
JSObject *holder;
if ((holder = singleton.getHolder(wrapper)))
JS_DeletePropertyById(cx, holder, id);
return true;
}
bool
DOMXrayTraits::enumerateNames(JSContext *cx, JSObject *wrapper, unsigned flags,
JS::AutoIdVector &props)
@ -1660,7 +1591,31 @@ XrayWrapper<Base, Traits>::defineProperty(JSContext *cx, JSObject *wrapper, jsid
if (existing_desc.obj && (existing_desc.attrs & JSPROP_PERMANENT))
return true; // silently ignore attempt to overwrite native property
return Traits::defineProperty(cx, wrapper, id, desc);
bool defined = false;
if (!Traits::defineProperty(cx, wrapper, id, desc, &defined))
return false;
if (defined)
return true;
// We're placing an expando. The expando objects live in the target
// compartment, so we need to enter it.
JSObject *target = Traits::singleton.getTargetObject(wrapper);
JSAutoCompartment ac(cx, target);
// Grab the relevant expando object.
JSObject *expandoObject = Traits::singleton.ensureExpandoObject(cx, wrapper,
target);
if (!expandoObject)
return false;
// Wrap the property descriptor for the target compartment.
PropertyDescriptor wrappedDesc = *desc;
if (!JS_WrapPropertyDescriptor(cx, &wrappedDesc))
return false;
return JS_DefinePropertyById(cx, expandoObject, id, wrappedDesc.value,
wrappedDesc.getter, wrappedDesc.setter,
wrappedDesc.attrs);
}
template <typename Base, typename Traits>
@ -1703,9 +1658,7 @@ XrayWrapper<Base, Traits>::delete_(JSContext *cx, JSObject *wrapper, jsid id, bo
}
}
*bp = !!b;
// Temporarily call through for Proxies and DOM objects.
return Traits::delete_(cx, wrapper, id, bp);
return true;
}
template <typename Base, typename Traits>