diff options
author | Jack Moffitt <jack@metajack.im> | 2014-08-28 09:34:23 -0600 |
---|---|---|
committer | Jack Moffitt <jack@metajack.im> | 2014-09-08 20:21:42 -0600 |
commit | c6ab60dbfc6da7b4f800c9e40893c8b58413960c (patch) | |
tree | d1d74076cf7fa20e4f77ec7cb82cae98b67362cb /components/script/dom/bindings/codegen/DOMJSProxyHandler.h | |
parent | db2f642c32fc5bed445bb6f2e45b0f6f0b4342cf (diff) | |
download | servo-c6ab60dbfc6da7b4f800c9e40893c8b58413960c.tar.gz servo-c6ab60dbfc6da7b4f800c9e40893c8b58413960c.zip |
Cargoify servo
Diffstat (limited to 'components/script/dom/bindings/codegen/DOMJSProxyHandler.h')
-rw-r--r-- | components/script/dom/bindings/codegen/DOMJSProxyHandler.h | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/components/script/dom/bindings/codegen/DOMJSProxyHandler.h b/components/script/dom/bindings/codegen/DOMJSProxyHandler.h new file mode 100644 index 00000000000..394e2dc4d2f --- /dev/null +++ b/components/script/dom/bindings/codegen/DOMJSProxyHandler.h @@ -0,0 +1,109 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/ +/* 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/. */ + +#ifndef mozilla_dom_DOMJSProxyHandler_h +#define mozilla_dom_DOMJSProxyHandler_h + +#include "jsapi.h" +#include "jsfriendapi.h" +#include "jsproxy.h" +#include "xpcpublic.h" +#include "nsString.h" +#include "mozilla/Likely.h" + +#define DOM_PROXY_OBJECT_SLOT js::JSSLOT_PROXY_PRIVATE + +namespace mozilla { +namespace dom { + +enum { + JSPROXYSLOT_EXPANDO = 0 +}; + +template<typename T> struct Prefable; + +class DOMProxyHandler : public DOMBaseProxyHandler +{ +public: + DOMProxyHandler(const DOMClass& aClass) + : DOMBaseProxyHandler(true), + mClass(aClass) + { + } + + bool getPropertyDescriptor(JSContext* cx, JSObject* proxy, jsid id, bool set, + JSPropertyDescriptor* desc); + bool defineProperty(JSContext* cx, JSObject* proxy, jsid id, + JSPropertyDescriptor* desc); + bool delete_(JSContext* cx, JSObject* proxy, jsid id, bool* bp); + bool enumerate(JSContext* cx, JSObject* proxy, JS::AutoIdVector& props); + bool fix(JSContext* cx, JSObject* proxy, JS::Value* vp); + bool has(JSContext* cx, JSObject* proxy, jsid id, bool* bp); + using js::BaseProxyHandler::obj_toString; + + static JSObject* GetExpandoObject(JSObject* obj) + { + MOZ_ASSERT(IsDOMProxy(obj), "expected a DOM proxy object"); + JS::Value v = js::GetProxyExtra(obj, JSPROXYSLOT_EXPANDO); + return v.isUndefined() ? NULL : v.toObjectOrNull(); + } + static JSObject* EnsureExpandoObject(JSContext* cx, JSObject* obj); + + const DOMClass& mClass; + +protected: + static JSString* obj_toString(JSContext* cx, const char* className); +}; + +extern jsid s_length_id; + +int32_t IdToInt32(JSContext* cx, jsid id); + +inline int32_t +GetArrayIndexFromId(JSContext* cx, jsid id) +{ + if (MOZ_LIKELY(JSID_IS_INT(id))) { + return JSID_TO_INT(id); + } + if (MOZ_LIKELY(id == s_length_id)) { + return -1; + } + if (MOZ_LIKELY(JSID_IS_ATOM(id))) { + JSAtom* atom = JSID_TO_ATOM(id); + jschar s = *js::GetAtomChars(atom); + if (MOZ_LIKELY((unsigned)s >= 'a' && (unsigned)s <= 'z')) + return -1; + + uint32_t i; + JSLinearString* str = js::AtomToLinearString(JSID_TO_ATOM(id)); + return js::StringIsArrayIndex(str, &i) ? i : -1; + } + return IdToInt32(cx, id); +} + +inline void +FillPropertyDescriptor(JSPropertyDescriptor* desc, JSObject* obj, bool readonly) +{ + desc->obj = obj; + desc->attrs = (readonly ? JSPROP_READONLY : 0) | JSPROP_ENUMERATE; + desc->getter = NULL; + desc->setter = NULL; + desc->shortid = 0; +} + +inline void +FillPropertyDescriptor(JSPropertyDescriptor* desc, JSObject* obj, jsval v, bool readonly) +{ + desc->value = v; + FillPropertyDescriptor(desc, obj, readonly); +} + +JSObject* +EnsureExpandoObject(JSContext* cx, JSObject* obj); + +} // namespace dom +} // namespace mozilla + +#endif /* mozilla_dom_DOMProxyHandler_h */ |