browser_disconnect.js (7559B)
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 file, 3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 XPCOMUtils.defineLazyServiceGetter( 8 this, 9 "IdentityCredentialStorageService", 10 "@mozilla.org/browser/identity-credential-storage-service;1", 11 Ci.nsIIdentityCredentialStorageService 12 ); 13 14 const TEST_URL = "https://example.com/"; 15 16 async function disconnect() { 17 let promise = content.IdentityCredential.disconnect({ 18 configURL: 19 "https://example.net/browser/dom/credentialmanagement/identity/tests/browser/server_manifest.json", 20 clientId: "id", 21 accountHint: "example", 22 }); 23 try { 24 return await promise; 25 } catch (_) { 26 return undefined; 27 } 28 } 29 30 async function disconnectEndpointFailure() { 31 let promise = content.IdentityCredential.disconnect({ 32 configURL: 33 "https://example.net/browser/dom/credentialmanagement/identity/tests/browser/server_manifest_disconnect_failure.json", 34 clientId: "id", 35 accountHint: "example", 36 }); 37 try { 38 return await promise; 39 } catch (_) { 40 return undefined; 41 } 42 } 43 44 async function disconnectManifestFailure() { 45 let promise = content.IdentityCredential.disconnect({ 46 configURL: 47 "https://example.net/browser/dom/credentialmanagement/identity/tests/browser/server_manifest_failure.json", 48 clientId: "id", 49 accountHint: "example", 50 }); 51 try { 52 return await promise; 53 } catch (_) { 54 return undefined; 55 } 56 } 57 58 add_task(async function test_disconnect_identity_credential() { 59 await SpecialPowers.pushPrefEnv({ 60 set: [ 61 [ 62 "dom.security.credentialmanagement.identity.select_first_in_ui_lists", 63 true, 64 ], 65 [ 66 "dom.security.credentialmanagement.identity.reject_delay.enabled", 67 false, 68 ], 69 ], 70 }); 71 72 const idpPrincipal = Services.scriptSecurityManager.createContentPrincipal( 73 Services.io.newURI("https://example.net"), 74 {} 75 ); 76 const rpPrincipal = Services.scriptSecurityManager.createContentPrincipal( 77 Services.io.newURI("https://example.com"), 78 {} 79 ); 80 81 // Set two accounts as registered 82 IdentityCredentialStorageService.setState( 83 rpPrincipal, 84 idpPrincipal, 85 "disconnected", 86 true, 87 false 88 ); 89 IdentityCredentialStorageService.setState( 90 rpPrincipal, 91 idpPrincipal, 92 "still_connected", 93 true, 94 false 95 ); 96 97 let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL); 98 99 await SpecialPowers.spawn(tab.linkedBrowser, [], disconnect); 100 101 let registered = {}; 102 let allowLogout = {}; 103 IdentityCredentialStorageService.getState( 104 rpPrincipal, 105 idpPrincipal, 106 "disconnected", 107 registered, 108 allowLogout 109 ); 110 Assert.ok(!registered.value, "Should be unregistered by disconnect."); 111 IdentityCredentialStorageService.getState( 112 rpPrincipal, 113 idpPrincipal, 114 "still_connected", 115 registered, 116 allowLogout 117 ); 118 Assert.ok( 119 registered.value, 120 "Should be still registered by disconnect if not returned by server." 121 ); 122 123 // Close tabs. 124 await BrowserTestUtils.removeTab(tab); 125 await SpecialPowers.popPrefEnv(); 126 }); 127 128 add_task(async function test_disconnect_miss_identity_credential() { 129 await SpecialPowers.pushPrefEnv({ 130 set: [ 131 [ 132 "dom.security.credentialmanagement.identity.select_first_in_ui_lists", 133 true, 134 ], 135 [ 136 "dom.security.credentialmanagement.identity.reject_delay.enabled", 137 false, 138 ], 139 ], 140 }); 141 142 const idpPrincipal = Services.scriptSecurityManager.createContentPrincipal( 143 Services.io.newURI("https://example.net"), 144 {} 145 ); 146 const rpPrincipal = Services.scriptSecurityManager.createContentPrincipal( 147 Services.io.newURI("https://example.com"), 148 {} 149 ); 150 151 // Set only one account as registered 152 this.IdentityCredentialStorageService.setState( 153 rpPrincipal, 154 idpPrincipal, 155 "no_longer_connected", 156 true, 157 false 158 ); 159 160 let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL); 161 162 await SpecialPowers.spawn(tab.linkedBrowser, [], disconnect); 163 164 let registered = {}; 165 let allowLogout = {}; 166 IdentityCredentialStorageService.getState( 167 rpPrincipal, 168 idpPrincipal, 169 "no_longer_connected", 170 registered, 171 allowLogout 172 ); 173 Assert.ok( 174 !registered.value, 175 "Should not be still registered by disconnect if the disconnect missed." 176 ); 177 178 // Close tabs. 179 await BrowserTestUtils.removeTab(tab); 180 await SpecialPowers.popPrefEnv(); 181 }); 182 183 add_task(async function test_disconnect_on_disconnect_failure() { 184 await SpecialPowers.pushPrefEnv({ 185 set: [ 186 [ 187 "dom.security.credentialmanagement.identity.select_first_in_ui_lists", 188 true, 189 ], 190 [ 191 "dom.security.credentialmanagement.identity.reject_delay.enabled", 192 false, 193 ], 194 ], 195 }); 196 197 const idpPrincipal = Services.scriptSecurityManager.createContentPrincipal( 198 Services.io.newURI("https://example.net"), 199 {} 200 ); 201 const rpPrincipal = Services.scriptSecurityManager.createContentPrincipal( 202 Services.io.newURI("https://example.com"), 203 {} 204 ); 205 206 // Set two accounts as registered 207 this.IdentityCredentialStorageService.setState( 208 rpPrincipal, 209 idpPrincipal, 210 "disconnected", 211 true, 212 false 213 ); 214 this.IdentityCredentialStorageService.setState( 215 rpPrincipal, 216 idpPrincipal, 217 "not_still_connected", 218 true, 219 false 220 ); 221 222 let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL); 223 224 await SpecialPowers.spawn(tab.linkedBrowser, [], disconnectEndpointFailure); 225 226 let registered = {}; 227 let allowLogout = {}; 228 IdentityCredentialStorageService.getState( 229 rpPrincipal, 230 idpPrincipal, 231 "disconnected", 232 registered, 233 allowLogout 234 ); 235 Assert.ok(!registered.value, "Should be unregistered by disconnect."); 236 IdentityCredentialStorageService.getState( 237 rpPrincipal, 238 idpPrincipal, 239 "not_still_connected", 240 registered, 241 allowLogout 242 ); 243 Assert.ok( 244 !registered.value, 245 "Should not be still registered because disconnect failed." 246 ); 247 248 // Close tabs. 249 await BrowserTestUtils.removeTab(tab); 250 await SpecialPowers.popPrefEnv(); 251 }); 252 253 add_task(async function test_nothing_on_manifest_failure() { 254 await SpecialPowers.pushPrefEnv({ 255 set: [ 256 [ 257 "dom.security.credentialmanagement.identity.select_first_in_ui_lists", 258 true, 259 ], 260 [ 261 "dom.security.credentialmanagement.identity.reject_delay.enabled", 262 false, 263 ], 264 ], 265 }); 266 267 const idpPrincipal = Services.scriptSecurityManager.createContentPrincipal( 268 Services.io.newURI("https://example.net"), 269 {} 270 ); 271 const rpPrincipal = Services.scriptSecurityManager.createContentPrincipal( 272 Services.io.newURI("https://example.com"), 273 {} 274 ); 275 276 // Set two accounts as registered 277 this.IdentityCredentialStorageService.setState( 278 rpPrincipal, 279 idpPrincipal, 280 "connected", 281 true, 282 false 283 ); 284 285 let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL); 286 287 await SpecialPowers.spawn(tab.linkedBrowser, [], disconnectManifestFailure); 288 289 let registered = {}; 290 let allowLogout = {}; 291 IdentityCredentialStorageService.getState( 292 rpPrincipal, 293 idpPrincipal, 294 "connected", 295 registered, 296 allowLogout 297 ); 298 Assert.ok( 299 registered.value, 300 "Should be registered because the disconnect failed finding a manifest" 301 ); 302 303 // Close tabs. 304 await BrowserTestUtils.removeTab(tab); 305 await SpecialPowers.popPrefEnv(); 306 });