2011-01-07 10 views
1

私はwebkitNotifications.createNotificationのデフォルト機能を無効にしようとしていますが、Chrome拡張機能を使用すると、そうするページDOMにスクリプトを挿入できます。問題私は今、バックグラウンドページに埋め込まれているNPAPIに私の要求をプッシュするために、ページDOMからchrome.extension.sendRequestへのアクセスが必要なのです。私は以前、コンテンツスクリプトの実行中に各ページに埋め込みオブジェクトをレンダリングしましたが、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プラグインが含まれたら、それはもはや安全な:)しかし、あなたが正しいのではなく、プラグインへのアクセス権を持っているすべてのページが可能で、できるようにする方がよいですあなたの拡張機能がそれを持っています。私はあなたのプラグインが通常のWebページからアクセスできるかどうかを指定する "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}); 
}); 

は、私は、全体の拡張子(https://gist.github.com/771033)のためのGitHubの上で私の要旨に、あなたの背景ページ内では、あなたのNPAPIプラグインを呼び出すことができると付け加えました。

は、私はそれにこれは本当に素晴らしい男からいくつかの助けを得ることができた。この:)

+0

からきちんとした考えをかぐ、それはあなたを助け願っています。しかし、それは基本的にこれがどのように達成されたかです。あなたの時間をありがとう! [Chromify-osd](http://launchpad.net/chromify-osd) –

+0

私はあなたのコードを見てきました。あなたはすべての単一ページにプラグインを埋め込んでいるようです。あなたのバックグラウンドページが唯一の組み込みプラグインであり、他のページがリクエストを送信するだけの方がいいですか?私が見た別のことは、拡張でNPAPIサポートを使用していないことです。プラグインをマニフェスト経由で拡張機能に組み込んだ場合、プラグインは自動的にブラウザに登録されます。最後に、あなたのマニフェストにパーミッションとして「通知」を含めました。あなたはそれを必要とせず、ページの通知(コンテンツスクリプト)をオーバーライドします。いいね :) –

関連する問題