From 2413de7e10efda16f6f376b42b204279d7a25906 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 1 Apr 2023 15:15:23 +0200 Subject: [PATCH] LibWeb: Make HTMLImageElement loads delay the document load event This is something we're supposed to do according to the HTML spec. Note that image loading is currently completely ad-hoc, and this just adds a simple DocumentLoadEventDelayer to the existing implementation. This will allow us to use images in layout tests, which rely on the document load event firing at a predictable time. --- Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp | 6 +++++- Userland/Libraries/LibWeb/HTML/HTMLImageElement.h | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp index d894147746..c1ee553898 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp @@ -28,6 +28,7 @@ HTMLImageElement::HTMLImageElement(DOM::Document& document, DOM::QualifiedName q this->document().set_needs_layout(); queue_an_element_task(HTML::Task::Source::DOMManipulation, [this] { dispatch_event(DOM::Event::create(this->realm(), EventNames::load).release_value_but_fixme_should_propagate_errors()); + m_load_event_delayer.clear(); }); }; @@ -37,6 +38,7 @@ HTMLImageElement::HTMLImageElement(DOM::Document& document, DOM::QualifiedName q this->document().set_needs_layout(); queue_an_element_task(HTML::Task::Source::DOMManipulation, [this] { dispatch_event(DOM::Event::create(this->realm(), EventNames::error).release_value_but_fixme_should_propagate_errors()); + m_load_event_delayer.clear(); }); }; @@ -83,8 +85,10 @@ void HTMLImageElement::parse_attribute(DeprecatedFlyString const& name, Deprecat { HTMLElement::parse_attribute(name, value); - if (name == HTML::AttributeNames::src && !value.is_empty()) + if (name == HTML::AttributeNames::src && !value.is_empty()) { m_image_loader.load(document().parse_url(value)); + m_load_event_delayer.emplace(document()); + } if (name == HTML::AttributeNames::alt) { if (layout_node()) diff --git a/Userland/Libraries/LibWeb/HTML/HTMLImageElement.h b/Userland/Libraries/LibWeb/HTML/HTMLImageElement.h index b7a3d8f33c..cb67feb645 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLImageElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLImageElement.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -54,6 +55,8 @@ private: virtual JS::GCPtr create_layout_node(NonnullRefPtr) override; ImageLoader m_image_loader; + + Optional m_load_event_delayer; }; }