Changeset View
Changeset View
Standalone View
Standalone View
libraries/source/spidermonkey/include-win32-debug/jswrapper.h
Show All 38 Lines | public: | ||||
} | } | ||||
private: | private: | ||||
mozilla::Maybe<JS::RootedObject> proto_; | mozilla::Maybe<JS::RootedObject> proto_; | ||||
}; | }; | ||||
/* | /* | ||||
* A wrapper is a proxy with a target object to which it generally forwards | * A wrapper is a proxy with a target object to which it generally forwards | ||||
* operations, but may restrict access to certain operations or instrument the | * operations, but may restrict access to certain operations or augment those | ||||
* methods in various ways. A wrapper is distinct from a Direct Proxy Handler | * operations in various ways. | ||||
* in the sense that it can be "unwrapped" in C++, exposing the underlying | * | ||||
* object (Direct Proxy Handlers have an underlying target object, but don't | * A wrapper can be "unwrapped" in C++, exposing the underlying object. | ||||
* expect to expose this object via any kind of unwrapping operation). Callers | * Callers should be careful to avoid unwrapping security wrappers in the wrong | ||||
* should be careful to avoid unwrapping security wrappers in the wrong | |||||
* context. | * context. | ||||
* | |||||
* Important: If you add a method implementation here, you probably also need | |||||
* to add an override in CrossCompartmentWrapper. If you don't, you risk | |||||
* compartment mismatches. See bug 945826 comment 0. | |||||
*/ | */ | ||||
class JS_FRIEND_API(Wrapper) : public DirectProxyHandler | class JS_FRIEND_API(Wrapper) : public BaseProxyHandler | ||||
{ | { | ||||
unsigned mFlags; | unsigned mFlags; | ||||
public: | public: | ||||
explicit constexpr Wrapper(unsigned aFlags, bool aHasPrototype = false, | |||||
bool aHasSecurityPolicy = false) | |||||
: BaseProxyHandler(&family, aHasPrototype, aHasSecurityPolicy), | |||||
mFlags(aFlags) | |||||
{ } | |||||
virtual bool finalizeInBackground(const Value& priv) const override; | |||||
/* Standard internal methods. */ | |||||
virtual bool getOwnPropertyDescriptor(JSContext* cx, HandleObject proxy, HandleId id, | |||||
MutableHandle<PropertyDescriptor> desc) const override; | |||||
virtual bool defineProperty(JSContext* cx, HandleObject proxy, HandleId id, | |||||
Handle<PropertyDescriptor> desc, | |||||
ObjectOpResult& result) const override; | |||||
virtual bool ownPropertyKeys(JSContext* cx, HandleObject proxy, | |||||
AutoIdVector& props) const override; | |||||
virtual bool delete_(JSContext* cx, HandleObject proxy, HandleId id, | |||||
ObjectOpResult& result) const override; | |||||
virtual bool enumerate(JSContext* cx, HandleObject proxy, | |||||
MutableHandleObject objp) const override; | |||||
virtual bool getPrototype(JSContext* cx, HandleObject proxy, | |||||
MutableHandleObject protop) const override; | |||||
virtual bool setPrototype(JSContext* cx, HandleObject proxy, HandleObject proto, | |||||
ObjectOpResult& result) const override; | |||||
virtual bool getPrototypeIfOrdinary(JSContext* cx, HandleObject proxy, bool* isOrdinary, | |||||
MutableHandleObject protop) const override; | |||||
virtual bool setImmutablePrototype(JSContext* cx, HandleObject proxy, | |||||
bool* succeeded) const override; | |||||
virtual bool preventExtensions(JSContext* cx, HandleObject proxy, | |||||
ObjectOpResult& result) const override; | |||||
virtual bool isExtensible(JSContext* cx, HandleObject proxy, bool* extensible) const override; | |||||
virtual bool has(JSContext* cx, HandleObject proxy, HandleId id, | |||||
bool* bp) const override; | |||||
virtual bool get(JSContext* cx, HandleObject proxy, HandleValue receiver, | |||||
HandleId id, MutableHandleValue vp) const override; | |||||
virtual bool set(JSContext* cx, HandleObject proxy, HandleId id, HandleValue v, | |||||
HandleValue receiver, ObjectOpResult& result) const override; | |||||
virtual bool call(JSContext* cx, HandleObject proxy, const CallArgs& args) const override; | |||||
virtual bool construct(JSContext* cx, HandleObject proxy, const CallArgs& args) const override; | |||||
/* SpiderMonkey extensions. */ | |||||
virtual bool getPropertyDescriptor(JSContext* cx, HandleObject proxy, HandleId id, | |||||
MutableHandle<PropertyDescriptor> desc) const override; | |||||
virtual bool hasOwn(JSContext* cx, HandleObject proxy, HandleId id, | |||||
bool* bp) const override; | |||||
virtual bool getOwnEnumerablePropertyKeys(JSContext* cx, HandleObject proxy, | |||||
AutoIdVector& props) const override; | |||||
virtual bool nativeCall(JSContext* cx, IsAcceptableThis test, NativeImpl impl, | |||||
const CallArgs& args) const override; | |||||
virtual bool hasInstance(JSContext* cx, HandleObject proxy, MutableHandleValue v, | |||||
bool* bp) const override; | |||||
virtual bool getBuiltinClass(JSContext* cx, HandleObject proxy, ESClass* cls) const override; | |||||
virtual bool isArray(JSContext* cx, HandleObject proxy, | |||||
JS::IsArrayAnswer* answer) const override; | |||||
virtual const char* className(JSContext* cx, HandleObject proxy) const override; | |||||
virtual JSString* fun_toString(JSContext* cx, HandleObject proxy, | |||||
unsigned indent) const override; | |||||
virtual bool regexp_toShared(JSContext* cx, HandleObject proxy, | |||||
RegExpGuard* g) const override; | |||||
virtual bool boxedValue_unbox(JSContext* cx, HandleObject proxy, | |||||
MutableHandleValue vp) const override; | |||||
virtual bool isCallable(JSObject* obj) const override; | |||||
virtual bool isConstructor(JSObject* obj) const override; | |||||
virtual JSObject* weakmapKeyDelegate(JSObject* proxy) const override; | |||||
public: | |||||
using BaseProxyHandler::Action; | using BaseProxyHandler::Action; | ||||
enum Flags { | enum Flags { | ||||
CROSS_COMPARTMENT = 1 << 0, | CROSS_COMPARTMENT = 1 << 0, | ||||
LAST_USED_FLAG = CROSS_COMPARTMENT | LAST_USED_FLAG = CROSS_COMPARTMENT | ||||
}; | }; | ||||
static JSObject* New(JSContext* cx, JSObject* obj, const Wrapper* handler, | static JSObject* New(JSContext* cx, JSObject* obj, const Wrapper* handler, | ||||
const WrapperOptions& options = WrapperOptions()); | const WrapperOptions& options = WrapperOptions()); | ||||
static JSObject* Renew(JSContext* cx, JSObject* existing, JSObject* obj, const Wrapper* handler); | static JSObject* Renew(JSContext* cx, JSObject* existing, JSObject* obj, const Wrapper* handler); | ||||
static const Wrapper* wrapperHandler(JSObject* wrapper); | static const Wrapper* wrapperHandler(JSObject* wrapper); | ||||
static JSObject* wrappedObject(JSObject* wrapper); | static JSObject* wrappedObject(JSObject* wrapper); | ||||
unsigned flags() const { | unsigned flags() const { | ||||
return mFlags; | return mFlags; | ||||
} | } | ||||
explicit MOZ_CONSTEXPR Wrapper(unsigned aFlags, bool aHasPrototype = false, | |||||
bool aHasSecurityPolicy = false) | |||||
: DirectProxyHandler(&family, aHasPrototype, aHasSecurityPolicy), | |||||
mFlags(aFlags) | |||||
{ } | |||||
virtual bool finalizeInBackground(Value priv) const override; | |||||
virtual bool isConstructor(JSObject* obj) const override; | |||||
static const char family; | static const char family; | ||||
static const Wrapper singleton; | static const Wrapper singleton; | ||||
static const Wrapper singletonWithPrototype; | static const Wrapper singletonWithPrototype; | ||||
static JSObject* defaultProto; | static JSObject* defaultProto; | ||||
}; | }; | ||||
inline JSObject* | inline JSObject* | ||||
WrapperOptions::proto() const | WrapperOptions::proto() const | ||||
{ | { | ||||
return proto_ ? *proto_ : Wrapper::defaultProto; | return proto_ ? *proto_ : Wrapper::defaultProto; | ||||
} | } | ||||
/* Base class for all cross compartment wrapper handlers. */ | /* Base class for all cross compartment wrapper handlers. */ | ||||
class JS_FRIEND_API(CrossCompartmentWrapper) : public Wrapper | class JS_FRIEND_API(CrossCompartmentWrapper) : public Wrapper | ||||
{ | { | ||||
public: | public: | ||||
explicit MOZ_CONSTEXPR CrossCompartmentWrapper(unsigned aFlags, bool aHasPrototype = false, | explicit constexpr CrossCompartmentWrapper(unsigned aFlags, bool aHasPrototype = false, | ||||
bool aHasSecurityPolicy = false) | bool aHasSecurityPolicy = false) | ||||
: Wrapper(CROSS_COMPARTMENT | aFlags, aHasPrototype, aHasSecurityPolicy) | : Wrapper(CROSS_COMPARTMENT | aFlags, aHasPrototype, aHasSecurityPolicy) | ||||
{ } | { } | ||||
/* Standard internal methods. */ | /* Standard internal methods. */ | ||||
virtual bool getOwnPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id, | virtual bool getOwnPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id, | ||||
MutableHandle<JSPropertyDescriptor> desc) const override; | MutableHandle<PropertyDescriptor> desc) const override; | ||||
virtual bool defineProperty(JSContext* cx, HandleObject wrapper, HandleId id, | virtual bool defineProperty(JSContext* cx, HandleObject wrapper, HandleId id, | ||||
Handle<JSPropertyDescriptor> desc, | Handle<PropertyDescriptor> desc, | ||||
ObjectOpResult& result) const override; | ObjectOpResult& result) const override; | ||||
virtual bool ownPropertyKeys(JSContext* cx, HandleObject wrapper, | virtual bool ownPropertyKeys(JSContext* cx, HandleObject wrapper, | ||||
AutoIdVector& props) const override; | AutoIdVector& props) const override; | ||||
virtual bool delete_(JSContext* cx, HandleObject wrapper, HandleId id, | virtual bool delete_(JSContext* cx, HandleObject wrapper, HandleId id, | ||||
ObjectOpResult& result) const override; | ObjectOpResult& result) const override; | ||||
virtual bool enumerate(JSContext* cx, HandleObject wrapper, MutableHandleObject objp) const override; | virtual bool enumerate(JSContext* cx, HandleObject wrapper, MutableHandleObject objp) const override; | ||||
virtual bool getPrototype(JSContext* cx, HandleObject proxy, | virtual bool getPrototype(JSContext* cx, HandleObject proxy, | ||||
MutableHandleObject protop) const override; | MutableHandleObject protop) const override; | ||||
virtual bool setPrototype(JSContext* cx, HandleObject proxy, HandleObject proto, | virtual bool setPrototype(JSContext* cx, HandleObject proxy, HandleObject proto, | ||||
ObjectOpResult& result) const override; | ObjectOpResult& result) const override; | ||||
virtual bool getPrototypeIfOrdinary(JSContext* cx, HandleObject proxy, bool* isOrdinary, | |||||
MutableHandleObject protop) const override; | |||||
virtual bool setImmutablePrototype(JSContext* cx, HandleObject proxy, | virtual bool setImmutablePrototype(JSContext* cx, HandleObject proxy, | ||||
bool* succeeded) const override; | bool* succeeded) const override; | ||||
virtual bool preventExtensions(JSContext* cx, HandleObject wrapper, | virtual bool preventExtensions(JSContext* cx, HandleObject wrapper, | ||||
ObjectOpResult& result) const override; | ObjectOpResult& result) const override; | ||||
virtual bool isExtensible(JSContext* cx, HandleObject wrapper, bool* extensible) const override; | virtual bool isExtensible(JSContext* cx, HandleObject wrapper, bool* extensible) const override; | ||||
virtual bool has(JSContext* cx, HandleObject wrapper, HandleId id, bool* bp) const override; | virtual bool has(JSContext* cx, HandleObject wrapper, HandleId id, bool* bp) const override; | ||||
virtual bool get(JSContext* cx, HandleObject wrapper, HandleValue receiver, | virtual bool get(JSContext* cx, HandleObject wrapper, HandleValue receiver, | ||||
HandleId id, MutableHandleValue vp) const override; | HandleId id, MutableHandleValue vp) const override; | ||||
virtual bool set(JSContext* cx, HandleObject wrapper, HandleId id, HandleValue v, | virtual bool set(JSContext* cx, HandleObject wrapper, HandleId id, HandleValue v, | ||||
HandleValue receiver, ObjectOpResult& result) const override; | HandleValue receiver, ObjectOpResult& result) const override; | ||||
virtual bool call(JSContext* cx, HandleObject wrapper, const CallArgs& args) const override; | virtual bool call(JSContext* cx, HandleObject wrapper, const CallArgs& args) const override; | ||||
virtual bool construct(JSContext* cx, HandleObject wrapper, const CallArgs& args) const override; | virtual bool construct(JSContext* cx, HandleObject wrapper, const CallArgs& args) const override; | ||||
/* SpiderMonkey extensions. */ | /* SpiderMonkey extensions. */ | ||||
virtual bool getPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id, | virtual bool getPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id, | ||||
MutableHandle<JSPropertyDescriptor> desc) const override; | MutableHandle<PropertyDescriptor> desc) const override; | ||||
virtual bool hasOwn(JSContext* cx, HandleObject wrapper, HandleId id, bool* bp) const override; | virtual bool hasOwn(JSContext* cx, HandleObject wrapper, HandleId id, bool* bp) const override; | ||||
virtual bool getOwnEnumerablePropertyKeys(JSContext* cx, HandleObject wrapper, | virtual bool getOwnEnumerablePropertyKeys(JSContext* cx, HandleObject wrapper, | ||||
AutoIdVector& props) const override; | AutoIdVector& props) const override; | ||||
virtual bool nativeCall(JSContext* cx, IsAcceptableThis test, NativeImpl impl, | virtual bool nativeCall(JSContext* cx, IsAcceptableThis test, NativeImpl impl, | ||||
const CallArgs& args) const override; | const CallArgs& args) const override; | ||||
virtual bool hasInstance(JSContext* cx, HandleObject wrapper, MutableHandleValue v, | virtual bool hasInstance(JSContext* cx, HandleObject wrapper, MutableHandleValue v, | ||||
bool* bp) const override; | bool* bp) const override; | ||||
virtual const char* className(JSContext* cx, HandleObject proxy) const override; | virtual const char* className(JSContext* cx, HandleObject proxy) const override; | ||||
virtual JSString* fun_toString(JSContext* cx, HandleObject wrapper, | virtual JSString* fun_toString(JSContext* cx, HandleObject wrapper, | ||||
unsigned indent) const override; | unsigned indent) const override; | ||||
virtual bool regexp_toShared(JSContext* cx, HandleObject proxy, RegExpGuard* g) const override; | virtual bool regexp_toShared(JSContext* cx, HandleObject proxy, RegExpGuard* g) const override; | ||||
virtual bool boxedValue_unbox(JSContext* cx, HandleObject proxy, MutableHandleValue vp) const override; | virtual bool boxedValue_unbox(JSContext* cx, HandleObject proxy, MutableHandleValue vp) const override; | ||||
// Allocate CrossCompartmentWrappers in the nursery. | |||||
virtual bool canNurseryAllocate() const override { return true; } | |||||
static const CrossCompartmentWrapper singleton; | static const CrossCompartmentWrapper singleton; | ||||
static const CrossCompartmentWrapper singletonWithPrototype; | static const CrossCompartmentWrapper singletonWithPrototype; | ||||
}; | }; | ||||
class JS_FRIEND_API(OpaqueCrossCompartmentWrapper) : public CrossCompartmentWrapper | class JS_FRIEND_API(OpaqueCrossCompartmentWrapper) : public CrossCompartmentWrapper | ||||
{ | { | ||||
public: | public: | ||||
explicit MOZ_CONSTEXPR OpaqueCrossCompartmentWrapper() : CrossCompartmentWrapper(0) | explicit constexpr OpaqueCrossCompartmentWrapper() : CrossCompartmentWrapper(0) | ||||
{ } | { } | ||||
/* Standard internal methods. */ | /* Standard internal methods. */ | ||||
virtual bool getOwnPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id, | virtual bool getOwnPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id, | ||||
MutableHandle<JSPropertyDescriptor> desc) const override; | MutableHandle<PropertyDescriptor> desc) const override; | ||||
virtual bool defineProperty(JSContext* cx, HandleObject wrapper, HandleId id, | virtual bool defineProperty(JSContext* cx, HandleObject wrapper, HandleId id, | ||||
Handle<JSPropertyDescriptor> desc, | Handle<PropertyDescriptor> desc, | ||||
ObjectOpResult& result) const override; | ObjectOpResult& result) const override; | ||||
virtual bool ownPropertyKeys(JSContext* cx, HandleObject wrapper, | virtual bool ownPropertyKeys(JSContext* cx, HandleObject wrapper, | ||||
AutoIdVector& props) const override; | AutoIdVector& props) const override; | ||||
virtual bool delete_(JSContext* cx, HandleObject wrapper, HandleId id, | virtual bool delete_(JSContext* cx, HandleObject wrapper, HandleId id, | ||||
ObjectOpResult& result) const override; | ObjectOpResult& result) const override; | ||||
virtual bool enumerate(JSContext* cx, HandleObject wrapper, | virtual bool enumerate(JSContext* cx, HandleObject wrapper, | ||||
MutableHandleObject objp) const override; | MutableHandleObject objp) const override; | ||||
virtual bool getPrototype(JSContext* cx, HandleObject wrapper, | virtual bool getPrototype(JSContext* cx, HandleObject wrapper, | ||||
MutableHandleObject protop) const override; | MutableHandleObject protop) const override; | ||||
virtual bool setPrototype(JSContext* cx, HandleObject wrapper, HandleObject proto, | virtual bool setPrototype(JSContext* cx, HandleObject wrapper, HandleObject proto, | ||||
ObjectOpResult& result) const override; | ObjectOpResult& result) const override; | ||||
virtual bool getPrototypeIfOrdinary(JSContext* cx, HandleObject wrapper, bool* isOrdinary, | |||||
MutableHandleObject protop) const override; | |||||
virtual bool setImmutablePrototype(JSContext* cx, HandleObject wrapper, | virtual bool setImmutablePrototype(JSContext* cx, HandleObject wrapper, | ||||
bool* succeeded) const override; | bool* succeeded) const override; | ||||
virtual bool preventExtensions(JSContext* cx, HandleObject wrapper, | virtual bool preventExtensions(JSContext* cx, HandleObject wrapper, | ||||
ObjectOpResult& result) const override; | ObjectOpResult& result) const override; | ||||
virtual bool isExtensible(JSContext* cx, HandleObject wrapper, bool* extensible) const override; | virtual bool isExtensible(JSContext* cx, HandleObject wrapper, bool* extensible) const override; | ||||
virtual bool has(JSContext* cx, HandleObject wrapper, HandleId id, | virtual bool has(JSContext* cx, HandleObject wrapper, HandleId id, | ||||
bool* bp) const override; | bool* bp) const override; | ||||
virtual bool get(JSContext* cx, HandleObject wrapper, HandleValue receiver, | virtual bool get(JSContext* cx, HandleObject wrapper, HandleValue receiver, | ||||
HandleId id, MutableHandleValue vp) const override; | HandleId id, MutableHandleValue vp) const override; | ||||
virtual bool set(JSContext* cx, HandleObject wrapper, HandleId id, HandleValue v, | virtual bool set(JSContext* cx, HandleObject wrapper, HandleId id, HandleValue v, | ||||
HandleValue receiver, ObjectOpResult& result) const override; | HandleValue receiver, ObjectOpResult& result) const override; | ||||
virtual bool call(JSContext* cx, HandleObject wrapper, const CallArgs& args) const override; | virtual bool call(JSContext* cx, HandleObject wrapper, const CallArgs& args) const override; | ||||
virtual bool construct(JSContext* cx, HandleObject wrapper, const CallArgs& args) const override; | virtual bool construct(JSContext* cx, HandleObject wrapper, const CallArgs& args) const override; | ||||
/* SpiderMonkey extensions. */ | /* SpiderMonkey extensions. */ | ||||
virtual bool getPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id, | virtual bool getPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id, | ||||
MutableHandle<JSPropertyDescriptor> desc) const override; | MutableHandle<PropertyDescriptor> desc) const override; | ||||
virtual bool hasOwn(JSContext* cx, HandleObject wrapper, HandleId id, | virtual bool hasOwn(JSContext* cx, HandleObject wrapper, HandleId id, | ||||
bool* bp) const override; | bool* bp) const override; | ||||
virtual bool getOwnEnumerablePropertyKeys(JSContext* cx, HandleObject wrapper, | virtual bool getOwnEnumerablePropertyKeys(JSContext* cx, HandleObject wrapper, | ||||
AutoIdVector& props) const override; | AutoIdVector& props) const override; | ||||
virtual bool getBuiltinClass(JSContext* cx, HandleObject wrapper, | virtual bool getBuiltinClass(JSContext* cx, HandleObject wrapper, ESClass* cls) const override; | ||||
ESClassValue* classValue) const override; | |||||
virtual bool isArray(JSContext* cx, HandleObject obj, | virtual bool isArray(JSContext* cx, HandleObject obj, | ||||
JS::IsArrayAnswer* answer) const override; | JS::IsArrayAnswer* answer) const override; | ||||
virtual const char* className(JSContext* cx, HandleObject wrapper) const override; | virtual const char* className(JSContext* cx, HandleObject wrapper) const override; | ||||
virtual JSString* fun_toString(JSContext* cx, HandleObject proxy, unsigned indent) const override; | virtual JSString* fun_toString(JSContext* cx, HandleObject proxy, unsigned indent) const override; | ||||
static const OpaqueCrossCompartmentWrapper singleton; | static const OpaqueCrossCompartmentWrapper singleton; | ||||
}; | }; | ||||
/* | /* | ||||
* Base class for security wrappers. A security wrapper is potentially hiding | * Base class for security wrappers. A security wrapper is potentially hiding | ||||
* all or part of some wrapped object thus SecurityWrapper defaults to denying | * all or part of some wrapped object thus SecurityWrapper defaults to denying | ||||
* access to the wrappee. This is the opposite of Wrapper which tries to be | * access to the wrappee. This is the opposite of Wrapper which tries to be | ||||
* completely transparent. | * completely transparent. | ||||
* | * | ||||
* NB: Currently, only a few ProxyHandler operations are overridden to deny | * NB: Currently, only a few ProxyHandler operations are overridden to deny | ||||
* access, relying on derived SecurityWrapper to block access when necessary. | * access, relying on derived SecurityWrapper to block access when necessary. | ||||
*/ | */ | ||||
template <class Base> | template <class Base> | ||||
class JS_FRIEND_API(SecurityWrapper) : public Base | class JS_FRIEND_API(SecurityWrapper) : public Base | ||||
{ | { | ||||
public: | public: | ||||
explicit MOZ_CONSTEXPR SecurityWrapper(unsigned flags, bool hasPrototype = false) | explicit constexpr SecurityWrapper(unsigned flags, bool hasPrototype = false) | ||||
: Base(flags, hasPrototype, /* hasSecurityPolicy = */ true) | : Base(flags, hasPrototype, /* hasSecurityPolicy = */ true) | ||||
{ } | { } | ||||
virtual bool enter(JSContext* cx, HandleObject wrapper, HandleId id, Wrapper::Action act, | virtual bool enter(JSContext* cx, HandleObject wrapper, HandleId id, Wrapper::Action act, | ||||
bool* bp) const override; | bool* bp) const override; | ||||
virtual bool defineProperty(JSContext* cx, HandleObject wrapper, HandleId id, | virtual bool defineProperty(JSContext* cx, HandleObject wrapper, HandleId id, | ||||
Handle<JSPropertyDescriptor> desc, | Handle<PropertyDescriptor> desc, | ||||
ObjectOpResult& result) const override; | ObjectOpResult& result) const override; | ||||
virtual bool isExtensible(JSContext* cx, HandleObject wrapper, bool* extensible) const override; | virtual bool isExtensible(JSContext* cx, HandleObject wrapper, bool* extensible) const override; | ||||
virtual bool preventExtensions(JSContext* cx, HandleObject wrapper, | virtual bool preventExtensions(JSContext* cx, HandleObject wrapper, | ||||
ObjectOpResult& result) const override; | ObjectOpResult& result) const override; | ||||
virtual bool setPrototype(JSContext* cx, HandleObject proxy, HandleObject proto, | virtual bool setPrototype(JSContext* cx, HandleObject proxy, HandleObject proto, | ||||
ObjectOpResult& result) const override; | ObjectOpResult& result) const override; | ||||
virtual bool setImmutablePrototype(JSContext* cx, HandleObject proxy, bool* succeeded) const override; | virtual bool setImmutablePrototype(JSContext* cx, HandleObject proxy, bool* succeeded) const override; | ||||
virtual bool nativeCall(JSContext* cx, IsAcceptableThis test, NativeImpl impl, | virtual bool nativeCall(JSContext* cx, IsAcceptableThis test, NativeImpl impl, | ||||
const CallArgs& args) const override; | const CallArgs& args) const override; | ||||
virtual bool getBuiltinClass(JSContext* cx, HandleObject wrapper, | virtual bool getBuiltinClass(JSContext* cx, HandleObject wrapper, ESClass* cls) const override; | ||||
ESClassValue* classValue) const override; | |||||
virtual bool isArray(JSContext* cx, HandleObject wrapper, JS::IsArrayAnswer* answer) const override; | virtual bool isArray(JSContext* cx, HandleObject wrapper, JS::IsArrayAnswer* answer) const override; | ||||
virtual bool regexp_toShared(JSContext* cx, HandleObject proxy, RegExpGuard* g) const override; | virtual bool regexp_toShared(JSContext* cx, HandleObject proxy, RegExpGuard* g) const override; | ||||
virtual bool boxedValue_unbox(JSContext* cx, HandleObject proxy, MutableHandleValue vp) const override; | virtual bool boxedValue_unbox(JSContext* cx, HandleObject proxy, MutableHandleValue vp) const override; | ||||
// Allow isCallable and isConstructor. They used to be class-level, and so could not be guarded | // Allow isCallable and isConstructor. They used to be class-level, and so could not be guarded | ||||
// against. | // against. | ||||
virtual bool watch(JSContext* cx, JS::HandleObject proxy, JS::HandleId id, | virtual bool watch(JSContext* cx, JS::HandleObject proxy, JS::HandleId id, | ||||
JS::HandleObject callable) const override; | JS::HandleObject callable) const override; | ||||
virtual bool unwatch(JSContext* cx, JS::HandleObject proxy, JS::HandleId id) const override; | virtual bool unwatch(JSContext* cx, JS::HandleObject proxy, JS::HandleId id) const override; | ||||
/* | /* | ||||
* Allow our subclasses to select the superclass behavior they want without | * Allow our subclasses to select the superclass behavior they want without | ||||
* needing to specify an exact superclass. | * needing to specify an exact superclass. | ||||
*/ | */ | ||||
typedef Base Permissive; | typedef Base Permissive; | ||||
typedef SecurityWrapper<Base> Restrictive; | typedef SecurityWrapper<Base> Restrictive; | ||||
}; | }; | ||||
typedef SecurityWrapper<Wrapper> SameCompartmentSecurityWrapper; | |||||
typedef SecurityWrapper<CrossCompartmentWrapper> CrossCompartmentSecurityWrapper; | typedef SecurityWrapper<CrossCompartmentWrapper> CrossCompartmentSecurityWrapper; | ||||
extern JSObject* | extern JSObject* | ||||
TransparentObjectWrapper(JSContext* cx, HandleObject existing, HandleObject obj); | TransparentObjectWrapper(JSContext* cx, HandleObject existing, HandleObject obj); | ||||
inline bool | inline bool | ||||
IsWrapper(JSObject* obj) | IsWrapper(JSObject* obj) | ||||
{ | { | ||||
Show All 17 Lines | |||||
// Unwrap only the outermost security wrapper, with the same semantics as | // Unwrap only the outermost security wrapper, with the same semantics as | ||||
// above. This is the checked version of Wrapper::wrappedObject. | // above. This is the checked version of Wrapper::wrappedObject. | ||||
JS_FRIEND_API(JSObject*) | JS_FRIEND_API(JSObject*) | ||||
UnwrapOneChecked(JSObject* obj, bool stopAtWindowProxy = true); | UnwrapOneChecked(JSObject* obj, bool stopAtWindowProxy = true); | ||||
JS_FRIEND_API(bool) | JS_FRIEND_API(bool) | ||||
IsCrossCompartmentWrapper(JSObject* obj); | IsCrossCompartmentWrapper(JSObject* obj); | ||||
void | JS_FRIEND_API(void) | ||||
NukeCrossCompartmentWrapper(JSContext* cx, JSObject* wrapper); | NukeCrossCompartmentWrapper(JSContext* cx, JSObject* wrapper); | ||||
bool | void | ||||
RemapWrapper(JSContext* cx, JSObject* wobj, JSObject* newTarget); | RemapWrapper(JSContext* cx, JSObject* wobj, JSObject* newTarget); | ||||
JS_FRIEND_API(bool) | JS_FRIEND_API(bool) | ||||
RemapAllWrappersForObject(JSContext* cx, JSObject* oldTarget, | RemapAllWrappersForObject(JSContext* cx, JSObject* oldTarget, | ||||
JSObject* newTarget); | JSObject* newTarget); | ||||
// API to recompute all cross-compartment wrappers whose source and target | // API to recompute all cross-compartment wrappers whose source and target | ||||
// match the given filters. | // match the given filters. | ||||
JS_FRIEND_API(bool) | JS_FRIEND_API(bool) | ||||
RecomputeWrappers(JSContext* cx, const CompartmentFilter& sourceFilter, | RecomputeWrappers(JSContext* cx, const CompartmentFilter& sourceFilter, | ||||
const CompartmentFilter& targetFilter); | const CompartmentFilter& targetFilter); | ||||
} /* namespace js */ | } /* namespace js */ | ||||
#endif /* jswrapper_h */ | #endif /* jswrapper_h */ |
Wildfire Games · Phabricator