LibWeb: Follow the specification steps to serialize a DOMTokenList

This ensures that calling `element.classList.toString()` always
produces the correct value.
This commit is contained in:
Tim Ledbetter 2024-07-23 13:09:11 +01:00 committed by Andreas Kling
parent 21e21abeed
commit ec1f7779cb
Notes: github-actions[bot] 2024-07-25 04:44:28 +00:00
4 changed files with 17 additions and 3 deletions

View file

@ -1,3 +1,5 @@
element.classList initial value: ""
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 "

View file

@ -8,6 +8,10 @@
println(`element.classList after setting classList to "a": "${element.classList.toString()}"`);
element.className = "";
println(`element.classList after setting className to "": "${element.classList.toString()}"`);
element.className = "a a b c";
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()}"`);
});
</script>
</html>

View file

@ -239,14 +239,20 @@ WebIDL::ExceptionOr<bool> DOMTokenList::supports(StringView token)
return false;
}
// https://dom.spec.whatwg.org/#dom-domtokenlist-value
String DOMTokenList::value() const
// https://dom.spec.whatwg.org/#concept-ordered-set-serializer
String DOMTokenList::serialize_ordered_set() const
{
StringBuilder builder;
builder.join(' ', m_token_set);
return MUST(builder.to_string());
}
// https://dom.spec.whatwg.org/#dom-domtokenlist-value
String DOMTokenList::value() const
{
return m_associated_element->get_attribute_value(m_associated_attribute);
}
// https://dom.spec.whatwg.org/#ref-for-concept-element-attributes-set-value%E2%91%A2
void DOMTokenList::set_value(String const& value)
{
@ -278,7 +284,7 @@ void DOMTokenList::run_update_steps()
return;
// 2. Set an attribute value for the associated element using associated attributes local name and the result of running the ordered set serializer for token set.
MUST(associated_element->set_attribute(m_associated_attribute, value()));
MUST(associated_element->set_attribute(m_associated_attribute, serialize_ordered_set()));
}
WebIDL::ExceptionOr<JS::Value> DOMTokenList::item_value(size_t index) const

View file

@ -53,6 +53,8 @@ private:
WebIDL::ExceptionOr<void> validate_token(StringView token) const;
void run_update_steps();
String serialize_ordered_set() const;
JS::NonnullGCPtr<Element> m_associated_element;
FlyString m_associated_attribute;
Vector<String> m_token_set;