script/dom/testing/
servotestutils.rs1use backtrace::Backtrace;
8use dom_struct::dom_struct;
9use layout_api::ReflowPhasesRun;
10use script_bindings::codegen::GenericBindings::WindowBinding::WindowMethods;
11use script_bindings::domstring::DOMString;
12use script_bindings::reflector::Reflector;
13use script_bindings::root::DomRoot;
14use script_bindings::script_runtime::CanGc;
15
16use crate::dom::bindings::codegen::Bindings::ServoTestUtilsBinding::ServoTestUtilsMethods;
17use crate::dom::globalscope::GlobalScope;
18use crate::dom::layoutresult::LayoutResult;
19
20#[dom_struct]
21pub(crate) struct ServoTestUtils {
22 reflector_: Reflector,
23}
24
25impl ServoTestUtilsMethods<crate::DomTypeHolder> for ServoTestUtils {
26 fn AdvanceClock(global: &GlobalScope, ms: i32) {
27 global.as_window().advance_animation_clock(ms);
28 }
29
30 #[expect(unsafe_code)]
31 fn CrashHard(_: &GlobalScope) {
32 unsafe { std::ptr::null_mut::<i32>().write(42) }
33 }
34
35 fn ForceLayout(global: &GlobalScope, can_gc: CanGc) -> DomRoot<LayoutResult> {
36 let phases_run = global.as_window().Document().update_the_rendering();
37
38 let mut phases = Vec::new();
39 if phases_run.contains(ReflowPhasesRun::RanLayout) {
40 phases.push(DOMString::from("RanLayout"))
41 }
42 if phases_run.contains(ReflowPhasesRun::CalculatedOverflow) {
43 phases.push(DOMString::from("CalculatedOverflow"))
44 }
45 if phases_run.contains(ReflowPhasesRun::BuiltStackingContextTree) {
46 phases.push(DOMString::from("BuiltStackingContextTree"))
47 }
48 if phases_run.contains(ReflowPhasesRun::BuiltDisplayList) {
49 phases.push(DOMString::from("BuiltDisplayList"))
50 }
51 if phases_run.contains(ReflowPhasesRun::UpdatedScrollNodeOffset) {
52 phases.push(DOMString::from("UpdatedScrollNodeOffset"))
53 }
54 if phases_run.contains(ReflowPhasesRun::UpdatedImageData) {
55 phases.push(DOMString::from("UpdatedImageData"))
56 }
57
58 LayoutResult::new(global, phases, can_gc)
59 }
60
61 fn Js_backtrace(_: &GlobalScope) {
62 println!("Current JS stack:");
63 let rust_stack = Backtrace::new();
64 println!("Current Rust stack:\n{:?}", rust_stack);
65 }
66
67 fn Panic(_: &GlobalScope) {
68 panic!("explicit panic from script")
69 }
70}