访问Firefox扩展中的全局变量

时间:2012-03-08 12:13:10

标签: firefox firefox-addon

我正在编写一个Firefox扩展,它从命令行进行自定义切换,并在cmdline.js目录中的components内设置变量,我们将调用变量switchDetected这是一个布尔值。现在基于此变量,我希望在overlay.js目录中的chrome/content文件中执行操作。 我遇到的问题是我似乎无法访问switchDetectedcomponents/cmdline.js中声明的变量chrome/contents/overlay.js

我尝试了很多方法,但似乎没什么用。所以我只是想知道是否有人知道如何实现这一目标。

1 个答案:

答案 0 :(得分:4)

在叠加层中加载的脚本在浏览器窗口的上下文中运行 - 其全局变量存储为与浏览器对应的window对象的属性。如果您打开第二个浏览器窗口,则相同的脚本将再次加载并在新浏览器窗口的上下文中运行 - 它将具有不同的全局变量。另一方面,包含XPCOM组件的脚本只加载一次,并且它们具有未绑定到窗口的独立上下文。因此,无法直接从浏览器窗口访问它们的全局变量,就像两个浏览器窗口无法直接访问其他全局变量一样。

相反,浏览器窗口应该使用通常的方法与XPCOM组件通信:获取组件实例并调用其方法。如果您不想为此定义自己的界面(您可能没有),您可以use a trick,如下所示:

CommandLineHandler.prototype = {
  handle: function(commandLine) {...},
  get helpInfo() {...},
  isSwitchDetected: function()
  {
    return switchDetected;
  },
  get wrappedJSObject()
  {
    return this;
  },
  QueryInterface: XPCOMUtils.generateQI(["nsICommandLineHandler"]);
};

wrappedJSObject属性确保您的组件可以解包 - 其所有方法和属性都可以访问,而不仅仅是界面中定义的方法和属性。因此,您的叠加脚本需要执行以下操作:

var cmdLineHandler = Components.classes["@myself.com/my-command-line-handler;1"]
                               .getService()
                               .wrappedJSObject;
var switchDetected = cmdLineHandler.isSwitchDetected();