From a40b1183ada5e3ccb3263b537a379fd6cae98b37 Mon Sep 17 00:00:00 2001 From: Callum Law Date: Fri, 12 Jun 2026 21:50:56 +1200 Subject: [PATCH] LibWeb: Hoist overloaded `ImageProvider` methods to base class All of these overloads did the same thing so lets just define them in the base class --- Libraries/LibWeb/HTML/HTMLImageElement.cpp | 40 ----------------- Libraries/LibWeb/HTML/HTMLImageElement.h | 7 --- Libraries/LibWeb/HTML/HTMLInputElement.cpp | 33 -------------- Libraries/LibWeb/HTML/HTMLInputElement.h | 5 --- Libraries/LibWeb/HTML/HTMLObjectElement.cpp | 33 -------------- Libraries/LibWeb/HTML/HTMLObjectElement.h | 5 --- Libraries/LibWeb/Layout/ImageProvider.cpp | 34 +++++++++++++- Libraries/LibWeb/Layout/ImageProvider.h | 14 +++--- Libraries/LibWeb/Layout/TreeBuilder.cpp | 37 --------------- Libraries/LibWeb/SVG/SVGImageElement.cpp | 50 --------------------- Libraries/LibWeb/SVG/SVGImageElement.h | 7 --- 11 files changed, 39 insertions(+), 226 deletions(-) diff --git a/Libraries/LibWeb/HTML/HTMLImageElement.cpp b/Libraries/LibWeb/HTML/HTMLImageElement.cpp index 08487af6a0..1a3e3eec5b 100644 --- a/Libraries/LibWeb/HTML/HTMLImageElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLImageElement.cpp @@ -310,46 +310,6 @@ void HTMLImageElement::adjust_computed_style(CSS::ComputedProperties& style) style.set_property(CSS::PropertyID::Display, CSS::DisplayStyleValue::create(CSS::Display::from_short(CSS::Display::Short::None))); } -Optional HTMLImageElement::default_image_frame_sized(Gfx::IntSize size) const -{ - if (auto data = m_current_request->image_data()) - return data->frame(0, size); - return {}; -} - -bool HTMLImageElement::is_image_available() const -{ - return m_current_request && m_current_request->is_available(); -} - -Optional HTMLImageElement::intrinsic_width() const -{ - if (auto image_data = m_current_request->image_data()) - return image_data->intrinsic_width(); - return {}; -} - -Optional HTMLImageElement::intrinsic_height() const -{ - if (auto image_data = m_current_request->image_data()) - return image_data->intrinsic_height(); - return {}; -} - -Optional HTMLImageElement::intrinsic_aspect_ratio() const -{ - if (auto image_data = m_current_request->image_data()) - return image_data->intrinsic_aspect_ratio(); - return {}; -} - -Optional HTMLImageElement::current_image_frame_sized(Gfx::IntSize size) const -{ - if (auto data = m_current_request->image_data()) - return data->frame(m_current_frame_index, size); - return {}; -} - // https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-width WebIDL::UnsignedLong HTMLImageElement::width() const { diff --git a/Libraries/LibWeb/HTML/HTMLImageElement.h b/Libraries/LibWeb/HTML/HTMLImageElement.h index 4ec91d5151..edfa822e3f 100644 --- a/Libraries/LibWeb/HTML/HTMLImageElement.h +++ b/Libraries/LibWeb/HTML/HTMLImageElement.h @@ -49,8 +49,6 @@ public: String alt() const { return get_attribute_value(HTML::AttributeNames::alt); } - virtual Optional default_image_frame_sized(Gfx::IntSize) const override; - WebIDL::UnsignedLong width() const; void set_width(WebIDL::UnsignedLong); @@ -107,11 +105,6 @@ public: bool allows_auto_sizes() const; // ^Layout::ImageProvider - virtual bool is_image_available() const override; - virtual Optional intrinsic_width() const override; - virtual Optional intrinsic_height() const override; - virtual Optional intrinsic_aspect_ratio() const override; - virtual Optional current_image_frame_sized(Gfx::IntSize) const override; virtual GC::Ptr decoded_image_data() const override; virtual void visit_edges(Cell::Visitor&) override; diff --git a/Libraries/LibWeb/HTML/HTMLInputElement.cpp b/Libraries/LibWeb/HTML/HTMLInputElement.cpp index c7277a3cbe..11c678bc1c 100644 --- a/Libraries/LibWeb/HTML/HTMLInputElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLInputElement.cpp @@ -2314,39 +2314,6 @@ GC::Ptr HTMLInputElement::image_data() const return nullptr; } -bool HTMLInputElement::is_image_available() const -{ - return image_data() != nullptr; -} - -Optional HTMLInputElement::intrinsic_width() const -{ - if (auto image_data = this->image_data()) - return image_data->intrinsic_width(); - return {}; -} - -Optional HTMLInputElement::intrinsic_height() const -{ - if (auto image_data = this->image_data()) - return image_data->intrinsic_height(); - return {}; -} - -Optional HTMLInputElement::intrinsic_aspect_ratio() const -{ - if (auto image_data = this->image_data()) - return image_data->intrinsic_aspect_ratio(); - return {}; -} - -Optional HTMLInputElement::current_image_frame_sized(Gfx::IntSize size) const -{ - if (auto image_data = this->image_data()) - return image_data->frame(0, size); - return {}; -} - // https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex i32 HTMLInputElement::default_tab_index_value() const { diff --git a/Libraries/LibWeb/HTML/HTMLInputElement.h b/Libraries/LibWeb/HTML/HTMLInputElement.h index 4284f034da..679cb9f867 100644 --- a/Libraries/LibWeb/HTML/HTMLInputElement.h +++ b/Libraries/LibWeb/HTML/HTMLInputElement.h @@ -287,11 +287,6 @@ private: virtual bool supports_dimension_attributes() const override { return type_state() == TypeAttributeState::ImageButton; } // ^Layout::ImageProvider - virtual bool is_image_available() const override; - virtual Optional intrinsic_width() const override; - virtual Optional intrinsic_height() const override; - virtual Optional intrinsic_aspect_ratio() const override; - virtual Optional current_image_frame_sized(Gfx::IntSize) const override; virtual size_t current_frame_index() const override { return 0; } virtual GC::Ptr decoded_image_data() const override { return image_data(); } diff --git a/Libraries/LibWeb/HTML/HTMLObjectElement.cpp b/Libraries/LibWeb/HTML/HTMLObjectElement.cpp index a56190e1e7..43b88eb3dd 100644 --- a/Libraries/LibWeb/HTML/HTMLObjectElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLObjectElement.cpp @@ -594,37 +594,4 @@ GC::Ptr HTMLObjectElement::image_data() const return m_resource_request->image_data(); } -bool HTMLObjectElement::is_image_available() const -{ - return image_data() != nullptr; -} - -Optional HTMLObjectElement::intrinsic_width() const -{ - if (auto image_data = this->image_data()) - return image_data->intrinsic_width(); - return {}; -} - -Optional HTMLObjectElement::intrinsic_height() const -{ - if (auto image_data = this->image_data()) - return image_data->intrinsic_height(); - return {}; -} - -Optional HTMLObjectElement::intrinsic_aspect_ratio() const -{ - if (auto image_data = this->image_data()) - return image_data->intrinsic_aspect_ratio(); - return {}; -} - -Optional HTMLObjectElement::current_image_frame_sized(Gfx::IntSize size) const -{ - if (auto image_data = this->image_data()) - return image_data->frame(0, size); - return {}; -} - } diff --git a/Libraries/LibWeb/HTML/HTMLObjectElement.h b/Libraries/LibWeb/HTML/HTMLObjectElement.h index ddd7e0a73f..786bc81856 100644 --- a/Libraries/LibWeb/HTML/HTMLObjectElement.h +++ b/Libraries/LibWeb/HTML/HTMLObjectElement.h @@ -83,11 +83,6 @@ private: virtual i32 default_tab_index_value() const override; // ^Layout::ImageProvider - virtual bool is_image_available() const override; - virtual Optional intrinsic_width() const override; - virtual Optional intrinsic_height() const override; - virtual Optional intrinsic_aspect_ratio() const override; - virtual Optional current_image_frame_sized(Gfx::IntSize) const override; virtual size_t current_frame_index() const override { return 0; } virtual GC::Ptr decoded_image_data() const override { return image_data(); } diff --git a/Libraries/LibWeb/Layout/ImageProvider.cpp b/Libraries/LibWeb/Layout/ImageProvider.cpp index 20d39b3f59..e5c049d18e 100644 --- a/Libraries/LibWeb/Layout/ImageProvider.cpp +++ b/Libraries/LibWeb/Layout/ImageProvider.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include @@ -15,6 +16,27 @@ void ImageProvider::did_update_alt_text(ImageBox& layout_node) layout_node.dom_node_did_update_alt_text({}); } +Optional ImageProvider::intrinsic_width() const +{ + if (auto const& data = decoded_image_data()) + return data->intrinsic_width(); + return {}; +} + +Optional ImageProvider::intrinsic_height() const +{ + if (auto const& data = decoded_image_data()) + return data->intrinsic_height(); + return {}; +} + +Optional ImageProvider::intrinsic_aspect_ratio() const +{ + if (auto const& data = decoded_image_data()) + return data->intrinsic_aspect_ratio(); + return {}; +} + Optional ImageProvider::intrinsic_size() const { auto width = intrinsic_width(); @@ -30,10 +52,18 @@ Optional ImageProvider::current_image_frame() const return current_image_frame_sized(intrinsic_size().value_or({}).to_type()); } +Optional ImageProvider::current_image_frame_sized(Gfx::IntSize size) const +{ + if (auto const& data = decoded_image_data()) + return data->frame(current_frame_index(), size); + return {}; +} + Optional ImageProvider::default_image_frame_sized(Gfx::IntSize size) const { - // Defer to the current image by default. - return current_image_frame_sized(size); + if (auto const& data = decoded_image_data()) + return data->frame(0, size); + return {}; } } diff --git a/Libraries/LibWeb/Layout/ImageProvider.h b/Libraries/LibWeb/Layout/ImageProvider.h index 7e5ea0d6cb..4a63e653ef 100644 --- a/Libraries/LibWeb/Layout/ImageProvider.h +++ b/Libraries/LibWeb/Layout/ImageProvider.h @@ -19,21 +19,21 @@ class ImageProvider { public: virtual ~ImageProvider() { } - virtual bool is_image_available() const = 0; + bool is_image_available() const { return decoded_image_data() != nullptr; } virtual size_t current_frame_index() const = 0; virtual GC::Ptr decoded_image_data() const = 0; - virtual Optional intrinsic_width() const = 0; - virtual Optional intrinsic_height() const = 0; + Optional intrinsic_width() const; + Optional intrinsic_height() const; Optional intrinsic_size() const; - virtual Optional intrinsic_aspect_ratio() const = 0; + Optional intrinsic_aspect_ratio() const; - virtual Optional current_image_frame() const; - virtual Optional current_image_frame_sized(Gfx::IntSize) const = 0; + Optional current_image_frame() const; + Optional current_image_frame_sized(Gfx::IntSize) const; - virtual Optional default_image_frame_sized(Gfx::IntSize) const; + Optional default_image_frame_sized(Gfx::IntSize) const; virtual void layout_node_was_detached() const { } diff --git a/Libraries/LibWeb/Layout/TreeBuilder.cpp b/Libraries/LibWeb/Layout/TreeBuilder.cpp index d45a149e6c..d17fdb414d 100644 --- a/Libraries/LibWeb/Layout/TreeBuilder.cpp +++ b/Libraries/LibWeb/Layout/TreeBuilder.cpp @@ -203,43 +203,6 @@ public: unregister_image_style_value_client(); } - virtual bool is_image_available() const override - { - if (auto document = this->document()) - return m_image->is_paintable(*document); - return false; - } - - virtual Optional intrinsic_width() const override - { - if (auto document = this->document()) - return m_image->natural_width(*document); - return {}; - } - - virtual Optional intrinsic_height() const override - { - if (auto document = this->document()) - return m_image->natural_height(*document); - return {}; - } - - virtual Optional intrinsic_aspect_ratio() const override - { - if (auto document = this->document()) - return m_image->natural_aspect_ratio(*document); - return {}; - } - - virtual Optional current_image_frame_sized(Gfx::IntSize size) const override - { - auto document = this->document(); - if (!document) - return {}; - auto rect = DevicePixelRect { DevicePixelPoint {}, size.to_type() }; - return m_image->current_frame(*document, rect); - } - virtual void layout_node_was_detached() const override { unregister_image_style_value_client(); diff --git a/Libraries/LibWeb/SVG/SVGImageElement.cpp b/Libraries/LibWeb/SVG/SVGImageElement.cpp index be4b32583b..3e2776a36d 100644 --- a/Libraries/LibWeb/SVG/SVGImageElement.cpp +++ b/Libraries/LibWeb/SVG/SVGImageElement.cpp @@ -218,56 +218,6 @@ RefPtr SVGImageElement::create_layout_node(CSS::ComputedProperties return make_ref_counted(document(), *this, style); } -bool SVGImageElement::is_image_available() const -{ - return m_resource_request && m_resource_request->image_data(); -} - -Optional SVGImageElement::intrinsic_width() const -{ - if (!m_resource_request) - return {}; - if (auto image_data = m_resource_request->image_data()) - return image_data->intrinsic_width(); - return {}; -} - -Optional SVGImageElement::intrinsic_height() const -{ - if (!m_resource_request) - return {}; - if (auto image_data = m_resource_request->image_data()) - return image_data->intrinsic_height(); - return {}; -} - -Optional SVGImageElement::intrinsic_aspect_ratio() const -{ - if (!m_resource_request) - return {}; - if (auto image_data = m_resource_request->image_data()) - return image_data->intrinsic_aspect_ratio(); - return {}; -} - -Optional SVGImageElement::default_image_frame_sized(Gfx::IntSize size) const -{ - if (!m_resource_request) - return {}; - if (auto data = m_resource_request->image_data()) - return data->frame(0, size); - return {}; -} - -Optional SVGImageElement::current_image_frame_sized(Gfx::IntSize size) const -{ - if (!m_resource_request) - return {}; - if (auto data = m_resource_request->image_data()) - return data->frame(m_current_frame_index, size); - return {}; -} - void SVGImageElement::animate() { auto image_data = m_resource_request->image_data(); diff --git a/Libraries/LibWeb/SVG/SVGImageElement.h b/Libraries/LibWeb/SVG/SVGImageElement.h index ff4882d79a..502ce500ef 100644 --- a/Libraries/LibWeb/SVG/SVGImageElement.h +++ b/Libraries/LibWeb/SVG/SVGImageElement.h @@ -33,14 +33,7 @@ public: Gfx::FloatRect bounding_box() const; - virtual Optional default_image_frame_sized(Gfx::IntSize) const override; - // ^Layout::ImageProvider - virtual bool is_image_available() const override; - virtual Optional intrinsic_width() const override; - virtual Optional intrinsic_height() const override; - virtual Optional intrinsic_aspect_ratio() const override; - virtual Optional current_image_frame_sized(Gfx::IntSize) const override; virtual size_t current_frame_index() const override { return m_current_frame_index; } virtual GC::Ptr decoded_image_data() const override;