From: <asa...@us...> - 2017-05-23 11:40:53
|
Revision: 14471 http://sourceforge.net/p/htmlunit/code/14471 Author: asashour Date: 2017-05-23 11:40:50 +0000 (Tue, 23 May 2017) Log Message: ----------- JavaScript: fix Set/Map with undefined value. Issue 1886 Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Map.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Set.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/MapTest.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/SetTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2017-05-23 11:31:10 UTC (rev 14470) +++ trunk/htmlunit/src/changes/changes.xml 2017-05-23 11:40:50 UTC (rev 14471) @@ -8,6 +8,9 @@ <body> <release version="2.27" date="???" description="GAE broken, FF52, Bugfixes"> + <action type="fix" dev="asashour" issue="1886"> + JavaScript: fix Set/Map with undefined value. + </action> <action type="fix" dev="asashour" issue="1606"> Stack property was not set when new Error() was called from js. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Map.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Map.java 2017-05-23 11:31:10 UTC (rev 14470) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Map.java 2017-05-23 11:40:50 UTC (rev 14471) @@ -145,6 +145,9 @@ if (key instanceof Delegator) { key = ((Delegator) key).getDelegee(); } + if (key == NOT_FOUND) { + key = Undefined.instance; + } map_.put(key, value); return this; } Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Set.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Set.java 2017-05-23 11:31:10 UTC (rev 14470) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Set.java 2017-05-23 11:40:50 UTC (rev 14471) @@ -124,6 +124,9 @@ if (value instanceof Delegator) { value = ((Delegator) value).getDelegee(); } + if (value == NOT_FOUND) { + value = Undefined.instance; + } set_.add(value); return this; } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/MapTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/MapTest.java 2017-05-23 11:31:10 UTC (rev 14470) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/MapTest.java 2017-05-23 11:40:50 UTC (rev 14471) @@ -385,4 +385,32 @@ loadPageWithAlerts2(html); } + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = {"value1", "undefined", "[object Map]", "[object Window]", + "[object Object]", "key2", "[object Map]", "[object Window]"}, + IE = {}) + public void forEach_withElision() throws Exception { + final String html + = "<html><head><title>foo</title><script>\n" + + "function logElement(value, key, m) {\n" + + " alert(value);\n" + + " alert(key);\n" + + " alert(m);\n" + + " alert(this);\n" + + "}\n" + + "function test() {\n" + + "try {" + + " var myMap = new Map([[, 'value1'], ['key2', {}]]);\n" + + " myMap.forEach(logElement);\n" + + "}catch(e){alert(e)}" + + "}\n" + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + loadPageWithAlerts2(html); + } + } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/SetTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/SetTest.java 2017-05-23 11:31:10 UTC (rev 14470) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/SetTest.java 2017-05-23 11:40:50 UTC (rev 14471) @@ -302,4 +302,27 @@ loadPageWithAlerts2(html); } + /** + * Test case for Bug #1886. + * + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = {"undefined", "0"}, + IE = {}) + public void forEach_withElision() throws Exception { + final String html + = "<html><head><title>foo</title><script>\n" + + "function logElement(value) {\n" + + " alert(value);\n" + + "}\n" + + "function test() {\n" + + " var mySet = new Set([, 0]);\n" + + " mySet.forEach(logElement);\n" + + "}\n" + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + loadPageWithAlerts2(html); + } } |