Skip to content

Commit

Permalink
LibWeb: Perform DOMTokenList token validation in the correct order
Browse files Browse the repository at this point in the history
  • Loading branch information
tcl3 committed Jul 24, 2024
1 parent 25dfe08 commit 9e12f96
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 2 deletions.
1 change: 1 addition & 0 deletions Tests/LibWeb/Text/expected/DOM/Element-classList.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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"
6 changes: 6 additions & 0 deletions Tests/LibWeb/Text/input/DOM/Element-classList.html
Original file line number Diff line number Diff line change
Expand Up @@ -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>
19 changes: 17 additions & 2 deletions Userland/Libraries/LibWeb/DOM/DOMTokenList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 this’s token set does not contain token, then return false.
if (!contains(token))
Expand Down Expand Up @@ -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 {};
Expand Down
2 changes: 2 additions & 0 deletions Userland/Libraries/LibWeb/DOM/DOMTokenList.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ class DOMTokenList final : public Bindings::PlatformObject {
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;
Expand Down

0 comments on commit 9e12f96

Please sign in to comment.