browser_siteData3.js (8983B)
1 "use strict"; 2 3 // Test not displaying sites which store 0 byte and don't have persistent storage. 4 add_task(async function test_exclusions() { 5 let hosts = await addTestData([ 6 { 7 usage: 0, 8 origin: "https://account.xyz.com", 9 persisted: true, 10 }, 11 { 12 usage: 0, 13 origin: "https://shopping.xyz.com", 14 persisted: false, 15 }, 16 { 17 usage: 1024, 18 origin: "http://cinema.bar.com", 19 persisted: true, 20 }, 21 { 22 usage: 1024, 23 origin: "http://email.bar.com", 24 persisted: false, 25 }, 26 { 27 usage: 0, 28 origin: "http://cookies.bar.com", 29 cookies: 5, 30 persisted: false, 31 }, 32 ]); 33 34 let updatePromise = promiseSiteDataManagerSitesUpdated(); 35 let doc = gBrowser.selectedBrowser.contentDocument; 36 await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true }); 37 await updatePromise; 38 await openSiteDataSettingsDialog(); 39 assertSitesListed( 40 doc, 41 hosts.filter(host => host != "shopping.xyz.com") 42 ); 43 44 await SiteDataTestUtils.clear(); 45 BrowserTestUtils.removeTab(gBrowser.selectedTab); 46 }); 47 48 // Test grouping and listing sites across scheme, port and origin attributes by base domain. 49 add_task(async function test_grouping() { 50 let quotaUsage = 7000000; 51 let testData = [ 52 { 53 usage: quotaUsage, 54 origin: "https://account.xyz.com^userContextId=1", 55 cookies: 2, 56 persisted: true, 57 }, 58 { 59 usage: quotaUsage, 60 origin: "https://account.xyz.com", 61 cookies: 1, 62 persisted: false, 63 }, 64 { 65 usage: quotaUsage, 66 origin: "https://account.xyz.com:123", 67 cookies: 1, 68 persisted: false, 69 }, 70 { 71 usage: quotaUsage, 72 origin: "http://account.xyz.com", 73 cookies: 1, 74 persisted: false, 75 }, 76 { 77 usage: quotaUsage, 78 origin: "http://search.xyz.com", 79 cookies: 3, 80 persisted: false, 81 }, 82 { 83 usage: quotaUsage, 84 origin: "http://advanced.search.xyz.com", 85 cookies: 3, 86 persisted: true, 87 }, 88 { 89 usage: quotaUsage, 90 origin: "http://xyz.com", 91 cookies: 1, 92 persisted: false, 93 }, 94 ]; 95 await addTestData(testData); 96 97 let updatedPromise = promiseSiteDataManagerSitesUpdated(); 98 await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true }); 99 await updatedPromise; 100 await openSiteDataSettingsDialog(); 101 let win = gBrowser.selectedBrowser.contentWindow; 102 let dialogFrame = win.gSubDialog._topDialog._frame; 103 let frameDoc = dialogFrame.contentDocument; 104 105 let siteItems = frameDoc.getElementsByTagName("richlistitem"); 106 is( 107 siteItems.length, 108 1, 109 "Should group sites across scheme, port and origin attributes" 110 ); 111 112 let columns = siteItems[0].querySelectorAll(".item-box > label"); 113 114 let expected = "xyz.com"; 115 is(columns[0].value, expected, "Should group and list sites by host"); 116 117 let cookieCount = testData.reduce((count, { cookies }) => count + cookies, 0); 118 is( 119 columns[1].value, 120 cookieCount.toString(), 121 "Should group cookies across scheme, port and origin attributes" 122 ); 123 124 let [value, unit] = DownloadUtils.convertByteUnits(quotaUsage * 4); 125 let l10nAttributes = frameDoc.l10n.getAttributes(columns[2]); 126 is( 127 l10nAttributes.id, 128 "site-storage-persistent", 129 "Should show the site as persistent if one origin is persistent." 130 ); 131 // The shown quota can be slightly larger than the raw data we put in (though it should 132 // never be smaller), but that doesn't really matter to us since we only want to test that 133 // the site data dialog accumulates this into a single column. 134 Assert.greaterOrEqual( 135 parseFloat(l10nAttributes.args.value), 136 parseFloat(value), 137 "Should show the correct accumulated quota size." 138 ); 139 is( 140 l10nAttributes.args.unit, 141 unit, 142 "Should show the correct quota size unit." 143 ); 144 145 await SiteDataTestUtils.clear(); 146 BrowserTestUtils.removeTab(gBrowser.selectedTab); 147 }); 148 149 // Test sorting 150 add_task(async function test_sorting() { 151 let testData = [ 152 { 153 usage: 1024, 154 origin: "https://account.xyz.com", 155 cookies: 6, 156 persisted: true, 157 }, 158 { 159 usage: 1024 * 2, 160 origin: "https://books.foo.com", 161 cookies: 0, 162 persisted: false, 163 }, 164 { 165 usage: 1024 * 3, 166 origin: "http://cinema.bar.com", 167 cookies: 3, 168 persisted: true, 169 }, 170 { 171 usage: 1024 * 3, 172 origin: "http://vod.bar.com", 173 cookies: 2, 174 persisted: false, 175 }, 176 ]; 177 178 await addTestData(testData); 179 180 let updatePromise = promiseSiteDataManagerSitesUpdated(); 181 182 await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true }); 183 await updatePromise; 184 await openSiteDataSettingsDialog(); 185 186 let dialog = content.gSubDialog._topDialog; 187 let dialogFrame = dialog._frame; 188 let frameDoc = dialogFrame.contentDocument; 189 let hostCol = frameDoc.getElementById("hostCol"); 190 let usageCol = frameDoc.getElementById("usageCol"); 191 let cookiesCol = frameDoc.getElementById("cookiesCol"); 192 let sitesList = frameDoc.getElementById("sitesList"); 193 194 function getHostOrder() { 195 let siteItems = sitesList.getElementsByTagName("richlistitem"); 196 return Array.from(siteItems).map(item => item.getAttribute("host")); 197 } 198 199 // Test default sorting by usage, descending. 200 Assert.deepEqual( 201 getHostOrder(), 202 ["bar.com", "foo.com", "xyz.com"], 203 "Has sorted descending by usage" 204 ); 205 206 // Test sorting on the usage column 207 usageCol.click(); 208 Assert.deepEqual( 209 getHostOrder(), 210 ["xyz.com", "foo.com", "bar.com"], 211 "Has sorted ascending by usage" 212 ); 213 usageCol.click(); 214 Assert.deepEqual( 215 getHostOrder(), 216 ["bar.com", "foo.com", "xyz.com"], 217 "Has sorted descending by usage" 218 ); 219 220 // Test sorting on the host column 221 hostCol.click(); 222 Assert.deepEqual( 223 getHostOrder(), 224 ["bar.com", "foo.com", "xyz.com"], 225 "Has sorted ascending by base domain" 226 ); 227 hostCol.click(); 228 Assert.deepEqual( 229 getHostOrder(), 230 ["xyz.com", "foo.com", "bar.com"], 231 "Has sorted descending by base domain" 232 ); 233 234 // Test sorting on the cookies column 235 cookiesCol.click(); 236 Assert.deepEqual( 237 getHostOrder(), 238 ["foo.com", "bar.com", "xyz.com"], 239 "Has sorted ascending by cookies" 240 ); 241 cookiesCol.click(); 242 Assert.deepEqual( 243 getHostOrder(), 244 ["xyz.com", "bar.com", "foo.com"], 245 "Has sorted descending by cookies" 246 ); 247 248 await SiteDataTestUtils.clear(); 249 BrowserTestUtils.removeTab(gBrowser.selectedTab); 250 }); 251 252 // Test single entry removal 253 add_task(async function test_single_entry_removal() { 254 let testData = await addTestData([ 255 { 256 usage: 1024, 257 origin: "https://xyz.com", 258 cookies: 6, 259 persisted: true, 260 }, 261 { 262 usage: 1024 * 3, 263 origin: "http://bar.com", 264 cookies: 2, 265 persisted: false, 266 }, 267 ]); 268 269 let updatePromise = promiseSiteDataManagerSitesUpdated(); 270 await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true }); 271 await updatePromise; 272 await openSiteDataSettingsDialog(); 273 274 let dialog = content.gSubDialog._topDialog; 275 let dialogFrame = dialog._frame; 276 let frameDoc = dialogFrame.contentDocument; 277 278 let sitesList = frameDoc.getElementById("sitesList"); 279 let host = testData[0]; 280 let site = sitesList.querySelector(`richlistitem[host="${host}"]`); 281 sitesList.addItemToSelection(site); 282 frameDoc.getElementById("removeSelected").doCommand(); 283 let saveChangesButton = frameDoc.querySelector("dialog").getButton("accept"); 284 let dialogOpened = BrowserTestUtils.promiseAlertDialogOpen( 285 null, 286 REMOVE_DIALOG_URL 287 ); 288 setTimeout(() => saveChangesButton.doCommand(), 0); 289 let dialogWin = await dialogOpened; 290 let rootElement = dialogWin.document.getElementById( 291 "SiteDataRemoveSelectedDialog" 292 ); 293 is(rootElement.classList.length, 1, "There should only be one class set"); 294 is( 295 rootElement.classList[0], 296 "single-entry", 297 "The only class set should be single-entry (to hide the list)" 298 ); 299 let description = dialogWin.document.getElementById("removing-description"); 300 is( 301 description.getAttribute("data-l10n-id"), 302 "site-data-removing-single-desc", 303 "The description for single site should be selected" 304 ); 305 306 let removalList = dialogWin.document.getElementById("removalList"); 307 is( 308 BrowserTestUtils.isVisible(removalList), 309 false, 310 "The removal list should be invisible" 311 ); 312 let removeButton = dialogWin.document 313 .querySelector("dialog") 314 .getButton("accept"); 315 let dialogClosed = BrowserTestUtils.waitForEvent(dialogWin, "unload"); 316 updatePromise = promiseSiteDataManagerSitesUpdated(); 317 removeButton.doCommand(); 318 await dialogClosed; 319 await updatePromise; 320 await openSiteDataSettingsDialog(); 321 322 dialog = content.gSubDialog._topDialog; 323 dialogFrame = dialog._frame; 324 frameDoc = dialogFrame.contentDocument; 325 assertSitesListed(frameDoc, testData.slice(1)); 326 await SiteDataTestUtils.clear(); 327 BrowserTestUtils.removeTab(gBrowser.selectedTab); 328 });