test_originInit.js (6943B)
1 /** 2 * Any copyright is dedicated to the Public Domain. 3 * http://creativecommons.org/publicdomain/zero/1.0/ 4 */ 5 6 async function testSteps() { 7 // ToDo: Replace storage and default with a getter function once we expose the 8 // filenames of them to a IDL file. 9 const basePath = `${storageDirName}/${defaultPersistenceDirName}/`; 10 const principal = getPrincipal("https://example.com"); 11 const originDirName = "https+++example.com"; 12 13 // ToDo: Replace caches.sqlite with a getter function once we expose the 14 // filename of it to a IDL file. 15 const cachesDatabase = getRelativeFile( 16 `${basePath}/${originDirName}/${cacheClientDirName()}/caches.sqlite` 17 ); 18 // ToDo: Replace .padding with a getter function once we expose the filename 19 // of it to a IDL file. 20 const paddingFile = getRelativeFile( 21 `${basePath}/${originDirName}/${cacheClientDirName()}/.padding` 22 ); 23 // ToDo: Replace .padding-tmp with a getter function once we expose the 24 // filename of it to a IDL file. 25 const paddingTempFile = getRelativeFile( 26 `${basePath}/${originDirName}/${cacheClientDirName()}/.padding-tmp` 27 ); 28 // ToDo: Replace morgue with a getter function once we expose the 29 // filename of it to a IDL file. 30 const morgueDir = getRelativeFile( 31 `${basePath}/${originDirName}/${cacheClientDirName()}/morgue` 32 ); 33 34 const persistentCacheDir = getRelativeFile( 35 `${storageDirName}/${persistentPersistenceDirName}/${originDirName}/` + 36 `${cacheClientDirName()}` 37 ); 38 39 async function createNormalCacheOrigin() { 40 async function sandboxScript() { 41 const cache = await caches.open("myCache"); 42 const request = new Request("https://example.com/index.html"); 43 const response = new Response("hello world"); 44 await cache.put(request, response); 45 } 46 47 const sandbox = new Cu.Sandbox(principal, { 48 wantGlobalProperties: ["caches", "fetch"], 49 }); 50 51 const promise = new Promise(function (resolve, reject) { 52 sandbox.resolve = resolve; 53 sandbox.reject = reject; 54 }); 55 56 Cu.evalInSandbox( 57 sandboxScript.toSource() + " sandboxScript().then(resolve, reject);", 58 sandbox 59 ); 60 await promise; 61 62 let request = reset(); 63 await requestFinished(request); 64 } 65 66 async function createPersistentTestOrigin() { 67 let database = getSimpleDatabase(principal, "persistent"); 68 69 let request = database.open("data"); 70 await requestFinished(request); 71 72 request = reset(); 73 await requestFinished(request); 74 } 75 76 function removeFile(file) { 77 file.remove(false); 78 } 79 80 function removeDir(dir) { 81 dir.remove(true); 82 } 83 84 function createEmptyFile(file) { 85 file.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0o644); 86 } 87 88 function createEmptyDirectory(dir) { 89 dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o0755); 90 } 91 92 async function initTestOrigin() { 93 let request = initStorage(); 94 await requestFinished(request); 95 96 request = initTemporaryStorage(); 97 await requestFinished(request); 98 99 request = initTemporaryOrigin(principal); 100 await requestFinished(request); 101 } 102 103 async function initPersistentTestOrigin() { 104 let request = initStorage(); 105 await requestFinished(request); 106 107 request = initPersistentOrigin(principal); 108 await requestFinished(request); 109 } 110 111 function checkFiles( 112 expectCachesDatabase, 113 expectPaddingFile, 114 expectTempPaddingFile, 115 expectMorgueDir 116 ) { 117 let exists = cachesDatabase.exists(); 118 if (expectCachesDatabase) { 119 ok(exists, "caches.sqlite does exist"); 120 } else { 121 ok(!exists, "caches.sqlite doesn't exist"); 122 } 123 124 exists = paddingFile.exists(); 125 if (expectPaddingFile) { 126 ok(exists, ".padding does exist"); 127 } else { 128 ok(!exists, ".padding doesn't exist"); 129 } 130 131 exists = paddingTempFile.exists(); 132 if (expectTempPaddingFile) { 133 ok(exists, ".padding-tmp does exist"); 134 } else { 135 ok(!exists, ".padding-tmp doesn't exist"); 136 } 137 138 exists = morgueDir.exists(); 139 if (expectMorgueDir) { 140 ok(exists, "morgue does exist"); 141 } else { 142 ok(!exists, "moruge doesn't exist"); 143 } 144 } 145 146 async function clearTestOrigin() { 147 let request = clearOrigin(principal, defaultPersistence); 148 await requestFinished(request); 149 } 150 151 async function clearPersistentTestOrigin() { 152 let request = clearOrigin(principal, persistentPersistence); 153 await requestFinished(request); 154 } 155 156 async function testOriginInit( 157 createCachesDatabase, 158 createPaddingFile, 159 createTempPaddingFile, 160 createMorgueDir 161 ) { 162 info( 163 `Testing initialization of cache directory when caches.sqlite ` + 164 `${createCachesDatabase ? "exists" : "doesn't exist"}, .padding ` + 165 `${createPaddingFile ? "exists" : "doesn't exist"}, .padding-tmp ` + 166 `${createTempPaddingFile ? "exists" : "doesn't exist"}, morgue ` + 167 `${createMorgueDir ? "exists" : "doesn't exist"}` 168 ); 169 170 await createNormalCacheOrigin(); 171 172 checkFiles(true, true, false, true); 173 174 if (!createCachesDatabase) { 175 removeFile(cachesDatabase); 176 } 177 178 if (!createPaddingFile) { 179 removeFile(paddingFile); 180 } 181 182 if (createTempPaddingFile) { 183 createEmptyFile(paddingTempFile); 184 } 185 186 if (!createMorgueDir) { 187 removeDir(morgueDir); 188 } 189 190 await initTestOrigin(); 191 192 checkFiles( 193 createCachesDatabase, 194 // After the origin is initialized, ".padding" should only exist when 195 // "caches.sqlite" exists. 196 createCachesDatabase, 197 // After the origin is initialized, ".padding-tmp" should have always been 198 // removed. 199 false, 200 createCachesDatabase && createMorgueDir 201 ); 202 203 await clearTestOrigin(); 204 } 205 206 // Test all possible combinations. 207 for (let createCachesDatabase of [false, true]) { 208 for (let createPaddingFile of [false, true]) { 209 for (let createTempPaddingFile of [false, true]) { 210 for (let createMorgueDir of [false, true]) { 211 await testOriginInit( 212 createCachesDatabase, 213 createPaddingFile, 214 createTempPaddingFile, 215 createMorgueDir 216 ); 217 } 218 } 219 } 220 } 221 222 // Verify that InitializeOrigin doesn't fail when a 223 // storage/permanent/${origin}/cache exists. 224 async function testPermanentCacheDir() { 225 info( 226 "Testing initialization of cache directory placed in permanent origin " + 227 "directory" 228 ); 229 230 await createPersistentTestOrigin(); 231 232 createEmptyDirectory(persistentCacheDir); 233 234 try { 235 await initPersistentTestOrigin(); 236 237 ok(true, "Should not have thrown"); 238 } catch (ex) { 239 ok(false, "Should not have thrown"); 240 } 241 242 let exists = persistentCacheDir.exists(); 243 ok(exists, "cache directory in permanent origin directory does exist"); 244 245 await clearPersistentTestOrigin(); 246 } 247 248 await testPermanentCacheDir(); 249 } 250 251 add_task( 252 { 253 pref_set: [["dom.quotaManager.loadQuotaFromCache", false]], 254 }, 255 testSteps 256 );