1

Web ページが変更されるたびにイベントを発生させる Android 用の Firefox 拡張機能を作成しようとしています。どの URL がロードされているか (すべての URL)、およびロードされたページのコンテンツ (DOM インスペクションを介して) を監視しています。私の問題は、以下のコードを使用したウィンドウ ロード イベントは、タブが開かれたときにのみロードされることです。ページから移動すると、イベントは発生しません。

任意の URL のすべてのページ読み込みイベントにフックするにはどうすればよいですか?

このコードは、bootstrap.js の内容全体です。

Components.utils.import("resource://gre/modules/Services.jsm");
var windowListener = {
  onOpenWindow: function(aWindow) {
    console.log('vipro.openWindow');
    let domWindow = aWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindowInternal || Components.interfaces.nsIDOMWindow);
    domWindow.addEventListener("UIReady", function onLoad() {
      domWindow.removeEventListener("UIReady", onLoad, false);
      console.log('vipro.openWindow.loaded');
      // ** ONLY EVER FIRED ONCE ** //
      try {
        var browser = Services.wm.getMostRecentWindow("navigator:browser");
      } catch(e) {
        console.log('vipro.openWindow.error.' + e.toString());
      }
      console.log('vipro.openWindow.loaded.DONE');
    });
    console.log('vipro.openWindow.DONE');
  },
  onCloseWindow: function(aWindow) {},
  onWindowTitleChange: function(aWindow, aTitle) {},
};

function startup(data, reason) {
  console.log('vipro.startup');
  try {
    let wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator);
    wm.addListener(windowListener);
  } catch(e) {
     console.log('vipro.startup.error.' + e.toString());
  }
  console.log('vipro.startup.DONE');
}

function shutdown() {
  console.log('vipro.shutdown');
}

function install(aData, aReason) {}
function uninstall(aData, aReason) {}

上記のコードが新しいタブでのみ機能し、既存のものではないことを気にしていません(意図的にシンプルにしています)。最初の新しいタブページから移動すると、機会が得られないという事実だけです他のページにフックします。

4

1 に答える 1

1

このページで少し異なるアプローチを見つけました:

https://developer.mozilla.org/en-US/Add-ons/SDK/Tutorials/Mobile_development

cfx が提供するレイアウトを使用し、ブートストラップを使用しません...ブートストラップは、page-mod を使用して必要なものを達成できます。

于 2015-03-22T07:52:45.500 に答える