Skip to content

Commit

Permalink
LibHTML: Support the :only-child pseudo class
Browse files Browse the repository at this point in the history
  • Loading branch information
awesomekling committed Dec 16, 2019
1 parent 085cafd commit 91ba94f
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 0 deletions.
28 changes: 28 additions & 0 deletions Base/home/anon/www/only-child.html
Original file line number Diff line number Diff line change
@@ -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 change: 1 addition & 0 deletions Base/home/anon/www/welcome.html
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ <h1>Welcome to the Serenity Browser!</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>
Expand Down
1 change: 1 addition & 0 deletions Libraries/LibHTML/CSS/Selector.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class Selector {
Hover,
FirstChild,
LastChild,
OnlyChild,
Empty,
};
PseudoClass pseudo_class { PseudoClass::None };
Expand Down
4 changes: 4 additions & 0 deletions Libraries/LibHTML/CSS/SelectorEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions Libraries/LibHTML/Parser/CSSParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,8 @@ class CSSParser {
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;
}
Expand Down

0 comments on commit 91ba94f

Please sign in to comment.