Firefox XPCOM和附加SDK通信

时间:2013-08-21 02:42:54

标签: javascript firefox firefox-addon xpcom

我正在使用Add-on SDK创建一个firefox扩展。由于各种原因(主要是simple-prefs模块中的功能很少),我必须创建一个XUL窗口并使用window / utils包含它。此窗口正确显示并完全按照应有的方式运行。

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

我想我需要设置一些回调,但我真的不知道我怎么会这样做。我考虑创建自己的XPCOM组件,但似乎我不允许使用附加SDK注册XPCOM组件,根据the XUL Migration Guide

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

- 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中的偏好更改然后在我希望调用该函数时更改它来解决这个问题,但这让我感到非常震惊滥用偏好系统。如果有的话,我想以正确的方式去做。

1 个答案:

答案 0 :(得分:1)

我以一种我满意的方式解决了自己的问题。

我将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();