From faf974624428b37176ecb13c87c87de58c23befb Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 7 Sep 2022 16:46:05 +0200 Subject: [PATCH] LibWeb: Cache width of "alt" text in ImageBox We were constantly measuring and re-measuring the "alt" attribute text of ImageBox layout nodes, even when the alt text didn't change. By caching this, we avoid a *lot* of repeated text measurement work. --- Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp | 5 +++++ Userland/Libraries/LibWeb/Layout/ImageBox.cpp | 13 ++++++++++++- Userland/Libraries/LibWeb/Layout/ImageBox.h | 4 ++++ 3 files changed, 21 insertions(+), 1 deletion(-) 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; }; }