browser_pageinfo_permissions.js (8737B)
1 const { PermissionTestUtils } = ChromeUtils.importESModule( 2 "resource://testing-common/PermissionTestUtils.sys.mjs" 3 ); 4 5 const TEST_ORIGIN = "https://example.com"; 6 const TEST_ORIGIN_CERT_ERROR = "https://expired.example.com"; 7 const LOW_TLS_VERSION = "https://tls1.example.com/"; 8 9 async function testPermissions(defaultPermission) { 10 await BrowserTestUtils.withNewTab(TEST_ORIGIN, async function () { 11 let pageInfo = BrowserCommands.pageInfo(TEST_ORIGIN, "permTab"); 12 await BrowserTestUtils.waitForEvent(pageInfo, "load"); 13 14 let defaultCheckbox = await TestUtils.waitForCondition(() => 15 pageInfo.document.getElementById("geoDef") 16 ); 17 let radioGroup = pageInfo.document.getElementById("geoRadioGroup"); 18 let defaultRadioButton = pageInfo.document.getElementById( 19 "geo#" + defaultPermission 20 ); 21 let blockRadioButton = pageInfo.document.getElementById("geo#2"); 22 23 ok(defaultCheckbox.checked, "The default checkbox should be checked."); 24 25 PermissionTestUtils.add( 26 gBrowser.currentURI, 27 "geo", 28 Services.perms.DENY_ACTION 29 ); 30 31 ok(!defaultCheckbox.checked, "The default checkbox should not be checked."); 32 33 defaultCheckbox.checked = true; 34 defaultCheckbox.doCommand(); 35 36 ok( 37 !PermissionTestUtils.getPermissionObject(gBrowser.currentURI, "geo"), 38 "Checking the default checkbox should reset the permission." 39 ); 40 41 defaultCheckbox.checked = false; 42 defaultCheckbox.doCommand(); 43 44 ok( 45 !PermissionTestUtils.getPermissionObject(gBrowser.currentURI, "geo"), 46 "Unchecking the default checkbox should pick the default permission." 47 ); 48 is( 49 radioGroup.selectedItem, 50 defaultRadioButton, 51 "The unknown radio button should be selected." 52 ); 53 54 radioGroup.selectedItem = blockRadioButton; 55 blockRadioButton.doCommand(); 56 57 is( 58 PermissionTestUtils.getPermissionObject(gBrowser.currentURI, "geo") 59 .capability, 60 Services.perms.DENY_ACTION, 61 "Selecting a value in the radio group should set the corresponding permission" 62 ); 63 64 radioGroup.selectedItem = defaultRadioButton; 65 defaultRadioButton.doCommand(); 66 67 ok( 68 !PermissionTestUtils.getPermissionObject(gBrowser.currentURI, "geo"), 69 "Selecting the default value should reset the permission." 70 ); 71 ok(defaultCheckbox.checked, "The default checkbox should be checked."); 72 73 pageInfo.close(); 74 PermissionTestUtils.remove(gBrowser.currentURI, "geo"); 75 }); 76 } 77 78 // Test displaying website permissions on certificate error pages. 79 add_task(async function test_CertificateError() { 80 let browser; 81 let pageLoaded; 82 await BrowserTestUtils.openNewForegroundTab( 83 gBrowser, 84 () => { 85 gBrowser.selectedTab = BrowserTestUtils.addTab( 86 gBrowser, 87 TEST_ORIGIN_CERT_ERROR 88 ); 89 browser = gBrowser.selectedBrowser; 90 pageLoaded = BrowserTestUtils.waitForErrorPage(browser); 91 }, 92 false 93 ); 94 95 await pageLoaded; 96 97 let pageInfo = BrowserCommands.pageInfo(TEST_ORIGIN_CERT_ERROR, "permTab"); 98 await BrowserTestUtils.waitForEvent(pageInfo, "load"); 99 let permissionTab = pageInfo.document.getElementById("permTab"); 100 await TestUtils.waitForCondition( 101 () => BrowserTestUtils.isVisible(permissionTab), 102 "Permission tab should be visible." 103 ); 104 105 let hostText = pageInfo.document.getElementById("hostText"); 106 let permList = pageInfo.document.getElementById("permList"); 107 let excludedPermissions = pageInfo.window.getExcludedPermissions(); 108 let permissions = SitePermissions.listPermissions().filter( 109 p => 110 SitePermissions.getPermissionLabel(p) != null && 111 !excludedPermissions.includes(p) 112 ); 113 114 await TestUtils.waitForCondition( 115 () => hostText.value === browser.currentURI.displayPrePath, 116 `Value of owner should be "${browser.currentURI.displayPrePath}" instead got "${hostText.value}".` 117 ); 118 119 await TestUtils.waitForCondition( 120 () => permList.childElementCount === permissions.length, 121 `Value of verifier should be ${permissions.length}, instead got ${permList.childElementCount}.` 122 ); 123 124 pageInfo.close(); 125 BrowserTestUtils.removeTab(gBrowser.selectedTab); 126 }); 127 128 // Test displaying website permissions on network error pages. 129 add_task(async function test_NetworkError() { 130 // Setup for TLS error 131 Services.prefs.setIntPref("security.tls.version.max", 3); 132 Services.prefs.setIntPref("security.tls.version.min", 3); 133 134 let browser; 135 let pageLoaded; 136 await BrowserTestUtils.openNewForegroundTab( 137 gBrowser, 138 () => { 139 gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, LOW_TLS_VERSION); 140 browser = gBrowser.selectedBrowser; 141 pageLoaded = BrowserTestUtils.waitForErrorPage(browser); 142 }, 143 false 144 ); 145 146 await pageLoaded; 147 148 let pageInfo = BrowserCommands.pageInfo(LOW_TLS_VERSION, "permTab"); 149 await BrowserTestUtils.waitForEvent(pageInfo, "load"); 150 let permissionTab = pageInfo.document.getElementById("permTab"); 151 await TestUtils.waitForCondition( 152 () => BrowserTestUtils.isVisible(permissionTab), 153 "Permission tab should be visible." 154 ); 155 156 let hostText = pageInfo.document.getElementById("hostText"); 157 let permList = pageInfo.document.getElementById("permList"); 158 let excludedPermissions = pageInfo.window.getExcludedPermissions(); 159 let permissions = SitePermissions.listPermissions().filter( 160 p => 161 SitePermissions.getPermissionLabel(p) != null && 162 !excludedPermissions.includes(p) 163 ); 164 165 await TestUtils.waitForCondition( 166 () => hostText.value === browser.currentURI.displayPrePath, 167 `Value of host should be should be "${browser.currentURI.displayPrePath}" instead got "${hostText.value}".` 168 ); 169 170 await TestUtils.waitForCondition( 171 () => permList.childElementCount === permissions.length, 172 `Value of permissions list should be ${permissions.length}, instead got ${permList.childElementCount}.` 173 ); 174 175 pageInfo.close(); 176 BrowserTestUtils.removeTab(gBrowser.selectedTab); 177 }); 178 179 // Test some standard operations in the permission tab. 180 add_task(async function test_geo_permission() { 181 await testPermissions(Services.perms.UNKNOWN_ACTION); 182 }); 183 184 // Test some standard operations in the permission tab, falling back to a custom 185 // default permission instead of UNKNOWN. 186 add_task(async function test_default_geo_permission() { 187 await SpecialPowers.pushPrefEnv({ 188 set: [["permissions.default.geo", SitePermissions.ALLOW]], 189 }); 190 await testPermissions(Services.perms.ALLOW_ACTION); 191 }); 192 193 // Test special behavior for cookie permissions. 194 add_task(async function test_cookie_permission() { 195 await BrowserTestUtils.withNewTab(TEST_ORIGIN, async function () { 196 let pageInfo = BrowserCommands.pageInfo(TEST_ORIGIN, "permTab"); 197 await BrowserTestUtils.waitForEvent(pageInfo, "load"); 198 199 let defaultCheckbox = await TestUtils.waitForCondition(() => 200 pageInfo.document.getElementById("cookieDef") 201 ); 202 let radioGroup = pageInfo.document.getElementById("cookieRadioGroup"); 203 let allowRadioButton = pageInfo.document.getElementById("cookie#1"); 204 let blockRadioButton = pageInfo.document.getElementById("cookie#2"); 205 206 ok(defaultCheckbox.checked, "The default checkbox should be checked."); 207 208 defaultCheckbox.checked = false; 209 defaultCheckbox.dispatchEvent(new Event("command")); 210 211 is( 212 PermissionTestUtils.testPermission(gBrowser.currentURI, "cookie"), 213 SitePermissions.ALLOW, 214 "Unchecking the default checkbox should pick the default permission." 215 ); 216 is( 217 radioGroup.selectedItem, 218 allowRadioButton, 219 "The unknown radio button should be selected." 220 ); 221 222 radioGroup.selectedItem = blockRadioButton; 223 blockRadioButton.doCommand(); 224 225 is( 226 PermissionTestUtils.testPermission(gBrowser.currentURI, "cookie"), 227 SitePermissions.BLOCK, 228 "Selecting a value in the radio group should set the corresponding permission" 229 ); 230 231 radioGroup.selectedItem = allowRadioButton; 232 allowRadioButton.doCommand(); 233 234 is( 235 PermissionTestUtils.testPermission(gBrowser.currentURI, "cookie"), 236 SitePermissions.ALLOW, 237 "Selecting a value in the radio group should set the corresponding permission" 238 ); 239 ok(!defaultCheckbox.checked, "The default checkbox should not be checked."); 240 241 defaultCheckbox.checked = true; 242 defaultCheckbox.doCommand(); 243 244 is( 245 PermissionTestUtils.testPermission(gBrowser.currentURI, "cookie"), 246 SitePermissions.UNKNOWN, 247 "Checking the default checkbox should reset the permission." 248 ); 249 is( 250 radioGroup.selectedItem, 251 null, 252 "For cookies, no item should be selected when the checkbox is checked." 253 ); 254 255 pageInfo.close(); 256 PermissionTestUtils.remove(gBrowser.currentURI, "cookie"); 257 }); 258 });