检测Firefox加载项中的选项卡URL更改

tia*_*lva 8 firefox firefox-addon firefox-addon-sdk

我有一个可在Chrome上运行的扩展程序,用于监控活动标签页以查看网址更改.

具体来说,我需要检测URL何时更改,但没有新页面加载或导航.有些网站会这样做(例如,当您点击在YouTube上观看另一个视频时).

在Chrome上,我完成了以下操作:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    if (changeInfo && changeInfo.status == "complete") {
        //do stuff here
    }
});
Run Code Online (Sandbox Code Playgroud)

如何在Firefox插件中检测到此类更改?

我被告知要使用:在所有标签上听取事件,但我无法将它们放在一起.其中一个问题是gBrowser扩展中没有定义.

我究竟做错了什么?

有更简单的方法吗?

Bas*_*evs 4

使用 ProgressListener 来获取有关位置更改的通知。

要安装侦听器,请使用 viewFor 将 SDK 选项卡转换为其原始(旧)表示形式。使用 modelFor 和 getTabForContentWindow 可以进行向后转换。

const tabs = require("sdk/tabs");
const {viewFor} = require('sdk/view/core');
const {modelFor} = require('sdk/model/core');
const {getBrowserForTab, getTabForContentWindow} = require("sdk/tabs/utils");
const {Ci, Cu} = require("chrome");
Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);

var progressListener = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]),
    onLocationChange: function(aProgress, aRequest, aURI) {
        var highLevel= modelFor(getTabForContentWindow(aProgress.DOMWindow));
        console.log("onLocationChange ", highLevel.url);
    }
};

tabs.on('open', function(newTab) {
    var lowLevel = viewFor(newTab);
    var browser = getBrowserForTab(lowLevel);
    browser.addProgressListener(progressListener);
});
Run Code Online (Sandbox Code Playgroud)

不要忘记在扩展卸载时删除监听器。选项卡侦听器会自动删除,但 ProgressListener 不会。

受到转换为 Chrome 窗口的启发

  • 另请注意,在这种情况下,附加组件关闭时不会删除“progressListener”。如果您没有在 [`exports.onUnload()`](https://developer.mozilla.org/en-US/Add-ons/SDK/Tutorials/Listening_for_load_and_unload# 中手动删除它(`removeProgressListener()`) Exports.onUnload%28%29) 在禁用/卸载附加组件后,直到 Firefox 重新启动之前,您会遇到很多错误“TypeError: can't access dead object”。 (3认同)