9

開いているすべてのタブに iframe を挿入するクロム拡張機能があります。background.js に chrome.runtime.onInstalled リスナーがあり、次のように必要なスクリプトを手動で挿入します (API の詳細はこちら: http://developer.chrome.com/extensions/runtime.html#event-onInstalled ):

background.js

  var injectIframeInAllTabs = function(){
    console.log("reinject content scripts into all tabs");
    var manifest = chrome.app.getDetails();
    chrome.windows.getAll({},function(windows){
      for( var win in windows ){
        chrome.tabs.getAllInWindow(win.id, function reloadTabs(tabs) {
          for (var i in tabs) {
            var scripts = manifest.content_scripts[0].js;
            console.log("content scripts ", scripts);
            var k = 0, s = scripts.length;
            for( ; k < s; k++ ) {
              chrome.tabs.executeScript(tabs[i].id, {
                file: scripts[k]
              });
            }

          }
        });
      }
    });
  };

これは、拡張機能を最初にインストールするときに正常に機能します。拡張機能が更新されたときに同じことをしたい。更新時に同じスクリプトを実行しても、新しい iframe が挿入されていません。それだけでなく、更新後にコンテンツ スクリプトにメッセージを送信しようとすると、メッセージがコンテンツ スクリプトに送信されません。SO ( Chrome: message content-script on runtime.onInstalled )で同じ問題が発生している他の人も見ました。古いコンテンツ スクリプトを削除し、Chrome 拡張機能の更新後に新しいコンテンツ スクリプトを挿入する正しい方法は何ですか?

4

2 に答える 2

6

拡張機能が更新されると、Chrome はすべての「古い」コンテンツ スクリプトがバックグラウンド ページと通信するのを自動的に遮断し、古いコンテンツ スクリプトがランタイムと通信しようとすると例外をスローします。これは私にとって欠けていたピースでした。私がしたことは、でchrome.runtime.onInstalledbg.js質問に投稿されたのと同じメソッドを呼び出すことだけでした。これにより、正しいランタイムと通信する別の iframe が挿入されます。ある時点で、古いコンテンツ スクリプトがランタイムと通信しようとしますが、失敗します。その例外をキャッチして、古いコンテンツ スクリプトを一掃します。また、各 iframe は独自の「分離された世界」に挿入されることに注意してください (分離された世界については、こちらで説明しています: http://www.youtube.com/watch?v=laLudeUmXHM )。したがって、新しく挿入された iframe は、古い残留 iframe をクリアできません。

これが将来誰かに役立つことを願っています!

于 2013-08-28T22:58:48.277 に答える