aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorSebastian C <sebsebmc@gmail.com>2025-04-04 14:42:28 -0500
committerGitHub <noreply@github.com>2025-04-04 19:42:28 +0000
commitd93dad7f49f46263b6fe08485f4c4dcff6cd2812 (patch)
tree43c46a261aaf3f8986de5f3787b54f6511a2b535 /components
parent5a35e1faec941b02291b33d10cd2f516e0464f01 (diff)
downloadservo-d93dad7f49f46263b6fe08485f4c4dcff6cd2812.tar.gz
servo-d93dad7f49f46263b6fe08485f4c4dcff6cd2812.zip
Implement TestUtils (#36301)
Implement the TestUtils namespace from https://testutils.spec.whatwg.org/. This should make the `js/builtins/weakrefs` tests run faster and more consistently. This change will enable other WPT tests but no tests exist currently for TestUtils itself. Fixes: #36290 --------- Signed-off-by: Sebastian C <sebsebmc@gmail.com> Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com> Co-authored-by: sagudev <16504129+sagudev@users.noreply.github.com>
Diffstat (limited to 'components')
-rw-r--r--components/config/prefs.rs3
-rw-r--r--components/script/dom/mod.rs1
-rw-r--r--components/script/dom/testutils.rs49
-rw-r--r--components/script_bindings/webidls/TestUtils.webidl10
4 files changed, 63 insertions, 0 deletions
diff --git a/components/config/prefs.rs b/components/config/prefs.rs
index 5cdfc18ac6b..88f902f425d 100644
--- a/components/config/prefs.rs
+++ b/components/config/prefs.rs
@@ -114,6 +114,8 @@ pub struct Preferences {
pub dom_testing_element_activation_enabled: bool,
pub dom_testing_html_input_element_select_files_enabled: bool,
pub dom_testperf_enabled: bool,
+ // https://testutils.spec.whatwg.org#availability
+ pub dom_testutils_enabled: bool,
/// Enable the [URLPattern] API.
///
/// [URLPattern]: https://developer.mozilla.org/en-US/docs/Web/API/URLPattern
@@ -287,6 +289,7 @@ impl Preferences {
dom_testing_element_activation_enabled: false,
dom_testing_html_input_element_select_files_enabled: false,
dom_testperf_enabled: false,
+ dom_testutils_enabled: false,
dom_urlpattern_enabled: false,
dom_webgl2_enabled: false,
dom_webgpu_enabled: false,
diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs
index 40db03ed655..0b32dafd4e1 100644
--- a/components/script/dom/mod.rs
+++ b/components/script/dom/mod.rs
@@ -555,6 +555,7 @@ pub(crate) mod testbindingproxy;
pub(crate) mod testbindingsetlikewithinterface;
pub(crate) mod testbindingsetlikewithprimitive;
pub(crate) mod testns;
+pub(crate) mod testutils;
pub(crate) mod testworklet;
pub(crate) mod testworkletglobalscope;
pub(crate) mod text;
diff --git a/components/script/dom/testutils.rs b/components/script/dom/testutils.rs
new file mode 100644
index 00000000000..4aadac05da3
--- /dev/null
+++ b/components/script/dom/testutils.rs
@@ -0,0 +1,49 @@
+/* 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/. */
+
+use std::rc::Rc;
+
+use dom_struct::dom_struct;
+use js::jsapi::{GCReason, JS_GC};
+use script_bindings::reflector::Reflector;
+use script_bindings::script_runtime::CanGc;
+
+use super::globalscope::GlobalScope;
+use crate::dom::bindings::codegen::Bindings::TestUtilsBinding::TestUtilsMethods;
+use crate::dom::promise::Promise;
+use crate::test::TrustedPromise;
+
+#[dom_struct]
+pub(crate) struct TestUtils {
+ reflector_: Reflector,
+}
+
+impl TestUtilsMethods<crate::DomTypeHolder> for TestUtils {
+ /// <https://testutils.spec.whatwg.org/#dom-testutils-gc>
+ #[allow(unsafe_code)]
+ fn Gc(global: &GlobalScope) -> Rc<Promise> {
+ // 1. Let p be a new promise.
+ let promise = Promise::new(global, CanGc::note());
+ let trusted = TrustedPromise::new(promise.clone());
+ // 2. Run the following in parallel:
+ // 2.1 Run implementation-defined steps to perform a garbage collection covering at least the entry Realm.
+ // 2.2 Resolve p.
+ // We need to spin the event-loop in order get the GC to actually run.
+ // We do this by queuing a task that calls the GC and then resolves the promise.
+ let task = task!(testutils_gc: move || {
+ unsafe {
+ JS_GC(*GlobalScope::get_cx(), GCReason::DOM_TESTUTILS);
+ }
+ let promise = trusted.root();
+ promise.resolve_native(&(), CanGc::note());
+ });
+
+ global
+ .task_manager()
+ .dom_manipulation_task_source()
+ .queue(task);
+
+ promise
+ }
+}
diff --git a/components/script_bindings/webidls/TestUtils.webidl b/components/script_bindings/webidls/TestUtils.webidl
new file mode 100644
index 00000000000..290b2a22138
--- /dev/null
+++ b/components/script_bindings/webidls/TestUtils.webidl
@@ -0,0 +1,10 @@
+/* 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/. */
+
+// https://testutils.spec.whatwg.org/
+
+[Exposed=(Window,Worker), Pref="dom_testutils_enabled"]
+namespace TestUtils {
+ [NewObject] Promise<undefined> gc();
+};