Files
ladybird/Tests/LibWeb/Text/input/HTML/img-src-change-during-failed-decode.html
Aliaksandr Kalenik b49c243abd LibWeb: Fix stale image request callbacks corrupting newer requests
When img.src is changed rapidly (e.g., YouTube Music sets a GIF
placeholder then swaps to a real URL via IntersectionObserver), the
failure callback from the stale first request could corrupt the newer
request by calling abort_the_image_request on the now-reassigned
m_current_request.

Fix this by using the existing m_update_the_image_data_count generation
counter to detect stale fetch callbacks.

This fixes thumbnail loading on YouTube Music.
2026-03-03 14:12:06 +01:00

30 lines
1.3 KiB
HTML

<!DOCTYPE html>
<script src="../include.js"></script>
<script>
// Test that changing img.src to a valid image while a previous invalid src is still
// being decoded works correctly. The stale failure callback from the first (invalid)
// src must not corrupt the state of the second (valid) image request.
asyncTest((done) => {
let img = document.createElement("img");
document.body.appendChild(img);
// Set src to data that will fail to decode (not valid image data).
img.src = "data:image/png;base64,dGhpcyBpcyBub3QgYW4gaW1hZ2U=";
// After a task boundary, the microtask for the first src will have run and
// started the decode via ImageDecoder. Change src to a valid 1x1 red PNG.
setTimeout(() => {
img.onload = () => {
println(`naturalWidth: ${img.naturalWidth}`);
println(`naturalHeight: ${img.naturalHeight}`);
done();
};
img.onerror = () => {
println("FAIL: error event fired for valid image");
done();
};
img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwADhQGAWjR9awAAAABJRU5ErkJggg==";
}, 0);
});
</script>