diff options
Diffstat (limited to 'js/xpconnect/public/xpc_make_class.h')
-rw-r--r-- | js/xpconnect/public/xpc_make_class.h | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/js/xpconnect/public/xpc_make_class.h b/js/xpconnect/public/xpc_make_class.h new file mode 100644 index 000000000..f612d3056 --- /dev/null +++ b/js/xpconnect/public/xpc_make_class.h @@ -0,0 +1,175 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim: set ts=8 sts=4 et sw=4 tw=99: */ +/* 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 xpc_make_class_h +#define xpc_make_class_h + +// This file should be used to create js::Class instances for nsIXPCScriptable +// instances. This includes any file that uses xpc_map_end.h. + +#include "xpcpublic.h" +#include "mozilla/dom/DOMJSClass.h" + +bool +XPC_WN_MaybeResolvingPropertyStub(JSContext* cx, JS::HandleObject obj, + JS::HandleId id, JS::HandleValue v); +bool +XPC_WN_CannotModifyPropertyStub(JSContext* cx, JS::HandleObject obj, + JS::HandleId id, JS::HandleValue v); + +bool +XPC_WN_MaybeResolvingDeletePropertyStub(JSContext* cx, JS::HandleObject obj, + JS::HandleId id, + JS::ObjectOpResult& result); +bool +XPC_WN_CantDeletePropertyStub(JSContext* cx, JS::HandleObject obj, + JS::HandleId id, JS::ObjectOpResult& result); + +bool +XPC_WN_Helper_GetProperty(JSContext* cx, JS::HandleObject obj, JS::HandleId id, + JS::MutableHandleValue vp); + +bool +XPC_WN_Helper_SetProperty(JSContext* cx, JS::HandleObject obj, JS::HandleId id, + JS::MutableHandleValue vp, + JS::ObjectOpResult& result); +bool +XPC_WN_MaybeResolvingSetPropertyStub(JSContext* cx, JS::HandleObject obj, + JS::HandleId id, JS::MutableHandleValue vp, + JS::ObjectOpResult& result); +bool +XPC_WN_CannotModifySetPropertyStub(JSContext* cx, JS::HandleObject obj, + JS::HandleId id, JS::MutableHandleValue vp, + JS::ObjectOpResult& result); + +bool +XPC_WN_Helper_Enumerate(JSContext* cx, JS::HandleObject obj); +bool +XPC_WN_Shared_Enumerate(JSContext* cx, JS::HandleObject obj); + +bool +XPC_WN_Helper_Resolve(JSContext* cx, JS::HandleObject obj, JS::HandleId id, + bool* resolvedp); + +void +XPC_WN_Helper_Finalize(js::FreeOp* fop, JSObject* obj); +void +XPC_WN_NoHelper_Finalize(js::FreeOp* fop, JSObject* obj); + +bool +XPC_WN_Helper_Call(JSContext* cx, unsigned argc, JS::Value* vp); + +bool +XPC_WN_Helper_HasInstance(JSContext* cx, JS::HandleObject obj, + JS::MutableHandleValue valp, bool* bp); + +bool +XPC_WN_Helper_Construct(JSContext* cx, unsigned argc, JS::Value* vp); + +void +XPCWrappedNative_Trace(JSTracer* trc, JSObject* obj); + +extern const js::ClassExtension XPC_WN_JSClassExtension; + +extern const js::ObjectOps XPC_WN_ObjectOpsWithEnumerate; + +#define XPC_MAKE_CLASS_OPS(_flags) { \ + /* addProperty */ \ + ((_flags) & nsIXPCScriptable::USE_JSSTUB_FOR_ADDPROPERTY) \ + ? nullptr \ + : ((_flags) & nsIXPCScriptable::ALLOW_PROP_MODS_DURING_RESOLVE) \ + ? XPC_WN_MaybeResolvingPropertyStub \ + : XPC_WN_CannotModifyPropertyStub, \ + \ + /* delProperty */ \ + ((_flags) & nsIXPCScriptable::USE_JSSTUB_FOR_DELPROPERTY) \ + ? nullptr \ + : ((_flags) & nsIXPCScriptable::ALLOW_PROP_MODS_DURING_RESOLVE) \ + ? XPC_WN_MaybeResolvingDeletePropertyStub \ + : XPC_WN_CantDeletePropertyStub, \ + \ + /* getProperty */ \ + ((_flags) & nsIXPCScriptable::WANT_GETPROPERTY) \ + ? XPC_WN_Helper_GetProperty \ + : nullptr, \ + \ + /* setProperty */ \ + ((_flags) & nsIXPCScriptable::WANT_SETPROPERTY) \ + ? XPC_WN_Helper_SetProperty \ + : ((_flags) & nsIXPCScriptable::USE_JSSTUB_FOR_SETPROPERTY) \ + ? nullptr \ + : ((_flags) & nsIXPCScriptable::ALLOW_PROP_MODS_DURING_RESOLVE) \ + ? XPC_WN_MaybeResolvingSetPropertyStub \ + : XPC_WN_CannotModifySetPropertyStub, \ + \ + /* enumerate */ \ + ((_flags) & nsIXPCScriptable::WANT_NEWENUMERATE) \ + ? nullptr /* We will use oOps->enumerate set below in this case */ \ + : ((_flags) & nsIXPCScriptable::WANT_ENUMERATE) \ + ? XPC_WN_Helper_Enumerate \ + : XPC_WN_Shared_Enumerate, \ + \ + /* resolve */ \ + /* We have to figure out resolve strategy at call time */ \ + XPC_WN_Helper_Resolve, \ + \ + /* mayResolve */ \ + nullptr, \ + \ + /* finalize */ \ + ((_flags) & nsIXPCScriptable::WANT_FINALIZE) \ + ? XPC_WN_Helper_Finalize \ + : XPC_WN_NoHelper_Finalize, \ + \ + /* call */ \ + ((_flags) & nsIXPCScriptable::WANT_CALL) \ + ? XPC_WN_Helper_Call \ + : nullptr, \ + \ + /* hasInstance */ \ + ((_flags) & nsIXPCScriptable::WANT_HASINSTANCE) \ + ? XPC_WN_Helper_HasInstance \ + : nullptr, \ + \ + /* construct */ \ + ((_flags) & nsIXPCScriptable::WANT_CONSTRUCT) \ + ? XPC_WN_Helper_Construct \ + : nullptr, \ + \ + /* trace */ \ + ((_flags) & nsIXPCScriptable::IS_GLOBAL_OBJECT) \ + ? JS_GlobalObjectTraceHook \ + : XPCWrappedNative_Trace, \ +} + +#define XPC_MAKE_CLASS(_name, _flags, _classOps) { \ + /* name */ \ + _name, \ + \ + /* flags */ \ + XPC_WRAPPER_FLAGS | \ + JSCLASS_PRIVATE_IS_NSISUPPORTS | \ + JSCLASS_IS_WRAPPED_NATIVE | \ + (((_flags) & nsIXPCScriptable::IS_GLOBAL_OBJECT) \ + ? XPCONNECT_GLOBAL_FLAGS \ + : 0), \ + \ + /* cOps */ \ + _classOps, \ + \ + /* spec */ \ + nullptr, \ + \ + /* ext */ \ + &XPC_WN_JSClassExtension, \ + \ + /* oOps */ \ + ((_flags) & nsIXPCScriptable::WANT_NEWENUMERATE) \ + ? &XPC_WN_ObjectOpsWithEnumerate \ + : nullptr, \ +} + +#endif |