Нет, нет никакого способа добавить пользовательский контекст.
Что вы можете сделать, это зарегистрировать дополнительный элемент меню в "page"
контексте с отдельным id
и динамически показать / скрыть его с помощьюmousedown
прослушиватель событий в скрипте содержимого. Слушатель будет запущен до события contextmenu
и уведомит фоновый скрипт, если цель события включает в себя img / media. Фоновый сценарий будет использовать API-интерфейс chrome.contextMenus для переключения пункта меню.
сценарий содержимого :
// true means 'useCapture' mode (the first event phase)
window.addEventListener('mousedown', e => button === 2 && beforeContextMenu(e), true);
window.addEventListener('keydown', e => {
if (e.key === 'ContextMenu' ||
e.key === 'F10' && e.shiftKey && !e.altKey && !e.ctrlKey && !e.metaKey) {
beforeContextMenu(e);
}
}, true);
function beforeContextMenu(e) {
const el = !e.target.matches('img, video, audio') &&
e.target.querySelector('img, video, audio');
chrome.runtime.sendMessage({
contextMenu: el ? el.currentSrc || el.src : '',
});
}
фоновый сценарий :
chrome.runtime.onMessage.addListener((message, sender) => {
if (message.contextMenu) {
chrome.contextMenus.create({
id: 'printData:page',
title: 'print',
contexts: ['page'],
}, ignoreChromeError);
} else if (message.contextMenu === '') {
chrome.contextMenus.remove('printData:page', ignoreChromeError);
}
});
chrome.runtime.onInstalled.addListener(() => {
chrome.contextMenus.create({
id: 'printData',
title: 'print',
contexts: ['image', 'audio', 'video'],
}, ignoreChromeError);
});
chrome.contextMenus.onClicked.addListener(e => {
if (e.menuItemId.startsWith('printData')) {
console.log(e);
}
});
function ignoreChromeError() {
return chrome.runtime.lastError;
}
Однако в этом упрощенном примере элемент меню будет переключаться глобально для всех вкладок. Chrome API не может переключать меню для каждой вкладки, поэтому вам может потребоваться использовать documentUrlPatterns для указания URL-адресов вкладок, но это крайний случай, который, вероятно, не стоит использовать.