2 <title>Federated Credential Management API basics.
</title>
3 <link rel=
"help" href=
"https://wicg.github.io/FedCM">
4 <script src=
"/resources/testharness.js"></script>
5 <script src=
"/resources/testharnessreport.js"></script>
7 import {fedcm_test} from './support/fedcm-helper.js';
11 url: 'https://idp.test',
18 fedcm_test(async (t, mock) =
> {
19 mock.returnIdToken(
"a_token");
20 const token = await navigator.credentials.get(test_options);
21 assert_equals(token,
"a_token");
22 },
"Successfully obtaining id_token should resolve the promise.");
24 fedcm_test(async (t, mock) =
> {
25 mock.returnError(
"ApprovalDeclined");
26 const result = navigator.credentials.get(test_options);
27 return promise_rejects_dom(t, 'AbortError', result);
28 },
"User approval decline should reject the promise.");
30 fedcm_test(async (t, mock) =
> {
31 mock.returnError(
"ErrorTooManyRequests");
32 const first = await navigator.credentials.get(test_options);
33 const second = await navigator.credentials.get(test_options);
34 assert_equals(first, undefined);
35 return promise_rejects_dom(t, 'AbortError', second);
37 "When there's a pending request, a second `get` call should be rejected. ",
38 "Only one navigator.credentials.get request may be outstanding at one time.");
40 promise_test(async t =
> {
41 const result = navigator.credentials.get({
49 return promise_rejects_js(t, TypeError, result);
50 },
"Reject when url is missing" );
52 promise_test(async t =
> {
53 const result = navigator.credentials.get({
62 return promise_rejects_dom(t,
"InvalidStateError", result);
63 },
"Reject when url is invalid");
65 promise_test(async t =
> {
66 const result = navigator.credentials.get({
69 url: 'https://idp.test',
74 return promise_rejects_js(t, TypeError, result);
75 },
"Reject when clientId is missing" );
77 promise_test(async t =
> {
78 const result = navigator.credentials.get({
81 url: 'https://idp.test',
87 return promise_rejects_dom(t,
"InvalidStateError", result);
88 },
"Reject when clientId is empty");
90 fedcm_test(async (t, mock) =
> {
91 mock.returnIdToken(
"a_token");
92 const token = await navigator.credentials.get({
95 url: 'https://idp.test',
101 assert_equals(token,
"a_token");
102 },
"nonce is not required in FederatedIdentityProvider.");
104 fedcm_test(async (t, mock) =
> {
105 let controller = new AbortController();
106 mock.returnPendingPromise();
108 const token_promise = navigator.credentials.get({
111 url: 'https://idp.test',
115 signal: controller.signal,
117 assert_equals(aborted, false);
123 assert_equals(e.name,
"AbortError");
125 assert_equals(aborted, true);
126 },
"test the abort signal");
128 fedcm_test(async (t, mock) =
> {
129 let controller = new AbortController();
130 mock.returnPendingPromise();
132 const token_promise = navigator.credentials.get({
135 url: 'https://idp.test',
139 signal: controller.signal,
141 assert_equals(aborted, false);
147 assert_equals(e.name,
"AbortError");
149 assert_equals(aborted, true);
151 mock.returnIdToken(
"a_token");
152 const token = await navigator.credentials.get(test_options);
153 assert_equals(token,
"a_token");
154 },
"get after abort should work");
156 promise_test(function(t) {
157 // Logout API not supported yet.
158 return promise_rejects_dom(t,
"NotSupportedError",
159 FederatedCredential.logout([{
161 endpoint:
"https://rp.example/logout.php"
164 },
"navigator.credentials.logout() basic.");