browser_SitePermissions.js (7497B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 const LOCAL_NETWORK_ACCESS_ENABLED = Services.prefs.getBoolPref( 8 "network.lna.blocking" 9 ); 10 11 // This tests the SitePermissions.getAllPermissionDetailsForBrowser function. 12 add_task(async function testGetAllPermissionDetailsForBrowser() { 13 let principal = 14 Services.scriptSecurityManager.createContentPrincipalFromOrigin( 15 "https://example.com" 16 ); 17 18 let tab = await BrowserTestUtils.openNewForegroundTab( 19 gBrowser, 20 principal.spec 21 ); 22 23 Services.prefs.setIntPref("permissions.default.shortcuts", 2); 24 25 let browser = tab.linkedBrowser; 26 27 SitePermissions.setForPrincipal(principal, "camera", SitePermissions.ALLOW); 28 29 SitePermissions.setForPrincipal( 30 principal, 31 "cookie", 32 SitePermissions.ALLOW_COOKIES_FOR_SESSION 33 ); 34 SitePermissions.setForPrincipal(principal, "popup", SitePermissions.BLOCK); 35 SitePermissions.setForPrincipal( 36 principal, 37 "geo", 38 SitePermissions.ALLOW, 39 SitePermissions.SCOPE_SESSION 40 ); 41 42 SitePermissions.setForPrincipal( 43 principal, 44 "localhost", 45 SitePermissions.ALLOW, 46 SitePermissions.SCOPE_SESSION 47 ); 48 49 SitePermissions.setForPrincipal( 50 principal, 51 "local-network", 52 SitePermissions.ALLOW, 53 SitePermissions.SCOPE_SESSION 54 ); 55 56 SitePermissions.setForPrincipal( 57 principal, 58 "shortcuts", 59 SitePermissions.ALLOW 60 ); 61 62 SitePermissions.setForPrincipal(principal, "xr", SitePermissions.ALLOW); 63 64 let permissions = SitePermissions.getAllPermissionDetailsForBrowser(browser); 65 66 let camera = permissions.find(({ id }) => id === "camera"); 67 Assert.deepEqual(camera, { 68 id: "camera", 69 label: "Use the camera", 70 state: SitePermissions.ALLOW, 71 scope: SitePermissions.SCOPE_PERSISTENT, 72 }); 73 74 // Check that removed permissions (State.UNKNOWN) are skipped. 75 SitePermissions.removeFromPrincipal(principal, "camera"); 76 permissions = SitePermissions.getAllPermissionDetailsForBrowser(browser); 77 78 camera = permissions.find(({ id }) => id === "camera"); 79 Assert.equal(camera, undefined); 80 81 let cookie = permissions.find(({ id }) => id === "cookie"); 82 Assert.deepEqual(cookie, { 83 id: "cookie", 84 label: "Set cookies", 85 state: SitePermissions.ALLOW_COOKIES_FOR_SESSION, 86 scope: SitePermissions.SCOPE_PERSISTENT, 87 }); 88 89 let popup = permissions.find(({ id }) => id === "popup"); 90 Assert.deepEqual(popup, { 91 id: "popup", 92 label: "Pop-ups and third-party redirects", 93 state: SitePermissions.BLOCK, 94 scope: SitePermissions.SCOPE_PERSISTENT, 95 }); 96 97 let geo = permissions.find(({ id }) => id === "geo"); 98 Assert.deepEqual(geo, { 99 id: "geo", 100 label: "Access your location", 101 state: SitePermissions.ALLOW, 102 scope: SitePermissions.SCOPE_SESSION, 103 }); 104 105 if (LOCAL_NETWORK_ACCESS_ENABLED) { 106 let localhost = permissions.find(({ id }) => id === "localhost"); 107 Assert.deepEqual(localhost, { 108 id: "localhost", 109 label: "Access this device", 110 state: SitePermissions.ALLOW, 111 scope: SitePermissions.SCOPE_SESSION, 112 }); 113 114 let localNetwork = permissions.find(({ id }) => id === "local-network"); 115 Assert.deepEqual(localNetwork, { 116 id: "local-network", 117 label: "Access local network devices", 118 state: SitePermissions.ALLOW, 119 scope: SitePermissions.SCOPE_SESSION, 120 }); 121 } 122 123 let shortcuts = permissions.find(({ id }) => id === "shortcuts"); 124 Assert.deepEqual(shortcuts, { 125 id: "shortcuts", 126 label: "Override keyboard shortcuts", 127 state: SitePermissions.ALLOW, 128 scope: SitePermissions.SCOPE_PERSISTENT, 129 }); 130 131 let xr = permissions.find(({ id }) => id === "xr"); 132 Assert.deepEqual(xr, { 133 id: "xr", 134 label: "Access virtual reality devices", 135 state: SitePermissions.ALLOW, 136 scope: SitePermissions.SCOPE_PERSISTENT, 137 }); 138 139 SitePermissions.removeFromPrincipal(principal, "cookie"); 140 SitePermissions.removeFromPrincipal(principal, "popup"); 141 SitePermissions.removeFromPrincipal(principal, "geo"); 142 SitePermissions.removeFromPrincipal(principal, "localhost"); 143 SitePermissions.removeFromPrincipal(principal, "local-network"); 144 SitePermissions.removeFromPrincipal(principal, "shortcuts"); 145 146 SitePermissions.removeFromPrincipal(principal, "xr"); 147 148 Services.prefs.clearUserPref("permissions.default.shortcuts"); 149 150 BrowserTestUtils.removeTab(gBrowser.selectedTab); 151 }); 152 153 add_task(async function testTemporaryChangeEvent() { 154 let principal = 155 Services.scriptSecurityManager.createContentPrincipalFromOrigin( 156 "https://example.com" 157 ); 158 159 let tab = await BrowserTestUtils.openNewForegroundTab( 160 gBrowser, 161 principal.spec 162 ); 163 164 let browser = tab.linkedBrowser; 165 166 let changeEventCount = 0; 167 function listener() { 168 changeEventCount++; 169 } 170 171 browser.addEventListener("PermissionStateChange", listener); 172 173 // Test browser-specific permissions. 174 SitePermissions.setForPrincipal( 175 browser.contentPrincipal, 176 "autoplay-media", 177 SitePermissions.BLOCK, 178 SitePermissions.SCOPE_GLOBAL, 179 browser 180 ); 181 is(changeEventCount, 1, "Should've changed"); 182 183 // Setting the same value shouldn't dispatch a change event. 184 SitePermissions.setForPrincipal( 185 browser.contentPrincipal, 186 "autoplay-media", 187 SitePermissions.BLOCK, 188 SitePermissions.SCOPE_GLOBAL, 189 browser 190 ); 191 is(changeEventCount, 1, "Shouldn't have changed"); 192 193 browser.removeEventListener("PermissionStateChange", listener); 194 195 BrowserTestUtils.removeTab(tab); 196 }); 197 198 add_task(async function testInvalidPrincipal() { 199 // Check that an error is thrown when an invalid principal argument is passed. 200 try { 201 SitePermissions.isSupportedPrincipal("file:///example.js"); 202 } catch (e) { 203 Assert.equal( 204 e.message, 205 "Argument passed as principal is not an instance of Ci.nsIPrincipal" 206 ); 207 } 208 try { 209 SitePermissions.removeFromPrincipal(null, "canvas"); 210 } catch (e) { 211 Assert.equal( 212 e.message, 213 "Atleast one of the arguments, either principal or browser should not be null." 214 ); 215 } 216 try { 217 SitePermissions.setForPrincipal( 218 "blah", 219 "camera", 220 SitePermissions.ALLOW, 221 SitePermissions.SCOPE_PERSISTENT, 222 gBrowser.selectedBrowser 223 ); 224 } catch (e) { 225 Assert.equal( 226 e.message, 227 "Argument passed as principal is not an instance of Ci.nsIPrincipal" 228 ); 229 } 230 try { 231 SitePermissions.getAllByPrincipal("blah"); 232 } catch (e) { 233 Assert.equal( 234 e.message, 235 "Argument passed as principal is not an instance of Ci.nsIPrincipal" 236 ); 237 } 238 try { 239 SitePermissions.getAllByPrincipal(null); 240 } catch (e) { 241 Assert.equal(e.message, "principal argument cannot be null."); 242 } 243 try { 244 SitePermissions.getForPrincipal(5, "camera"); 245 } catch (e) { 246 Assert.equal( 247 e.message, 248 "Argument passed as principal is not an instance of Ci.nsIPrincipal" 249 ); 250 } 251 // Check that no error is thrown when passing valid principal and browser arguments. 252 Assert.deepEqual( 253 SitePermissions.getForPrincipal(gBrowser.contentPrincipal, "camera"), 254 { 255 state: SitePermissions.UNKNOWN, 256 scope: SitePermissions.SCOPE_PERSISTENT, 257 } 258 ); 259 Assert.deepEqual( 260 SitePermissions.getForPrincipal(null, "camera", gBrowser.selectedBrowser), 261 { 262 state: SitePermissions.UNKNOWN, 263 scope: SitePermissions.SCOPE_PERSISTENT, 264 } 265 ); 266 });