Skip to content

Commit

Permalink
DOMTokenList entries() method implemented
Browse files Browse the repository at this point in the history
  • Loading branch information
rbri committed Aug 14, 2024
1 parent 0fb4240 commit 22000c9
Show file tree
Hide file tree
Showing 5 changed files with 178 additions and 10 deletions.
2 changes: 1 addition & 1 deletion src/changes/changes.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<body>
<release version="4.5.0" date="xxxx, 2024" description="WebWorker, Bugfixes">
<action type="add" dev="rbri">
DOMTokenList is now iterable, keys() method implemented.
DOMTokenList is now iterable, keys(), entries() method implemented.
</action>
<action type="add" dev="Markus Winter" issue="#848">
Implementation of DOMTokenList.forEach() added.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,15 @@ public Scriptable values() {
return JavaScriptEngine.newArrayIteratorTypeValues(getParentScope(), this);
}

/**
* Returns an Iterator allowing to go through all key/value pairs contained in this object.
* @return a NativeArrayIterator
*/
@JsxFunction
public Scriptable entries() {
return JavaScriptEngine.newArrayIteratorTypeEntries(getParentScope(), this);
}

/**
* Calls the {@code callback} given in parameter once for each value in the list.
* @param callback function to execute for each element
Expand Down
13 changes: 8 additions & 5 deletions src/test/java/org/htmlunit/general/ElementOwnPropertiesTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -17588,11 +17588,14 @@ public void abortSignal() throws Exception {
FF_ESR = "add(),constructor(),contains(),entries(),forEach(),item(),keys(),length[GCE],remove(),replace(),"
+ "supports(),toggle(),toString(),value[GSCE],"
+ "values()")
@HtmlUnitNYI(CHROME = "add(),constructor(),contains(),forEach(),item(),keys(),length[GCE],remove(),toggle(),"
+ "values()",
EDGE = "add(),constructor(),contains(),forEach(),item(),keys(),length[GCE],remove(),toggle(),values()",
FF = "add(),constructor(),contains(),forEach(),item(),keys(),length[GCE],remove(),toggle(),values()",
FF_ESR = "add(),constructor(),contains(),forEach(),item(),keys(),length[GCE],remove(),toggle(),values()")
@HtmlUnitNYI(CHROME = "add(),constructor(),contains(),entries(),forEach(),item(),keys(),length[GCE],"
+ "remove(),toggle(),values()",
EDGE = "add(),constructor(),contains(),entries(),forEach(),item(),keys(),length[GCE],"
+ "remove(),toggle(),values()",
FF = "add(),constructor(),contains(),entries(),forEach(),item(),keys(),length[GCE],"
+ "remove(),toggle(),values()",
FF_ESR = "add(),constructor(),contains(),entries(),forEach(),item(),keys(),length[GCE],"
+ "remove(),toggle(),values()")
public void domTokenList() throws Exception {
testString("", "document.body.classList");
}
Expand Down
8 changes: 4 additions & 4 deletions src/test/java/org/htmlunit/general/ElementPropertiesTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -8997,10 +8997,10 @@ public void abortSignal() throws Exception {
FF_ESR = "add(),contains(),entries(),forEach(),item(),keys(),length,remove(),replace(),supports(),toggle(),"
+ "toString(),value,"
+ "values()")
@HtmlUnitNYI(CHROME = "add(),contains(),forEach(),item(),keys(),length,remove(),toggle(),values()",
EDGE = "add(),contains(),forEach(),item(),keys(),length,remove(),toggle(),values()",
FF = "add(),contains(),forEach(),item(),keys(),length,remove(),toggle(),values()",
FF_ESR = "add(),contains(),forEach(),item(),keys(),length,remove(),toggle(),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()")
public void domTokenList() throws Exception {
testString("", "document.body.classList");
}
Expand Down
156 changes: 156 additions & 0 deletions src/test/java/org/htmlunit/javascript/host/dom/DOMTokenListTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.htmlunit.html.HtmlPageTest;
import org.htmlunit.junit.BrowserRunner;
import org.htmlunit.junit.BrowserRunner.Alerts;
import org.htmlunit.junit.BrowserRunner.HtmlUnitNYI;
import org.junit.Test;
import org.junit.runner.RunWith;

Expand Down Expand Up @@ -249,6 +250,161 @@ public void forEachWrongParam() throws Exception {
loadPageVerifyTitle2(html);
}

/**
* @throws Exception if an error occurs
*/
@Test
@Alerts({"value", "done", "object", "0", "a"})
public void entries() throws Exception {
final String html = "<html><head>\n"
+ "<script>\n"
+ LOG_TITLE_FUNCTION
+ " function test() {\n"
+ " var list = document.getElementById('d1').classList;\n"
+ " if (!list.entries) {\n"
+ " log('not defined');\n"
+ " return;\n"
+ " }\n"
+ " var i = list.entries().next();\n"
+ " for (var x in i) {\n"
+ " log(x);\n"
+ " }\n"
+ " var v = i.value;\n"
+ " log(typeof v);\n"
+ " log(v[0]);\n"
+ " log(v[1]);\n"
+ " }\n"
+ "</script>\n"
+ "</head><body onload='test()'>\n"
+ " <div id='d1' class=' a x'></div>\n"
+ "</body></html>\n";

loadPageVerifyTitle2(html);
}

/**
* @throws Exception if an error occurs
*/
@Test
@Alerts({"true", "undefined", "function", "undefined", "undefined", "true", "true", "true"})
public void entriesPropertyDescriptor() throws Exception {
final String html = "<html><head>\n"
+ "<script>\n"
+ LOG_TITLE_FUNCTION
+ " function test() {\n"
+ " var list = document.getElementById('d1').classList;\n"

+ " log('entries' in list);\n"
+ " log(Object.getOwnPropertyDescriptor(list, 'entries'));\n"

+ " var desc = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(list), 'entries');\n"
+ " if (desc === undefined) { log('no entries'); return; }\n"
+ " log(typeof desc.value);\n"
+ " log(desc.get);\n"
+ " log(desc.set);\n"
+ " log(desc.writable);\n"
+ " log(desc.enumerable);\n"
+ " log(desc.configurable);\n"
+ " }\n"
+ "</script>\n"
+ "</head><body onload='test()'>\n"
+ " <div id='d1' class=' a x'></div>\n"
+ "</body></html>\n";

loadPageVerifyTitle2(html);
}

/**
* @throws Exception if an error occurs
*/
@Test
@Alerts({"0,a", "1,x"})
public void entriesForOf() throws Exception {
final String html = "<html><head>\n"
+ "<script>\n"
+ LOG_TITLE_FUNCTION
+ " function test() {\n"
+ " var list = document.getElementById('d1').classList;\n"
+ " if (!list.entries) {\n"
+ " log('not defined');\n"
+ " return;\n"
+ " }\n"
+ " for (var i of list.entries()) {\n"
+ " log(i);\n"
+ " }\n"
+ " }\n"
+ "</script>\n"
+ "</head><body onload='test()'>\n"
+ " <div id='d1' class=' a x'></div>\n"
+ "</body></html>\n";

loadPageVerifyTitle2(html);
}

/**
* @throws Exception on test failure
*/
@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,toggle,values",
EDGE = "0,1,2,add,contains,entries,forEach,item,keys,length,remove,toggle,values",
FF = "0,1,2,add,contains,entries,forEach,item,keys,length,remove,toggle,values",
FF_ESR = "0,1,2,add,contains,entries,forEach,item,keys,length,remove,toggle,values")
public void forIn() throws Exception {
final String html = HtmlPageTest.STANDARDS_MODE_PREFIX_ + "<html><head>\n"
+ "<script>\n"
+ LOG_TITLE_FUNCTION
+ " function test() {\n"
+ " var all = [];\n"
+ " for (var i in document.getElementById('d1').classList) {\n"
+ " all.push(i);\n"
+ " }\n"
+ " all.sort(sortFunction);\n"
+ " log(all);\n"
+ " }\n"
+ " function sortFunction(s1, s2) {\n"
+ " return s1.toLowerCase() > s2.toLowerCase() ? 1 : -1;\n"
+ " }\n"
+ "</script>\n"
+ "</head><body onload='test()'>\n"
+ " <div id='d1' class=' a b g'></div>\n"
+ "</body></html>";

loadPageVerifyTitle2(html);
}

/**
* @throws Exception on test failure
*/
@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,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")
public void forInEmptyList() throws Exception {
final String html = HtmlPageTest.STANDARDS_MODE_PREFIX_ + "<html><head>\n"
+ "<script>\n"
+ LOG_TITLE_FUNCTION
+ " function test() {\n"
+ " var all = [];\n"
+ " for (var i in document.getElementById('d1').classList) {\n"
+ " all.push(i);\n"
+ " }\n"
+ " all.sort(sortFunction);\n"
+ " log(all);\n"
+ " }\n"
+ " function sortFunction(s1, s2) {\n"
+ " return s1.toLowerCase() > s2.toLowerCase() ? 1 : -1;\n"
+ " }\n"
+ "</script>\n"
+ "</head><body onload='test()'>\n"
+ " <div id='d1'></div>\n"
+ "</body></html>";

loadPageVerifyTitle2(html);
}

/**
* @throws Exception on test failure
*/
Expand Down

0 comments on commit 22000c9

Please sign in to comment.