forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			208 lines
		
	
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			208 lines
		
	
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * Any copyright is dedicated to the Public Domain.
 | |
|  * http://creativecommons.org/publicdomain/zero/1.0/
 | |
|  *
 | |
|  * 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();
 | |
| 
 | |
|   // Expose Cache and Fetch symbols on the global
 | |
|   Cu.importGlobalProperties(["caches", "fetch"]);
 | |
| 
 | |
|   registerCleanupFunction(resetTesting);
 | |
| });
 | |
| 
 | |
| function enableTesting() {
 | |
|   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");
 | |
| }
 | |
| 
 | |
| function initStorage() {
 | |
|   return Services.qms.init();
 | |
| }
 | |
| 
 | |
| function initTemporaryStorage() {
 | |
|   return Services.qms.initTemporaryStorage();
 | |
| }
 | |
| 
 | |
| function initPersistentOrigin(principal) {
 | |
|   return Services.qms.initializePersistentOrigin(principal);
 | |
| }
 | |
| 
 | |
| function initTemporaryOrigin(principal) {
 | |
|   return Services.qms.initializeTemporaryOrigin("default", principal);
 | |
| }
 | |
| 
 | |
| 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;
 | |
| }
 | 
