summaryrefslogtreecommitdiffstats
path: root/js/xpconnect/public
diff options
context:
space:
mode:
Diffstat (limited to 'js/xpconnect/public')
-rw-r--r--js/xpconnect/public/moz.build10
-rw-r--r--js/xpconnect/public/xpc_make_class.h120
-rw-r--r--js/xpconnect/public/xpc_map_end.h114
3 files changed, 244 insertions, 0 deletions
diff --git a/js/xpconnect/public/moz.build b/js/xpconnect/public/moz.build
new file mode 100644
index 0000000000..29e24495b2
--- /dev/null
+++ b/js/xpconnect/public/moz.build
@@ -0,0 +1,10 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+EXPORTS += [
+ "xpc_make_class.h",
+ "xpc_map_end.h",
+]
diff --git a/js/xpconnect/public/xpc_make_class.h b/js/xpconnect/public/xpc_make_class.h
new file mode 100644
index 0000000000..d9c0c4064d
--- /dev/null
+++ b/js/xpconnect/public/xpc_make_class.h
@@ -0,0 +1,120 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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 JSClass 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_CannotDeletePropertyStub(JSContext* cx, JS::HandleObject obj,
+ JS::HandleId id,
+ JS::ObjectOpResult& result);
+
+bool XPC_WN_Shared_Enumerate(JSContext* cx, JS::HandleObject obj);
+
+bool XPC_WN_NewEnumerate(JSContext* cx, JS::HandleObject obj,
+ JS::MutableHandleIdVector properties,
+ bool enumerableOnly);
+
+bool XPC_WN_Helper_Resolve(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
+ bool* resolvedp);
+
+void XPC_WN_Helper_Finalize(JS::GCContext* gcx, JSObject* obj);
+void XPC_WN_NoHelper_Finalize(JS::GCContext* gcx, JSObject* obj);
+
+bool XPC_WN_Helper_Call(JSContext* cx, unsigned argc, JS::Value* vp);
+
+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;
+
+#define XPC_MAKE_CLASS_OPS(_flags) \
+ { \
+ /* addProperty */ \
+ ((_flags)&XPC_SCRIPTABLE_USE_JSSTUB_FOR_ADDPROPERTY) ? nullptr \
+ : ((_flags)&XPC_SCRIPTABLE_ALLOW_PROP_MODS_DURING_RESOLVE) \
+ ? XPC_WN_MaybeResolvingPropertyStub \
+ : XPC_WN_CannotModifyPropertyStub, \
+ \
+ /* delProperty */ \
+ ((_flags)&XPC_SCRIPTABLE_USE_JSSTUB_FOR_DELPROPERTY) ? nullptr \
+ : ((_flags)&XPC_SCRIPTABLE_ALLOW_PROP_MODS_DURING_RESOLVE) \
+ ? XPC_WN_MaybeResolvingDeletePropertyStub \
+ : XPC_WN_CannotDeletePropertyStub, \
+ \
+ /* enumerate */ \
+ ((_flags)&XPC_SCRIPTABLE_WANT_NEWENUMERATE) \
+ ? nullptr /* We will use newEnumerate set below in this case */ \
+ : XPC_WN_Shared_Enumerate, \
+ \
+ /* newEnumerate */ \
+ ((_flags)&XPC_SCRIPTABLE_WANT_NEWENUMERATE) ? XPC_WN_NewEnumerate \
+ : nullptr, \
+ \
+ /* resolve */ /* We have to figure out resolve strategy at call time \
+ */ \
+ XPC_WN_Helper_Resolve, \
+ \
+ /* mayResolve */ \
+ nullptr, \
+ \
+ /* finalize */ \
+ ((_flags)&XPC_SCRIPTABLE_WANT_FINALIZE) ? XPC_WN_Helper_Finalize \
+ : XPC_WN_NoHelper_Finalize, \
+ \
+ /* call */ \
+ ((_flags)&XPC_SCRIPTABLE_WANT_CALL) ? XPC_WN_Helper_Call : nullptr, \
+ \
+ /* construct */ \
+ ((_flags)&XPC_SCRIPTABLE_WANT_CONSTRUCT) ? XPC_WN_Helper_Construct \
+ : nullptr, \
+ \
+ /* trace */ \
+ ((_flags)&XPC_SCRIPTABLE_IS_GLOBAL_OBJECT) ? JS_GlobalObjectTraceHook \
+ : XPCWrappedNative_Trace, \
+ }
+
+#define XPC_MAKE_CLASS(_name, _flags, _classOps) \
+ { \
+ /* name */ \
+ _name, \
+ \
+ /* flags */ \
+ JSCLASS_SLOT0_IS_NSISUPPORTS | JSCLASS_IS_WRAPPED_NATIVE | \
+ JSCLASS_FOREGROUND_FINALIZE | \
+ (((_flags)&XPC_SCRIPTABLE_IS_GLOBAL_OBJECT) \
+ ? XPCONNECT_GLOBAL_FLAGS \
+ : JSCLASS_HAS_RESERVED_SLOTS(1)), \
+ \
+ /* cOps */ \
+ _classOps, \
+ \
+ /* spec */ \
+ nullptr, \
+ \
+ /* ext */ \
+ &XPC_WN_JSClassExtension, \
+ \
+ /* oOps */ \
+ nullptr, \
+ }
+
+#endif
diff --git a/js/xpconnect/public/xpc_map_end.h b/js/xpconnect/public/xpc_map_end.h
new file mode 100644
index 0000000000..1a63fc779c
--- /dev/null
+++ b/js/xpconnect/public/xpc_map_end.h
@@ -0,0 +1,114 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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/. */
+
+// If you include this file you must also include xpc_make_class.h at the top
+// of the file doing the including.
+
+#ifndef XPC_MAP_CLASSNAME
+# error "Must #define XPC_MAP_CLASSNAME before #including xpc_map_end.h"
+#endif
+
+#ifndef XPC_MAP_QUOTED_CLASSNAME
+# error "Must #define XPC_MAP_QUOTED_CLASSNAME before #including xpc_map_end.h"
+#endif
+
+#ifndef XPC_MAP_FLAGS
+# error "Must #define XPC_MAP_FLAGS before #including xpc_map_end.h"
+#endif
+
+#include "js/Id.h"
+
+/**************************************************************/
+
+NS_IMETHODIMP XPC_MAP_CLASSNAME::GetClassName(nsACString& aClassName) {
+ aClassName.AssignLiteral(XPC_MAP_QUOTED_CLASSNAME);
+ return NS_OK;
+}
+
+/**************************************************************/
+
+// virtual
+uint32_t XPC_MAP_CLASSNAME::GetScriptableFlags() { return (XPC_MAP_FLAGS); }
+
+// virtual
+const JSClass* XPC_MAP_CLASSNAME::GetJSClass() {
+ static const JSClassOps classOps = XPC_MAKE_CLASS_OPS(GetScriptableFlags());
+ static const JSClass klass =
+ XPC_MAKE_CLASS(XPC_MAP_QUOTED_CLASSNAME, GetScriptableFlags(), &classOps);
+ return &klass;
+}
+
+/**************************************************************/
+
+#if !((XPC_MAP_FLAGS)&XPC_SCRIPTABLE_WANT_PRECREATE)
+NS_IMETHODIMP XPC_MAP_CLASSNAME::PreCreate(nsISupports* nativeObj,
+ JSContext* cx, JSObject* globalObj,
+ JSObject** parentObj) {
+ NS_ERROR("never called");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+#endif
+
+#if !((XPC_MAP_FLAGS)&XPC_SCRIPTABLE_WANT_NEWENUMERATE)
+NS_IMETHODIMP XPC_MAP_CLASSNAME::NewEnumerate(
+ nsIXPConnectWrappedNative* wrapper, JSContext* cx, JSObject* obj,
+ JS::MutableHandleIdVector properties, bool enumerableOnly, bool* _retval) {
+ NS_ERROR("never called");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+#endif
+
+#if !((XPC_MAP_FLAGS)&XPC_SCRIPTABLE_WANT_RESOLVE)
+NS_IMETHODIMP XPC_MAP_CLASSNAME::Resolve(nsIXPConnectWrappedNative* wrapper,
+ JSContext* cx, JSObject* obj, jsid id,
+ bool* resolvedp, bool* _retval) {
+ NS_ERROR("never called");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+#endif
+
+#if !((XPC_MAP_FLAGS)&XPC_SCRIPTABLE_WANT_FINALIZE)
+NS_IMETHODIMP XPC_MAP_CLASSNAME::Finalize(nsIXPConnectWrappedNative* wrapper,
+ JS::GCContext* gcx, JSObject* obj) {
+ NS_ERROR("never called");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+#endif
+
+#if !((XPC_MAP_FLAGS)&XPC_SCRIPTABLE_WANT_CALL)
+NS_IMETHODIMP XPC_MAP_CLASSNAME::Call(nsIXPConnectWrappedNative* wrapper,
+ JSContext* cx, JSObject* obj,
+ const JS::CallArgs& args, bool* _retval) {
+ NS_ERROR("never called");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+#endif
+
+#if !((XPC_MAP_FLAGS)&XPC_SCRIPTABLE_WANT_CONSTRUCT)
+NS_IMETHODIMP XPC_MAP_CLASSNAME::Construct(nsIXPConnectWrappedNative* wrapper,
+ JSContext* cx, JSObject* obj,
+ const JS::CallArgs& args,
+ bool* _retval) {
+ NS_ERROR("never called");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+#endif
+
+#if !((XPC_MAP_FLAGS)&XPC_SCRIPTABLE_WANT_HASINSTANCE)
+NS_IMETHODIMP XPC_MAP_CLASSNAME::HasInstance(nsIXPConnectWrappedNative* wrapper,
+ JSContext* cx, JSObject* obj,
+ JS::HandleValue val, bool* bp,
+ bool* _retval) {
+ NS_ERROR("never called");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+#endif
+
+/**************************************************************/
+
+#undef XPC_MAP_CLASSNAME
+#undef XPC_MAP_QUOTED_CLASSNAME
+#undef XPC_MAP_FLAGS