From 2a266db05bf0ce937fa28d5070ac5172d1da6ac6 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 6 Oct 2019 11:05:57 +0200 Subject: [PATCH] LibHTML: Parse descendant relations in CSS selectors "div p" now generates a Selector with two components where the second component is a type=TagName, value="p", relation=Descendant. We still don't handle matching of these, but at least we parse them. --- Libraries/LibHTML/CSS/Selector.h | 1 + Libraries/LibHTML/Dump.cpp | 3 +++ Libraries/LibHTML/Parser/CSSParser.cpp | 6 +++++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Libraries/LibHTML/CSS/Selector.h b/Libraries/LibHTML/CSS/Selector.h index 1648a911f4..967b9e963d 100644 --- a/Libraries/LibHTML/CSS/Selector.h +++ b/Libraries/LibHTML/CSS/Selector.h @@ -18,6 +18,7 @@ public: enum class Relation { None, ImmediateChild, + Descendant, }; Relation relation { Relation::None }; diff --git a/Libraries/LibHTML/Dump.cpp b/Libraries/LibHTML/Dump.cpp index 0252c061b7..ae1d14e4f0 100644 --- a/Libraries/LibHTML/Dump.cpp +++ b/Libraries/LibHTML/Dump.cpp @@ -155,6 +155,9 @@ void dump_rule(const StyleRule& rule) case Selector::Component::Relation::ImmediateChild: relation_description = "{ImmediateChild}"; break; + case Selector::Component::Relation::Descendant: + relation_description = "{Descendant}"; + break; } dbgprintf(" %s:%s %s\n", type_description, component.value.characters(), relation_description); } diff --git a/Libraries/LibHTML/Parser/CSSParser.cpp b/Libraries/LibHTML/Parser/CSSParser.cpp index 61489b5d53..77df32ae2d 100644 --- a/Libraries/LibHTML/Parser/CSSParser.cpp +++ b/Libraries/LibHTML/Parser/CSSParser.cpp @@ -88,7 +88,7 @@ public: { consume_whitespace(); Selector::Component::Type type; - Selector::Component::Relation relation = Selector::Component::Relation::None; + Selector::Component::Relation relation = Selector::Component::Relation::Descendant; if (peek() == '{') return {}; @@ -149,6 +149,10 @@ public: break; } + if (components.is_empty()) + return; + components.first().relation = Selector::Component::Relation::None; + current_rule.selectors.append(Selector(move(components))); };