Source code

Revision control

Copy as Markdown

Other Tools

<script src="/common/get-host-info.sub.js"></script>
<script src="test-helpers.sub.js?pipe=sub"></script>
<script>
var path = base_path() + 'fetch-access-control.py';
var host_info = get_host_info();
var SUCCESS = 'SUCCESS';
var FAIL = 'FAIL';
function create_test_case_promise(url, with_credentials) {
return new Promise(function(resolve) {
var xhr = new XMLHttpRequest();
xhr.onload = function() {
if (xhr.status == 200) {
resolve(SUCCESS);
} else {
resolve("STATUS" + xhr.status);
}
}
xhr.onerror = function() {
resolve(FAIL);
}
xhr.responseType = 'text';
xhr.withCredentials = with_credentials;
xhr.open('GET', url, true);
xhr.send();
});
}
window.addEventListener('message', async (evt) => {
var port = evt.ports[0];
var url = host_info['HTTPS_ORIGIN'] + path;
var remote_url = host_info['HTTPS_REMOTE_ORIGIN'] + path;
var TEST_CASES = [
// Reject tests
[url + '?reject', false, FAIL],
[url + '?reject', true, FAIL],
[remote_url + '?reject', false, FAIL],
[remote_url + '?reject', true, FAIL],
// Event handler exception tests
[url + '?throw', false, SUCCESS],
[url + '?throw', true, SUCCESS],
[remote_url + '?throw', false, FAIL],
[remote_url + '?throw', true, FAIL],
// Reject(resolve-null) tests
[url + '?resolve-null', false, FAIL],
[url + '?resolve-null', true, FAIL],
[remote_url + '?resolve-null', false, FAIL],
[remote_url + '?resolve-null', true, FAIL],
// Fallback tests
[url + '?ignore', false, SUCCESS],
[url + '?ignore', true, SUCCESS],
[remote_url + '?ignore', false, FAIL, true], // Executed in serial.
[remote_url + '?ignore', true, FAIL, true], // Executed in serial.
[
remote_url + '?ACAOrigin=' + host_info['HTTPS_ORIGIN'] + '&ignore',
false, SUCCESS
],
[
remote_url + '?ACAOrigin=' + host_info['HTTPS_ORIGIN'] + '&ignore',
true, FAIL, true // Executed in serial.
],
[
remote_url + '?ACAOrigin=' + host_info['HTTPS_ORIGIN'] +
'&ACACredentials=true&ignore',
true, SUCCESS
],
// Credential test (fallback)
[url + '?Auth&ignore', false, SUCCESS],
[url + '?Auth&ignore', true, SUCCESS],
[remote_url + '?Auth&ignore', false, FAIL],
[remote_url + '?Auth&ignore', true, FAIL],
[
remote_url + '?Auth&ACAOrigin=' + host_info['HTTPS_ORIGIN'] + '&ignore',
false, 'STATUS401'
],
[
remote_url + '?Auth&ACAOrigin=' + host_info['HTTPS_ORIGIN'] + '&ignore',
true, FAIL, true // Executed in serial.
],
[
remote_url + '?Auth&ACAOrigin=' + host_info['HTTPS_ORIGIN'] +
'&ACACredentials=true&ignore',
true, SUCCESS
],
// Basic response
[
url + '?mode=same-origin&url=' + encodeURIComponent(url),
false, SUCCESS
],
[
url + '?mode=same-origin&url=' + encodeURIComponent(url),
false, SUCCESS
],
[
remote_url + '?mode=same-origin&url=' + encodeURIComponent(url),
false, SUCCESS
],
[
remote_url + '?mode=same-origin&url=' + encodeURIComponent(url),
false, SUCCESS
],
// Opaque response
[
url + '?mode=no-cors&url=' + encodeURIComponent(remote_url),
false, FAIL
],
[
url + '?mode=no-cors&url=' + encodeURIComponent(remote_url),
false, FAIL
],
[
remote_url + '?mode=no-cors&url=' + encodeURIComponent(remote_url),
false, FAIL
],
[
remote_url + '?mode=no-cors&url=' + encodeURIComponent(remote_url),
false, FAIL
],
// CORS response
[
url + '?mode=cors&url=' +
encodeURIComponent(remote_url + '?ACAOrigin=' +
host_info['HTTPS_ORIGIN']),
false, SUCCESS
],
[
url + '?mode=cors&url=' +
encodeURIComponent(remote_url + '?ACAOrigin=' +
host_info['HTTPS_ORIGIN']),
true, FAIL
],
[
url + '?mode=cors&url=' +
encodeURIComponent(remote_url + '?ACAOrigin=' +
host_info['HTTPS_ORIGIN'] +
'&ACACredentials=true'),
true, SUCCESS
],
[
remote_url + '?mode=cors&url=' +
encodeURIComponent(remote_url + '?ACAOrigin=' +
host_info['HTTPS_ORIGIN']),
false, SUCCESS
],
[
remote_url +
'?mode=cors&url=' +
encodeURIComponent(remote_url + '?ACAOrigin=' +
host_info['HTTPS_ORIGIN']),
true, FAIL
],
[
remote_url +
'?mode=cors&url=' +
encodeURIComponent(remote_url + '?ACAOrigin=' +
host_info['HTTPS_ORIGIN'] +
'&ACACredentials=true'),
true, SUCCESS
]
];
let counter = 0;
for (let test of TEST_CASES) {
let result = await create_test_case_promise(test[0], test[1]);
let testName = 'test ' + (++counter) + ': ' + test[0] + ' with credentials ' + test[1] + ' must be ' + test[2];
port.postMessage({testName: testName, result: result === test[2]});
}
port.postMessage('done');
}, false);
</script>