Question

I want to use a Javascript Module (JSM) in a single window of my Xul application, so I can load the resource as I need it.

But, I need to pass the window to the JSM, and I don't know how to do it. Follows my attempt:

In my resource.jsm:

var EXPORTED_SYMBOLS = ["hello"];

function hello(win) {
    win.alert("ALERT FROM JSM!");
}

calling in my window with:

Components.utils.import("resource://module/resource.jsm");
hello(window);

but I get:

win is undefined

in the resource.jsm.

Any idea how to make it work?

Was it helpful?

Solution

It might be causing problems that you named the parameter for your hello function to be window. While window isn't a reserved word, most browser environments treat it as an unassignable constant of sorts. Try:

function hello( obj ) {
    obj.alert("ALERT FROM JSM!");
}

in your module and then invoke it with hello(window), hello(document.window), or hello(this)


After reading the Javascript Module documentation, it looks like you'll need to create an object within the module and then change it's property by reference. So in your JSM:

var EXPORTED_SYMBOLS = ["params", "hello"];

params = {
  win: this
};

function hello() {
    params.win.alert("ALERT FROM JSM!");
}

Then you'd invoke by first assigning the window to that parameter and then calling the function:

Components.utils.import("resource://module/resource.jsm");
params.win = window;
hello();

Note: I am not familiar enough with JSMs to know if there's a better way to do this, but this should work.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top