#javascript #google-chrome-extension
Вопрос:
У меня есть <all_urls>
разрешение хоста и activeTab
разрешение, но эта ошибка появляется chrome://extensions/
. Вот мой манифест (с удалением второстепенных деталей):
{
"action": {
"default_icon": {...},
"default_popup": "...",
"default_title": "..."
},
"author": "...",
"background": {
"service_worker": "./some-js-1.js"
},
"content_scripts": [{
"matches": ["<all_urls>"],
"js": ["./some-js-2.js"]
}],
"description": "...",
"host_permissions": [
"<all_urls>"
],
"icons": {...},
"manifest_version": 3,
"name": "...",
"options_page": "...",
"permissions": [
"activeTab",
"storage",
"tabs"
],
"short_name": "...",
"version": "..."
}
В моем фоновом сценарии ( ./some-js-1.js
) это код, который делает снимок экрана:
browser.windows.getCurrent().then(function(win){
browser.tabs.captureVisibleTab(win.id,{
"format":"png"
}).then(function(dataURI){
console.log(dataURI);
// do something with it
});
});
Он работает в большинстве мест, но на chrome://extensions/
нем не работает — даже с <all_urls>
activeTab
разрешениями и.
Процитировать документацию (выделено мной),
Для вызова этого метода расширение должно иметь разрешение <all_urls> или разрешение activeTab<all_urls>. В дополнение к сайтам, к которым расширения обычно могут получить доступ, этот метод позволяет расширениям захватывать конфиденциальные сайты, которые в противном случае ограничены, включая страницы chrome:-схемы, страницы других расширений и URL-адреса данных. Эти конфиденциальные сайты могут быть захвачены только с разрешения activeTab. URL-адреса файлов могут быть записаны только в том случае, если расширению был предоставлен доступ к файлам.
У меня есть и <all_urls>
то , и activeTab
другое, но все еще chrome://extensions
недоступно. Когда я попытался <all_urls>
вставить permissions
ключ, я получил предупреждение, в котором говорилось:,
Permission '<all_urls>' is unknown or URL pattern is malformed.
У меня это host_permissions
есть, потому что я хочу получить доступ ко всем хостам, но все равно кажется, что разрешение не дано (или что я делаю что-то не так).
Как я могу это исправить? Если вам нужна дополнительная информация, пожалуйста, задавайте ее в комментариях.
Комментарии:
1. @Robbi: Я не вводлю никакого кода, я просто делаю снимок экрана. Имеет ли какое-либо значение, вводю ли я код или делаю снимок экрана? В документах говорится , что
chrome:-scheme
страницы можно сделать скриншот, если у вас есть иactiveTab
то, и<all_urls>
другое, поэтому я ожидал, что смогу сделать снимокchrome://extensions
страницы.2. Как говорится в ошибке (в заголовке), captureVisibleTab будет работать только в том случае, если вызывается из прослушивателя, вызванного пользователем .
3. @wOxxOm: Можете ли вы опубликовать это в качестве ответа? Я почти уверен, что это, должно быть, происходит неправильно —
activeTab
разрешение не было активным, потому что оно предоставляет временный доступ к активной вкладке, а не постоянный доступ, какtabs
разрешение, которое я использовал! Эту ошибку мне было очень трудно понять (в основном была трудна часть «в вызове»).
Ответ №1:
Вы не можете вводить в chrome://расширения/
Я поторопился и прочитал не все правильно. Я никогда не использовал «captureVisibleTab», но я быстро прочитал спецификации, и, похоже, вы правильно включили разрешение «activeTab».
С другой стороны, однако, из манифеста ясно, что вы хотите внедрить сценарий на каждую страницу.
Мой совет (который, возможно, ни к чему вас не приведет) — прокомментируйте фрагмент «content_scripts» в манифесте, затем переустановите расширение и посмотрите, будет ли эта ошибка все еще выдана.
Кроме того, я предлагаю вам привязать действие captureVisibleTab в фоновом сценарии к щелчку browserAction или к пункту контекстного меню.
Наконец, нельзя исключать, что в этом API могут быть некоторые ошибки в версии MV3
Комментарии:
1. Хорошо, я попробую ваши предложения позже и вернусь к вам с результатами позже, когда я их опробую.
2. Комментирование содержимого скрипта не помогло. Я думаю, что у @wOxxOm есть ответ (и у вас тоже) на этот
activeTab
вопрос, который дает только временный доступ к активной вкладке. Спасибо!3. идеально, как мы оба вам предлагаем, привязать этот вызов api к browserAction или элементам контекстного меню.