From 89bfde29dc2d9fd27fceb5b1de9cdd7bb5389f3a Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Thu, 1 Jul 2021 14:13:48 +0100 Subject: [PATCH] LibWeb: Convert some CSS parser *Rule classes to using pointers Previously these were all passed around by value, but some of them (StyleComponentValueRule and StyleBlockRule) want to include each other as fields, so this had to change. --- .../Libraries/LibWeb/CSS/Parser/Parser.cpp | 21 ++++++++--------- Userland/Libraries/LibWeb/CSS/Parser/Parser.h | 4 ++-- .../LibWeb/CSS/Parser/QualifiedStyleRule.h | 7 +++++- .../LibWeb/CSS/Parser/StyleBlockRule.h | 4 ++-- .../CSS/Parser/StyleComponentValueRule.h | 23 ++++++++++++++----- .../LibWeb/CSS/Parser/StyleFunctionRule.h | 6 ++--- .../LibWeb/CSS/Parser/StyleRules.cpp | 11 +++++---- 7 files changed, 47 insertions(+), 29 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 6e9f947e1e..4411a6ee32 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -74,7 +74,7 @@ Vector Parser::parse_as_stylesheet() dbgln("{}", pre.to_string()); } dbgln("BLOCK:"); - dbgln("{}", rule.m_block.to_string()); + dbgln("{}", rule.block().to_string()); dbgln(""); auto selectors = parse_selectors(rule.m_prelude); @@ -95,7 +95,7 @@ Vector Parser::parse_selectors(Vector= parts.size()) return {}; - auto current_value = parts.at(index); + auto& current_value = parts.at(index); index++; CSS::Selector::SimpleSelector::Type type; @@ -246,7 +246,7 @@ Vector Parser::parse_selectors(Vector Parser::consume_a_simple_block() { auto ending_token = current_token().mirror_variant(); - StyleBlockRule block; - block.m_token = current_token(); + NonnullRefPtr block = create(); + block->m_token = current_token(); for (;;) { auto token = next_token(); @@ -495,14 +495,13 @@ StyleBlockRule Parser::consume_a_simple_block() continue; } } - block.m_values.append(value.to_string()); + block->m_values.append(value.to_string()); } } -StyleFunctionRule Parser::consume_a_function() +NonnullRefPtr Parser::consume_a_function() { - StyleFunctionRule function; - function.m_name = current_token().m_value.to_string(); + NonnullRefPtr function = create(current_token().m_value.to_string()); for (;;) { auto token = next_token(); @@ -522,7 +521,7 @@ StyleFunctionRule Parser::consume_a_function() continue; } } - function.m_values.append(value.to_string()); + function->m_values.append(value.to_string()); } return function; diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index 1aadf31211..10e7d433ae 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -78,8 +78,8 @@ private: Optional consume_a_declaration(Vector); Optional consume_a_declaration(); StyleComponentValueRule consume_a_component_value(); - StyleBlockRule consume_a_simple_block(); - StyleFunctionRule consume_a_function(); + NonnullRefPtr consume_a_simple_block(); + NonnullRefPtr consume_a_function(); Tokenizer m_tokenizer; Vector m_tokens; diff --git a/Userland/Libraries/LibWeb/CSS/Parser/QualifiedStyleRule.h b/Userland/Libraries/LibWeb/CSS/Parser/QualifiedStyleRule.h index da2f3c2e98..81e6b61533 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/QualifiedStyleRule.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/QualifiedStyleRule.h @@ -8,6 +8,7 @@ #pragma once #include +#include #include namespace Web::CSS { @@ -18,11 +19,15 @@ class QualifiedStyleRule { public: QualifiedStyleRule(); ~QualifiedStyleRule(); + + Vector const& prelude() const { return m_prelude; } + StyleBlockRule const& block() const { return *m_block; } + String to_string() const; private: Vector m_prelude; - StyleBlockRule m_block; + RefPtr m_block; }; } diff --git a/Userland/Libraries/LibWeb/CSS/Parser/StyleBlockRule.h b/Userland/Libraries/LibWeb/CSS/Parser/StyleBlockRule.h index 84ba7d3ee6..a270351671 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/StyleBlockRule.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/StyleBlockRule.h @@ -7,12 +7,13 @@ #pragma once +#include #include #include namespace Web::CSS { -class StyleBlockRule { +class StyleBlockRule : public RefCounted { friend class Parser; public: @@ -31,5 +32,4 @@ private: Token m_token; Vector m_values; }; - } diff --git a/Userland/Libraries/LibWeb/CSS/Parser/StyleComponentValueRule.h b/Userland/Libraries/LibWeb/CSS/Parser/StyleComponentValueRule.h index f03265dbef..1510bbcdb3 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/StyleComponentValueRule.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/StyleComponentValueRule.h @@ -7,12 +7,15 @@ #pragma once -#include -#include +#include +#include #include namespace Web::CSS { +class StyleBlockRule; +class StyleFunctionRule; + class StyleComponentValueRule { friend class Parser; @@ -27,10 +30,18 @@ public: ~StyleComponentValueRule(); bool is_block() const { return m_type == ComponentType::Block; } - StyleBlockRule const& block() const { return m_block; } + StyleBlockRule const& block() const + { + VERIFY(is_block()); + return *m_block; + } bool is_function() const { return m_type == ComponentType::Function; } - StyleFunctionRule const& function() const { return m_function; } + StyleFunctionRule const& function() const + { + VERIFY(is_function()); + return *m_function; + } bool is(Token::TokenType type) const { @@ -44,7 +55,7 @@ public: private: ComponentType m_type; Token m_token; - StyleFunctionRule m_function; - StyleBlockRule m_block; + RefPtr m_function; + RefPtr m_block; }; } diff --git a/Userland/Libraries/LibWeb/CSS/Parser/StyleFunctionRule.h b/Userland/Libraries/LibWeb/CSS/Parser/StyleFunctionRule.h index 82de57c3e8..25c4bd2aa5 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/StyleFunctionRule.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/StyleFunctionRule.h @@ -7,6 +7,7 @@ #pragma once +#include #include #include @@ -14,11 +15,11 @@ namespace Web::CSS { class StyleComponentValueRule; -class StyleFunctionRule { +class StyleFunctionRule : public RefCounted { friend class Parser; public: - StyleFunctionRule(); + StyleFunctionRule(String name); ~StyleFunctionRule(); String const& name() const { return m_name; } @@ -38,5 +39,4 @@ private: String m_name; Vector m_values; }; - } diff --git a/Userland/Libraries/LibWeb/CSS/Parser/StyleRules.cpp b/Userland/Libraries/LibWeb/CSS/Parser/StyleRules.cpp index e9457f9d63..3c21c712d0 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/StyleRules.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/StyleRules.cpp @@ -45,7 +45,10 @@ StyleComponentValueRule::~StyleComponentValueRule() { } StyleDeclarationRule::StyleDeclarationRule() { } StyleDeclarationRule::~StyleDeclarationRule() { } -StyleFunctionRule::StyleFunctionRule() { } +StyleFunctionRule::StyleFunctionRule(String name) + : m_name(name) +{ +} StyleFunctionRule::~StyleFunctionRule() { } template @@ -106,7 +109,7 @@ String QualifiedStyleRule::to_string() const StringBuilder builder; append_with_to_string(builder, " ", m_prelude); - builder.append(m_block.to_string()); + builder.append(m_block->to_string()); return builder.to_string(); } @@ -131,10 +134,10 @@ String StyleComponentValueRule::to_string() const builder.append(m_token.to_string()); break; case ComponentType::Function: - builder.append(m_function.to_string()); + builder.append(m_function->to_string()); break; case ComponentType::Block: - builder.append(m_block.to_string()); + builder.append(m_block->to_string()); break; }