J'ai écrit une extension Chrome qui devait déterminer quels éléments de la page réagissaient aux clics. Voici comment j'ai procédé :
(1) Dans manifest.json, définissez l'attribut "run_at" à "document_start". (Nous devons injecter un script avant que la page ne commence à s'exécuter).
(2) Dans votre contenu script, ajoutez un peu de code pour injecter un script dans la page qui surchargera EventTarget.prototype.addEventListener pour marquer tous les éléments qui sont dynamiquement assignés à des écouteurs de clics :
let flagClickHandledElements = function() {
let oldEventListener = EventTarget.prototype.addEventListener;
EventTarget.prototype.addEventListener = function(event_name, handler_func) {
if (event_name === 'click') {
if (this.setAttribute) {
this.setAttribute('data-has_click_handler', true);
}
}
if (oldEventListener)
oldEventListener(event_name, handler_func);
}
}
function injectScript(func) {
let codeString = '(' + func + ')();';
let script = document.createElement('script');
script.textContent = codeString;
(document.head||document.documentElement).appendChild(script);
}
injectScript(flagClickHandledElements);
(3) Ajoutez "webNavigation" à votre liste de "permissions" dans manifest.json
(4) Ajoutez du code à votre arrière-plan script pour avertir le contenu script lorsque le chargement de la page est terminé :
function onPageDoneLoading(details)
{
chrome.tabs.sendMessage(details.tabId, {"action": "doneloading"});
}
chrome.webNavigation.onCompleted.addListener(onPageDoneLoading);
(5) Lorsque la page finit de se charger, faites en sorte que votre contenu script injecte un autre script dans la page qui analyse tous les éléments de la page à la recherche de gestionnaires "onclick" à l'ancienne :
let gatherOldStyleClickHandledElements = function() {
let all_elements = document.getElementsByTagName("*");
for (let i = 0; i < all_elements.length; i++) {
let el = all_elements[i];
if (el.setAttribute && el.onclick) {
el.setAttribute('data-has_click_handler', true);
}
}
}
function onReceiveMessage(request) {
if (request.action === 'doneloading') {
injectScript(gatherOldStyleClickHandledElements);
} else {
console.log('Unrecognized message');
}
return Promise.resolve("Dummy response to keep the console quiet");
}
(6) Enfin, vous pouvez tester un élément de votre contenu script pour voir s'il possède un gestionnaire de clic comme ceci :
if (el.getAttribute('data-has_click_handler'))
console.log('yep, this element has a click handler');