LibWeb: Mark image elements for layout before firing their load event

This removes a long-standing source of flakiness seen for example in
WPT's /referrer-policy/ tests.

(cherry picked from commit 063cd68bf472061ec35cf9b8970aa6e614632c9b)
This commit is contained in:
Andreas Kling authored and Nico Weber committed 2024-11-20 22:51:34 -05:00
1 parent 27c1ce5299
commit a65b5cb135
3 files changed
+17 -3

No files matched your search

@@ -0,0 +1 @@
image is 400x400
@@ -0,0 +1,13 @@
<script src="../include.js"></script>
<script>
asyncTest((done) => {
let img = document.createElement("img");
img.src = "../../../Layout/input/400.png";
document.body.appendChild(img);
img.onload = function() {
println("image is " + img.clientWidth + "x" + img.clientHeight);
img.remove();
done();
};
});
</script>
@@ -701,13 +701,13 @@ void HTMLImageElement::add_callbacks_to_image_request(JS::NonnullGCPtr<ImageRequ
// 3. Add the image to the list of available images using the key key, with the ignore higher-layer caching flag set.
document().list_of_available_images().add(key, *image_data, true);
set_needs_style_update(true);
document().set_needs_layout();
// 4. If maybe omit events is not set or previousURL is not equal to urlString, then fire an event named load at the img element.
if (!maybe_omit_events || previous_url != url_string)
dispatch_event(DOM::Event::create(realm(), HTML::EventNames::load));
set_needs_style_update(true);
document().set_needs_layout();
if (image_data->is_animated() && image_data->frame_count() > 1) {
m_current_frame_index = 0;
m_animation_timer->set_interval(image_data->frame_duration(0));