blob: 9b21187a399eeaf6fb7b803881f277e7bb965c9c [file] [log] [blame] [edit]
<!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>