/**
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
// TODO: Replace with a module for blob/file utils once available
loadScript(
"dom/quota/test/common/file.js");
const { IndexedDBUtils } = ChromeUtils.importESModule(
"resource://testing-common/dom/indexedDB/test/modules/IndexedDBUtils.sys.mjs"
);
const { LocalStorageUtils } = ChromeUtils.importESModule(
"resource://testing-common/dom/localstorage/test/modules/LocalStorageUtils.sys.mjs"
);
const { PrincipalUtils } = ChromeUtils.importESModule(
"resource://testing-common/dom/quota/test/modules/PrincipalUtils.sys.mjs"
);
const { QuotaUtils } = ChromeUtils.importESModule(
"resource://testing-common/dom/quota/test/modules/QuotaUtils.sys.mjs"
);
const { SimpleDBUtils } = ChromeUtils.importESModule(
"resource://testing-common/dom/simpledb/test/modules/SimpleDBUtils.sys.mjs"
);
async
function makeSecondaryCacheValidity() {
const principal = PrincipalUtils.createPrincipal(
"http://example42.com");
// IndexedDB
{
const request = indexedDB.openForPrincipal(principal,
"myIndexedDB");
// TODO: Use IndexedDBUtils once they support waiting for upgrade needed
await openDBRequestUpgradeNeeded(request);
const database = request.result;
const objectStore = database.createObjectStore(
"Blobs", {});
objectStore.add(getNullBlob(
200),
42);
await IndexedDBUtils.requestFinished(request);
database.close();
}
// Cache API
{
async
function sandboxScript() {
const cache = await caches.open(
"myCache");
const request =
new Request(
"http://example.com/index.html");
const response =
new Response(
"hello world");
await cache.put(request, response);
}
const sandbox =
new Cu.Sandbox(principal, {
wantGlobalProperties: [
"caches",
"fetch"],
});
const promise =
new Promise(
function (resolve, reject) {
sandbox.resolve = resolve;
sandbox.reject = reject;
});
Cu.evalInSandbox(
sandboxScript.toSource() +
" sandboxScript().then(resolve, reject);",
sandbox
);
await promise;
}
// SimpleDB
{
const connection = SimpleDBUtils.createConnection(principal);
const openRequest = connection.open(
"mySimpleDB");
await SimpleDBUtils.requestFinished(openRequest);
const writeRequest = connection.write(getBuffer(
100));
await SimpleDBUtils.requestFinished(writeRequest);
const closeRequest = connection.close();
await SimpleDBUtils.requestFinished(closeRequest);
}
// LocalStorage
{
const storage = LocalStorageUtils.createStorage(principal);
storage.setItem(
"foo",
"bar");
storage.close();
}
// OPFS
{
async
function sandboxScript() {
const root = await storage.getDirectory();
{
const file = await root.getFileHandle(
"data.bin", { create:
true });
const writable = await file.createWritable();
await writable.write(
new Uint8Array(
512));
await writable.close();
}
{
const directory = await root.getDirectoryHandle(
"dir", {
create:
true,
});
const file = await directory.getFileHandle(
"data.bin", {
create:
true,
});
const writable = await file.createWritable();
await writable.write(
new Uint8Array(
128));
await writable.close();
}
}
const sandbox =
new Cu.Sandbox(principal, {
wantGlobalProperties: [
"storage"],
forceSecureContext:
true,
});
const promise =
new Promise(
function (resolve, reject) {
sandbox.resolve = resolve;
sandbox.reject = reject;
});
Cu.evalInSandbox(
sandboxScript.toSource() +
" sandboxScript().then(resolve, reject);",
sandbox
);
await promise;
}
// Force update of the metadata file, so it contains up to date cached usage
// information.
info(
"Shutting down storage");
{
const request = Services.qms.reset();
await QuotaUtils.requestFinished(request);
}
info(
"Initializing storage");
{
const request = Services.qms.init();
await QuotaUtils.requestFinished(request);
}
info(
"Initializing temporary storage");
{
const request = Services.qms.initTemporaryStorage();
await QuotaUtils.requestFinished(request);
}
}
async
function testSteps() {
add_task(
{
pref_set: [
[
"dom.quotaManager.loadQuotaFromCache",
false],
[
"dom.storage.testing",
true],
[
"dom.storage.client_validation",
false],
],
},
makeSecondaryCacheValidity
);
}