webscanner
Version:
Automation scanner for web resources
68 lines (61 loc) • 1.73 kB
JavaScript
const { enrichURLDetails } = require('../utils');
let started = false;
async function start(context) {
started = true;
await context.client.Page.enable();
registerFrameEvents(context.client, context.data.frames);
}
async function stop(context) {
if (!started) {
return;
}
return Object.keys(context.data.frames).map((id) => context.data.frames[id]);
}
function registerFrameEvents(client, frames) {
client.Page.frameStartedLoading((frame) => {
handleIframeEvent(frame, 'loading', frames);
});
client.Page.frameNavigated(({ frame }) => {
handleIframeEvent(frame, 'navigated', frames);
});
client.Page.frameStoppedLoading((frame) => {
handleIframeEvent(frame, 'stopped', frames);
});
client.Page.frameAttached((frame) => {
handleIframeEvent(frame, 'attached', frames);
});
client.Page.frameDetached((frame) => {
handleIframeEvent(frame, 'detached', frames);
});
client.Page.frameResized((frame) => {
handleIframeEvent(frame, 'resized', frames);
});
try {
client.Page.frameRequestedNavigation((frame) => {
handleIframeEvent(frame, 'requestNavigation', frames);
});
client.Page.navigatedWithinDocument((frame) => {
handleIframeEvent(frame, 'navigatedWithinDocument', frames);
});
} catch (e) {
//ignore
}
}
function handleIframeEvent(frameObj, state, frames) {
const id = frameObj.frameId || frameObj.id;
let frame = frames[id];
if (!frame) {
frame = frameObj;
enrichURLDetails(frameObj, 'url');
frame.states = [state];
frames[id] = frame;
} else {
delete frameObj.frameId;
frames[id] = { ...frameObj, ...frame };
frames[id].states.push(state);
}
}
module.exports = {
start,
stop,
};