Добрый день!
Нужно написать небольшое расширение, которое добавит кнопочку в меню бар (напр. Tools->MyButton).
В гайде нашёл информацию о добавлении времени в статус бар, который в xul файле именуется statusbar. Как именуется меню-бар, и как внести нужную кнопку именно в Tools или File?

Тема перенесена из форума «Thunderbird» в форум «Разработка».

Спасибо, на английском тяжело вникнуть так что ещё остались вопросы.

Выделить код

Код:

<?xml version="1.0"?>
<overlay id="sample" mlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<menu label="Mymenu">
  <menupopup>
    <menuitem label="M1"/>
    <menuitem label="M2"/>
  </menupopup>
</menu>
</overlay>

Вот такой xul ломает окно Thunderbird'а и ничего не делает. Хотя всё как в примере xul school.

okkamas_knife пишет

shatalov
выложи расширение целиком Загрузки
да и на какой версии [thunderbird] пробуешь? в последних они там много поменяли и возможно в примерах это упущено.

Залил http://forum.mozilla-russia.org/uploaded/ish.zip .
Нужно для начала просто кнопочку вывести в меню - уже радость будет. А затем по клику диалоговое окно.
Версия 17.0.3

shatalov
Куда должно добавляться меню?

https://developer.mozilla.org/en-US/docs/XUL_Overlays
https://developer.mozilla.org/en-US/doc … l/Overlays

И там опечатка: вместо «xmlns» написано «mlns».

Вот пример:

Выделить код

Код:

<?xml version="1.0"?>
<overlay id="sample" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<menubar id="mail-menubar">
  <menu label="Mymenu" insertafter="tasksMenu">
    <menupopup>
      <menuitem label="M1"/>
      <menuitem label="M2"/>
    </menupopup>
  </menu>
</menubar>
</overlay>

А дальше можно в DOM Inspector'е посмотреть и заменить «<menubar id="mail-menubar"> ... </menubar>» и «insertafter="tasksMenu"» на нужное.

Infocatcher пишет

shatalov
Куда должно добавляться меню?

https://developer.mozilla.org/en-US/docs/XUL_Overlays
https://developer.mozilla.org/en-US/doc … l/Overlays

И там опечатка: вместо «xmlns» написано «mlns».

Вот пример:

Выделить код

Код:

<?xml version="1.0"?>
<overlay id="sample" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<menubar id="mail-menubar">
  <menu label="Mymenu" insertafter="tasksMenu">
    <menupopup>
      <menuitem label="M1"/>
      <menuitem label="M2"/>
    </menupopup>
  </menu>
</menubar>
</overlay>

А дальше можно в DOM Inspector'е посмотреть и заменить «<menubar id="mail-menubar"> ... </menubar>» и «insertafter="tasksMenu"» на нужное.

Ага, работает, спасибо. Инспектора поставил, как в него мой xul файл залить? Есть по нему похожий мануал? Вообще в меню tools надо и на клик перевод на js скрипт overlay.js.

shatalov пишет

Инспектора поставил, как в него мой xul файл залить? Есть по нему похожий мануал?

https://developer.mozilla.org/en-US/doc … _Inspector
Еще есть кнопка Attributes Inspector для Custom Buttons.

shatalov пишет

Вообще в меню tools надо

Тогда что-нибудь вроде

Выделить код

Код:

<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    <script type="application/javascript" src="overlay.js" />
    <menupopup id="taskPopup">
        <menuitem label="Label" insertafter="addonsManager" oncommand="ishCommand();" />
    </menupopup>
</overlay>
shatalov пишет

и на клик перевод на js скрипт overlay.js.

И overlay.js:

Выделить код

Код:

function ishCommand() {
    alert("Hello!");
}
Infocatcher пишет
shatalov пишет

Инспектора поставил, как в него мой xul файл залить? Есть по нему похожий мануал?

Выделить код

Код:

<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    <script type="application/javascript" src="overlay.js" />
    <menupopup id="taskPopup">
        <menuitem label="Label" insertafter="addonsManager" oncommand="ishCommand();" />
    </menupopup>
</overlay>
shatalov пишет

и на клик перевод на js скрипт overlay.js.

И overlay.js:

Выделить код

Код:

function ishCommand() {
    alert("Hello!");
}

Спасибо большое, всё отлично работает и за мануалы отдельное!

okkamas_knife пишет

попробовал, помучался плюнул, почитал мануалы разобрал примеры, (до этого расширения только чуток правил так что считай с нуля),
короче вот расширение-пример
добавляет пункт меню в меню файл, добавляет менюшку,добавляет кнопку для тулбара.
практически шаблон. зы менюшка с какойто фигнёй типа пимпочки вышла но мне уже лень дальше это ковырять.
внутри есть кратенькое ридми

Ок, спасибо, гляну!

И ещё один вопросец: возможно вызывать внешние программы из xul? или js заменить на другой скрипт, который сможет вызвать внешнюю программу/терминал etc? Все под linux

shatalov пишет

вызывать внешние программы

https://developer.mozilla.org/en-US/doc … nsIProcess

Infocatcher пишет
shatalov пишет

вызывать внешние программы

https://developer.mozilla.org/en-US/doc … nsIProcess

Ага, спасибо, программу вызывает если использовать последний пример по ссылке. А если это будет bash скрипт, который возвращает значение - можно его прочитать и занести в переменную?

okkamas_knife пишет

только извращённым способом либо через буфер обмена либо через файл,это если обходиться голым жабаскриптом.
другие варианты требуют написания и компиляции бинарных компонентов.

А если скрипт запишет данные файл, с него можно будет считать?

shatalov пишет

А если это будет bash скрипт, который возвращает значение - можно его прочитать и занести в переменную?

Есть какой-то nsIPipe, но не факт, что он тут вообще может помочь.

shatalov пишет

А если скрипт запишет данные файл, с него можно будет считать?

Можно: https://developer.mozilla.org/en-US/doc … s/File_I_O

Пришлось перенести скрипт на TB 3.1, вышла ошибка

Ошибка: file.initWithPath is not a function
Источник: chrome://ish/content/overlay.js
Строка: 17

Выделить код

Код:

function runsh(){
// create an nsIFile for the executable
    var file = Components.classes["@mozilla.org/file/local;1"]
                     .createInstance(Components.interfaces.nsIFile);
    file.initWithPath("/usr/local/bin/change_ad_passwd.sh");
     
    // create an nsIProcess
    var process = Components.classes["@mozilla.org/process/util;1"]
                        .createInstance(Components.interfaces.nsIProcess);
    process.init(file);

Чем можно исправить?
При замене объявления файла на

Выделить код

Код:

Components.utils.import("resource://gre/modules/FileUtils.jsm");
 
var file = new FileUtils.File("/usr/local/bin/change_ad_passwd.sh");

Ошибка

Ошибка: FileUtils.File is not a constructor
Источник: chrome://ish/content/overlay.js
Строка: 20

okkamas_knife пишет

shatalov
попробуй проделать
var file = Components.classes["@mozilla.org/file/local;1"]
                     .createInstance(Components.interfaces.nsIFile);
    file.initWithPath("/usr/local/bin/change_ad_passwd.sh");
сменив путь для начала на проверенное место где не нужны косые в пути возможно в линухе своя фишка с путями
поиграй с
("/file.txt")
("\file.txt")
("//file.txt")
("\\file.txt")
("file.txt")
лучше кинуть 2 файла один в рут другой в usr с разным содержимым чтоб понять к какому именно обращается
после того как найден рабочий вариант добавь папку и перекинув файл туда и также вычисли какой вариант косых используется в пути.
зы также вполне может быть что тебе надо запускать не change_ad_passwd.sh а саму интерпретирующую оболочку которой передавать этот файл в качестве аргумента.

Потыкал, но не помогло. Так первоначально делалось всё на линухе, только TB был 17. Следовательно проблема явно в верссии TB. Что-то TB3 не поддерживает, и я так понимаю должна быть замена?

shatalov
Документацию надо было читать. :)

Выделить код

Код:

.createInstance(Components.interfaces.nsILocalFile || Components.interfaces.nsIFile);
Infocatcher пишет

shatalov
Документацию надо было читать. :)

Выделить код

Код:

.createInstance(Components.interfaces.nsILocalFile || Components.interfaces.nsIFile);

да, работает, спасибо) не нашёл этого в документации =(

shatalov пишет

не нашёл этого в документации =(

Выделить код

Код:

var file = Components.classes["@mozilla.org/file/local;1"]
                     .createInstance(Components.interfaces.nsIFile); // Создается экземпляр nsIFile
    file.initWithPath("/usr/local/bin/change_ad_passwd.sh"); // Но "file.initWithPath is not a function"

Можно проверить "initWithPath" in file и убедиться, что такого свойства вообще нет.
А далее посмотреть про nsIFile: void initWithFile(in nsIFile aFile); Requires Gecko 14.
Или поискать сразу про initWithPath.