| <!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> |