diff --git a/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp
index c36a4845f3..9e4a0507a4 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp
@@ -78,6 +78,11 @@ void HTMLImageElement::parse_attribute(FlyString const& name, String const& valu
if (name == HTML::AttributeNames::src && !value.is_empty())
m_image_loader.load(document().parse_url(value));
+
+ if (name == HTML::AttributeNames::alt) {
+ if (layout_node())
+ verify_cast(*layout_node()).dom_node_did_update_alt_text({});
+ }
}
RefPtr HTMLImageElement::create_layout_node(NonnullRefPtr style)
diff --git a/Userland/Libraries/LibWeb/Layout/ImageBox.cpp b/Userland/Libraries/LibWeb/Layout/ImageBox.cpp
index cb72558f93..a67843c96b 100644
--- a/Userland/Libraries/LibWeb/Layout/ImageBox.cpp
+++ b/Userland/Libraries/LibWeb/Layout/ImageBox.cpp
@@ -59,7 +59,13 @@ void ImageBox::prepare_for_replaced_layout()
auto alt = image_element.alt();
if (alt.is_empty())
alt = image_element.src();
- set_intrinsic_width(font.width(alt) + 16);
+
+ float alt_text_width = 0;
+ if (!m_cached_alt_text_width.has_value())
+ m_cached_alt_text_width = font.width(alt);
+ alt_text_width = m_cached_alt_text_width.value();
+
+ set_intrinsic_width(alt_text_width + 16);
set_intrinsic_height(font.pixel_size() + 16);
}
@@ -68,6 +74,11 @@ void ImageBox::prepare_for_replaced_layout()
}
}
+void ImageBox::dom_node_did_update_alt_text(Badge)
+{
+ m_cached_alt_text_width = {};
+}
+
bool ImageBox::renders_as_alt_text() const
{
if (is(dom_node()))
diff --git a/Userland/Libraries/LibWeb/Layout/ImageBox.h b/Userland/Libraries/LibWeb/Layout/ImageBox.h
index f03ea9c723..138cb507b8 100644
--- a/Userland/Libraries/LibWeb/Layout/ImageBox.h
+++ b/Userland/Libraries/LibWeb/Layout/ImageBox.h
@@ -29,6 +29,8 @@ public:
auto const& image_loader() const { return m_image_loader; }
+ void dom_node_did_update_alt_text(Badge);
+
private:
// ^BrowsingContext::ViewportClient
virtual void browsing_context_did_set_viewport_rect(Gfx::IntRect const&) final;
@@ -37,6 +39,8 @@ private:
int preferred_height() const;
ImageLoader const& m_image_loader;
+
+ Optional m_cached_alt_text_width;
};
}