我正在尝试覆盖webkitNotifications.createNotification的默认功能,并且通过Chrome扩展程序,我能够在页面DOM中注入一个脚本来执行此操作。我现在遇到的问题是我需要从DOM页面访问chrome.extension.sendRequest
,以便将我的请求推送到我在后台页面中嵌入的NPAPI。我以前在执行内容脚本期间在每个页面上呈现了嵌入对象 - 但是如果NPAPI嵌入在未在每个页面上注入的扩展中,则认为它更有效(且更安全)。
if (window.webkitNotifications)
{
(function()
{
window.webkitNotifications.originalCreateNotification = window.webkitNotifications.createNotification;
window.webkitNotifications.createNotification = function (iconUrl, title, body) {
var n = window.webkitNotifications.originalCreateNotification(iconUrl, title, body);
n.original_show = n.show;
n.show = function ()
{
console.log("Chrome object", chrome);
console.log("Chrome.extension object", chrome.extension);
chrome.extension.sendRequest({'title' : title, 'body' : body, 'icon' : iconUrl});
}
return n;
}
})();
}
这是作为脚本元素在DOM中注入的内容。背景页面如下:
<embed type="application/x-npapiplugz" id="plugz">
<script>
var osd = document.getElementById('plugz');
function processReq(req, sender, callback)
{
osd.notify(req.title, req.body, req.image);
console.log("NOTIFY!", req.title, req.body, req.image);
};
chrome.extension.onRequest.addListener(processReq);
</script>
答案 0 :(得分:1)
一旦你的扩展程序包含NPAPI插件,它就不再安全了:)但是你的正确,而不是允许每个页面都可以访问该插件,最好让你的扩展程序拥有它。我假设您了解“public”属性,该属性指定您的插件是否可以通过常规网页访问,默认为false。
下面,我将解释您的问题是什么,它不是从DOM页面访问NPAPI的问题,它基本上是为什么您的通知无法访问您的内容脚本或扩展页面。
正如您所注意到的,对内容脚本和页面DOM的访问是相互隔离的。他们唯一分享的是DOM。如果希望通知覆盖与内容脚本进行通信,则必须在共享DOM中执行此操作。内容脚本文档中的Communication with the embedding page对此进行了解释。
您可以通过事件方式执行此操作,您的内容脚本会在此类事件中侦听来自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插件。
我希望能帮助你,我从中嗅出一个简洁的想法:)