1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 21:47:43 +00:00

LibWeb: Parse and match basic "contains" attribute selectors (~=)

This commit is contained in:
Andreas Kling 2020-06-10 15:43:41 +02:00
parent a38a5d50ab
commit 65c4e5cacf
4 changed files with 15 additions and 2 deletions

View file

@ -63,6 +63,7 @@ public:
None,
HasAttribute,
ExactValueMatch,
Contains,
};
AttributeMatchType attribute_match_type { AttributeMatchType::None };

View file

@ -91,6 +91,10 @@ bool matches(const Selector::SimpleSelector& component, const Element& element)
if (element.attribute(component.attribute_name) != component.attribute_value)
return false;
break;
case Selector::SimpleSelector::AttributeMatchType::Contains:
if (!element.attribute(component.attribute_name).split(' ').contains_slow(component.attribute_value))
return false;
break;
default:
break;
}

View file

@ -242,6 +242,9 @@ void dump_selector(const Selector& selector)
case Selector::SimpleSelector::AttributeMatchType::ExactValueMatch:
attribute_match_type_description = "ExactValueMatch";
break;
case Selector::SimpleSelector::AttributeMatchType::Contains:
attribute_match_type_description = "Contains";
break;
}
dbgprintf("%s:%s", type_description, simple_selector.value.characters());

View file

@ -472,8 +472,13 @@ public:
char expected_end_of_attribute_selector = ']';
while (peek() != expected_end_of_attribute_selector) {
char ch = consume_one();
if (ch == '=' || (ch == '~' && peek() == '=')) {
if (ch == '=') {
attribute_match_type = Selector::SimpleSelector::AttributeMatchType::ExactValueMatch;
} else if (ch == '~') {
consume_one();
attribute_match_type = Selector::SimpleSelector::AttributeMatchType::Contains;
}
attribute_name = String::copy(buffer);
buffer.clear();
in_value = true;