Bug 826447 - Change all the proxy API signatures to take unsigned flags, rather than bool set, so that it's easier to find all tests of JSRESOLVE_ASSIGNING. r=bz

--HG--
extra : rebase_source : 3b88b411965087984d7973a90f8fa1b06457a6ce
This commit is contained in:
Jeff Walden 2013-01-03 15:31:36 -06:00
parent 1e64862110
commit a127013839
24 changed files with 191 additions and 199 deletions

View File

@ -611,15 +611,15 @@ GetNativePropertyHooks(JSContext *cx, JSObject *obj, DOMObjectType& type)
bool
XrayResolveOwnProperty(JSContext* cx, JSObject* wrapper, JSObject* obj, jsid id,
bool set, JSPropertyDescriptor* desc)
JSPropertyDescriptor* desc, unsigned flags)
{
DOMObjectType type;
const NativePropertyHooks *nativePropertyHooks =
GetNativePropertyHooks(cx, obj, type);
return type != eInstance || !nativePropertyHooks->mResolveOwnProperty ||
nativePropertyHooks->mResolveOwnProperty(cx, wrapper, obj, id, set,
desc);
nativePropertyHooks->mResolveOwnProperty(cx, wrapper, obj, id, desc,
flags);
}
static bool

View File

@ -1575,7 +1575,7 @@ AddStringToIDVector(JSContext* cx, JS::AutoIdVector& vector, const char* name)
*/
bool
XrayResolveOwnProperty(JSContext* cx, JSObject* wrapper, JSObject* obj,
jsid id, bool set, JSPropertyDescriptor* desc);
jsid id, JSPropertyDescriptor* desc, unsigned flags);
/**
* This resolves operations, attributes and constants of the interfaces for obj.

View File

@ -5599,13 +5599,13 @@ class CGResolveOwnProperty(CGAbstractMethod):
def __init__(self, descriptor):
args = [Argument('JSContext*', 'cx'), Argument('JSObject*', 'wrapper'),
Argument('JSObject*', 'obj'), Argument('jsid', 'id'),
Argument('bool', 'set'),
Argument('JSPropertyDescriptor*', 'desc')]
Argument('JSPropertyDescriptor*', 'desc'), Argument('unsigned', 'flags'),
]
CGAbstractMethod.__init__(self, descriptor, "ResolveOwnProperty", "bool", args)
def definition_body(self):
return """ // We rely on getOwnPropertyDescriptor not shadowing prototype properties by named
// properties. If that changes we'll need to filter here.
return js::GetProxyHandler(obj)->getOwnPropertyDescriptor(cx, wrapper, id, set, desc);
return js::GetProxyHandler(obj)->getOwnPropertyDescriptor(cx, wrapper, id, desc, flags);
"""
class CGEnumerateOwnProperties(CGAbstractMethod):
@ -5862,8 +5862,8 @@ class CGDOMJSProxyHandler_CGDOMJSProxyHandler(ClassConstructor):
class CGDOMJSProxyHandler_getOwnPropertyDescriptor(ClassMethod):
def __init__(self, descriptor):
args = [Argument('JSContext*', 'cx'), Argument('JSObject*', 'proxy'),
Argument('jsid', 'id'), Argument('bool', 'set'),
Argument('JSPropertyDescriptor*', 'desc')]
Argument('jsid', 'id'),
Argument('JSPropertyDescriptor*', 'desc'), Argument('unsigned', 'flags')]
ClassMethod.__init__(self, "getOwnPropertyDescriptor", "bool", args)
self.descriptor = descriptor
def getBody(self):
@ -5882,7 +5882,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(ClassMethod):
"}\n") % (self.descriptor.nativeType)
if indexedSetter or self.descriptor.operations['NamedSetter']:
setOrIndexedGet += "if (set) {\n"
setOrIndexedGet += "if (flags & JSRESOLVE_ASSIGNING) {\n"
if indexedSetter:
setOrIndexedGet += (" if (IsArrayIndex(index)) {\n")
if not 'IndexedCreator' in self.descriptor.operations:
@ -5912,7 +5912,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(ClassMethod):
"}")
setOrIndexedGet += "\n\n"
elif indexedGetter:
setOrIndexedGet += ("if (!set) {\n" +
setOrIndexedGet += ("if (!(flags & JSRESOLVE_ASSIGNING)) {\n" +
CGIndenter(CGGeneric(get)).define() +
"}\n\n")
@ -5924,7 +5924,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(ClassMethod):
# Once we start supporting OverrideBuiltins we need to make
# ResolveOwnProperty or EnumerateOwnProperties filter out named
# properties that shadow prototype properties.
condition = "!set && !HasPropertyOnPrototype(cx, proxy, this, id)"
condition = "!(flags & JSRESOLVE_ASSIGNING) && !HasPropertyOnPrototype(cx, proxy, this, id)"
if self.descriptor.supportsIndexedProperties():
condition = "!IsArrayIndex(index) && " + condition
namedGet = ("\n" +
@ -5936,7 +5936,6 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(ClassMethod):
return setOrIndexedGet + """JSObject* expando;
if (!xpc::WrapperFactory::IsXrayWrapper(proxy) && (expando = GetExpandoObject(proxy))) {
unsigned flags = (set ? JSRESOLVE_ASSIGNING : 0);
if (!JS_GetPropertyDescriptorById(cx, expando, id, flags, desc)) {
return false;
}

View File

@ -50,7 +50,7 @@ namespace dom {
typedef bool
(* ResolveOwnProperty)(JSContext* cx, JSObject* wrapper, JSObject* obj, jsid id,
bool set, JSPropertyDescriptor* desc);
JSPropertyDescriptor* desc, unsigned flags);
typedef bool
(* EnumerateOwnProperties)(JSContext* cx, JSObject* wrapper, JSObject* obj,

View File

@ -76,10 +76,10 @@ DOMProxyHandler::EnsureExpandoObject(JSContext* cx, JSObject* obj)
}
bool
DOMProxyHandler::getPropertyDescriptor(JSContext* cx, JSObject* proxy, jsid id, bool set,
JSPropertyDescriptor* desc)
DOMProxyHandler::getPropertyDescriptor(JSContext* cx, JSObject* proxy, jsid id,
JSPropertyDescriptor* desc, unsigned flags)
{
if (!getOwnPropertyDescriptor(cx, proxy, id, set, desc)) {
if (!getOwnPropertyDescriptor(cx, proxy, id, desc, flags)) {
return false;
}
if (desc->obj) {

View File

@ -6,12 +6,14 @@
#ifndef mozilla_dom_DOMJSProxyHandler_h
#define mozilla_dom_DOMJSProxyHandler_h
#include "mozilla/Attributes.h"
#include "mozilla/Likely.h"
#include "jsapi.h"
#include "jsfriendapi.h"
#include "jsproxy.h"
#include "xpcpublic.h"
#include "nsStringGlue.h"
#include "mozilla/Likely.h"
#define DOM_PROXY_OBJECT_SLOT js::JSSLOT_PROXY_PRIVATE
@ -34,14 +36,14 @@ public:
{
}
bool getPropertyDescriptor(JSContext* cx, JSObject* proxy, jsid id, bool set,
JSPropertyDescriptor* desc);
bool getPropertyDescriptor(JSContext* cx, JSObject* proxy, jsid id, JSPropertyDescriptor* desc,
unsigned flags) MOZ_OVERRIDE;
bool defineProperty(JSContext* cx, JSObject* proxy, jsid id,
JSPropertyDescriptor* desc);
bool delete_(JSContext* cx, JSObject* proxy, jsid id, bool* bp);
bool enumerate(JSContext* cx, JSObject* proxy, JS::AutoIdVector& props);
JSPropertyDescriptor* desc) MOZ_OVERRIDE;
bool delete_(JSContext* cx, JSObject* proxy, jsid id, bool* bp) MOZ_OVERRIDE;
bool enumerate(JSContext* cx, JSObject* proxy, JS::AutoIdVector& props) MOZ_OVERRIDE;
bool fix(JSContext* cx, JSObject* proxy, JS::Value* vp);
bool has(JSContext* cx, JSObject* proxy, jsid id, bool* bp);
bool has(JSContext* cx, JSObject* proxy, jsid id, bool* bp) MOZ_OVERRIDE;
using js::BaseProxyHandler::obj_toString;
static JSObject* GetExpandoObject(JSObject* obj)

View File

@ -446,7 +446,7 @@ obj_lookupGetter(JSContext *cx, unsigned argc, Value *vp)
// native. Handle proxies separately.
args.rval().setUndefined();
AutoPropertyDescriptorRooter desc(cx);
if (!Proxy::getPropertyDescriptor(cx, obj, id, false, &desc))
if (!Proxy::getPropertyDescriptor(cx, obj, id, &desc, 0))
return JS_FALSE;
if (desc.obj && (desc.attrs & JSPROP_GETTER) && desc.getter)
args.rval().set(CastAsObjectJsval(desc.getter));
@ -482,7 +482,7 @@ obj_lookupSetter(JSContext *cx, unsigned argc, Value *vp)
// native. Handle proxies separately.
args.rval().setUndefined();
AutoPropertyDescriptorRooter desc(cx);
if (!Proxy::getPropertyDescriptor(cx, obj, id, false, &desc))
if (!Proxy::getPropertyDescriptor(cx, obj, id, &desc, 0))
return JS_FALSE;
if (desc.obj && (desc.attrs & JSPROP_SETTER) && desc.setter)
args.rval().set(CastAsObjectJsval(desc.setter));

View File

@ -3574,7 +3574,7 @@ LookupResult(JSContext *cx, HandleObject obj, HandleObject obj2, jsid id,
return js_GetDenseArrayElementValue(cx, obj2, id, vp);
if (obj2->isProxy()) {
AutoPropertyDescriptorRooter desc(cx);
if (!Proxy::getPropertyDescriptor(cx, obj2, id, false, &desc))
if (!Proxy::getPropertyDescriptor(cx, obj2, id, &desc, 0))
return false;
if (!(desc.attrs & JSPROP_SHARED)) {
*vp = desc.value;
@ -4058,8 +4058,8 @@ GetPropertyDescriptorById(JSContext *cx, HandleObject obj, HandleId id, unsigned
if (obj2->isProxy()) {
JSAutoResolveFlags rf(cx, flags);
return own
? Proxy::getOwnPropertyDescriptor(cx, obj2, id, false, desc)
: Proxy::getPropertyDescriptor(cx, obj2, id, false, desc);
? Proxy::getOwnPropertyDescriptor(cx, obj2, id, desc, 0)
: Proxy::getPropertyDescriptor(cx, obj2, id, desc, 0);
}
if (!JSObject::getGenericAttributes(cx, obj2, id, &desc->attrs))
return false;

View File

@ -257,7 +257,7 @@ js::GetOwnPropertyDescriptor(JSContext *cx, HandleObject obj, HandleId id,
{
// FIXME: Call TrapGetOwnProperty directly once ScriptedIndirectProxies is removed
if (obj->isProxy())
return Proxy::getOwnPropertyDescriptor(cx, obj, id, false, desc);
return Proxy::getOwnPropertyDescriptor(cx, obj, id, desc, 0);
RootedObject pobj(cx);
RootedShape shape(cx);
@ -3610,7 +3610,7 @@ baseops::SetPropertyHelper(JSContext *cx, HandleObject obj, HandleObject receive
if (!pobj->isNative()) {
if (pobj->isProxy()) {
AutoPropertyDescriptorRooter pd(cx);
if (!Proxy::getPropertyDescriptor(cx, pobj, id, true, &pd))
if (!Proxy::getPropertyDescriptor(cx, pobj, id, &pd, JSRESOLVE_ASSIGNING))
return false;
if ((pd.attrs & (JSPROP_SHARED | JSPROP_SHADOWABLE)) == JSPROP_SHARED) {

View File

@ -63,7 +63,7 @@ bool
BaseProxyHandler::has(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
{
AutoPropertyDescriptorRooter desc(cx);
if (!getPropertyDescriptor(cx, proxy, id, false, &desc))
if (!getPropertyDescriptor(cx, proxy, id, &desc, 0))
return false;
*bp = !!desc.obj;
return true;
@ -73,7 +73,7 @@ bool
BaseProxyHandler::hasOwn(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
{
AutoPropertyDescriptorRooter desc(cx);
if (!getOwnPropertyDescriptor(cx, proxy, id, false, &desc))
if (!getOwnPropertyDescriptor(cx, proxy, id, &desc, 0))
return false;
*bp = !!desc.obj;
return true;
@ -86,7 +86,7 @@ BaseProxyHandler::get(JSContext *cx, JSObject *proxy, JSObject *receiver_, jsid
RootedId id(cx, id_);
AutoPropertyDescriptorRooter desc(cx);
if (!getPropertyDescriptor(cx, proxy, id, false, &desc))
if (!getPropertyDescriptor(cx, proxy, id, &desc, 0))
return false;
if (!desc.obj) {
vp->setUndefined();
@ -143,7 +143,7 @@ BaseProxyHandler::set(JSContext *cx, JSObject *proxy_, JSObject *receiver_, jsid
RootedId id(cx, id_);
AutoPropertyDescriptorRooter desc(cx);
if (!getOwnPropertyDescriptor(cx, proxy, id, true, &desc))
if (!getOwnPropertyDescriptor(cx, proxy, id, &desc, JSRESOLVE_ASSIGNING))
return false;
/* The control-flow here differs from ::get() because of the fall-through case below. */
if (desc.obj) {
@ -173,7 +173,7 @@ BaseProxyHandler::set(JSContext *cx, JSObject *proxy_, JSObject *receiver_, jsid
desc.value = *vp;
return defineProperty(cx, receiver, id, &desc);
}
if (!getPropertyDescriptor(cx, proxy, id, true, &desc))
if (!getPropertyDescriptor(cx, proxy, id, &desc, JSRESOLVE_ASSIGNING))
return false;
if (desc.obj) {
// Check for read-only properties.
@ -226,7 +226,7 @@ BaseProxyHandler::keys(JSContext *cx, JSObject *proxy, AutoIdVector &props)
for (size_t j = 0, len = props.length(); j < len; j++) {
JS_ASSERT(i <= j);
jsid id = props[j];
if (!getOwnPropertyDescriptor(cx, proxy, id, false, &desc))
if (!getOwnPropertyDescriptor(cx, proxy, id, &desc, 0))
return false;
if (desc.obj && (desc.attrs & JSPROP_ENUMERATE))
props[i++] = id;
@ -375,8 +375,7 @@ BaseProxyHandler::getPrototypeOf(JSContext *cx, JSObject *proxy, JSObject **prot
bool
DirectProxyHandler::getPropertyDescriptor(JSContext *cx, JSObject *proxy,
jsid id, bool set,
PropertyDescriptor *desc)
jsid id, PropertyDescriptor *desc, unsigned flags)
{
RootedObject target(cx, GetProxyTargetObject(proxy));
return JS_GetPropertyDescriptorById(cx, target, id, 0, desc);
@ -389,9 +388,7 @@ GetOwnPropertyDescriptor(JSContext *cx, HandleObject obj, jsid id, unsigned flag
// If obj is a proxy, we can do better than just guessing. This is
// important for certain types of wrappers that wrap other wrappers.
if (obj->isProxy())
return Proxy::getOwnPropertyDescriptor(cx, obj, id,
flags & JSRESOLVE_ASSIGNING,
desc);
return Proxy::getOwnPropertyDescriptor(cx, obj, id, desc, flags);
if (!JS_GetPropertyDescriptorById(cx, obj, id, flags, desc))
return false;
@ -402,8 +399,7 @@ GetOwnPropertyDescriptor(JSContext *cx, HandleObject obj, jsid id, unsigned flag
bool
DirectProxyHandler::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy,
jsid id, bool set,
PropertyDescriptor *desc)
jsid id, PropertyDescriptor *desc, unsigned flags)
{
RootedObject target(cx, GetProxyTargetObject(proxy));
return GetOwnPropertyDescriptor(cx, target, id, 0, desc);
@ -723,10 +719,10 @@ class ScriptedIndirectProxyHandler : public BaseProxyHandler {
virtual ~ScriptedIndirectProxyHandler();
/* ES5 Harmony fundamental proxy traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE;
virtual bool defineProperty(JSContext *cx, JSObject *proxy, jsid id,
PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *proxy, AutoIdVector &props);
@ -785,8 +781,8 @@ GetIndirectProxyHandlerObject(JSObject *proxy)
}
bool
ScriptedIndirectProxyHandler::getPropertyDescriptor(JSContext *cx, JSObject *proxy_, jsid id_, bool set,
PropertyDescriptor *desc)
ScriptedIndirectProxyHandler::getPropertyDescriptor(JSContext *cx, JSObject *proxy_, jsid id_,
PropertyDescriptor *desc, unsigned flags)
{
RootedId id(cx, id_);
RootedObject proxy(cx, proxy_);
@ -800,8 +796,8 @@ ScriptedIndirectProxyHandler::getPropertyDescriptor(JSContext *cx, JSObject *pro
}
bool
ScriptedIndirectProxyHandler::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy_, jsid id_, bool set,
PropertyDescriptor *desc)
ScriptedIndirectProxyHandler::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy_, jsid id_,
PropertyDescriptor *desc, unsigned flags)
{
RootedId id(cx, id_);
RootedObject proxy(cx, proxy_);
@ -1002,10 +998,10 @@ class ScriptedDirectProxyHandler : public DirectProxyHandler {
virtual ~ScriptedDirectProxyHandler();
/* ES5 Harmony fundamental proxy traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE;
virtual bool defineProperty(JSContext *cx, JSObject *proxy, jsid id,
PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *proxy, AutoIdVector &props);
@ -1571,7 +1567,7 @@ ScriptedDirectProxyHandler::~ScriptedDirectProxyHandler()
// FIXME: Move to Proxy::getPropertyDescriptor once ScriptedIndirectProxy is removed
bool
ScriptedDirectProxyHandler::getPropertyDescriptor(JSContext *cx, JSObject *proxy_, jsid id_,
bool set, PropertyDescriptor *desc)
PropertyDescriptor *desc, unsigned flags)
{
JS_CHECK_RECURSION(cx, return false);
Rooted<JSObject*> proxy(cx, proxy_);
@ -1592,7 +1588,7 @@ ScriptedDirectProxyHandler::getPropertyDescriptor(JSContext *cx, JSObject *proxy
bool
ScriptedDirectProxyHandler::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy_, jsid id_,
bool set, PropertyDescriptor *desc)
PropertyDescriptor *desc, unsigned flags)
{
RootedObject proxy(cx, proxy_);
RootedId id(cx, id_);
@ -2197,16 +2193,16 @@ ScriptedDirectProxyHandler ScriptedDirectProxyHandler::singleton;
bool
Proxy::getPropertyDescriptor(JSContext *cx, JSObject *proxy_, jsid id_, bool set,
PropertyDescriptor *desc)
Proxy::getPropertyDescriptor(JSContext *cx, JSObject *proxy_, jsid id_, PropertyDescriptor *desc,
unsigned flags)
{
JS_CHECK_RECURSION(cx, return false);
RootedObject proxy(cx, proxy_);
RootedId id(cx, id_);
BaseProxyHandler *handler = GetProxyHandler(proxy);
if (!handler->hasPrototype())
return handler->getPropertyDescriptor(cx, proxy, id, set, desc);
if (!handler->getOwnPropertyDescriptor(cx, proxy, id, set, desc))
return handler->getPropertyDescriptor(cx, proxy, id, desc, flags);
if (!handler->getOwnPropertyDescriptor(cx, proxy, id, desc, flags))
return false;
if (desc->obj)
return true;
@ -2215,31 +2211,32 @@ Proxy::getPropertyDescriptor(JSContext *cx, JSObject *proxy_, jsid id_, bool set
}
bool
Proxy::getPropertyDescriptor(JSContext *cx, JSObject *proxy_, jsid id, bool set, Value *vp)
Proxy::getPropertyDescriptor(JSContext *cx, JSObject *proxy_, unsigned flags, jsid id, Value *vp)
{
JS_CHECK_RECURSION(cx, return false);
RootedObject proxy(cx, proxy_);
AutoPropertyDescriptorRooter desc(cx);
return Proxy::getPropertyDescriptor(cx, proxy, id, set, &desc) &&
return Proxy::getPropertyDescriptor(cx, proxy, id, &desc, flags) &&
NewPropertyDescriptorObject(cx, &desc, vp);
}
bool
Proxy::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy_, jsid id, bool set,
PropertyDescriptor *desc)
Proxy::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy_, jsid id, PropertyDescriptor *desc,
unsigned flags)
{
JS_CHECK_RECURSION(cx, return false);
RootedObject proxy(cx, proxy_);
return GetProxyHandler(proxy)->getOwnPropertyDescriptor(cx, proxy, id, set, desc);
return GetProxyHandler(proxy)->getOwnPropertyDescriptor(cx, proxy, id, desc, flags);
}
bool
Proxy::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy_, jsid id, bool set, Value *vp)
Proxy::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy_, unsigned flags, jsid id,
Value *vp)
{
JS_CHECK_RECURSION(cx, return false);
RootedObject proxy(cx, proxy_);
AutoPropertyDescriptorRooter desc(cx);
return Proxy::getOwnPropertyDescriptor(cx, proxy, id, set, &desc) &&
return Proxy::getOwnPropertyDescriptor(cx, proxy, id, &desc, flags) &&
NewPropertyDescriptorObject(cx, &desc, vp);
}
@ -2688,7 +2685,7 @@ static JSBool
proxy_GetGenericAttributes(JSContext *cx, HandleObject obj, HandleId id, unsigned *attrsp)
{
AutoPropertyDescriptorRooter desc(cx);
if (!Proxy::getOwnPropertyDescriptor(cx, obj, id, false, &desc))
if (!Proxy::getOwnPropertyDescriptor(cx, obj, id, &desc, 0))
return false;
*attrsp = desc.attrs;
return true;
@ -2722,7 +2719,7 @@ proxy_SetGenericAttributes(JSContext *cx, HandleObject obj, HandleId id, unsigne
{
/* Lookup the current property descriptor so we have setter/getter/value. */
AutoPropertyDescriptorRooter desc(cx);
if (!Proxy::getOwnPropertyDescriptor(cx, obj, id, true, &desc))
if (!Proxy::getOwnPropertyDescriptor(cx, obj, id, &desc, JSRESOLVE_ASSIGNING))
return false;
desc.attrs = (*attrsp & (~JSPROP_SHORTID));
return Proxy::defineProperty(cx, obj, id, &desc);

View File

@ -73,10 +73,9 @@ class JS_FRIEND_API(BaseProxyHandler) {
/* ES5 Harmony fundamental proxy traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
bool set, PropertyDescriptor *desc) = 0;
PropertyDescriptor *desc, unsigned flags) = 0;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy,
jsid id, bool set,
PropertyDescriptor *desc) = 0;
jsid id, PropertyDescriptor *desc, unsigned flags) = 0;
virtual bool defineProperty(JSContext *cx, JSObject *proxy, jsid id,
PropertyDescriptor *desc) = 0;
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *proxy,
@ -128,11 +127,10 @@ public:
/* ES5 Harmony fundamental proxy traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
bool set,
PropertyDescriptor *desc) MOZ_OVERRIDE;
PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy,
jsid id, bool set,
PropertyDescriptor *desc) MOZ_OVERRIDE;
jsid id, PropertyDescriptor *desc,
unsigned flags) MOZ_OVERRIDE;
virtual bool defineProperty(JSContext *cx, JSObject *proxy, jsid id,
PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *proxy,
@ -178,12 +176,13 @@ public:
class Proxy {
public:
/* ES5 Harmony fundamental proxy traps. */
static bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc);
static bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set, Value *vp);
static bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc);
static bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
static bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
PropertyDescriptor *desc, unsigned flags);
static bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, unsigned flags, jsid id,
Value *vp);
static bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
PropertyDescriptor *desc, unsigned flags);
static bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, unsigned flags, jsid id,
Value *vp);
static bool defineProperty(JSContext *cx, JSObject *proxy, jsid id, PropertyDescriptor *desc);
static bool defineProperty(JSContext *cx, JSObject *proxy, jsid id, const Value &v);

View File

@ -162,22 +162,20 @@ Wrapper::~Wrapper()
bool
Wrapper::getPropertyDescriptor(JSContext *cx, JSObject *wrapper,
jsid id, bool set,
PropertyDescriptor *desc)
jsid id, PropertyDescriptor *desc, unsigned flags)
{
JS_ASSERT(!hasPrototype()); // Should never be called when there's a prototype.
desc->obj = NULL; // default result if we refuse to perform this action
CHECKED(DirectProxyHandler::getPropertyDescriptor(cx, wrapper, id, set, desc),
set ? SET : GET);
CHECKED(DirectProxyHandler::getPropertyDescriptor(cx, wrapper, id, desc, flags),
(flags & JSRESOLVE_ASSIGNING) ? SET : GET);
}
bool
Wrapper::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper,
jsid id, bool set,
PropertyDescriptor *desc)
jsid id, PropertyDescriptor *desc, unsigned flags)
{
desc->obj = NULL; // default result if we refuse to perform this action
CHECKED(DirectProxyHandler::getOwnPropertyDescriptor(cx, wrapper, id, set, desc), GET);
CHECKED(DirectProxyHandler::getOwnPropertyDescriptor(cx, wrapper, id, desc, flags), GET);
}
bool
@ -417,21 +415,21 @@ CrossCompartmentWrapper::~CrossCompartmentWrapper()
bool
CrossCompartmentWrapper::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, PropertyDescriptor *desc)
PropertyDescriptor *desc, unsigned flags)
{
PIERCE(cx, wrapper, set ? SET : GET,
PIERCE(cx, wrapper, (flags & JSRESOLVE_ASSIGNING) ? SET : GET,
cx->compartment->wrapId(cx, &id),
Wrapper::getPropertyDescriptor(cx, wrapper, id, set, desc),
Wrapper::getPropertyDescriptor(cx, wrapper, id, desc, flags),
cx->compartment->wrap(cx, desc));
}
bool
CrossCompartmentWrapper::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, PropertyDescriptor *desc)
PropertyDescriptor *desc, unsigned flags)
{
PIERCE(cx, wrapper, set ? SET : GET,
PIERCE(cx, wrapper, (flags & JSRESOLVE_ASSIGNING) ? SET : GET,
cx->compartment->wrapId(cx, &id),
Wrapper::getOwnPropertyDescriptor(cx, wrapper, id, set, desc),
Wrapper::getOwnPropertyDescriptor(cx, wrapper, id, desc, flags),
cx->compartment->wrap(cx, desc));
}
@ -823,18 +821,16 @@ DeadObjectProxy::DeadObjectProxy()
}
bool
DeadObjectProxy::getPropertyDescriptor(JSContext *cx, JSObject *wrapper,
jsid id, bool set,
PropertyDescriptor *desc)
DeadObjectProxy::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
PropertyDescriptor *desc, unsigned flags)
{
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEAD_OBJECT);
return false;
}
bool
DeadObjectProxy::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper,
jsid id, bool set,
PropertyDescriptor *desc)
DeadObjectProxy::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
PropertyDescriptor *desc, unsigned flags)
{
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEAD_OBJECT);
return false;

View File

@ -82,11 +82,11 @@ class JS_FRIEND_API(Wrapper) : public DirectProxyHandler
/* ES5 Harmony fundamental wrapper traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper,
jsid id, bool set,
PropertyDescriptor *desc) MOZ_OVERRIDE;
jsid id, PropertyDescriptor *desc,
unsigned flags) MOZ_OVERRIDE;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper,
jsid id, bool set,
PropertyDescriptor *desc) MOZ_OVERRIDE;
jsid id, PropertyDescriptor *desc,
unsigned flags) MOZ_OVERRIDE;
virtual bool defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *wrapper,
@ -131,10 +131,10 @@ class JS_FRIEND_API(CrossCompartmentWrapper) : public Wrapper
virtual ~CrossCompartmentWrapper();
/* ES5 Harmony fundamental wrapper traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set,
PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set,
PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE;
virtual bool defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *wrapper, AutoIdVector &props) MOZ_OVERRIDE;
@ -207,10 +207,10 @@ class JS_FRIEND_API(DeadObjectProxy) : public BaseProxyHandler
explicit DeadObjectProxy();
/* ES5 Harmony fundamental wrapper traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set,
PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set,
PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE;
virtual bool defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *wrapper, AutoIdVector &props) MOZ_OVERRIDE;

View File

@ -2743,7 +2743,7 @@ CopyProperty(JSContext *cx, HandleObject obj, HandleObject referent, HandleId id
propFlags = shape->getFlags();
} else if (IsProxy(referent)) {
PropertyDescriptor desc;
if (!Proxy::getOwnPropertyDescriptor(cx, referent, id, false, &desc))
if (!Proxy::getOwnPropertyDescriptor(cx, referent, id, &desc, 0))
return false;
if (!desc.obj)
return true;

View File

@ -1316,14 +1316,14 @@ class DebugScopeProxy : public BaseProxyHandler
DebugScopeProxy() : BaseProxyHandler(&family) {}
bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc) MOZ_OVERRIDE
bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, PropertyDescriptor *desc,
unsigned flags) MOZ_OVERRIDE
{
return getOwnPropertyDescriptor(cx, proxy, id, set, desc);
return getOwnPropertyDescriptor(cx, proxy, id, desc, flags);
}
bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid idArg, bool set,
PropertyDescriptor *desc) MOZ_OVERRIDE
bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid idArg,
PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE
{
Rooted<DebugScopeObject*> debugScope(cx, &proxy->asDebugScope());
Rooted<ScopeObject*> scope(cx, &debugScope->scope());

View File

@ -3143,15 +3143,16 @@ XPC_WN_Helper_SetProperty(JSContext *cx, JSHandleObject obj, JSHandleId id, JSBo
bool
xpc::SandboxProxyHandler::getPropertyDescriptor(JSContext *cx, JSObject *proxy,
jsid id_, bool set,
PropertyDescriptor *desc)
jsid id_,
PropertyDescriptor *desc,
unsigned flags)
{
js::RootedObject obj(cx, wrappedObject(proxy));
js::RootedId id(cx, id_);
MOZ_ASSERT(js::GetObjectCompartment(obj) == js::GetObjectCompartment(proxy));
if (!JS_GetPropertyDescriptorById(cx, obj, id,
(set ? JSRESOLVE_ASSIGNING : 0), desc))
flags, desc))
return false;
if (!desc->obj)
@ -3191,10 +3192,11 @@ xpc::SandboxProxyHandler::getPropertyDescriptor(JSContext *cx, JSObject *proxy,
bool
xpc::SandboxProxyHandler::getOwnPropertyDescriptor(JSContext *cx,
JSObject *proxy,
jsid id, bool set,
PropertyDescriptor *desc)
jsid id,
PropertyDescriptor *desc,
unsigned flags)
{
if (!getPropertyDescriptor(cx, proxy, id, set, desc))
if (!getPropertyDescriptor(cx, proxy, id, desc, flags))
return false;
if (desc->obj != wrappedObject(proxy))

View File

@ -25,15 +25,15 @@ PropIsFromStandardPrototype(JSContext *cx, JSPropertyDescriptor *desc)
bool
ChromeObjectWrapper::getPropertyDescriptor(JSContext *cx, JSObject *wrapper,
jsid id, bool set,
js::PropertyDescriptor *desc)
jsid id, js::PropertyDescriptor *desc,
unsigned flags)
{
// First, try the lookup on the base wrapper. This can throw for various
// reasons, including sets (gets fail silently). There's nothing we can really
// do for sets, so we can conveniently propagate any exception we hit here.
desc->obj = NULL;
if (!ChromeObjectWrapperBase::getPropertyDescriptor(cx, wrapper, id,
set, desc)) {
desc, flags)) {
return false;
}
@ -46,8 +46,8 @@ ChromeObjectWrapper::getPropertyDescriptor(JSContext *cx, JSObject *wrapper,
// If we found something, were doing a set, or have no proto, we're done.
JSObject *wrapperProto;
if (!JS_GetPrototype(cx, wrapper, &wrapperProto))
return false;
if (desc->obj || set || !wrapperProto)
return false;
if (desc->obj || (flags & JSRESOLVE_ASSIGNING) || !wrapperProto)
return true;
// If not, try doing the lookup on the prototype.
@ -86,8 +86,8 @@ ChromeObjectWrapper::get(JSContext *cx, JSObject *wrapper, JSObject *receiver,
// this because the call signature of ::get doesn't give us any way to
// determine the object upon which the property was found.
JSPropertyDescriptor desc;
if (!ChromeObjectWrapperBase::getPropertyDescriptor(cx, wrapper, id, false,
&desc)) {
if (!ChromeObjectWrapperBase::getPropertyDescriptor(cx, wrapper, id, &desc,
0)) {
return false;
}

View File

@ -8,6 +8,8 @@
#ifndef __ChromeObjectWrapper_h__
#define __ChromeObjectWrapper_h__
#include "mozilla/Attributes.h"
#include "FilteringWrapper.h"
#include "AccessCheck.h"
@ -28,8 +30,8 @@ class ChromeObjectWrapper : public ChromeObjectWrapperBase
/* Custom traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper,
jsid id, bool set,
js::PropertyDescriptor *desc) MOZ_OVERRIDE;
jsid id, js::PropertyDescriptor *desc,
unsigned flags) MOZ_OVERRIDE;
virtual bool has(JSContext *cx, JSObject *wrapper, jsid id,
bool *bp) MOZ_OVERRIDE;
virtual bool get(JSContext *cx, JSObject *wrapper, JSObject *receiver,

View File

@ -61,9 +61,9 @@ FilterSetter(JSContext *cx, JSObject *wrapper, jsid id, js::PropertyDescriptor *
template <typename Base, typename Policy>
bool
FilteringWrapper<Base, Policy>::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, js::PropertyDescriptor *desc)
js::PropertyDescriptor *desc, unsigned flags)
{
if (!Base::getPropertyDescriptor(cx, wrapper, id, set, desc))
if (!Base::getPropertyDescriptor(cx, wrapper, id, desc, flags))
return false;
return FilterSetter<Policy>(cx, wrapper, id, desc);
}
@ -71,9 +71,10 @@ FilteringWrapper<Base, Policy>::getPropertyDescriptor(JSContext *cx, JSObject *w
template <typename Base, typename Policy>
bool
FilteringWrapper<Base, Policy>::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, js::PropertyDescriptor *desc)
js::PropertyDescriptor *desc,
unsigned flags)
{
if (!Base::getOwnPropertyDescriptor(cx, wrapper, id, set, desc))
if (!Base::getOwnPropertyDescriptor(cx, wrapper, id, desc, flags))
return false;
return FilterSetter<Policy>(cx, wrapper, id, desc);
}

View File

@ -19,8 +19,8 @@ class FilteringWrapper : public Base {
FilteringWrapper(unsigned flags);
virtual ~FilteringWrapper();
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set, js::PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set, js::PropertyDescriptor *desc) MOZ_OVERRIDE;
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, js::PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, js::PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE;
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *wrapper, js::AutoIdVector &props) MOZ_OVERRIDE;
virtual bool enumerate(JSContext *cx, JSObject *wrapper, js::AutoIdVector &props) MOZ_OVERRIDE;
virtual bool keys(JSContext *cx, JSObject *wrapper, js::AutoIdVector &props) MOZ_OVERRIDE;

View File

@ -25,17 +25,17 @@ WaiveXrayWrapper::~WaiveXrayWrapper()
bool
WaiveXrayWrapper::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, js::PropertyDescriptor *desc)
js::PropertyDescriptor *desc, unsigned flags)
{
return CrossCompartmentWrapper::getPropertyDescriptor(cx, wrapper, id, set, desc) &&
return CrossCompartmentWrapper::getPropertyDescriptor(cx, wrapper, id, desc, flags) &&
WrapperFactory::WaiveXrayAndWrap(cx, &desc->value);
}
bool
WaiveXrayWrapper::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, js::PropertyDescriptor *desc)
js::PropertyDescriptor *desc, unsigned flags)
{
return CrossCompartmentWrapper::getOwnPropertyDescriptor(cx, wrapper, id, set, desc) &&
return CrossCompartmentWrapper::getOwnPropertyDescriptor(cx, wrapper, id, desc, flags) &&
WrapperFactory::WaiveXrayAndWrap(cx, &desc->value);
}

View File

@ -21,9 +21,9 @@ class WaiveXrayWrapper : public js::CrossCompartmentWrapper {
virtual ~WaiveXrayWrapper();
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, js::PropertyDescriptor *desc) MOZ_OVERRIDE;
js::PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, js::PropertyDescriptor *desc) MOZ_OVERRIDE;
js::PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE;
virtual bool get(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id,
js::Value *vp) MOZ_OVERRIDE;

View File

@ -132,7 +132,7 @@ public:
virtual bool resolveOwnProperty(JSContext *cx, js::Wrapper &jsWrapper,
JSObject *wrapper, JSObject *holder,
jsid id, bool set, JSPropertyDescriptor *desc);
jsid id, JSPropertyDescriptor *desc, unsigned flags);
static bool call(JSContext *cx, JSObject *wrapper, unsigned argc, Value *vp)
{
@ -183,10 +183,10 @@ class XPCWrappedNativeXrayTraits : public XrayTraits
{
public:
static bool resolveNativeProperty(JSContext *cx, JSObject *wrapper, JSObject *holder, jsid id,
bool set, JSPropertyDescriptor *desc);
JSPropertyDescriptor *desc, unsigned flags);
virtual bool resolveOwnProperty(JSContext *cx, js::Wrapper &jsWrapper, JSObject *wrapper,
JSObject *holder, jsid id, bool set,
JSPropertyDescriptor *desc);
JSObject *holder, jsid id, JSPropertyDescriptor *desc,
unsigned flags);
static bool defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
JSPropertyDescriptor *desc, bool *defined);
static bool enumerateNames(JSContext *cx, JSObject *wrapper, unsigned flags,
@ -198,7 +198,7 @@ public:
static bool isResolving(JSContext *cx, JSObject *holder, jsid id);
static bool resolveDOMCollectionProperty(JSContext *cx, JSObject *wrapper, JSObject *holder,
jsid id, bool set, PropertyDescriptor *desc);
jsid id, PropertyDescriptor *desc, unsigned flags);
static XPCWrappedNative* getWN(JSObject *wrapper) {
return GetWrappedNative(getTargetObject(wrapper));
@ -223,10 +223,10 @@ class DOMXrayTraits : public XrayTraits
{
public:
static bool resolveNativeProperty(JSContext *cx, JSObject *wrapper, JSObject *holder, jsid id,
bool set, JSPropertyDescriptor *desc);
JSPropertyDescriptor *desc, unsigned flags);
virtual bool resolveOwnProperty(JSContext *cx, js::Wrapper &jsWrapper, JSObject *wrapper,
JSObject *holder, jsid id, bool set,
JSPropertyDescriptor *desc);
JSObject *holder, jsid id, JSPropertyDescriptor *desc,
unsigned flags);
static bool enumerateNames(JSContext *cx, JSObject *wrapper, unsigned flags,
JS::AutoIdVector &props);
static bool call(JSContext *cx, JSObject *wrapper, unsigned argc, Value *vp);
@ -619,8 +619,8 @@ private:
// any native property.
bool
XPCWrappedNativeXrayTraits::resolveDOMCollectionProperty(JSContext *cx, JSObject *wrapper,
JSObject *holder, jsid id, bool set,
PropertyDescriptor *desc)
JSObject *holder, jsid id,
PropertyDescriptor *desc, unsigned flags)
{
// If we are not currently resolving this id and resolveNative is called
// we don't do anything. (see defineProperty in case of shadowing is forbidden).
@ -638,7 +638,6 @@ XPCWrappedNativeXrayTraits::resolveDOMCollectionProperty(JSContext *cx, JSObject
bool retval = true;
JSObject *pobj = NULL;
unsigned flags = (set ? JSRESOLVE_ASSIGNING : 0);
nsresult rv = wn->GetScriptableInfo()->GetCallback()->NewResolve(wn, cx, wrapper, id,
flags, &pobj, &retval);
if (NS_FAILED(rv)) {
@ -716,17 +715,17 @@ XPCWrappedNativeXrayTraits::preserveWrapper(JSObject *target)
bool
XPCWrappedNativeXrayTraits::resolveNativeProperty(JSContext *cx, JSObject *wrapper,
JSObject *holder, jsid id, bool set,
JSPropertyDescriptor *desc)
JSObject *holder, jsid id,
JSPropertyDescriptor *desc, unsigned flags)
{
MOZ_ASSERT(js::GetObjectJSClass(holder) == &HolderClass);
XPCJSRuntime* rt = nsXPConnect::GetRuntimeInstance();
if (!set &&
if (!(flags & JSRESOLVE_ASSIGNING) &&
id == rt->GetStringID(XPCJSRuntime::IDX_MOZMATCHESSELECTOR) &&
Is<nsIDOMElement>(wrapper))
{
// XPC calling mechanism cannot handle call/bind properly in some cases
// especially through xray wrappers. This is a temoorary work around for
// especially through xray wrappers. This is a temporary work around for
// this problem for mozMatchesSelector. See: bug 763897.
desc->obj = wrapper;
desc->attrs = JSPROP_ENUMERATE;
@ -755,7 +754,7 @@ XPCWrappedNativeXrayTraits::resolveNativeProperty(JSContext *cx, JSObject *wrapp
// check for those.
if (!JSID_IS_STRING(id)) {
/* Not found */
return resolveDOMCollectionProperty(cx, wrapper, holder, id, set, desc);
return resolveDOMCollectionProperty(cx, wrapper, holder, id, desc, flags);
}
XPCNativeInterface *iface;
@ -766,7 +765,7 @@ XPCWrappedNativeXrayTraits::resolveNativeProperty(JSContext *cx, JSObject *wrapp
!(iface = ccx.GetInterface()) ||
!(member = ccx.GetMember())) {
/* Not found */
return resolveDOMCollectionProperty(cx, wrapper, holder, id, set, desc);
return resolveDOMCollectionProperty(cx, wrapper, holder, id, desc, flags);
}
desc->obj = holder;
@ -912,7 +911,7 @@ nodePrincipal_getter(JSContext *cx, JSHandleObject wrapper, JSHandleId id, JSMut
bool
XrayTraits::resolveOwnProperty(JSContext *cx, js::Wrapper &jsWrapper,
JSObject *wrapper, JSObject *holder, jsid id,
bool set, PropertyDescriptor *desc)
PropertyDescriptor *desc, unsigned flags)
{
desc->obj = NULL;
JSObject *target = getTargetObject(wrapper);
@ -938,11 +937,11 @@ XrayTraits::resolveOwnProperty(JSContext *cx, js::Wrapper &jsWrapper,
bool
XPCWrappedNativeXrayTraits::resolveOwnProperty(JSContext *cx, js::Wrapper &jsWrapper,
JSObject *wrapper, JSObject *holder, jsid id,
bool set, PropertyDescriptor *desc)
PropertyDescriptor *desc, unsigned flags)
{
// Call the common code.
bool ok = XrayTraits::resolveOwnProperty(cx, jsWrapper, wrapper, holder,
id, set, desc);
id, desc, flags);
if (!ok || desc->obj)
return ok;
@ -957,7 +956,7 @@ XPCWrappedNativeXrayTraits::resolveOwnProperty(JSContext *cx, js::Wrapper &jsWra
(id == rt->GetStringID(XPCJSRuntime::IDX_DOCUMENTURIOBJECT) &&
Is<nsIDocument>(wrapper)))) {
bool status;
Wrapper::Action action = set ? Wrapper::SET : Wrapper::GET;
Wrapper::Action action = (flags & JSRESOLVE_ASSIGNING) ? Wrapper::SET : Wrapper::GET;
desc->obj = NULL; // default value
if (!jsWrapper.enter(cx, wrapper, id, action, &status))
return status;
@ -976,7 +975,6 @@ XPCWrappedNativeXrayTraits::resolveOwnProperty(JSContext *cx, js::Wrapper &jsWra
return true;
}
unsigned flags = (set ? JSRESOLVE_ASSIGNING : 0);
JSBool hasProp;
if (!JS_HasPropertyById(cx, holder, id, &hasProp)) {
return false;
@ -1118,7 +1116,7 @@ XPCWrappedNativeXrayTraits::construct(JSContext *cx, JSObject *wrapper,
bool
DOMXrayTraits::resolveNativeProperty(JSContext *cx, JSObject *wrapper, JSObject *holder, jsid id,
bool set, JSPropertyDescriptor *desc)
JSPropertyDescriptor *desc, unsigned flags)
{
JSObject *obj = getTargetObject(wrapper);
if (!XrayResolveNativeProperty(cx, wrapper, obj, id, desc))
@ -1132,16 +1130,17 @@ DOMXrayTraits::resolveNativeProperty(JSContext *cx, JSObject *wrapper, JSObject
bool
DOMXrayTraits::resolveOwnProperty(JSContext *cx, js::Wrapper &jsWrapper, JSObject *wrapper,
JSObject *holder, jsid id, bool set, JSPropertyDescriptor *desc)
JSObject *holder, jsid id, JSPropertyDescriptor *desc,
unsigned flags)
{
// Call the common code.
bool ok = XrayTraits::resolveOwnProperty(cx, jsWrapper, wrapper, holder,
id, set, desc);
id, desc, flags);
if (!ok || desc->obj)
return ok;
JSObject *obj = getTargetObject(wrapper);
if (!XrayResolveOwnProperty(cx, wrapper, obj, id, set, desc))
if (!XrayResolveOwnProperty(cx, wrapper, obj, id, desc, flags))
return false;
NS_ASSERTION(!desc->obj || desc->obj == wrapper,
@ -1302,7 +1301,7 @@ XrayToString(JSContext *cx, unsigned argc, jsval *vp)
template <typename Base, typename Traits>
bool
XrayWrapper<Base, Traits>::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, js::PropertyDescriptor *desc)
js::PropertyDescriptor *desc, unsigned flags)
{
JSObject *holder = Traits::singleton.ensureHolder(cx, wrapper);
if (Traits::isResolving(cx, holder, id)) {
@ -1311,7 +1310,7 @@ XrayWrapper<Base, Traits>::getPropertyDescriptor(JSContext *cx, JSObject *wrappe
}
bool status;
Wrapper::Action action = set ? Wrapper::SET : Wrapper::GET;
Wrapper::Action action = (flags & JSRESOLVE_ASSIGNING) ? Wrapper::SET : Wrapper::GET;
desc->obj = NULL; // default value
if (!this->enter(cx, wrapper, id, action, &status))
return status;
@ -1323,11 +1322,8 @@ XrayWrapper<Base, Traits>::getPropertyDescriptor(JSContext *cx, JSObject *wrappe
JSObject *obj = Traits::getTargetObject(wrapper);
{
JSAutoCompartment ac(cx, obj);
if (!JS_GetPropertyDescriptorById(cx, obj, id,
(set ? JSRESOLVE_ASSIGNING : 0),
desc)) {
if (!JS_GetPropertyDescriptorById(cx, obj, id, flags, desc))
return false;
}
}
if (desc->obj)
@ -1345,7 +1341,7 @@ XrayWrapper<Base, Traits>::getPropertyDescriptor(JSContext *cx, JSObject *wrappe
if (AccessCheck::wrapperSubsumes(wrapper) &&
id == rt->GetStringID(XPCJSRuntime::IDX_WRAPPED_JSOBJECT)) {
bool status;
Wrapper::Action action = set ? Wrapper::SET : Wrapper::GET;
Wrapper::Action action = (flags & JSRESOLVE_ASSIGNING) ? Wrapper::SET : Wrapper::GET;
desc->obj = NULL; // default value
if (!this->enter(cx, wrapper, id, action, &status))
return status;
@ -1359,7 +1355,7 @@ XrayWrapper<Base, Traits>::getPropertyDescriptor(JSContext *cx, JSObject *wrappe
return true;
}
if (!Traits::singleton.resolveOwnProperty(cx, *this, wrapper, holder, id, set, desc))
if (!Traits::singleton.resolveOwnProperty(cx, *this, wrapper, holder, id, desc, flags))
return false;
if (desc->obj)
@ -1373,7 +1369,7 @@ XrayWrapper<Base, Traits>::getPropertyDescriptor(JSContext *cx, JSObject *wrappe
}
// Nothing in the cache. Call through, and cache the result.
if (!Traits::resolveNativeProperty(cx, wrapper, holder, id, set, desc))
if (!Traits::resolveNativeProperty(cx, wrapper, holder, id, desc, flags))
return false;
if (!desc->obj) {
@ -1393,7 +1389,6 @@ XrayWrapper<Base, Traits>::getPropertyDescriptor(JSContext *cx, JSObject *wrappe
desc->obj = wrapper;
unsigned flags = (set ? JSRESOLVE_ASSIGNING : 0);
return JS_DefinePropertyById(cx, holder, id, desc->value, desc->getter, desc->setter,
desc->attrs) &&
JS_GetPropertyDescriptorById(cx, holder, id, flags, desc);
@ -1402,7 +1397,7 @@ XrayWrapper<Base, Traits>::getPropertyDescriptor(JSContext *cx, JSObject *wrappe
template <typename Base, typename Traits>
bool
XrayWrapper<Base, Traits>::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, PropertyDescriptor *desc)
PropertyDescriptor *desc, unsigned flags)
{
JSObject *holder = Traits::singleton.ensureHolder(cx, wrapper);
if (Traits::isResolving(cx, holder, id)) {
@ -1411,7 +1406,7 @@ XrayWrapper<Base, Traits>::getOwnPropertyDescriptor(JSContext *cx, JSObject *wra
}
bool status;
Wrapper::Action action = set ? Wrapper::SET : Wrapper::GET;
Wrapper::Action action = (flags & JSRESOLVE_ASSIGNING) ? Wrapper::SET : Wrapper::GET;
desc->obj = NULL; // default value
if (!this->enter(cx, wrapper, id, action, &status))
return status;
@ -1425,24 +1420,20 @@ XrayWrapper<Base, Traits>::getOwnPropertyDescriptor(JSContext *cx, JSObject *wra
JSObject *obj = Traits::getTargetObject(wrapper);
{
JSAutoCompartment ac(cx, obj);
if (!JS_GetPropertyDescriptorById(cx, obj, id,
(set ? JSRESOLVE_ASSIGNING : 0),
desc)) {
if (!JS_GetPropertyDescriptorById(cx, obj, id, flags, desc))
return false;
}
}
desc->obj = (desc->obj == obj) ? wrapper : nullptr;
return JS_WrapPropertyDescriptor(cx, desc);
}
if (!Traits::singleton.resolveOwnProperty(cx, *this, wrapper, holder, id, set, desc))
if (!Traits::singleton.resolveOwnProperty(cx, *this, wrapper, holder, id, desc, flags))
return false;
if (desc->obj)
return true;
unsigned flags = (set ? JSRESOLVE_ASSIGNING : 0);
if (!JS_GetPropertyDescriptorById(cx, holder, id, flags, desc))
return false;
@ -1470,7 +1461,7 @@ XrayWrapper<Base, Traits>::defineProperty(JSContext *cx, JSObject *wrapper, jsid
}
PropertyDescriptor existing_desc;
if (!getOwnPropertyDescriptor(cx, wrapper, id, true, &existing_desc))
if (!getOwnPropertyDescriptor(cx, wrapper, id, &existing_desc, JSRESOLVE_ASSIGNING))
return false;
if (existing_desc.obj && (existing_desc.attrs & JSPROP_PERMANENT))

View File

@ -5,9 +5,11 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/Attributes.h"
#include "mozilla/GuardObjects.h"
#include "jsapi.h"
#include "jswrapper.h"
#include "mozilla/GuardObjects.h"
// Xray wrappers re-resolve the original native properties on the native
// object and always directly access to those properties.
@ -62,9 +64,10 @@ class XrayWrapper : public Base {
/* Fundamental proxy traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, js::PropertyDescriptor *desc);
js::PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, js::PropertyDescriptor *desc);
js::PropertyDescriptor *desc,
unsigned flags) MOZ_OVERRIDE;
virtual bool defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
js::PropertyDescriptor *desc);
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *wrapper,
@ -108,10 +111,10 @@ public:
}
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
bool set, js::PropertyDescriptor *desc) MOZ_OVERRIDE;
js::PropertyDescriptor *desc, unsigned flags) MOZ_OVERRIDE;
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy,
jsid id, bool set,
js::PropertyDescriptor *desc) MOZ_OVERRIDE;
jsid id, js::PropertyDescriptor *desc,
unsigned flags) MOZ_OVERRIDE;
// We just forward the derived traps to the BaseProxyHandler versions which
// implement them in terms of the fundamental traps.