LibHTML: Support the :empty pseudo class

This commit is contained in:
Andreas Kling 2019-12-16 19:45:50 +01:00
parent a32cae4c3b
commit 085cafd80a
Notes: sideshowbarker 2024-07-19 10:50:08 +09:00
5 changed files with 35 additions and 0 deletions

View File

@ -0,0 +1,26 @@
<html>
<head>
<title>:empty test</title>
<style>
.box {
background-color: pink;
height: 80px;
width: 80px;
}
.box:empty {
background-color: lime;
}
</style>
</head>
<body>
<div class="box"><!-- I will be lime. --></div>
<div class="box">I will be pink.</div>
<div class="box">
<!-- I will be pink in older browsers because of the whitespace around this comment. -->
</div>
<div class="box">
<p><!-- I will be pink in all browsers because of the non-collapsible whitespace and elements around this comment. --></p>
</div>
</body>
</html>

View File

@ -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="empty.html">:empty</a></li>
<li><a href="form.html">form</a></li>
<li><a href="borders.html">borders</a></li>
<li><a href="css.html">css</a></li>

View File

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

View File

@ -1,6 +1,7 @@
#include <LibHTML/CSS/SelectorEngine.h>
#include <LibHTML/DOM/Document.h>
#include <LibHTML/DOM/Element.h>
#include <LibHTML/DOM/Text.h>
namespace SelectorEngine {
@ -35,6 +36,10 @@ bool matches(const Selector::SimpleSelector& component, const Element& element)
if (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;
break;
}
switch (component.attribute_match_type) {

View File

@ -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 == "empty")
simple_selector.pseudo_class = Selector::SimpleSelector::PseudoClass::Empty;
}
return simple_selector;