diff --git a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/reducer.js b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/reducer.js index 19f55ce0be6e..cf75ea15dd04 100644 --- a/devtools/client/debugger/packages/devtools-reps/src/object-inspector/reducer.js +++ b/devtools/client/debugger/packages/devtools-reps/src/object-inspector/reducer.js @@ -58,7 +58,7 @@ function reducer( getterValue: data.result && data.result.value && - (data.result.value.return || data.result.value.throw), + (data.result.value.throw || data.result.value.return), }), }); } diff --git a/devtools/client/shared/components/reps/reps.js b/devtools/client/shared/components/reps/reps.js index 75d3a6295b21..112a87a31318 100644 --- a/devtools/client/shared/components/reps/reps.js +++ b/devtools/client/shared/components/reps/reps.js @@ -2352,7 +2352,7 @@ function reducer(state = initialState(), action = {}) { return cloneState({ actors: data.actor ? new Set(state.actors || []).add(data.result.from) : state.actors, evaluations: new Map(state.evaluations).set(data.node.path, { - getterValue: data.result && data.result.value && (data.result.value.return || data.result.value.throw) + getterValue: data.result && data.result.value && (data.result.value.throw || data.result.value.return) }) }); } diff --git a/devtools/client/webconsole/test/mochitest/browser_webconsole_object_inspector_getters.js b/devtools/client/webconsole/test/mochitest/browser_webconsole_object_inspector_getters.js index 4f3243478970..f1e78a40c826 100644 --- a/devtools/client/webconsole/test/mochitest/browser_webconsole_object_inspector_getters.js +++ b/devtools/client/webconsole/test/mochitest/browser_webconsole_object_inspector_getters.js @@ -35,6 +35,18 @@ add_task(async function() { get myNullGetter() { return null; }, + get myZeroGetter() { + return 0; + }, + get myEmptyStringGetter() { + return ""; + }, + get myFalseGetter() { + return false; + }, + get myTrueGetter() { + return true; + }, get myObjectGetter() { return { foo: "bar" }; }, @@ -73,6 +85,10 @@ add_task(async function() { await testNumberGetter(oi); await testUndefinedGetter(oi); await testNullGetter(oi); + await testZeroGetter(oi); + await testEmptyStringGetter(oi); + await testFalseGetter(oi); + await testTrueGetter(oi); await testObjectGetter(oi); await testArrayGetter(oi); await testMapGetter(oi); @@ -201,6 +217,126 @@ async function testNullGetter(oi) { ); } +async function testZeroGetter(oi) { + let node = findObjectInspectorNode(oi, "myZeroGetter"); + is( + isObjectInspectorNodeExpandable(node), + false, + "The node can't be expanded" + ); + const invokeButton = getObjectInspectorInvokeGetterButton(node); + ok(invokeButton, "There is an invoke button as expected"); + + invokeButton.click(); + await waitFor( + () => + !getObjectInspectorInvokeGetterButton( + findObjectInspectorNode(oi, "myZeroGetter") + ) + ); + + node = findObjectInspectorNode(oi, "myZeroGetter"); + ok( + node.textContent.includes(`myZeroGetter: 0`), + "0 getter now has the expected text content" + ); + is( + isObjectInspectorNodeExpandable(node), + false, + "The node can't be expanded" + ); +} + +async function testEmptyStringGetter(oi) { + let node = findObjectInspectorNode(oi, "myEmptyStringGetter"); + is( + isObjectInspectorNodeExpandable(node), + false, + "The node can't be expanded" + ); + const invokeButton = getObjectInspectorInvokeGetterButton(node); + ok(invokeButton, "There is an invoke button as expected"); + + invokeButton.click(); + await waitFor( + () => + !getObjectInspectorInvokeGetterButton( + findObjectInspectorNode(oi, "myEmptyStringGetter") + ) + ); + + node = findObjectInspectorNode(oi, "myEmptyStringGetter"); + ok( + node.textContent.includes(`myEmptyStringGetter: ""`), + "empty string getter now has the expected text content" + ); + is( + isObjectInspectorNodeExpandable(node), + false, + "The node can't be expanded" + ); +} + +async function testFalseGetter(oi) { + let node = findObjectInspectorNode(oi, "myFalseGetter"); + is( + isObjectInspectorNodeExpandable(node), + false, + "The node can't be expanded" + ); + const invokeButton = getObjectInspectorInvokeGetterButton(node); + ok(invokeButton, "There is an invoke button as expected"); + + invokeButton.click(); + await waitFor( + () => + !getObjectInspectorInvokeGetterButton( + findObjectInspectorNode(oi, "myFalseGetter") + ) + ); + + node = findObjectInspectorNode(oi, "myFalseGetter"); + ok( + node.textContent.includes(`myFalseGetter: false`), + "false getter now has the expected text content" + ); + is( + isObjectInspectorNodeExpandable(node), + false, + "The node can't be expanded" + ); +} + +async function testTrueGetter(oi) { + let node = findObjectInspectorNode(oi, "myTrueGetter"); + is( + isObjectInspectorNodeExpandable(node), + false, + "The node can't be expanded" + ); + const invokeButton = getObjectInspectorInvokeGetterButton(node); + ok(invokeButton, "There is an invoke button as expected"); + + invokeButton.click(); + await waitFor( + () => + !getObjectInspectorInvokeGetterButton( + findObjectInspectorNode(oi, "myTrueGetter") + ) + ); + + node = findObjectInspectorNode(oi, "myTrueGetter"); + ok( + node.textContent.includes(`myTrueGetter: true`), + "false getter now has the expected text content" + ); + is( + isObjectInspectorNodeExpandable(node), + false, + "The node can't be expanded" + ); +} + async function testObjectGetter(oi) { let node = findObjectInspectorNode(oi, "myObjectGetter"); is(