Bug 1391274 - Add a Symbol object previewer to the console. draft
authorOriol Brufau <oriol-bugzilla@hotmail.com>
Wed, 20 Sep 2017 12:32:03 +0200
changeset 667585 95f918a9ab206add0f49149827f05e286d8f9d4e
parent 663831 1888ec2f277f6bb26271b8808e08914a21db9efe
child 732436 cac56dd2ea5b30349d90cb9b599d0f8c5b9372f8
push id80768
push userbmo:oriol-bugzilla@hotmail.com
push dateWed, 20 Sep 2017 10:40:06 +0000
bugs1391274
milestone57.0a1
Bug 1391274 - Add a Symbol object previewer to the console. MozReview-Commit-ID: EDMep3IePZ3
devtools/server/actors/object.js
devtools/server/tests/unit/test_objectgrips-19.js
devtools/server/tests/unit/xpcshell.ini
--- a/devtools/server/actors/object.js
+++ b/devtools/server/actors/object.js
@@ -1223,16 +1223,20 @@ DebuggerServer.ObjectActorPreviewers = {
   Boolean: [function (objectActor, grip, rawObj) {
     return wrappedPrimitivePreviewer("Boolean", Boolean, objectActor, grip, rawObj);
   }],
 
   Number: [function (objectActor, grip, rawObj) {
     return wrappedPrimitivePreviewer("Number", Number, objectActor, grip, rawObj);
   }],
 
+  Symbol: [function (objectActor, grip, rawObj) {
+    return wrappedPrimitivePreviewer("Symbol", Symbol, objectActor, grip, rawObj);
+  }],
+
   Function: [function ({obj, hooks}, grip) {
     if (obj.name) {
       grip.name = obj.name;
     }
 
     if (obj.displayName) {
       grip.displayName = obj.displayName.substr(0, 500);
     }
@@ -1503,20 +1507,16 @@ DebuggerServer.ObjectActorPreviewers = {
  *        The object actor
  * @param Object grip
  *        The result grip to fill in
  * @return Booolean true if the object was handled, false otherwise
  */
 function wrappedPrimitivePreviewer(className, classObj, objectActor, grip, rawObj) {
   let {obj, hooks} = objectActor;
 
-  if (!obj.proto || obj.proto.class != className) {
-    return false;
-  }
-
   let v = null;
   try {
     v = classObj.prototype.valueOf.call(rawObj);
   } catch (ex) {
     // valueOf() can throw if the raw JS object is "misbehaved".
     return false;
   }
 
new file mode 100644
--- /dev/null
+++ b/devtools/server/tests/unit/test_objectgrips-19.js
@@ -0,0 +1,78 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+/* eslint-disable no-shadow, max-nested-callbacks */
+
+"use strict";
+
+var gDebuggee;
+var gThreadClient;
+
+function run_test() {
+  run_test_with_server(DebuggerServer, function () {
+    run_test_with_server(WorkerDebuggerServer, do_test_finished);
+  });
+  do_test_pending();
+}
+
+async function run_test_with_server(server, callback) {
+  initTestDebuggerServer(server);
+  gDebuggee = gDebuggee = addTestGlobal("test-grips", server);
+  gDebuggee.eval(function stopMe(arg1) {
+    debugger;
+  }.toString());
+  let client = new DebuggerClient(server.connectPipe());
+  await client.connect();
+  const [,, threadClient] = await attachTestTabAndResume(client, "test-grips");
+  gThreadClient = threadClient;
+  await test_wrapped_primitive_grips();
+  await client.close();
+  callback();
+}
+
+async function test_wrapped_primitive_grips() {
+  let tests = [{
+    value: true,
+    class: "Boolean"
+  }, {
+    value: 123,
+    class: "Number"
+  }, {
+    value: "foo",
+    class: "String"
+  }, {
+    value: Symbol("bar"),
+    class: "Symbol",
+    name: "bar"
+  }];
+  for (let data of tests) {
+    await new Promise(function (resolve) {
+      gThreadClient.addOneTimeListener("paused", async function (event, packet) {
+        let [grip] = packet.frame.arguments;
+        check_wrapped_primitive_grip(grip, data);
+
+        await gThreadClient.resume();
+        resolve();
+      });
+      gDebuggee.primitive = data.value;
+      gDebuggee.eval("stopMe(Object(primitive));");
+    });
+  }
+}
+
+function check_wrapped_primitive_grip(grip, data) {
+  strictEqual(grip.class, data.class, "The grip has the proper class.");
+
+  if (!grip.preview) {
+    // In a worker thread Cu does not exist, the objects are considered unsafe and
+    // can't be unwrapped, so there is no preview.
+    return;
+  }
+
+  let value = grip.preview.wrappedValue;
+  if (data.class === "Symbol") {
+    strictEqual(value.type, "symbol", "The wrapped value grip has symbol type.");
+    strictEqual(value.name, data.name, "The wrapped value grip has the proper name.");
+  } else {
+    strictEqual(value, data.value, "The wrapped value is the primitive one.");
+  }
+}
--- a/devtools/server/tests/unit/xpcshell.ini
+++ b/devtools/server/tests/unit/xpcshell.ini
@@ -169,16 +169,17 @@ reason = only ran on B2G
 [test_objectgrips-11.js]
 [test_objectgrips-12.js]
 [test_objectgrips-13.js]
 [test_objectgrips-14.js]
 [test_objectgrips-15.js]
 [test_objectgrips-16.js]
 [test_objectgrips-17.js]
 [test_objectgrips-18.js]
+[test_objectgrips-19.js]
 [test_promise_state-01.js]
 [test_promise_state-02.js]
 [test_promise_state-03.js]
 [test_interrupt.js]
 [test_stepping-01.js]
 [test_stepping-02.js]
 [test_stepping-03.js]
 [test_stepping-04.js]