From 64c06c345e1e253babaff174d51aed455fb0e9f0 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 5 Aug 2023 11:51:31 +0200 Subject: [PATCH] LibWeb: Parse :host() selector We were already parsing non-function-syntax :host, so let's also do the :host(...) variant. Note that we don't have matching for these yet. This fixes many issues on sites generated by Wix, as they often have selector lists that include some :host() selector, and we'd reject the entire rule after failing to parse it. --- .../expected/css-host-selector-gets-parsed.txt | 14 ++++++++++++++ .../input/css-host-selector-gets-parsed.html | 9 +++++++++ Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp | 11 +++++++++++ Userland/Libraries/LibWeb/Dump.cpp | 1 + 4 files changed, 35 insertions(+) create mode 100644 Tests/LibWeb/Layout/expected/css-host-selector-gets-parsed.txt create mode 100644 Tests/LibWeb/Layout/input/css-host-selector-gets-parsed.html diff --git a/Tests/LibWeb/Layout/expected/css-host-selector-gets-parsed.txt b/Tests/LibWeb/Layout/expected/css-host-selector-gets-parsed.txt new file mode 100644 index 0000000000..85b1e407ee --- /dev/null +++ b/Tests/LibWeb/Layout/expected/css-host-selector-gets-parsed.txt @@ -0,0 +1,14 @@ +Viewport <#document> at (0,0) content-size 800x600 children: not-inline + BlockContainer at (0,0) content-size 800x600 [BFC] children: not-inline + BlockContainer at (8,8) content-size 784x100 children: not-inline + BlockContainer
at (8,8) content-size 100x100 children: inline + line 0 width: 26.953125, height: 17.46875, bottom: 17.46875, baseline: 13.53125 + frag 0 from TextNode start: 0, length: 3, rect: [8,8 26.953125x17.46875] + "whf" + TextNode <#text> + +PaintableWithLines (Viewport<#document>) [0,0 800x600] + PaintableWithLines (BlockContainer) [0,0 800x600] + PaintableWithLines (BlockContainer) [8,8 784x100] + PaintableWithLines (BlockContainer
) [8,8 100x100] + TextPaintable (TextNode<#text>) diff --git a/Tests/LibWeb/Layout/input/css-host-selector-gets-parsed.html b/Tests/LibWeb/Layout/input/css-host-selector-gets-parsed.html new file mode 100644 index 0000000000..bd9089cdd3 --- /dev/null +++ b/Tests/LibWeb/Layout/input/css-host-selector-gets-parsed.html @@ -0,0 +1,9 @@ +
whf diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index cf2c4ef3cf..e4102dd9e6 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -613,6 +613,17 @@ Parser::ParseErrorOr Parser::parse_pseudo_simple_selec .argument_selector_list = move(not_selector) } }; } + if (pseudo_function.name().equals_ignoring_ascii_case("host"sv)) { + auto function_token_stream = TokenStream(pseudo_function.values()); + auto host_selector = TRY(parse_a_selector_list(function_token_stream, SelectorType::Standalone)); + + return Selector::SimpleSelector { + .type = Selector::SimpleSelector::Type::PseudoClass, + .value = Selector::SimpleSelector::PseudoClass { + .type = Selector::SimpleSelector::PseudoClass::Type::Host, + .argument_selector_list = move(host_selector) } + }; + } if (pseudo_function.name().equals_ignoring_ascii_case("lang"sv)) { if (pseudo_function.values().is_empty()) { dbgln_if(CSS_PARSER_DEBUG, "Empty :lang() selector"); diff --git a/Userland/Libraries/LibWeb/Dump.cpp b/Userland/Libraries/LibWeb/Dump.cpp index cf9053b925..a00261b760 100644 --- a/Userland/Libraries/LibWeb/Dump.cpp +++ b/Userland/Libraries/LibWeb/Dump.cpp @@ -574,6 +574,7 @@ void dump_selector(StringBuilder& builder, CSS::Selector const& selector) builder.join(',', pseudo_class.languages); builder.append(')'); } else if (pseudo_class.type == CSS::Selector::SimpleSelector::PseudoClass::Type::Not + || pseudo_class.type == CSS::Selector::SimpleSelector::PseudoClass::Type::Host || pseudo_class.type == CSS::Selector::SimpleSelector::PseudoClass::Type::Is || pseudo_class.type == CSS::Selector::SimpleSelector::PseudoClass::Type::Where) { builder.append("(["sv);