Выполнение скрипта для изменения html вкладки из service worker

#javascript #google-chrome-extension

#javascript #google-chrome-расширение

Вопрос:

Я пытаюсь перехватить запрос GET с помощью service worker и распечатать выходные данные запроса GET на текущей странице, однако я не могу выполнить какой-либо Javascript на странице…

Вот код расширения, который я использовал (обобщенный для работы со всеми URL-адресами)

manifest.json

 {
  "name": "Getting Started Example",
  "description": "Build an Extension!",
  "version": "1.0",
  "manifest_version": 2,

  "permissions": [
    "webRequest",
    "<all_urls>",
    "activeTab",
    "*://*/*",
    "tabs"
  ],
  
  "background": {
    "service_worker": "background.js"
  }
}
 

background.js

 chrome.webRequest.onBeforeRequest.addListener(
    function(details)
    {
    chrome.tabs.query(
        { currentWindow: true }, 
        function(tabs) 
        {
            chrome.tabs.executeScript(tabs[0].id, 
            {
                code: 'alert("yo")'
            }, function() { });
        });
     return {cancel: false};
  },
  {urls: ["<all_urls>"]},
);
 

Я продолжаю получать сообщение об ошибке Unchecked runtime.lastError: Cannot access contents of url "chrome://extensions/". Extension manifest must request permission to access this host. (хотя я разрешил разрешение для всех URL-адресов и на активной вкладке ??)

Ответ №1:

activeTab Разрешение не требуется, поскольку оно все равно не даст вам доступа к chrome:// страницам (это защищенные страницы пользовательского интерфейса браузера), его назначение другое, подробнее в документации.

Ни в том, ни в другом нет необходимости chrome.tabs.query . Вероятно, вы хотите запустить код на вкладке, на которой был сделан запрос, и в этом случае просто используйте details.tabId , см. Дополнительную информацию в документации.

Нет необходимости service_worker , поскольку он не будет просыпаться для событий WebRequest, что является известной ошибкой в Chrome. Просто используйте стандартный ManifestV2 scripts .

   "background": {
    "scripts": ["background.js"]
  }
 

Также вы можете ограничить types количество запросов только xhr:

 chrome.webRequest.onBeforeRequest.addListener(details => {
  chrome.tabs.executeScript(details.tabId, {
    frameId: details.frameId,
    code: 'console.log('   JSON.stringify(details)   ')',
  }, () => chrome.runtime.lastError); // suppressing errors
}, {
  urls: ['<all_urls>'],
  types: ['xmlhttprequest'],
});
 

Комментарии:

1. Я понимаю избыточность для activeTab и chrome.tabs.query , но почему ваш chrome.tabs.executeScript отличается от моего? (и почему это изменение позволяет ему запускаться?) Обратный вызов с подавлением ошибок?

2. Разница в tabId. Я думаю, что второй абзац объясняет это.