Bug 775852. Actually follow the WebIDL spec for creating JS representations of sequences. r=khuey, a=akeybl
authorBoris Zbarsky <bzbarsky@mit.edu>
Fri, 27 Jul 2012 00:09:09 -0400
changeset 100393 65f7a05712a0cb7608265a79cb3b5ad4535c8fb9
parent 100392 a3391345c86a59b737c8153c3eb724f0fe6333e1
child 100394 28c2cb14a1e4126f565bb87bed333703deaa7d4b
push id1200
push userbzbarsky@mozilla.com
push dateTue, 31 Jul 2012 03:54:16 +0000
treeherdermozilla-beta@65f7a05712a0 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerskhuey, akeybl
bugs775852
milestone15.0
Bug 775852. Actually follow the WebIDL spec for creating JS representations of sequences. r=khuey, a=akeybl
dom/bindings/Codegen.py
dom/bindings/test/Makefile.in
dom/bindings/test/test_sequence_wrapping.html
--- a/dom/bindings/Codegen.py
+++ b/dom/bindings/Codegen.py
@@ -1928,17 +1928,18 @@ if (%s.IsNull()) {
 
         # Now do non-nullable sequences.  We use setting the element
         # in the array as our succcess code because when we succeed in
         # wrapping that's what we should do.
         innerTemplate = wrapForType(
             type.inner, descriptorProvider,
             {
                 'result' :  "%s[i]" % result,
-                'successCode': ("if (!JS_SetElement(cx, returnArray, i, &tmp)) {\n"
+                'successCode': ("if (!JS_DefineElement(cx, returnArray, i, tmp,\n"
+                                "                      NULL, NULL, JSPROP_ENUMERATE)) {\n"
                                 "  return false;\n"
                                 "}"),
                 'jsvalRef': "tmp",
                 'jsvalPtr': "&tmp"
                 }
             )
         innerTemplate = CGIndenter(CGGeneric(innerTemplate)).define()
         return ("""
--- a/dom/bindings/test/Makefile.in
+++ b/dom/bindings/test/Makefile.in
@@ -56,13 +56,14 @@ bindinggen_dependencies := \
 
 _TEST_FILES = \
   test_enums.html \
   test_integers.html \
   test_interfaceToString.html \
   test_lookupGetter.html \
   test_InstanceOf.html \
   test_traceProtos.html \
+  test_sequence_wrapping.html \
   $(NULL)
 
 
 libs:: $(_TEST_FILES)
 	$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)
new file mode 100644
--- /dev/null
+++ b/dom/bindings/test/test_sequence_wrapping.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=775852
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test for Bug 775852</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=775852">Mozilla Bug 775852</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+  <canvas width="1" height="1" id="c"></canvas>
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 775852 **/
+var gl = $("c").getContext("experimental-webgl");
+var setterCalled = false;
+
+extLength = gl.getSupportedExtensions().length;
+ok(extLength > 0,
+   "This test won't work right if we have no supported extensions");
+
+Object.defineProperty(Array.prototype, "0",
+  {
+    set: function(val) {
+           setterCalled = true;
+         }
+  });
+
+// Test that our property got defined correctly
+var arr = []
+arr[0] = 5;
+is(setterCalled, true, "Setter should be called when setting prop on array");
+
+setterCalled = false;
+
+is(gl.getSupportedExtensions().length, extLength,
+   "We should still have the same number of extensions");
+
+is(setterCalled, false,
+   "Setter should not be called when getting supported extensions");
+</script>
+</pre>
+</body>
+</html>