在 Thunderbird 扩展中,不同的 javascript 文件如何相互引用?

In a Thunderbird extension, how can different javascript files refer to each other?

我开发了一个非常简单的 Thunderbird 扩展。有一个简单的 .xul 文件,它通过脚本标签引用 .js 文件。在那个 javascript 文件中,我在 compose-send-message 事件上实现了一个事件监听器。单击发送按钮时,我想加密邮件正文中的消息,并在发送前用新加密的文本替换它。替换 Thunderbird 正文部分中的文本效果很好,但我无法使用像

这样的简单函数调用来引用另一个 javascript 文件
var encryptedData = encryption.encrypt(data);

对于文件 encryption.js,它在发送前专门处理所述电子邮件文本的加密。这两个文件都在同一个目录中,所以通常它们应该能够相互引用,不是吗?但对我来说,这个参考似乎永远不会奏效。你知道我能做些什么来让它按预期工作吗?我似乎无法自己解决这个问题。提前致谢。

我没有使用 Thunderbird 附加组件的经验,但使用过 Firefox 附加组件。但是,我相信相同的机制适用于 Thunderbird。

你有两个选择(或者可能更多,我不知道):

  1. 在 xul 文件中包含所需的额外 javascript 文件,在主 javascript 文件之前(或者您已经尝试过了吗?):

    <script type="application/javascript" src="chrome://path/to/extra.js"/>
    <script type="application/javascript" src="chrome://path/to/main.js"/>
    
  2. 从主 javascript 文件中加载所需的额外 javascript 文件,作为下标,使用 subscript loader service, through loadSubScript():

    var mozIJSSubScriptLoader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
                                          .getService(Components.interfaces.mozIJSSubScriptLoader);
    
    mozIJSSubScriptLoader.loadSubScript( 'chrome://path/to/extra.js', optionalScope, 'UTF-8' );
    

    optionalScope 允许您将脚本变量加载到指定的对象中。如果省略,脚本变量将被加载到 loadSubScript() 调用者的当前范围。

    顺便说一句,字符集参数也是可选的。