Services.wm 是未定义的(Firefox SDK Extension)

Services.wm is undefined (Firefox SDK Extension)

本文关键字:Firefox SDK Extension wm 未定义 Services      更新时间:2024-05-02

当我使用Firefox插件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));
}

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

Cu.import 并不像你想象的那样工作。它的返回值是导入模块的全局对象。

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

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

以下使用解构赋值的形式有效,但不鼓励这样做,因为它会进入目标模块的全局并获取常量,而不是仅访问导出的符号:

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

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

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