Services.wm未定义(Firefox SDK扩展)

时间:2016-04-12 08:13:25

标签: javascript firefox firefox-addon mozilla

我在使用Firefox Addon SDK(JPM)时遇到错误TypeError: Services.wm is undefined,以及index.js中的以下代码:

var self = require("sdk/self");
const { Cu } = require("chrome");
let Services = Cu.import("resource://gre/modules/Services.jsm");

require("sdk/ui/button/action").ActionButton({
  id: "list-tabs",
  label: "List Tabs",
  icon: "./icon-16.png",
  onClick: myTestFunc
});

function myTestFunc() {
  var windows = Services.wm.getEnumerator("navigator:browser");
  while (windows.hasMoreElements())
    iterateWindows(windows.getNext().QueryInterface(Components.interfaces.nsIDOMWindow));
}

任何建议都会有很大的帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

Cu.import无法正常工作。它的返回值是导入模块的全局对象。

通常,模块的导出符号作为第二个对象的属性(如果已指定)导入,如果不导入,则导入当前全局,这将定义Services,然后立即用返回值替换。

只使用Cu.import("resource://gre/modules/Services.jsm", this);而没有返回值,就可以使用并导入该模块中的所有导出符号。

使用destructuring assignment的以下表单有效,但不鼓励,因为它到达目标模块的全局并获取常量而不是仅访问导出的符号:

const {Services} = Cu.import("resource://gre/modules/Services.jsm", {});

SDK正确执行此操作的方法是

const {Services} = require("resource://gre/modules/Services.jsm");