const EventHandlers = [
{
registerFunc: (controlledframe, name, eventHandler) => {
controlledframe.addEventListener(name, eventHandler);
},
unregisterFunc: (controlledframe, name, eventHandler) => {
controlledframe.removeEventListener(name, eventHandler);
}
},
{
registerFunc: (controlledframe, name, eventHandler) => {
controlledframe['on' + name] = eventHandler;
},
unregisterFunc: (controlledframe, name, eventHandler) => {
controlledframe['on' + name] = null;
}
}
];
async function testEventHanders(controlledFrame, events) {
for (oneEvent of events) {
for (eventHandler of EventHandlers) {
let counter = 0;
const recordAndMaybeRunCallback = function(...args) {
counter++;
if (typeof oneEvent.optionalCallback === 'function') {
oneEvent.optionalCallback(...args);
}
};
eventHandler.registerFunc(
controlledFrame, oneEvent.name, recordAndMaybeRunCallback);
await oneEvent.trigger(controlledFrame);
assert_true(
counter === 1,
`Expected ${
oneEvent.name} to be triggered 1 time, but actually triggered ${
counter} time(s).`);
counter = 0;
eventHandler.unregisterFunc(
controlledFrame, oneEvent.name, recordAndMaybeRunCallback);
await oneEvent.trigger(controlledFrame);
assert_true(
counter === 0,
`Expected ${
oneEvent.name} to be triggered 0 time, but actually triggered ${
counter} time(s).`);
if (oneEvent.resetControlledFrameAfter) {
controlledFrame.remove();
controlledFrame = await createControlledFrame('/simple.html');
}
}
}
};
const WebRequestEvents = [
'authrequired',
'beforeredirect',
'beforerequest',
'beforesendheaders',
'completed',
'headersreceived',
'responsestarted',
'sendheaders',
];
function addWebRequestListeners(controlledframe, targetUrl) {
window.events = [];
const interceptor = controlledframe.request.createWebRequestInterceptor({
urlPatterns: [targetUrl],
resourceTypes: ['main-frame', 'xmlhttprequest'],
});
for (const eventName of WebRequestEvents) {
interceptor.addEventListener(eventName, (e) => {
window.events.push(eventName);
});
}
window.occurredErrors = [];
interceptor.addEventListener('erroroccurred', (e) => {
window.events.push('erroroccurred');
window.occurredErrors.push(e.error);
});
}
function verifyWebRequestEvents(expected) {
if (window.occurredErrors.length > 0) {
console.log(`onErrorOccurred triggered ${
window.occurredErrors.length} times, errors are:\n${
window.occurredErrors
.map((item, index) => `${index + 1}. ${item}`)
.join('\n')}\n`);
}
assert_equals(JSON.stringify(window.events), JSON.stringify(expected));
}