Расширение Thunderbird — как использовать относительные пути с Javascript?

Я разрабатываю собственное расширение Thunderbird. Расширение добавляет .xml-файл в качестве вложения к почте Thunderbird (работает очень хорошо). Моя единственная проблема в том, что я не знаю, как использовать относительный путь.

Это выглядит примерно так:

var file= 'C:\\...[… \\…]...\\chrome\\VHitG2.xml';
var attachments = [];
    attachments.push(FileToAttachment(file));
    AddAttachments(attachments); 

Если расширение установлено по другому пути, расширение не сможет работать.
Кто-нибудь знает, как использовать относительные пути?


person MSKV    schedule 05.03.2014    source источник
comment
Относительно чего? Является ли этот файл частью вашего пакета расширений?   -  person Wladimir Palant    schedule 05.03.2014
comment
Да, это часть моего расширения. Его будут использовать другие люди, поэтому путь установки Thunderbird будет другим.   -  person MSKV    schedule 06.03.2014


Ответы (2)


Функция FileToAttachment() не творит чудес, на самом деле это очень просто. Я предполагаю, что вы говорите о статическом файле, который является частью вашего расширения - он должен быть доступен по URL-адресу, например chrome://myextension/content/VHitG2.xml. Затем вы можете просто самостоятельно создать экземпляр nsIMsgAttachment, используя этот URL-адрес:

var attachment = Components.classes["@mozilla.org/messengercompose/attachment;1"]
                           .createInstance(Components.interfaces.nsIMsgAttachment);
attachment.url = "chrome://myextension/content/VHitG2.xml";
AddAttachments([attachment]);

Обратите внимание, что для этого ваше расширение не нужно устанавливать в распакованном виде, вам не нужен фактический файл на диске.

person Wladimir Palant    schedule 05.03.2014
comment
Спасибо. Я попробовал это с attachment.url = "chrome://[email protected]/chrome/VHitG2.xml";. Вложение заполнено файлом с именем «chrome://[email protected]/chrome/VHitG2.xml. Я не могу открыть это вложение или отправить письмо с вложением (отсутствие авторизации). - person MSKV; 06.03.2014
comment
@MSKV: chrome:// URL-адреса так не работают, пожалуйста, прочтите developer.mozilla.org/en/ документы/Chrome_Registration. - person Wladimir Palant; 06.03.2014
comment
@ Владимир Палант: Я добавил content attach chrome://myextension/content/VHitG.xml к своему chrome.manifest, и это работает! Моя проблема сейчас в том, что я не могу изменить содержимое файла .xml с помощью NetUtil и FileUtils (раньше работало). - person MSKV; 06.03.2014
comment
Я понятия не имею, как изменить ваш код, чтобы получить nsIFile вместо nsiMsgAttachmet. - person MSKV; 12.03.2014
comment
@MSKV: вы не можете получить экземпляр nsIFile для чего-то, что не является физическим файлом (он находится внутри сжатого архива). Однако, если вам нужен контент, который вы можете изменить, возможно, сработает использование data: URL. - person Wladimir Palant; 12.03.2014

Я использовал очень окольный способ получить URL-адрес файлов расширения:

Components.utils.import("resource://gre/modules/FileUtils.jsm");
var test1 = FileUtils.getFile("CurProcD", ["VHitG2.xml"]);
var test2 = FileUtils.getFile("CurProcD", ["VHitG.xml"]);
var file1 = test1.path.replace(/VHitG2.xml/i, "extensions\\[email protected]\\chrome\\VHitG2.xml");
var file2 = test2.path.replace(/VHitG.xml/i, "extensions\\[email protected]\\chrome\\VHitG.xml");
var attachment1 = file1.replace(/\\/g, "\\\\");
var attachment2 = file2.replace(/\\/g, "\\\\");
person MSKV    schedule 07.03.2014