async function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
promise_test(async (test) => {
const controlledframe = await createControlledFrame('/simple.html', 'auth1');
controlledframe.stop();
const targetUrl = new URL(controlledframe.src);
targetUrl.pathname = '/auth-basic';
targetUrl.search = '*';
addWebRequestListeners(controlledframe, targetUrl.toString());
controlledframe.request.createWebRequestInterceptor({
urlPatterns: [targetUrl.toString()],
blocking: true,
}).addEventListener('authrequired', (e) => {
e.setCredentials(new Promise((resolve) => {
sleep(1);
resolve({
username: '',
password: 'PASS',
});
}));
});
targetUrl.search = 'password=PASS&realm=REALM';
await navigateControlledFrame(controlledframe, targetUrl.toString());
verifyWebRequestEvents([
'beforerequest',
'beforesendheaders',
'sendheaders',
'headersreceived',
'authrequired',
'responsestarted',
'completed',
]);
}, 'WebRequest Auth Async');
promise_test(async (test) => {
const controlledframe = await createControlledFrame('/simple.html', 'auth2');
controlledframe.stop();
const targetUrl = new URL(controlledframe.src);
targetUrl.pathname = '/auth-basic';
targetUrl.search = '*';
addWebRequestListeners(controlledframe, targetUrl.toString());
controlledframe.request.createWebRequestInterceptor({
urlPatterns: [targetUrl.toString()],
blocking: true,
}).addEventListener('authrequired', (e) => {
e.setCredentials({
username: '',
password: 'PASS',
});
});
targetUrl.search = 'password=PASS&realm=REALM';
await navigateControlledFrame(controlledframe, targetUrl.toString());
verifyWebRequestEvents([
'beforerequest',
'beforesendheaders',
'sendheaders',
'headersreceived',
'authrequired',
'responsestarted',
'completed',
]);
}, 'WebRequest Auth Sync');
promise_test(async (test) => {
const controlledframe = await createControlledFrame('/simple.html', 'noauth');
controlledframe.stop();
const targetUrl = new URL(controlledframe.src);
targetUrl.pathname = '/auth-basic';
targetUrl.search = '*';
addWebRequestListeners(controlledframe, targetUrl.toString());
controlledframe.request.createWebRequestInterceptor({
urlPatterns: [targetUrl.toString()],
blocking: true,
}).addEventListener('authrequired', (e) => {
e.setCredentials({
username: '',
password: 'WRONG_PASSWORD',
});
});
targetUrl.search = 'password=PASS&realm=REALM';
try {
await navigateControlledFrame(controlledframe, targetUrl.toString());
} catch (e) {}
assert_false(window.events.includes('completed'), 'completed fired');
assert_true(window.events.includes('authrequired'), 'authrequired fired');
assert_equals(
window.events.slice(-1)[0], 'erroroccurred', 'erroroccurred fired');
assert_equals(
window.occurredErrors[0], 'net::ERR_TOO_MANY_RETRIES', 'error code');
}, 'WebRequest Auth Fail');
promise_test(async (test) => {
const controlledframe = await createControlledFrame('/simple.html', 'noauth');
controlledframe.stop();
const targetUrl = new URL(controlledframe.src);
targetUrl.pathname = '/auth-basic';
targetUrl.search = '*';
addWebRequestListeners(controlledframe, targetUrl.toString());
const interceptor = controlledframe.request.createWebRequestInterceptor({
urlPatterns: [targetUrl.toString()],
blocking: true,
});
interceptor.addEventListener('authrequired', (e) => {
e.preventDefault();
});
let statusCode = -1;
interceptor.addEventListener('completed', (e) => {
statusCode = e.response.statusCode;
});
targetUrl.search = 'password=PASS&realm=REALM';
await navigateControlledFrame(controlledframe, targetUrl.toString());
verifyWebRequestEvents([
'beforerequest',
'beforesendheaders',
'sendheaders',
'headersreceived',
'authrequired',
'responsestarted',
'completed',
]);
assert_equals(statusCode, 401);
}, 'WebRequest Auth Cancel Sync');
promise_test(async (test) => {
const controlledframe = await createControlledFrame('/simple.html', 'noauth');
controlledframe.stop();
const targetUrl = new URL(controlledframe.src);
targetUrl.pathname = '/auth-basic';
targetUrl.search = '*';
addWebRequestListeners(controlledframe, targetUrl.toString());
const interceptor = controlledframe.request.createWebRequestInterceptor({
urlPatterns: [targetUrl.toString()],
blocking: true,
});
interceptor.addEventListener('authrequired', (e) => {
const controller = new AbortController();
e.setCredentials(new Promise(() => {}), {signal: controller.signal});
sleep(1).then(() => {
controller.abort();
});
});
let statusCode = -1;
interceptor.addEventListener('completed', (e) => {
statusCode = e.response.statusCode;
});
targetUrl.search = 'password=PASS&realm=REALM';
await navigateControlledFrame(controlledframe, targetUrl.toString());
verifyWebRequestEvents([
'beforerequest',
'beforesendheaders',
'sendheaders',
'headersreceived',
'authrequired',
'responsestarted',
'completed',
]);
assert_equals(statusCode, 401);
}, 'WebRequest Auth Cancel AbortSignal');
promise_test(async (test) => {
const controlledframe = await createControlledFrame('/simple.html', 'noauth');
controlledframe.stop();
const targetUrl = new URL(controlledframe.src);
targetUrl.pathname = '/auth-basic';
targetUrl.search = '*';
addWebRequestListeners(controlledframe, targetUrl.toString());
const interceptor = controlledframe.request.createWebRequestInterceptor({
urlPatterns: [targetUrl.toString()],
blocking: true,
});
interceptor.addEventListener('authrequired', (e) => {
const controller = new AbortController();
controller.abort();
e.setCredentials(new Promise(() => {}), {signal: controller.signal});
});
let statusCode = -1;
interceptor.addEventListener('completed', (e) => {
statusCode = e.response.statusCode;
});
targetUrl.search = 'password=PASS&realm=REALM';
await navigateControlledFrame(controlledframe, targetUrl.toString());
verifyWebRequestEvents([
'beforerequest',
'beforesendheaders',
'sendheaders',
'headersreceived',
'authrequired',
'responsestarted',
'completed',
]);
assert_equals(statusCode, 401);
}, 'WebRequest Auth Cancel Preaborted AbortSignal');
promise_test(async (test) => {
const controlledframe = await createControlledFrame('/simple.html', 'noauth');
controlledframe.stop();
const targetUrl = new URL(controlledframe.src);
targetUrl.pathname = '/auth-basic';
targetUrl.search = '*';
addWebRequestListeners(controlledframe, targetUrl.toString());
const interceptor = controlledframe.request.createWebRequestInterceptor({
urlPatterns: [targetUrl.toString()],
blocking: true,
});
interceptor.addEventListener('authrequired', (e) => {
});
let statusCode = -1;
interceptor.addEventListener('completed', (e) => {
statusCode = e.response.statusCode;
});
targetUrl.search = 'password=PASS&realm=REALM';
await navigateControlledFrame(
controlledframe, targetUrl.toString(), true);
verifyWebRequestEvents([
'beforerequest',
'beforesendheaders',
'sendheaders',
'headersreceived',
'authrequired',
'responsestarted',
'completed',
]);
assert_equals(statusCode, 401);
}, 'WebRequest Auth Noop');