Explorar el Código

LibHTML: Support the :only-child pseudo class

Andreas Kling hace 5 años
padre
commit
91ba94fbd4

+ 28 - 0
Base/home/anon/www/only-child.html

@@ -0,0 +1,28 @@
+<html>
+<head>
+<title>:only-child test</title>
+<style>
+div:only-child {
+  color: red;
+}
+
+div {
+  display: inline-block;
+  margin: 6px;
+  border-width: 1px;
+}
+</style>
+</head>
+<body>
+<div>
+  <div>I am an only child.</div>
+</div>
+
+<div>
+  <div>I am the 1st sibling.</div>
+  <div>I am the 2nd sibling.</div>
+  <div>I am the 3rd sibling, <div>but this is an only child.</div></div>
+</div>
+
+</body>
+</html>

+ 1 - 0
Base/home/anon/www/welcome.html

@@ -26,6 +26,7 @@ h1 {
         <li><a href="small.html">small</a></li>
         <li><a href="first-child.html">:first-child</a></li>
         <li><a href="last-child.html">:last-child</a></li>
+        <li><a href="only-child.html">:only-child</a></li>
         <li><a href="empty.html">:empty</a></li>
         <li><a href="form.html">form</a></li>
         <li><a href="borders.html">borders</a></li>

+ 1 - 0
Libraries/LibHTML/CSS/Selector.h

@@ -22,6 +22,7 @@ public:
             Hover,
             FirstChild,
             LastChild,
+            OnlyChild,
             Empty,
         };
         PseudoClass pseudo_class { PseudoClass::None };

+ 4 - 0
Libraries/LibHTML/CSS/SelectorEngine.cpp

@@ -36,6 +36,10 @@ bool matches(const Selector::SimpleSelector& component, const Element& element)
         if (element.next_element_sibling())
             return false;
         break;
+    case Selector::SimpleSelector::PseudoClass::OnlyChild:
+        if (element.previous_element_sibling() || element.next_element_sibling())
+            return false;
+        break;
     case Selector::SimpleSelector::PseudoClass::Empty:
         if (element.first_child_of_type<Element>() || element.first_child_of_type<Text>())
             return false;

+ 2 - 0
Libraries/LibHTML/Parser/CSSParser.cpp

@@ -325,6 +325,8 @@ public:
                 simple_selector.pseudo_class = Selector::SimpleSelector::PseudoClass::FirstChild;
             else if (pseudo_name == "last-child")
                 simple_selector.pseudo_class = Selector::SimpleSelector::PseudoClass::LastChild;
+            else if (pseudo_name == "only-child")
+                simple_selector.pseudo_class = Selector::SimpleSelector::PseudoClass::OnlyChild;
             else if (pseudo_name == "empty")
                 simple_selector.pseudo_class = Selector::SimpleSelector::PseudoClass::Empty;
         }