mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
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:
parent
bd4295528f
commit
7ff16e4820
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -156,6 +156,11 @@ struct TokenPos;
|
||||
struct TokenPtr;
|
||||
class UpvarCookie;
|
||||
|
||||
class Proxy;
|
||||
class ProxyHandler;
|
||||
class Wrapper;
|
||||
class CrossCompartmentWrapper;
|
||||
|
||||
class TempAllocPolicy;
|
||||
class RuntimeAllocPolicy;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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 ∾
|
||||
JSObject *scope;
|
||||
|
||||
@ -218,6 +219,4 @@ TransparentObjectWrapper(JSContext *cx, JSObject *obj, JSObject *wrappedProto, J
|
||||
|
||||
}
|
||||
|
||||
JS_END_EXTERN_C
|
||||
|
||||
#endif
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
|
@ -45,7 +45,7 @@
|
||||
|
||||
namespace xpc {
|
||||
|
||||
class NoWaiverWrapper : public JSCrossCompartmentWrapper {
|
||||
class NoWaiverWrapper : public js::CrossCompartmentWrapper {
|
||||
public:
|
||||
NoWaiverWrapper(uintN flags);
|
||||
virtual ~NoWaiverWrapper();
|
||||
|
@ -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 |
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user