Bug 1444909 part 2. Change DOMTokenList.replace() to return a boolean and pull in the corresponding web platform test updates. r=qdot

The wpt changes come from https://github.com/w3c/web-platform-tests/pull/9920
and are needed to keep Element-classlist.html passing.

The change to testing/web-platform/mozilla/tests/dom/classList.html is pulling
those changes into our weird forked version of that test...

MozReview-Commit-ID: CvQlBRuieUY
This commit is contained in:
Boris Zbarsky 2018-03-14 16:08:58 -04:00
parent cbabf9ebea
commit c35649f885
6 changed files with 119 additions and 119 deletions

View File

@ -314,7 +314,7 @@ nsDOMTokenList::Toggle(const nsAString& aToken,
return isPresent;
}
void
bool
nsDOMTokenList::Replace(const nsAString& aToken,
const nsAString& aNewToken,
ErrorResult& aError)
@ -324,28 +324,28 @@ nsDOMTokenList::Replace(const nsAString& aToken,
// SyntaxError, not an InvalidCharacterError.
if (aNewToken.IsEmpty()) {
aError.Throw(NS_ERROR_DOM_SYNTAX_ERR);
return;
return false;
}
aError = CheckToken(aToken);
if (aError.Failed()) {
return;
return false;
}
aError = CheckToken(aNewToken);
if (aError.Failed()) {
return;
return false;
}
const nsAttrValue* attr = GetParsedAttr();
if (!attr) {
return;
return false;
}
ReplaceInternal(attr, aToken, aNewToken);
return ReplaceInternal(attr, aToken, aNewToken);
}
void
bool
nsDOMTokenList::ReplaceInternal(const nsAttrValue* aAttr,
const nsAString& aToken,
const nsAString& aNewToken)
@ -363,7 +363,7 @@ nsDOMTokenList::ReplaceInternal(const nsAttrValue* aAttr,
}
if (!haveOld) {
// Make sure to not touch the attribute value in this case.
return;
return false;
}
bool sawIt = false;
@ -390,6 +390,7 @@ nsDOMTokenList::ReplaceInternal(const nsAttrValue* aAttr,
MOZ_ASSERT(sawIt, "How could we not have found our token this time?");
mElement->SetAttr(kNameSpaceID_None, mAttrAtom, resultStr, true);
return true;
}
bool

View File

@ -75,7 +75,7 @@ public:
void Remove(const nsAString& aToken, mozilla::ErrorResult& aError);
void Remove(const nsTArray<nsString>& aTokens,
mozilla::ErrorResult& aError);
void Replace(const nsAString& aToken,
bool Replace(const nsAString& aToken,
const nsAString& aNewToken,
mozilla::ErrorResult& aError);
bool Toggle(const nsAString& aToken,
@ -99,7 +99,7 @@ protected:
const nsTArray<nsString>& aTokens);
void RemoveInternal(const nsAttrValue* aAttr,
const nsTArray<nsString>& aTokens);
void ReplaceInternal(const nsAttrValue* aAttr,
bool ReplaceInternal(const nsAttrValue* aAttr,
const nsAString& aToken,
const nsAString& aNewToken);
inline const nsAttrValue* GetParsedAttr();

View File

@ -19,7 +19,7 @@ interface DOMTokenList {
[CEReactions, Throws]
void remove(DOMString... tokens);
[CEReactions, Throws]
void replace(DOMString token, DOMString newToken);
boolean replace(DOMString token, DOMString newToken);
[CEReactions, Throws]
boolean toggle(DOMString token, optional boolean force);
[Throws]

View File

@ -426,68 +426,66 @@ function testClassList(e, desc) {
// replace() method
function checkReplace(before, token, newToken, after, expectedException) {
checkModification(e, "replace", [token, newToken], undefined, before,
function checkReplace(before, token, newToken, expectedRes, after, expectedException) {
checkModification(e, "replace", [token, newToken], expectedRes, before,
after, expectedException, desc);
}
checkReplace(null, "", "a", null, "SyntaxError");
checkReplace(null, "", " ", null, "SyntaxError");
checkReplace(null, " ", "a", null, "InvalidCharacterError");
checkReplace(null, "\ta", "b", null, "InvalidCharacterError");
checkReplace(null, "a\t", "b", null, "InvalidCharacterError");
checkReplace(null, "\na", "b", null, "InvalidCharacterError");
checkReplace(null, "a\n", "b", null, "InvalidCharacterError");
checkReplace(null, "\fa", "b", null, "InvalidCharacterError");
checkReplace(null, "a\f", "b", null, "InvalidCharacterError");
checkReplace(null, "\ra", "b", null, "InvalidCharacterError");
checkReplace(null, "a\r", "b", null, "InvalidCharacterError");
checkReplace(null, " a", "b", null, "InvalidCharacterError");
checkReplace(null, "a ", "b", null, "InvalidCharacterError");
checkReplace(null, "", "a", null, null, "SyntaxError");
checkReplace(null, "", " ", null, null, "SyntaxError");
checkReplace(null, " ", "a", null, null, "InvalidCharacterError");
checkReplace(null, "\ta", "b", null, null, "InvalidCharacterError");
checkReplace(null, "a\t", "b", null, null, "InvalidCharacterError");
checkReplace(null, "\na", "b", null, null, "InvalidCharacterError");
checkReplace(null, "a\n", "b", null, null, "InvalidCharacterError");
checkReplace(null, "\fa", "b", null, null, "InvalidCharacterError");
checkReplace(null, "a\f", "b", null, null, "InvalidCharacterError");
checkReplace(null, "\ra", "b", null, null, "InvalidCharacterError");
checkReplace(null, "a\r", "b", null, null, "InvalidCharacterError");
checkReplace(null, " a", "b", null, null, "InvalidCharacterError");
checkReplace(null, "a ", "b", null, null, "InvalidCharacterError");
checkReplace(null, "a", "", null, "SyntaxError");
checkReplace(null, " ", "", null, "SyntaxError");
checkReplace(null, "a", " ", null, "InvalidCharacterError");
checkReplace(null, "b", "\ta", null, "InvalidCharacterError");
checkReplace(null, "b", "a\t", null, "InvalidCharacterError");
checkReplace(null, "b", "\na", null, "InvalidCharacterError");
checkReplace(null, "b", "a\n", null, "InvalidCharacterError");
checkReplace(null, "b", "\fa", null, "InvalidCharacterError");
checkReplace(null, "b", "a\f", null, "InvalidCharacterError");
checkReplace(null, "b", "\ra", null, "InvalidCharacterError");
checkReplace(null, "b", "a\r", null, "InvalidCharacterError");
checkReplace(null, "b", " a", null, "InvalidCharacterError");
checkReplace(null, "b", "a ", null, "InvalidCharacterError");
checkReplace(null, "a", "", null, null, "SyntaxError");
checkReplace(null, " ", "", null, null, "SyntaxError");
checkReplace(null, "a", " ", null, null, "InvalidCharacterError");
checkReplace(null, "b", "\ta", null, null, "InvalidCharacterError");
checkReplace(null, "b", "a\t", null, null, "InvalidCharacterError");
checkReplace(null, "b", "\na", null, null, "InvalidCharacterError");
checkReplace(null, "b", "a\n", null, null, "InvalidCharacterError");
checkReplace(null, "b", "\fa", null, null, "InvalidCharacterError");
checkReplace(null, "b", "a\f", null, null, "InvalidCharacterError");
checkReplace(null, "b", "\ra", null, null, "InvalidCharacterError");
checkReplace(null, "b", "a\r", null, null, "InvalidCharacterError");
checkReplace(null, "b", " a", null, null, "InvalidCharacterError");
checkReplace(null, "b", "a ", null, null, "InvalidCharacterError");
checkReplace("a", "a", "a", "a");
checkReplace("a", "a", "b", "b");
checkReplace("a", "A", "b", "a");
checkReplace("a b", "b", "A", "a A");
checkReplace("a b c", "d", "e", "a b c");
checkReplace("a", "a", "a", true, "a");
checkReplace("a", "a", "b", true, "b");
checkReplace("a", "A", "b", false, "a");
checkReplace("a b", "b", "A", true, "a A");
checkReplace("a b", "c", "a", false, "a b");
checkReplace("a b c", "d", "e", false, "a b c");
// https://github.com/whatwg/dom/issues/443
checkReplace("a a a b", "a", "a", "a b");
checkReplace("a a a b", "c", "d", "a a a b");
checkReplace(null, "a", "b", null);
checkReplace("", "a", "b", "");
checkReplace(" ", "a", "b", " ");
checkReplace(" a \f", "a", "b", "b");
checkReplace("a b c", "b", "d", "a d c");
// https://github.com/whatwg/dom/issues/442
// Implementations agree on the first one here, so I test it, but disagree on
// the second, so no test until the spec decides what to say.
checkReplace("a b c", "c", "a", "a b");
//checkReplace("c b a", "c", "a", ???);
checkReplace("a b a", "a", "c", "c b");
checkReplace("a b a", "b", "c", "a c");
checkReplace(" a a b", "a", "c", "c b");
checkReplace(" a a b", "b", "c", "a c");
checkReplace("\t\n\f\r a\t\n\f\r b\t\n\f\r ", "a", "c", "c b");
checkReplace("\t\n\f\r a\t\n\f\r b\t\n\f\r ", "b", "c", "a c");
checkReplace("a a a b", "a", "a", true, "a b");
checkReplace("a a a b", "c", "d", false, "a a a b");
checkReplace(null, "a", "b", false, null);
checkReplace("", "a", "b", false, "");
checkReplace(" ", "a", "b", false, " ");
checkReplace(" a \f", "a", "b", true, "b");
checkReplace("a b c", "b", "d", true, "a d c");
checkReplace("a b c", "c", "a", true, "a b");
checkReplace("c b a", "c", "a", true, "a b");
checkReplace("a b a", "a", "c", true, "c b");
checkReplace("a b a", "b", "c", true, "a c");
checkReplace(" a a b", "a", "c", true, "c b");
checkReplace(" a a b", "b", "c", true, "a c");
checkReplace("\t\n\f\r a\t\n\f\r b\t\n\f\r ", "a", "c", true, "c b");
checkReplace("\t\n\f\r a\t\n\f\r b\t\n\f\r ", "b", "c", true, "a c");
checkReplace("a null", null, "b", "a b");
checkReplace("a b", "a", null, "null b");
checkReplace("a undefined", undefined, "b", "a b");
checkReplace("a b", "a", undefined, "undefined b");
checkReplace("a null", null, "b", true, "a b");
checkReplace("a b", "a", null, true, "null b");
checkReplace("a undefined", undefined, "b", true, "a b");
checkReplace("a b", "a", undefined, true, "undefined b");
}
var content = document.getElementById("content");

View File

@ -370,65 +370,66 @@ function testClassList(e, desc) {
// replace() method
function checkReplace(before, token, newToken, after, expectedException) {
checkModification(e, "replace", [token, newToken], undefined, before,
function checkReplace(before, token, newToken, expectedRes, after, expectedException) {
checkModification(e, "replace", [token, newToken], expectedRes, before,
after, expectedException, desc);
}
checkReplace(null, "", "a", null, "SyntaxError");
checkReplace(null, "", " ", null, "SyntaxError");
checkReplace(null, " ", "a", null, "InvalidCharacterError");
checkReplace(null, "\ta", "b", null, "InvalidCharacterError");
checkReplace(null, "a\t", "b", null, "InvalidCharacterError");
checkReplace(null, "\na", "b", null, "InvalidCharacterError");
checkReplace(null, "a\n", "b", null, "InvalidCharacterError");
checkReplace(null, "\fa", "b", null, "InvalidCharacterError");
checkReplace(null, "a\f", "b", null, "InvalidCharacterError");
checkReplace(null, "\ra", "b", null, "InvalidCharacterError");
checkReplace(null, "a\r", "b", null, "InvalidCharacterError");
checkReplace(null, " a", "b", null, "InvalidCharacterError");
checkReplace(null, "a ", "b", null, "InvalidCharacterError");
checkReplace(null, "", "a", null, null, "SyntaxError");
checkReplace(null, "", " ", null, null, "SyntaxError");
checkReplace(null, " ", "a", null, null, "InvalidCharacterError");
checkReplace(null, "\ta", "b", null, null, "InvalidCharacterError");
checkReplace(null, "a\t", "b", null, null, "InvalidCharacterError");
checkReplace(null, "\na", "b", null, null, "InvalidCharacterError");
checkReplace(null, "a\n", "b", null, null, "InvalidCharacterError");
checkReplace(null, "\fa", "b", null, null, "InvalidCharacterError");
checkReplace(null, "a\f", "b", null, null, "InvalidCharacterError");
checkReplace(null, "\ra", "b", null, null, "InvalidCharacterError");
checkReplace(null, "a\r", "b", null, null, "InvalidCharacterError");
checkReplace(null, " a", "b", null, null, "InvalidCharacterError");
checkReplace(null, "a ", "b", null, null, "InvalidCharacterError");
checkReplace(null, "a", "", null, "SyntaxError");
checkReplace(null, " ", "", null, "SyntaxError");
checkReplace(null, "a", " ", null, "InvalidCharacterError");
checkReplace(null, "b", "\ta", null, "InvalidCharacterError");
checkReplace(null, "b", "a\t", null, "InvalidCharacterError");
checkReplace(null, "b", "\na", null, "InvalidCharacterError");
checkReplace(null, "b", "a\n", null, "InvalidCharacterError");
checkReplace(null, "b", "\fa", null, "InvalidCharacterError");
checkReplace(null, "b", "a\f", null, "InvalidCharacterError");
checkReplace(null, "b", "\ra", null, "InvalidCharacterError");
checkReplace(null, "b", "a\r", null, "InvalidCharacterError");
checkReplace(null, "b", " a", null, "InvalidCharacterError");
checkReplace(null, "b", "a ", null, "InvalidCharacterError");
checkReplace(null, "a", "", null, null, "SyntaxError");
checkReplace(null, " ", "", null, null, "SyntaxError");
checkReplace(null, "a", " ", null, null, "InvalidCharacterError");
checkReplace(null, "b", "\ta", null, null, "InvalidCharacterError");
checkReplace(null, "b", "a\t", null, null, "InvalidCharacterError");
checkReplace(null, "b", "\na", null, null, "InvalidCharacterError");
checkReplace(null, "b", "a\n", null, null, "InvalidCharacterError");
checkReplace(null, "b", "\fa", null, null, "InvalidCharacterError");
checkReplace(null, "b", "a\f", null, null, "InvalidCharacterError");
checkReplace(null, "b", "\ra", null, null, "InvalidCharacterError");
checkReplace(null, "b", "a\r", null, null, "InvalidCharacterError");
checkReplace(null, "b", " a", null, null, "InvalidCharacterError");
checkReplace(null, "b", "a ", null, null, "InvalidCharacterError");
checkReplace("a", "a", "a", "a");
checkReplace("a", "a", "b", "b");
checkReplace("a", "A", "b", "a");
checkReplace("a b", "b", "A", "a A");
checkReplace("a b c", "d", "e", "a b c");
checkReplace("a", "a", "a", true, "a");
checkReplace("a", "a", "b", true, "b");
checkReplace("a", "A", "b", false, "a");
checkReplace("a b", "b", "A", true, "a A");
checkReplace("a b", "c", "a", false, "a b");
checkReplace("a b c", "d", "e", false, "a b c");
// https://github.com/whatwg/dom/issues/443
checkReplace("a a a b", "a", "a", "a b");
checkReplace("a a a b", "c", "d", "a a a b");
checkReplace(null, "a", "b", null);
checkReplace("", "a", "b", "");
checkReplace(" ", "a", "b", " ");
checkReplace(" a \f", "a", "b", "b");
checkReplace("a b c", "b", "d", "a d c");
checkReplace("a b c", "c", "a", "a b");
checkReplace("c b a", "c", "a", "a b");
checkReplace("a b a", "a", "c", "c b");
checkReplace("a b a", "b", "c", "a c");
checkReplace(" a a b", "a", "c", "c b");
checkReplace(" a a b", "b", "c", "a c");
checkReplace("\t\n\f\r a\t\n\f\r b\t\n\f\r ", "a", "c", "c b");
checkReplace("\t\n\f\r a\t\n\f\r b\t\n\f\r ", "b", "c", "a c");
checkReplace("a a a b", "a", "a", true, "a b");
checkReplace("a a a b", "c", "d", false, "a a a b");
checkReplace(null, "a", "b", false, null);
checkReplace("", "a", "b", false, "");
checkReplace(" ", "a", "b", false, " ");
checkReplace(" a \f", "a", "b", true, "b");
checkReplace("a b c", "b", "d", true, "a d c");
checkReplace("a b c", "c", "a", true, "a b");
checkReplace("c b a", "c", "a", true, "a b");
checkReplace("a b a", "a", "c", true, "c b");
checkReplace("a b a", "b", "c", true, "a c");
checkReplace(" a a b", "a", "c", true, "c b");
checkReplace(" a a b", "b", "c", true, "a c");
checkReplace("\t\n\f\r a\t\n\f\r b\t\n\f\r ", "a", "c", true, "c b");
checkReplace("\t\n\f\r a\t\n\f\r b\t\n\f\r ", "b", "c", true, "a c");
checkReplace("a null", null, "b", "a b");
checkReplace("a b", "a", null, "null b");
checkReplace("a undefined", undefined, "b", "a b");
checkReplace("a b", "a", undefined, "undefined b");
checkReplace("a null", null, "b", true, "a b");
checkReplace("a b", "a", null, true, "null b");
checkReplace("a undefined", undefined, "b", true, "a b");
checkReplace("a b", "a", undefined, true, "undefined b");
}
var content = document.getElementById("content");

View File

@ -548,7 +548,7 @@ interface DOMTokenList {
[CEReactions] void add(DOMString... tokens);
[CEReactions] void remove(DOMString... tokens);
[CEReactions] boolean toggle(DOMString token, optional boolean force);
[CEReactions] void replace(DOMString token, DOMString newToken);
[CEReactions] boolean replace(DOMString token, DOMString newToken);
boolean supports(DOMString token);
[CEReactions] stringifier attribute DOMString value;
// iterable<DOMString>;