aboutsummaryrefslogtreecommitdiffstats
path: root/components/script_bindings/namespace.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script_bindings/namespace.rs')
-rw-r--r--components/script_bindings/namespace.rs62
1 files changed, 62 insertions, 0 deletions
diff --git a/components/script_bindings/namespace.rs b/components/script_bindings/namespace.rs
new file mode 100644
index 00000000000..1ed5e06915b
--- /dev/null
+++ b/components/script_bindings/namespace.rs
@@ -0,0 +1,62 @@
+/* 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 https://mozilla.org/MPL/2.0/. */
+
+//! Machinery to initialise namespace objects.
+
+use std::ffi::CStr;
+use std::ptr;
+
+use js::jsapi::{JSClass, JSFunctionSpec};
+use js::rust::{HandleObject, MutableHandleObject};
+
+use crate::DomTypes;
+use crate::constant::ConstantSpec;
+use crate::guard::Guard;
+use crate::interface::{create_object, define_on_global_object};
+use crate::script_runtime::JSContext;
+
+/// The class of a namespace object.
+#[derive(Clone, Copy)]
+pub(crate) struct NamespaceObjectClass(JSClass);
+
+unsafe impl Sync for NamespaceObjectClass {}
+
+impl NamespaceObjectClass {
+ /// Create a new `NamespaceObjectClass` structure.
+ pub(crate) const unsafe fn new(name: &'static CStr) -> Self {
+ NamespaceObjectClass(JSClass {
+ name: name.as_ptr(),
+ flags: 0,
+ cOps: 0 as *mut _,
+ spec: ptr::null(),
+ ext: ptr::null(),
+ oOps: ptr::null(),
+ })
+ }
+}
+
+/// Create a new namespace object.
+#[allow(clippy::too_many_arguments)]
+pub(crate) fn create_namespace_object<D: DomTypes>(
+ cx: JSContext,
+ global: HandleObject,
+ proto: HandleObject,
+ class: &'static NamespaceObjectClass,
+ methods: &[Guard<&'static [JSFunctionSpec]>],
+ constants: &[Guard<&'static [ConstantSpec]>],
+ name: &CStr,
+ mut rval: MutableHandleObject,
+) {
+ create_object::<D>(
+ cx,
+ global,
+ proto,
+ &class.0,
+ methods,
+ &[],
+ constants,
+ rval.reborrow(),
+ );
+ define_on_global_object(cx, global, name, rval.handle());
+}