Как только ваше расширение включает в себя плагин NPAPI, оно перестает быть безопасным :) Но вы правильно сделали, вместо того, чтобы каждая страница имела доступ к плагину, лучше позволить вашему расширению иметь его. Я предполагаю, что вы знаете о свойстве "public", которое указывает, можно ли получить доступ к вашему плагину с обычных веб-страниц, по умолчанию установлено значение false.
Ниже я объясню, в чем ваша проблема, это не проблема доступа к NPAPI со страниц DOM, а в основном то, почему ваши уведомления не могут получить доступ к вашему скрипту контента или страницам расширения.
Как вы заметили, доступ к сценариям содержимого и страницам DOM изолирован друг от друга. Единственное, что они разделяют, это DOM. Если вы хотите, чтобы переопределение уведомлений связывалось с вашим скриптом контента, вы должны сделать это в общем DOM. Это объясняется в Связь со страницей встраивания в документации по сценариям содержимого.
Вы можете сделать это так, чтобы ваш контент-скрипт прослушивал такое событие для данных, поступающих из вашей DOM, что-то вроде следующего:
var exportEvent = document.createEvent('Event');
exportEvent.initEvent('notificationCallback', true, true);
window.webkitNotifications.createNotification = function (iconUrl, title, body) {
var n = window.webkitNotifications.createNotification(iconUrl, title, body);
n.show = function() {
var data = JSON.stringify({title: title, body: body, icon: iconUrl});
document.getElementById('transfer-dom-area').innerText = data;
window.dispatchEvent(exportEvent);
};
return n;
}
window.webkitNotifications.createHTMLNotification = function (url) {
var n = window.webkitNotifications.createHTMLNotification(url);
n.show = function() {
var data = JSON.stringify({'url' : url});
document.getElementById('transfer-dom-area').innerText = data;
window.dispatchEvent(exportEvent);
};
return n;
};
Тогда ваш слушатель событий может отправить это на фоновую страницу:
// Listen for that notification callback from your content script.
window.addEventListener('notificationCallback', function(e) {
var transferObject = JSON.parse(transferDOM.innerText);
chrome.extension.sendRequest({NotificationCallback: transferObject});
});
Я добавил это в свою суть на GitHub для всего расширения (https://gist.github.com/771033), На вашей фоновой странице вы можете вызвать свой плагин NPAPI.
Я надеюсь, что это поможет вам, я чувствую изящную идею из этого:)