From: <asa...@us...> - 2017-04-28 10:30:22
|
Revision: 14282 http://sourceforge.net/p/htmlunit/code/14282 Author: asashour Date: 2017-04-28 10:30:19 +0000 (Fri, 28 Apr 2017) Log Message: ----------- JavaScript: fix .set() of Typed Arrays Issue 1873 Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/arrays/ArrayBufferViewBase.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/arrays/ArrayBufferViewTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2017-04-28 08:59:41 UTC (rev 14281) +++ trunk/htmlunit/src/changes/changes.xml 2017-04-28 10:30:19 UTC (rev 14282) @@ -8,6 +8,9 @@ <body> <release version="2.27" date="???" description="GAE broken, Bugfixes"> + <action type="fix" dev="asashour" issue="1873"> + JavaScript: fix .set() of Typed Arrays. + </action> <action type="fix" dev="asashour" issue="1872"> JavaScript: fix Typed Arrays construction with null. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/arrays/ArrayBufferViewBase.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/arrays/ArrayBufferViewBase.java 2017-04-28 08:59:41 UTC (rev 14281) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/arrays/ArrayBufferViewBase.java 2017-04-28 10:30:19 UTC (rev 14282) @@ -121,9 +121,12 @@ */ @JsxFunction public void set(final ScriptableObject sourceArray, final int offset) { - final int length = ((Number) ScriptableObject.getProperty(sourceArray, "length")).intValue(); - for (int i = 0; i < length; i++) { - put(i + offset, this, sourceArray.get(i)); + final Object lengthProperty = ScriptableObject.getProperty(sourceArray, "length"); + if (lengthProperty instanceof Number) { + final int length = ((Number) lengthProperty).intValue(); + for (int i = 0; i < length; i++) { + put(i + offset, this, sourceArray.get(i)); + } } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/arrays/ArrayBufferViewTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/arrays/ArrayBufferViewTest.java 2017-04-28 08:59:41 UTC (rev 14281) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/arrays/ArrayBufferViewTest.java 2017-04-28 10:30:19 UTC (rev 14282) @@ -41,15 +41,11 @@ final String html = "<html><head><title>foo</title><script>\n" + "function test() {\n" - + " try {\n" - + " var array = new Int8Array(10);\n" - + " array.set(new Int8Array([18, 93, 42]), 3);\n" - + " alert(array[3]);\n" - + " alert(array[4]);\n" - + " alert(array[5]);\n" - + " } catch(e) {\n" - + " alert('exception');\n" - + " }\n" + + " var array = new Int8Array(10);\n" + + " array.set(new Int8Array([18, 93, 42]), 3);\n" + + " alert(array[3]);\n" + + " alert(array[4]);\n" + + " alert(array[5]);\n" + "}\n" + "</script></head><body onload='test()'>\n" + "</body></html>"; @@ -61,22 +57,37 @@ * @throws Exception if the test fails */ @Test + @Alerts("10") + public void set_empty() throws Exception { + final String html + = "<html><head><title>foo</title><script>\n" + + "function test() {\n" + + " var array = new Int8Array(10);\n" + + " array.set({});\n" + + " alert(array.length);\n" + + "}\n" + + "</script></head><body onload='test()'>\n" + + "</body></html>"; + + loadPageWithAlerts2(html); + } + + /** + * @throws Exception if the test fails + */ + @Test @Alerts({"3", "2", "3", "-1"}) public void subarray_int8() throws Exception { final String html = "<html><head><title>foo</title><script>\n" + "function test() {\n" - + " try {\n" - + " var x = new Int8Array([0, 1, 2, 3, 4, 5]);\n" - + " var y = x.subarray(2, 5);\n" - + " alert(y.length);\n" - + " alert(y[0]);\n" - + " alert(y[1]);\n" - + " y[0] = -1;\n" - + " alert(x[2]);\n" - + " } catch(e) {\n" - + " alert('exception');\n" - + " }\n" + + " var x = new Int8Array([0, 1, 2, 3, 4, 5]);\n" + + " var y = x.subarray(2, 5);\n" + + " alert(y.length);\n" + + " alert(y[0]);\n" + + " alert(y[1]);\n" + + " y[0] = -1;\n" + + " alert(x[2]);\n" + "}\n" + "</script></head><body onload='test()'>\n" + "</body></html>"; @@ -93,14 +104,10 @@ final String html = "<html><head><title>foo</title><script>\n" + "function test() {\n" - + " try {\n" - + " var x = new Int8Array([null, 'null', undefined, '10', true, 2.4, 2.5, '2.6']);\n" - + " alert(x.length);\n" - + " for(var i = 0; i < x.length; i++) {\n" - + " alert(x[i]);\n" - + " }\n" - + " } catch(e) {\n" - + " alert('exception');\n" + + " var x = new Int8Array([null, 'null', undefined, '10', true, 2.4, 2.5, '2.6']);\n" + + " alert(x.length);\n" + + " for(var i = 0; i < x.length; i++) {\n" + + " alert(x[i]);\n" + " }\n" + "}\n" + "</script></head><body onload='test()'>\n" @@ -145,14 +152,10 @@ final String html = "<html><head><title>foo</title><script>\n" + "function test() {\n" - + " try {\n" - + " var x = new Float32Array([null]);\n" - + " alert(x.length);\n" - + " for(var i = 0; i < x.length; i++) {\n" - + " alert(x[i]);\n" - + " }\n" - + " } catch(e) {\n" - + " alert('exception');\n" + + " var x = new Float32Array([null]);\n" + + " alert(x.length);\n" + + " for(var i = 0; i < x.length; i++) {\n" + + " alert(x[i]);\n" + " }\n" + "}\n" + "</script></head><body onload='test()'>\n" |