From 259d39cbadd342fe22451a616cf06ef6a62498e7 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Tue, 18 Mar 2025 17:40:05 +0100 Subject: [PATCH] UI/Headless: Wait for "reftest-wait" class removal before screenshotting Resolves https://github.com/LadybirdBrowser/ladybird/issues/3984 --- UI/Headless/Test.cpp | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/UI/Headless/Test.cpp b/UI/Headless/Test.cpp index 347f2fdc0f2..e66d3176db6 100644 --- a/UI/Headless/Test.cpp +++ b/UI/Headless/Test.cpp @@ -286,6 +286,27 @@ void run_dump_test(HeadlessWebView& view, Test& test, URL::URL const& url, int t timer->start(); } +static String wait_for_reftest_completion = R"( +function hasReftestWaitClass() { + return document.documentElement.classList.contains('reftest-wait'); +} + +if (!hasReftestWaitClass()) { + internals.signalTestIsDone("PASS"); +} else { + const observer = new MutationObserver(() => { + if (!hasReftestWaitClass()) { + internals.signalTestIsDone("PASS"); + } + }); + + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['class'], + }); +} +)"_string; + static void run_ref_test(HeadlessWebView& view, Test& test, URL::URL const& url, int timeout_in_milliseconds) { auto timer = Core::Timer::create_single_shot(timeout_in_milliseconds, [&view, &test]() { @@ -343,7 +364,11 @@ static void run_ref_test(HeadlessWebView& view, Test& test, URL::URL const& url, view.on_test_complete({ test, TestResult::Crashed }); }; - view.on_load_finish = [&view, &test, on_test_complete = move(on_test_complete)](auto const&) { + view.on_load_finish = [&view](auto const&) { + view.run_javascript(wait_for_reftest_completion); + }; + + view.on_test_finish = [&view, &test, on_test_complete = move(on_test_complete)](auto const&) { if (test.actual_screenshot) { if (view.url().query().has_value() && view.url().query()->equals_ignoring_ascii_case("mismatch"sv)) { test.ref_test_expectation_type = RefTestExpectationType::Mismatch; @@ -364,10 +389,6 @@ static void run_ref_test(HeadlessWebView& view, Test& test, URL::URL const& url, } }; - view.on_test_finish = [&](auto const&) { - dbgln("Unexpected text test finished during ref test for {}", url); - }; - view.on_set_test_timeout = [timer, timeout_in_milliseconds](double milliseconds) { if (milliseconds <= timeout_in_milliseconds) return;