/**
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
/* exported testSteps */
async
function testSteps() {
const factory = (
function () {
if (
typeof Cc ===
"undefined") {
return indexedDB;
}
// In xpcshell tests (where `Cc` is defined), we avoid using the system
// principal because background services may create indexedDB databases
// concurrently under that principal. To prevent interference and ensure
// test isolation, we use a sandbox with a content principal instead.
const { PrincipalUtils } = ChromeUtils.importESModule(
"resource://testing-common/dom/quota/test/modules/PrincipalUtils.sys.mjs"
);
const principal = PrincipalUtils.createPrincipal(
"https://example.com");
const sandbox =
new Cu.Sandbox(principal, {
wantGlobalProperties: [
"indexedDB"],
});
return Cu.evalInSandbox(
"indexedDB", sandbox);
})();
const openInfos = [
{ name:
"foo-a", version:
1 },
{ name:
"foo-b", version:
1 },
];
info(
"Creating databases");
for (let index =
0; index < openInfos.length; index++) {
const openInfo = openInfos[index];
const request = factory.open(openInfo.name, openInfo.version);
await expectingUpgrade(request);
const event = await expectingSuccess(request);
const database = event.target.result;
database.close();
}
info(
"Getting databases");
const databasesPromise = factory.databases();
info(
"Opening databases");
const openPromises = [];
for (let index =
0; index < openInfos.length; index++) {
const openInfo = openInfos[index];
const request = factory.open(openInfo.name, openInfo.version);
const promise = expectingSuccess(request);
openPromises.push(promise);
}
info(
"Waiting for databases operation to complete");
const databaseInfos = await databasesPromise;
info(
"Verifying databases");
is(
databaseInfos.length,
openInfos.length,
"The result of databases() should contain one result per database"
);
for (let index =
0; index < openInfos.length; index++) {
const openInfo = openInfos[index];
ok(
databaseInfos.some(
function (element) {
return (
element.name === openInfo.name && element.version === openInfo.version
);
}),
"The result of databases() should be a sequence of the correct names " +
"and versions of all databases for the origin"
);
}
info(
"Waiting for open operations to complete");
await Promise.all(openPromises);
}