| <!DOCTYPE html> | |
| <title>Federated Credential Management API basics.</title> | |
| <link rel="help" href="https://wicg.github.io/FedCM"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script type="module"> | |
| import {fedcm_test} from './support/fedcm-helper.js'; | |
| const test_options = { | |
| federated: { | |
| providers: [{ | |
| url: 'https://idp.test', | |
| clientId: '1', | |
| }] | |
| } | |
| }; | |
| const login_options = { | |
| nonce: '2', | |
| }; | |
| fedcm_test(async (t, mock) => { | |
| mock.returnIdToken("a_token"); | |
| const cred = await navigator.credentials.get(test_options); | |
| const token = await cred.login(login_options); | |
| assert_equals(token.idToken, "a_token"); | |
| }, "Successfully obtaining id_token should resolve the promise."); | |
| fedcm_test(async (t, mock) => { | |
| mock.returnError("ApprovalDeclined"); | |
| const cred = await navigator.credentials.get(test_options); | |
| const token = cred.login(login_options); | |
| return promise_rejects_dom(t, 'AbortError', token); | |
| }, "User approval decline should reject the promise."); | |
| fedcm_test(async (t, mock) => { | |
| mock.returnError("ErrorTooManyRequests"); | |
| const first = await navigator.credentials.get(test_options); | |
| const first_token = await first.login(login_options); | |
| const second = await navigator.credentials.get(test_options); | |
| const second_token = await second.login(login_options); | |
| assert_equals(first_token.idToken, undefined); | |
| return promise_rejects_dom(t, 'AbortError', second_token); | |
| }, | |
| "When there's a pending request, a second `get` call should be rejected. ", | |
| "Only one navigator.credentials.get request may be outstanding at one time."); | |
| promise_test(async t => { | |
| const result = navigator.credentials.get({ | |
| federated: { | |
| providers: [{ | |
| clientId: '1', | |
| nonce: '2', | |
| }] | |
| } | |
| }); | |
| return promise_rejects_js(t, TypeError, result); | |
| }, "Reject when url is missing" ); | |
| promise_test(async t => { | |
| const result = navigator.credentials.get({ | |
| federated: { | |
| providers: [{ | |
| url: 'test', | |
| clientId: '1', | |
| nonce: '2', | |
| }] | |
| } | |
| }); | |
| return promise_rejects_dom(t, "InvalidStateError", result); | |
| }, "Reject when url is invalid"); | |
| promise_test(async t => { | |
| const result = navigator.credentials.get({ | |
| federated: { | |
| providers: [{ | |
| url: 'https://idp.test', | |
| nonce: '2', | |
| }] | |
| } | |
| }); | |
| return promise_rejects_js(t, TypeError, result); | |
| }, "Reject when clientId is missing" ); | |
| promise_test(async t => { | |
| const result = navigator.credentials.get({ | |
| federated: { | |
| providers: [{ | |
| url: 'https://idp.test', | |
| clientId: '', | |
| nonce: '1', | |
| }] | |
| } | |
| }); | |
| return promise_rejects_dom(t, "InvalidStateError", result); | |
| }, "Reject when clientId is empty"); | |
| fedcm_test(async (t, mock) => { | |
| mock.returnIdToken("a_token"); | |
| const cred = await navigator.credentials.get({ | |
| federated: { | |
| providers: [{ | |
| url: 'https://idp.test', | |
| clientId: '1', | |
| }] | |
| } | |
| }); | |
| const token = await cred.login(login_options); | |
| assert_equals(token.idToken, "a_token"); | |
| }, "nonce is not required in FederatedIdentityProvider."); | |
| fedcm_test(async (t, mock) => { | |
| let controller = new AbortController(); | |
| mock.returnPendingPromise(); | |
| let aborted = false; | |
| const cred = await navigator.credentials.get({ | |
| federated: { | |
| providers: [{ | |
| url: 'https://idp.test', | |
| clientId: '1', | |
| }], | |
| }, | |
| }); | |
| const token_promise = cred.login({ | |
| nonce: '2', | |
| signal: controller.signal, | |
| }); | |
| assert_equals(aborted, false); | |
| controller.abort(); | |
| try { | |
| await token_promise; | |
| } catch (e) { | |
| aborted = true; | |
| assert_equals(e.name, "AbortError"); | |
| } | |
| assert_equals(aborted, true); | |
| }, "test the abort signal"); | |
| fedcm_test(async (t, mock) => { | |
| let controller = new AbortController(); | |
| mock.returnPendingPromise(); | |
| let aborted = false; | |
| const cred = await navigator.credentials.get({ | |
| federated: { | |
| providers: [{ | |
| url: 'https://idp.test', | |
| clientId: '1', | |
| }], | |
| }, | |
| }); | |
| const token_promise = cred.login({ | |
| nonce: '2', | |
| signal: controller.signal, | |
| }); | |
| assert_equals(aborted, false); | |
| controller.abort(); | |
| try { | |
| await token_promise; | |
| } catch (e) { | |
| aborted = true; | |
| assert_equals(e.name, "AbortError"); | |
| } | |
| assert_equals(aborted, true); | |
| mock.returnIdToken("a_token"); | |
| const cred2 = await navigator.credentials.get(test_options); | |
| const token = await cred2.login(login_options); | |
| assert_equals(token.idToken, "a_token"); | |
| }, "get after abort should work"); | |
| promise_test(async t => { | |
| const result = navigator.credentials.get({ | |
| federated: { | |
| providers: [{ | |
| url: 'https://other-idp.test/', | |
| clientId: '1', | |
| nonce: '1', | |
| }] | |
| } | |
| }); | |
| return promise_rejects_dom(t, "NetworkError", result); | |
| }, "Provider URL should honor Content-Security-Policy."); | |
| </script> |