diff --git a/Libraries/LibWeb/CSS/Parser/SelectorParsing.cpp b/Libraries/LibWeb/CSS/Parser/SelectorParsing.cpp index 9a0acf899c0..a9bbdcf6db6 100644 --- a/Libraries/LibWeb/CSS/Parser/SelectorParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/SelectorParsing.cpp @@ -664,10 +664,10 @@ Parser::ParseErrorOr Parser::parse_pseudo_simple_selec } if (pseudo_class_token.is_function()) { - auto parse_nth_child_selector = [this](auto pseudo_class, Vector const& function_values, bool allow_of = false) -> ParseErrorOr { + auto parse_an_plus_b_selector = [this](auto pseudo_class, Vector const& function_values, bool allow_of) -> ParseErrorOr { auto tokens = TokenStream(function_values); - auto nth_child_pattern = parse_a_n_plus_b_pattern(tokens); - if (!nth_child_pattern.has_value()) { + auto an_plus_b_pattern = parse_a_n_plus_b_pattern(tokens); + if (!an_plus_b_pattern.has_value()) { ErrorReporter::the().report(InvalidPseudoClassOrElementError { .name = MUST(String::formatted(":{}", pseudo_class_name(pseudo_class))), .value_string = tokens.dump_string(), @@ -682,7 +682,7 @@ Parser::ParseErrorOr Parser::parse_pseudo_simple_selec .type = Selector::SimpleSelector::Type::PseudoClass, .value = Selector::SimpleSelector::PseudoClassSelector { .type = pseudo_class, - .nth_child_pattern = nth_child_pattern.release_value() } + .an_plus_b_patterns = Vector { an_plus_b_pattern.release_value() } } }; } @@ -705,7 +705,7 @@ Parser::ParseErrorOr Parser::parse_pseudo_simple_selec .type = Selector::SimpleSelector::Type::PseudoClass, .value = Selector::SimpleSelector::PseudoClassSelector { .type = pseudo_class, - .nth_child_pattern = nth_child_pattern.release_value(), + .an_plus_b_patterns = Vector { an_plus_b_pattern.release_value() }, .argument_selector_list = move(selector_list) } }; }; @@ -755,9 +755,9 @@ Parser::ParseErrorOr Parser::parse_pseudo_simple_selec switch (metadata.parameter_type) { case PseudoClassMetadata::ParameterType::ANPlusB: - return parse_nth_child_selector(pseudo_class, pseudo_function.value, false); + return parse_an_plus_b_selector(pseudo_class, pseudo_function.value, false); case PseudoClassMetadata::ParameterType::ANPlusBOf: - return parse_nth_child_selector(pseudo_class, pseudo_function.value, true); + return parse_an_plus_b_selector(pseudo_class, pseudo_function.value, true); case PseudoClassMetadata::ParameterType::CompoundSelector: { auto function_token_stream = TokenStream(pseudo_function.value); auto compound_selector_or_error = parse_compound_selector(function_token_stream); diff --git a/Libraries/LibWeb/CSS/Selector.cpp b/Libraries/LibWeb/CSS/Selector.cpp index 91e03d3b1e2..e8bc6b9e5c4 100644 --- a/Libraries/LibWeb/CSS/Selector.cpp +++ b/Libraries/LibWeb/CSS/Selector.cpp @@ -460,7 +460,7 @@ String Selector::SimpleSelector::serialize() const case PseudoClassMetadata::ParameterType::ANPlusB: case PseudoClassMetadata::ParameterType::ANPlusBOf: // The result of serializing the value using the rules to serialize an value. - s.append(pseudo_class.nth_child_pattern.serialize()); + s.append(pseudo_class.an_plus_b_patterns.first().serialize()); break; case PseudoClassMetadata::ParameterType::CompoundSelector: case PseudoClassMetadata::ParameterType::ForgivingSelectorList: diff --git a/Libraries/LibWeb/CSS/Selector.h b/Libraries/LibWeb/CSS/Selector.h index 10651072e6b..8cbbf5573f7 100644 --- a/Libraries/LibWeb/CSS/Selector.h +++ b/Libraries/LibWeb/CSS/Selector.h @@ -124,9 +124,8 @@ public: struct PseudoClassSelector { PseudoClass type; - // FIXME: We don't need this field on every single SimpleSelector, but it's also annoying to malloc it somewhere. - // Only used when "pseudo_class" is "NthChild" or "NthLastChild". - ANPlusBPattern nth_child_pattern {}; + // Used for the :nth-*() pseudo-classes, and :heading() + Vector an_plus_b_patterns {}; // FIXME: This would make more sense as part of SelectorList but that's currently a `using` bool is_forgiving { false }; diff --git a/Libraries/LibWeb/CSS/SelectorEngine.cpp b/Libraries/LibWeb/CSS/SelectorEngine.cpp index 3af523f1fac..a642e1489be 100644 --- a/Libraries/LibWeb/CSS/SelectorEngine.cpp +++ b/Libraries/LibWeb/CSS/SelectorEngine.cpp @@ -670,8 +670,9 @@ static inline bool matches_pseudo_class(CSS::Selector::SimpleSelector::PseudoCla case CSS::PseudoClass::NthLastChild: case CSS::PseudoClass::NthOfType: case CSS::PseudoClass::NthLastOfType: { - auto const step_size = pseudo_class.nth_child_pattern.step_size; - auto const offset = pseudo_class.nth_child_pattern.offset; + auto& an_plus_b = pseudo_class.an_plus_b_patterns.first(); + auto const step_size = an_plus_b.step_size; + auto const offset = an_plus_b.offset; if (step_size == 0 && offset == 0) return false; // "If both a and b are equal to zero, the pseudo-class represents no element in the document tree." diff --git a/Libraries/LibWeb/Dump.cpp b/Libraries/LibWeb/Dump.cpp index c6475502b6a..918331ee4d1 100644 --- a/Libraries/LibWeb/Dump.cpp +++ b/Libraries/LibWeb/Dump.cpp @@ -563,7 +563,8 @@ void dump_selector(StringBuilder& builder, CSS::Selector const& selector, int in break; case CSS::PseudoClassMetadata::ParameterType::ANPlusB: case CSS::PseudoClassMetadata::ParameterType::ANPlusBOf: { - builder.appendff("(step={}, offset={}", pseudo_class.nth_child_pattern.step_size, pseudo_class.nth_child_pattern.offset); + auto& an_plus_b = pseudo_class.an_plus_b_patterns.first(); + builder.appendff("(step={}, offset={}", an_plus_b.step_size, an_plus_b.offset); if (!pseudo_class.argument_selector_list.is_empty()) { builder.append(", selectors=[\n"sv); for (auto const& child_selector : pseudo_class.argument_selector_list)