В создаваемом расширении Chrome я пытаюсь реализовать следующую логику:
- Если сценарий содержимого может быть внедрен в текущую страницу после действия пользователя (на основании разрешения activeTab), отобразите пункт контекстного меню.
- Иначе, не отображать его.
Однако, выполнив поиск по максимуму и минимуму в документации по MDN и Chrome, я не смог найти встроенный API для проверки этого.
Мой текущий обходной путь заключается в следующем (используя webextension-polyfill для основанного на обещаниях browser
API):
const checkAvailability = () => {
const getTabInfo = browser.tabs.query({active: true, currentWindow: true});
const getErrorInfo = browser.tabs.executeScript({
code: '' //noop
}).then(res => null, err => err);
return Promise.all([getTabInfo, getErrorInfo]).then((info) => {
const [tabs, err] = info;
const permissionsNotRequestedMsg = 'Cannot access contents of the page. Extension manifest must request permission to access the respective host.';
return !err || (err.message === permissionsNotRequestedMsg && tabs[0].url !== 'chrome://newtab/');
// on new tab page, `permissionsNotRequestedMsg` is always shown; on other pages,
// this error simply means user has not yet initiated any extension-related action;
// any other error message means the page cannot be accessed by extensions
});
};
Это кажется хакерским, но работает в почти во всех ситуациях. Единственная ситуация, когда происходит сбой, - это когда URL вкладки имеет значение chrome://newtab/
и , пока еще не было инициировано никаких действий пользователя. В этом случае tabs.query
не возвращает информацию об URL, поэтому tabs[0].url
равно undefined
.
Есть ли способ обойти это ограничение? Или, в качестве альтернативы, можно ли как-то отобразить сообщение пользователю, если попытка доступа к расширению из chrome://newtab/
не удалась, без запроса дополнительных разрешений в манифесте?