diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index c2ecaeea52..6337b23e11 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -9,7 +9,7 @@
- DOMTokenList is now iterable, keys() method implemented.
+ DOMTokenList is now iterable, keys(), entries() method implemented.
Implementation of DOMTokenList.forEach() added.
diff --git a/src/main/java/org/htmlunit/javascript/host/dom/DOMTokenList.java b/src/main/java/org/htmlunit/javascript/host/dom/DOMTokenList.java
index 1d3af74b76..67d4040fee 100644
--- a/src/main/java/org/htmlunit/javascript/host/dom/DOMTokenList.java
+++ b/src/main/java/org/htmlunit/javascript/host/dom/DOMTokenList.java
@@ -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
diff --git a/src/test/java/org/htmlunit/general/ElementOwnPropertiesTest.java b/src/test/java/org/htmlunit/general/ElementOwnPropertiesTest.java
index 72e7e1a0d1..52a974f9cb 100644
--- a/src/test/java/org/htmlunit/general/ElementOwnPropertiesTest.java
+++ b/src/test/java/org/htmlunit/general/ElementOwnPropertiesTest.java
@@ -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");
}
diff --git a/src/test/java/org/htmlunit/general/ElementPropertiesTest.java b/src/test/java/org/htmlunit/general/ElementPropertiesTest.java
index 1ab9a4669b..fe95b2cb4c 100644
--- a/src/test/java/org/htmlunit/general/ElementPropertiesTest.java
+++ b/src/test/java/org/htmlunit/general/ElementPropertiesTest.java
@@ -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");
}
diff --git a/src/test/java/org/htmlunit/javascript/host/dom/DOMTokenListTest.java b/src/test/java/org/htmlunit/javascript/host/dom/DOMTokenListTest.java
index 7f63507e16..b301fff65b 100644
--- a/src/test/java/org/htmlunit/javascript/host/dom/DOMTokenListTest.java
+++ b/src/test/java/org/htmlunit/javascript/host/dom/DOMTokenListTest.java
@@ -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;
@@ -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 = "\n"
+ + "\n"
+ + "\n"
+ + " \n"
+ + "\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 = "\n"
+ + "\n"
+ + "\n"
+ + " \n"
+ + "\n";
+
+ loadPageVerifyTitle2(html);
+ }
+
+ /**
+ * @throws Exception if an error occurs
+ */
+ @Test
+ @Alerts({"0,a", "1,x"})
+ public void entriesForOf() throws Exception {
+ final String html = "\n"
+ + "\n"
+ + "\n"
+ + " \n"
+ + "\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_ + "\n"
+ + "\n"
+ + "\n"
+ + " \n"
+ + "";
+
+ 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_ + "\n"
+ + "\n"
+ + "\n"
+ + " \n"
+ + "";
+
+ loadPageVerifyTitle2(html);
+ }
+
/**
* @throws Exception on test failure
*/