LibWeb: Perform DOMTokenList token validation in the correct order

This commit is contained in:
Tim Ledbetter 2024-07-23 13:10:50 +01:00 committed by Andreas Kling
parent ec1f7779cb
commit 0127190dcf
Notes: github-actions[bot] 2024-07-25 04:44:23 +00:00
4 changed files with 26 additions and 2 deletions

View file

@ -3,3 +3,4 @@ element.classList after setting classList to "a": "a"
element.classList after setting className to "": ""
element.classList after setting to className to "a a b c": "a a b c"
element.classList after setting to className to " a a b c ": " a a b c "
element.classList.replace(" ", "") throws "SyntaxError"

View file

@ -12,6 +12,12 @@
println(`element.classList after setting to className to "a a b c": "${element.classList.toString()}"`);
element.className = " a a b c ";
println(`element.classList after setting to className to " a a b c ": "${element.classList.toString()}"`);
try {
element.classList.replace(" ", "");
} catch (e) {
println(`element.classList.replace(" ", "") throws "${e.name}"`);
}
});
</script>
</html>

View file

@ -192,9 +192,12 @@ WebIDL::ExceptionOr<bool> DOMTokenList::toggle(String const& token, Optional<boo
WebIDL::ExceptionOr<bool> DOMTokenList::replace(String const& token, String const& new_token)
{
// 1. If either token or newToken is the empty string, then throw a "SyntaxError" DOMException.
TRY(validate_token_not_empty(token));
TRY(validate_token_not_empty(new_token));
// 2. If either token or newToken contains any ASCII whitespace, then throw an "InvalidCharacterError" DOMException.
TRY(validate_token(token));
TRY(validate_token(new_token));
TRY(validate_token_not_whitespace(token));
TRY(validate_token_not_whitespace(new_token));
// 3. If thiss token set does not contain token, then return false.
if (!contains(token))
@ -264,9 +267,21 @@ void DOMTokenList::set_value(String const& value)
}
WebIDL::ExceptionOr<void> DOMTokenList::validate_token(StringView token) const
{
TRY(validate_token_not_empty(token));
TRY(validate_token_not_whitespace(token));
return {};
}
WebIDL::ExceptionOr<void> DOMTokenList::validate_token_not_empty(StringView token) const
{
if (token.is_empty())
return WebIDL::SyntaxError::create(realm(), "Non-empty DOM tokens are not allowed"_fly_string);
return {};
}
WebIDL::ExceptionOr<void> DOMTokenList::validate_token_not_whitespace(StringView token) const
{
if (any_of(token, Infra::is_ascii_whitespace))
return WebIDL::InvalidCharacterError::create(realm(), "DOM tokens containing ASCII whitespace are not allowed"_fly_string);
return {};

View file

@ -51,6 +51,8 @@ private:
virtual void visit_edges(Cell::Visitor&) override;
WebIDL::ExceptionOr<void> validate_token(StringView token) const;
WebIDL::ExceptionOr<void> validate_token_not_empty(StringView token) const;
WebIDL::ExceptionOr<void> validate_token_not_whitespace(StringView token) const;
void run_update_steps();
String serialize_ordered_set() const;