| <!DOCTYPE html> |
| <title>Federated Credential Management API disconnect() tests.</title> |
| <link rel="help" href="https://fedidcg.github.io/FedCM"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/resources/testdriver.js"></script> |
| <script src="/resources/testdriver-vendor.js"></script> |
| |
| <body> |
| |
| <script type="module"> |
| import {fedcm_test, |
| mark_signed_in, |
| disconnect_options, |
| fedcm_get_and_select_first_account, |
| fedcm_select_account_promise, |
| request_options_with_mediation_required, |
| alt_manifest_origin, |
| alt_request_options_with_mediation_required, |
| alt_disconnect_options, |
| set_alt_fedcm_cookie} from './support/fedcm-helper.sub.js'; |
| |
| fedcm_test(async t => { |
| await mark_signed_in(alt_manifest_origin); |
| // Get at least one connected account that can be disconnected. |
| const cred = await fedcm_get_and_select_first_account(t, alt_request_options_with_mediation_required()); |
| // The IDP implementation will accept any account hint, so this is really testing that the user |
| // agent eventually stops sending the requests to the IDP. |
| // This test clears the connection just created above, but it also clears any previously existing |
| // connected accounts, which helps the logic of the other tests. |
| return new Promise(async resolve => { |
| while (true) { |
| try { |
| await IdentityCredential.disconnect(alt_disconnect_options("1234")); |
| } catch(e) { |
| resolve(); |
| break; |
| } |
| } |
| }); |
| }, "Repeatedly calling disconnect should eventually fail"); |
| |
| fedcm_test(async t => { |
| const disconnect = IdentityCredential.disconnect( |
| alt_disconnect_options("nonExistent")); |
| return promise_rejects_dom(t, 'NetworkError', disconnect); |
| }, 'Test that disconnect fails when there is no account to disconnect'); |
| |
| fedcm_test(async t => { |
| await mark_signed_in(alt_manifest_origin); |
| const cred = await fedcm_get_and_select_first_account(t, alt_request_options_with_mediation_required()); |
| |
| return IdentityCredential.disconnect(alt_disconnect_options("1234")); |
| }, 'Test that disconnect succeeds when there is an account to disconnect'); |
| |
| fedcm_test(async t => { |
| await mark_signed_in(alt_manifest_origin); |
| const cred = await fedcm_get_and_select_first_account(t, alt_request_options_with_mediation_required()); |
| |
| await IdentityCredential.disconnect(alt_disconnect_options("1234")); |
| |
| const disconnect = IdentityCredential.disconnect(alt_disconnect_options("1234")); |
| return promise_rejects_dom(t, 'NetworkError', disconnect); |
| }, 'Test that disconnecting the same account twice results in failure.'); |
| |
| fedcm_test(async t => { |
| await mark_signed_in(alt_manifest_origin); |
| const cred = await fedcm_get_and_select_first_account(t, alt_request_options_with_mediation_required()); |
| // A connected account is guaranteed by the above, and IDP accepts any account hint, so this tests |
| // that the user agent allows the request to go through to the IDP. |
| return IdentityCredential.disconnect(alt_disconnect_options("noMatch")); |
| }, 'Disconnect passing an incorrect ID can still succeed'); |
| |
| fedcm_test(async t => { |
| await mark_signed_in(); |
| await mark_signed_in(alt_manifest_origin); |
| await fedcm_get_and_select_first_account(t, alt_request_options_with_mediation_required()); |
| await fedcm_get_and_select_first_account(t, |
| request_options_with_mediation_required()); |
| |
| // Await the first disconnect since they cannot happen in parallel. Both |
| // should succeed. |
| await IdentityCredential.disconnect(disconnect_options("1")); |
| return IdentityCredential.disconnect(alt_disconnect_options("2")); |
| }, 'Disconnect is bound to each IDP'); |
| |
| fedcm_test(async t => { |
| await mark_signed_in(alt_manifest_origin); |
| // Get at least one connected account that can be disconnected. |
| await fedcm_get_and_select_first_account(t, alt_request_options_with_mediation_required()); |
| |
| // Pending get request. |
| const credentialPromise = navigator.credentials.get(alt_request_options_with_mediation_required()); |
| |
| // Disconnect the one connected account. |
| await IdentityCredential.disconnect(alt_disconnect_options("1234")); |
| |
| // Select an account to resolve the pending get request. |
| fedcm_select_account_promise(t, 0); |
| return credentialPromise; |
| }, 'Test that disconnect succeeds when there is a pending get request and the get request succeeds after the disconnect'); |
| </script> |