From 29a4da30b701502ee2539413dc8bad0bc6681733 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 6 Jan 2021 14:27:40 +0100 Subject: [PATCH] LibWeb: Make DOM::Node::create_layout_node() not need parent's style The StyleResolver can find the specified CSS values for the parent element via the DOM. Forcing everyone to locate specified values for their parent was completely unnecessary. --- Libraries/LibWeb/CSS/StyleResolver.cpp | 4 ++-- Libraries/LibWeb/CSS/StyleResolver.h | 2 +- Libraries/LibWeb/DOM/Document.cpp | 2 +- Libraries/LibWeb/DOM/Document.h | 2 +- Libraries/LibWeb/DOM/Element.cpp | 7 +++---- Libraries/LibWeb/DOM/Element.h | 2 +- Libraries/LibWeb/DOM/Node.cpp | 2 +- Libraries/LibWeb/DOM/Node.h | 2 +- Libraries/LibWeb/DOM/Text.cpp | 2 +- Libraries/LibWeb/DOM/Text.h | 2 +- Libraries/LibWeb/HTML/HTMLBRElement.cpp | 2 +- Libraries/LibWeb/HTML/HTMLBRElement.h | 2 +- Libraries/LibWeb/HTML/HTMLCanvasElement.cpp | 4 ++-- Libraries/LibWeb/HTML/HTMLCanvasElement.h | 2 +- Libraries/LibWeb/HTML/HTMLIFrameElement.cpp | 4 ++-- Libraries/LibWeb/HTML/HTMLIFrameElement.h | 2 +- Libraries/LibWeb/HTML/HTMLImageElement.cpp | 4 ++-- Libraries/LibWeb/HTML/HTMLImageElement.h | 2 +- Libraries/LibWeb/HTML/HTMLInputElement.cpp | 4 ++-- Libraries/LibWeb/HTML/HTMLInputElement.h | 2 +- Libraries/LibWeb/HTML/HTMLObjectElement.cpp | 6 +++--- Libraries/LibWeb/HTML/HTMLObjectElement.h | 2 +- Libraries/LibWeb/Layout/Node.cpp | 2 ++ Libraries/LibWeb/Layout/TreeBuilder.cpp | 2 +- Libraries/LibWeb/SVG/SVGPathElement.cpp | 4 ++-- Libraries/LibWeb/SVG/SVGPathElement.h | 2 +- Libraries/LibWeb/SVG/SVGSVGElement.cpp | 4 ++-- Libraries/LibWeb/SVG/SVGSVGElement.h | 2 +- 28 files changed, 40 insertions(+), 39 deletions(-) diff --git a/Libraries/LibWeb/CSS/StyleResolver.cpp b/Libraries/LibWeb/CSS/StyleResolver.cpp index 95a8cc4c84a..21715ee92b7 100644 --- a/Libraries/LibWeb/CSS/StyleResolver.cpp +++ b/Libraries/LibWeb/CSS/StyleResolver.cpp @@ -564,11 +564,11 @@ static void set_property_expanding_shorthands(StyleProperties& style, CSS::Prope style.set_property(property_id, value); } -NonnullRefPtr StyleResolver::resolve_style(const DOM::Element& element, const StyleProperties* parent_style) const +NonnullRefPtr StyleResolver::resolve_style(const DOM::Element& element) const { auto style = StyleProperties::create(); - if (parent_style) { + if (auto* parent_style = element.parent_element() ? element.parent_element()->specified_css_values() : nullptr) { parent_style->for_each_property([&](auto property_id, auto& value) { if (is_inherited_property(property_id)) set_property_expanding_shorthands(style, property_id, value, m_document); diff --git a/Libraries/LibWeb/CSS/StyleResolver.h b/Libraries/LibWeb/CSS/StyleResolver.h index 1682cf9b741..0dde35a261d 100644 --- a/Libraries/LibWeb/CSS/StyleResolver.h +++ b/Libraries/LibWeb/CSS/StyleResolver.h @@ -48,7 +48,7 @@ public: DOM::Document& document() { return m_document; } const DOM::Document& document() const { return m_document; } - NonnullRefPtr resolve_style(const DOM::Element&, const StyleProperties* parent_style) const; + NonnullRefPtr resolve_style(const DOM::Element&) const; Vector collect_matching_rules(const DOM::Element&) const; void sort_matching_rules(Vector&) const; diff --git a/Libraries/LibWeb/DOM/Document.cpp b/Libraries/LibWeb/DOM/Document.cpp index c7814397069..5f9a31804a7 100644 --- a/Libraries/LibWeb/DOM/Document.cpp +++ b/Libraries/LibWeb/DOM/Document.cpp @@ -408,7 +408,7 @@ void Document::update_style() update_layout(); } -RefPtr Document::create_layout_node(const CSS::StyleProperties*) +RefPtr Document::create_layout_node() { return adopt(*new Layout::InitialContainingBlockBox(*this, CSS::StyleProperties::create())); } diff --git a/Libraries/LibWeb/DOM/Document.h b/Libraries/LibWeb/DOM/Document.h index 23615d55a52..34e179e67c7 100644 --- a/Libraries/LibWeb/DOM/Document.h +++ b/Libraries/LibWeb/DOM/Document.h @@ -223,7 +223,7 @@ public: private: explicit Document(const URL&); - virtual RefPtr create_layout_node(const CSS::StyleProperties* parent_style) override; + virtual RefPtr create_layout_node() override; void tear_down_layout_tree(); diff --git a/Libraries/LibWeb/DOM/Element.cpp b/Libraries/LibWeb/DOM/Element.cpp index e23b5ccb66c..1a2abdaa4d6 100644 --- a/Libraries/LibWeb/DOM/Element.cpp +++ b/Libraries/LibWeb/DOM/Element.cpp @@ -111,9 +111,9 @@ bool Element::has_class(const FlyString& class_name) const return false; } -RefPtr Element::create_layout_node(const CSS::StyleProperties* parent_style) +RefPtr Element::create_layout_node() { - auto style = document().style_resolver().resolve_style(*this, parent_style); + auto style = document().style_resolver().resolve_style(*this); const_cast(*this).m_specified_css_values = style; auto display = style->display(); @@ -199,8 +199,7 @@ void Element::recompute_style() set_needs_style_update(false); ASSERT(parent()); auto old_specified_css_values = m_specified_css_values; - auto* parent_specified_css_values = parent()->is_element() ? downcast(*parent()).specified_css_values() : nullptr; - auto new_specified_css_values = document().style_resolver().resolve_style(*this, parent_specified_css_values); + auto new_specified_css_values = document().style_resolver().resolve_style(*this); m_specified_css_values = new_specified_css_values; if (!layout_node()) { if (new_specified_css_values->display() == CSS::Display::None) diff --git a/Libraries/LibWeb/DOM/Element.h b/Libraries/LibWeb/DOM/Element.h index 6939ee6c9cd..76a29fc30d7 100644 --- a/Libraries/LibWeb/DOM/Element.h +++ b/Libraries/LibWeb/DOM/Element.h @@ -99,7 +99,7 @@ public: virtual bool is_focusable() const { return false; } protected: - RefPtr create_layout_node(const CSS::StyleProperties* parent_style) override; + RefPtr create_layout_node() override; private: Attribute* find_attribute(const FlyString& name); diff --git a/Libraries/LibWeb/DOM/Node.cpp b/Libraries/LibWeb/DOM/Node.cpp index aca4a396379..55e062f4bcd 100644 --- a/Libraries/LibWeb/DOM/Node.cpp +++ b/Libraries/LibWeb/DOM/Node.cpp @@ -105,7 +105,7 @@ void Node::set_text_content(const String& content) document().invalidate_layout(); } -RefPtr Node::create_layout_node(const CSS::StyleProperties*) +RefPtr Node::create_layout_node() { return nullptr; } diff --git a/Libraries/LibWeb/DOM/Node.h b/Libraries/LibWeb/DOM/Node.h index de4b3755d9f..8103bbbff6a 100644 --- a/Libraries/LibWeb/DOM/Node.h +++ b/Libraries/LibWeb/DOM/Node.h @@ -84,7 +84,7 @@ public: RefPtr insert_before(NonnullRefPtr node, RefPtr child, bool notify = true); void remove_all_children(); - virtual RefPtr create_layout_node(const CSS::StyleProperties* parent_style); + virtual RefPtr create_layout_node(); virtual FlyString node_name() const = 0; diff --git a/Libraries/LibWeb/DOM/Text.cpp b/Libraries/LibWeb/DOM/Text.cpp index a0c6ba9dabe..de7beec7b6e 100644 --- a/Libraries/LibWeb/DOM/Text.cpp +++ b/Libraries/LibWeb/DOM/Text.cpp @@ -38,7 +38,7 @@ Text::~Text() { } -RefPtr Text::create_layout_node(const CSS::StyleProperties*) +RefPtr Text::create_layout_node() { return adopt(*new Layout::TextNode(document(), *this)); } diff --git a/Libraries/LibWeb/DOM/Text.h b/Libraries/LibWeb/DOM/Text.h index 5ee7595561b..0e6f4a2dbd1 100644 --- a/Libraries/LibWeb/DOM/Text.h +++ b/Libraries/LibWeb/DOM/Text.h @@ -42,7 +42,7 @@ public: virtual FlyString node_name() const override { return "#text"; } private: - virtual RefPtr create_layout_node(const CSS::StyleProperties* parent_style) override; + virtual RefPtr create_layout_node() override; }; } diff --git a/Libraries/LibWeb/HTML/HTMLBRElement.cpp b/Libraries/LibWeb/HTML/HTMLBRElement.cpp index 3d7e7e5eec2..d3a0bc1b9e8 100644 --- a/Libraries/LibWeb/HTML/HTMLBRElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLBRElement.cpp @@ -38,7 +38,7 @@ HTMLBRElement::~HTMLBRElement() { } -RefPtr HTMLBRElement::create_layout_node(const CSS::StyleProperties*) +RefPtr HTMLBRElement::create_layout_node() { return adopt(*new Layout::BreakNode(document(), *this)); } diff --git a/Libraries/LibWeb/HTML/HTMLBRElement.h b/Libraries/LibWeb/HTML/HTMLBRElement.h index 086900e79f7..5e453c6ecb8 100644 --- a/Libraries/LibWeb/HTML/HTMLBRElement.h +++ b/Libraries/LibWeb/HTML/HTMLBRElement.h @@ -37,7 +37,7 @@ public: HTMLBRElement(DOM::Document&, const QualifiedName& qualified_name); virtual ~HTMLBRElement() override; - virtual RefPtr create_layout_node(const CSS::StyleProperties* parent_style) override; + virtual RefPtr create_layout_node() override; }; } diff --git a/Libraries/LibWeb/HTML/HTMLCanvasElement.cpp b/Libraries/LibWeb/HTML/HTMLCanvasElement.cpp index bbad3a06579..406f18c7e86 100644 --- a/Libraries/LibWeb/HTML/HTMLCanvasElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLCanvasElement.cpp @@ -55,9 +55,9 @@ unsigned HTMLCanvasElement::height() const return attribute(HTML::AttributeNames::height).to_uint().value_or(150); } -RefPtr HTMLCanvasElement::create_layout_node(const CSS::StyleProperties* parent_style) +RefPtr HTMLCanvasElement::create_layout_node() { - auto style = document().style_resolver().resolve_style(*this, parent_style); + auto style = document().style_resolver().resolve_style(*this); if (style->display() == CSS::Display::None) return nullptr; return adopt(*new Layout::CanvasBox(document(), *this, move(style))); diff --git a/Libraries/LibWeb/HTML/HTMLCanvasElement.h b/Libraries/LibWeb/HTML/HTMLCanvasElement.h index 7e114761e05..9616af98b70 100644 --- a/Libraries/LibWeb/HTML/HTMLCanvasElement.h +++ b/Libraries/LibWeb/HTML/HTMLCanvasElement.h @@ -49,7 +49,7 @@ public: unsigned height() const; private: - virtual RefPtr create_layout_node(const CSS::StyleProperties* parent_style) override; + virtual RefPtr create_layout_node() override; RefPtr m_bitmap; RefPtr m_context; diff --git a/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp b/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp index 937ca36321a..e59818ba821 100644 --- a/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp @@ -54,9 +54,9 @@ HTMLIFrameElement::~HTMLIFrameElement() { } -RefPtr HTMLIFrameElement::create_layout_node(const CSS::StyleProperties* parent_style) +RefPtr HTMLIFrameElement::create_layout_node() { - auto style = document().style_resolver().resolve_style(*this, parent_style); + auto style = document().style_resolver().resolve_style(*this); return adopt(*new Layout::FrameBox(document(), *this, move(style))); } diff --git a/Libraries/LibWeb/HTML/HTMLIFrameElement.h b/Libraries/LibWeb/HTML/HTMLIFrameElement.h index 99f8781bfa4..0237ea3c91b 100644 --- a/Libraries/LibWeb/HTML/HTMLIFrameElement.h +++ b/Libraries/LibWeb/HTML/HTMLIFrameElement.h @@ -37,7 +37,7 @@ public: HTMLIFrameElement(DOM::Document&, const QualifiedName& qualified_name); virtual ~HTMLIFrameElement() override; - virtual RefPtr create_layout_node(const CSS::StyleProperties* parent_style) override; + virtual RefPtr create_layout_node() override; Frame* content_frame() { return m_content_frame; } const Frame* content_frame() const { return m_content_frame; } diff --git a/Libraries/LibWeb/HTML/HTMLImageElement.cpp b/Libraries/LibWeb/HTML/HTMLImageElement.cpp index c2d82fef1b5..8ab82632738 100644 --- a/Libraries/LibWeb/HTML/HTMLImageElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLImageElement.cpp @@ -84,9 +84,9 @@ void HTMLImageElement::parse_attribute(const FlyString& name, const String& valu m_image_loader.load(document().complete_url(value)); } -RefPtr HTMLImageElement::create_layout_node(const CSS::StyleProperties* parent_style) +RefPtr HTMLImageElement::create_layout_node() { - auto style = document().style_resolver().resolve_style(*this, parent_style); + auto style = document().style_resolver().resolve_style(*this); if (style->display() == CSS::Display::None) return nullptr; return adopt(*new Layout::ImageBox(document(), *this, move(style), m_image_loader)); diff --git a/Libraries/LibWeb/HTML/HTMLImageElement.h b/Libraries/LibWeb/HTML/HTMLImageElement.h index 5e5971dbb11..7cc97f19839 100644 --- a/Libraries/LibWeb/HTML/HTMLImageElement.h +++ b/Libraries/LibWeb/HTML/HTMLImageElement.h @@ -53,7 +53,7 @@ private: void animate(); - virtual RefPtr create_layout_node(const CSS::StyleProperties* parent_style) override; + virtual RefPtr create_layout_node() override; ImageLoader m_image_loader; }; diff --git a/Libraries/LibWeb/HTML/HTMLInputElement.cpp b/Libraries/LibWeb/HTML/HTMLInputElement.cpp index 9ffc91041ab..c5654c35307 100644 --- a/Libraries/LibWeb/HTML/HTMLInputElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLInputElement.cpp @@ -62,7 +62,7 @@ void HTMLInputElement::did_click_button(Badge) } } -RefPtr HTMLInputElement::create_layout_node(const CSS::StyleProperties* parent_style) +RefPtr HTMLInputElement::create_layout_node() { ASSERT(document().page()); auto& page = *document().page(); @@ -71,7 +71,7 @@ RefPtr HTMLInputElement::create_layout_node(const CSS::StyleProper if (type() == "hidden") return nullptr; - auto style = document().style_resolver().resolve_style(*this, parent_style); + auto style = document().style_resolver().resolve_style(*this); if (style->display() == CSS::Display::None) return nullptr; diff --git a/Libraries/LibWeb/HTML/HTMLInputElement.h b/Libraries/LibWeb/HTML/HTMLInputElement.h index c3676d1dbe3..b8871182635 100644 --- a/Libraries/LibWeb/HTML/HTMLInputElement.h +++ b/Libraries/LibWeb/HTML/HTMLInputElement.h @@ -37,7 +37,7 @@ public: HTMLInputElement(DOM::Document&, const QualifiedName& qualified_name); virtual ~HTMLInputElement() override; - virtual RefPtr create_layout_node(const CSS::StyleProperties* parent_style) override; + virtual RefPtr create_layout_node() override; String type() const { return attribute(HTML::AttributeNames::type); } String value() const { return attribute(HTML::AttributeNames::value); } diff --git a/Libraries/LibWeb/HTML/HTMLObjectElement.cpp b/Libraries/LibWeb/HTML/HTMLObjectElement.cpp index 4a3d0a11d4f..a7514179d47 100644 --- a/Libraries/LibWeb/HTML/HTMLObjectElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLObjectElement.cpp @@ -61,12 +61,12 @@ void HTMLObjectElement::parse_attribute(const FlyString& name, const String& val m_image_loader.load(document().complete_url(value)); } -RefPtr HTMLObjectElement::create_layout_node(const CSS::StyleProperties* parent_style) +RefPtr HTMLObjectElement::create_layout_node() { if (m_should_show_fallback_content) - return HTMLElement::create_layout_node(parent_style); + return HTMLElement::create_layout_node(); - auto style = document().style_resolver().resolve_style(*this, parent_style); + auto style = document().style_resolver().resolve_style(*this); if (style->display() == CSS::Display::None) return nullptr; if (m_image_loader.has_image()) diff --git a/Libraries/LibWeb/HTML/HTMLObjectElement.h b/Libraries/LibWeb/HTML/HTMLObjectElement.h index f49e8b22c87..f07e122ff7f 100644 --- a/Libraries/LibWeb/HTML/HTMLObjectElement.h +++ b/Libraries/LibWeb/HTML/HTMLObjectElement.h @@ -46,7 +46,7 @@ public: String type() const { return attribute(HTML::AttributeNames::type); } private: - virtual RefPtr create_layout_node(const CSS::StyleProperties* parent_style) override; + virtual RefPtr create_layout_node() override; ImageLoader m_image_loader; bool m_should_show_fallback_content { false }; diff --git a/Libraries/LibWeb/Layout/Node.cpp b/Libraries/LibWeb/Layout/Node.cpp index e447976bf67..fc2b83f7b9f 100644 --- a/Libraries/LibWeb/Layout/Node.cpp +++ b/Libraries/LibWeb/Layout/Node.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -215,6 +216,7 @@ NodeWithStyle::NodeWithStyle(DOM::Document& document, DOM::Node* node, CSS::Comp , m_computed_values(move(computed_values)) { m_has_style = true; + m_font = Gfx::FontDatabase::default_font(); } void NodeWithStyle::apply_style(const CSS::StyleProperties& specified_style) diff --git a/Libraries/LibWeb/Layout/TreeBuilder.cpp b/Libraries/LibWeb/Layout/TreeBuilder.cpp index e73507c140b..46070fa346c 100644 --- a/Libraries/LibWeb/Layout/TreeBuilder.cpp +++ b/Libraries/LibWeb/Layout/TreeBuilder.cpp @@ -95,7 +95,7 @@ void TreeBuilder::create_layout_tree(DOM::Node& dom_node) if (!m_parent_stack.is_empty() && m_parent_stack.last()->dom_node() && m_parent_stack.last()->dom_node()->is_element()) parent_style = downcast(*m_parent_stack.last()->dom_node()).specified_css_values(); - auto layout_node = dom_node.create_layout_node(parent_style); + auto layout_node = dom_node.create_layout_node(); if (!layout_node) return; diff --git a/Libraries/LibWeb/SVG/SVGPathElement.cpp b/Libraries/LibWeb/SVG/SVGPathElement.cpp index a0ec408fb30..b9fec926f42 100644 --- a/Libraries/LibWeb/SVG/SVGPathElement.cpp +++ b/Libraries/LibWeb/SVG/SVGPathElement.cpp @@ -430,9 +430,9 @@ SVGPathElement::SVGPathElement(DOM::Document& document, const QualifiedName& qua { } -RefPtr SVGPathElement::create_layout_node(const CSS::StyleProperties* parent_style) +RefPtr SVGPathElement::create_layout_node() { - auto style = document().style_resolver().resolve_style(*this, parent_style); + auto style = document().style_resolver().resolve_style(*this); if (style->display() == CSS::Display::None) return nullptr; return adopt(*new Layout::SVGPathBox(document(), *this, move(style))); diff --git a/Libraries/LibWeb/SVG/SVGPathElement.h b/Libraries/LibWeb/SVG/SVGPathElement.h index cc6025fb025..738df73a137 100644 --- a/Libraries/LibWeb/SVG/SVGPathElement.h +++ b/Libraries/LibWeb/SVG/SVGPathElement.h @@ -109,7 +109,7 @@ public: SVGPathElement(DOM::Document&, const QualifiedName& qualified_name); virtual ~SVGPathElement() override = default; - virtual RefPtr create_layout_node(const CSS::StyleProperties* parent_style) override; + virtual RefPtr create_layout_node() override; virtual void parse_attribute(const FlyString& name, const String& value) override; diff --git a/Libraries/LibWeb/SVG/SVGSVGElement.cpp b/Libraries/LibWeb/SVG/SVGSVGElement.cpp index cd5e1e6fbd1..ad0eb2e6375 100644 --- a/Libraries/LibWeb/SVG/SVGSVGElement.cpp +++ b/Libraries/LibWeb/SVG/SVGSVGElement.cpp @@ -40,9 +40,9 @@ SVGSVGElement::SVGSVGElement(DOM::Document& document, const QualifiedName& quali { } -RefPtr SVGSVGElement::create_layout_node(const CSS::StyleProperties* parent_style) +RefPtr SVGSVGElement::create_layout_node() { - auto style = document().style_resolver().resolve_style(*this, parent_style); + auto style = document().style_resolver().resolve_style(*this); if (style->display() == CSS::Display::None) return nullptr; return adopt(*new Layout::SVGSVGBox(document(), *this, move(style))); diff --git a/Libraries/LibWeb/SVG/SVGSVGElement.h b/Libraries/LibWeb/SVG/SVGSVGElement.h index 0e6c99b5044..c84a483d073 100644 --- a/Libraries/LibWeb/SVG/SVGSVGElement.h +++ b/Libraries/LibWeb/SVG/SVGSVGElement.h @@ -37,7 +37,7 @@ public: SVGSVGElement(DOM::Document&, const QualifiedName& qualified_name); - virtual RefPtr create_layout_node(const CSS::StyleProperties* parent_style) override; + virtual RefPtr create_layout_node() override; unsigned width() const; unsigned height() const;