Bug 1678613 - Use property descriptors in promise previewers. r=nchevobbe

Differential Revision: https://phabricator.services.mozilla.com/D97760
This commit is contained in:
Oriol Brufau 2020-11-27 15:53:55 +00:00
parent e996bcb42b
commit 50f32274b5
8 changed files with 124 additions and 86 deletions

View file

@ -44,13 +44,13 @@ define(function(require, exports, module) {
if (object.promiseState) {
const { state, value, reason } = object.promiseState;
const ownProperties = Object.create(null);
ownProperties["<state>"] = state;
ownProperties["<state>"] = { value: state };
let ownPropertiesLength = 1;
if (state == "fulfilled") {
ownProperties["<value>"] = value;
ownProperties["<value>"] = { value: value };
++ownPropertiesLength;
} else if (state == "rejected") {
ownProperties["<reason>"] = reason;
ownProperties["<reason>"] = { value: reason };
++ownPropertiesLength;
}
object.preview = {
@ -77,7 +77,7 @@ define(function(require, exports, module) {
config,
getTitle(object),
span({ className: "objectLeftBrace" }, " { "),
Rep({ object: object.preview.ownProperties["<state>"] }),
Rep({ object: object.preview.ownProperties["<state>"].value }),
span({ className: "objectRightBrace" }, " }")
);
}

View file

@ -107,7 +107,7 @@ describe("Promise - fulfilled with object", () => {
describe("Promise - fulfilled with array", () => {
const object = stubs.get("FulfilledWithArray");
const length = getGripLengthBubbleText(
object.preview.ownProperties["<value>"],
object.preview.ownProperties["<value>"].value,
{
mode: MODE.TINY,
}

View file

@ -179,10 +179,14 @@ stubs.set("Promise.resolve(1n)", {
preview: {
kind: "Object",
ownProperties: {
"<state>": "fulfilled",
"<state>": {
value: "fulfilled",
},
"<value>": {
type: "BigInt",
text: "1",
value: {
type: "BigInt",
text: "1",
},
},
},
ownPropertiesLength: 2,

View file

@ -13,7 +13,9 @@ stubs.set("Pending", {
preview: {
kind: "Object",
ownProperties: {
"<state>": "pending",
"<state>": {
value: "pending",
},
},
ownPropertiesLength: 1,
},
@ -27,8 +29,12 @@ stubs.set("FulfilledWithNumber", {
preview: {
kind: "Object",
ownProperties: {
"<state>": "fulfilled",
"<value>": 42,
"<state>": {
value: "fulfilled",
},
"<value>": {
value: 42,
},
},
ownPropertiesLength: 2,
},
@ -42,8 +48,12 @@ stubs.set("FulfilledWithString", {
preview: {
kind: "Object",
ownProperties: {
"<state>": "fulfilled",
"<value>": "foo",
"<state>": {
value: "fulfilled",
},
"<value>": {
value: "foo",
},
},
ownPropertiesLength: 2,
},
@ -57,15 +67,19 @@ stubs.set("FulfilledWithObject", {
preview: {
kind: "Object",
ownProperties: {
"<state>": "fulfilled",
"<state>": {
value: "fulfilled",
},
"<value>": {
type: "object",
actor: "server1.conn1.child1/obj60",
class: "Object",
extensible: true,
frozen: false,
sealed: false,
ownPropertyLength: 2,
value: {
type: "object",
actor: "server1.conn1.child1/obj60",
class: "Object",
extensible: true,
frozen: false,
sealed: false,
ownPropertyLength: 2,
},
},
},
ownPropertiesLength: 2,
@ -80,18 +94,22 @@ stubs.set("FulfilledWithArray", {
preview: {
kind: "Object",
ownProperties: {
"<state>": "fulfilled",
"<state>": {
value: "fulfilled",
},
"<value>": {
type: "object",
actor: "server1.conn1.child1/obj58",
class: "Array",
extensible: true,
frozen: false,
sealed: false,
ownPropertyLength: 4,
preview: {
kind: "ArrayLike",
length: 3,
value: {
type: "object",
actor: "server1.conn1.child1/obj58",
class: "Array",
extensible: true,
frozen: false,
sealed: false,
ownPropertyLength: 4,
preview: {
kind: "ArrayLike",
length: 3,
},
},
},
},
@ -107,26 +125,30 @@ stubs.set("FulfilledWithNode", {
preview: {
kind: "Object",
ownProperties: {
"<state>": "fulfilled",
"<state>": {
value: "fulfilled",
},
"<value>": {
type: "object",
actor: "server1.conn1.child1/obj218",
class: "HTMLButtonElement",
extensible: true,
frozen: false,
sealed: false,
ownPropertyLength: 0,
preview: {
kind: "DOMNode",
nodeType: 1,
nodeName: "button",
isConnected: true,
attributes: {
id: "btn-1",
class: "btn btn-log",
type: "button",
value: {
type: "object",
actor: "server1.conn1.child1/obj218",
class: "HTMLButtonElement",
extensible: true,
frozen: false,
sealed: false,
ownPropertyLength: 0,
preview: {
kind: "DOMNode",
nodeType: 1,
nodeName: "button",
isConnected: true,
attributes: {
id: "btn-1",
class: "btn btn-log",
type: "button",
},
attributesLength: 3,
},
attributesLength: 3,
},
},
},
@ -142,26 +164,30 @@ stubs.set("FulfilledWithDisconnectedNode", {
preview: {
kind: "Object",
ownProperties: {
"<state>": "fulfilled",
"<state>": {
value: "fulfilled",
},
"<value>": {
type: "object",
actor: "server1.conn1.child1/obj218",
class: "HTMLButtonElement",
extensible: true,
frozen: false,
sealed: false,
ownPropertyLength: 0,
preview: {
kind: "DOMNode",
nodeType: 1,
nodeName: "button",
isConnected: false,
attributes: {
id: "btn-1",
class: "btn btn-log",
type: "button",
value: {
type: "object",
actor: "server1.conn1.child1/obj218",
class: "HTMLButtonElement",
extensible: true,
frozen: false,
sealed: false,
ownPropertyLength: 0,
preview: {
kind: "DOMNode",
nodeType: 1,
nodeName: "button",
isConnected: false,
attributes: {
id: "btn-1",
class: "btn btn-log",
type: "button",
},
attributesLength: 3,
},
attributesLength: 3,
},
},
},
@ -177,8 +203,12 @@ stubs.set("RejectedWithNumber", {
preview: {
kind: "Object",
ownProperties: {
"<state>": "rejected",
"<reason>": 123,
"<state>": {
value: "rejected",
},
"<reason>": {
value: 123,
},
},
ownPropertiesLength: 2,
},
@ -192,15 +222,19 @@ stubs.set("RejectedWithObject", {
preview: {
kind: "Object",
ownProperties: {
"<state>": "rejected",
"<state>": {
value: "rejected",
},
"<reason>": {
type: "object",
actor: "server1.conn1.child1/obj68",
class: "Object",
extensible: true,
frozen: false,
sealed: false,
ownPropertyLength: 1,
value: {
type: "object",
actor: "server1.conn1.child1/obj68",
class: "Object",
extensible: true,
frozen: false,
sealed: false,
ownPropertyLength: 1,
},
},
},
ownPropertiesLength: 2,

View file

@ -364,17 +364,17 @@ const previewers = {
function({ obj, hooks }, grip, rawObj) {
const {state, value, reason} = ObjectUtils.getPromiseState(obj);
const ownProperties = Object.create(null);
ownProperties["<state>"] = state;
ownProperties["<state>"] = { value: state };
let ownPropertiesLength = 1;
// Only expose <value> or <reason> in top-level promises, to avoid recursion.
// <state> is not problematic because it's a string.
if (hooks.getGripDepth() === 1) {
if (state == "fulfilled") {
ownProperties["<value>"] = hooks.createValueGrip(value);
ownProperties["<value>"] = { value: hooks.createValueGrip(value) };
++ownPropertiesLength;
} else if (state == "rejected") {
ownProperties["<reason>"] = hooks.createValueGrip(reason);
ownProperties["<reason>"] = { value: hooks.createValueGrip(reason) };
++ownPropertiesLength;
}
}

View file

@ -21,7 +21,7 @@ add_task(
ok(grip.preview);
equal(grip.class, "Promise");
equal(grip.preview.ownProperties["<state>"], "pending");
equal(grip.preview.ownProperties["<state>"].value, "pending");
const objClient = threadFront.pauseGrip(grip);
const { promiseState } = await objClient.getPromiseState();

View file

@ -21,9 +21,9 @@ add_task(
ok(grip.preview);
equal(grip.class, "Promise");
equal(grip.preview.ownProperties["<state>"], "fulfilled");
equal(grip.preview.ownProperties["<state>"].value, "fulfilled");
equal(
grip.preview.ownProperties["<value>"].actorID,
grip.preview.ownProperties["<value>"].value.actorID,
packet.frame.arguments[0].actorID,
"The promise's fulfilled state value in the preview should be the same " +
"value passed to the then function"

View file

@ -20,9 +20,9 @@ add_task(
const grip = environment.bindings.variables.p.value;
ok(grip.preview);
equal(grip.class, "Promise");
equal(grip.preview.ownProperties["<state>"], "rejected");
equal(grip.preview.ownProperties["<state>"].value, "rejected");
equal(
grip.preview.ownProperties["<reason>"].actorID,
grip.preview.ownProperties["<reason>"].value.actorID,
packet.frame.arguments[0].actorID,
"The promise's rejected state reason in the preview should be the same " +
"value passed to the then function"