From 8d797fc62e149cf2198a4815c473ec43a6db9245 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 30 Sep 2019 20:06:17 +0200 Subject: [PATCH] LibHTML: Fix incorrect CSS object model A StyleRule has a StyleDeclaration which has many StyleProperty. :^) --- Libraries/LibHTML/CSS/StyleDeclaration.cpp | 5 ++--- Libraries/LibHTML/CSS/StyleDeclaration.h | 17 ++++++++++------- Libraries/LibHTML/CSS/StyleResolver.cpp | 4 ++-- Libraries/LibHTML/CSS/StyleRule.cpp | 4 ++-- Libraries/LibHTML/CSS/StyleRule.h | 17 +++++------------ Libraries/LibHTML/Dump.cpp | 4 ++-- Libraries/LibHTML/Parser/CSSParser.cpp | 6 +++--- 7 files changed, 26 insertions(+), 31 deletions(-) diff --git a/Libraries/LibHTML/CSS/StyleDeclaration.cpp b/Libraries/LibHTML/CSS/StyleDeclaration.cpp index cc550e2622..cf7e1a4af6 100644 --- a/Libraries/LibHTML/CSS/StyleDeclaration.cpp +++ b/Libraries/LibHTML/CSS/StyleDeclaration.cpp @@ -1,8 +1,7 @@ #include -StyleDeclaration::StyleDeclaration(const String& property_name, NonnullRefPtr&& value) - : m_property_name(property_name) - , m_value(move(value)) +StyleDeclaration::StyleDeclaration(Vector&& properties) + : m_properties(move(properties)) { } diff --git a/Libraries/LibHTML/CSS/StyleDeclaration.h b/Libraries/LibHTML/CSS/StyleDeclaration.h index ce041108bc..b5ec084c86 100644 --- a/Libraries/LibHTML/CSS/StyleDeclaration.h +++ b/Libraries/LibHTML/CSS/StyleDeclaration.h @@ -3,21 +3,24 @@ #include #include +struct StyleProperty { + String name; + NonnullRefPtr value; +}; + class StyleDeclaration : public RefCounted { public: - static NonnullRefPtr create(const String& property_name, NonnullRefPtr&& value) + static NonnullRefPtr create(Vector&& properties) { - return adopt(*new StyleDeclaration(property_name, move(value))); + return adopt(*new StyleDeclaration(move(properties))); } ~StyleDeclaration(); - const String& property_name() const { return m_property_name; } - const StyleValue& value() const { return *m_value; } + const Vector& properties() const { return m_properties; } public: - StyleDeclaration(const String& property_name, NonnullRefPtr&&); + explicit StyleDeclaration(Vector&&); - String m_property_name; - NonnullRefPtr m_value; + Vector m_properties; }; diff --git a/Libraries/LibHTML/CSS/StyleResolver.cpp b/Libraries/LibHTML/CSS/StyleResolver.cpp index 4c733ce530..da39bcd9b2 100644 --- a/Libraries/LibHTML/CSS/StyleResolver.cpp +++ b/Libraries/LibHTML/CSS/StyleResolver.cpp @@ -70,8 +70,8 @@ StyleProperties StyleResolver::resolve_style(const Element& element, const Style auto matching_rules = collect_matching_rules(element); for (auto& rule : matching_rules) { - for (auto& declaration : rule.declarations()) { - style_properties.set_property(declaration.property_name(), declaration.value()); + for (auto& property : rule.declaration().properties()) { + style_properties.set_property(property.name, property.value); } } return style_properties; diff --git a/Libraries/LibHTML/CSS/StyleRule.cpp b/Libraries/LibHTML/CSS/StyleRule.cpp index 1fcdf38c40..6e7cf68559 100644 --- a/Libraries/LibHTML/CSS/StyleRule.cpp +++ b/Libraries/LibHTML/CSS/StyleRule.cpp @@ -1,8 +1,8 @@ #include -StyleRule::StyleRule(Vector&& selectors, NonnullRefPtrVector&& declarations) +StyleRule::StyleRule(Vector&& selectors, NonnullRefPtr&& declaration) : m_selectors(move(selectors)) - , m_declarations(move(declarations)) + , m_declaration(move(declaration)) { } diff --git a/Libraries/LibHTML/CSS/StyleRule.h b/Libraries/LibHTML/CSS/StyleRule.h index 3ccdb57caa..a2f4c3a32b 100644 --- a/Libraries/LibHTML/CSS/StyleRule.h +++ b/Libraries/LibHTML/CSS/StyleRule.h @@ -6,26 +6,19 @@ class StyleRule : public RefCounted { public: - static NonnullRefPtr create(Vector&& selectors, NonnullRefPtrVector&& declarations) + static NonnullRefPtr create(Vector&& selectors, NonnullRefPtr&& declaration) { - return adopt(*new StyleRule(move(selectors), move(declarations))); + return adopt(*new StyleRule(move(selectors), move(declaration))); } ~StyleRule(); const Vector& selectors() const { return m_selectors; } - const NonnullRefPtrVector& declarations() const { return m_declarations; } - - template - void for_each_declaration(C callback) const - { - for (auto& declaration : m_declarations) - callback(declaration); - } + const StyleDeclaration& declaration() const { return m_declaration; } private: - StyleRule(Vector&&, NonnullRefPtrVector&&); + StyleRule(Vector&&, NonnullRefPtr&&); Vector m_selectors; - NonnullRefPtrVector m_declarations; + NonnullRefPtr m_declaration; }; diff --git a/Libraries/LibHTML/Dump.cpp b/Libraries/LibHTML/Dump.cpp index aae5a57692..ee7a3a55a5 100644 --- a/Libraries/LibHTML/Dump.cpp +++ b/Libraries/LibHTML/Dump.cpp @@ -123,8 +123,8 @@ void dump_rule(const StyleRule& rule) } } printf(" Declarations:\n"); - for (auto& declaration : rule.declarations()) { - printf(" '%s': '%s'\n", declaration.property_name().characters(), declaration.value().to_string().characters()); + for (auto& property : rule.declaration().properties()) { + printf(" '%s': '%s'\n", property.name.characters(), property.value->to_string().characters()); } } diff --git a/Libraries/LibHTML/Parser/CSSParser.cpp b/Libraries/LibHTML/Parser/CSSParser.cpp index 4e821322c8..fa10068c98 100644 --- a/Libraries/LibHTML/Parser/CSSParser.cpp +++ b/Libraries/LibHTML/Parser/CSSParser.cpp @@ -50,7 +50,7 @@ NonnullRefPtr parse_css(const String& css) struct CurrentRule { Vector selectors; - NonnullRefPtrVector declarations; + Vector properties; }; CurrentRule current_rule; @@ -146,7 +146,7 @@ NonnullRefPtr parse_css(const String& css) auto property_value = String::copy(buffer); buffer.clear(); consume_specific(';'); - current_rule.declarations.append(StyleDeclaration::create(property_name, parse_css_value(property_value))); + current_rule.properties.append({ property_name, parse_css_value(property_value) }); }; auto parse_declarations = [&] { @@ -163,7 +163,7 @@ NonnullRefPtr parse_css(const String& css) consume_specific('{'); parse_declarations(); consume_specific('}'); - rules.append(StyleRule::create(move(current_rule.selectors), move(current_rule.declarations))); + rules.append(StyleRule::create(move(current_rule.selectors), StyleDeclaration::create(move(current_rule.properties)))); consume_whitespace(); };