Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Override JavaScript function from browser extension

I am creating a web extension to help detecting postMessage activity in websites. Therefore, I want to detect it when a page attaches a message event listener, for example by calling this code:

window.addEventListener("message", ...)

Apparently it is not possible to get a list of event listeners. My next idea was to override addEventListener, so I can detect calls to it:

window.addEventListener = function(type) {
    if (type == "message") {
        // do something
    }
}

I have trouble injecting this code into the page:

  • A content script can access the DOM of each page, but not the window object. Changing the window.addEventListener on the content page has no effect on the actual page.
  • I can add a script element by modifying the DOM, but I have trouble getting the timing right. My script would need to run before any other script, and this method only works if there is already a DOM.
  • Functions like chrome.tabs.executeScript work on a specific tab, and I want to run code on every page. This differs if a page has iframes, where I also want to override addEventListener.

How can I override window.addEventListener globally from my extension? Or alternatively, is there another way to detect an event listener on message events?

like image 468
Sjoerd Avatar asked Feb 15 '18 14:02

Sjoerd


People also ask

Can you override JavaScript functions?

Introduction. It is true that JavaScript supports overriding, not overloading. When you define multiple functions that have the same name, the last one defined will override all the previously defined ones and every time when you invoke a function, the last defined one will get executed.

How do I override JavaScript in chrome?

Choose a file like a Javascript or CSS files, right click it and choose "Save for overrides." The file you choose will now appear in the Overrides tab. Now, any changes you make to the file will persist throughout page reloads and navigating pages in the website as long as the devtools is running.

What is JS override?

Overriding a method replaces the code of the method in the superclass with that of the subclass.


1 Answers

To override a function, you need to run JavaScript before the page loads. You need to do the following:

  • In the manifest.json, specify that the content script is run before the document is loaded by setting run_at to document_start.
  • From the content script, inject static code into the page. Don't use an URL, but create a script tag that contains the code. I.e. script.textContent = actualCode and not script.src = url.
like image 70
Sjoerd Avatar answered Sep 19 '22 09:09

Sjoerd