火狐浏览器插件window.addEventListener错误:没有定义的窗口(Firefox A

2019-10-19 14:22发布

我试图遵循本教程创建一个Firefox的插件,拦截时,在地址栏更改URL:

https://developer.mozilla.org/en-US/Add-ons/Code_snippets/Progress_Listeners#Example:_Notification_when_the_value_in_Address_Bar_changes

我刚才复制的代码,只是增加了一个警告,看看它的工作原理,但我不能以任何方式运行。

我的代码是:

const {Cu} = require("chrome");
Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);

var urlListener = {
    oldURL: null,

    init: function() {
        gBrowser.addProgressListener(this);
    },

    uninit: function() {
        gBrowser.removeProgressListener(this);
    },

    processNewURL: function(aURI) {
        if (aURI.spec == this.oldURL) return;

        // now we know the url is new...
        alert(aURI.spec);
        this.oldURL = aURI.spec;
    },

    // nsIWebProgressListener
    QueryInterface: XPCOMUtils.generateQI(["nsIWebProgressListener",
                                           "nsISupportsWeakReference"]),

    onLocationChange: function(aProgress, aRequest, aURI) {
    alert("Called");
        this.processNewURL(aURI);
    },

    onStateChange: function() {},
    onProgressChange: function() {},
    onStatusChange: function() {},
    onSecurityChange: function() {}
};

  window.addEventListener("load", function() { urlListener.init() }, false);
  window.addEventListener("unload", function() { urlListener.uninit() }, false);

每当我试图启动/测试这种扩展我收到以下错误:

Running tests on Firefox 24.3.0/Gecko 24.3.0 ({ec8030f7-c20a-464f-9b0e-13a3a9e97384}) under linux/x86-gcc3.
Error: ReferenceError: window is not defined 
 Traceback (most recent call last):
  File "resource://jid1-u33krawc1uacsa-at-jetpack/amazon_rewriter/tests/test-main.js", line 1, in 
    var main = require("./main");
  File "resource://gre/modules/commonjs/sdk/loader/cuddlefish.js", line 133, in CuddlefishLoader/options<.load
    result = load(loader, module);
  File "resource://jid1-u33krawc1uacsa-at-jetpack/amazon_rewriter/lib/main.js", line 38, in 
    window.addEventListener("load", function() { urlListener.init() }, false);
0 of 1 tests passed.

也许这就是我,我不知道从教程/扩展的创建过程中的东西。

你能帮助我了解什么缺什么?

编辑 kapep的答案后,我决定不定义的错误窗口。 但似乎当我在地址栏更改URL没有发生。 任何想法?

Answer 1:

有没有全局windowgBrowser对象,你需要让浏览和选择哪个窗口( nsIDOMWindow )要添加监听器。 这部分似乎缺少或超出范围的教程。

var gBrowser = windowUtils.getMostRecentBrowserWindow().getBrowser();

可能有多种方式来获得一个窗口。 我会做,这是使用低级别windowUtils API。 你可以得到类似上面最近的一次与getMostRecentBrowserWindow或更可靠的获得所有当前打开的窗口与windowUtils.windows()是这样的:

const windowUtils = require("sdk/window/utils");

for each (let window in windowUtils.windows()) {
    urlListener.init();
    window.addEventListener("unload", function() { urlListener.uninit(); }, false);
}

以防万一,你也想加入听者在未来打开的所有窗口,你可以将它们添加一个新窗口打开时:

const windows = require("sdk/windows");
windows.browserWindows.on("open", domWindow => {
    urlListener.init();
    windowUtils.getMostRecentBrowserWindow().addEventListener("unload", function() { urlListener.uninit(); }, false);
});


文章来源: Firefox Add-On window.addEventListener error: window not defined