Chrome extension: invoke script page by injection

Is it possible to embed a javascript file in the DOM and execute it immediately? I want to call javascript functions inside a / DOM page. Single content script will not work due to isolated worlds. To use chrome.tabs.executeScript() , a background page is required.

A simple example:
DOM javascript

 function sayHello(){ alert('Hello World'); } 

Javascript file for input

 console.log('Injection complete. Now calling DOM script.'); sayHello(); 
+4
source share
1 answer

Here are my two favorite ways ...

 // Executing an anonymous script function exec(fn) { var script = document.createElement('script'); script.setAttribute("type", "application/javascript"); script.textContent = '(' + fn + ')();'; document.documentElement.appendChild(script); // run the script document.documentElement.removeChild(script); // clean up } script = function() { //sayHello(); alert('hello'); } exec(script); // Append a script from a file in your extension function appendScript(scriptFile) { var script = document.createElement('script'); script.setAttribute("type", "application/javascript"); script.setAttribute("src", chrome.extension.getURL(scriptFile)); document.documentElement.appendChild(script); // run the script } appendScript('someFile.js'); 

Also chrome.tabs.executeScript() can be used from a browser / page popup, and the above code works with script content as well.

EDIT
Thanks to comments from @renocor, a variant of the first method is proposed here, which allows you to send arguments to the function you enter ....

 function exec(fn) { var args = ''; if (arguments.length > 1) { for (var i = 1, end = arguments.length - 2; i <= end; i++) { args += typeof arguments[i]=='function' ? arguments[i] : JSON.stringify(arguments[i]) + ', '; } args += typeof arguments[i]=='function' ? arguments[arguments.length - 1] : JSON.stringify(arguments[arguments.length - 1]); } var script = document.createElement('script'); script.setAttribute("type", "application/javascript"); script.textContent = '(' + fn + ')(' + args + ');'; document.documentElement.appendChild(script); // run the script document.documentElement.removeChild(script); // clean up } script = function(what, huh, nah, yeah) { console.debug(arguments); console.debug('what=', what); console.debug('huh=', huh); console.debug('nah=', nah); console.debug('yeah=', yeah); if (typeof yeah=='function') yeah(); } exec(script, 'meh', ['bleh'], { a: { b: 0 } }, function(){ alert('hi'); }); console.debug('No arguments'); exec(script); 
+5
source

Source: https://habr.com/ru/post/1403866/


All Articles