Bug 683361, part 1 - Strip JS prefix from proxy names since they are already in namespace js (r=gal)

--HG--
extra : rebase_source : 5eded8e02c36991322c94fca1092970910c2ceea
This commit is contained in:
Luke Wagner 2011-09-08 20:29:15 -07:00
parent bd4295528f
commit 7ff16e4820
25 changed files with 386 additions and 381 deletions

View File

@ -793,8 +793,8 @@ NS_NewOuterWindowProxy(JSContext *cx, JSObject *parent)
return nsnull;
}
JSObject *obj = JSWrapper::New(cx, parent, parent->getProto(), parent,
&nsOuterWindowProxy::singleton);
JSObject *obj = js::Wrapper::New(cx, parent, parent->getProto(), parent,
&nsOuterWindowProxy::singleton);
NS_ASSERTION(obj->getClass()->ext.innerObject, "bad class");
return obj;
}

View File

@ -236,10 +236,10 @@ private:
// nsOuterWindow: Outer Window Proxy
//*****************************************************************************
class nsOuterWindowProxy : public JSWrapper
class nsOuterWindowProxy : public js::Wrapper
{
public:
nsOuterWindowProxy() : JSWrapper((uintN)0) {}
nsOuterWindowProxy() : js::Wrapper((uintN)0) {}
virtual bool isOuterWindow() {
return true;

View File

@ -7,9 +7,9 @@
#include "tests.h"
#include "jswrapper.h"
struct OuterWrapper : JSWrapper
struct OuterWrapper : js::Wrapper
{
OuterWrapper() : JSWrapper(0) {}
OuterWrapper() : Wrapper(0) {}
virtual bool isOuterWindow() {
return true;
@ -44,13 +44,13 @@ PreWrap(JSContext *cx, JSObject *scope, JSObject *obj, uintN flags)
static JSObject *
Wrap(JSContext *cx, JSObject *obj, JSObject *proto, JSObject *parent, uintN flags)
{
return JSWrapper::New(cx, obj, proto, parent, &JSCrossCompartmentWrapper::singleton);
return js::Wrapper::New(cx, obj, proto, parent, &js::CrossCompartmentWrapper::singleton);
}
BEGIN_TEST(testBug604087)
{
JSObject *outerObj = JSWrapper::New(cx, global, global->getProto(), global,
&OuterWrapper::singleton);
JSObject *outerObj = js::Wrapper::New(cx, global, global->getProto(), global,
&OuterWrapper::singleton);
JSObject *compartment2 = JS_NewCompartmentAndGlobalObject(cx, getGlobalClass(), NULL);
JSObject *compartment3 = JS_NewCompartmentAndGlobalObject(cx, getGlobalClass(), NULL);
JSObject *compartment4 = JS_NewCompartmentAndGlobalObject(cx, getGlobalClass(), NULL);
@ -72,8 +72,8 @@ BEGIN_TEST(testBug604087)
{
JSAutoEnterCompartment ac;
CHECK(ac.enter(cx, compartment2));
next = JSWrapper::New(cx, compartment2, compartment2->getProto(), compartment2,
&OuterWrapper::singleton);
next = js::Wrapper::New(cx, compartment2, compartment2->getProto(), compartment2,
&OuterWrapper::singleton);
CHECK(next);
}

View File

@ -3233,7 +3233,7 @@ LookupResult(JSContext *cx, JSObject *obj, JSObject *obj2, jsid id,
return js_GetDenseArrayElementValue(cx, obj2, id, vp);
if (obj2->isProxy()) {
AutoPropertyDescriptorRooter desc(cx);
if (!JSProxy::getPropertyDescriptor(cx, obj2, id, false, &desc))
if (!Proxy::getPropertyDescriptor(cx, obj2, id, false, &desc))
return false;
if (!(desc.attrs & JSPROP_SHARED)) {
*vp = desc.value;
@ -3609,8 +3609,8 @@ GetPropertyDescriptorById(JSContext *cx, JSObject *obj, jsid id, uintN flags,
if (obj2->isProxy()) {
JSAutoResolveFlags rf(cx, flags);
return own
? JSProxy::getOwnPropertyDescriptor(cx, obj2, id, false, desc)
: JSProxy::getPropertyDescriptor(cx, obj2, id, false, desc);
? Proxy::getOwnPropertyDescriptor(cx, obj2, id, false, desc)
: Proxy::getPropertyDescriptor(cx, obj2, id, false, desc);
}
if (!obj2->getAttributes(cx, id, &desc->attrs))
return false;

View File

@ -188,7 +188,7 @@ static bool
IsCrossCompartmentWrapper(JSObject *wrapper)
{
return wrapper->isWrapper() &&
!!(JSWrapper::wrapperHandler(wrapper)->flags() & JSWrapper::CROSS_COMPARTMENT);
!!(Wrapper::wrapperHandler(wrapper)->flags() & Wrapper::CROSS_COMPARTMENT);
}
bool

View File

@ -1717,7 +1717,7 @@ fun_toStringHelper(JSContext *cx, JSObject *obj, uintN indent)
{
if (!obj->isFunction()) {
if (obj->isFunctionProxy())
return JSProxy::fun_toString(cx, obj, indent);
return Proxy::fun_toString(cx, obj, indent);
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
JSMSG_INCOMPATIBLE_PROTO,
js_Function_str, js_toString_str,

View File

@ -270,14 +270,14 @@ Snapshot(JSContext *cx, JSObject *obj, uintN flags, AutoIdVector *props)
AutoIdVector proxyProps(cx);
if (flags & JSITER_OWNONLY) {
if (flags & JSITER_HIDDEN) {
if (!JSProxy::getOwnPropertyNames(cx, pobj, proxyProps))
if (!Proxy::getOwnPropertyNames(cx, pobj, proxyProps))
return false;
} else {
if (!JSProxy::keys(cx, pobj, proxyProps))
if (!Proxy::keys(cx, pobj, proxyProps))
return false;
}
} else {
if (!JSProxy::enumerate(cx, pobj, proxyProps))
if (!Proxy::enumerate(cx, pobj, proxyProps))
return false;
}
for (size_t n = 0, len = proxyProps.length(); n < len; n++) {
@ -646,7 +646,7 @@ GetIterator(JSContext *cx, JSObject *obj, uintN flags, Value *vp)
miss:
if (obj->isProxy()) {
types::MarkIteratorUnknown(cx);
return JSProxy::iterate(cx, obj, flags, vp);
return Proxy::iterate(cx, obj, flags, vp);
}
if (!GetCustomIterator(cx, obj, flags, vp))
return false;

View File

@ -846,7 +846,7 @@ JSString *
obj_toStringHelper(JSContext *cx, JSObject *obj)
{
if (obj->isProxy())
return JSProxy::obj_toString(cx, obj);
return Proxy::obj_toString(cx, obj);
const char *clazz = obj->getClass()->name;
size_t nchars = 9 + strlen(clazz); /* 9 for "[object ]" */
@ -1496,7 +1496,7 @@ js_HasOwnPropertyHelper(JSContext *cx, LookupPropOp lookup, uintN argc,
JSProperty *prop;
if (obj->isProxy()) {
bool has;
if (!JSProxy::hasOwn(cx, obj, id, &has))
if (!Proxy::hasOwn(cx, obj, id, &has))
return false;
vp->setBoolean(has);
return true;
@ -1838,7 +1838,7 @@ bool
GetOwnPropertyDescriptor(JSContext *cx, JSObject *obj, jsid id, PropertyDescriptor *desc)
{
if (obj->isProxy())
return JSProxy::getOwnPropertyDescriptor(cx, obj, id, false, desc);
return Proxy::getOwnPropertyDescriptor(cx, obj, id, false, desc);
JSObject *pobj;
JSProperty *prop;
@ -2485,7 +2485,7 @@ DefineProperty(JSContext *cx, JSObject *obj, const jsid &id, const PropDesc &des
if (obj->getOps()->lookupProperty) {
if (obj->isProxy())
return JSProxy::defineProperty(cx, obj, id, desc.pd);
return Proxy::defineProperty(cx, obj, id, desc.pd);
return Reject(cx, obj, JSMSG_OBJECT_NOT_EXTENSIBLE, throwError, rval);
}
@ -3721,7 +3721,7 @@ CopySlots(JSContext *cx, JSObject *from, JSObject *to)
size_t n = 0;
if (from->isWrapper() &&
(JSWrapper::wrapperHandler(from)->flags() & JSWrapper::CROSS_COMPARTMENT)) {
(Wrapper::wrapperHandler(from)->flags() & Wrapper::CROSS_COMPARTMENT)) {
to->setSlot(0, from->getSlot(0));
to->setSlot(1, from->getSlot(1));
n = 2;
@ -5906,7 +5906,7 @@ js_GetPropertyHelperInline(JSContext *cx, JSObject *obj, JSObject *receiver, jsi
if (!obj2->isNative()) {
return obj2->isProxy()
? JSProxy::get(cx, obj2, receiver, id, vp)
? Proxy::get(cx, obj2, receiver, id, vp)
: obj2->getGeneric(cx, id, vp);
}
@ -6094,7 +6094,7 @@ js_SetPropertyHelper(JSContext *cx, JSObject *obj, jsid id, uintN defineHow,
if (!pobj->isNative()) {
if (pobj->isProxy()) {
AutoPropertyDescriptorRooter pd(cx);
if (!JSProxy::getPropertyDescriptor(cx, pobj, id, true, &pd))
if (!Proxy::getPropertyDescriptor(cx, pobj, id, true, &pd))
return false;
if ((pd.attrs & (JSPROP_SHARED | JSPROP_SHADOWABLE)) == JSPROP_SHARED) {

View File

@ -66,7 +66,7 @@ namespace nanojit { class ValidateWriter; }
namespace js {
class AutoPropDescArrayRooter;
class JSProxyHandler;
class ProxyHandler;
class RegExp;
class CallObject;
struct GCMarker;
@ -1293,12 +1293,12 @@ struct JSObject : js::gc::Cell {
* Proxy-specific getters and setters.
*/
inline js::JSProxyHandler *getProxyHandler() const;
inline js::ProxyHandler *getProxyHandler() const;
inline const js::Value &getProxyPrivate() const;
inline void setProxyPrivate(const js::Value &priv);
inline const js::Value &getProxyExtra() const;
inline void setProxyExtra(const js::Value &extra);
inline JSWrapper *getWrapperHandler() const;
inline js::Wrapper *getWrapperHandler() const;
/*
* With object-specific getters and setters.

View File

@ -82,16 +82,16 @@ OperationInProgress(JSContext *cx, JSObject *proxy)
return false;
}
JSProxyHandler::JSProxyHandler(void *family) : mFamily(family)
ProxyHandler::ProxyHandler(void *family) : mFamily(family)
{
}
JSProxyHandler::~JSProxyHandler()
ProxyHandler::~ProxyHandler()
{
}
bool
JSProxyHandler::has(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
ProxyHandler::has(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
{
JS_ASSERT(OperationInProgress(cx, proxy));
AutoPropertyDescriptorRooter desc(cx);
@ -102,7 +102,7 @@ JSProxyHandler::has(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
}
bool
JSProxyHandler::hasOwn(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
ProxyHandler::hasOwn(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
{
JS_ASSERT(OperationInProgress(cx, proxy));
AutoPropertyDescriptorRooter desc(cx);
@ -113,7 +113,7 @@ JSProxyHandler::hasOwn(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
}
bool
JSProxyHandler::get(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, Value *vp)
ProxyHandler::get(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, Value *vp)
{
JS_ASSERT(OperationInProgress(cx, proxy));
AutoPropertyDescriptorRooter desc(cx);
@ -140,8 +140,8 @@ JSProxyHandler::get(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id,
}
bool
JSProxyHandler::set(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, bool strict,
Value *vp)
ProxyHandler::set(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, bool strict,
Value *vp)
{
JS_ASSERT(OperationInProgress(cx, proxy));
AutoPropertyDescriptorRooter desc(cx);
@ -196,7 +196,7 @@ JSProxyHandler::set(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id,
}
bool
JSProxyHandler::keys(JSContext *cx, JSObject *proxy, AutoIdVector &props)
ProxyHandler::keys(JSContext *cx, JSObject *proxy, AutoIdVector &props)
{
JS_ASSERT(OperationInProgress(cx, proxy));
JS_ASSERT(props.length() == 0);
@ -223,7 +223,7 @@ JSProxyHandler::keys(JSContext *cx, JSObject *proxy, AutoIdVector &props)
}
bool
JSProxyHandler::iterate(JSContext *cx, JSObject *proxy, uintN flags, Value *vp)
ProxyHandler::iterate(JSContext *cx, JSObject *proxy, uintN flags, Value *vp)
{
JS_ASSERT(OperationInProgress(cx, proxy));
AutoIdVector props(cx);
@ -236,7 +236,7 @@ JSProxyHandler::iterate(JSContext *cx, JSObject *proxy, uintN flags, Value *vp)
}
JSString *
JSProxyHandler::obj_toString(JSContext *cx, JSObject *proxy)
ProxyHandler::obj_toString(JSContext *cx, JSObject *proxy)
{
JS_ASSERT(proxy->isProxy());
@ -246,7 +246,7 @@ JSProxyHandler::obj_toString(JSContext *cx, JSObject *proxy)
}
JSString *
JSProxyHandler::fun_toString(JSContext *cx, JSObject *proxy, uintN indent)
ProxyHandler::fun_toString(JSContext *cx, JSObject *proxy, uintN indent)
{
JS_ASSERT(proxy->isProxy());
Value fval = GetCall(proxy);
@ -262,13 +262,13 @@ JSProxyHandler::fun_toString(JSContext *cx, JSObject *proxy, uintN indent)
}
bool
JSProxyHandler::defaultValue(JSContext *cx, JSObject *proxy, JSType hint, Value *vp)
ProxyHandler::defaultValue(JSContext *cx, JSObject *proxy, JSType hint, Value *vp)
{
return DefaultValue(cx, proxy, hint, vp);
}
bool
JSProxyHandler::call(JSContext *cx, JSObject *proxy, uintN argc, Value *vp)
ProxyHandler::call(JSContext *cx, JSObject *proxy, uintN argc, Value *vp)
{
JS_ASSERT(OperationInProgress(cx, proxy));
AutoValueRooter rval(cx);
@ -279,8 +279,8 @@ JSProxyHandler::call(JSContext *cx, JSObject *proxy, uintN argc, Value *vp)
}
bool
JSProxyHandler::construct(JSContext *cx, JSObject *proxy,
uintN argc, Value *argv, Value *rval)
ProxyHandler::construct(JSContext *cx, JSObject *proxy,
uintN argc, Value *argv, Value *rval)
{
JS_ASSERT(OperationInProgress(cx, proxy));
Value fval = GetConstruct(proxy);
@ -290,7 +290,7 @@ JSProxyHandler::construct(JSContext *cx, JSObject *proxy,
}
bool
JSProxyHandler::hasInstance(JSContext *cx, JSObject *proxy, const Value *vp, bool *bp)
ProxyHandler::hasInstance(JSContext *cx, JSObject *proxy, const Value *vp, bool *bp)
{
JS_ASSERT(OperationInProgress(cx, proxy));
js_ReportValueError(cx, JSMSG_BAD_INSTANCEOF_RHS,
@ -299,19 +299,19 @@ JSProxyHandler::hasInstance(JSContext *cx, JSObject *proxy, const Value *vp, boo
}
JSType
JSProxyHandler::typeOf(JSContext *cx, JSObject *proxy)
ProxyHandler::typeOf(JSContext *cx, JSObject *proxy)
{
JS_ASSERT(OperationInProgress(cx, proxy));
return proxy->isFunctionProxy() ? JSTYPE_FUNCTION : JSTYPE_OBJECT;
}
void
JSProxyHandler::finalize(JSContext *cx, JSObject *proxy)
ProxyHandler::finalize(JSContext *cx, JSObject *proxy)
{
}
void
JSProxyHandler::trace(JSTracer *trc, JSObject *proxy)
ProxyHandler::trace(JSTracer *trc, JSObject *proxy)
{
}
@ -441,10 +441,10 @@ ArrayToIdVector(JSContext *cx, const Value &array, AutoIdVector &props)
}
/* Derived class for all scripted proxy handlers. */
class JSScriptedProxyHandler : public JSProxyHandler {
class ScriptedProxyHandler : public ProxyHandler {
public:
JSScriptedProxyHandler();
virtual ~JSScriptedProxyHandler();
ScriptedProxyHandler();
virtual ~ScriptedProxyHandler();
/* ES5 Harmony fundamental proxy traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
@ -467,16 +467,16 @@ class JSScriptedProxyHandler : public JSProxyHandler {
virtual bool keys(JSContext *cx, JSObject *proxy, AutoIdVector &props);
virtual bool iterate(JSContext *cx, JSObject *proxy, uintN flags, Value *vp);
static JSScriptedProxyHandler singleton;
static ScriptedProxyHandler singleton;
};
static int sScriptedProxyHandlerFamily = 0;
JSScriptedProxyHandler::JSScriptedProxyHandler() : JSProxyHandler(&sScriptedProxyHandlerFamily)
ScriptedProxyHandler::ScriptedProxyHandler() : ProxyHandler(&sScriptedProxyHandlerFamily)
{
}
JSScriptedProxyHandler::~JSScriptedProxyHandler()
ScriptedProxyHandler::~ScriptedProxyHandler()
{
}
@ -502,8 +502,8 @@ GetProxyHandlerObject(JSContext *cx, JSObject *proxy)
}
bool
JSScriptedProxyHandler::getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc)
ScriptedProxyHandler::getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc)
{
JSObject *handler = GetProxyHandlerObject(cx, proxy);
AutoValueRooter tvr(cx);
@ -515,8 +515,8 @@ JSScriptedProxyHandler::getPropertyDescriptor(JSContext *cx, JSObject *proxy, js
}
bool
JSScriptedProxyHandler::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc)
ScriptedProxyHandler::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc)
{
JSObject *handler = GetProxyHandlerObject(cx, proxy);
AutoValueRooter tvr(cx);
@ -528,8 +528,8 @@ JSScriptedProxyHandler::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy,
}
bool
JSScriptedProxyHandler::defineProperty(JSContext *cx, JSObject *proxy, jsid id,
PropertyDescriptor *desc)
ScriptedProxyHandler::defineProperty(JSContext *cx, JSObject *proxy, jsid id,
PropertyDescriptor *desc)
{
JSObject *handler = GetProxyHandlerObject(cx, proxy);
AutoValueRooter tvr(cx);
@ -540,7 +540,7 @@ JSScriptedProxyHandler::defineProperty(JSContext *cx, JSObject *proxy, jsid id,
}
bool
JSScriptedProxyHandler::getOwnPropertyNames(JSContext *cx, JSObject *proxy, AutoIdVector &props)
ScriptedProxyHandler::getOwnPropertyNames(JSContext *cx, JSObject *proxy, AutoIdVector &props)
{
JSObject *handler = GetProxyHandlerObject(cx, proxy);
AutoValueRooter tvr(cx);
@ -550,7 +550,7 @@ JSScriptedProxyHandler::getOwnPropertyNames(JSContext *cx, JSObject *proxy, Auto
}
bool
JSScriptedProxyHandler::delete_(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
ScriptedProxyHandler::delete_(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
{
JSObject *handler = GetProxyHandlerObject(cx, proxy);
AutoValueRooter tvr(cx);
@ -560,7 +560,7 @@ JSScriptedProxyHandler::delete_(JSContext *cx, JSObject *proxy, jsid id, bool *b
}
bool
JSScriptedProxyHandler::enumerate(JSContext *cx, JSObject *proxy, AutoIdVector &props)
ScriptedProxyHandler::enumerate(JSContext *cx, JSObject *proxy, AutoIdVector &props)
{
JSObject *handler = GetProxyHandlerObject(cx, proxy);
AutoValueRooter tvr(cx);
@ -570,7 +570,7 @@ JSScriptedProxyHandler::enumerate(JSContext *cx, JSObject *proxy, AutoIdVector &
}
bool
JSScriptedProxyHandler::fix(JSContext *cx, JSObject *proxy, Value *vp)
ScriptedProxyHandler::fix(JSContext *cx, JSObject *proxy, Value *vp)
{
JSObject *handler = GetProxyHandlerObject(cx, proxy);
return GetFundamentalTrap(cx, handler, ATOM(fix), vp) &&
@ -578,33 +578,33 @@ JSScriptedProxyHandler::fix(JSContext *cx, JSObject *proxy, Value *vp)
}
bool
JSScriptedProxyHandler::has(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
ScriptedProxyHandler::has(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
{
JSObject *handler = GetProxyHandlerObject(cx, proxy);
AutoValueRooter tvr(cx);
if (!GetDerivedTrap(cx, handler, ATOM(has), tvr.addr()))
return false;
if (!js_IsCallable(tvr.value()))
return JSProxyHandler::has(cx, proxy, id, bp);
return ProxyHandler::has(cx, proxy, id, bp);
return Trap1(cx, handler, tvr.value(), id, tvr.addr()) &&
ValueToBool(cx, tvr.value(), bp);
}
bool
JSScriptedProxyHandler::hasOwn(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
ScriptedProxyHandler::hasOwn(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
{
JSObject *handler = GetProxyHandlerObject(cx, proxy);
AutoValueRooter tvr(cx);
if (!GetDerivedTrap(cx, handler, ATOM(hasOwn), tvr.addr()))
return false;
if (!js_IsCallable(tvr.value()))
return JSProxyHandler::hasOwn(cx, proxy, id, bp);
return ProxyHandler::hasOwn(cx, proxy, id, bp);
return Trap1(cx, handler, tvr.value(), id, tvr.addr()) &&
ValueToBool(cx, tvr.value(), bp);
}
bool
JSScriptedProxyHandler::get(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, Value *vp)
ScriptedProxyHandler::get(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, Value *vp)
{
JSObject *handler = GetProxyHandlerObject(cx, proxy);
JSString *str = js_ValueToString(cx, IdToValue(id));
@ -616,13 +616,13 @@ JSScriptedProxyHandler::get(JSContext *cx, JSObject *proxy, JSObject *receiver,
if (!GetDerivedTrap(cx, handler, ATOM(get), fval.addr()))
return false;
if (!js_IsCallable(fval.value()))
return JSProxyHandler::get(cx, proxy, receiver, id, vp);
return ProxyHandler::get(cx, proxy, receiver, id, vp);
return Trap(cx, handler, fval.value(), 2, argv, vp);
}
bool
JSScriptedProxyHandler::set(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, bool strict,
Value *vp)
ScriptedProxyHandler::set(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, bool strict,
Value *vp)
{
JSObject *handler = GetProxyHandlerObject(cx, proxy);
JSString *str = js_ValueToString(cx, IdToValue(id));
@ -634,37 +634,37 @@ JSScriptedProxyHandler::set(JSContext *cx, JSObject *proxy, JSObject *receiver,
if (!GetDerivedTrap(cx, handler, ATOM(set), fval.addr()))
return false;
if (!js_IsCallable(fval.value()))
return JSProxyHandler::set(cx, proxy, receiver, id, strict, vp);
return ProxyHandler::set(cx, proxy, receiver, id, strict, vp);
return Trap(cx, handler, fval.value(), 3, argv, tvr.addr());
}
bool
JSScriptedProxyHandler::keys(JSContext *cx, JSObject *proxy, AutoIdVector &props)
ScriptedProxyHandler::keys(JSContext *cx, JSObject *proxy, AutoIdVector &props)
{
JSObject *handler = GetProxyHandlerObject(cx, proxy);
AutoValueRooter tvr(cx);
if (!GetDerivedTrap(cx, handler, ATOM(keys), tvr.addr()))
return false;
if (!js_IsCallable(tvr.value()))
return JSProxyHandler::keys(cx, proxy, props);
return ProxyHandler::keys(cx, proxy, props);
return Trap(cx, handler, tvr.value(), 0, NULL, tvr.addr()) &&
ArrayToIdVector(cx, tvr.value(), props);
}
bool
JSScriptedProxyHandler::iterate(JSContext *cx, JSObject *proxy, uintN flags, Value *vp)
ScriptedProxyHandler::iterate(JSContext *cx, JSObject *proxy, uintN flags, Value *vp)
{
JSObject *handler = GetProxyHandlerObject(cx, proxy);
AutoValueRooter tvr(cx);
if (!GetDerivedTrap(cx, handler, ATOM(iterate), tvr.addr()))
return false;
if (!js_IsCallable(tvr.value()))
return JSProxyHandler::iterate(cx, proxy, flags, vp);
return ProxyHandler::iterate(cx, proxy, flags, vp);
return Trap(cx, handler, tvr.value(), 0, NULL, vp) &&
ReturnedValueMustNotBePrimitive(cx, proxy, ATOM(iterate), *vp);
}
JSScriptedProxyHandler JSScriptedProxyHandler::singleton;
ScriptedProxyHandler ScriptedProxyHandler::singleton;
class AutoPendingProxyOperation {
ThreadData *data;
@ -683,8 +683,8 @@ class AutoPendingProxyOperation {
};
bool
JSProxy::getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc)
Proxy::getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -692,18 +692,18 @@ JSProxy::getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set
}
bool
JSProxy::getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set, Value *vp)
Proxy::getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set, Value *vp)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
AutoPropertyDescriptorRooter desc(cx);
return JSProxy::getPropertyDescriptor(cx, proxy, id, set, &desc) &&
return Proxy::getPropertyDescriptor(cx, proxy, id, set, &desc) &&
NewPropertyDescriptorObject(cx, &desc, vp);
}
bool
JSProxy::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc)
Proxy::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
PropertyDescriptor *desc)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -711,17 +711,17 @@ JSProxy::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool
}
bool
JSProxy::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set, Value *vp)
Proxy::getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set, Value *vp)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
AutoPropertyDescriptorRooter desc(cx);
return JSProxy::getOwnPropertyDescriptor(cx, proxy, id, set, &desc) &&
return Proxy::getOwnPropertyDescriptor(cx, proxy, id, set, &desc) &&
NewPropertyDescriptorObject(cx, &desc, vp);
}
bool
JSProxy::defineProperty(JSContext *cx, JSObject *proxy, jsid id, PropertyDescriptor *desc)
Proxy::defineProperty(JSContext *cx, JSObject *proxy, jsid id, PropertyDescriptor *desc)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -729,17 +729,17 @@ JSProxy::defineProperty(JSContext *cx, JSObject *proxy, jsid id, PropertyDescrip
}
bool
JSProxy::defineProperty(JSContext *cx, JSObject *proxy, jsid id, const Value &v)
Proxy::defineProperty(JSContext *cx, JSObject *proxy, jsid id, const Value &v)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
AutoPropertyDescriptorRooter desc(cx);
return ParsePropertyDescriptorObject(cx, proxy, id, v, &desc) &&
JSProxy::defineProperty(cx, proxy, id, &desc);
Proxy::defineProperty(cx, proxy, id, &desc);
}
bool
JSProxy::getOwnPropertyNames(JSContext *cx, JSObject *proxy, AutoIdVector &props)
Proxy::getOwnPropertyNames(JSContext *cx, JSObject *proxy, AutoIdVector &props)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -747,7 +747,7 @@ JSProxy::getOwnPropertyNames(JSContext *cx, JSObject *proxy, AutoIdVector &props
}
bool
JSProxy::delete_(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
Proxy::delete_(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -755,7 +755,7 @@ JSProxy::delete_(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
}
bool
JSProxy::enumerate(JSContext *cx, JSObject *proxy, AutoIdVector &props)
Proxy::enumerate(JSContext *cx, JSObject *proxy, AutoIdVector &props)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -763,7 +763,7 @@ JSProxy::enumerate(JSContext *cx, JSObject *proxy, AutoIdVector &props)
}
bool
JSProxy::fix(JSContext *cx, JSObject *proxy, Value *vp)
Proxy::fix(JSContext *cx, JSObject *proxy, Value *vp)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -771,7 +771,7 @@ JSProxy::fix(JSContext *cx, JSObject *proxy, Value *vp)
}
bool
JSProxy::has(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
Proxy::has(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -779,7 +779,7 @@ JSProxy::has(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
}
bool
JSProxy::hasOwn(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
Proxy::hasOwn(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -787,7 +787,7 @@ JSProxy::hasOwn(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
}
bool
JSProxy::get(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, Value *vp)
Proxy::get(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, Value *vp)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -795,7 +795,7 @@ JSProxy::get(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, Value
}
bool
JSProxy::set(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, bool strict, Value *vp)
Proxy::set(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, bool strict, Value *vp)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -803,7 +803,7 @@ JSProxy::set(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, bool s
}
bool
JSProxy::keys(JSContext *cx, JSObject *proxy, AutoIdVector &props)
Proxy::keys(JSContext *cx, JSObject *proxy, AutoIdVector &props)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -811,7 +811,7 @@ JSProxy::keys(JSContext *cx, JSObject *proxy, AutoIdVector &props)
}
bool
JSProxy::iterate(JSContext *cx, JSObject *proxy, uintN flags, Value *vp)
Proxy::iterate(JSContext *cx, JSObject *proxy, uintN flags, Value *vp)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -819,7 +819,7 @@ JSProxy::iterate(JSContext *cx, JSObject *proxy, uintN flags, Value *vp)
}
bool
JSProxy::call(JSContext *cx, JSObject *proxy, uintN argc, Value *vp)
Proxy::call(JSContext *cx, JSObject *proxy, uintN argc, Value *vp)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -827,7 +827,7 @@ JSProxy::call(JSContext *cx, JSObject *proxy, uintN argc, Value *vp)
}
bool
JSProxy::construct(JSContext *cx, JSObject *proxy, uintN argc, Value *argv, Value *rval)
Proxy::construct(JSContext *cx, JSObject *proxy, uintN argc, Value *argv, Value *rval)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -835,7 +835,7 @@ JSProxy::construct(JSContext *cx, JSObject *proxy, uintN argc, Value *argv, Valu
}
bool
JSProxy::hasInstance(JSContext *cx, JSObject *proxy, const js::Value *vp, bool *bp)
Proxy::hasInstance(JSContext *cx, JSObject *proxy, const js::Value *vp, bool *bp)
{
JS_CHECK_RECURSION(cx, return false);
AutoPendingProxyOperation pending(cx, proxy);
@ -843,7 +843,7 @@ JSProxy::hasInstance(JSContext *cx, JSObject *proxy, const js::Value *vp, bool *
}
JSType
JSProxy::typeOf(JSContext *cx, JSObject *proxy)
Proxy::typeOf(JSContext *cx, JSObject *proxy)
{
// FIXME: API doesn't allow us to report error (bug 618906).
JS_CHECK_RECURSION(cx, return JSTYPE_OBJECT);
@ -852,7 +852,7 @@ JSProxy::typeOf(JSContext *cx, JSObject *proxy)
}
JSString *
JSProxy::obj_toString(JSContext *cx, JSObject *proxy)
Proxy::obj_toString(JSContext *cx, JSObject *proxy)
{
JS_CHECK_RECURSION(cx, return NULL);
AutoPendingProxyOperation pending(cx, proxy);
@ -860,7 +860,7 @@ JSProxy::obj_toString(JSContext *cx, JSObject *proxy)
}
JSString *
JSProxy::fun_toString(JSContext *cx, JSObject *proxy, uintN indent)
Proxy::fun_toString(JSContext *cx, JSObject *proxy, uintN indent)
{
JS_CHECK_RECURSION(cx, return NULL);
AutoPendingProxyOperation pending(cx, proxy);
@ -868,7 +868,7 @@ JSProxy::fun_toString(JSContext *cx, JSObject *proxy, uintN indent)
}
bool
JSProxy::defaultValue(JSContext *cx, JSObject *proxy, JSType hint, Value *vp)
Proxy::defaultValue(JSContext *cx, JSObject *proxy, JSType hint, Value *vp)
{
JS_CHECK_RECURSION(cx, return NULL);
AutoPendingProxyOperation pending(cx, proxy);
@ -888,7 +888,7 @@ proxy_LookupProperty(JSContext *cx, JSObject *obj, jsid id, JSObject **objp,
id = js_CheckForStringIndex(id);
bool found;
if (!JSProxy::has(cx, obj, id, &found))
if (!Proxy::has(cx, obj, id, &found))
return false;
if (found) {
@ -930,7 +930,7 @@ proxy_DefineProperty(JSContext *cx, JSObject *obj, jsid id, const Value *value,
desc.getter = getter;
desc.setter = setter;
desc.shortid = 0;
return JSProxy::defineProperty(cx, obj, id, &desc);
return Proxy::defineProperty(cx, obj, id, &desc);
}
static JSBool
@ -955,7 +955,7 @@ proxy_GetGeneric(JSContext *cx, JSObject *obj, JSObject *receiver, jsid id, Valu
{
id = js_CheckForStringIndex(id);
return JSProxy::get(cx, obj, receiver, id, vp);
return Proxy::get(cx, obj, receiver, id, vp);
}
static JSBool
@ -984,7 +984,7 @@ proxy_SetProperty(JSContext *cx, JSObject *obj, jsid id, Value *vp, JSBool stric
{
id = js_CheckForStringIndex(id);
return JSProxy::set(cx, obj, obj, id, strict, vp);
return Proxy::set(cx, obj, obj, id, strict, vp);
}
static JSBool
@ -1008,7 +1008,7 @@ proxy_GetAttributes(JSContext *cx, JSObject *obj, jsid id, uintN *attrsp)
id = js_CheckForStringIndex(id);
AutoPropertyDescriptorRooter desc(cx);
if (!JSProxy::getOwnPropertyDescriptor(cx, obj, id, false, &desc))
if (!Proxy::getOwnPropertyDescriptor(cx, obj, id, false, &desc))
return false;
*attrsp = desc.attrs;
return true;
@ -1036,10 +1036,10 @@ proxy_SetAttributes(JSContext *cx, JSObject *obj, jsid id, uintN *attrsp)
/* Lookup the current property descriptor so we have setter/getter/value. */
AutoPropertyDescriptorRooter desc(cx);
if (!JSProxy::getOwnPropertyDescriptor(cx, obj, id, true, &desc))
if (!Proxy::getOwnPropertyDescriptor(cx, obj, id, true, &desc))
return false;
desc.attrs = (*attrsp & (~JSPROP_SHORTID));
return JSProxy::defineProperty(cx, obj, id, &desc);
return Proxy::defineProperty(cx, obj, id, &desc);
}
static JSBool
@ -1064,7 +1064,7 @@ proxy_DeleteProperty(JSContext *cx, JSObject *obj, jsid id, Value *rval, JSBool
// TODO: throwing away strict
bool deleted;
if (!JSProxy::delete_(cx, obj, id, &deleted) || !js_SuppressDeletedProperty(cx, obj, id))
if (!Proxy::delete_(cx, obj, id, &deleted) || !js_SuppressDeletedProperty(cx, obj, id))
return false;
rval->setBoolean(deleted);
return true;
@ -1109,7 +1109,7 @@ static JSBool
proxy_Convert(JSContext *cx, JSObject *proxy, JSType hint, Value *vp)
{
JS_ASSERT(proxy->isProxy());
return JSProxy::defaultValue(cx, proxy, hint, vp);
return Proxy::defaultValue(cx, proxy, hint, vp);
}
static JSBool
@ -1138,7 +1138,7 @@ proxy_HasInstance(JSContext *cx, JSObject *proxy, const Value *v, JSBool *bp)
{
AutoPendingProxyOperation pending(cx, proxy);
bool b;
if (!JSProxy::hasInstance(cx, proxy, v, &b))
if (!Proxy::hasInstance(cx, proxy, v, &b))
return false;
*bp = !!b;
return true;
@ -1148,7 +1148,7 @@ static JSType
proxy_TypeOf(JSContext *cx, JSObject *proxy)
{
JS_ASSERT(proxy->isProxy());
return JSProxy::typeOf(cx, proxy);
return Proxy::typeOf(cx, proxy);
}
JS_FRIEND_DATA(Class) js::ObjectProxyClass = {
@ -1273,7 +1273,7 @@ proxy_Call(JSContext *cx, uintN argc, Value *vp)
{
JSObject *proxy = &JS_CALLEE(cx, vp).toObject();
JS_ASSERT(proxy->isProxy());
return JSProxy::call(cx, proxy, argc, vp);
return Proxy::call(cx, proxy, argc, vp);
}
static JSBool
@ -1281,7 +1281,7 @@ proxy_Construct(JSContext *cx, uintN argc, Value *vp)
{
JSObject *proxy = &JS_CALLEE(cx, vp).toObject();
JS_ASSERT(proxy->isProxy());
bool ok = JSProxy::construct(cx, proxy, argc, JS_ARGV(cx, vp), vp);
bool ok = Proxy::construct(cx, proxy, argc, JS_ARGV(cx, vp), vp);
return ok;
}
@ -1342,8 +1342,8 @@ JS_FRIEND_DATA(Class) js::FunctionProxyClass = {
};
JS_FRIEND_API(JSObject *)
js::NewProxyObject(JSContext *cx, JSProxyHandler *handler, const Value &priv, JSObject *proto,
JSObject *parent, JSObject *call, JSObject *construct)
js::NewProxyObject(JSContext *cx, ProxyHandler *handler, const Value &priv, JSObject *proto,
JSObject *parent, JSObject *call, JSObject *construct)
{
JS_ASSERT_IF(proto, cx->compartment == proto->compartment());
JS_ASSERT_IF(parent, cx->compartment == parent->compartment());
@ -1401,7 +1401,7 @@ proxy_create(JSContext *cx, uintN argc, Value *vp)
}
if (!parent)
parent = vp[0].toObject().getParent();
JSObject *proxy = NewProxyObject(cx, &JSScriptedProxyHandler::singleton, ObjectValue(*handler),
JSObject *proxy = NewProxyObject(cx, &ScriptedProxyHandler::singleton, ObjectValue(*handler),
proto, parent);
if (!proxy)
return false;
@ -1437,7 +1437,7 @@ proxy_createFunction(JSContext *cx, uintN argc, Value *vp)
return false;
}
JSObject *proxy = NewProxyObject(cx, &JSScriptedProxyHandler::singleton,
JSObject *proxy = NewProxyObject(cx, &ScriptedProxyHandler::singleton,
ObjectValue(*handler),
proto, parent, call, construct);
if (!proxy)
@ -1587,7 +1587,7 @@ js::FixProxy(JSContext *cx, JSObject *proxy, JSBool *bp)
}
AutoValueRooter tvr(cx);
if (!JSProxy::fix(cx, proxy, tvr.addr()))
if (!Proxy::fix(cx, proxy, tvr.addr()))
return false;
if (tvr.value().isUndefined()) {
*bp = false;

View File

@ -49,11 +49,11 @@
namespace js {
/* Base class for all C++ proxy handlers. */
class JS_FRIEND_API(JSProxyHandler) {
class JS_FRIEND_API(ProxyHandler) {
void *mFamily;
public:
explicit JSProxyHandler(void *family);
virtual ~JSProxyHandler();
explicit ProxyHandler(void *family);
virtual ~ProxyHandler();
/* ES5 Harmony fundamental proxy traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
@ -62,29 +62,28 @@ class JS_FRIEND_API(JSProxyHandler) {
PropertyDescriptor *desc) = 0;
virtual bool defineProperty(JSContext *cx, JSObject *proxy, jsid id,
PropertyDescriptor *desc) = 0;
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *proxy, js::AutoIdVector &props) = 0;
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *proxy, AutoIdVector &props) = 0;
virtual bool delete_(JSContext *cx, JSObject *proxy, jsid id, bool *bp) = 0;
virtual bool enumerate(JSContext *cx, JSObject *proxy, js::AutoIdVector &props) = 0;
virtual bool enumerate(JSContext *cx, JSObject *proxy, AutoIdVector &props) = 0;
virtual bool fix(JSContext *cx, JSObject *proxy, Value *vp) = 0;
/* ES5 Harmony derived proxy traps. */
virtual bool has(JSContext *cx, JSObject *proxy, jsid id, bool *bp);
virtual bool hasOwn(JSContext *cx, JSObject *proxy, jsid id, bool *bp);
virtual bool get(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, js::Value *vp);
virtual bool get(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, Value *vp);
virtual bool set(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, bool strict,
js::Value *vp);
virtual bool keys(JSContext *cx, JSObject *proxy, js::AutoIdVector &props);
virtual bool iterate(JSContext *cx, JSObject *proxy, uintN flags, js::Value *vp);
Value *vp);
virtual bool keys(JSContext *cx, JSObject *proxy, AutoIdVector &props);
virtual bool iterate(JSContext *cx, JSObject *proxy, uintN flags, Value *vp);
/* Spidermonkey extensions. */
virtual bool call(JSContext *cx, JSObject *proxy, uintN argc, js::Value *vp);
virtual bool construct(JSContext *cx, JSObject *proxy,
uintN argc, js::Value *argv, js::Value *rval);
virtual bool hasInstance(JSContext *cx, JSObject *proxy, const js::Value *vp, bool *bp);
virtual bool call(JSContext *cx, JSObject *proxy, uintN argc, Value *vp);
virtual bool construct(JSContext *cx, JSObject *proxy, uintN argc, Value *argv, Value *rval);
virtual bool hasInstance(JSContext *cx, JSObject *proxy, const Value *vp, bool *bp);
virtual JSType typeOf(JSContext *cx, JSObject *proxy);
virtual JSString *obj_toString(JSContext *cx, JSObject *proxy);
virtual JSString *fun_toString(JSContext *cx, JSObject *proxy, uintN indent);
virtual bool defaultValue(JSContext *cx, JSObject *obj, JSType hint, js::Value *vp);
virtual bool defaultValue(JSContext *cx, JSObject *obj, JSType hint, Value *vp);
virtual void finalize(JSContext *cx, JSObject *proxy);
virtual void trace(JSTracer *trc, JSObject *proxy);
@ -98,7 +97,7 @@ class JS_FRIEND_API(JSProxyHandler) {
};
/* Dispatch point for handlers that executes the appropriate C++ or scripted traps. */
class JSProxy {
class Proxy {
public:
/* ES5 Harmony fundamental proxy traps. */
static bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id, bool set,
@ -110,9 +109,9 @@ class JSProxy {
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);
static bool getOwnPropertyNames(JSContext *cx, JSObject *proxy, js::AutoIdVector &props);
static bool getOwnPropertyNames(JSContext *cx, JSObject *proxy, AutoIdVector &props);
static bool delete_(JSContext *cx, JSObject *proxy, jsid id, bool *bp);
static bool enumerate(JSContext *cx, JSObject *proxy, js::AutoIdVector &props);
static bool enumerate(JSContext *cx, JSObject *proxy, AutoIdVector &props);
static bool fix(JSContext *cx, JSObject *proxy, Value *vp);
/* ES5 Harmony derived proxy traps. */
@ -121,17 +120,17 @@ class JSProxy {
static bool get(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, Value *vp);
static bool set(JSContext *cx, JSObject *proxy, JSObject *receiver, jsid id, bool strict,
Value *vp);
static bool keys(JSContext *cx, JSObject *proxy, js::AutoIdVector &props);
static bool keys(JSContext *cx, JSObject *proxy, AutoIdVector &props);
static bool iterate(JSContext *cx, JSObject *proxy, uintN flags, Value *vp);
/* Spidermonkey extensions. */
static bool call(JSContext *cx, JSObject *proxy, uintN argc, js::Value *vp);
static bool construct(JSContext *cx, JSObject *proxy, uintN argc, js::Value *argv, js::Value *rval);
static bool hasInstance(JSContext *cx, JSObject *proxy, const js::Value *vp, bool *bp);
static bool call(JSContext *cx, JSObject *proxy, uintN argc, Value *vp);
static bool construct(JSContext *cx, JSObject *proxy, uintN argc, Value *argv, Value *rval);
static bool hasInstance(JSContext *cx, JSObject *proxy, const Value *vp, bool *bp);
static JSType typeOf(JSContext *cx, JSObject *proxy);
static JSString *obj_toString(JSContext *cx, JSObject *proxy);
static JSString *fun_toString(JSContext *cx, JSObject *proxy, uintN indent);
static bool defaultValue(JSContext *cx, JSObject *obj, JSType hint, js::Value *vp);
static bool defaultValue(JSContext *cx, JSObject *obj, JSType hint, Value *vp);
};
/* Shared between object and function proxies. */
@ -142,13 +141,13 @@ const uint32 JSSLOT_PROXY_EXTRA = 2;
const uint32 JSSLOT_PROXY_CALL = 3;
const uint32 JSSLOT_PROXY_CONSTRUCT = 4;
}
} /* namespace js */
inline js::JSProxyHandler *
inline js::ProxyHandler *
JSObject::getProxyHandler() const
{
JS_ASSERT(isProxy());
return (js::JSProxyHandler *) getSlot(js::JSSLOT_PROXY_HANDLER).toPrivate();
return (js::ProxyHandler *) getSlot(js::JSSLOT_PROXY_HANDLER).toPrivate();
}
inline const js::Value &
@ -182,7 +181,7 @@ JSObject::setProxyExtra(const js::Value &extra)
namespace js {
JS_FRIEND_API(JSObject *)
NewProxyObject(JSContext *cx, JSProxyHandler *handler, const js::Value &priv,
NewProxyObject(JSContext *cx, ProxyHandler *handler, const js::Value &priv,
JSObject *proto, JSObject *parent,
JSObject *call = NULL, JSObject *construct = NULL);

View File

@ -156,6 +156,11 @@ struct TokenPos;
struct TokenPtr;
class UpvarCookie;
class Proxy;
class ProxyHandler;
class Wrapper;
class CrossCompartmentWrapper;
class TempAllocPolicy;
class RuntimeAllocPolicy;

View File

@ -63,7 +63,7 @@ using namespace js::gc;
static int sWrapperFamily;
void *
JSWrapper::getWrapperFamily()
Wrapper::getWrapperFamily()
{
return &sWrapperFamily;
}
@ -77,14 +77,14 @@ JSObject::isWrapper() const
bool
JSObject::isCrossCompartmentWrapper() const
{
return isWrapper() && !!(getWrapperHandler()->flags() & JSWrapper::CROSS_COMPARTMENT);
return isWrapper() && !!(getWrapperHandler()->flags() & Wrapper::CROSS_COMPARTMENT);
}
JSWrapper *
Wrapper *
JSObject::getWrapperHandler() const
{
JS_ASSERT(isWrapper());
return static_cast<JSWrapper *>(getProxyHandler());
return static_cast<Wrapper *>(getProxyHandler());
}
JSObject *
@ -93,7 +93,7 @@ JSObject::unwrap(uintN *flagsp)
JSObject *wrapped = this;
uintN flags = 0;
while (wrapped->isWrapper()) {
flags |= static_cast<JSWrapper *>(wrapped->getProxyHandler())->flags();
flags |= static_cast<Wrapper *>(wrapped->getProxyHandler())->flags();
wrapped = wrapped->getProxyPrivate().toObjectOrNull();
if (wrapped->getClass()->ext.innerObject)
break;
@ -103,11 +103,11 @@ JSObject::unwrap(uintN *flagsp)
return wrapped;
}
JSWrapper::JSWrapper(uintN flags) : JSProxyHandler(&sWrapperFamily), mFlags(flags)
Wrapper::Wrapper(uintN flags) : ProxyHandler(&sWrapperFamily), mFlags(flags)
{
}
JSWrapper::~JSWrapper()
Wrapper::~Wrapper()
{
}
@ -125,8 +125,8 @@ JSWrapper::~JSWrapper()
#define GET(action) CHECKED(action, GET)
bool
JSWrapper::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, PropertyDescriptor *desc)
Wrapper::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set,
PropertyDescriptor *desc)
{
desc->obj = NULL; // default result if we refuse to perform this action
CHECKED(JS_GetPropertyDescriptorById(cx, wrappedObject(wrapper), id, JSRESOLVE_QUALIFIED, desc),
@ -139,7 +139,7 @@ GetOwnPropertyDescriptor(JSContext *cx, JSObject *obj, jsid id, uintN flags, JSP
// 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 JSProxy::getOwnPropertyDescriptor(cx, obj, id, flags & JSRESOLVE_ASSIGNING, desc);
return Proxy::getOwnPropertyDescriptor(cx, obj, id, flags & JSRESOLVE_ASSIGNING, desc);
if (!JS_GetPropertyDescriptorById(cx, obj, id, flags, desc))
return false;
@ -149,8 +149,8 @@ GetOwnPropertyDescriptor(JSContext *cx, JSObject *obj, jsid id, uintN flags, JSP
}
bool
JSWrapper::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set,
PropertyDescriptor *desc)
Wrapper::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set,
PropertyDescriptor *desc)
{
desc->obj = NULL; // default result if we refuse to perform this action
CHECKED(GetOwnPropertyDescriptor(cx, wrappedObject(wrapper), id, JSRESOLVE_QUALIFIED, desc),
@ -158,15 +158,14 @@ JSWrapper::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, b
}
bool
JSWrapper::defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
PropertyDescriptor *desc)
Wrapper::defineProperty(JSContext *cx, JSObject *wrapper, jsid id, PropertyDescriptor *desc)
{
SET(JS_DefinePropertyById(cx, wrappedObject(wrapper), id, desc->value,
desc->getter, desc->setter, desc->attrs));
}
bool
JSWrapper::getOwnPropertyNames(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
Wrapper::getOwnPropertyNames(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
{
// if we refuse to perform this action, props remains empty
jsid id = JSID_VOID;
@ -181,7 +180,7 @@ ValueToBoolean(Value *vp, bool *bp)
}
bool
JSWrapper::delete_(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
Wrapper::delete_(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
{
*bp = true; // default result if we refuse to perform this action
Value v;
@ -190,7 +189,7 @@ JSWrapper::delete_(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
}
bool
JSWrapper::enumerate(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
Wrapper::enumerate(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
{
// if we refuse to perform this action, props remains empty
static jsid id = JSID_VOID;
@ -198,7 +197,7 @@ JSWrapper::enumerate(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
}
bool
JSWrapper::fix(JSContext *cx, JSObject *wrapper, Value *vp)
Wrapper::fix(JSContext *cx, JSObject *wrapper, Value *vp)
{
vp->setUndefined();
return true;
@ -212,7 +211,7 @@ Cond(JSBool b, bool *bp)
}
bool
JSWrapper::has(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
Wrapper::has(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
{
*bp = false; // default result if we refuse to perform this action
JSBool found;
@ -221,7 +220,7 @@ JSWrapper::has(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
}
bool
JSWrapper::hasOwn(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
Wrapper::hasOwn(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
{
*bp = false; // default result if we refuse to perform this action
PropertyDescriptor desc;
@ -231,14 +230,14 @@ JSWrapper::hasOwn(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
}
bool
JSWrapper::get(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id, Value *vp)
Wrapper::get(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id, Value *vp)
{
vp->setUndefined(); // default result if we refuse to perform this action
GET(wrappedObject(wrapper)->getGeneric(cx, receiver, id, vp));
}
bool
JSWrapper::set(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id, bool strict,
Wrapper::set(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id, bool strict,
Value *vp)
{
// FIXME (bug 596351): Need deal with strict mode.
@ -246,7 +245,7 @@ JSWrapper::set(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id, bo
}
bool
JSWrapper::keys(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
Wrapper::keys(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
{
// if we refuse to perform this action, props remains empty
const jsid id = JSID_VOID;
@ -254,7 +253,7 @@ JSWrapper::keys(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
}
bool
JSWrapper::iterate(JSContext *cx, JSObject *wrapper, uintN flags, Value *vp)
Wrapper::iterate(JSContext *cx, JSObject *wrapper, uintN flags, Value *vp)
{
vp->setUndefined(); // default result if we refuse to perform this action
const jsid id = JSID_VOID;
@ -262,23 +261,23 @@ JSWrapper::iterate(JSContext *cx, JSObject *wrapper, uintN flags, Value *vp)
}
bool
JSWrapper::call(JSContext *cx, JSObject *wrapper, uintN argc, Value *vp)
Wrapper::call(JSContext *cx, JSObject *wrapper, uintN argc, Value *vp)
{
vp->setUndefined(); // default result if we refuse to perform this action
const jsid id = JSID_VOID;
CHECKED(JSProxyHandler::call(cx, wrapper, argc, vp), CALL);
CHECKED(ProxyHandler::call(cx, wrapper, argc, vp), CALL);
}
bool
JSWrapper::construct(JSContext *cx, JSObject *wrapper, uintN argc, Value *argv, Value *vp)
Wrapper::construct(JSContext *cx, JSObject *wrapper, uintN argc, Value *argv, Value *vp)
{
vp->setUndefined(); // default result if we refuse to perform this action
const jsid id = JSID_VOID;
GET(JSProxyHandler::construct(cx, wrapper, argc, argv, vp));
GET(ProxyHandler::construct(cx, wrapper, argc, argv, vp));
}
bool
JSWrapper::hasInstance(JSContext *cx, JSObject *wrapper, const Value *vp, bool *bp)
Wrapper::hasInstance(JSContext *cx, JSObject *wrapper, const Value *vp, bool *bp)
{
*bp = false; // default result if we refuse to perform this action
const jsid id = JSID_VOID;
@ -287,13 +286,13 @@ JSWrapper::hasInstance(JSContext *cx, JSObject *wrapper, const Value *vp, bool *
}
JSType
JSWrapper::typeOf(JSContext *cx, JSObject *wrapper)
Wrapper::typeOf(JSContext *cx, JSObject *wrapper)
{
return TypeOfValue(cx, ObjectValue(*wrappedObject(wrapper)));
}
JSString *
JSWrapper::obj_toString(JSContext *cx, JSObject *wrapper)
Wrapper::obj_toString(JSContext *cx, JSObject *wrapper)
{
bool status;
if (!enter(cx, wrapper, JSID_VOID, GET, &status)) {
@ -309,7 +308,7 @@ JSWrapper::obj_toString(JSContext *cx, JSObject *wrapper)
}
JSString *
JSWrapper::fun_toString(JSContext *cx, JSObject *wrapper, uintN indent)
Wrapper::fun_toString(JSContext *cx, JSObject *wrapper, uintN indent)
{
bool status;
if (!enter(cx, wrapper, JSID_VOID, GET, &status)) {
@ -323,13 +322,13 @@ JSWrapper::fun_toString(JSContext *cx, JSObject *wrapper, uintN indent)
}
return NULL;
}
JSString *str = JSProxyHandler::fun_toString(cx, wrapper, indent);
JSString *str = ProxyHandler::fun_toString(cx, wrapper, indent);
leave(cx, wrapper);
return str;
}
bool
JSWrapper::defaultValue(JSContext *cx, JSObject *wrapper, JSType hint, Value *vp)
Wrapper::defaultValue(JSContext *cx, JSObject *wrapper, JSType hint, Value *vp)
{
*vp = ObjectValue(*wrappedObject(wrapper));
if (hint == JSTYPE_VOID)
@ -338,40 +337,39 @@ JSWrapper::defaultValue(JSContext *cx, JSObject *wrapper, JSType hint, Value *vp
}
void
JSWrapper::trace(JSTracer *trc, JSObject *wrapper)
Wrapper::trace(JSTracer *trc, JSObject *wrapper)
{
MarkObject(trc, *wrappedObject(wrapper), "wrappedObject");
}
JSObject *
JSWrapper::wrappedObject(const JSObject *wrapper)
Wrapper::wrappedObject(const JSObject *wrapper)
{
return wrapper->getProxyPrivate().toObjectOrNull();
}
JSWrapper *
JSWrapper::wrapperHandler(const JSObject *wrapper)
Wrapper *
Wrapper::wrapperHandler(const JSObject *wrapper)
{
return static_cast<JSWrapper *>(wrapper->getProxyHandler());
return static_cast<Wrapper *>(wrapper->getProxyHandler());
}
bool
JSWrapper::enter(JSContext *cx, JSObject *wrapper, jsid id, Action act, bool *bp)
Wrapper::enter(JSContext *cx, JSObject *wrapper, jsid id, Action act, bool *bp)
{
*bp = true;
return true;
}
void
JSWrapper::leave(JSContext *cx, JSObject *wrapper)
Wrapper::leave(JSContext *cx, JSObject *wrapper)
{
}
JSWrapper JSWrapper::singleton((uintN)0);
Wrapper Wrapper::singleton((uintN)0);
JSObject *
JSWrapper::New(JSContext *cx, JSObject *obj, JSObject *proto, JSObject *parent,
JSWrapper *handler)
Wrapper::New(JSContext *cx, JSObject *obj, JSObject *proto, JSObject *parent, Wrapper *handler)
{
JS_ASSERT(parent);
if (obj->isXML()) {
@ -392,7 +390,7 @@ TransparentObjectWrapper(JSContext *cx, JSObject *obj, JSObject *wrappedProto, J
{
// Allow wrapping outer window proxies.
JS_ASSERT(!obj->isWrapper() || obj->getClass()->ext.innerObject);
return JSWrapper::New(cx, obj, wrappedProto, parent, &JSCrossCompartmentWrapper::singleton);
return Wrapper::New(cx, obj, wrappedProto, parent, &CrossCompartmentWrapper::singleton);
}
}
@ -493,12 +491,12 @@ ErrorCopier::~ErrorCopier()
/* Cross compartment wrappers. */
JSCrossCompartmentWrapper::JSCrossCompartmentWrapper(uintN flags)
: JSWrapper(CROSS_COMPARTMENT | flags)
CrossCompartmentWrapper::CrossCompartmentWrapper(uintN flags)
: Wrapper(CROSS_COMPARTMENT | flags)
{
}
JSCrossCompartmentWrapper::~JSCrossCompartmentWrapper()
CrossCompartmentWrapper::~CrossCompartmentWrapper()
{
}
@ -515,108 +513,108 @@ JSCrossCompartmentWrapper::~JSCrossCompartmentWrapper()
#define NOTHING (true)
bool
JSCrossCompartmentWrapper::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, PropertyDescriptor *desc)
CrossCompartmentWrapper::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, PropertyDescriptor *desc)
{
PIERCE(cx, wrapper, set ? SET : GET,
call.destination->wrapId(cx, &id),
JSWrapper::getPropertyDescriptor(cx, wrapper, id, set, desc),
Wrapper::getPropertyDescriptor(cx, wrapper, id, set, desc),
call.origin->wrap(cx, desc));
}
bool
JSCrossCompartmentWrapper::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, PropertyDescriptor *desc)
CrossCompartmentWrapper::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, PropertyDescriptor *desc)
{
PIERCE(cx, wrapper, set ? SET : GET,
call.destination->wrapId(cx, &id),
JSWrapper::getOwnPropertyDescriptor(cx, wrapper, id, set, desc),
Wrapper::getOwnPropertyDescriptor(cx, wrapper, id, set, desc),
call.origin->wrap(cx, desc));
}
bool
JSCrossCompartmentWrapper::defineProperty(JSContext *cx, JSObject *wrapper, jsid id, PropertyDescriptor *desc)
CrossCompartmentWrapper::defineProperty(JSContext *cx, JSObject *wrapper, jsid id, PropertyDescriptor *desc)
{
AutoPropertyDescriptorRooter desc2(cx, desc);
PIERCE(cx, wrapper, SET,
call.destination->wrapId(cx, &id) && call.destination->wrap(cx, &desc2),
JSWrapper::defineProperty(cx, wrapper, id, &desc2),
Wrapper::defineProperty(cx, wrapper, id, &desc2),
NOTHING);
}
bool
JSCrossCompartmentWrapper::getOwnPropertyNames(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
CrossCompartmentWrapper::getOwnPropertyNames(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
{
PIERCE(cx, wrapper, GET,
NOTHING,
JSWrapper::getOwnPropertyNames(cx, wrapper, props),
Wrapper::getOwnPropertyNames(cx, wrapper, props),
call.origin->wrap(cx, props));
}
bool
JSCrossCompartmentWrapper::delete_(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
CrossCompartmentWrapper::delete_(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
{
PIERCE(cx, wrapper, SET,
call.destination->wrapId(cx, &id),
JSWrapper::delete_(cx, wrapper, id, bp),
Wrapper::delete_(cx, wrapper, id, bp),
NOTHING);
}
bool
JSCrossCompartmentWrapper::enumerate(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
CrossCompartmentWrapper::enumerate(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
{
PIERCE(cx, wrapper, GET,
NOTHING,
JSWrapper::enumerate(cx, wrapper, props),
Wrapper::enumerate(cx, wrapper, props),
call.origin->wrap(cx, props));
}
bool
JSCrossCompartmentWrapper::has(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
CrossCompartmentWrapper::has(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
{
PIERCE(cx, wrapper, GET,
call.destination->wrapId(cx, &id),
JSWrapper::has(cx, wrapper, id, bp),
Wrapper::has(cx, wrapper, id, bp),
NOTHING);
}
bool
JSCrossCompartmentWrapper::hasOwn(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
CrossCompartmentWrapper::hasOwn(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
{
PIERCE(cx, wrapper, GET,
call.destination->wrapId(cx, &id),
JSWrapper::hasOwn(cx, wrapper, id, bp),
Wrapper::hasOwn(cx, wrapper, id, bp),
NOTHING);
}
bool
JSCrossCompartmentWrapper::get(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id, Value *vp)
CrossCompartmentWrapper::get(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id, Value *vp)
{
PIERCE(cx, wrapper, GET,
call.destination->wrap(cx, &receiver) && call.destination->wrapId(cx, &id),
JSWrapper::get(cx, wrapper, receiver, id, vp),
Wrapper::get(cx, wrapper, receiver, id, vp),
call.origin->wrap(cx, vp));
}
bool
JSCrossCompartmentWrapper::set(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id,
bool strict, Value *vp)
CrossCompartmentWrapper::set(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id,
bool strict, Value *vp)
{
AutoValueRooter tvr(cx, *vp);
PIERCE(cx, wrapper, SET,
call.destination->wrap(cx, &receiver) &&
call.destination->wrapId(cx, &id) &&
call.destination->wrap(cx, tvr.addr()),
JSWrapper::set(cx, wrapper, receiver, id, strict, tvr.addr()),
Wrapper::set(cx, wrapper, receiver, id, strict, tvr.addr()),
NOTHING);
}
bool
JSCrossCompartmentWrapper::keys(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
CrossCompartmentWrapper::keys(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
{
PIERCE(cx, wrapper, GET,
NOTHING,
JSWrapper::keys(cx, wrapper, props),
Wrapper::keys(cx, wrapper, props),
call.origin->wrap(cx, props));
}
@ -687,16 +685,16 @@ Reify(JSContext *cx, JSCompartment *origin, Value *vp)
}
bool
JSCrossCompartmentWrapper::iterate(JSContext *cx, JSObject *wrapper, uintN flags, Value *vp)
CrossCompartmentWrapper::iterate(JSContext *cx, JSObject *wrapper, uintN flags, Value *vp)
{
PIERCE(cx, wrapper, GET,
NOTHING,
JSWrapper::iterate(cx, wrapper, flags, vp),
Wrapper::iterate(cx, wrapper, flags, vp),
CanReify(vp) ? Reify(cx, call.origin, vp) : call.origin->wrap(cx, vp));
}
bool
JSCrossCompartmentWrapper::call(JSContext *cx, JSObject *wrapper, uintN argc, Value *vp)
CrossCompartmentWrapper::call(JSContext *cx, JSObject *wrapper, uintN argc, Value *vp)
{
AutoCompartment call(cx, wrappedObject(wrapper));
if (!call.enter())
@ -710,7 +708,7 @@ JSCrossCompartmentWrapper::call(JSContext *cx, JSObject *wrapper, uintN argc, Va
if (!call.destination->wrap(cx, &argv[n]))
return false;
}
if (!JSWrapper::call(cx, wrapper, argc, vp))
if (!Wrapper::call(cx, wrapper, argc, vp))
return false;
call.leave();
@ -718,8 +716,8 @@ JSCrossCompartmentWrapper::call(JSContext *cx, JSObject *wrapper, uintN argc, Va
}
bool
JSCrossCompartmentWrapper::construct(JSContext *cx, JSObject *wrapper, uintN argc, Value *argv,
Value *rval)
CrossCompartmentWrapper::construct(JSContext *cx, JSObject *wrapper, uintN argc, Value *argv,
Value *rval)
{
AutoCompartment call(cx, wrappedObject(wrapper));
if (!call.enter())
@ -729,7 +727,7 @@ JSCrossCompartmentWrapper::construct(JSContext *cx, JSObject *wrapper, uintN arg
if (!call.destination->wrap(cx, &argv[n]))
return false;
}
if (!JSWrapper::construct(cx, wrapper, argc, argv, rval))
if (!Wrapper::construct(cx, wrapper, argc, argv, rval))
return false;
call.leave();
@ -737,7 +735,7 @@ JSCrossCompartmentWrapper::construct(JSContext *cx, JSObject *wrapper, uintN arg
}
bool
JSCrossCompartmentWrapper::hasInstance(JSContext *cx, JSObject *wrapper, const Value *vp, bool *bp)
CrossCompartmentWrapper::hasInstance(JSContext *cx, JSObject *wrapper, const Value *vp, bool *bp)
{
AutoCompartment call(cx, wrappedObject(wrapper));
if (!call.enter())
@ -746,17 +744,17 @@ JSCrossCompartmentWrapper::hasInstance(JSContext *cx, JSObject *wrapper, const V
Value v = *vp;
if (!call.destination->wrap(cx, &v))
return false;
return JSWrapper::hasInstance(cx, wrapper, &v, bp);
return Wrapper::hasInstance(cx, wrapper, &v, bp);
}
JSString *
JSCrossCompartmentWrapper::obj_toString(JSContext *cx, JSObject *wrapper)
CrossCompartmentWrapper::obj_toString(JSContext *cx, JSObject *wrapper)
{
AutoCompartment call(cx, wrappedObject(wrapper));
if (!call.enter())
return NULL;
JSString *str = JSWrapper::obj_toString(cx, wrapper);
JSString *str = Wrapper::obj_toString(cx, wrapper);
if (!str)
return NULL;
@ -767,13 +765,13 @@ JSCrossCompartmentWrapper::obj_toString(JSContext *cx, JSObject *wrapper)
}
JSString *
JSCrossCompartmentWrapper::fun_toString(JSContext *cx, JSObject *wrapper, uintN indent)
CrossCompartmentWrapper::fun_toString(JSContext *cx, JSObject *wrapper, uintN indent)
{
AutoCompartment call(cx, wrappedObject(wrapper));
if (!call.enter())
return NULL;
JSString *str = JSWrapper::fun_toString(cx, wrapper, indent);
JSString *str = Wrapper::fun_toString(cx, wrapper, indent);
if (!str)
return NULL;
@ -784,13 +782,13 @@ JSCrossCompartmentWrapper::fun_toString(JSContext *cx, JSObject *wrapper, uintN
}
bool
JSCrossCompartmentWrapper::defaultValue(JSContext *cx, JSObject *wrapper, JSType hint, Value *vp)
CrossCompartmentWrapper::defaultValue(JSContext *cx, JSObject *wrapper, JSType hint, Value *vp)
{
AutoCompartment call(cx, wrappedObject(wrapper));
if (!call.enter())
return false;
if (!JSWrapper::defaultValue(cx, wrapper, hint, vp))
if (!Wrapper::defaultValue(cx, wrapper, hint, vp))
return false;
call.leave();
@ -798,9 +796,9 @@ JSCrossCompartmentWrapper::defaultValue(JSContext *cx, JSObject *wrapper, JSType
}
void
JSCrossCompartmentWrapper::trace(JSTracer *trc, JSObject *wrapper)
CrossCompartmentWrapper::trace(JSTracer *trc, JSObject *wrapper)
{
MarkCrossCompartmentObject(trc, *wrappedObject(wrapper), "wrappedObject");
}
JSCrossCompartmentWrapper JSCrossCompartmentWrapper::singleton(0u);
CrossCompartmentWrapper CrossCompartmentWrapper::singleton(0u);

View File

@ -45,50 +45,50 @@
#include "jsapi.h"
#include "jsproxy.h"
JS_BEGIN_EXTERN_C
namespace js {
/* No-op wrapper handler base class. */
class JS_FRIEND_API(JSWrapper) : public js::JSProxyHandler {
class JS_FRIEND_API(Wrapper) : public ProxyHandler
{
uintN mFlags;
public:
uintN flags() const { return mFlags; }
explicit JSWrapper(uintN flags);
explicit Wrapper(uintN flags);
typedef enum { PermitObjectAccess, PermitPropertyAccess, DenyAccess } Permission;
virtual ~JSWrapper();
virtual ~Wrapper();
/* ES5 Harmony fundamental wrapper traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set,
js::PropertyDescriptor *desc);
PropertyDescriptor *desc);
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set,
js::PropertyDescriptor *desc);
PropertyDescriptor *desc);
virtual bool defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
js::PropertyDescriptor *desc);
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *wrapper, js::AutoIdVector &props);
PropertyDescriptor *desc);
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *wrapper, AutoIdVector &props);
virtual bool delete_(JSContext *cx, JSObject *wrapper, jsid id, bool *bp);
virtual bool enumerate(JSContext *cx, JSObject *wrapper, js::AutoIdVector &props);
virtual bool fix(JSContext *cx, JSObject *wrapper, js::Value *vp);
virtual bool enumerate(JSContext *cx, JSObject *wrapper, AutoIdVector &props);
virtual bool fix(JSContext *cx, JSObject *wrapper, Value *vp);
/* ES5 Harmony derived wrapper traps. */
virtual bool has(JSContext *cx, JSObject *wrapper, jsid id, bool *bp);
virtual bool hasOwn(JSContext *cx, JSObject *wrapper, jsid id, bool *bp);
virtual bool get(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id, js::Value *vp);
virtual bool get(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id, Value *vp);
virtual bool set(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id, bool strict,
js::Value *vp);
virtual bool keys(JSContext *cx, JSObject *wrapper, js::AutoIdVector &props);
virtual bool iterate(JSContext *cx, JSObject *wrapper, uintN flags, js::Value *vp);
Value *vp);
virtual bool keys(JSContext *cx, JSObject *wrapper, AutoIdVector &props);
virtual bool iterate(JSContext *cx, JSObject *wrapper, uintN flags, Value *vp);
/* Spidermonkey extensions. */
virtual bool call(JSContext *cx, JSObject *wrapper, uintN argc, js::Value *vp);
virtual bool construct(JSContext *cx, JSObject *wrapper, uintN argc, js::Value *argv,
js::Value *rval);
virtual bool hasInstance(JSContext *cx, JSObject *wrapper, const js::Value *vp, bool *bp);
virtual bool call(JSContext *cx, JSObject *wrapper, uintN argc, Value *vp);
virtual bool construct(JSContext *cx, JSObject *wrapper, uintN argc, Value *argv, Value *rval);
virtual bool hasInstance(JSContext *cx, JSObject *wrapper, const Value *vp, bool *bp);
virtual JSType typeOf(JSContext *cx, JSObject *proxy);
virtual JSString *obj_toString(JSContext *cx, JSObject *wrapper);
virtual JSString *fun_toString(JSContext *cx, JSObject *wrapper, uintN indent);
virtual bool defaultValue(JSContext *cx, JSObject *wrapper, JSType hint, js::Value *vp);
virtual bool defaultValue(JSContext *cx, JSObject *wrapper, JSType hint, Value *vp);
virtual void trace(JSTracer *trc, JSObject *wrapper);
@ -97,13 +97,13 @@ class JS_FRIEND_API(JSWrapper) : public js::JSProxyHandler {
virtual bool enter(JSContext *cx, JSObject *wrapper, jsid id, Action act, bool *bp);
virtual void leave(JSContext *cx, JSObject *wrapper);
static JSWrapper singleton;
static Wrapper singleton;
static JSObject *New(JSContext *cx, JSObject *obj, JSObject *proto, JSObject *parent,
JSWrapper *handler);
Wrapper *handler);
static JSObject *wrappedObject(const JSObject *wrapper);
static JSWrapper *wrapperHandler(const JSObject *wrapper);
static Wrapper *wrapperHandler(const JSObject *wrapper);
enum {
CROSS_COMPARTMENT = 1 << 0,
@ -114,50 +114,50 @@ class JS_FRIEND_API(JSWrapper) : public js::JSProxyHandler {
};
/* Base class for all cross compartment wrapper handlers. */
class JS_FRIEND_API(JSCrossCompartmentWrapper) : public JSWrapper {
class JS_FRIEND_API(CrossCompartmentWrapper) : public Wrapper
{
public:
JSCrossCompartmentWrapper(uintN flags);
CrossCompartmentWrapper(uintN flags);
virtual ~JSCrossCompartmentWrapper();
virtual ~CrossCompartmentWrapper();
/* ES5 Harmony fundamental wrapper traps. */
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set,
js::PropertyDescriptor *desc);
PropertyDescriptor *desc);
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id, bool set,
js::PropertyDescriptor *desc);
PropertyDescriptor *desc);
virtual bool defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
js::PropertyDescriptor *desc);
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *wrapper, js::AutoIdVector &props);
PropertyDescriptor *desc);
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *wrapper, AutoIdVector &props);
virtual bool delete_(JSContext *cx, JSObject *wrapper, jsid id, bool *bp);
virtual bool enumerate(JSContext *cx, JSObject *wrapper, js::AutoIdVector &props);
virtual bool enumerate(JSContext *cx, JSObject *wrapper, AutoIdVector &props);
/* ES5 Harmony derived wrapper traps. */
virtual bool has(JSContext *cx, JSObject *wrapper, jsid id, bool *bp);
virtual bool hasOwn(JSContext *cx, JSObject *wrapper, jsid id, bool *bp);
virtual bool get(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id, js::Value *vp);
virtual bool get(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id, Value *vp);
virtual bool set(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id, bool strict,
js::Value *vp);
virtual bool keys(JSContext *cx, JSObject *wrapper, js::AutoIdVector &props);
virtual bool iterate(JSContext *cx, JSObject *wrapper, uintN flags, js::Value *vp);
Value *vp);
virtual bool keys(JSContext *cx, JSObject *wrapper, AutoIdVector &props);
virtual bool iterate(JSContext *cx, JSObject *wrapper, uintN flags, Value *vp);
/* Spidermonkey extensions. */
virtual bool call(JSContext *cx, JSObject *wrapper, uintN argc, js::Value *vp);
virtual bool construct(JSContext *cx, JSObject *wrapper,
uintN argc, js::Value *argv, js::Value *rval);
virtual bool hasInstance(JSContext *cx, JSObject *wrapper, const js::Value *vp, bool *bp);
virtual bool call(JSContext *cx, JSObject *wrapper, uintN argc, Value *vp);
virtual bool construct(JSContext *cx, JSObject *wrapper, uintN argc, Value *argv, Value *rval);
virtual bool hasInstance(JSContext *cx, JSObject *wrapper, const Value *vp, bool *bp);
virtual JSString *obj_toString(JSContext *cx, JSObject *wrapper);
virtual JSString *fun_toString(JSContext *cx, JSObject *wrapper, uintN indent);
virtual bool defaultValue(JSContext *cx, JSObject *wrapper, JSType hint, js::Value *vp);
virtual bool defaultValue(JSContext *cx, JSObject *wrapper, JSType hint, Value *vp);
virtual void trace(JSTracer *trc, JSObject *wrapper);
static JSCrossCompartmentWrapper singleton;
static CrossCompartmentWrapper singleton;
};
namespace js {
// A hacky class that lets a friend force a fake frame. We must already be
// in the compartment of |target| when we enter the forced frame.
/*
* A hacky class that lets a friend force a fake frame. We must already be
* in the compartment of |target| when we enter the forced frame.
*/
class JS_FRIEND_API(ForceFrame)
{
public:
@ -201,7 +201,8 @@ class AutoCompartment
* the exception happens to be an Error object, copy it to the origin compartment
* instead of wrapping it.
*/
class ErrorCopier {
class ErrorCopier
{
AutoCompartment &ac;
JSObject *scope;
@ -218,6 +219,4 @@ TransparentObjectWrapper(JSContext *cx, JSObject *obj, JSObject *wrappedProto, J
}
JS_END_EXTERN_C
#endif

View File

@ -3018,7 +3018,7 @@ EvalInContext(JSContext *cx, uintN argc, jsval *vp)
JSAutoEnterCompartment ac;
uintN flags;
JSObject *unwrapped = sobj->unwrap(&flags);
if (flags & JSWrapper::CROSS_COMPARTMENT) {
if (flags & Wrapper::CROSS_COMPARTMENT) {
sobj = unwrapped;
if (!ac.enter(cx, sobj))
return false;
@ -3162,7 +3162,7 @@ CopyProperty(JSContext *cx, JSObject *obj, JSObject *referent, jsid id,
propFlags = shape->getFlags();
} else if (referent->isProxy()) {
PropertyDescriptor desc;
if (!JSProxy::getOwnPropertyDescriptor(cx, referent, id, false, &desc))
if (!Proxy::getOwnPropertyDescriptor(cx, referent, id, false, &desc))
return false;
if (!desc.obj)
return true;
@ -4006,8 +4006,8 @@ Wrap(JSContext *cx, uintN argc, jsval *vp)
}
JSObject *obj = JSVAL_TO_OBJECT(v);
JSObject *wrapped = JSWrapper::New(cx, obj, obj->getProto(), obj->getGlobal(),
&JSWrapper::singleton);
JSObject *wrapped = Wrapper::New(cx, obj, obj->getProto(), obj->getGlobal(),
&Wrapper::singleton);
if (!wrapped)
return false;

View File

@ -51,6 +51,8 @@
#include "jsfriendapi.h"
using namespace js;
namespace xpc {
nsIPrincipal *
@ -280,15 +282,15 @@ AccessCheck::documentDomainMakesSameOrigin(JSContext *cx, JSObject *obj)
bool
AccessCheck::isCrossOriginAccessPermitted(JSContext *cx, JSObject *wrapper, jsid id,
JSWrapper::Action act)
Wrapper::Action act)
{
if (!XPCWrapper::GetSecurityManager())
return true;
if (act == JSWrapper::CALL)
if (act == Wrapper::CALL)
return true;
JSObject *obj = JSWrapper::wrappedObject(wrapper);
JSObject *obj = Wrapper::wrappedObject(wrapper);
const char *name;
js::Class *clasp = obj->getClass();
@ -299,7 +301,7 @@ AccessCheck::isCrossOriginAccessPermitted(JSContext *cx, JSObject *wrapper, jsid
name = clasp->name;
if (JSID_IS_ATOM(id)) {
if (IsPermitted(name, JSID_TO_FLAT_STRING(id), act == JSWrapper::SET))
if (IsPermitted(name, JSID_TO_FLAT_STRING(id), act == Wrapper::SET))
return true;
}
@ -311,7 +313,7 @@ AccessCheck::isCrossOriginAccessPermitted(JSContext *cx, JSObject *wrapper, jsid
if (!IsLocation(name) && documentDomainMakesSameOrigin(cx, obj))
return true;
return (act == JSWrapper::SET)
return (act == Wrapper::SET)
? nsContentUtils::IsCallerTrustedForWrite()
: nsContentUtils::IsCallerTrustedForRead();
}
@ -400,7 +402,7 @@ AccessCheck::isScriptAccessOnly(JSContext *cx, JSObject *wrapper)
}
// In addition, chrome objects can explicitly opt-in by setting .scriptOnly to true.
if (wrapper->getProxyHandler() == &FilteringWrapper<JSCrossCompartmentWrapper,
if (wrapper->getProxyHandler() == &FilteringWrapper<CrossCompartmentWrapper,
CrossOriginAccessiblePropertiesOnly>::singleton) {
jsid scriptOnlyId = GetRTIdByIndex(cx, XPCJSRuntime::IDX_SCRIPTONLY);
jsval scriptOnly;
@ -435,10 +437,10 @@ AccessCheck::deny(JSContext *cx, jsid id)
enum Access { READ = (1<<0), WRITE = (1<<1), NO_ACCESS = 0 };
static bool
Deny(JSContext *cx, jsid id, JSWrapper::Action act)
Deny(JSContext *cx, jsid id, Wrapper::Action act)
{
// Refuse to perform the action and just return the default value.
if (act == JSWrapper::GET)
if (act == Wrapper::GET)
return true;
// If its a set, deny it and throw an exception.
AccessCheck::deny(cx, id);
@ -446,7 +448,7 @@ Deny(JSContext *cx, jsid id, JSWrapper::Action act)
}
bool
PermitIfUniversalXPConnect(JSContext *cx, jsid id, JSWrapper::Action act,
PermitIfUniversalXPConnect(JSContext *cx, jsid id, Wrapper::Action act,
ExposedPropertiesOnly::Permission &perm)
{
// If UniversalXPConnect is enabled, allow access even if __exposedProps__ doesn't
@ -467,12 +469,12 @@ PermitIfUniversalXPConnect(JSContext *cx, jsid id, JSWrapper::Action act,
}
bool
ExposedPropertiesOnly::check(JSContext *cx, JSObject *wrapper, jsid id, JSWrapper::Action act,
ExposedPropertiesOnly::check(JSContext *cx, JSObject *wrapper, jsid id, Wrapper::Action act,
Permission &perm)
{
JSObject *wrappedObject = JSWrapper::wrappedObject(wrapper);
JSObject *wrappedObject = Wrapper::wrappedObject(wrapper);
if (act == JSWrapper::CALL) {
if (act == Wrapper::CALL) {
perm = PermitObjectAccess;
return true;
}
@ -576,8 +578,8 @@ ExposedPropertiesOnly::check(JSContext *cx, JSObject *wrapper, jsid id, JSWrappe
return false;
}
if ((act == JSWrapper::SET && !(access & WRITE)) ||
(act != JSWrapper::SET && !(access & READ))) {
if ((act == Wrapper::SET && !(access & WRITE)) ||
(act != Wrapper::SET && !(access & READ))) {
return PermitIfUniversalXPConnect(cx, id, act, perm); // Deny
}

View File

@ -53,7 +53,7 @@ class AccessCheck {
static bool isChrome(JSCompartment *compartment);
static nsIPrincipal *getPrincipal(JSCompartment *compartment);
static bool isCrossOriginAccessPermitted(JSContext *cx, JSObject *obj, jsid id,
JSWrapper::Action act);
js::Wrapper::Action act);
static bool isSystemOnlyAccessPermitted(JSContext *cx);
static bool isLocationObjectSameOrigin(JSContext *cx, JSObject *wrapper);
static bool documentDomainMakesSameOrigin(JSContext *cx, JSObject *obj);
@ -66,16 +66,16 @@ class AccessCheck {
};
struct Policy {
typedef JSWrapper::Permission Permission;
typedef js::Wrapper::Permission Permission;
static const Permission PermitObjectAccess = JSWrapper::PermitObjectAccess;
static const Permission PermitPropertyAccess = JSWrapper::PermitPropertyAccess;
static const Permission DenyAccess = JSWrapper::DenyAccess;
static const Permission PermitObjectAccess = js::Wrapper::PermitObjectAccess;
static const Permission PermitPropertyAccess = js::Wrapper::PermitPropertyAccess;
static const Permission DenyAccess = js::Wrapper::DenyAccess;
};
// This policy permits access to all properties.
struct Permissive : public Policy {
static bool check(JSContext *cx, JSObject *wrapper, jsid id, JSWrapper::Action act,
static bool check(JSContext *cx, JSObject *wrapper, jsid id, js::Wrapper::Action act,
Permission &perm) {
perm = PermitObjectAccess;
return true;
@ -85,7 +85,7 @@ struct Permissive : public Policy {
// This policy only permits access to the object if the subject can touch
// system objects.
struct OnlyIfSubjectIsSystem : public Policy {
static bool check(JSContext *cx, JSObject *wrapper, jsid id, JSWrapper::Action act,
static bool check(JSContext *cx, JSObject *wrapper, jsid id, js::Wrapper::Action act,
Permission &perm) {
if (AccessCheck::isSystemOnlyAccessPermitted(cx)) {
perm = PermitObjectAccess;
@ -103,7 +103,7 @@ struct OnlyIfSubjectIsSystem : public Policy {
// This policy only permits access to properties that are safe to be used
// across origins.
struct CrossOriginAccessiblePropertiesOnly : public Policy {
static bool check(JSContext *cx, JSObject *wrapper, jsid id, JSWrapper::Action act,
static bool check(JSContext *cx, JSObject *wrapper, jsid id, js::Wrapper::Action act,
Permission &perm) {
if (AccessCheck::isCrossOriginAccessPermitted(cx, wrapper, id, act)) {
perm = PermitPropertyAccess;
@ -121,7 +121,7 @@ struct CrossOriginAccessiblePropertiesOnly : public Policy {
// This policy only permits access to properties that are safe to be used
// across origins.
struct SameOriginOrCrossOriginAccessiblePropertiesOnly : public Policy {
static bool check(JSContext *cx, JSObject *wrapper, jsid id, JSWrapper::Action act,
static bool check(JSContext *cx, JSObject *wrapper, jsid id, js::Wrapper::Action act,
Permission &perm) {
if (AccessCheck::isCrossOriginAccessPermitted(cx, wrapper, id, act) ||
AccessCheck::isLocationObjectSameOrigin(cx, wrapper)) {
@ -140,7 +140,7 @@ struct SameOriginOrCrossOriginAccessiblePropertiesOnly : public Policy {
// This policy only permits access to properties if they appear in the
// objects exposed properties list.
struct ExposedPropertiesOnly : public Policy {
static bool check(JSContext *cx, JSObject *wrapper, jsid id, JSWrapper::Action act,
static bool check(JSContext *cx, JSObject *wrapper, jsid id, js::Wrapper::Action act,
Permission &perm);
};

View File

@ -47,7 +47,7 @@
namespace xpc {
NoWaiverWrapper::NoWaiverWrapper(uintN flags) : JSCrossCompartmentWrapper(flags)
NoWaiverWrapper::NoWaiverWrapper(uintN flags) : CrossCompartmentWrapper(flags)
{
}
@ -67,7 +67,7 @@ bool
CrossOriginWrapper::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, js::PropertyDescriptor *desc)
{
return JSCrossCompartmentWrapper::getPropertyDescriptor(cx, wrapper, id, set, desc) &&
return CrossCompartmentWrapper::getPropertyDescriptor(cx, wrapper, id, set, desc) &&
WrapperFactory::WaiveXrayAndWrap(cx, &desc->value);
}
@ -75,7 +75,7 @@ bool
CrossOriginWrapper::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
bool set, js::PropertyDescriptor *desc)
{
return JSCrossCompartmentWrapper::getOwnPropertyDescriptor(cx, wrapper, id, set, desc) &&
return CrossCompartmentWrapper::getOwnPropertyDescriptor(cx, wrapper, id, set, desc) &&
WrapperFactory::WaiveXrayAndWrap(cx, &desc->value);
}
@ -83,14 +83,14 @@ bool
CrossOriginWrapper::get(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id,
js::Value *vp)
{
return JSCrossCompartmentWrapper::get(cx, wrapper, receiver, id, vp) &&
return CrossCompartmentWrapper::get(cx, wrapper, receiver, id, vp) &&
WrapperFactory::WaiveXrayAndWrap(cx, vp);
}
bool
CrossOriginWrapper::call(JSContext *cx, JSObject *wrapper, uintN argc, js::Value *vp)
{
return JSCrossCompartmentWrapper::call(cx, wrapper, argc, vp) &&
return CrossCompartmentWrapper::call(cx, wrapper, argc, vp) &&
WrapperFactory::WaiveXrayAndWrap(cx, vp);
}
@ -98,7 +98,7 @@ bool
CrossOriginWrapper::construct(JSContext *cx, JSObject *wrapper,
uintN argc, js::Value *argv, js::Value *rval)
{
return JSCrossCompartmentWrapper::construct(cx, wrapper, argc, argv, rval) &&
return CrossCompartmentWrapper::construct(cx, wrapper, argc, argv, rval) &&
WrapperFactory::WaiveXrayAndWrap(cx, rval);
}
@ -111,7 +111,7 @@ NoWaiverWrapper::enter(JSContext *cx, JSObject *wrapper, jsid id, Action act, bo
return true;
}
// Note: By the time enter is called here, JSCrossCompartmentWrapper has
// Note: By the time enter is called here, CrossCompartmentWrapper has
// already pushed the fake stack frame onto cx. Because of this, the frame
// that we're clamping is the one that we want (the one in our compartment).
JSStackFrame *fp = NULL;

View File

@ -45,7 +45,7 @@
namespace xpc {
class NoWaiverWrapper : public JSCrossCompartmentWrapper {
class NoWaiverWrapper : public js::CrossCompartmentWrapper {
public:
NoWaiverWrapper(uintN flags);
virtual ~NoWaiverWrapper();

View File

@ -59,11 +59,11 @@ FilteringWrapper<Base, Policy>::~FilteringWrapper()
{
}
typedef JSWrapper::Permission Permission;
typedef Wrapper::Permission Permission;
static const Permission PermitObjectAccess = JSWrapper::PermitObjectAccess;
static const Permission PermitPropertyAccess = JSWrapper::PermitPropertyAccess;
static const Permission DenyAccess = JSWrapper::DenyAccess;
static const Permission PermitObjectAccess = Wrapper::PermitObjectAccess;
static const Permission PermitPropertyAccess = Wrapper::PermitPropertyAccess;
static const Permission DenyAccess = Wrapper::DenyAccess;
template <typename Policy>
static bool
@ -73,7 +73,7 @@ Filter(JSContext *cx, JSObject *wrapper, AutoIdVector &props)
for (size_t n = 0; n < props.length(); ++n) {
jsid id = props[n];
Permission perm;
if (!Policy::check(cx, wrapper, id, JSWrapper::GET, perm))
if (!Policy::check(cx, wrapper, id, Wrapper::GET, perm))
return false; // Error
if (perm != DenyAccess)
props[w++] = id;
@ -114,13 +114,13 @@ FilteringWrapper<Base, Policy>::iterate(JSContext *cx, JSObject *wrapper, uintN
// we don't know how to censor custom iterator objects. Instead we trigger
// the default proxy iterate trap, which will ask enumerate() for the list
// of (consored) ids.
return JSProxyHandler::iterate(cx, wrapper, flags, vp);
return js::ProxyHandler::iterate(cx, wrapper, flags, vp);
}
template <typename Base, typename Policy>
bool
FilteringWrapper<Base, Policy>::enter(JSContext *cx, JSObject *wrapper, jsid id,
JSWrapper::Action act, bool *bp)
Wrapper::Action act, bool *bp)
{
Permission perm;
if (!Policy::check(cx, wrapper, id, act, perm)) {
@ -133,15 +133,15 @@ FilteringWrapper<Base, Policy>::enter(JSContext *cx, JSObject *wrapper, jsid id,
return Base::enter(cx, wrapper, id, act, bp);
}
#define SOW FilteringWrapper<JSCrossCompartmentWrapper, OnlyIfSubjectIsSystem>
#define SCSOW FilteringWrapper<JSWrapper, OnlyIfSubjectIsSystem>
#define COW FilteringWrapper<JSCrossCompartmentWrapper, ExposedPropertiesOnly>
#define XOW FilteringWrapper<XrayWrapper<JSCrossCompartmentWrapper>, \
#define SOW FilteringWrapper<CrossCompartmentWrapper, OnlyIfSubjectIsSystem>
#define SCSOW FilteringWrapper<Wrapper, OnlyIfSubjectIsSystem>
#define COW FilteringWrapper<CrossCompartmentWrapper, ExposedPropertiesOnly>
#define XOW FilteringWrapper<XrayWrapper<CrossCompartmentWrapper>, \
CrossOriginAccessiblePropertiesOnly>
#define NNXOW FilteringWrapper<JSCrossCompartmentWrapper, CrossOriginAccessiblePropertiesOnly>
#define LW FilteringWrapper<XrayWrapper<JSWrapper>, \
#define NNXOW FilteringWrapper<CrossCompartmentWrapper, CrossOriginAccessiblePropertiesOnly>
#define LW FilteringWrapper<XrayWrapper<Wrapper>, \
SameOriginOrCrossOriginAccessiblePropertiesOnly>
#define XLW FilteringWrapper<XrayWrapper<JSCrossCompartmentWrapper>, \
#define XLW FilteringWrapper<XrayWrapper<CrossCompartmentWrapper>, \
SameOriginOrCrossOriginAccessiblePropertiesOnly>
template<> SOW SOW::singleton(WrapperFactory::SCRIPT_ACCESS_ONLY_FLAG |

View File

@ -53,7 +53,7 @@ class FilteringWrapper : public Base {
virtual bool keys(JSContext *cx, JSObject *wrapper, js::AutoIdVector &props);
virtual bool iterate(JSContext *cx, JSObject *proxy, uintN flags, js::Value *vp);
virtual bool enter(JSContext *cx, JSObject *wrapper, jsid id, JSWrapper::Action act, bool *bp);
virtual bool enter(JSContext *cx, JSObject *wrapper, jsid id, js::Wrapper::Action act, bool *bp);
static FilteringWrapper singleton;
};

View File

@ -49,6 +49,8 @@
#include "xpcprivate.h"
#include "xpcmaps.h"
using namespace js;
namespace xpc {
// When chrome pulls a naked property across the membrane using
@ -58,7 +60,7 @@ namespace xpc {
// transparent wrapper in the origin (non-chrome) compartment. When
// an object with that special wrapper applied crosses into chrome,
// we know to not apply an X-ray wrapper.
JSWrapper WaiveXrayWrapperWrapper(WrapperFactory::WAIVE_XRAY_WRAPPER_FLAG);
Wrapper WaiveXrayWrapperWrapper(WrapperFactory::WAIVE_XRAY_WRAPPER_FLAG);
// Objects that haven't been explicitly waived, but have been exposed
// to chrome don't want a CrossOriginWrapper, since that deeply-waives
@ -112,8 +114,8 @@ WrapperFactory::WaiveXray(JSContext *cx, JSObject *obj)
JSAutoEnterCompartment ac;
if (!ac.enter(cx, obj) || !JS_WrapObject(cx, &proto))
return nsnull;
wobj = JSWrapper::New(cx, obj, proto, JS_GetGlobalForObject(cx, obj),
&WaiveXrayWrapperWrapper);
wobj = Wrapper::New(cx, obj, proto, JS_GetGlobalForObject(cx, obj),
&WaiveXrayWrapperWrapper);
if (!wobj)
return nsnull;
@ -263,12 +265,12 @@ WrapperFactory::Rewrap(JSContext *cx, JSObject *obj, JSObject *wrappedProto, JSO
JSCompartment *target = cx->compartment;
JSObject *xrayHolder = nsnull;
JSWrapper *wrapper;
Wrapper *wrapper;
CompartmentPrivate *targetdata =
static_cast<CompartmentPrivate *>(JS_GetCompartmentPrivate(cx, target));
if (AccessCheck::isChrome(target)) {
if (AccessCheck::isChrome(origin)) {
wrapper = &JSCrossCompartmentWrapper::singleton;
wrapper = &CrossCompartmentWrapper::singleton;
} else {
bool isSystem;
{
@ -281,7 +283,7 @@ WrapperFactory::Rewrap(JSContext *cx, JSObject *obj, JSObject *wrappedProto, JSO
}
if (isSystem) {
wrapper = &JSCrossCompartmentWrapper::singleton;
wrapper = &CrossCompartmentWrapper::singleton;
} else if (flags & WAIVE_XRAY_WRAPPER_FLAG) {
// If we waived the X-ray wrapper for this object, wrap it into a
// special wrapper to transitively maintain the X-ray waiver.
@ -289,7 +291,7 @@ WrapperFactory::Rewrap(JSContext *cx, JSObject *obj, JSObject *wrappedProto, JSO
} else {
// Native objects must be wrapped into an X-ray wrapper.
if (IS_WN_WRAPPER(obj) || obj->getClass()->ext.innerObject) {
typedef XrayWrapper<JSCrossCompartmentWrapper> Xray;
typedef XrayWrapper<CrossCompartmentWrapper> Xray;
wrapper = &Xray::singleton;
xrayHolder = Xray::createHolder(cx, obj, parent);
if (!xrayHolder)
@ -312,31 +314,31 @@ WrapperFactory::Rewrap(JSContext *cx, JSObject *obj, JSObject *wrappedProto, JSO
if (targetdata &&
(wn = GetWrappedNative(cx, obj)) &&
wn->HasProto() && wn->GetProto()->ClassIsDOMObject()) {
typedef XrayWrapper<JSCrossCompartmentWrapper> Xray;
typedef XrayWrapper<CrossCompartmentWrapper> Xray;
wrapper = &FilteringWrapper<Xray,
CrossOriginAccessiblePropertiesOnly>::singleton;
xrayHolder = Xray::createHolder(cx, obj, parent);
if (!xrayHolder)
return nsnull;
} else {
wrapper = &FilteringWrapper<JSCrossCompartmentWrapper,
wrapper = &FilteringWrapper<CrossCompartmentWrapper,
ExposedPropertiesOnly>::singleton;
}
} else if (AccessCheck::isSameOrigin(origin, target)) {
// Same origin we use a transparent wrapper, unless the compartment asks
// for an Xray or the wrapper needs a SOW.
if (AccessCheck::needsSystemOnlyWrapper(obj)) {
wrapper = &FilteringWrapper<JSCrossCompartmentWrapper,
wrapper = &FilteringWrapper<CrossCompartmentWrapper,
OnlyIfSubjectIsSystem>::singleton;
} else if (targetdata && targetdata->wantXrays &&
(IS_WN_WRAPPER(obj) || obj->getClass()->ext.innerObject)) {
typedef XrayWrapper<JSCrossCompartmentWrapper> Xray;
typedef XrayWrapper<CrossCompartmentWrapper> Xray;
wrapper = &Xray::singleton;
xrayHolder = Xray::createHolder(cx, obj, parent);
if (!xrayHolder)
return nsnull;
} else {
wrapper = &JSCrossCompartmentWrapper::singleton;
wrapper = &CrossCompartmentWrapper::singleton;
}
} else {
NS_ASSERTION(!AccessCheck::needsSystemOnlyWrapper(obj),
@ -347,10 +349,10 @@ WrapperFactory::Rewrap(JSContext *cx, JSObject *obj, JSObject *wrappedProto, JSO
// (.wrappedJSObject) which allows bypassing the XrayWrapper, but
// we filter out access to that property.
if (!IS_WN_WRAPPER(obj) && !obj->getClass()->ext.innerObject) {
wrapper = &FilteringWrapper<JSCrossCompartmentWrapper,
wrapper = &FilteringWrapper<CrossCompartmentWrapper,
CrossOriginAccessiblePropertiesOnly>::singleton;
} else {
typedef XrayWrapper<JSCrossCompartmentWrapper> Xray;
typedef XrayWrapper<CrossCompartmentWrapper> Xray;
// Location objects can become same origin after navigation, so we might
// have to grant transparent access later on.
@ -368,7 +370,7 @@ WrapperFactory::Rewrap(JSContext *cx, JSObject *obj, JSObject *wrappedProto, JSO
}
}
JSObject *wrapperObj = JSWrapper::New(cx, obj, wrappedProto, parent, wrapper);
JSObject *wrapperObj = Wrapper::New(cx, obj, wrappedProto, parent, wrapper);
if (!wrapperObj || !xrayHolder)
return wrapperObj;
@ -378,7 +380,7 @@ WrapperFactory::Rewrap(JSContext *cx, JSObject *obj, JSObject *wrappedProto, JSO
return wrapperObj;
}
typedef FilteringWrapper<XrayWrapper<JSWrapper>,
typedef FilteringWrapper<XrayWrapper<Wrapper>,
SameOriginOrCrossOriginAccessiblePropertiesOnly> LW;
bool
@ -394,8 +396,8 @@ WrapperFactory::WrapLocationObject(JSContext *cx, JSObject *obj)
JSObject *xrayHolder = LW::createHolder(cx, obj, obj->getParent());
if (!xrayHolder)
return nsnull;
JSObject *wrapperObj = JSWrapper::New(cx, obj, obj->getProto(), obj->getParent(),
&LW::singleton);
JSObject *wrapperObj = Wrapper::New(cx, obj, obj->getProto(), obj->getParent(),
&LW::singleton);
if (!wrapperObj)
return nsnull;
wrapperObj->setProxyExtra(js::ObjectValue(*xrayHolder));
@ -431,9 +433,9 @@ JSObject *
WrapperFactory::WrapSOWObject(JSContext *cx, JSObject *obj)
{
JSObject *wrapperObj =
JSWrapper::New(cx, obj, JS_GetPrototype(cx, obj), JS_GetGlobalForObject(cx, obj),
&FilteringWrapper<JSWrapper,
OnlyIfSubjectIsSystem>::singleton);
Wrapper::New(cx, obj, JS_GetPrototype(cx, obj), JS_GetGlobalForObject(cx, obj),
&FilteringWrapper<Wrapper,
OnlyIfSubjectIsSystem>::singleton);
return wrapperObj;
}

View File

@ -44,7 +44,7 @@ namespace xpc {
class WrapperFactory {
public:
enum { WAIVE_XRAY_WRAPPER_FLAG = JSWrapper::LAST_USED_FLAG << 1,
enum { WAIVE_XRAY_WRAPPER_FLAG = js::Wrapper::LAST_USED_FLAG << 1,
IS_XRAY_WRAPPER_FLAG = WAIVE_XRAY_WRAPPER_FLAG << 1,
SCRIPT_ACCESS_ONLY_FLAG = IS_XRAY_WRAPPER_FLAG << 1,
PARTIALLY_TRANSPARENT = SCRIPT_ACCESS_ONLY_FLAG << 1,
@ -99,6 +99,6 @@ class WrapperFactory {
static JSObject *WrapSOWObject(JSContext *cx, JSObject *obj);
};
extern JSWrapper WaiveXrayWrapperWrapper;
extern js::Wrapper WaiveXrayWrapperWrapper;
}

View File

@ -187,7 +187,7 @@ static inline JSObject *
FindWrapper(JSObject *wrapper)
{
while (!wrapper->isWrapper() ||
!(JSWrapper::wrapperHandler(wrapper)->flags() & WrapperFactory::IS_XRAY_WRAPPER_FLAG)) {
!(Wrapper::wrapperHandler(wrapper)->flags() & WrapperFactory::IS_XRAY_WRAPPER_FLAG)) {
wrapper = wrapper->getProto();
// NB: we must eventually hit our wrapper.
}
@ -565,7 +565,7 @@ XrayWrapper<Base>::resolveOwnProperty(JSContext *cx, JSObject *wrapper, jsid id,
Is<nsIDocument>(wrapper))) &&
IsPrivilegedScript())) {
bool status;
JSWrapper::Action action = set ? JSWrapper::SET : JSWrapper::GET;
Wrapper::Action action = set ? Wrapper::SET : Wrapper::GET;
desc->obj = NULL; // default value
if (!this->enter(cx, wrapper, id, action, &status))
return status;
@ -659,7 +659,7 @@ XrayWrapper<Base>::getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid
}
bool status;
JSWrapper::Action action = set ? JSWrapper::SET : JSWrapper::GET;
Wrapper::Action action = set ? Wrapper::SET : Wrapper::GET;
desc->obj = NULL; // default value
if (!this->enter(cx, wrapper, id, action, &status))
return status;
@ -727,7 +727,7 @@ XrayWrapper<Base>::getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, js
}
bool status;
JSWrapper::Action action = set ? JSWrapper::SET : JSWrapper::GET;
Wrapper::Action action = set ? Wrapper::SET : Wrapper::GET;
desc->obj = NULL; // default value
if (!this->enter(cx, wrapper, id, action, &status))
return status;
@ -921,10 +921,10 @@ bool
XrayWrapper<Base>::get(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id,
js::Value *vp)
{
// Skip our Base if it isn't already JSProxyHandler.
// Skip our Base if it isn't already ProxyHandler.
// NB: None of the functions we call are prepared for the receiver not
// being the wrapper, so ignore the receiver here.
return JSProxyHandler::get(cx, wrapper, wrapper, id, vp);
return ProxyHandler::get(cx, wrapper, wrapper, id, vp);
}
template <typename Base>
@ -932,42 +932,42 @@ bool
XrayWrapper<Base>::set(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id,
bool strict, js::Value *vp)
{
// Skip our Base if it isn't already JSProxyHandler.
// Skip our Base if it isn't already ProxyHandler.
// NB: None of the functions we call are prepared for the receiver not
// being the wrapper, so ignore the receiver here.
return JSProxyHandler::set(cx, wrapper, wrapper, id, strict, vp);
return ProxyHandler::set(cx, wrapper, wrapper, id, strict, vp);
}
template <typename Base>
bool
XrayWrapper<Base>::has(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
{
// Skip our Base if it isn't already JSProxyHandler.
return JSProxyHandler::has(cx, wrapper, id, bp);
// Skip our Base if it isn't already ProxyHandler.
return ProxyHandler::has(cx, wrapper, id, bp);
}
template <typename Base>
bool
XrayWrapper<Base>::hasOwn(JSContext *cx, JSObject *wrapper, jsid id, bool *bp)
{
// Skip our Base if it isn't already JSProxyHandler.
return JSProxyHandler::hasOwn(cx, wrapper, id, bp);
// Skip our Base if it isn't already ProxyHandler.
return ProxyHandler::hasOwn(cx, wrapper, id, bp);
}
template <typename Base>
bool
XrayWrapper<Base>::keys(JSContext *cx, JSObject *wrapper, js::AutoIdVector &props)
{
// Skip our Base if it isn't already JSProxyHandler.
return JSProxyHandler::keys(cx, wrapper, props);
// Skip our Base if it isn't already ProxyHandler.
return ProxyHandler::keys(cx, wrapper, props);
}
template <typename Base>
bool
XrayWrapper<Base>::iterate(JSContext *cx, JSObject *wrapper, uintN flags, js::Value *vp)
{
// Skip our Base if it isn't already JSProxyHandler.
return JSProxyHandler::iterate(cx, wrapper, flags, vp);
// Skip our Base if it isn't already ProxyHandler.
return ProxyHandler::iterate(cx, wrapper, flags, vp);
}
template <typename Base>
@ -1053,8 +1053,8 @@ XrayWrapper<Base>::createHolder(JSContext *cx, JSObject *wrappedNative, JSObject
return holder;
}
#define XPCNW XrayWrapper<JSCrossCompartmentWrapper>
#define SCNW XrayWrapper<JSWrapper>
#define XPCNW XrayWrapper<CrossCompartmentWrapper>
#define SCNW XrayWrapper<Wrapper>
template <> XPCNW XPCNW::singleton(0);
template <> SCNW SCNW::singleton(0);

View File

@ -43,7 +43,7 @@
// Xray wrappers re-resolve the original native properties on the native
// object and always directly access to those properties.
// Because they work so differently from the rest of the wrapper hierarchy,
// we pull them out of the JSWrapper inheritance hierarchy and create a
// we pull them out of the Wrapper inheritance hierarchy and create a
// little world around them.
namespace xpc {