1

i'm trying to follow this tutorial for creating a firefox addon that intercept when the url in the address bar change:

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

I just copied the code, and just added an alert to see if it works, but i can't have it run in any way.

My code is:

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);

Whenever i try to start/test this extension i receive the following error:

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.

Probably it's me that i don't understand something from the tutorial/extension creation process.

Can you help me to understand what is missing?

EDIT After kapep answer, i resolved the window not defined error. But it seems that nothing happen when i change the url in the address bar. Any idea?

Ivan
  • 4,186
  • 5
  • 39
  • 72

1 Answers1

1

There are no global window or gBrowser objects, you need to get the browser and choose which window (nsIDOMWindow) you want to add the listener. This part seems to be missing or out of scope in the tutorial.

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

There are probably multiple ways to get a window. I would do this is using the low-level windowUtils API. You could get the most recent one like above with getMostRecentBrowserWindow or more reliable get all currently opened windows with windowUtils.windows() like this:

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

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

Just in case you also want to add the listener to all windows opened in the future, you can add them when a new window opens:

const windows = require("sdk/windows");
windows.browserWindows.on("open", domWindow => {
    urlListener.init();
    windowUtils.getMostRecentBrowserWindow().addEventListener("unload", function() { urlListener.uninit(); }, false);
});
kapex
  • 28,903
  • 6
  • 107
  • 121
  • Thank you for your answer, that removes the window not defined problem, but now it seems that whenevere i insert anything in any tab nothing happens. Do you have any idea? – Ivan Mar 15 '14 at 14:54
  • @Ivan There should be an 'alert' popup but I'm not sure if alerts can even work in this context. You could try to add some `console.log` messages instead and see if they show up in the console. – kapex Mar 15 '14 at 15:00
  • Oh and also I don't know how you get the `gBrowser`, but I did it using `windowUtils.getMostRecentBrowserWindow().getBrowser()`. Not sure if this is a good way though but it seems to work for me. – kapex Mar 15 '14 at 15:05
  • This was in the example!! :( – Ivan Mar 15 '14 at 15:08
  • Ok things start workgin with your informations. just one thing is still not working well, the listener seems to be fully loaded only when i open a new window, on the first window the init method is not called. Maybe i need to call it manually? (Thanks a lot for you help) – Ivan Mar 15 '14 at 15:11
  • Yeah, my bad. The current window probably is already loaded so the event doesn't fire. I updated the answer. – kapex Mar 15 '14 at 15:13
  • 1
    Many thanks!! Now everithing works! :) (hey there are two typos in the code, just missing parenthesis. And i think it could be useful to add the answer, also a reference to the gBrowser problem!) – Ivan Mar 15 '14 at 15:19