«Не пойманный (в обещании) Ошибка: Разрешение» activeTab «не действует, потому что это расширение не было вызвано». в расширении Chrome

#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 или элементам контекстного меню.