diff options
author | Sebastian C <sebsebmc@gmail.com> | 2025-04-04 14:42:28 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-04 19:42:28 +0000 |
commit | d93dad7f49f46263b6fe08485f4c4dcff6cd2812 (patch) | |
tree | 43c46a261aaf3f8986de5f3787b54f6511a2b535 /components/script/dom/testutils.rs | |
parent | 5a35e1faec941b02291b33d10cd2f516e0464f01 (diff) | |
download | servo-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/script/dom/testutils.rs')
-rw-r--r-- | components/script/dom/testutils.rs | 49 |
1 files changed, 49 insertions, 0 deletions
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 + } +} |