Bug 1967673 - [devtools] Don't omit valid safe getter undefined values in _findSafeGetterValues. r=devtools-reviewers,jdescottes DONTBUILD
Differential Revision: https://phabricator.services.mozilla.com/D250613
This commit is contained in:
committed by
ctuns@mozilla.com
parent
2c393cf579
commit
294861d1cd
@@ -650,6 +650,9 @@ skip-if = [
|
|||||||
"os == 'linux' && os_version == '24.04' && processor == 'x86_64' && display == 'x11' && debug && http3", # Bug 1829298
|
"os == 'linux' && os_version == '24.04' && processor == 'x86_64' && display == 'x11' && debug && http3", # Bug 1829298
|
||||||
]
|
]
|
||||||
|
|
||||||
|
["browser_webconsole_previewers_https.js"]
|
||||||
|
fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
|
||||||
|
|
||||||
["browser_webconsole_previewers.js"]
|
["browser_webconsole_previewers.js"]
|
||||||
support-files = ["browser_webconsole_previewers.snapshot.mjs"]
|
support-files = ["browser_webconsole_previewers.snapshot.mjs"]
|
||||||
https_first_disabled = true # JS HttpServer doesn't support https
|
https_first_disabled = true # JS HttpServer doesn't support https
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Those cases should be added into AllJavascriptTypes.mjs (so they can be consumed in
|
||||||
|
// browser_webconsole_previewers.js) when Bug 1967917 is resolved (so we can have a secure context)
|
||||||
|
|
||||||
|
add_task(async function () {
|
||||||
|
const hud = await openNewTabAndConsole(URL_ROOT_COM_SSL + "test-blank.html");
|
||||||
|
|
||||||
|
SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
|
||||||
|
const openReq = content.indexedDB.open("idb-bug-demo", 1);
|
||||||
|
openReq.onupgradeneeded = e => {
|
||||||
|
e.target.result.createObjectStore("demo", {
|
||||||
|
keyPath: "id",
|
||||||
|
});
|
||||||
|
};
|
||||||
|
openReq.onsuccess = e => {
|
||||||
|
const db = e.target.result;
|
||||||
|
const store = db.transaction(["demo"], "readonly").objectStore("demo");
|
||||||
|
|
||||||
|
const idbRequest = store.get("unknown");
|
||||||
|
idbRequest.onsuccess = () => {
|
||||||
|
content.console.log(idbRequest);
|
||||||
|
db.close();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const message = await waitForMessageByType(hud, "IDBRequest", ".console-api");
|
||||||
|
is(
|
||||||
|
message.node.querySelector(".message-body").innerText.trim(),
|
||||||
|
'IDBRequest { result: undefined, error: null, source: IDBObjectStore, transaction: IDBTransaction, readyState: "done", onsuccess: Restricted, onerror: null }',
|
||||||
|
"Got expected IDBRequest object, with undefined result property"
|
||||||
|
);
|
||||||
|
|
||||||
|
const oi = message.node.querySelector(".tree");
|
||||||
|
// Expand the root node
|
||||||
|
await expandObjectInspectorNode(oi.querySelector(".tree-node"));
|
||||||
|
const resultPropertyTreeItemEl = Array.from(
|
||||||
|
oi.querySelectorAll(".object-node")
|
||||||
|
).find(el => el.querySelector(".object-label")?.innerText === "result");
|
||||||
|
is(
|
||||||
|
resultPropertyTreeItemEl.innerText,
|
||||||
|
"result: undefined",
|
||||||
|
"Got expected result property in the object inspector for the IDBRequest"
|
||||||
|
);
|
||||||
|
|
||||||
|
// This can't be placed in a registerCleanupFunction because it throws (The operation is insecure)
|
||||||
|
await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function () {
|
||||||
|
const { promise, resolve } = content.Promise.withResolvers();
|
||||||
|
content.indexedDB.deleteDatabase("idb-bug-demo").onsuccess = resolve;
|
||||||
|
await promise;
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -478,7 +478,7 @@ class ObjectActor extends Actor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const getterValue = this._evaluateGetter(desc.get);
|
const getterValue = this._evaluateGetter(desc.get);
|
||||||
if (getterValue === undefined) {
|
if (getterValue === this._evaluateGetterNoResult) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -516,6 +516,8 @@ class ObjectActor extends Actor {
|
|||||||
return safeGetterValues;
|
return safeGetterValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_evaluateGetterNoResult = Symbol();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Evaluate the getter function |desc.get|.
|
* Evaluate the getter function |desc.get|.
|
||||||
* @param {Object} getter
|
* @param {Object} getter
|
||||||
@@ -523,10 +525,10 @@ class ObjectActor extends Actor {
|
|||||||
_evaluateGetter(getter) {
|
_evaluateGetter(getter) {
|
||||||
const result = getter.call(this.obj);
|
const result = getter.call(this.obj);
|
||||||
if (!result || "throw" in result) {
|
if (!result || "throw" in result) {
|
||||||
return undefined;
|
return this._evaluateGetterNoResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
let getterValue = undefined;
|
let getterValue = this._evaluateGetterNoResult;
|
||||||
if ("return" in result) {
|
if ("return" in result) {
|
||||||
getterValue = result.return;
|
getterValue = result.return;
|
||||||
} else if ("yield" in result) {
|
} else if ("yield" in result) {
|
||||||
|
|||||||
@@ -228,7 +228,7 @@ const DOMAPIs = [
|
|||||||
expression: `myPolicy.createHTML("hello")`,
|
expression: `myPolicy.createHTML("hello")`,
|
||||||
prefs: [["dom.security.trusted_types.enabled", true]],
|
prefs: [["dom.security.trusted_types.enabled", true]],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
context: CONTEXTS.PAGE,
|
context: CONTEXTS.PAGE,
|
||||||
expression: `myPolicy.createScript("const hello = 'world'")`
|
expression: `myPolicy.createScript("const hello = 'world'")`
|
||||||
},
|
},
|
||||||
@@ -247,7 +247,7 @@ const DOMAPIs = [
|
|||||||
formData;
|
formData;
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
/* midi API requires https
|
/* midi API requires https (See Bug 1967917)
|
||||||
{
|
{
|
||||||
context: CONTEXTS.PAGE,
|
context: CONTEXTS.PAGE,
|
||||||
expression: `
|
expression: `
|
||||||
|
|||||||
Reference in New Issue
Block a user