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);