2011-01-07 120 views
1

我試圖重寫webkitNotifications.createNotification的默認功能,並通過Chrome擴展我可以在頁面DOM中注入一個腳本,這樣做。我現在遇到的問題是我需要訪問網頁DOM中的chrome.extension.sendRequest,以便將我的請求推送到已嵌入後臺頁面的NPAPI。我以前在內容腳本的執行過程中在每個頁面上呈現了嵌入對象 - 但是如果NPAPI嵌入在沒有注入每個頁面的擴展中,則認爲它更有效(且安全)。從頁面訪問NPAPI DOM

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

一旦你的擴展包含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插件。

我希望可以幫助你,我聞到這個:)

+0

我能夠從它這真的真棒傢伙得到一些幫助一個不錯的主意。但基本上這是如何完成的。感謝您的時間! [Chromify-osd](http://launchpad.net/chromify-osd) – 2011-01-08 22:33:03