Firefox XPCOM和插件SDK通信

Firefox XPCOM and Add-on SDK Communication

本文关键字:SDK 通信 插件 XPCOM Firefox      更新时间:2023-09-26

我正在使用插件SDK创建一个firefox扩展。由于各种原因(主要是简单prefs模块中缺少功能),我不得不创建一个XUL窗口,并使用window/utils将其包含在内。此窗口显示正确,工作方式正确。

我的问题是,我需要从XUL窗口中包含的脚本文件中调用main.js中的一个函数。它们不存在于同一个命名空间中,所以我不确定如何访问我的函数。我很乐意使用消息传递,但我不认为XPCOM中包含的脚本可以使用port功能。

我想我需要设置某种回调,但我真的不知道该怎么做。根据XUL迁移指南,我曾考虑创建自己的XPCOM组件,但似乎不允许我使用插件SDK注册XPCOM组件

为了参考,这里是我的(缩写)文件夹结构:

- package.json
- chrome.manifest (to allow me to open a XUL window)
- lib
   - main.js
- chrome
   - content
      - window.xul
      - script.js

我想让main.js中的一些代码被script.js中的某些代码调用。请注意,窗口是在main.js中创建的(就像这样)

var { open } = require('sdk/window/utils');
var window = open('chrome://my-app-id/content/window.xul', { features: {
    chrome: true,
    centerscreen: true,
    toolbar: true
}});

而且这么多是有效的。有人有什么想法吗?

编辑:我可以通过观察main.js中的首选项更改,然后在我希望调用函数时使其更改来解决这个问题,但这让我觉得是对首选项系统的巨大滥用。如果有的话,我想用正确的方式做。

我用自己满意的方式解决了自己的问题。

我将上面对window.open的调用更改为window.openDialog,并将回调函数作为参数传入,如下所示:

var { openDialog } = require('sdk/window/utils');
var window = openDialog({url: 'chrome://my-app-id/content/window.xul',
    features: {
        chrome: true,
        centerscreen: true,
        toolbar: true
    },
    args: {
        doStuff: function(){
            //Do all the stuff
        }
    }
});

然后在script.js中,当我希望调用回调时,我使用

window.arguments[0].doStuff();