summaryrefslogtreecommitdiffstats
path: root/js/xpconnect/public/xpc_make_class.h
diff options
context:
space:
mode:
Diffstat (limited to 'js/xpconnect/public/xpc_make_class.h')
-rw-r--r--js/xpconnect/public/xpc_make_class.h175
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