Skip to content

Commit

Permalink
DOMTokenList value property added
Browse files Browse the repository at this point in the history
  • Loading branch information
rbri committed Aug 14, 2024
1 parent 93a526c commit ebba696
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 55 deletions.
3 changes: 3 additions & 0 deletions src/changes/changes.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
<body>
<release version="4.5.0" date="xxxx, 2024" description="WebWorker, Bugfixes">
<action type="add" dev="rbri">
DOMTokenList value property added.
</action>
<action type="update" dev="rbri">
DOMTokenList simplify impl and fix removal of duplicate entries.
</action>
<action type="add" dev="rbri">
Expand Down
62 changes: 39 additions & 23 deletions src/main/java/org/htmlunit/javascript/host/dom/DOMTokenList.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.htmlunit.javascript.configuration.JsxConstructor;
import org.htmlunit.javascript.configuration.JsxFunction;
import org.htmlunit.javascript.configuration.JsxGetter;
import org.htmlunit.javascript.configuration.JsxSetter;
import org.htmlunit.javascript.configuration.JsxSymbol;

/**
Expand Down Expand Up @@ -78,20 +79,10 @@ public DOMTokenList(final Node node, final String attributeName) {
}

/**
* Returns the length property.
* @return the length
* @return the value
*/
@JsxGetter
public int getLength() {
final String value = getAttribValue();
if (StringUtils.isBlank(value)) {
return 0;
}

return split(value).size();
}

private String getAttribValue() {
public String getValue() {
final DomNode node = getDomNodeOrNull();
if (node != null) {
final DomAttr attr = (DomAttr) node.getAttributes().getNamedItem(attributeName_);
Expand All @@ -102,6 +93,31 @@ private String getAttribValue() {
return null;
}

/**
* @param value the new value
*/
@JsxSetter
public void setValue(final String value) {
final DomNode node = getDomNodeOrNull();
if (node != null) {
updateAttribute(value);
}
}

/**
* Returns the length property.
* @return the length
*/
@JsxGetter
public int getLength() {
final String value = getValue();
if (StringUtils.isBlank(value)) {
return 0;
}

return split(value).size();
}

/**
* {@inheritDoc}
*/
Expand All @@ -111,7 +127,7 @@ public String getDefaultValue(final Class<?> hint) {
return (String) super.getDefaultValue(hint);
}

final String value = getAttribValue();
final String value = getValue();
if (value != null) {
return String.join(" ", StringUtils.split(value, WHITESPACE_CHARS));
}
Expand All @@ -131,7 +147,7 @@ public void add(final String token) {
throw JavaScriptEngine.reportRuntimeError("Empty input not allowed");
}

final List<String> parts = split(getAttribValue());
final List<String> parts = split(getValue());
if (!parts.contains(token)) {
parts.add(token);
}
Expand All @@ -152,7 +168,7 @@ public void remove(final String token) {
throw JavaScriptEngine.reportRuntimeError("Empty input not allowed");
}

final List<String> parts = split(getAttribValue());
final List<String> parts = split(getValue());
parts.remove(token);
updateAttribute(String.join(" ", parts));
}
Expand Down Expand Up @@ -180,7 +196,7 @@ public boolean replace(final String oldToken, final String newToken) {
throw JavaScriptEngine.reportRuntimeError("newToken contains whitespace");
}

final List<String> parts = split(getAttribValue());
final List<String> parts = split(getValue());
final int pos = parts.indexOf(oldToken);
while (pos == -1) {
return false;
Expand Down Expand Up @@ -224,7 +240,7 @@ public boolean contains(final String token) {
throw JavaScriptEngine.reportRuntimeError("Empty input not allowed");
}

final List<String> parts = split(getAttribValue());
final List<String> parts = split(getValue());
return parts.contains(token);
}

Expand All @@ -239,12 +255,12 @@ public Object item(final int index) {
return null;
}

final String value = getAttribValue();
final String value = getValue();
if (StringUtils.isEmpty(value)) {
return null;
}

final List<String> parts = split(getAttribValue());
final List<String> parts = split(value);
if (index < parts.size()) {
return parts.get(index);
}
Expand All @@ -268,12 +284,12 @@ public Scriptable keys() {
public Object[] getIds() {
final Object[] normalIds = super.getIds();

final String value = getAttribValue();
final String value = getValue();
if (StringUtils.isEmpty(value)) {
return normalIds;
}

final List<String> parts = split(getAttribValue());
final List<String> parts = split(getValue());
final Object[] ids = new Object[parts.size() + normalIds.length];
for (int i = 0; i < parts.size(); i++) {
ids[i] = i;
Expand Down Expand Up @@ -313,7 +329,7 @@ public void forEach(final Object callback) {
"Foreach callback '" + JavaScriptEngine.toString(callback) + "' is not a function");
}

final String value = getAttribValue();
final String value = getValue();
if (StringUtils.isEmpty(value)) {
return;
}
Expand All @@ -324,7 +340,7 @@ public void forEach(final Object callback) {
final ContextAction<Object> contextAction = cx -> {
final Function function = (Function) callback;
final Scriptable scope = getParentScope();
final List<String> parts = split(getAttribValue());
final List<String> parts = split(value);
for (int i = 0; i < parts.size(); i++) {
function.call(cx, scope, this, new Object[] {parts.get(i), i, this});
}
Expand Down
20 changes: 8 additions & 12 deletions src/test/java/org/htmlunit/general/ElementOwnPropertiesTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -17577,25 +17577,21 @@ public void abortSignal() throws Exception {
*/
@Test
@Alerts(CHROME = "add(),constructor(),contains(),entries(),forEach(),item(),keys(),length[GCE],remove(),replace(),"
+ "supports(),toggle(),toString(),value[GSCE],"
+ "values()",
+ "supports(),toggle(),toString(),value[GSCE],values()",
EDGE = "add(),constructor(),contains(),entries(),forEach(),item(),keys(),length[GCE],remove(),replace(),"
+ "supports(),toggle(),toString(),value[GSCE],"
+ "values()",
+ "supports(),toggle(),toString(),value[GSCE],values()",
FF = "add(),constructor(),contains(),entries(),forEach(),item(),keys(),length[GCE],remove(),replace(),"
+ "supports(),toggle(),toString(),value[GSCE],"
+ "values()",
+ "supports(),toggle(),toString(),value[GSCE],values()",
FF_ESR = "add(),constructor(),contains(),entries(),forEach(),item(),keys(),length[GCE],remove(),replace(),"
+ "supports(),toggle(),toString(),value[GSCE],"
+ "values()")
+ "supports(),toggle(),toString(),value[GSCE],values()")
@HtmlUnitNYI(CHROME = "add(),constructor(),contains(),entries(),forEach(),item(),keys(),length[GCE],"
+ "remove(),toggle(),values()",
+ "remove(),replace(),toggle(),value[GSCE],values()",
EDGE = "add(),constructor(),contains(),entries(),forEach(),item(),keys(),length[GCE],"
+ "remove(),toggle(),values()",
+ "remove(),replace(),toggle(),value[GSCE],values()",
FF = "add(),constructor(),contains(),entries(),forEach(),item(),keys(),length[GCE],"
+ "remove(),toggle(),values()",
+ "remove(),replace(),toggle(),value[GSCE],values()",
FF_ESR = "add(),constructor(),contains(),entries(),forEach(),item(),keys(),length[GCE],"
+ "remove(),toggle(),values()")
+ "remove(),replace(),toggle(),value[GSCE],values()")
public void domTokenList() throws Exception {
testString("", "document.body.classList");
}
Expand Down
24 changes: 12 additions & 12 deletions src/test/java/org/htmlunit/general/ElementPropertiesTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -8986,21 +8986,21 @@ public void abortSignal() throws Exception {
*/
@Test
@Alerts(CHROME = "add(),contains(),entries(),forEach(),item(),keys(),length,remove(),replace(),supports(),toggle(),"
+ "toString(),value,"
+ "values()",
+ "toString(),value,values()",
EDGE = "add(),contains(),entries(),forEach(),item(),keys(),length,remove(),replace(),supports(),toggle(),"
+ "toString(),value,"
+ "values()",
+ "toString(),value,values()",
FF = "add(),contains(),entries(),forEach(),item(),keys(),length,remove(),replace(),supports(),toggle(),"
+ "toString(),value,"
+ "values()",
+ "toString(),value,values()",
FF_ESR = "add(),contains(),entries(),forEach(),item(),keys(),length,remove(),replace(),supports(),toggle(),"
+ "toString(),value,"
+ "values()")
@HtmlUnitNYI(CHROME = "add(),contains(),entries(),forEach(),item(),keys(),length,remove(),toggle(),values()",
EDGE = "add(),contains(),entries(),forEach(),item(),keys(),length,remove(),toggle(),values()",
FF = "add(),contains(),entries(),forEach(),item(),keys(),length,remove(),toggle(),values()",
FF_ESR = "add(),contains(),entries(),forEach(),item(),keys(),length,remove(),toggle(),values()")
+ "toString(),value,values()")
@HtmlUnitNYI(CHROME = "add(),contains(),entries(),forEach(),item(),keys(),length,"
+ "remove(),replace(),toggle(),value,values()",
EDGE = "add(),contains(),entries(),forEach(),item(),keys(),length,"
+ "remove(),replace(),toggle(),value,values()",
FF = "add(),contains(),entries(),forEach(),item(),keys(),length,"
+ "remove(),replace(),toggle(),value,values()",
FF_ESR = "add(),contains(),entries(),forEach(),item(),keys(),length,remove(),"
+ "replace(),toggle(),value,values()")
public void domTokenList() throws Exception {
testString("", "document.body.classList");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -368,10 +368,10 @@ public void entriesForOf() throws Exception {
*/
@Test
@Alerts("0,1,2,add,contains,entries,forEach,item,keys,length,remove,replace,supports,toggle,toString,value,values")
@HtmlUnitNYI(CHROME = "0,1,2,add,contains,entries,forEach,item,keys,length,remove,replace,toggle,values",
EDGE = "0,1,2,add,contains,entries,forEach,item,keys,length,remove,replace,toggle,values",
FF = "0,1,2,add,contains,entries,forEach,item,keys,length,remove,replace,toggle,values",
FF_ESR = "0,1,2,add,contains,entries,forEach,item,keys,length,remove,replace,toggle,values")
@HtmlUnitNYI(CHROME = "0,1,2,add,contains,entries,forEach,item,keys,length,remove,replace,toggle,value,values",
EDGE = "0,1,2,add,contains,entries,forEach,item,keys,length,remove,replace,toggle,value,values",
FF = "0,1,2,add,contains,entries,forEach,item,keys,length,remove,replace,toggle,value,values",
FF_ESR = "0,1,2,add,contains,entries,forEach,item,keys,length,remove,replace,toggle,value,values")
public void forIn() throws Exception {
final String html = HtmlPageTest.STANDARDS_MODE_PREFIX_ + "<html><head>\n"
+ "<script>\n"
Expand Down Expand Up @@ -400,10 +400,10 @@ public void forIn() throws Exception {
*/
@Test
@Alerts("add,contains,entries,forEach,item,keys,length,remove,replace,supports,toggle,toString,value,values")
@HtmlUnitNYI(CHROME = "add,contains,entries,forEach,item,keys,length,remove,replace,toggle,values",
EDGE = "add,contains,entries,forEach,item,keys,length,remove,replace,toggle,values",
FF = "add,contains,entries,forEach,item,keys,length,remove,replace,toggle,values",
FF_ESR = "add,contains,entries,forEach,item,keys,length,remove,replace,toggle,values")
@HtmlUnitNYI(CHROME = "add,contains,entries,forEach,item,keys,length,remove,replace,toggle,value,values",
EDGE = "add,contains,entries,forEach,item,keys,length,remove,replace,toggle,value,values",
FF = "add,contains,entries,forEach,item,keys,length,remove,replace,toggle,value,values",
FF_ESR = "add,contains,entries,forEach,item,keys,length,remove,replace,toggle,value,values")
public void forInEmptyList() throws Exception {
final String html = HtmlPageTest.STANDARDS_MODE_PREFIX_ + "<html><head>\n"
+ "<script>\n"
Expand Down Expand Up @@ -1569,4 +1569,61 @@ public void valuesForOf() throws Exception {

loadPageVerifyTitle2(html);
}

/**
* @throws Exception if an error occurs
*/
@Test
@Alerts("\\sa\\sb\\sa\\s\\s\\s\\sa\\sg\\s\\s")
public void getValue() throws Exception {
final String html = "<html><head>\n"
+ "<script>\n"
+ LOG_TITLE_FUNCTION_NORMALIZE
+ " function test() {\n"
+ " var list = document.getElementById('d1').classList;\n"
+ " if (!list.values) {\n"
+ " log('not defined');\n"
+ " return;\n"
+ " }\n"
+ " log(list.value);\n"
+ " }\n"
+ "</script>\n"
+ "</head><body onload='test()'>\n"
+ " <div id='d1' class=' a b a a g '></div>\n"
+ "</body></html>\n";

loadPageVerifyTitle2(html);
}

/**
* @throws Exception if an error occurs
*/
@Test
@Alerts({"\\sa\\sb\\sa\\s\\s\\s\\sa\\sg\\s\\s", "x\\sy", "z\\sz\\s\\s\\s\\s\\sx\\sz\\s\\s"})
public void setValue() throws Exception {
final String html = "<html><head>\n"
+ "<script>\n"
+ LOG_TITLE_FUNCTION_NORMALIZE
+ " function test() {\n"
+ " var list = document.getElementById('d1').classList;\n"
+ " if (!list.values) {\n"
+ " log('not defined');\n"
+ " return;\n"
+ " }\n"
+ " log(list.value);\n"

+ " list.value = 'x y';\n"
+ " log(list.value);\n"

+ " list.value = 'z z x z ';\n"
+ " log(list.value);\n"

+ " }\n"
+ "</script>\n"
+ "</head><body onload='test()'>\n"
+ " <div id='d1' class=' a b a a g '></div>\n"
+ "</body></html>\n";

loadPageVerifyTitle2(html);
}
}

0 comments on commit ebba696

Please sign in to comment.