summaryrefslogtreecommitdiffstats
path: root/xpcom/rust/xpcom/src/interfaces
diff options
context:
space:
mode:
Diffstat (limited to 'xpcom/rust/xpcom/src/interfaces')
-rw-r--r--xpcom/rust/xpcom/src/interfaces/idl.rs12
-rw-r--r--xpcom/rust/xpcom/src/interfaces/mod.rs31
-rw-r--r--xpcom/rust/xpcom/src/interfaces/nonidl.rs180
3 files changed, 223 insertions, 0 deletions
diff --git a/xpcom/rust/xpcom/src/interfaces/idl.rs b/xpcom/rust/xpcom/src/interfaces/idl.rs
new file mode 100644
index 0000000000..c8d62ce716
--- /dev/null
+++ b/xpcom/rust/xpcom/src/interfaces/idl.rs
@@ -0,0 +1,12 @@
+/* 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/. */
+
+#![allow(bad_style)]
+
+use crate::interfaces::*;
+use crate::*;
+
+// NOTE: This file contains a series of `include!()` invocations, defining all
+// idl interfaces directly within this module.
+include!(mozbuild::objdir_path!("dist/xpcrs/rt/all.rs"));
diff --git a/xpcom/rust/xpcom/src/interfaces/mod.rs b/xpcom/rust/xpcom/src/interfaces/mod.rs
new file mode 100644
index 0000000000..5b9de5cef5
--- /dev/null
+++ b/xpcom/rust/xpcom/src/interfaces/mod.rs
@@ -0,0 +1,31 @@
+/* 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/. */
+
+//! This module contains the xpcom interfaces exposed to rust code.
+//!
+//! The items in this module come in a few flavours:
+//!
+//! 1. `nsI*`: These are the types for XPCOM interfaces. They should always be
+//! passed behind a reference, pointer, or `RefPtr`. They may be coerced to
+//! their base interfaces using the `coerce` method.
+//!
+//! 2. `nsI*Coerce`: These traits provide the implementation mechanics for the
+//! `coerce` method, and can usually be ignored. *These traits are hidden in
+//! rustdoc*
+//!
+//! 3. `nsI*VTable`: These structs are the vtable definitions for each type.
+//! They contain the base interface's vtable, followed by pointers for each
+//! of the vtable's methods. If direct access is needed, a `*const nsI*` can
+//! be safely transmuted to a `*const nsI*VTable`. *These structs are hidden
+//! in rustdoc*
+//!
+//! 4. Typedefs used in idl file definitions.
+
+// Interfaces defined in .idl files
+mod idl;
+pub use self::idl::*;
+
+// Other interfaces which are needed to compile
+mod nonidl;
+pub use self::nonidl::*;
diff --git a/xpcom/rust/xpcom/src/interfaces/nonidl.rs b/xpcom/rust/xpcom/src/interfaces/nonidl.rs
new file mode 100644
index 0000000000..b9e3f1abe2
--- /dev/null
+++ b/xpcom/rust/xpcom/src/interfaces/nonidl.rs
@@ -0,0 +1,180 @@
+/* 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/. */
+
+//! This module contains definitions of interfaces which are used in idl files
+//! as forward declarations, but are not actually defined in an idl file.
+//!
+//! NOTE: The IIDs in these files must be kept in sync with the IDL definitions
+//! in the corresponding C++ files.
+
+use crate::nsID;
+
+// XXX: This macro should have an option for a custom base interface instead of
+// nsISupports, such that Document can have nsINode as a base, etc. For now,
+// query_interface should be sufficient.
+macro_rules! nonidl {
+ ($name:ident, $iid:expr) => {
+ /// This interface is referenced from idl files, but not defined in
+ /// them. It exports no methods to rust code.
+ #[repr(C)]
+ pub struct $name {
+ _vtable: *const $crate::interfaces::nsISupportsVTable,
+ }
+
+ unsafe impl $crate::XpCom for $name {
+ const IID: $crate::nsIID = $iid;
+ }
+
+ unsafe impl $crate::RefCounted for $name {
+ #[inline]
+ unsafe fn addref(&self) {
+ self.AddRef();
+ }
+ #[inline]
+ unsafe fn release(&self) {
+ self.Release();
+ }
+ }
+
+ impl ::std::ops::Deref for $name {
+ type Target = $crate::interfaces::nsISupports;
+ #[inline]
+ fn deref(&self) -> &$crate::interfaces::nsISupports {
+ unsafe { ::std::mem::transmute(self) }
+ }
+ }
+ };
+}
+
+// Must be kept in sync with Document.h
+nonidl!(
+ Document,
+ nsID(
+ 0xce1f7627,
+ 0x7109,
+ 0x4977,
+ [0xba, 0x77, 0x49, 0x0f, 0xfd, 0xe0, 0x7a, 0xaa]
+ )
+);
+
+// Must be kept in sync with nsINode.h
+nonidl!(
+ nsINode,
+ nsID(
+ 0x70ba4547,
+ 0x7699,
+ 0x44fc,
+ [0xb3, 0x20, 0x52, 0xdb, 0xe3, 0xd1, 0xf9, 0x0a]
+ )
+);
+
+// Must be kept in sync with nsIContent.h
+nonidl!(
+ nsIContent,
+ nsID(
+ 0x8e1bab9d,
+ 0x8815,
+ 0x4d2c,
+ [0xa2, 0x4d, 0x7a, 0xba, 0x52, 0x39, 0xdc, 0x22]
+ )
+);
+
+// Must be kept in sync with nsIConsoleReportCollector.h
+nonidl!(
+ nsIConsoleReportCollector,
+ nsID(
+ 0xdd98a481,
+ 0xd2c4,
+ 0x4203,
+ [0x8d, 0xfa, 0x85, 0xbf, 0xd7, 0xdc, 0xd7, 0x05]
+ )
+);
+
+// Must be kept in sync with nsIGlobalObject.h
+nonidl!(
+ nsIGlobalObject,
+ nsID(
+ 0x11afa8be,
+ 0xd997,
+ 0x4e07,
+ [0xa6, 0xa3, 0x6f, 0x87, 0x2e, 0xc3, 0xee, 0x7f]
+ )
+);
+
+// Must be kept in sync with nsIScriptElement.h
+nonidl!(
+ nsIScriptElement,
+ nsID(
+ 0xe60fca9b,
+ 0x1b96,
+ 0x4e4e,
+ [0xa9, 0xb4, 0xdc, 0x98, 0x4f, 0x88, 0x3f, 0x9c]
+ )
+);
+
+// Must be kept in sync with nsPIDOMWindow.h
+nonidl!(
+ nsPIDOMWindowOuter,
+ nsID(
+ 0x769693d4,
+ 0xb009,
+ 0x4fe2,
+ [0xaf, 0x18, 0x7d, 0xc8, 0xdf, 0x74, 0x96, 0xdf]
+ )
+);
+
+// Must be kept in sync with nsPIDOMWindow.h
+nonidl!(
+ nsPIDOMWindowInner,
+ nsID(
+ 0x775dabc9,
+ 0x8f43,
+ 0x4277,
+ [0x9a, 0xdb, 0xf1, 0x99, 0x0d, 0x77, 0xcf, 0xfb]
+ )
+);
+
+// Must be kept in sync with nsIScriptContext.h
+nonidl!(
+ nsIScriptContext,
+ nsID(
+ 0x54cbe9cf,
+ 0x7282,
+ 0x421a,
+ [0x91, 0x6f, 0xd0, 0x70, 0x73, 0xde, 0xb8, 0xc0]
+ )
+);
+
+// Must be kept in sync with nsIScriptGlobalObject.h
+nonidl!(
+ nsIScriptGlobalObject,
+ nsID(
+ 0x876f83bd,
+ 0x6314,
+ 0x460a,
+ [0xa0, 0x45, 0x1c, 0x8f, 0x46, 0x2f, 0xb8, 0xe1]
+ )
+);
+
+// Must be kept in sync with nsIScrollObserver.h
+nonidl!(
+ nsIScrollObserver,
+ nsID(
+ 0xaa5026eb,
+ 0x2f88,
+ 0x4026,
+ [0xa4, 0x6b, 0xf4, 0x59, 0x6b, 0x4e, 0xdf, 0x00]
+ )
+);
+
+// Must be kept in sync with nsIWidget.h
+nonidl!(
+ nsIWidget,
+ nsID(
+ 0x06396bf6,
+ 0x2dd8,
+ 0x45e5,
+ [0xac, 0x45, 0x75, 0x26, 0x53, 0xb1, 0xc9, 0x80]
+ )
+);