webscanner
Version:
Automation scanner for web resources
62 lines (54 loc) • 1.87 kB
JavaScript
/**
* @expirimental
* @param client
* @return {Promise<[]>}
*/
async function getAllDOMEvents(client) {
const DOMEvents = [];
let evaluationRes = await client.Runtime.evaluate({
expression: 'document.querySelectorAll("*");',
});
const { result } = await client.Runtime.getProperties({
objectId: evaluationRes.result.objectId,
});
const elementsObjects = result.map((e) => e.value);
for (let i = 0; i < elementsObjects.length; i++) {
const object = elementsObjects[i];
if (!object || !object.objectId) {
continue;
}
const events = await client.DOMDebugger.getEventListeners({
objectId: object.objectId,
});
for (let i = 0; i < events.listeners.length; i++) {
delete object.objectId;
delete object.subtype;
delete object.type;
DOMEvents.push({ ...events.listeners[i], ...object });
}
}
evaluationRes = await client.Runtime.evaluate({ expression: 'document' });
const documentEvents = await client.DOMDebugger.getEventListeners({
objectId: evaluationRes.result.objectId,
});
if (documentEvents && documentEvents.listeners) {
for (let i = 0; i < documentEvents.listeners.length; i++) {
const object = { className: 'HTMLDocument', description: 'document' };
DOMEvents.push({ ...documentEvents.listeners[i], ...object });
}
}
evaluationRes = await client.Runtime.evaluate({ expression: 'window' });
const windowEvents = await client.DOMDebugger.getEventListeners({
objectId: evaluationRes.result.objectId,
});
if (windowEvents && windowEvents.listeners) {
for (let i = 0; i < windowEvents.listeners.length; i++) {
const object = { className: 'Window', description: 'Window' };
DOMEvents.push({ ...windowEvents.listeners[i], ...object });
}
}
return DOMEvents;
}
module.exports = {
getAllDOMEvents,
};