Source code

Revision control

Copy as Markdown

Other Tools

/**
* Any copyright is dedicated to the Public Domain.
*
* All images in schema_15_profile.zip are from https://github.com/mdn/sw-test/
* and are CC licensed by https://www.flickr.com/photos/legofenris/.
*/
// testSteps is expected to be defined by the file including this file.
/* global testSteps */
const NS_APP_USER_PROFILE_50_DIR = "ProfD";
const osWindowsName = "WINNT";
const pathDelimiter = "/";
const persistentPersistence = "persistent";
const defaultPersistence = "default";
const storageDirName = "storage";
const persistentPersistenceDirName = "permanent";
const defaultPersistenceDirName = "default";
function cacheClientDirName() {
return "cache";
}
// services required be initialized in order to run CacheStorage
var ss = Cc["@mozilla.org/storage/service;1"].createInstance(
Ci.mozIStorageService
);
var sts = Cc["@mozilla.org/network/stream-transport-service;1"].getService(
Ci.nsIStreamTransportService
);
var hash = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
class RequestError extends Error {
constructor(resultCode, resultName) {
super(`Request failed (code: ${resultCode}, name: ${resultName})`);
this.name = "RequestError";
this.resultCode = resultCode;
this.resultName = resultName;
}
}
add_setup(function () {
do_get_profile();
enableTesting();
Cu.importGlobalProperties(["caches"]);
registerCleanupFunction(resetTesting);
});
function enableTesting() {
Services.prefs.setBoolPref("dom.caches.testing.enabled", true);
Services.prefs.setBoolPref("dom.simpleDB.enabled", true);
Services.prefs.setBoolPref("dom.quotaManager.testing", true);
}
function resetTesting() {
Services.prefs.clearUserPref("dom.quotaManager.testing");
Services.prefs.clearUserPref("dom.simpleDB.enabled");
Services.prefs.clearUserPref("dom.caches.testing.enabled");
}
function initStorage() {
return Services.qms.init();
}
function initTemporaryStorage() {
return Services.qms.initTemporaryStorage();
}
function initPersistentOrigin(principal) {
return Services.qms.initializePersistentOrigin(principal);
}
function initTemporaryOrigin(principal, createIfNonExistent = true) {
return Services.qms.initializeTemporaryOrigin(
"default",
principal,
createIfNonExistent
);
}
function clearOrigin(principal, persistence) {
let request = Services.qms.clearStoragesForPrincipal(principal, persistence);
return request;
}
function reset() {
return Services.qms.reset();
}
async function requestFinished(request) {
await new Promise(function (resolve) {
request.callback = function () {
resolve();
};
});
if (request.resultCode !== Cr.NS_OK) {
throw new RequestError(request.resultCode, request.resultName);
}
return request.result;
}
// Extract a zip file into the profile
function create_test_profile(zipFileName) {
var directoryService = Services.dirsvc;
var profileDir = directoryService.get(NS_APP_USER_PROFILE_50_DIR, Ci.nsIFile);
var currentDir = directoryService.get("CurWorkD", Ci.nsIFile);
var packageFile = currentDir.clone();
packageFile.append(zipFileName);
var zipReader = Cc["@mozilla.org/libjar/zip-reader;1"].createInstance(
Ci.nsIZipReader
);
zipReader.open(packageFile);
var entryNames = Array.from(zipReader.findEntries(null));
entryNames.sort();
for (var entryName of entryNames) {
var zipentry = zipReader.getEntry(entryName);
var file = profileDir.clone();
entryName.split(pathDelimiter).forEach(function (part) {
file.append(part);
});
if (zipentry.isDirectory) {
file.create(Ci.nsIFile.DIRECTORY_TYPE, parseInt("0755", 8));
} else {
var istream = zipReader.getInputStream(entryName);
var ostream = Cc[
"@mozilla.org/network/file-output-stream;1"
].createInstance(Ci.nsIFileOutputStream);
ostream.init(file, -1, parseInt("0644", 8), 0);
var bostream = Cc[
"@mozilla.org/network/buffered-output-stream;1"
].createInstance(Ci.nsIBufferedOutputStream);
bostream.init(ostream, 32 * 1024);
bostream.writeFrom(istream, istream.available());
istream.close();
bostream.close();
}
}
zipReader.close();
}
function getCacheDir() {
return getRelativeFile(
`${storageDirName}/${defaultPersistenceDirName}/chrome/${cacheClientDirName()}`
);
}
function getPrincipal(url, attrs) {
let uri = Services.io.newURI(url);
if (!attrs) {
attrs = {};
}
return Services.scriptSecurityManager.createContentPrincipal(uri, attrs);
}
function getDefaultPrincipal() {
return getPrincipal("http://example.com");
}
function getRelativeFile(relativePath) {
let file = Services.dirsvc
.get(NS_APP_USER_PROFILE_50_DIR, Ci.nsIFile)
.clone();
if (Services.appinfo.OS === osWindowsName) {
let winFile = file.QueryInterface(Ci.nsILocalFileWin);
winFile.useDOSDevicePathSyntax = true;
}
relativePath.split(pathDelimiter).forEach(function (component) {
if (component == "..") {
file = file.parent;
} else {
file.append(component);
}
});
return file;
}
function getSimpleDatabase(principal, persistence) {
let connection = Cc["@mozilla.org/dom/sdb-connection;1"].createInstance(
Ci.nsISDBConnection
);
if (!principal) {
principal = getDefaultPrincipal();
}
connection.init(principal, persistence);
return connection;
}