Ver código fonte

LibWeb: Perform DOMTokenList token validation in the correct order

Tim Ledbetter 1 ano atrás
pai
commit
0127190dcf

+ 1 - 0
Tests/LibWeb/Text/expected/DOM/Element-classList.txt

@@ -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 - 0
Tests/LibWeb/Text/input/DOM/Element-classList.html

@@ -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>

+ 17 - 2
Userland/Libraries/LibWeb/DOM/DOMTokenList.cpp

@@ -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))
@@ -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 {};

+ 2 - 0
Userland/Libraries/LibWeb/DOM/DOMTokenList.h

@@ -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;