mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
f025bdc025
With this patch, all holders are created lazily. There are two common accessors, getHolder() and ensureHolder(). The former returns null if no holder exists, the latter lazily creates the holder if it doesn't exist. It does this by calling into a virtual trap on XrayTraits, which lets the appropriate Xray type do its thing.
129 lines
4.5 KiB
C++
129 lines
4.5 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
* vim: set ts=4 sw=4 et tw=99 ft=cpp:
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "jsapi.h"
|
|
#include "jswrapper.h"
|
|
#include "mozilla/GuardObjects.h"
|
|
|
|
// Xray wrappers re-resolve the original native properties on the native
|
|
// object and always directly access to those properties.
|
|
// Because they work so differently from the rest of the wrapper hierarchy,
|
|
// we pull them out of the Wrapper inheritance hierarchy and create a
|
|
// little world around them.
|
|
|
|
class XPCWrappedNative;
|
|
|
|
namespace xpc {
|
|
|
|
JSBool
|
|
holder_get(JSContext *cx, JSHandleObject holder, JSHandleId id, JSMutableHandleValue vp);
|
|
JSBool
|
|
holder_set(JSContext *cx, JSHandleObject holder, JSHandleId id, JSBool strict, JSMutableHandleValue vp);
|
|
|
|
namespace XrayUtils {
|
|
|
|
extern JSClass HolderClass;
|
|
|
|
bool CloneExpandoChain(JSContext *cx, JSObject *src, JSObject *dst);
|
|
|
|
bool
|
|
IsTransparent(JSContext *cx, JSObject *wrapper);
|
|
|
|
JSObject *
|
|
GetNativePropertiesObject(JSContext *cx, JSObject *wrapper);
|
|
|
|
}
|
|
|
|
class XPCWrappedNativeXrayTraits;
|
|
class ProxyXrayTraits;
|
|
class DOMXrayTraits;
|
|
|
|
// NB: Base *must* derive from JSProxyHandler
|
|
template <typename Base, typename Traits = XPCWrappedNativeXrayTraits >
|
|
class XrayWrapper : public Base {
|
|
public:
|
|
XrayWrapper(unsigned flags);
|
|
virtual ~XrayWrapper();
|
|
|
|
/* Fundamental proxy traps. */
|
|
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
|
|
bool set, js::PropertyDescriptor *desc);
|
|
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *wrapper, jsid id,
|
|
bool set, js::PropertyDescriptor *desc);
|
|
virtual bool defineProperty(JSContext *cx, JSObject *wrapper, jsid id,
|
|
js::PropertyDescriptor *desc);
|
|
virtual bool getOwnPropertyNames(JSContext *cx, JSObject *wrapper,
|
|
js::AutoIdVector &props);
|
|
virtual bool delete_(JSContext *cx, JSObject *wrapper, jsid id, bool *bp);
|
|
virtual bool enumerate(JSContext *cx, JSObject *wrapper, js::AutoIdVector &props);
|
|
|
|
/* Derived proxy traps. */
|
|
virtual bool get(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id,
|
|
js::Value *vp);
|
|
virtual bool set(JSContext *cx, JSObject *wrapper, JSObject *receiver, jsid id,
|
|
bool strict, js::Value *vp);
|
|
virtual bool has(JSContext *cx, JSObject *wrapper, jsid id, bool *bp);
|
|
virtual bool hasOwn(JSContext *cx, JSObject *wrapper, jsid id, bool *bp);
|
|
virtual bool keys(JSContext *cx, JSObject *wrapper, js::AutoIdVector &props);
|
|
virtual bool iterate(JSContext *cx, JSObject *wrapper, unsigned flags, js::Value *vp);
|
|
|
|
virtual bool call(JSContext *cx, JSObject *wrapper, unsigned argc, js::Value *vp);
|
|
virtual bool construct(JSContext *cx, JSObject *wrapper,
|
|
unsigned argc, js::Value *argv, js::Value *rval);
|
|
|
|
static XrayWrapper singleton;
|
|
|
|
private:
|
|
bool enumerate(JSContext *cx, JSObject *wrapper, unsigned flags,
|
|
JS::AutoIdVector &props);
|
|
};
|
|
|
|
typedef XrayWrapper<js::CrossCompartmentWrapper, ProxyXrayTraits > XrayProxy;
|
|
typedef XrayWrapper<js::CrossCompartmentWrapper, DOMXrayTraits > XrayDOM;
|
|
|
|
class SandboxProxyHandler : public js::IndirectWrapper {
|
|
public:
|
|
SandboxProxyHandler() : js::IndirectWrapper(0)
|
|
{
|
|
}
|
|
|
|
virtual bool getPropertyDescriptor(JSContext *cx, JSObject *proxy, jsid id,
|
|
bool set, js::PropertyDescriptor *desc);
|
|
virtual bool getOwnPropertyDescriptor(JSContext *cx, JSObject *proxy,
|
|
jsid id, bool set,
|
|
js::PropertyDescriptor *desc);
|
|
};
|
|
|
|
extern SandboxProxyHandler sandboxProxyHandler;
|
|
|
|
class AutoSetWrapperNotShadowing;
|
|
class XPCWrappedNativeXrayTraits;
|
|
|
|
class ResolvingId {
|
|
public:
|
|
ResolvingId(JSObject *wrapper, jsid id);
|
|
~ResolvingId();
|
|
|
|
bool isXrayShadowing(jsid id);
|
|
bool isResolving(jsid id);
|
|
static ResolvingId* getResolvingId(JSObject *holder);
|
|
static JSObject* getHolderObject(JSObject *wrapper);
|
|
static ResolvingId *getResolvingIdFromWrapper(JSObject *wrapper);
|
|
|
|
private:
|
|
friend class AutoSetWrapperNotShadowing;
|
|
friend class XPCWrappedNativeXrayTraits;
|
|
|
|
jsid mId;
|
|
JSObject *mHolder;
|
|
ResolvingId *mPrev;
|
|
bool mXrayShadowing;
|
|
};
|
|
|
|
}
|
|
|