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 d8037cf2cc..32579eece0 100644 --- a/src/main/java/org/htmlunit/javascript/host/dom/DOMTokenList.java +++ b/src/main/java/org/htmlunit/javascript/host/dom/DOMTokenList.java @@ -18,10 +18,14 @@ import java.util.HashSet; import org.apache.commons.lang3.StringUtils; +import org.htmlunit.WebClient; +import org.htmlunit.corejs.javascript.ContextAction; +import org.htmlunit.corejs.javascript.Function; import org.htmlunit.corejs.javascript.Scriptable; import org.htmlunit.html.DomAttr; import org.htmlunit.html.DomElement; import org.htmlunit.html.DomNode; +import org.htmlunit.javascript.HtmlUnitContextFactory; import org.htmlunit.javascript.HtmlUnitScriptable; import org.htmlunit.javascript.JavaScriptEngine; import org.htmlunit.javascript.configuration.JsxClass; @@ -262,6 +266,32 @@ public Object item(final int index) { return null; } + /** + * Calls the {@code callback} given in parameter once for each value in the list. + * @param callback function to execute for each element + */ + @JsxFunction + public void forEach(final Object callback) { + final String value = getAttribValue(); + if (StringUtils.isEmpty(value)) { + return; + } + + final WebClient client = getWindow().getWebWindow().getWebClient(); + final HtmlUnitContextFactory cf = client.getJavaScriptEngine().getContextFactory(); + + final ContextAction contextAction = cx -> { + final Function function = (Function) callback; + final Scriptable scope = getParentScope(); + final String[] values = StringUtils.split(value, WHITESPACE_CHARS); + for (int i = 0; i < values.length; i++) { + function.call(cx, scope, this, new Object[] {values[i], i, this}); + } + return null; + }; + cf.call(contextAction); + } + /** * {@inheritDoc} */ 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 164a15f00d..5aecfe3fdb 100644 --- a/src/test/java/org/htmlunit/javascript/host/dom/DOMTokenListTest.java +++ b/src/test/java/org/htmlunit/javascript/host/dom/DOMTokenListTest.java @@ -178,6 +178,28 @@ public void item() throws Exception { loadPageVerifyTitle2(html); } + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({"a", "b", "c", "d", "\u000B", "e", "f", "g"}) + public void forEach() throws Exception { + final String html + = "\n" + + "
\n" + + ""; + + loadPageVerifyTitle2(html); + } + /** * @throws Exception if the test fails */