1. /* global chrome */
    
  2. 
    
  3. // Firefox doesn't support ExecutionWorld.MAIN yet
    
  4. // https://bugzilla.mozilla.org/show_bug.cgi?id=1736575
    
  5. function executeScriptForFirefoxInMainWorld({target, files}) {
    
  6.   return chrome.scripting.executeScript({
    
  7.     target,
    
  8.     func: fileNames => {
    
  9.       function injectScriptSync(src) {
    
  10.         let code = '';
    
  11.         const request = new XMLHttpRequest();
    
  12.         request.addEventListener('load', function () {
    
  13.           code = this.responseText;
    
  14.         });
    
  15.         request.open('GET', src, false);
    
  16.         request.send();
    
  17. 
    
  18.         const script = document.createElement('script');
    
  19.         script.textContent = code;
    
  20. 
    
  21.         // This script runs before the <head> element is created,
    
  22.         // so we add the script to <html> instead.
    
  23.         if (document.documentElement) {
    
  24.           document.documentElement.appendChild(script);
    
  25.         }
    
  26. 
    
  27.         if (script.parentNode) {
    
  28.           script.parentNode.removeChild(script);
    
  29.         }
    
  30.       }
    
  31. 
    
  32.       fileNames.forEach(file => injectScriptSync(chrome.runtime.getURL(file)));
    
  33.     },
    
  34.     args: [files],
    
  35.   });
    
  36. }
    
  37. 
    
  38. export function executeScriptInIsolatedWorld({target, files}) {
    
  39.   return chrome.scripting.executeScript({
    
  40.     target,
    
  41.     files,
    
  42.     world: chrome.scripting.ExecutionWorld.ISOLATED,
    
  43.   });
    
  44. }
    
  45. 
    
  46. export function executeScriptInMainWorld({target, files}) {
    
  47.   if (__IS_FIREFOX__) {
    
  48.     return executeScriptForFirefoxInMainWorld({target, files});
    
  49.   }
    
  50. 
    
  51.   return chrome.scripting.executeScript({
    
  52.     target,
    
  53.     files,
    
  54.     world: chrome.scripting.ExecutionWorld.MAIN,
    
  55.   });
    
  56. }