diff --git a/devtools/shared/async-storage.js b/devtools/shared/async-storage.js index b858ed449373..65a10f3425e6 100644 --- a/devtools/shared/async-storage.js +++ b/devtools/shared/async-storage.js @@ -51,6 +51,8 @@ const DBVERSION = 1; const STORENAME = "keyvaluepairs"; var db = null; +loader.lazyRequireGetter(this, "indexedDB", "devtools/shared/indexed-db"); + function withStore(type, onsuccess, onerror) { if (db) { const transaction = db.transaction(STORENAME, type); diff --git a/devtools/shared/indexed-db.js b/devtools/shared/indexed-db.js index aba8f6833f28..a4ea57c76f5c 100644 --- a/devtools/shared/indexed-db.js +++ b/devtools/shared/indexed-db.js @@ -9,24 +9,28 @@ * a principal dedicated to DevTools. */ -const PSEUDOURI = "indexeddb://fx-devtools"; -const principaluri = Services.io.newURI(PSEUDOURI); -const principal = Services.scriptSecurityManager.createContentPrincipal( - principaluri, - {} -); +// When running in jest, we can't use Cu.Sandbox and only expose the native indexedDB object +if (globalThis.indexedDB) { + module.exports = globalThis.indexedDB; +} else { + const PSEUDOURI = "indexeddb://fx-devtools"; + const principaluri = Services.io.newURI(PSEUDOURI); + const principal = Services.scriptSecurityManager.createContentPrincipal( + principaluri, + {} + ); -/** - * Create the DevTools dedicated DB, by relying on the real indexedDB object passed as a - * parameter here. - * - * @param {IDBFactory} indexedDB - * Real indexedDB object. - * @return {Object} Wrapper object that implements IDBFactory methods, but for a devtools - * specific principal. - */ -exports.createDevToolsIndexedDB = function(indexedDB) { - return Object.freeze({ + // indexedDB is only exposed to document globals. + // We are retrieving an instance from a Sandbox, which has to be loaded + // from the system principal in order to avoid having wrappers around + // all indexed DB objects. + const systemPrincipal = Services.scriptSecurityManager.getSystemPrincipal(); + const sandbox = Cu.Sandbox(systemPrincipal, { + wantGlobalProperties: ["indexedDB"], + }); + const { indexedDB } = sandbox; + + module.exports = Object.freeze({ /** * Only the standard version of indexedDB.open is supported. */ @@ -37,12 +41,14 @@ exports.createDevToolsIndexedDB = function(indexedDB) { } return indexedDB.openForPrincipal(principal, name, options); }, + /** * Only the standard version of indexedDB.deleteDatabase is supported. */ deleteDatabase(name) { return indexedDB.deleteForPrincipal(principal, name); }, + cmp: indexedDB.cmp.bind(indexedDB), }); -}; +} diff --git a/devtools/shared/loader/base-loader.js b/devtools/shared/loader/base-loader.js index 62a6d697611c..3b4adb8b58ee 100644 --- a/devtools/shared/loader/base-loader.js +++ b/devtools/shared/loader/base-loader.js @@ -132,7 +132,6 @@ function Sandbox(options) { "FileReader", "FormData", "Headers", - "indexedDB", "InspectorUtils", "Node", "TextDecoder", diff --git a/devtools/shared/loader/builtin-modules.js b/devtools/shared/loader/builtin-modules.js index 4b5d53ffe52f..4c862cbe729f 100644 --- a/devtools/shared/loader/builtin-modules.js +++ b/devtools/shared/loader/builtin-modules.js @@ -271,8 +271,3 @@ lazyGlobal("setInterval", () => { lazyGlobal("WebSocket", () => { return Services.appShell.hiddenDOMWindow.WebSocket; }); -lazyGlobal("indexedDB", () => { - return require("devtools/shared/indexed-db").createDevToolsIndexedDB( - indexedDB - ); -});