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.
This commit is contained in:
Andreas Kling 2022-09-07 16:46:05 +02:00
parent 514fa83708
commit faf9746244
Notes: sideshowbarker 2024-07-17 23:00:03 +09:00
3 changed files with 21 additions and 1 deletions
Userland/Libraries/LibWeb

View file

@ -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::ImageBox>(*layout_node()).dom_node_did_update_alt_text({});
}
}
RefPtr<Layout::Node> HTMLImageElement::create_layout_node(NonnullRefPtr<CSS::StyleProperties> style)

View file

@ -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<HTML::HTMLImageElement>)
{
m_cached_alt_text_width = {};
}
bool ImageBox::renders_as_alt_text() const
{
if (is<HTML::HTMLImageElement>(dom_node()))

View file

@ -29,6 +29,8 @@ public:
auto const& image_loader() const { return m_image_loader; }
void dom_node_did_update_alt_text(Badge<HTML::HTMLImageElement>);
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<float> m_cached_alt_text_width;
};
}