从页面DOM访问NPAPI

时间:2011-01-07 15:50:08

标签: javascript google-chrome google-chrome-extension

我正在尝试覆盖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>

1 个答案:

答案 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插件。

我希望能帮助你,我从中嗅出一个简洁的想法:)