Javascript 从DOM页面访问NPAPI

Javascript 从DOM页面访问NPAPI,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我试图覆盖webkitNotifications.createNotification的默认功能,并通过一个Chrome扩展,我能够在页面DOM中插入一个这样做的脚本。我现在遇到的问题是,我需要从pages DOM访问chrome.extension.sendRequest,以便将我的请求推送到我嵌入到后台页面中的NPAPI。我以前在内容脚本执行期间在每个页面上都呈现了嵌入对象,但我相信如果NPAPI嵌入到扩展中而不是在每个页面上注入,则会更有效(更安全) if (window.webkitNo

我试图覆盖webkitNotifications.createNotification的默认功能,并通过一个Chrome扩展,我能够在页面DOM中插入一个这样做的脚本。我现在遇到的问题是,我需要从pages 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>

var osd=document.getElementById('plugz');
函数processReq(req、发送方、回调)
{
osd通知(请求标题、请求正文、请求图像);
日志(“NOTIFY!”,req.title,req.body,req.image);
};
chrome.extension.onRequest.addListener(processReq);

一旦您的扩展包含NPAPI插件,它就不再安全:)但是您的正确做法是,与其让每个页面都可以访问该插件,不如让您的扩展拥有它。我假设您知道“public”属性,该属性指定您的插件是否可以被常规网页访问,默认值为false

下面,我将解释您的问题是什么,这不是从DOM页面访问NPAPI的问题,这基本上是为什么您的通知不能访问您的内容脚本或扩展页面

正如您所注意到的,对内容脚本和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上为整个扩展()添加了这个要点,在您的背景页面中,您可以调用您的NPAPI插件


我希望这能帮到你,我从中嗅到一个好主意:)

一旦你的扩展包含一个NPAPI插件,它就不再安全了:)但是你的正确答案是,与其让每个页面都可以访问该插件,不如让你的扩展拥有它。我假设您知道“public”属性,该属性指定您的插件是否可以被常规网页访问,默认值为false

下面,我将解释您的问题是什么,这不是从DOM页面访问NPAPI的问题,这基本上是为什么您的通知不能访问您的内容脚本或扩展页面

正如您所注意到的,对内容脚本和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上为整个扩展()添加了这个要点,在您的背景页面中,您可以调用您的NPAPI插件


我希望这能帮到你,我闻到了一个好主意:)

我能从这个非常棒的家伙那里得到一些帮助。然而,这基本上就是如何实现的。谢谢你抽出时间!我只是看了一下你的代码,看起来你在每个页面都嵌入了这个插件。如果你的背景页面是唯一的嵌入式插件,而其他页面只是向它发送请求,这不是更好吗?我看到的另一件事是,您没有在扩展中使用NPAPI支持。如果您通过清单将插件包括在扩展中,那么插件将自动在浏览器中注册。最后一件事,您已经将“通知”作为权限包含在清单中,您不需要这样做,您可以覆盖页面通知(内容脚本)。看起来不错:)我从这个非常棒的家伙那里得到了一些帮助。然而,这基本上就是如何实现的。谢谢你抽出时间!我只是看了一下你的代码,看起来你在每个页面都嵌入了这个插件。如果你的背景页面是唯一的嵌入式插件,而其他页面只是向它发送请求,这不是更好吗?我看到的另一件事是,您没有在扩展中使用NPAPI支持。如果您通过清单将插件包括在扩展中,那么插件将自动在浏览器中注册。最后一件事,您已经将“通知”作为权限包含在清单中,您不需要这样做,您可以覆盖页面通知(内容脚本)。看起来不错:)