summaryrefslogtreecommitdiffstats
path: root/toolkit/library/rust
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/library/rust')
-rw-r--r--toolkit/library/rust/Cargo.toml31
-rw-r--r--toolkit/library/rust/gkrust-features.mozbuild90
-rw-r--r--toolkit/library/rust/lib.rs9
-rw-r--r--toolkit/library/rust/moz.build61
-rw-r--r--toolkit/library/rust/shared/Cargo.toml161
-rw-r--r--toolkit/library/rust/shared/lib.rs191
6 files changed, 543 insertions, 0 deletions
diff --git a/toolkit/library/rust/Cargo.toml b/toolkit/library/rust/Cargo.toml
new file mode 100644
index 0000000000..b307bc8558
--- /dev/null
+++ b/toolkit/library/rust/Cargo.toml
@@ -0,0 +1,31 @@
+[package]
+name = "gkrust"
+version = "0.1.0"
+authors = ["The Mozilla Project Developers"]
+license = "MPL-2.0"
+description = "Rust code for libxul"
+
+[dependencies]
+gkrust-shared = { path = "shared" }
+mozilla-central-workspace-hack = { version = "0.1", features = ["gkrust"], optional = true }
+
+# Workarounds for https://github.com/rust-lang/rust/issues/58393
+mozglue-static = { path = "../../../mozglue/static/rust" }
+swgl = { path = "../../../gfx/wr/swgl" }
+lmdb-rkv-sys = "0.11"
+
+[dev-dependencies]
+stylo_tests = { path = "../../../servo/ports/geckolib/tests/" }
+
+[lib]
+path = "lib.rs"
+crate-type = ["staticlib"]
+test = false
+doctest = false
+bench = false
+doc = false
+plugin = false
+harness = false
+
+[package.metadata.cargo-udeps.ignore]
+normal = ["mozilla-central-workspace-hack"]
diff --git a/toolkit/library/rust/gkrust-features.mozbuild b/toolkit/library/rust/gkrust-features.mozbuild
new file mode 100644
index 0000000000..7b0724960f
--- /dev/null
+++ b/toolkit/library/rust/gkrust-features.mozbuild
@@ -0,0 +1,90 @@
+# -*- Mode: python; c-basic-offset: 4; 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/.
+
+gkrust_features = []
+
+if CONFIG["MOZ_DEBUG"]:
+ gkrust_features += [
+ "gecko_debug",
+ "gecko_refcount_logging",
+ ]
+
+if CONFIG["MOZ_TSAN"]:
+ gkrust_features += ["thread_sanitizer"]
+
+if CONFIG["MOZ_WEBRENDER_DEBUGGER"]:
+ gkrust_features += ["webrender_debugger"]
+
+if CONFIG["MOZ_PULSEAUDIO"]:
+ gkrust_features += ["cubeb_pulse_rust"]
+
+if CONFIG["MOZ_AUDIOUNIT_RUST"]:
+ gkrust_features += ["cubeb_coreaudio_rust"]
+
+if CONFIG["MOZ_RUST_SIMD"]:
+ gkrust_features += ["simd-accel"]
+
+# This feature is not yet supported on all platforms, and this check needs to
+# match MOZ_CUBEB_REMOTING in CubebUtils.cpp.
+if (
+ CONFIG["OS_ARCH"] == "Linux"
+ or CONFIG["OS_ARCH"] == "Darwin"
+ or CONFIG["OS_ARCH"] == "WINNT"
+):
+ gkrust_features += ["cubeb-remoting"]
+
+if CONFIG["MOZ_MEMORY"]:
+ gkrust_features += ["moz_memory"]
+
+if CONFIG["MOZ_PLACES"]:
+ gkrust_features += ["moz_places"]
+
+if CONFIG["JS_ENABLE_SMOOSH"]:
+ gkrust_features += ["smoosh"]
+
+if CONFIG["MOZ_GECKO_PROFILER"]:
+ gkrust_features += ["gecko_profiler"]
+
+if CONFIG["MOZ_GECKO_PROFILER_PARSE_ELF"]:
+ gkrust_features += ["gecko_profiler_parse_elf"]
+
+if CONFIG["MOZ_BITS_DOWNLOAD"]:
+ gkrust_features += ["bitsdownload"]
+
+if CONFIG["LIBFUZZER"]:
+ gkrust_features += ["libfuzzer"]
+
+if CONFIG["MOZ_WEBRTC"]:
+ gkrust_features += ["webrtc"]
+
+# We need to tell Glean it is being built with Gecko.
+gkrust_features += ["glean_with_gecko"]
+
+if not CONFIG["MOZILLA_OFFICIAL"]:
+ gkrust_features += ["glean_disable_upload"]
+
+if CONFIG["OS_TARGET"] != "Android":
+ gkrust_features += ["glean_million_queue"]
+
+if CONFIG["MOZ_ENABLE_DBUS"]:
+ gkrust_features += ["with_dbus"]
+
+if CONFIG["MOZ_CRASHREPORTER"]:
+ gkrust_features += ["crashreporter"]
+ if CONFIG["MOZ_OXIDIZED_BREAKPAD"]:
+ gkrust_features += ["oxidized_breakpad"]
+
+if CONFIG["MOZ_WEBMIDI_MIDIR_IMPL"]:
+ gkrust_features += ["webmidi_midir_impl"]
+
+if CONFIG["MOZ_UNIFFI_FIXTURES"]:
+ gkrust_features += ["uniffi_fixtures"]
+
+if CONFIG["MOZ_ICU4X"]:
+ gkrust_features += ["icu4x"]
+
+# This must remain last.
+gkrust_features = ["gkrust-shared/%s" % f for f in gkrust_features]
diff --git a/toolkit/library/rust/lib.rs b/toolkit/library/rust/lib.rs
new file mode 100644
index 0000000000..815413a5da
--- /dev/null
+++ b/toolkit/library/rust/lib.rs
@@ -0,0 +1,9 @@
+// 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/.
+
+// You should not be adding code to this crate; you will almost certainly
+// get link errors when linking libxul-gtest. Add any |extern crate|
+// declarations or similar to the gkrust-shared crate in
+// toolkit/library/rust/shared/lib.rs.
+extern crate gkrust_shared;
diff --git a/toolkit/library/rust/moz.build b/toolkit/library/rust/moz.build
new file mode 100644
index 0000000000..eb2db8f81b
--- /dev/null
+++ b/toolkit/library/rust/moz.build
@@ -0,0 +1,61 @@
+# -*- Mode: python; c-basic-offset: 4; 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/.
+
+include("gkrust-features.mozbuild")
+
+RustLibrary("gkrust", gkrust_features, is_gkrust=True)
+
+for feature in gkrust_features:
+ # We don't want to enable refcount logging during rusttests, since the
+ # relevant FFI symbols wouldn't be found.
+ # Nor do we want Glean to assume there are Gecko symbols.
+ if feature not in (
+ "gkrust-shared/gecko_refcount_logging",
+ "gkrust-shared/glean_with_gecko",
+ ):
+ RUST_TEST_FEATURES.append(feature)
+
+# Target directory doesn't matter a lot here, since we can't share panic=abort
+# compilation artifacts with gkrust.
+RUST_TESTS = [
+ "firefox-on-glean",
+ "l10nregistry",
+ "selectors",
+ "servo_arc",
+ "qcms",
+ # this does nothing, but is needed so that `gkrust_features` are recognized
+ # also see: https://github.com/rust-lang/cargo/issues/9856
+ "gkrust",
+]
+
+# Code coverage builds link a bunch of Gecko bindings code from the style
+# crate, which is not used by our tests but would cause link errors.
+#
+# Bug 1768874 tracks improving the setup to potentially remove these
+# altogether.
+if not CONFIG["MOZ_CODE_COVERAGE"]:
+ RUST_TESTS += ["stylo_tests"]
+ # Same happens for the style tests, except the windows linker is not great
+ # at eliminating dead code, so we end up with some missing symbols too.
+ if CONFIG["OS_TARGET"] != "WINNT":
+ RUST_TESTS += ["style"]
+
+if CONFIG["TARGET_CPU"] != "x86":
+ # malloc_size_of_derive is a build dependency, so if we are doing
+ # cross-compile for x86, this may not run correctly.
+ RUST_TESTS += ["malloc_size_of_derive"]
+
+if CONFIG["MOZ_BITS_DOWNLOAD"]:
+ RUST_TESTS += ["bits_client"]
+
+# Export the `rure` crate's included .h file. The symbols defined in that file
+# will be exported from the `gkrust-shared` crate.
+EXPORTS += [
+ "/third_party/rust/rure/include/rure.h",
+]
+
+COMPILE_FLAGS["BASE_INCLUDES"] = []
+HOST_COMPILE_FLAGS["BASE_INCLUDES"] = []
diff --git a/toolkit/library/rust/shared/Cargo.toml b/toolkit/library/rust/shared/Cargo.toml
new file mode 100644
index 0000000000..a3c5bef5f6
--- /dev/null
+++ b/toolkit/library/rust/shared/Cargo.toml
@@ -0,0 +1,161 @@
+
+[package]
+name = "gkrust-shared"
+version = "0.1.0"
+authors = ["The Mozilla Project Developers"]
+license = "MPL-2.0"
+description = "Shared Rust code for libxul"
+
+[dependencies]
+moz_asserts = "0.1"
+mozglue-static = { path = "../../../../mozglue/static/rust" }
+geckoservo = { path = "../../../../servo/ports/geckolib" }
+kvstore = { path = "../../../components/kvstore" }
+lmdb-rkv-sys = { version = "0.11", features = ["mdb_idl_logn_9"] }
+mp4parse_capi = { git = "https://github.com/mozilla/mp4parse-rust", rev = "a138e40ec1c603615873e524b5b22e11c0ec4820", features = ["missing-pixi-permitted"] }
+nserror = { path = "../../../../xpcom/rust/nserror" }
+nsstring = { path = "../../../../xpcom/rust/nsstring" }
+netwerk_helper = { path = "../../../../netwerk/base/rust-helper" }
+xpcom = { path = "../../../../xpcom/rust/xpcom" }
+prefs_parser = { path = "../../../../modules/libpref/parser" }
+static_prefs = { path = "../../../../modules/libpref/init/static_prefs" }
+profiler_helper = { path = "../../../../tools/profiler/rust-helper", optional = true }
+mozurl = { path = "../../../../netwerk/base/mozurl" }
+webrender_bindings = { path = "../../../../gfx/webrender_bindings" }
+cubeb-coreaudio = { git = "https://github.com/mozilla/cubeb-coreaudio-rs", rev = "d23ab55eab684b46f46e1da177c8814f6103a009", optional = true }
+cubeb-pulse = { git = "https://github.com/mozilla/cubeb-pulse-rs", rev="8ff972c8e2ec1782ff262ac4071c0415e69b1367", optional = true, features=["pulse-dlopen"] }
+cubeb-sys = { version = "0.12.0", optional = true, features=["gecko-in-tree"] }
+audioipc2-client = { git = "https://github.com/mozilla/audioipc", rev = "596bdb7fbb5745ea415726e16bd497e6c850a540", optional = true }
+audioipc2-server = { git = "https://github.com/mozilla/audioipc", rev = "596bdb7fbb5745ea415726e16bd497e6c850a540", optional = true }
+encoding_glue = { path = "../../../../intl/encoding_glue" }
+authrs_bridge = { path = "../../../../dom/webauthn/authrs_bridge" }
+gkrust_utils = { path = "../../../../xpcom/rust/gkrust_utils" }
+gecko_logger = { path = "../../../../xpcom/rust/gecko_logger" }
+rsdparsa_capi = { path = "../../../../dom/media/webrtc/sdp/rsdparsa_capi" }
+# We have these to enforce common feature sets for said crates.
+log = {version = "0.4", features = ["release_max_level_info"]}
+cose-c = { version = "0.1.5" }
+jsrust_shared = { path = "../../../../js/src/rust/shared" }
+cascade_bloom_filter = { path = "../../../components/cascade_bloom_filter" }
+cert_storage = { path = "../../../../security/manager/ssl/cert_storage" }
+crypto_hash = { path = "../../../../security/manager/ssl/crypto_hash" }
+data_storage = { path = "../../../../security/manager/ssl/data_storage" }
+bitsdownload = { path = "../../../components/bitsdownload", optional = true }
+storage = { path = "../../../../storage/rust" }
+bookmark_sync = { path = "../../../components/places/bookmark_sync", optional = true }
+chardetng_c = "0.1.1"
+audio_thread_priority = { version = "0.31", default_features = false }
+mdns_service = { path="../../../../dom/media/webrtc/transport/mdns_service", optional = true }
+neqo_glue = { path = "../../../../netwerk/socket/neqo_glue" }
+wgpu_bindings = { path = "../../../../gfx/wgpu_bindings" }
+mapped_hyph = { git = "https://github.com/jfkthame/mapped_hyph.git", rev = "c7651a0cffff41996ad13c44f689bd9cd2192c01" }
+fog_control = { path = "../../../components/glean" }
+app_services_logger = { path = "../../../../services/common/app_services_logger" }
+http_sfv = { path = "../../../../netwerk/base/http-sfv" }
+unic-langid = { version = "0.9", features = ["likelysubtags"] }
+unic-langid-ffi = { path = "../../../../intl/locale/rust/unic-langid-ffi" }
+fluent-langneg = { version = "0.13", features = ["cldr"] }
+fluent-langneg-ffi = { path = "../../../../intl/locale/rust/fluent-langneg-ffi" }
+oxilangtag = "0.1.3"
+oxilangtag-ffi = { path = "../../../../intl/locale/rust/oxilangtag-ffi" }
+unicode-bidi = "0.3.15"
+unicode-bidi-ffi = { path = "../../../../intl/bidi/rust/unicode-bidi-ffi" }
+rure = "0.2.2"
+rust_minidump_writer_linux = { path = "../../../crashreporter/rust_minidump_writer_linux", optional = true }
+mozannotation_client = { path = "../../../crashreporter/mozannotation_client", optional = true }
+mozannotation_server = { path = "../../../crashreporter/mozannotation_server", optional = true }
+gecko-profiler = { path = "../../../../tools/profiler/rust-api"}
+midir_impl = { path = "../../../../dom/midi/midir_impl", optional = true }
+dom = { path = "../../../../dom/base/rust" }
+origin-trials-ffi = { path = "../../../../dom/origin-trials/ffi" }
+jog = { path = "../../../components/glean/bindings/jog" }
+dap_ffi = { path = "../../../components/telemetry/dap/ffi" }
+data-encoding-ffi = { path = "../../../../dom/fs/parent/rust/data-encoding-ffi" }
+uniffi-example-arithmetic = { git = "https://github.com/mozilla/uniffi-rs.git", rev = "afb29ebdc1d9edf15021b1c5332fc9f285bbe13b", optional = true }
+uniffi-example-geometry = { git = "https://github.com/mozilla/uniffi-rs.git", rev = "afb29ebdc1d9edf15021b1c5332fc9f285bbe13b", optional = true }
+uniffi-example-rondpoint = { git = "https://github.com/mozilla/uniffi-rs.git", rev = "afb29ebdc1d9edf15021b1c5332fc9f285bbe13b", optional = true }
+uniffi-example-sprites = { git = "https://github.com/mozilla/uniffi-rs.git", rev = "afb29ebdc1d9edf15021b1c5332fc9f285bbe13b", optional = true }
+uniffi-example-todolist = { git = "https://github.com/mozilla/uniffi-rs.git", rev = "afb29ebdc1d9edf15021b1c5332fc9f285bbe13b", optional = true }
+uniffi-example-custom-types = { path = "../../../components/uniffi-example-custom-types/", optional = true }
+uniffi-fixture-callbacks = { path = "../../../components/uniffi-fixture-callbacks/", optional = true }
+uniffi-fixture-external-types = { path = "../../../components/uniffi-fixture-external-types/", optional = true }
+binary_http = { path = "../../../../netwerk/protocol/http/binary_http" }
+oblivious_http = { path = "../../../../netwerk/protocol/http/oblivious_http" }
+mime-guess-ffi = { path = "../../../../dom/fs/parent/rust/mime-guess-ffi" }
+uniffi = { version = "0.25.2" }
+
+# Note: `modern_sqlite` means rusqlite's bindings file be for a sqlite with
+# version less than or equal to what we link to. This isn't a problem because we
+# tend to keep this up to date, but it needs to be taken into consideration when
+# changing this version.
+rusqlite = { workspace = true, features = ["modern_sqlite", "in_gecko"] }
+
+fluent = { version = "0.16.0", features = ["fluent-pseudo"] }
+fluent-ffi = { path = "../../../../intl/l10n/rust/fluent-ffi" }
+l10nregistry-ffi = { path = "../../../../intl/l10n/rust/l10nregistry-ffi" }
+l10nregistry = { path = "../../../../intl/l10n/rust/l10nregistry-rs" }
+fluent-fallback = "0.7.0"
+localization-ffi = { path = "../../../../intl/l10n/rust/localization-ffi" }
+
+processtools = { path = "../../../components/processtools" }
+qcms = { path = "../../../../gfx/qcms", features = ["c_bindings", "neon"], default-features = false }
+
+wpf-gpu-raster = { git = "https://github.com/FirefoxGraphics/wpf-gpu-raster", rev = "99979da091fd58fba8477e7fcdf5ec0727102916" }
+aa-stroke = { git = "https://github.com/FirefoxGraphics/aa-stroke", rev = "96e66f91bb8e8efb80ff144eabd668002aa89650" }
+
+url = "2.5.0"
+
+# Since we're building with at least rustc 1.63, enable rust 1.57 features (use of try_reserve methods).
+fallible_collections = { version = "0.4", features = ["rust_1_57"] }
+
+[target.'cfg(not(target_os = "android"))'.dependencies]
+viaduct = "0.1"
+webext_storage_bridge = { path = "../../../components/extensions/storage/webext_storage_bridge" }
+tabs = { version = "0.1" }
+suggest = { version = "0.1" }
+
+[target.'cfg(target_os = "windows")'.dependencies]
+detect_win32k_conflicts = { path = "../../../xre/detect_win32k_conflicts" }
+
+[features]
+default = []
+moz_memory = ["mozglue-static/moz_memory"]
+cubeb-remoting = ["cubeb-sys", "audioipc2-client", "audioipc2-server"]
+cubeb_coreaudio_rust = ["cubeb-sys", "cubeb-coreaudio"]
+cubeb_pulse_rust = ["cubeb-sys", "cubeb-pulse"]
+gecko_debug = ["geckoservo/gecko_debug", "nsstring/gecko_debug"]
+gecko_refcount_logging = ["geckoservo/gecko_refcount_logging", "xpcom/gecko_refcount_logging"]
+simd-accel = ["encoding_glue/simd-accel", "jsrust_shared/simd-accel"]
+moz_places = ["bookmark_sync"]
+spidermonkey_rust = []
+smoosh = ["jsrust_shared/smoosh"]
+gecko_profiler = ["gecko-profiler/enabled", "profiler_helper"]
+gecko_profiler_parse_elf = ["profiler_helper/parse_elf"]
+libfuzzer = ["authrs_bridge/fuzzing"]
+webrtc = ["mdns_service"]
+glean_disable_upload = ["fog_control/disable_upload"]
+glean_million_queue = ["fog_control/million_queue"]
+glean_with_gecko = ["fog_control/with_gecko", "jog/with_gecko"]
+oxidized_breakpad = ["rust_minidump_writer_linux"]
+crashreporter = ["mozannotation_client", "mozannotation_server"]
+with_dbus = ["audio_thread_priority/with_dbus"]
+thread_sanitizer = ["xpcom/thread_sanitizer"]
+uniffi_fixtures = [
+ "uniffi-example-arithmetic", "uniffi-example-geometry", "uniffi-example-rondpoint", "uniffi-example-sprites",
+ "uniffi-example-todolist", "uniffi-example-custom-types", "uniffi-fixture-callbacks",
+ "uniffi-fixture-external-types",
+]
+webmidi_midir_impl = ["midir_impl"]
+icu4x = ["jsrust_shared/icu4x"]
+
+[lib]
+path = "lib.rs"
+test = false
+doctest = false
+bench = false
+doc = false
+plugin = false
+harness = false
+
+[package.metadata.cargo-udeps.ignore]
+normal = ["moz_asserts"]
diff --git a/toolkit/library/rust/shared/lib.rs b/toolkit/library/rust/shared/lib.rs
new file mode 100644
index 0000000000..0179c27a05
--- /dev/null
+++ b/toolkit/library/rust/shared/lib.rs
@@ -0,0 +1,191 @@
+// 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/.
+
+extern crate geckoservo;
+
+extern crate app_services_logger;
+#[cfg(feature = "cubeb-remoting")]
+extern crate audioipc2_client;
+#[cfg(feature = "cubeb-remoting")]
+extern crate audioipc2_server;
+extern crate authrs_bridge;
+#[cfg(feature = "bitsdownload")]
+extern crate bitsdownload;
+#[cfg(feature = "moz_places")]
+extern crate bookmark_sync;
+extern crate cascade_bloom_filter;
+extern crate cert_storage;
+extern crate chardetng_c;
+extern crate cosec;
+extern crate crypto_hash;
+#[cfg(feature = "cubeb_coreaudio_rust")]
+extern crate cubeb_coreaudio;
+#[cfg(feature = "cubeb_pulse_rust")]
+extern crate cubeb_pulse;
+extern crate data_storage;
+extern crate encoding_glue;
+extern crate fog_control;
+extern crate gecko_profiler;
+extern crate gkrust_utils;
+extern crate http_sfv;
+extern crate jog;
+extern crate jsrust_shared;
+extern crate kvstore;
+extern crate mapped_hyph;
+extern crate mozurl;
+extern crate mp4parse_capi;
+extern crate netwerk_helper;
+extern crate nserror;
+extern crate nsstring;
+extern crate prefs_parser;
+extern crate processtools;
+#[cfg(feature = "gecko_profiler")]
+extern crate profiler_helper;
+extern crate rsdparsa_capi;
+extern crate static_prefs;
+extern crate storage;
+extern crate webrender_bindings;
+extern crate xpcom;
+
+extern crate audio_thread_priority;
+
+#[cfg(not(target_os = "android"))]
+extern crate webext_storage_bridge;
+
+#[cfg(not(target_os = "android"))]
+extern crate tabs;
+
+#[cfg(not(target_os = "android"))]
+mod reexport_tabs {
+ tabs::uniffi_reexport_scaffolding!();
+}
+
+#[cfg(not(target_os = "android"))]
+extern crate suggest;
+
+#[cfg(not(target_os = "android"))]
+mod reexport_suggest {
+ suggest::uniffi_reexport_scaffolding!();
+}
+
+#[cfg(feature = "webrtc")]
+extern crate mdns_service;
+extern crate neqo_glue;
+extern crate wgpu_bindings;
+
+extern crate aa_stroke;
+extern crate qcms;
+extern crate wpf_gpu_raster;
+
+extern crate unic_langid;
+extern crate unic_langid_ffi;
+
+extern crate fluent_langneg;
+extern crate fluent_langneg_ffi;
+
+extern crate fluent;
+extern crate fluent_ffi;
+
+extern crate oxilangtag_ffi;
+extern crate unicode_bidi_ffi;
+
+extern crate rure;
+
+extern crate fluent_fallback;
+extern crate l10nregistry_ffi;
+extern crate localization_ffi;
+
+#[cfg(not(target_os = "android"))]
+extern crate viaduct;
+
+extern crate gecko_logger;
+
+#[cfg(feature = "oxidized_breakpad")]
+extern crate rust_minidump_writer_linux;
+
+#[cfg(feature = "crashreporter")]
+extern crate mozannotation_client;
+#[cfg(feature = "crashreporter")]
+extern crate mozannotation_server;
+
+#[cfg(feature = "webmidi_midir_impl")]
+extern crate midir_impl;
+
+#[cfg(target_os = "windows")]
+extern crate detect_win32k_conflicts;
+
+extern crate origin_trials_ffi;
+
+extern crate dap_ffi;
+
+extern crate data_encoding_ffi;
+
+extern crate binary_http;
+extern crate oblivious_http;
+
+extern crate mime_guess_ffi;
+
+#[cfg(feature = "uniffi_fixtures")]
+mod uniffi_fixtures {
+ extern crate arithmetical;
+ extern crate uniffi_geometry;
+ extern crate uniffi_rondpoint;
+ extern crate uniffi_sprites;
+ extern crate uniffi_todolist;
+
+ arithmetical::uniffi_reexport_scaffolding!();
+ uniffi_fixture_callbacks::uniffi_reexport_scaffolding!();
+ uniffi_custom_types::uniffi_reexport_scaffolding!();
+ uniffi_fixture_external_types::uniffi_reexport_scaffolding!();
+ uniffi_geometry::uniffi_reexport_scaffolding!();
+ uniffi_rondpoint::uniffi_reexport_scaffolding!();
+ uniffi_sprites::uniffi_reexport_scaffolding!();
+ uniffi_todolist::uniffi_reexport_scaffolding!();
+}
+
+extern crate log;
+use log::info;
+
+use std::{ffi::CStr, os::raw::c_char};
+
+use gecko_logger::GeckoLogger;
+
+#[no_mangle]
+pub extern "C" fn GkRust_Init() {
+ // Initialize logging.
+ let _ = GeckoLogger::init();
+}
+
+#[no_mangle]
+pub extern "C" fn GkRust_Shutdown() {}
+
+/// Used to implement `nsIDebug2::RustPanic` for testing purposes.
+#[no_mangle]
+pub unsafe extern "C" fn intentional_panic(message: *const c_char) {
+ panic!("{}", CStr::from_ptr(message).to_string_lossy());
+}
+
+/// Used to implement `nsIDebug2::rustLog` for testing purposes.
+#[no_mangle]
+pub unsafe extern "C" fn debug_log(target: *const c_char, message: *const c_char) {
+ // NOTE: The `info!` log macro is used here because we have the `release_max_level_info` feature set.
+ info!(target: CStr::from_ptr(target).to_str().unwrap(), "{}", CStr::from_ptr(message).to_str().unwrap());
+}
+
+// Define extern "C" versions of these UniFFI functions, so that they can be called from C++
+#[no_mangle]
+pub extern "C" fn uniffi_rustbuffer_alloc(
+ size: i32,
+ call_status: &mut uniffi::RustCallStatus,
+) -> uniffi::RustBuffer {
+ uniffi::uniffi_rustbuffer_alloc(size, call_status)
+}
+
+#[no_mangle]
+pub extern "C" fn uniffi_rustbuffer_free(
+ buf: uniffi::RustBuffer,
+ call_status: &mut uniffi::RustCallStatus,
+) {
+ uniffi::uniffi_rustbuffer_free(buf, call_status)
+}