Bug 1391274 - Add a Symbol object previewer to the console.
MozReview-Commit-ID: EDMep3IePZ3
--- 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]