Bug 871510 - Some event handlers appear as undefined, hiding the appropriate null values in the prototype; r=msucan
authorPanos Astithas <past@mozilla.com>
Thu, 16 May 2013 18:42:15 +0300
changeset 132182 b865c805fd5943c47f40fb4536081054a8d910b3
parent 132072 c7df35aa72e16657a929f8442ed7810d442bad2b
child 132183 825230fd88bb33181684c66c9416744e786e6225
push id28155
push userryanvm@gmail.com
push dateFri, 17 May 2013 00:30:33 +0000
treeherdermozilla-inbound@4599f48ce936 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmsucan
bugs871510
milestone24.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 871510 - Some event handlers appear as undefined, hiding the appropriate null values in the prototype; r=msucan
toolkit/devtools/debugger/server/dbg-script-actors.js
toolkit/devtools/webconsole/test/Makefile.in
toolkit/devtools/webconsole/test/test_object_actor_native_getters_lenient_this.html
--- a/toolkit/devtools/debugger/server/dbg-script-actors.js
+++ b/toolkit/devtools/debugger/server/dbg-script-actors.js
@@ -1568,22 +1568,26 @@ ObjectActor.prototype = {
         let result = getter.call(this.obj);
         if (result && !("throw" in result)) {
           let getterValue = undefined;
           if ("return" in result) {
             getterValue = result.return;
           } else if ("yield" in result) {
             getterValue = result.yield;
           }
-          safeGetterValues[name] = {
-            getterValue: this.threadActor.createValueGrip(getterValue),
-            getterPrototypeLevel: level,
-            enumerable: desc.enumerable,
-            writable: level == 0 ? desc.writable : true,
-          };
+          // WebIDL attributes specified with the LenientThis extended attribute
+          // return undefined and should be ignored.
+          if (getterValue !== undefined) {
+            safeGetterValues[name] = {
+              getterValue: this.threadActor.createValueGrip(getterValue),
+              getterPrototypeLevel: level,
+              enumerable: desc.enumerable,
+              writable: level == 0 ? desc.writable : true,
+            };
+          }
         }
       }
 
       obj = obj.proto;
       level++;
     }
 
     return safeGetterValues;
--- a/toolkit/devtools/webconsole/test/Makefile.in
+++ b/toolkit/devtools/webconsole/test/Makefile.in
@@ -18,15 +18,16 @@ MOCHITEST_CHROME_FILES = \
     test_jsterm.html \
     test_object_actor.html \
     test_network_get.html \
     test_network_post.html \
     test_network_longstring.html \
     test_file_uri.html \
     test_bug819670_getter_throws.html \
     test_object_actor_native_getters.html \
+    test_object_actor_native_getters_lenient_this.html \
     network_requests_iframe.html \
     data.json \
     data.json^headers^ \
     common.js \
     $(NULL)
 
 include $(topsrcdir)/config/rules.mk
new file mode 100644
--- /dev/null
+++ b/toolkit/devtools/webconsole/test/test_object_actor_native_getters_lenient_this.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML>
+<html lang="en">
+<head>
+  <meta charset="utf8">
+  <title>Test that WebIDL attributes with the LenientThis extended attribute
+         do not appear in the wrong objects</title>
+  <script type="text/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript;version=1.8" src="common.js"></script>
+  <!-- Any copyright is dedicated to the Public Domain.
+     - http://creativecommons.org/publicdomain/zero/1.0/ -->
+</head>
+<body>
+<p>Test for the native getters in object actors</p>
+
+<script class="testbody" type="text/javascript;version=1.8">
+SimpleTest.waitForExplicitFinish();
+
+function startTest()
+{
+  removeEventListener("load", startTest);
+
+  attachConsole(["ConsoleAPI"], onAttach, true);
+}
+
+function onAttach(aState, aResponse)
+{
+  onConsoleCall = onConsoleCall.bind(null, aState);
+  aState.dbgClient.addListener("consoleAPICall", onConsoleCall);
+
+  let docAsProto = Object.create(document);
+
+  top.console.log("hello", docAsProto);
+}
+
+function onConsoleCall(aState, aType, aPacket)
+{
+  is(aPacket.from, aState.actor, "console API call actor");
+
+  info("checking the console API call packet");
+
+  checkConsoleAPICall(aPacket.message, {
+    level: "log",
+    filename: /test_object_actor/,
+    functionName: "onAttach",
+    arguments: ["hello", {
+      type: "object",
+      actor: /[a-z]/,
+    }],
+  });
+
+  aState.dbgClient.removeListener("consoleAPICall", onConsoleCall);
+
+  info("inspecting object properties");
+  let args = aPacket.message.arguments;
+  onProperties = onProperties.bind(null, aState);
+
+  let client = new GripClient(aState.dbgClient, args[1]);
+  client.getPrototypeAndProperties(onProperties);
+}
+
+function onProperties(aState, aResponse)
+{
+  let props = aResponse.ownProperties;
+  let keys = Object.keys(props);
+  info(keys.length + " ownProperties: " + keys);
+
+  is(keys.length, 0, "number of properties");
+  keys = Object.keys(aResponse.safeGetterValues);
+  is(keys.length, 0, "number of safe getters");
+
+  closeDebugger(aState, function() {
+    SimpleTest.finish();
+  });
+}
+
+addEventListener("load", startTest);
+</script>
+</body>
+</html>