Source code

Revision control

Copy as Markdown

Other Tools

/**
* Any copyright is dedicated to the Public Domain.
*/
// TODO: Replace with a module for blob/file utils once available
loadScript("dom/quota/test/common/file.js");
const { IndexedDBUtils } = ChromeUtils.importESModule(
);
const { LocalStorageUtils } = ChromeUtils.importESModule(
);
const { PrincipalUtils } = ChromeUtils.importESModule(
);
const { QuotaUtils } = ChromeUtils.importESModule(
);
const { SimpleDBUtils } = ChromeUtils.importESModule(
);
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
);
}