检测 FF 附加组件中的导航

Detecting navigation in FF add ons

我正在使用 'FF Addon SDK' 将 Chrome 扩展移植到 FF。在后台脚本 (main.js) 文件中,我需要使用 FF 等价于...

chrome.webNavigation.onBeforeNavigate.addListener()

chrome.tabs.onUpdated.addListener()

我注意到require("sdk/tabs").on只有open, close, finish等,与导航无关

我看到一些使用 Page-Mod 的解决方案或展示了开发 FF 扩展的旧 XUL 方式的解决方案。我正在专门寻找 FF Addon SDK(仅)解决方案。

感谢任何意见。

编辑:我能够通过使用 Progress Listener 找出 chrome.tabs.onUpdated.addListener() 的替代方案。显然,在 FF 中它被称为 onLocationChange。仍在寻找 chrome.webNavigation.onBeforeNavigate.addListener()

的替代品

很遗憾,chrome.webNavigation.onBeforeNavigate.addListener() 没有合适的替代品。 一周前发现自己处于同样的情况。尝试将 nsIWebProgressListener.onStateChange 用于 STATE_START。没有按预期工作。 你最好的选择是: 1.) 使用 onLocationChange 事件,它会为您提供正在加载的位置的 URI。 2.) 拦截Httprequest。为顶级筛选出一个并调用它 onbeginnavigate。

如果您找到其他方法,请告诉我。

好的,我设法弄明白了。我们需要使用 onStateChange 侦听器。为了模仿 onBeforeNavigation,我们不仅需要检查 STATE_START,还要检查 STATE_IS_DOCUMENT.

var progressListener = {
    QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]),

    onLocationChange: function(aWebProgress, aRequest, aURI) {
        if (aRequest && aURI) {
            console.log('onLocationChange: ' + aURI.spec);
        }
    },

    onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
        var status = Ci.nsIWebProgressListener;

        if(aStateFlags&status.STATE_START && aStateFlags&status.STATE_IS_DOCUMENT) {
            console.log('onStateChange: ' + aRequest.QueryInterface(Ci.nsIChannel).originalURI.spec);
        }
    }
};

您可以从您的框架脚本中附加一个 onBeforeUnload/onUnload 事件。