Как в расширении Thunderbird разные файлы javascript могут ссылаться друг на друга?

Я разработал очень простое расширение Thunderbird. Существует один простой файл .xul, который ссылается через тег script на файл .js. В этом javascript-файле я реализую прослушиватель событий для события отправки сообщения. Когда нажата кнопка отправки, я хочу зашифровать сообщение в теле письма и заменить его этим новым зашифрованным текстом перед отправкой. Замена текста в основной части Thunderbird сработала хорошо, но я не могу сослаться на другой файл javascript с помощью простого вызова функции, например

var encryptedData = encryption.encrypt(data);

для файла Encryption.js, который обрабатывает исключительно шифрование указанного текста электронной почты перед отправкой. Оба файла находятся в одном каталоге, поэтому обычно они должны иметь возможность ссылаться друг на друга, не так ли? Но для меня эта ссылка никогда не работает. Знаете ли вы, что я могу сделать, чтобы заставить его работать, как задумано? Кажется, я не в состоянии понять это сам. Заранее спасибо.


person Sushiman    schedule 15.04.2015    source источник


Ответы (1)


У меня нет опыта работы с надстройками для Thunderbird, но я имею опыт работы с надстройками для Firefox. Однако я считаю, что те же механизмы применимы и к Thunderbird.

У вас есть два варианта (или, возможно, больше, о которых я не знаю):

  1. Включите необходимый дополнительный файл javascript в файл xul перед основным файлом javascript (или вы уже пробовали это?):

    <script type="application/javascript" src="chrome://path/to/extra.js"/>
    <script type="application/javascript" src="chrome://path/to/main.js"/>
    
  2. Загрузите необходимый дополнительный файл javascript из основного файла javascript в виде нижнего индекса с помощью служба загрузки подписки через 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().

    Между прочим, аргумент charset также является необязательным.

person Codifier    schedule 15.04.2015
comment
Но это работает только в том случае, если вы хотите запустить конкретный скрипт целиком, например, какую-нибудь функцию onLoad(), или я ошибаюсь? Вы все еще не можете легко ввести var result = javascriptname.functionname(parameter); или что-то подобное в вашем основном js-файле, не так ли? Если бы что-то подобное было возможно, мне не нужно было бы переписывать довольно большой js-файл, который занимается симметричным шифрованием. - person Sushiman; 15.04.2015
comment
@Sushiman Нет, без включения файла, определяющего javascriptname.functionname(parameter), нет. Но, честно говоря, я не знаю ни одной разновидности JavaScript, которая позволяла бы это делать. Вам всегда нужно включать файл(ы), которые определяют функции, к которым вы хотите получить доступ, если они еще не включены и/или не являются частью среды, в которой вы запускаете свой сценарий. - person Codifier; 15.04.2015
comment
@Sushiman Но, возможно, я неправильно истолковываю то, что вы пытаетесь здесь понять. Если вы включите файл с одним из параметров, которые я указал выше, и этот файл имеет javascriptname.functionname(parameter), определенный в его основной области, вы можете получить доступ к javascriptname.functionname(parameter) из области, в которую вы его загрузили. - person Codifier; 15.04.2015