#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. Я думаю, что второй абзац объясняет это.