browser_sanitize-offlineData.js (7645B)
1 /* Any copyright is dedicated to the Public Domain. 2 * http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 // Bug 380852 - Delete permission manager entries in Clear Recent History 5 6 const { SiteDataTestUtils } = ChromeUtils.importESModule( 7 "resource://testing-common/SiteDataTestUtils.sys.mjs" 8 ); 9 const { PromiseTestUtils } = ChromeUtils.importESModule( 10 "resource://testing-common/PromiseTestUtils.sys.mjs" 11 ); 12 13 XPCOMUtils.defineLazyServiceGetter( 14 this, 15 "sas", 16 "@mozilla.org/storage/activity-service;1", 17 Ci.nsIStorageActivityService 18 ); 19 XPCOMUtils.defineLazyServiceGetter( 20 this, 21 "swm", 22 "@mozilla.org/serviceworkers/manager;1", 23 Ci.nsIServiceWorkerManager 24 ); 25 26 const oneHour = 3600000000; 27 const fiveHours = oneHour * 5; 28 29 function waitForUnregister(host) { 30 return new Promise(resolve => { 31 let listener = { 32 onUnregister: registration => { 33 if (registration.principal.host != host) { 34 return; 35 } 36 swm.removeListener(listener); 37 resolve(registration); 38 }, 39 }; 40 swm.addListener(listener); 41 }); 42 } 43 44 function moveOriginInTime(principals, endDate, host) { 45 for (let i = 0; i < principals.length; ++i) { 46 let principal = principals.queryElementAt(i, Ci.nsIPrincipal); 47 if (principal.host == host) { 48 sas.moveOriginInTime(principal, endDate - fiveHours); 49 return true; 50 } 51 } 52 return false; 53 } 54 55 // We will be removing the ["cookies","offlineApps"] option once we remove the 56 // old clear history dialog in Bug 1856418 - Remove all old clear data dialog boxes 57 let prefs = [["cookiesAndStorage"], ["cookies", "offlineApps"]]; 58 59 for (let itemsToClear of prefs) { 60 add_task(async function testWithRange() { 61 // We have intermittent occurrences of NS_ERROR_ABORT being 62 // thrown at closing database instances when using Santizer.sanitize(). 63 // This does not seem to impact cleanup, since our tests run fine anyway. 64 PromiseTestUtils.allowMatchingRejectionsGlobally(/NS_ERROR_ABORT/); 65 66 await SpecialPowers.pushPrefEnv({ 67 set: [ 68 ["dom.serviceWorkers.enabled", true], 69 ["dom.serviceWorkers.exemptFromPerDomainMax", true], 70 ["dom.serviceWorkers.testing.enabled", true], 71 ], 72 }); 73 74 // The service may have picked up activity from prior tests in this run. 75 // Clear it. 76 sas.testOnlyReset(); 77 78 let endDate = Date.now() * 1000; 79 let principals = sas.getActiveOrigins(endDate - oneHour, endDate); 80 is(principals.length, 0, "starting from clear activity state"); 81 82 info("sanitize: " + itemsToClear.join(", ")); 83 await Sanitizer.sanitize(itemsToClear, { ignoreTimespan: false }); 84 85 await createDummyDataForHost("example.org"); 86 await createDummyDataForHost("example.com"); 87 88 endDate = Date.now() * 1000; 89 principals = sas.getActiveOrigins(endDate - oneHour, endDate); 90 ok(!!principals, "We have an active origin."); 91 Assert.greaterOrEqual(principals.length, 2, "We have an active origin."); 92 93 let found = 0; 94 for (let i = 0; i < principals.length; ++i) { 95 let principal = principals.queryElementAt(i, Ci.nsIPrincipal); 96 if (principal.host == "example.org" || principal.host == "example.com") { 97 found++; 98 } 99 } 100 101 is(found, 2, "Our origins are active."); 102 103 ok( 104 await SiteDataTestUtils.hasIndexedDB("https://example.org"), 105 "We have indexedDB data for example.org" 106 ); 107 ok( 108 SiteDataTestUtils.hasServiceWorkers("https://example.org"), 109 "We have serviceWorker data for example.org" 110 ); 111 112 ok( 113 await SiteDataTestUtils.hasIndexedDB("https://example.com"), 114 "We have indexedDB data for example.com" 115 ); 116 ok( 117 SiteDataTestUtils.hasServiceWorkers("https://example.com"), 118 "We have serviceWorker data for example.com" 119 ); 120 121 // Let's move example.com in the past. 122 ok( 123 moveOriginInTime(principals, endDate, "example.com"), 124 "Operation completed!" 125 ); 126 127 let p = waitForUnregister("example.org"); 128 129 // Clear it 130 info("sanitize: " + itemsToClear.join(", ")); 131 await Sanitizer.sanitize(itemsToClear, { ignoreTimespan: false }); 132 await p; 133 134 ok( 135 !(await SiteDataTestUtils.hasIndexedDB("https://example.org")), 136 "We don't have indexedDB data for example.org" 137 ); 138 ok( 139 !SiteDataTestUtils.hasServiceWorkers("https://example.org"), 140 "We don't have serviceWorker data for example.org" 141 ); 142 143 ok( 144 await SiteDataTestUtils.hasIndexedDB("https://example.com"), 145 "We still have indexedDB data for example.com" 146 ); 147 ok( 148 SiteDataTestUtils.hasServiceWorkers("https://example.com"), 149 "We still have serviceWorker data for example.com" 150 ); 151 152 // We have to move example.com in the past because how we check IDB triggers 153 // a storage activity. 154 ok( 155 moveOriginInTime(principals, endDate, "example.com"), 156 "Operation completed!" 157 ); 158 159 // Let's call the clean up again. 160 info("sanitize again to ensure clearing doesn't expand the activity scope"); 161 await Sanitizer.sanitize(itemsToClear, { ignoreTimespan: false }); 162 163 ok( 164 await SiteDataTestUtils.hasIndexedDB("https://example.com"), 165 "We still have indexedDB data for example.com" 166 ); 167 ok( 168 SiteDataTestUtils.hasServiceWorkers("https://example.com"), 169 "We still have serviceWorker data for example.com" 170 ); 171 172 ok( 173 !(await SiteDataTestUtils.hasIndexedDB("https://example.org")), 174 "We don't have indexedDB data for example.org" 175 ); 176 ok( 177 !SiteDataTestUtils.hasServiceWorkers("https://example.org"), 178 "We don't have serviceWorker data for example.org" 179 ); 180 181 sas.testOnlyReset(); 182 183 // Clean up. 184 await SiteDataTestUtils.clear(); 185 }); 186 187 add_task(async function testExceptionsOnShutdown() { 188 await createDummyDataForHost("example.org"); 189 await createDummyDataForHost("example.com"); 190 191 // Set exception for example.org to not get cleaned 192 let originALLOW = "https://example.org"; 193 PermissionTestUtils.add( 194 originALLOW, 195 "cookie", 196 Ci.nsICookiePermission.ACCESS_ALLOW 197 ); 198 199 ok( 200 await SiteDataTestUtils.hasIndexedDB("https://example.org"), 201 "We have indexedDB data for example.org" 202 ); 203 ok( 204 SiteDataTestUtils.hasServiceWorkers("https://example.org"), 205 "We have serviceWorker data for example.org" 206 ); 207 208 ok( 209 await SiteDataTestUtils.hasIndexedDB("https://example.com"), 210 "We have indexedDB data for example.com" 211 ); 212 ok( 213 SiteDataTestUtils.hasServiceWorkers("https://example.com"), 214 "We have serviceWorker data for example.com" 215 ); 216 217 await SpecialPowers.pushPrefEnv({ 218 set: [ 219 ["browser.sanitizer.loglevel", "All"], 220 ["privacy.clearOnShutdown.offlineApps", true], 221 ["privacy.sanitize.sanitizeOnShutdown", true], 222 ], 223 }); 224 // Clear it 225 await Sanitizer.runSanitizeOnShutdown(); 226 // Data for example.org should not have been cleared 227 ok( 228 await SiteDataTestUtils.hasIndexedDB("https://example.org"), 229 "We still have indexedDB data for example.org" 230 ); 231 ok( 232 SiteDataTestUtils.hasServiceWorkers("https://example.org"), 233 "We still have serviceWorker data for example.org" 234 ); 235 // Data for example.com should be cleared 236 ok( 237 !(await SiteDataTestUtils.hasIndexedDB("https://example.com")), 238 "We don't have indexedDB data for example.com" 239 ); 240 ok( 241 !SiteDataTestUtils.hasServiceWorkers("https://example.com"), 242 "We don't have serviceWorker data for example.com" 243 ); 244 245 // Clean up 246 await SiteDataTestUtils.clear(); 247 Services.perms.removeAll(); 248 }); 249 }