Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№122-11-2009 13:29:00

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.5

Re: Готовые кнопки для Custom Buttons

Постим сюда только готовые и оформленные кнопки!
                                           
- все вопросы, замечания, обсуждения тут:
https://forum.mozilla-russia.org/viewto … 591&p=last



Как добавить кнопку(помощь для новичка)

1.1449045699.gif

1 Устанавливаем расширение Custom Buttons.
2 Выделяем всё что есть в секции Kод кнопки.
3 Копируем в адресную строку и жмём перейти.
4 Откроется окно диалога добавления кнопки.
5 Добавив кнопку жмём правой кнопкой мыши по свободному месту на панели и выбираем настроить.
6 Перетаскиваем кнопку в нужное место на панели.
этот способ устанавливает кнопку с иконкой.

второй способ:
ПКМ на любой панели и в открывшемся меню нажимаем пункт Добавить новую кнопку, откроется окно редактирования новой кнопки куда копируем коды из секций Код и Инициализация. Потом в окне редактирования кнопки нажимаем Ok, открываем настройку панелей инструментов (Customize) и вытаскиваем новую кнопку на нужную панель. иконку кнопки в этом случае придётся нарисовать самим или выбрать готовую(картинка 16х16 пикселей подойдёт к большинству тем), не забывайте конвертировать её в base64 иначе при перемещении файла иконки изображение с кнопки пропадёт.


Как удалить кнопку(помощь для новичка)

ПКМ на кнопке и нажать пункт Удалить в контекстном меню кнопки или открыть Управление дополнениями и там открыть вкладку Custom Buttons найти нужную кнопку и нажать Удалить.

Шаблон добавления готовой кнопки

Выделить код

Код:

[b][color=#FF4F00]Название кнопки[/color][/b](Firefox + версия), от какого числа кнопка.
Описание что кнопка делает, указать если для работы кнопки нужны расширения и программы.

[b]Клики на кнопке:[/b]
[color=#006600]ЛКМ[/color] => описание,
[color=#006600]СКМ[/color] => описание,
[color=#006600]ПКМ[/color] => описание.
Другие клики(если они есть)

[spoiler=Код кнопки, вкладки код и инициализации:]

[b]Код кнопки:[/b]
тут код получаемый по ПКМ - Копировать код в буфер

[b]Код:[/b]
тут код из вкладки Код(если он есть)

[b]Инициализация:[/b]
тут код из вкладки Инициализация(если он есть)

[/spoiler]
Автор кнопки(если он известен): [b]указать автора без ссылки на его профиль[/b] + ссылка на страницу кнопки если такая есть.


Важно!
Расширение Custom Buttons (bootstrap) можно взять тут 11-04-2023 12:33:42, но перед установкой нужно сделать это Как отключить проверку цифровых подписей в дополнениях Firefox.

Отредактировано bunda1 (27-12-2013 14:29:59)

Отсутствует

 

№15202-09-2016 01:07:00

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 51.0

Re: Готовые кнопки для Custom Buttons

Tab Sound Control(Firefox 42+ (для контроля звука во вкладках с флеш-контентом - требуется плагин Flash версии 20+)), от 02.09.2016
Позволяет включать/отключать и регулировать громкость звука во вкладке/всех вкладках.
Дополнительно можно задать дефолтный уровень громкости (только в ФФ 49+) и автозапуск воспроизведения для html5 медиа-контента (параметры about:config).

Клики на кнопке:
ЛКМ: Показать меню кнопки
СКМ: Отключить звук во всех вкладках
Ctrl + СКМ: Включить звук во всех вкладках
ПКМ: Переключить звук в активной вкладке
ПКМ + Клавиши Модификаторы: Показать стандартное CB меню кнопки
Колесико Мыши: Регулировать уровень громкости во всех вкладках
Ctrl + Колесико Мыши (только в FF49+): Регулировать дефолтный уровень громкости для медиа

Shift + Колесико мыши над вкладкой: Регулировать громкость звука во вкладке

Горячие клавиши (вне зависимости от текущей языковой раскладки):
Alt + Shift + S - Переключить звук в активной вкладке в активном окне
Alt + Shift + M - Отключить звук во всех вкладках во всех окнах
Alt + Shift + U - Включить звук во всех вкладках во всех окнах
Сочетания можно заменить на свои. См. комментарии в коде.

Код кнопки, вкладки инициализации и иконка:

Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ETab%20Sound%20Control%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/svg+xml%3Bbase64%2CPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGhlaWdodD0nMTZweCcgd2lkdGg9JzE2cHgnPjxnPjxwYXRoIGQ9J00gOS43OSwxNCBDIDE1LjYsMTIuMSAxNS42LDMuOTcgOS43OSwyLjAyIEwgOS43OSwwLjEyOCBDIDE4LDIuMTEgMTgsMTMuOSA5Ljc5LDE1LjkgWiBNIDMuNTgsMTAuOCAwLDEwLjggMCw1LjI1IDMuNTgsNS4yNSA3Ljk0LDAuODk2IDcuOTQsMTUuMSBaIE0gOS43OSw0LjQyIEMgMTIuNyw1LjgyIDEyLjcsMTAuMiA5Ljc5LDExLjYgWicgc3R5bGU9J2ZpbGw6cmdiKDEyMSwxMjQsMTI4KScvPjwvZz48L3N2Zz4%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20Tab%20Sound%20Control%20%u043E%u0442%2002.09.2016%0Athis.onclick%20%3D%20e%20%3D%3E%20%7B%0A%20%20%20%20if%20%28e.button%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20tltp.hidePopup%28%29%3B%20popup.openPopup%28this%2C%20%22after_start%22%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28e.button%20%3D%3D%201%29%0A%20%20%20%20%20%20%20%20%21e.ctrlKey%20%3F%20muteAllTabs%28%29%20%3A%20unMuteAllTabs%28%29%3B%0A%0A%20%20%20%20if%20%28e.button%20%3D%3D%202%20%26%26%20%21e.altKey%20%26%26%20%21e.shiftKey%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.metaKey%29%20%7B%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%20e.stopPropagation%28%29%3B%0A%20%20%20%20%20%20%20%20muteTab%28%29%3B%0A%20%20%20%20%7D%0A%7D%0A%0Avar%20popup%20%3D%20self.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0Avar%20tltp%20%3D%20self.appendChild%28document.createElement%28%22tooltip%22%29%29%3B%0Avar%20tabVolTltp%20%3D%20self.appendChild%28document.createElement%28%27tooltip%27%29%29%0Avar%20pref%20%3D%20%22media.default_volume%22%3B%0Avar%20isPref%20%3D%20%21%21cbu.isPref%28pref%29%3B%0Avar%20du%20%3D%20Cc%5B%22@mozilla.org/inspector/dom-utils%3B1%22%5D.getService%28Ci.inIDOMUtils%29%3B%0Avar%20o%20%3D%20%7B//%20https%3A//github.com/Infocatcher/Private_Tab/issues/228%23issuecomment-238963363%0A%20%20%20%20get%20windows%28%29%20%7B%0A%20%20%20%20%20%20%20%20return%20%28function*%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20ws%20%3D%20Services.wm.getEnumerator%28%22navigator%3Abrowser%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20while%28ws.hasMoreElements%28%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20yield%20ws.getNext%28%29%3B%0A%20%20%20%20%20%20%20%20%7D%29%28%29%3B%0A%20%20%20%20%7D%0A%7D%0A%0Athis.tooltipText%20%3D%20%27%27%3B%0A%0Athis.onmouseover%20%3D%20e%20%3D%3E%20%7B%0A%20%20%20%20if%20%28e.target%20%21%3D%20this%29%20return%3B%0A%20%20%20%20tltp.label%20%3D%20%27%u041B%u041A%u041C%3A%20%u041F%u043E%u043A%u0430%u0437%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%27%20+%0A%20%20%20%20%20%20%20%20%27%5Cn%u0421%u041A%u041C%3A%20%u041E%u0442%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0432%u0443%u043A%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%27%20+%0A%20%20%20%20%20%20%20%20%27%5CnCtrl%20+%20%u0421%u041A%u041C%3A%20%u0412%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0432%u0443%u043A%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%27%20+%0A%20%20%20%20%20%20%20%20%27%5Cn%u041F%u041A%u041C%3A%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0432%u0443%u043A%20%u0432%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%27%20+%0A%20%20%20%20%20%20%20%20%27%5Cn%u041F%u041A%u041C%20+%20%u041A%u043B%u0430%u0432%u0438%u0448%u0438%20%u041C%u043E%u0434%u0438%u0444%u0438%u043A%u0430%u0442%u043E%u0440%u044B%3A%20%u041F%u043E%u043A%u0430%u0437%u0430%u0442%u044C%20%u0441%u0442%u0430%u043D%u0434%u0430%u0440%u0442%u043D%u043E%u0435%20CB%20%u043C%u0435%u043D%u044E%27%20+%0A%20%20%20%20%20%20%20%20%27%5Cn%u041A%u043E%u043B%u0435%u0441%u0438%u043A%u043E%20%u041C%u044B%u0448%u0438%3A%20%u0420%u0435%u0433%u0443%u043B%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0443%u0440%u043E%u0432%u0435%u043D%u044C%20%u0433%u0440%u043E%u043C%u043A%u043E%u0441%u0442%u0438%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%27%20+%0A%20%20%20%20%20%20%20%20%28isPref%20%3F%20%27%5CnCtrl%20+%20%u041A%u043E%u043B%u0435%u0441%u0438%u043A%u043E%20%u041C%u044B%u0448%u0438%3A%20%u0420%u0435%u0433%u0443%u043B%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0434%u0435%u0444%u043E%u043B%u0442%u043D%u044B%u0439%20%u0443%u0440%u043E%u0432%u0435%u043D%u044C%20%u0433%u0440%u043E%u043C%u043A%u043E%u0441%u0442%u0438%20%u0434%u043B%u044F%20%u043C%u0435%u0434%u0438%u0430%27%20+%0A%20%20%20%20%20%20%20%20%20%27%5Cn%28%u0442%u0435%u043A%u0443%u0449%u0438%u0439%20%u0443%u0440%u043E%u0432%u0435%u043D%u044C%3A%20%27%20+%20cbu.getPrefs%28pref%29%20*%20100%20+%20%27%25%29%27%20%3A%20%27%27%29%3B%0A%0A%20%20%20%20tltp.openPopup%28this%2C%20%22after_start%22%29%3B%0A%7D%0Athis.onmouseleave%20%3D%20%28%29%20%3D%3E%20tltp.hidePopup%28%29%3B%0A%0Athis.onwheel%20%3D%20e%20%3D%3E%20%7B%0A%20%20%20%20if%20%28e.ctrlKey%20%26%26%20isPref%29%20%7B//%20FF49+%3A%20https%3A//bugzilla.mozilla.org/show_bug.cgi%3Fid%3D1274622%0A%0A%20%20%20%20%20%20%20%20var%20step%20%3D%20.1%3B%0A%20%20%20%20%20%20%20%20var%20val%20%3D%20parseFloat%28Services.prefs.getCharPref%28pref%29%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20val%20%3D%20e.deltaY%20%3C%200%20%3F%20Math.min%281%2C%20val%20+%20step%29%20%3A%20Math.max%280%2C%20val%20-%20step%29%3B%0A%0A%20%20%20%20%20%20%20%20Services.prefs.setCharPref%28pref%2C%20%28val%29.toFixed%281%29%29%3B%0A%0A%20%20%20%20%20%20%20%20tltp.label%20%3D%20%27%u0434%u0435%u0444%u043E%u043B%u0442%u043D%u044B%u0439%20%u0443%u0440%u043E%u0432%u0435%u043D%u044C%20%u0433%u0440%u043E%u043C%u043A%u043E%u0441%u0442%u0438%20%u0434%u043B%u044F%20%u043C%u0435%u0434%u0438%u0430%3A%20%27%20+%20%28val%29.toFixed%281%29%20*%20100%20+%20%27%25%27%3B%0A%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20var%20step%20%3D%20.05%3B%0A%0A%20%20%20%20for%28var%20w%20of%20o.windows%29%20for%28var%20%7BcontentWindow%3A%20win%7D%20of%20w.gBrowser.browsers%29%20%7B%0A%20%20%20%20%20%20%20%20var%20dwu%20%3D%20win.QueryInterface%28Ci.nsIInterfaceRequestor%29.getInterface%28Ci.nsIDOMWindowUtils%29%3B%0A%20%20%20%20%20%20%20%20dwu.audioVolume%20%3D%20e.deltaY%20%3C%200%20%3F%20Math.min%281%2C%20dwu.audioVolume%20+%20step%29%20%3A%20Math.max%280%2C%20dwu.audioVolume%20-%20step%29%3B%0A%20%20%20%20%7D%0A%7D%0A%0A%5B%0A%20%20%20%20%7Blbl%3A%20%27%u0412%u043A%u043B.%5C%5C%u0412%u044B%u043A%u043B.%20%u0437%u0432%u0443%u043A%20%u0432%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%27%2C%20cmd%3A%20%27muteTab%28%29%3B%27%7D%2C%0A%20%20%20%20%7Blbl%3A%20%27%u041E%u0442%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0432%u0443%u043A%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%27%2C%20cmd%3A%20%27muteAllTabs%28%29%3B%27%7D%2C%2C%0A%20%20%20%20%7Blbl%3A%20%27%u0412%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0432%u0443%u043A%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%27%2C%20cmd%3A%20%27unMuteAllTabs%28%29%3B%27%7D%2C%0A%20%20%20%20%7Blbl%3A%20%27%u0417%u0430%u0434%u0430%u0442%u044C%20%u0443%u0440%u043E%u0432%u0435%u043D%u044C%20%u0433%u0440%u043E%u043C%u043A%u043E%u0441%u0442%u0438%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%27%2C%20cmd%3A%20%27setVolume%28%29%3B%27%7D%2C%0A%20%20%20%20%7Bpref%3A%20%27media.default_volume%27%2C%20lbl%3A%20%27%u0417%u0430%u0434%u0430%u0442%u044C%20%u0434%u0435%u0444%u043E%u043B%u0442%u043D%u044B%u0439%20%u0443%u0440%u043E%u0432%u0435%u043D%u044C%20%u0433%u0440%u043E%u043C%u043A%u043E%u0441%u0442%u0438%27%2C%20cmd%3A%20%27promptDialog%28m.pref%29%3B%27%7D%2C%0A%20%20%20%20%7Bpref%3A%20%27media.autoplay.enabled%27%2C%20lbl%3A%20%27%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0430%u0432%u0442%u043E%u0432%u043E%u0441%u043F%u0440%u043E%u0438%u0437%u0432%u0435%u0434%u0435%u043D%u0438%u0435%20%u043C%u0435%u0434%u0438%u0430%27%2C%20cmd%3A%20%27cbu.setPrefs%28m.pref%2C%20%21cbu.getPrefs%28m.pref%29%29%3B%27%7D%0A%5D.forEach%28m%20%3D%3E%20%7B%0A%20%20%20%20if%20%28m.pref%20%26%26%20%21cbu.isPref%28m.pref%29%29%20return%3B%0A%0A%20%20%20%20var%20mItem%20%3D%20popup.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0A%0A%20%20%20%20mItem.onclick%20%3D%20%28%29%20%3D%3E%20eval%28m.cmd%29%3B%0A%20%20%20%20mItem.setAttribute%28%27label%27%2C%20m.pref%20%3F%20%28m.lbl%20+%20%27%20%28about%3Aconfig%29%27%29%20%3A%20m.lbl%29%3B%0A%20%20%20%20m.pref%20%26%26%20%28mItem.onmouseover%20%3D%20%28%29%20%3D%3E%20mItem.tooltipText%20%3D%20%27%u0422%u0435%u043A%u0443%u0449%u0435%u0435%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u0435%3A%20%27%20+%20cbu.getPrefs%28m.pref%29%29%3B%0A%7D%29%0A%0Afunction%20muteTab%28%29%20window.gBrowser.selectedTab.toggleMuteAudio%28%29%3B%0A%0Afunction%20muteAllTabs%28%29%20%7B%0A%20%20%20%20for%28var%20w%20of%20o.windows%29%0A%20%20%20%20%20%20%20%20%5B...w.gBrowser.tabs%5D.filter%28tab%20%3D%3E%20tab.hasAttribute%28%22soundplaying%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%20%21tab.hasAttribute%28%22muted%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%20tab.toggleMuteAudio%28%29%29%3B%0A%7D%0A%0Afunction%20unMuteAllTabs%28%29%20%7B%0A%20%20%20%20for%28var%20w%20of%20o.windows%29%0A%20%20%20%20%20%20%20%20%5B...w.gBrowser.tabs%5D.filter%28tab%20%3D%3E%20tab.hasAttribute%28%22soundplaying%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%20tab.hasAttribute%28%22muted%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%20tab.toggleMuteAudio%28%29%29%3B%0A%7D%0A%0Afunction%20setVolume%28%29%20%7B%0A%20%20%20%20var%20input%20%3D%20%7Bvalue%3A%201%7D%3B%0A%20%20%20%20var%20prompt%20%3D%20Services.prompt.prompt%28null%2C%20%22%u0417%u0430%u0434%u0430%u0442%u044C%20%u0443%u0440%u043E%u0432%u0435%u043D%u044C%20%u0433%u0440%u043E%u043C%u043A%u043E%u0441%u0442%u0438%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%22%2C%20%22%u043E%u0442%200%20%u0434%u043E%201%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20input%2C%20null%2C%20%7Bvalue%3A%20false%7D%29%3B%0A%0A%20%20%20%20if%20%28prompt%29%0A%20%20%20%20%20%20%20%20for%28var%20w%20of%20o.windows%29%20for%28var%20%7BcontentWindow%3A%20win%7D%20of%20w.gBrowser.browsers%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20dwu%20%3D%20win.QueryInterface%28Ci.nsIInterfaceRequestor%29.getInterface%28Ci.nsIDOMWindowUtils%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20dwu.audioVolume%20%3D%20input.value%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%0A%0Afunction%20promptDialog%28pref%29%20%7B%0A%20%20%20%20var%20input%20%3D%20%7Bvalue%3A%20cbu.getPrefs%28pref%29%7D%3B%0A%20%20%20%20var%20prompt%20%3D%20Services.prompt.prompt%28null%2C%20%22%u0417%u0430%u0434%u0430%u0442%u044C%20%u0434%u0435%u0444%u043E%u043B%u0442%u043D%u044B%u0439%20%u0443%u0440%u043E%u0432%u0435%u043D%u044C%20%u0433%u0440%u043E%u043C%u043A%u043E%u0441%u0442%u0438%22%2C%20%22%u043E%u0442%200.0%20%u0434%u043E%201.0%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20input%2C%20null%2C%20%7Bvalue%3A%20false%7D%29%3B%0A%0A%20%20%20%20if%20%28prompt%29%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28pref%2C%20input.value%29%3B%0A%7D%0A%0Afunction%20hotKeys%28e%29%20%7B%0A%20%20%20%20//%20Alt%20+%20Shift%20+%20S%20-%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0432%u0443%u043A%20%u0432%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20%u0432%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u043C%20%u043E%u043A%u043D%u0435%0A%20%20%20%20//%20Alt%20+%20Shift%20+%20M%20-%20%u041E%u0442%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0432%u0443%u043A%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u043E%u043A%u043D%u0430%u0445%0A%20%20%20%20//%20Alt%20+%20Shift%20+%20U%20-%20%u0412%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0432%u0443%u043A%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u043E%u043A%u043D%u0430%u0445%0A%20%20%20%20//%20%u0421%u043C%3A%20https%3A//developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode%23Constants_for_keyCode_value%0A%20%20%20%20if%20%28e.altKey%20%26%26%20e.shiftKey%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.metaKey%29%20%7B%0A%0A%20%20%20%20%20%20%20%20switch%20%28e.keyCode%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%2077%3A%20muteAllTabs%28%29%3B%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%2083%3A%20muteTab%28%29%3B%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%2085%3A%20unMuteAllTabs%28%29%3B%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20default%3A%20return%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%20e.stopPropagation%28%29%3B%0A%20%20%20%20%7D%0A%7D%0A%0Afunction%20tabVolume%28e%29%20%7B%0A%20%20%20%20let%20tab%20%3D%20e.originalTarget%3B%0A%20%20%20%20while%20%28tab%20%26%26%20tab.localName%20%21%3D%20%27tab%27%29%20tab%20%3D%20tab.parentNode%3B%0A%0A%20%20%20%20if%20%28%21tab%20%7C%7C%20%21e.shiftKey%29%20return%3B%0A%0A%20%20%20%20e.preventDefault%28%29%3B%20e.stopPropagation%28%29%3B%0A%0A%20%20%20%20var%20step%20%3D%20.05%2C%0A%20%20%20%20%20%20%20%20dwu%20%3D%20tab.linkedBrowser.contentWindow.QueryInterface%28Ci.nsIInterfaceRequestor%29.getInterface%28Ci.nsIDOMWindowUtils%29%3B%0A%0A%20%20%20%20dwu.audioVolume%20%3D%20e.deltaY%20%3C%200%20%3F%20Math.min%281%2C%20dwu.audioVolume%20+%20step%29%20%3A%20Math.max%280%2C%20dwu.audioVolume%20-%20step%29%3B%0A%0A%20%20%20%20document.getElementById%28%27tabbrowser-tab-tooltip%27%29.hidePopup%28%29%3B%0A%20%20%20%20tabVolTltp.openPopup%28tab%2C%20%22after_start%22%29%3B%0A%20%20%20%20tabVolTltp.label%20%3D%20%27Volume%3A%20%27%20+%20%28dwu.audioVolume%20*%20100%29.toFixed%28%29%3B%0A%20%20%20%20tab.onmouseleave%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20tabVolTltp.hidePopup%28%29%3B%0A%20%20%20%20%20%20%20%20tab.onmouseleave%20%3D%20null%3B%0A%20%20%20%20%7D%0A%7D%0A%0AaddEventListener%28%22keydown%22%2C%20hotKeys%2C%20false%2C%20window%29%3B%0AaddEventListener%28%22wheel%22%2C%20tabVolume%2C%20true%2C%20window.gBrowser.tabContainer%29%3B%0AaddDestructor%28%28%29%3D%3E%20%7B%0A%20%20%20%20removeEventListener%28%22keydown%22%2C%20hotKeys%2C%20false%2C%20window%29%3B%0A%20%20%20%20removeEventListener%28%22wheel%22%2C%20tabVolume%2C%20true%2C%20window.gBrowser.tabContainer%29%3B%0A%7D%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%u041A%u043D%u043E%u043F%u043A%u0430%3A%0A%20%20%20%20%u041B%u041A%u041C%3A%20%u041F%u043E%u043A%u0430%u0437%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%0A%20%20%20%20%u0421%u041A%u041C%3A%20%u041E%u0442%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0432%u0443%u043A%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%0A%20%20%20%20Ctrl%20+%20%u0421%u041A%u041C%3A%20%u0412%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0432%u0443%u043A%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%0A%20%20%20%20%u041F%u041A%u041C%3A%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0432%u0443%u043A%20%u0432%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%0A%20%20%20%20%u041F%u041A%u041C%20+%20%u041A%u043B%u0430%u0432%u0438%u0448%u0438%20%u041C%u043E%u0434%u0438%u0444%u0438%u043A%u0430%u0442%u043E%u0440%u044B%3A%20%u041F%u043E%u043A%u0430%u0437%u0430%u0442%u044C%20%u0441%u0442%u0430%u043D%u0434%u0430%u0440%u0442%u043D%u043E%u0435%20CB%20%u043C%u0435%u043D%u044E%0A%20%20%20%20%u041A%u043E%u043B%u0435%u0441%u0438%u043A%u043E%20%u041C%u044B%u0448%u0438%3A%20%u0420%u0435%u0433%u0443%u043B%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0443%u0440%u043E%u0432%u0435%u043D%u044C%20%u0433%u0440%u043E%u043C%u043A%u043E%u0441%u0442%u0438%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%0A%20%20%20%20Ctrl%20+%20%u041A%u043E%u043B%u0435%u0441%u0438%u043A%u043E%20%u041C%u044B%u0448%u0438%20%28%u0442%u043E%u043B%u044C%u043A%u043E%20%u0432%20FF49+%29%3A%20%u0420%u0435%u0433%u0443%u043B%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0434%u0435%u0444%u043E%u043B%u0442%u043D%u044B%u0439%20%u0443%u0440%u043E%u0432%u0435%u043D%u044C%20%u0433%u0440%u043E%u043C%u043A%u043E%u0441%u0442%u0438%20%u0434%u043B%u044F%20%u043C%u0435%u0434%u0438%u0430%0A%0A%u0413%u043E%u0440%u044F%u0447%u0438%u0435%20%u043A%u043B%u0430%u0432%u0438%u0448%u0438%3A%0A%20%20%20%20Alt%20+%20Shift%20+%20S%20-%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0432%u0443%u043A%20%u0432%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20%u0432%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u043C%20%u043E%u043A%u043D%u0435%0A%20%20%20%20Alt%20+%20Shift%20+%20M%20-%20%u041E%u0442%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0432%u0443%u043A%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u043E%u043A%u043D%u0430%u0445%0A%20%20%20%20Alt%20+%20Shift%20+%20U%20-%20%u0412%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0432%u0443%u043A%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%20%u0432%u043E%20%u0432%u0441%u0435%u0445%20%u043E%u043A%u043D%u0430%u0445%0A%0AShift%20+%20%u041A%u043E%u043B%u0435%u0441%u0438%u043A%u043E%20%u043C%u044B%u0448%u0438%20%u043D%u0430%u0434%20%u0432%u043A%u043B%u0430%u0434%u043A%u043E%u0439%3A%0A%20%20%20%20%u0420%u0435%u0433%u0443%u043B%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0433%u0440%u043E%u043C%u043A%u043E%u0441%u0442%u044C%20%u0437%u0432%u0443%u043A%u0430%20%u0432%u043E%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация:

Выделить код

Код:

// Tab Sound Control от 02.09.2016
this.onclick = e => {
    if (e.button == 0) {
        tltp.hidePopup(); popup.openPopup(this, "after_start");
    }

    if (e.button == 1)
        !e.ctrlKey ? muteAllTabs() : unMuteAllTabs();

    if (e.button == 2 && !e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey) {
        e.preventDefault(); e.stopPropagation();
        muteTab();
    }
}

var popup = self.appendChild(document.createElement("menupopup"));
var tltp = self.appendChild(document.createElement("tooltip"));
var tabVolTltp = self.appendChild(document.createElement('tooltip'))
var pref = "media.default_volume";
var isPref = !!cbu.isPref(pref);
var du = Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils);
var o = {// https://github.com/Infocatcher/Private_Tab/issues/228#issuecomment-238963363
    get windows() {
        return (function*() {
            var ws = Services.wm.getEnumerator("navigator:browser");
            while(ws.hasMoreElements())
                yield ws.getNext();
        })();
    }
}

this.tooltipText = '';

this.onmouseover = e => {
    if (e.target != this) return;
    tltp.label = 'ЛКМ: Показать меню кнопки' +
        '\nСКМ: Отключить звук во всех вкладках' +
        '\nCtrl + СКМ: Включить звук во всех вкладках' +
        '\nПКМ: Переключить звук в активной вкладке' +
        '\nПКМ + Клавиши Модификаторы: Показать стандартное CB меню' +
        '\nКолесико Мыши: Регулировать уровень громкости во всех вкладках' +
        (isPref ? '\nCtrl + Колесико Мыши: Регулировать дефолтный уровень громкости для медиа' +
         '\n(текущий уровень: ' + cbu.getPrefs(pref) * 100 + '%)' : '');

    tltp.openPopup(this, "after_start");
}
this.onmouseleave = () => tltp.hidePopup();

this.onwheel = e => {
    if (e.ctrlKey && isPref) {// FF49+: https://bugzilla.mozilla.org/show_bug.cgi?id=1274622

        var step = .1;
        var val = parseFloat(Services.prefs.getCharPref(pref)),
            val = e.deltaY < 0 ? Math.min(1, val + step) : Math.max(0, val - step);

        Services.prefs.setCharPref(pref, (val).toFixed(1));

        tltp.label = 'дефолтный уровень громкости для медиа: ' + (val).toFixed(1) * 100 + '%';

        return;
    }

    var step = .05;

    for(var w of o.windows) for(var {contentWindow: win} of w.gBrowser.browsers) {
        var dwu = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
        dwu.audioVolume = e.deltaY < 0 ? Math.min(1, dwu.audioVolume + step) : Math.max(0, dwu.audioVolume - step);
    }
}

[
    {lbl: 'Вкл.\\Выкл. звук в активной вкладке', cmd: 'muteTab();'},
    {lbl: 'Отключить звук во всех вкладках', cmd: 'muteAllTabs();'},,
    {lbl: 'Включить звук во всех вкладках', cmd: 'unMuteAllTabs();'},
    {lbl: 'Задать уровень громкости во всех вкладках', cmd: 'setVolume();'},
    {pref: 'media.default_volume', lbl: 'Задать дефолтный уровень громкости', cmd: 'promptDialog(m.pref);'},
    {pref: 'media.autoplay.enabled', lbl: 'Переключить автовоспроизведение медиа', cmd: 'cbu.setPrefs(m.pref, !cbu.getPrefs(m.pref));'}
].forEach(m => {
    if (m.pref && !cbu.isPref(m.pref)) return;

    var mItem = popup.appendChild(document.createElement("menuitem"));

    mItem.onclick = () => eval(m.cmd);
    mItem.setAttribute('label', m.pref ? (m.lbl + ' (about:config)') : m.lbl);
    m.pref && (mItem.onmouseover = () => mItem.tooltipText = 'Текущее значение: ' + cbu.getPrefs(m.pref));
})

function muteTab() window.gBrowser.selectedTab.toggleMuteAudio();

function muteAllTabs() {
    for(var w of o.windows)
        [...w.gBrowser.tabs].filter(tab => tab.hasAttribute("soundplaying")
                                    && !tab.hasAttribute("muted")
                                    && tab.toggleMuteAudio());
}

function unMuteAllTabs() {
    for(var w of o.windows)
        [...w.gBrowser.tabs].filter(tab => tab.hasAttribute("soundplaying")
                                    && tab.hasAttribute("muted")
                                    && tab.toggleMuteAudio());
}

function setVolume() {
    var input = {value: 1};
    var prompt = Services.prompt.prompt(null, "Задать уровень громкости во всех вкладках", "от 0 до 1",
                                        input, null, {value: false});

    if (prompt)
        for(var w of o.windows) for(var {contentWindow: win} of w.gBrowser.browsers) {
            var dwu = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
            dwu.audioVolume = input.value;
        }
}

function promptDialog(pref) {
    var input = {value: cbu.getPrefs(pref)};
    var prompt = Services.prompt.prompt(null, "Задать дефолтный уровень громкости", "от 0.0 до 1.0",
                                        input, null, {value: false});

    if (prompt)
        cbu.setPrefs(pref, input.value);
}

function hotKeys(e) {
    // Alt + Shift + S - Переключить звук в активной вкладке в активном окне
    // Alt + Shift + M - Отключить звук во всех вкладках во всех окнах
    // Alt + Shift + U - Включить звук во всех вкладках во всех окнах
    // См: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#Constants_for_keyCode_value
    if (e.altKey && e.shiftKey && !e.ctrlKey && !e.metaKey) {

        switch (e.keyCode) {
            case 77: muteAllTabs(); break;
            case 83: muteTab(); break;
            case 85: unMuteAllTabs(); break;
            default: return;
        }

        e.preventDefault(); e.stopPropagation();
    }
}

function tabVolume(e) {
    let tab = e.originalTarget;
    while (tab && tab.localName != 'tab') tab = tab.parentNode;

    if (!tab || !e.shiftKey) return;

    e.preventDefault(); e.stopPropagation();

    var step = .05,
        dwu = tab.linkedBrowser.contentWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);

    dwu.audioVolume = e.deltaY < 0 ? Math.min(1, dwu.audioVolume + step) : Math.max(0, dwu.audioVolume - step);

    document.getElementById('tabbrowser-tab-tooltip').hidePopup();
    tabVolTltp.openPopup(tab, "after_start");
    tabVolTltp.label = 'Volume: ' + (dwu.audioVolume * 100).toFixed();
    tab.onmouseleave = () => {
        tabVolTltp.hidePopup();
        tab.onmouseleave = null;
    }
}

addEventListener("keydown", hotKeys, false, window);
addEventListener("wheel", tabVolume, true, window.gBrowser.tabContainer);
addDestructor(()=> {
    removeEventListener("keydown", hotKeys, false, window);
    removeEventListener("wheel", tabVolume, true, window.gBrowser.tabContainer);
});

Иконка (www.flaticon.com):

Выделить код

Код:

data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGhlaWdodD0nMTZweCcgd2lkdGg9JzE2cHgnPjxnPjxwYXRoIGQ9J00gOS43OSwxNCBDIDE1LjYsMTIuMSAxNS42LDMuOTcgOS43OSwyLjAyIEwgOS43OSwwLjEyOCBDIDE4LDIuMTEgMTgsMTMuOSA5Ljc5LDE1LjkgWiBNIDMuNTgsMTAuOCAwLDEwLjggMCw1LjI1IDMuNTgsNS4yNSA3Ljk0LDAuODk2IDcuOTQsMTUuMSBaIE0gOS43OSw0LjQyIEMgMTIuNyw1LjgyIDEyLjcsMTAuMiA5Ljc5LDExLjYgWicgc3R5bGU9J2ZpbGw6cmdiKDEyMSwxMjQsMTI4KScvPjwvZz48L3N2Zz4=


Спасибо: Dumby - за помощь с кодом, Vitaliy V. - за помощь с svg-иконкой и Infocatcher - за заимствованный у него код.

Отредактировано turbot (02-09-2016 01:09:18)

Отсутствует

 

№15311-10-2016 19:28:14

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: Готовые кнопки для Custom Buttons

Поиск выделенного текста в файловом поисковике( Firefox24+ ) от 19.02.2018.
Кнопка для поиска выделенного текста в бесплатном и простом файловом поисковике Everything (Portable), предназначенного для поиска файлов по названию на компьютере. После установки пути к программе иконка кнопки будет как у запускаемой программы(.exe файла), а в сплывающей подсказке у кнопки будет отображаться название запускаемой программы.
Можно создать много кнопок для поиска выделенного текста в других файловых поисковиках или для запуска других программ которым нужно передавать в качестве аргумента выделенный текст, но для запуска таких поисковиков или программ в коде инициализации кнопки в строке var arg = "/s"; нужно указать правильные аргументы запуска программ.

ЛКМ => Поиск выделенного текста в файловом поисковике,
СКМ => Установить путь к программе.

Код кнопки и инициализации:
Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041F%u043E%u0438%u0441%u043A%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0433%u043E%20%u0442%u0435%u043A%u0441%u0442%u0430%20%u0432%20%u0444%u0430%u0439%u043B%u043E%u0432%u043E%u043C%20%u043F%u043E%u0438%u0441%u043A%u043E%u0432%u0438%u043A%u0435%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-1%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.onclick%20%3De%3D%3E%20%7B%0A%20%20%20e.button%20%3D%3D%200%20%26%26%20runApp%28%29%3B%20%20%20//%20%u041B%u041A%u041C%20%20%20%20%0A%20%20%20e.button%20%3D%3D%201%20%26%26%20setPath%28%29%3B%20%20//%20%u0421%u041A%u041C%20%0A%7D%3B%0A%0Avar%20arg%20%3D%20%22/s%22%3B%20//%20%u0443%u043A%u0430%u0436%u0438%u0442%u0435%20%u0430%u0440%u0433%u0443%u043C%u0435%u043D%u0442%u044B%20%u043A%u043E%u0442%u043E%u0440%u044B%u0435%20%u043D%u0443%u0436%u043D%u043E%20%u043F%u0435%u0440%u0435%u0434%u0430%u0442%u044C%20%u043F%u0440%u043E%u0433%u0440%u0430%u043C%u043C%u0435%0Avar%20s%20%3D%20%22CB%22%20+%20_id.slice%2820%29%20+%20%22.pathForApp%22%3B%0A%0Afunction%20toggleButtonData%28%29%20%7B%0A%20%20%20var%20path%20%3D%20getPath%28%29%3B%0A%20%20%20document.getAnonymousNodes%28self%29%5B0%5D.src%20%3D%20%22moz-icon%3A//file%3A//%22%20+%20path%3B%0A%20%20%20self.tooltipText%20%3D%20%22%u041B%3A%20%u041F%u043E%u0438%u0441%u043A%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0433%u043E%20%u0442%u0435%u043A%u0441%u0442%u0430%20%u0432%20%u0444%u0430%u0439%u043B%u043E%u0432%u043E%u043C%20%u043F%u043E%u0438%u0441%u043A%u043E%u0432%u0438%u043A%u0435%3A%20%22%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20path.split%28%22%5C%5C%22%29.pop%28%29.replace%28%22.exe%22%2C%20%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%u0421%3A%20%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u043F%u0443%u0442%u044C%20%u043A%20%u043F%u0440%u043E%u0433%u0440%u0430%u043C%u043C%u0435%20%5Cn%u041F%3A%20CB%20%u041C%u0435%u043D%u044E%22%3B%0A%7D%3B%0AtoggleButtonData%28%29%3B%20%20%20%20%20%20%0AgPrefService.addObserver%28s%2C%20toggleButtonData%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20gPrefService.removeObserver%28s%2C%20toggleButtonData%29%20%29%3B%0A%0Afunction%20runApp%28%29%20%7B%0A%20%20%20var%20file%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.createInstance%28Ci.nsIFile%29%3B%0A%20%20%20file.initWithPath%28%20getPath%28%29%20%29%3B%0A%20%20%20var%20process%20%3D%20Cc%5B%22@mozilla.org/process/util%3B1%22%5D.createInstance%28Ci.nsIProcess%29%3B%0A%20%20%20process.init%28file%29%3B%0A%20%20%20var%20args%20%3D%20%5Barg%2C%20getSelect%28%29%5D%3B%0A%20%20%20try%20%7B%20process.runw%28true%2C%20args%2C%20args.length%29%20%7D%0A%20%20%20catch%28e%29%20%7B%20alert%28e%29%20%7D%3B%0A%7D%3B%0A%0Afunction%20setPath%28%29%20%7B%20%0A%20%20%20var%20fp%20%3D%20window.makeFilePicker%28%29%3B%0A%20%20%20fp.appendFilters%28%20fp.filterApps%20%29%3B%0A%20%20%20fp.init%28%20window%2C%20%22%u0423%u043A%u0430%u0436%u0438%u0442%u0435%20%u043F%u0443%u0442%u044C%20%u043A%20%u043F%u0440%u043E%u0433%u0440%u0430%u043C%u043C%u0435%22%2C%20fp.modeOpen%20%29%3B%0A%20%20%20fp.open%28%20result%20%3D%3E%20result%20%3D%3D%20fp.returnOK%20%26%26%20cbu.setPrefs%28s%2C%20convertFromUnicode%28%22UTF-8%22%2C%20fp.file.path%29%29%20%29%3B%20%0A%7D%3B%0A%0Afunction%20getPath%28%29%20%7B%0A%20%20%20var%20pref%20%3D%20Services.prefs%3B%0A%20%20%20var%20str%20%3D%20pref.getStringPref%20%3F%20pref.getStringPref%28s%29%20%3A%20pref.getComplexValue%28s%2C%20Ci.nsISupportsString%29.data%3B%0A%20%20%20try%20%7B%20return%20str%20%7D%20%0A%20%20%20catch%28e%29%20%7B%20return%20%22%3F%3F%3F%3F%3F%3F%22%20%7D%3B%0A%7D%3B%0A%0Afunction%20convertFromUnicode%28charset%2C%20str%29%20%7B%0A%20%20%20var%20converter%20%3D%20Cc%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.createInstance%28Ci.nsIScriptableUnicodeConverter%29%3B%0A%20%20%20converter.charset%20%3D%20charset%3B%0A%20%20%20str%20%3D%20converter.ConvertFromUnicode%28str%29%3B%0A%20%20%20return%20str%20+%20converter.Finish%28%29%3B%0A%7D%3B%0A%0Afunction%20getSelect%28%29%20%7B%0A%20%20%20return%20gBrowser.contentDocument.defaultView.getSelection%28%29%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация:

Выделить код

Код:

this.onclick =e=> {
   e.button == 0 && runApp();   // ЛКМ    
   e.button == 1 && setPath();  // СКМ 
};

var arg = "/s"; // укажите аргументы которые нужно передать программе
var s = "CB" + _id.slice(20) + ".pathForApp";

function toggleButtonData() {
   var path = getPath();
   document.getAnonymousNodes(self)[0].src = "moz-icon://file://" + path;
   self.tooltipText = "Л: Поиск выделенного текста в файловом поисковике: " 
                    + path.split("\\").pop().replace(".exe", "")
                    + "\nС: Установить путь к программе \nП: CB Меню";
};
toggleButtonData();      
gPrefService.addObserver(s, toggleButtonData, false);
addDestructor(()=> gPrefService.removeObserver(s, toggleButtonData) );

function runApp() {
   var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
   file.initWithPath( getPath() );
   var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
   process.init(file);
   var args = [arg, getSelect()];
   try { process.runw(true, args, args.length) }
   catch(e) { alert(e) };
};

function setPath() { 
   var fp = window.makeFilePicker();
   fp.appendFilters( fp.filterApps );
   fp.init( window, "Укажите путь к программе", fp.modeOpen );
   fp.open( result => result == fp.returnOK && cbu.setPrefs(s, convertFromUnicode("UTF-8", fp.file.path)) ); 
};

function getPath() {
   var pref = Services.prefs;
   var str = pref.getStringPref ? pref.getStringPref(s) : pref.getComplexValue(s, Ci.nsISupportsString).data;
   try { return str } 
   catch(e) { return "??????" };
};

function convertFromUnicode(charset, str) {
   var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
   converter.charset = charset;
   str = converter.ConvertFromUnicode(str);
   return str + converter.Finish();
};

function getSelect() {
   return gBrowser.contentDocument.defaultView.getSelection();
};

Отсутствует

 

№15418-10-2016 08:54:01

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: Готовые кнопки для Custom Buttons

Часы( Firefox52+ ) от 17.02.2018.
кнопка отображает дигитальные часики, в сплывающей подсказке кнопки отображается дата и название дня недели. Css стиль для часиков можно редактировать в вкладке кнопки Справка. Чтобы часики показывали секунды надо в коде инициализации удалить .slice(0,5)

Код кнопки, инициализации и справки:
Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0427%u0430%u0441%u044B%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-2%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bself.timer%20%3D%20setInterval%28%28%29%3D%3E%20self.label%20%3D%20new%20Date%28%29.toLocaleTimeString%28%27lv-LV%27%29.slice%280%2C5%29%2C%201000%29%3B%20%20%0A%0Avar%20style%20%3D%20custombutton.buttonGetHelp%28self%29.replace%28/id/g%2C%20_id%29%3B%0Avar%20uri%20%3D%20makeURI%28%27data%3Atext/css%2C%27+%20encodeURIComponent%28style%29%29%3B%0Avar%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0Asss.loadAndRegisterSheet%28uri%2C%200%29%3B%20%0A%0AaddDestructor%28%28%29%3D%3E%20%7B%20%0A%20%20%20sss.unregisterSheet%28uri%2C%200%29%3B%0A%20%20%20try%20%7B%20clearTimeout%28self.timer%29%20%7D%20catch%28e%29%20%7B%7D%3B%0A%7D%29%3B%0A%0Athis.onmouseover%20%3D%28%29%3D%3E%20%7B%0A%20%20%20var%20date%20%3D%20new%20Date%28%29%3B%0A%20%20%20self.tooltipText%20%3D%20date.toLocaleDateString%28%29%20+%20%27.%20%27%20+%20date.toLocaleDateString%28%27ru%27%2C%20%7Bweekday%3A%20%27long%27%7D%29%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%23id%20.toolbarbutton-text%20%7B%0A%20%20%20color%3A%20black%20%21important%3B%0A%20%20%20font-weight%3A%20bold%20%21important%3B%0A%20%20%20display%3A%20block%20%21important%3B%0A%7D%0A%0A%23id%20.toolbarbutton-icon%20%7B%0A%20%20display%3A%20none%20%21important%3B%0A%7D%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация:

Выделить код

Код:

self.timer = setInterval(()=> self.label = new Date().toLocaleTimeString('lv-LV').slice(0,5), 1000);  

var style = custombutton.buttonGetHelp(self).replace(/id/g, _id);
var uri = makeURI('data:text/css,'+ encodeURIComponent(style));
var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
sss.loadAndRegisterSheet(uri, 0); 

addDestructor(()=> { 
   sss.unregisterSheet(uri, 0);
   try { clearTimeout(self.timer) } catch(e) {};
});

this.onmouseover =()=> {
   var date = new Date();
   self.tooltipText = date.toLocaleDateString() + '. ' + date.toLocaleDateString('ru', {weekday: 'long'});
};

Справка:

Выделить код

Код:

#id .toolbarbutton-text {
   color: black !important;
   font-weight: bold !important;
   display: block !important;
}

#id .toolbarbutton-icon {
  display: none !important;
}

Отсутствует

 

№15527-10-2016 18:53:43

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: Готовые кнопки для Custom Buttons

Переключить текущий поисковик( Firefox24+ ) от 27.12.2016.
кнопка открывает меню с установленными поисковиками и при клике на выбранный поисковик устанавливает его как текущий.

Код кнопки и инициализации:
Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0442%u0435%u043A%u0443%u0449%u0438%u0439%20%u043F%u043E%u0438%u0441%u043A%u043E%u0432%u0438%u043A%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CAAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs9Pt8xetPtu9FsfFNtu%252BTzvb2%252B%252Fne4dFJeBw0egA%252FfAJAfAA8ewBBegAAAAD%252B%252FPtft98Mp%252BwWsfAVsvEbs%252FQeqvF8xO7%252F%252F%252F63yqkxdgM7gwE%252FggM%252BfQA%252BegBDeQDe7PIbotgQufcMufEPtfIPsvAbs%252FQvq%252Bfz%252Bf%252F%252B%252B%252FZKhR05hgBBhQI8hgBAgAI9ewD0%252B%252Fg3pswAtO8Cxf4Kw%252FsJvvYAqupKsNv%252B%252Fv7%252F%252FP5VkSU0iQA7jQA9hgBDgQU%252BfQH%252F%252Ff%252FQ6fM4sM4KsN8AteMCruIqqdbZ7PH8%252Fv%252Fg6Nc%252Fhg05kAA8jAM9iQI%252BhQA%252BgQDQu6b97uv%252F%252F%252F7V8Pqw3eiWz97q8%252Ff%252F%252F%252F%252F7%252FPptpkkqjQE4kwA7kAA5iwI8iAA8hQCOSSKdXjiyflbAkG7u2s%252F%252B%252F%252F39%252F%252F7r8utrqEYtjQE8lgA7kwA7kwA9jwA9igA9hACiWSekVRyeSgiYSBHx6N%252F%252B%252Fv7k7OFRmiYtlAA5lwI7lwI4lAA7kgI9jwE9iwI4iQCoVhWcTxCmb0K%252BooT8%252Fv%252F7%252F%252F%252FJ2r8fdwI1mwA3mQA3mgA8lAE8lAE4jwA9iwE%252BhwGfXifWvqz%252B%252Ff%252F58u%252Fev6Dt4tr%252B%252F%252F2ZuIUsggA7mgM6mAM3lgA5lgA6kQE%252FkwBChwHt4dv%252F%252F%252F728ei1bCi7VAC5XQ7kz7n%252F%252F%252F6bsZkgcB03lQA9lgM7kwA2iQktZToPK4r9%252F%252F%252F9%252F%252F%252FSqYK5UwDKZAS9WALIkFn%252B%252F%252F3%252F%252BP8oKccGGcIRJrERILYFEMwAAuEAAdX%252F%252Ff7%252F%252FP%252B%252BfDvGXQLIZgLEWgLOjlf7%252F%252F%252F%252F%252F%252F9QU90EAPQAAf8DAP0AAfMAAOUDAtr%252F%252F%252F%252F7%252B%252Fu2bCTIYwDPZgDBWQDSr4P%252F%252Fv%252F%252F%252FP5GRuABAPkAA%252FwBAfkDAPAAAesAAN%252F%252F%252B%252Fz%252F%252F%252F64g1C5VwDMYwK8Yg7y5tz8%252Fv%252FV1PYKDOcAAP0DAf4AAf0AAfYEAOwAAuAAAAD%252F%252FPvi28ymXyChTATRrIb8%252F%252F3v8fk6P8MAAdUCAvoAAP0CAP0AAfYAAO4AAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAA%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043F%u043E%20%u043B%u0435%u0432%u043E%u043C%u0443%20%u043A%u043B%u0438%u043A%u0443%20.............%0Athis._handleClick%20%3D%28%29%3D%3E%20menuPopup.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043F%u043E%u0434%u043C%u0435%u043D%u044E%20%u0441%20%u043F%u043E%u0438%u0441%u043A%u043E%u0432%u0438%u043A%u0430%u043C%u0438%20%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20.............%20%0Avar%20menuPopup%20%3D%20self.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0AmenuPopup.setAttribute%28%27style%27%2C%20%27overflow%3A%20scroll%27%29%3B%20%0A%0Afunction%20setItemsToMenuPopup%28%29%20%7B%0A%20%20%20menuPopup.textContent%20%3D%20%22%22%3B%20%20%20%20%20%20%0A%0A%20%20%20var%20engines%20%3D%20Services.search.getVisibleEngines%28%7B%7D%29%3B%0A%20%20%20engines.forEach%28engine%3D%3E%20%7B%20%0A%20%20%20%20%20%20var%20mItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20%20%20%20mItem.setAttribute%28%22label%22%2C%20engine.name%29%3B%0A%20%20%20%20%20%20mItem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%22%29%3B%0A%20%20%20%20%20%20mItem.setAttribute%28%22src%22%2C%20engine.iconURI.spec%29%3B%0A%20%20%20%20%20%20mItem.onmousedown%20%3D%28%29%3D%3E%20setTimeout%28%28%29%3D%3E%20Services.search.currentEngine%20%3D%20engine%2C%200%29%3B%0A%20%20%20%20%20%20menuPopup.appendChild%28mItem%29%3B%0A%20%20%20%7D%29%0A%7D%3B%20%20%0AsetItemsToMenuPopup%28%29%3B%0A%0A%0A//%20%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u043D%u0443%u0436%u043D%u0443%u044E%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043F%u0440%u0438%20%u0441%u0442%u0430%u0440%u0442%u0435%20%u0438%u043B%u0438%20%u043F%u0440%u0438%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%u0445%20%u043F%u043E%u0438%u0441%u043A%u043E%u0432%u0438%u043A%u0430%u0445%20.............%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29.%0A%20%20%20src%20%3D%20Services.search.currentEngine.iconURI.spec%3B%0A%7D%3B%0AtoggleImage%28%29%3B%0A%20%20%20%0A%20%20%20%0A//%20%u041D%u0430%u0431%u043B%u044E%u0434%u0430%u0442%u0435%u043B%u044C%20%u0437%u0430%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%u043C%u0438%20%u0432%20%u043F%u043E%u0438%u0441%u043A%u043E%u0432%u0438%u043A%u0430%u0445%20%u043F%u043E%u0434%u043C%u0435%u043D%u044E%20.............%20%0Avar%20getEngineModified%20%3D%20%7B%0A%20%20%20observe%3A%28subject%2C%20topic%2C%20data%29%3D%3E%20%7B%0A%20%20%20%20%20%20if%20%28%20/changed%7Cremoved%7Ccurrent/.test%28data%29%20%29%20%7B%20toggleImage%28%29%3B%20setItemsToMenuPopup%28%29%3B%20%7D%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%7D%0A%7D%3B%0AServices.obs.addObserver%28getEngineModified%2C%20%22browser-search-engine-modified%22%2C%20false%29%3B%20%20%20%0AaddDestructor%28%28%29%3D%3E%20Services.obs.removeObserver%28getEngineModified%2C%20%22browser-search-engine-modified%22%29%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация:

Выделить код

Код:

// Открыть меню кнопки по левому клику .............
this._handleClick =()=> menuPopup.showPopup(this, -1, -1, "popup", "bottomleft", "topleft");


// Создать подменю с поисковиками у кнопки ............. 
var menuPopup = self.appendChild(document.createElement("menupopup"));
menuPopup.setAttribute('style', 'overflow: scroll'); 

function setItemsToMenuPopup() {
   menuPopup.textContent = "";      

   var engines = Services.search.getVisibleEngines({});
   engines.forEach(engine=> { 
      var mItem = document.createElement("menuitem");
      mItem.setAttribute("label", engine.name);
      mItem.setAttribute("class", "menuitem-iconic");
      mItem.setAttribute("src", engine.iconURI.spec);
      mItem.onmousedown =()=> setTimeout(()=> Services.search.currentEngine = engine, 0);
      menuPopup.appendChild(mItem);
   })
};  
setItemsToMenuPopup();


// Установить нужную иконку кнопки при старте или при изменениях поисковиках .............
function toggleImage() {
   self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon").
   src = Services.search.currentEngine.iconURI.spec;
};
toggleImage();
   
   
// Наблюдатель за изменениями в поисковиках подменю ............. 
var getEngineModified = {
   observe:(subject, topic, data)=> {
      if ( /changed|removed|current/.test(data) ) { toggleImage(); setItemsToMenuPopup(); };             
   }
};
Services.obs.addObserver(getEngineModified, "browser-search-engine-modified", false);   
addDestructor(()=> Services.obs.removeObserver(getEngineModified, "browser-search-engine-modified"));

Отсутствует

 

№15613-11-2016 12:59:27

Inko7
Участник
 
Группа: Members
Зарегистрирован: 09-11-2009
Сообщений: 1008
UA: Firefox 49.0

Re: Готовые кнопки для Custom Buttons

Сумматор ( Firefox24+ ) от 14.11.2016.
Последовательно складывает выделяемые на странице числа. Также работает с выделенными по Ctrl+клик ячейками таблиц. Текущий результат сложения выводится в адресной строке.

Клики на кнопке:
ЛКМ => подсчитать сумму
СКМ => меню кнопки
ПКМ => сбросить результат

Код кнопки и инициализации:
Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0421%u0443%u043C%u043C%u0430%u0442%u043E%u0440%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABm0lEQVQ4jWNggALf6s02PhWbHYjBAQ3rBRjQQWTb/hnli+/+qVnx8H/18gf/k/tPvkvsPfEchpP7Tr4uWXDrV8Gca/99KjY7YBjg0LCfJXXi6cPd2z/8b9/85n9sx5E+dPnQ5p0haRPPPMFqAAMDA0N40w79wjnXnndv//C/bNHtx6Ete83Q1cR2HJ6C0wAGBgaG6LZDjY1rnv3p3v7hf9rE0wcdGvazoLmEw6t0qwROAxgYGBgSuo8d6Nz67n/rpjdvkyecnoxXMTbg27BZJGvq+Zvd2z/8L5l/82l40w59kg1JaD/sUL7ozpuW9S/+RLcfrCbZgPCmHfoFc64+Suw9vo9kzQ4N+zlSJpw6njXtwl3fhs0iJBsQ1310VsWS+1+i2w8nYZPHa2hU+4HQquX3P8T3HFuNS01o457DWCW8SrdK5M64dCNv1pWLWNM7AwNDfNexksTe40exGpDYe3xf/eon/yNa9x9J6D7agY7TJp9dU7P8wfOEnuPzMU3uPrawaO6NDzUrHv7Hh6uW3f8f33WsEcMAcrMzAGtTCbhDYacMAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0A%0A//%20%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20.............%0Athis.onclick%20%3De%3D%3E%20%7B%0A%0A%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20summar%28%29%3B%20//%20%u041B%u041A%u041C%0A%20%20%20if%20%28%20e.button%20%3D%3D%201%20%29%20gShowPopup%28this%29%3B%20//%20%u0421%u041A%u041C%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%202%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.shiftKey%20%26%26%20%21e.altKey%20%26%26%20%21e.metaKey%20%29%20%7B%20//%20%u041F%u041A%u041C%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20sum%20%3D%200%3B%0A%20%20%20%20%20%20%20%20tabSummar.label%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0A%0A%0Avar%20sum%20%3D%200%3B%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u0432%20%u0430%u0434%u0440%u0435%u0441%u043D%u043E%u0439%20%u0441%u0442%u0440%u043E%u043A%u0435%20%u0441%u0447%u0451%u0442%u0447%u0438%u043A%20%u0432%u043A%u043B%u0430%u0434%u043E%u043A%20....%0Avar%20tabSummar%20%3D%20document.createElement%28%22statusbarpanel%22%29%3B%0AtabSummar.setAttribute%28%22id%22%2C%20%22tabSummar%22%29%3B%0A//tabSummar.setAttribute%28%22context%22%2C%20%22event.stopPropagation%28%29%22%29%3B%0A//tabSummar.setAttribute%28%22tooltiptext%22%2C%20%22%u0418%u0442%u043E%u0433%u043E%u0432%u0430%u044F%20%u0441%u0443%u043C%u043C%u0430%22%29%3B%20%0Avar%20urlbarIcons%20%3D%20document.getElementById%28%22urlbar-icons%22%29%3B%20%0AurlbarIcons.insertBefore%28tabSummar%2C%20urlbarIcons.firstChild%29%3B%0AaddDestructor%28%28%29%3D%3E%20tabSummar.remove%28%29%20%29%3B%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20.............%0A//%20this.onmouseover%20%3D%28%29%3D%3E%20%7B%20this.tooltipText%20%3D%20%22%u0418%u0442%u043E%u0433%u043E%u0432%u0430%u044F%20%u0441%u0443%u043C%u043C%u0430%3A%20%22%20+%20sum%3B%20%7D%3B%0Athis.tooltipText%20%3D%20%22%u041B%3A%20%u041F%u043E%u0434%u0441%u0447%u0438%u0442%u0430%u0442%u044C%20%5Cn%u0421%3A%20CB%20%u043C%u0435%u043D%u044E%20%5Cn%u041F%3A%20%u0421%u0431%u0440%u043E%u0441%u0438%u0442%u044C%22%3B%0A%0Afunction%20summar%28%29%20%7B%0A%20%20%20var%20sel%20%3D%20document.commandDispatcher.focusedWindow.getSelection%28%29.toString%28%29%3B%0A%20%20%20var%20nums%20%3D%20sel.split%28/%5Cs+/%29%3B%0A%0A%20%20%20nums.forEach%28num%3D%3E%20%7B%0A%20%20%20%20%20%20num%20%3D%20+num%3B%0A%20%20%20%20%20%20if%20%28%20isFinite%28num%29%20%29%20sum%20+%3D%20num%3B%0A%20%20%20%7D%29%3B%0A%20%20%20sum%20%3D%20fixPrecision%28sum%29%3B%0A%20%20%20sum%20%3D%20sum*1%3B%0A%20%20%20tabSummar.label%20%3D%20sum%3B%0A%7D%3B%0A%0A%0Afunction%20fixPrecision%28n%29%20%7B%0A%20%20%20//%20Try%20fix%20%22bugs%22%20with%20floating%20point%20operations%0A%20%20%20//%20E.g.%200.3/0.1%20%3D%202.9999999999999995%0A%20%20%20return%20n.toPrecision%2813%29.toString%28%29%0A%20%20%20%20%20%20%20%20%20%20%20.replace%28/%5C.0+%28e%7C%24%29/%2C%20%22%241%22%29%20//%201.000%20and%201.000e5%20%3D%3E%201%0A%20%20%20%20%20%20%20%20%20%20%20.replace%28/%28%5C.%5Cd*%5B%5E0%5D%290+%28e%7C%24%29/%2C%20%22%241%242%22%29%3B%20//%201.200%20and%201.200e5%20%3D%3E%201.2%0A%7D%3B%0A%0A%0A//%20Css%20%u0441%u0442%u0438%u043B%u044C%20%u0434%u043B%u044F%20%u043E%u0442%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%20%u0440%u0435%u0437%u0443%u043B%u044C%u0442%u0430%u0442%u0430%0A%20%20%20var%20uri%20%3D%20makeURI%28%27data%3Atext/css%2C%27+%20encodeURIComponent%28%27%5C%0A%20%20%20%20%20%20%23tabSummar%20%7B%20color%3A%20blue%20%21important%3B%20%7D%5C%0A%20%20%20%20%20%20%23tabSummar%20%7B%20-moz-appearance%3A%20none%20%21important%3B%20border%3A%200%20%21important%3B%20margin-right%3A%20-8px%20%21important%3B%20%7D%5C%0A%20%20%20%27%29%29%3B%0A%20%20%20var%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0A%20%20%20sss.loadAndRegisterSheet%28uri%2C%200%29%3B%0A%20%20%20addDestructor%28%28%29%3D%3E%20sss.unregisterSheet%28uri%2C%200%29%20%29%3B%20%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация:

Выделить код

Код:

/*Initialization Code*/

//  Настройка функций кликов мыши для кнопки .............
this.onclick =e=> {

   if ( e.button == 0 ) summar(); // ЛКМ
   if ( e.button == 1 ) gShowPopup(this); // СКМ 
   if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { // ПКМ
        e.preventDefault();
        sum = 0;
        tabSummar.label = "";
        }
};


var sum = 0;

// Создать в адресной строке счётчик вкладок ....
var tabSummar = document.createElement("statusbarpanel");
tabSummar.setAttribute("id", "tabSummar");
//tabSummar.setAttribute("context", "event.stopPropagation()");
//tabSummar.setAttribute("tooltiptext", "Итоговая сумма"); 
var urlbarIcons = document.getElementById("urlbar-icons"); 
urlbarIcons.insertBefore(tabSummar, urlbarIcons.firstChild);
addDestructor(()=> tabSummar.remove() );


// Подсказка для кнопки .............
// this.onmouseover =()=> { this.tooltipText = "Итоговая сумма: " + sum; };
this.tooltipText = "Л: Подсчитать \nС: CB меню \nП: Сбросить";

function summar() {
   var sel = document.commandDispatcher.focusedWindow.getSelection().toString();
   var nums = sel.split(/\s+/);

   nums.forEach(num=> {
      num = +num;
      if ( isFinite(num) ) sum += num;
   });
   sum = fixPrecision(sum);
   sum = sum*1;
   tabSummar.label = sum;
};


function fixPrecision(n) {
   // Try fix "bugs" with floating point operations
   // E.g. 0.3/0.1 = 2.9999999999999995
   return n.toPrecision(13).toString()
           .replace(/\.0+(e|$)/, "$1") // 1.000 and 1.000e5 => 1
           .replace(/(\.\d*[^0])0+(e|$)/, "$1$2"); // 1.200 and 1.200e5 => 1.2
};


// Css стиль для отображения результата
   var uri = makeURI('data:text/css,'+ encodeURIComponent('\
      #tabSummar { color: blue !important; }\
      #tabSummar { -moz-appearance: none !important; border: 0 !important; margin-right: -8px !important; }\
   '));
   var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   sss.loadAndRegisterSheet(uri, 0);
   addDestructor(()=> sss.unregisterSheet(uri, 0) );


Части кода кнопки заимствованы у bunda1, Infocatcher и др. Спасибо им и всем остальным за советы и помощь.

Отредактировано Inko7 (14-11-2016 21:54:50)

Отсутствует

 

№15706-12-2016 20:50:07

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: Готовые кнопки для Custom Buttons

Добавить все открытие вкладки в папку закладок( Firefox24+ ) от 18.02.2018.
кнопка создает новые подпапки закладок с названием из значения текущей даты и времени в указанной папке закладок и сохраняет все открытие вкладки как закладки в упомянутых выше подпапках. Папку закладок нужно указать в начале кода инициализации кнопки, если папка закладок для сохранения подпапок не будет указана кнопка сохранит подпапки на панели закладок.

ЛКМ => Добавить все открытие вкладки в папку закладок.

Код кнопки и инициализации:
Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0432%u0441%u0435%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u0435%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0432%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAEFBwcD5TTywYtQTQHAAAAAAECAgAAAAABAgEDAAAAACZKJaoakiP/K4A0ywIAAAIBAQAAAAAAAAAAAAAAAQEBAQAAAAwaIj8ZrvD9GLr382eet7eKfnt7SkI9PBgQCg4CAAUAJGYouiDSL/87r0DbCgMABwAAAQACAgICAAAAAQMDBAAXFRYjGh8mahGR2O8fx///Ic3//obh/P+s2PD/W7HZ6CKe4NcvmWr7Ercb/0+6P++PTBBXCwUAAwAAAQAAAAAABQYHAxodHzcaFBdLDHrD3ifN//8oxvf6Hsb/+xeLff0FjED/DqRQ/x+hM/8KkhX/Qb1J+nS3UOtUoUjRNHg9vw0NDgEjIiUUIBMRHBstN0sep9/pLNH//y/O+v430v//E3pB/xClAP440zf9Ps1I/zekQv9EpE7/S79j/2jQeP9dpmL/DQ0OAR4jJxAfZoJ2I73u7i/T//8y0Pz+NdT8/zrX//8yp4r/O7ps/2jXlP9/5Iz/YdRr/2KoZf51mWP/Y4JY6ERbR70AAAAAGmV6ckbo//9D5v7+ONf+/jbV/P482f3/P9z9/0Df//9x4/7/fuP//2rTm/903Hj/Zp1f++q7jP+XelyoAAAAAAEBAQEAAQEBECQkITR8h3tJx+DZTN///0Hd/P5D4P3/YOf8/670/P+l8///asiV/3fKev9xnG7778qc/5yDY6gAAAAAAAAAAAAAAAAAAQEBAAAAAAAGBwA0oMfGTOn//4fs/PzN+P//l/D8/7T8//96u5//ZZVl/4Ocfvv84Lz/nIRkqAAAAAAAAAAAAAAAAAECAgIBBgcIAAAAAESAm6Jv5///1vv9++38///u+Pr/3PDz/+Di2v/j1rr/6Ne8+//v0P+ei3KoAAAAAAAAAAAAAAAAAAAAAAIDAwMAAAAAiJiho2zT///L9/z7+f3+//77+v/u7O7/7+Ta///qzP/35Mn7//PX/6KUgagAAAAAAAAAAAAAAAAAAAAAAwMDBAAAAACuqKWijdv//87t+Pv/////+fv7/+zu8P/t5dz//OrQ//np0fv/+d//o5eGqAAAAAAAAAAAAAAAAAAAAAADAwMEAAAAAKampaL/////+vr6+////v/8/Pv/7e7v/+/n3v//79f//O3Y+//+6P+kmoqoAAAAAAAAAAAAAAAAAAAAAAMDAwQAAAAApKSkoP/////4+fj5/f39/v39/f7z9Pb/8Oni///z4P/88eD7///y/6SdkKgAAAAAAAAAAAAAAAAAAAAAAwMDBAAAAACrq6ui//////v7+/v///////////7///728ez8+vHi/Prz5fn///n/pJ6VpwAAAAAAAAAAAAAAAAAAAAACAgIDAAAAAF5eXlrGxsXE0tLS0erq6un6+vr5////////////////+/v4+/////+opZ2oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwICExMTEisrKylHR0dFaGdnZYmKi4inpqam19TP2pGOiI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20parentFolder%20%3D%20%22New%20Folder%22%3B%20//%20%u043F%u0430%u043F%u043A%u0430%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%20%u0434%u043B%u044F%20%u0434%u043E%u0431%u0430%u0432%u043B%u0435%u043D%u0438%u0438%20%u043F%u043E%u0434%u043F%u0430%u043F%u043E%u043A%20%u0441%20%u0441%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u043D%u044B%u043C%u0438%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u043C%u0438%0Avar%20index%20%3D%20-1%3B%20%20%20%20%20//%200%20-%20%u043F%u043E%u0434%u043F%u0430%u043F%u043A%u0430%20%u0432%20%u043F%u0430%u043F%u043A%u0443%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0435%u0442%u0441%u044F%20%u0432%20%u043D%u0430%u0447%u0430%u043B%u0435%2C%20-1%20%u0432%20%u043A%u043E%u043D%u0446%u0435%0A%0A%0A//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20..........%0Athis._handleClick%20%3D%28%29%3D%3E%20%7B%0A%20%20%20%0A%20%20%20//%20%u0441%u043E%u0437%u0434%u0430%u0442%u044C%20%u043D%u043E%u0432%u0443%u044E%20%u043F%u043E%u0434%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%20%u0432%20%u0443%u043A%u0430%u0437%u0430%u043D%u043D%u043E%u0439%20%u043F%u0430%u043F%u043A%u0435%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%20%u0438%u043B%u0438%20%u043D%u0430%20%u043F%u0430%u043D%u0435%u043B%u0438%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%0A%20%20%20var%20parentFolderId%20%3D%20getBookFolderId%28%29%20%7C%7C%203%3B%0A%20%20%20var%20subfolder%20%3D%20getDataAndTime%28%29%3B%0A%20%20%20var%20subfolderId%20%3D%20PlacesUtils.bookmarks.createFolder%28parentFolderId%2C%20subfolder%2C%20index%29%3B%20%20%20%20%20%0A%0A%20%20%20var%20array%20%3D%20getTabsInfo%28%29%3B%0A%0A%20%20%20//%20%u0440%u0435%u043A%u0443%u0440%u0441%u0438%u0432%u043D%u043E%20%u0441%20%u0437%u0430%u0434%u0435%u0440%u0436%u043A%u043E%u0439%20%u0434%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0432%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%0A%20%20%20function%20save%28%29%20%7B%0A%20%20%20%20%20%20var%20el%20%3D%20array.shift%28%29%3B%0A%20%20%20%20%20%20if%20%28%20el%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20PlacesUtils.bookmarks.insertBookmark%28subfolderId%2C%20el.uri%2C%20-1%2C%20el.label%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20setTimeout%28save%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20//%20%u0432%u0441%u043F%u043B%u044B%u0432%u0430%u044E%u0449%u0430%u044F%20%u043F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20var%20parentFolderName%20%3D%20%28parentFolderId%20%3D%3D%203%29%20%3F%20%22%u041F%u0430%u043D%u0435%u043B%u044C%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%22%20%3A%20parentFolder%3B%0A%20%20%20%20%20%20%20%20%20%20%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%0A%20%20%20%20%20%20%20%20%20%20%20.showAlertNotification%28self.image%2C%20self.label%2C%20%22%u0414%u043E%u0431%u0430%u0432%u0438%u043B%20%u0432%u0441%u0435%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0432%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%3A%5Cn%22%20+%20parentFolder%20+%20%22%20%3E%20%22%20+%20subfolder%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%20%0A%20%20%20%7D%3B%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20save%28%29%3B%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u0442%u0435%u043A%u0443%u0449%u0443%u044E%20%u0434%u0430%u0442%u0443%20%u0438%20%u0432%u0440%u0435%u043C%u044F%20..........%20%0Afunction%20getDataAndTime%28%29%20%7B%0A%20%20%20var%20date%20%3D%20new%20Date%28%29%3B%0A%20%20%20var%20time%20%3D%20date.toLocaleString%28%27ru%27%2C%20%7Byear%3A%20%27numeric%27%2C%20month%3A%20%27numeric%27%2C%20day%3A%20%27numeric%27%7D%29%0A%20%20%20return%20%28time%20+%20%27.%20%27%20+%20date.toLocaleTimeString%28%27lv-LV%27%29%29%3B%20//.replace%28/%3A/g%2C%20%22%B7%22%29%3B%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20id%20%u043F%u0430%u043F%u043A%u0438%20parentFolderName%20..........%20%0Afunction%20getBookFolderId%28id%20%3D%201%29%20%7B%0A%20%20%20var%20folder%20%3D%20PlacesUtils.getFolderContents%28id%29.root%3B%0A%0A%20%20%20for%20%28%20var%20i%20%3D%200%3B%20i%20%3C%20folder.childCount%3B%20i++%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20child%20%3D%20folder.getChild%28i%29%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%20%21PlacesUtils.nodeIsFolder%28child%29%20%29%20continue%3B%20%0A%0A%20%20%20%20%20%20%20%20%20%20if%20%28%20child.title%20%3D%3D%20parentFolder%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.result%20%3D%20child.itemId%3B%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20else%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20getBookFolderId%28child.itemId%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%0A%20%20%20return%20self.result%3B%20%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u043C%u0430%u0441%u0441%u0438%u0432%20%u0441%20%u0430%u0434%u0440%u0435%u0441%u0430%u043C%u0438%20%u0438%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u044F%u043C%u0438%20%u0432%u043A%u043B%u0430%u0434%u043E%u043A%20..........%20%0Afunction%20getTabsInfo%28%29%20%7B%0A%20%20%20var%20array%20%3D%20%5B%5D%2C%20seenURIs%20%3D%20%5B%5D%3B%0A%20%20%20%0A%20%20%20%5B...gBrowser.tabs%5D.forEach%28tab%3D%3E%20%7B%0A%20%20%20%20%20%20var%20label%20%3D%20tab.label%3B%0A%20%20%20%20%20%20var%20uri%20%3D%20tab.linkedBrowser.currentURI.spec%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20if%20%28%20seenURIs%5Buri%5D%20%29%20return%3B%20//%20%u0441%u0442%u043E%u043F%20%u0435%u0441%u043B%u0438%20%u0442%u0430%u043A%u043E%u0439%20%u0430%u0434%u0440%u0435%u0441%20%u0443%u0436%u0435%20%u0431%u044B%u043B%0A%20%20%20%20%20%20seenURIs%5Buri%5D%20%3D%20true%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20array.push%28%7B%20uri%3A%20Services.io.newURI%28uri%2C%20null%2C%20null%29%2C%20label%3A%20label%20%7D%29%3B%0A%20%20%20%7D%29%3B%0A%0A%20%20%20return%20array%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация:

Выделить код

Код:

var parentFolder = "New Folder"; // папка закладок для добавлении подпапок с сохраненными вкладками
var index = -1;     // 0 - подпапка в папку добавляется в начале, -1 в конце


// Настройка функций кликов мыши для кнопки ..........
this._handleClick =()=> {
   
   // создать новую подпапку закладок в указанной папке закладок или на панели закладок
   var parentFolderId = getBookFolderId() || 3;
   var subfolder = getDataAndTime();
   var subfolderId = PlacesUtils.bookmarks.createFolder(parentFolderId, subfolder, index);     

   var array = getTabsInfo();

   // рекурсивно с задержкой добавить вкладки в папку закладок
   function save() {
      var el = array.shift();
      if ( el ) {
           PlacesUtils.bookmarks.insertBookmark(subfolderId, el.uri, -1, el.label);
           setTimeout(save, 0);
           }
      else
           {
           // всплывающая подсказка         
           var parentFolderName = (parentFolderId == 3) ? "Панель закладок" : parentFolder;
           Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
           .showAlertNotification(self.image, self.label, "Добавил все вкладки в папку закладок:\n" + parentFolder + " > " + subfolder);
           } 
   };           
   save();
};


// Получить текущую дату и время .......... 
function getDataAndTime() {
   var date = new Date();
   var time = date.toLocaleString('ru', {year: 'numeric', month: 'numeric', day: 'numeric'})
   return (time + '. ' + date.toLocaleTimeString('lv-LV')); //.replace(/:/g, "·");
};


// Получить id папки parentFolderName .......... 
function getBookFolderId(id = 1) {
   var folder = PlacesUtils.getFolderContents(id).root;

   for ( var i = 0; i < folder.childCount; i++ ) {
          var child = folder.getChild(i);
          if ( !PlacesUtils.nodeIsFolder(child) ) continue; 

          if ( child.title == parentFolder) {
               self.result = child.itemId;         
               break;
               }
          else 
               getBookFolderId(child.itemId);
          }
  
   return self.result; 
};


// Получить массив с адресами и названиями вкладок .......... 
function getTabsInfo() {
   var array = [], seenURIs = [];
   
   [...gBrowser.tabs].forEach(tab=> {
      var label = tab.label;
      var uri = tab.linkedBrowser.currentURI.spec;
      
      if ( seenURIs[uri] ) return; // стоп если такой адрес уже был
      seenURIs[uri] = true;
      
      array.push({ uri: Services.io.newURI(uri, null, null), label: label });
   });

   return array;
};

Отсутствует

 

№15811-12-2016 00:44:21

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: Готовые кнопки для Custom Buttons

Переключить многопроцессный режим( Firefox50+ ) от 15.05.2019.
кнопка включает - выключает многопроцессный режим (e10) и перезапускает браузер. При включеном многопроцессный режиме иконка кнопки будет зелёного цвета.

ЛКМ => Переключить многопроцессный режим.

Код кнопки и инициализации:
Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043C%u043D%u043E%u0433%u043E%u043F%u0440%u043E%u0446%u0435%u0441%u0441%u043D%u044B%u0439%20%u0440%u0435%u0436%u0438%u043C%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQCFAn4ChQN+A4UDfwOFA38DhQJ/AoUBfgGFAn4ChQN+A4UDfgOFAn4ChQB+AIUAfgCFA38DhQJ/AoUAfgCFAH0AhQqCCt82mDbfRZ9F30afRt9GoEbfOZo53yWPJd83mDffRZ9F30WfRd8+mz7fFIcU3xaIFt9IoUjfNJc03weBB98AfgDfHIsc/4bAhv+p0an/qNGo/6jSqP+Kwor/WahZ/4W/hf+p0an/qtKq/5bHlv83mTf/VKdU/6PPo/+RxpH/LZQt/wF+Af8okSj/wt7C/9nq2f/B3sH/wt/C/57Mnv9jrWP/k8aT/9nq2f/h7uH/rNOs/0yjTP+XyZf/xeDF/9Xo1f9irmL/BYAF/yiRKP+62rr/h7+H/zeXN/82lzb/LJIs/xSHFP8dih3/jMKM/6XPpf84mDj/OZk5/7DWsP9qsmr/rtWu/5DFkP8OhA7/KJEo/7fZt/9qsWr/BoEG/waBBv8FgAX/An8C/wqBCv+AvYD/m8ub/yWPJf9IoUj/qNGo/0agRv+BvoH/o8+j/xuLG/8okSj/uNm4/3W3df8aihr/GYkZ/w+FD/8AfgD/B4AH/368fv+aypr/Io4i/1SnVP+m0ab/PZw9/3G2cf+t1K3/Io4i/yiRKP+/3b//vNu8/5HFkf+Nw43/VadV/wB+AP8HgAf/frx+/5rKmv8ijiL/XKtc/6bQpv86mzr/a7Jr/7TXtP8mkCb/KJEo/8Pfw//g7eD/zePN/8bfxv94uHj/AH4A/weAB/9+vH7/msqa/yKOIv9erF7/ptCm/zqaOv9psWn/tti2/yeQJ/8okSj/vdu9/6LNov9lr2X/Yq5i/zubO/8DfwP/C4IL/368fv+aypr/Io4i/1mpWf+m0Kb/PJs8/2yzbP+y1rL/JY8l/yiRKP+42bj/cLRw/xKHEv8ShxL/DIQM/xSIFP8qkir/isKK/5rKmv8ijiL/T6RP/6fRp/9AnUD/d7h3/6rSqv8fjR//KJEo/7jZuP9vtG//D4YP/w+GD/8OhQ7/MZYx/2ewZ/+n0af/msqa/yKOIv9AnUD/qtOq/1GmUf+OxI7/ncyd/xeJF/8okSj/vty+/7LVsv+AvYD/gL2A/16sXv86mjr/lciV/9rr2v+aypr/Io4i/ymSKf+v1a//ncyd/8rjyv+FwYX/CoMK/yeQJ/++277/5e/l/9rp2v/Z6dn/ncud/ySPJP9Tp1P/utq6/5bHlv8ijSL/EYUR/328ff/P5c//y+PL/0qiSv8DfwP/FIcU/2OuY/9+vH7/fbt9/327ff9aqlr/DYQN/xqKGv9XqFf/TaNN/xGFEf8EfwT/NZg1/3e4d/9osWj/Gosa/wB+AP8BfQHfCIEI3wuCC98LggvfC4IL3wiBCN8BfgHfAn4C3weAB98HgAffAX0B3wB9AN8EgATfEoYS3wuDC98CfwLfAH4A3wB9AIUAfQCFAH0AhQB+AIUAfgCFAH0AhQB+AIUAfQCFAH0AhQB9AIUAfQCFAH0AhQB+AIUAfgCFAH4AhQB+AIUAfQCFAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEE%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis._handleClick%20%3D%28%29%3D%3E%20%7B%0A%20%20%20if%20%28%20%21custombuttons.confirmBox%28null%2C%20%22%u041F%u0435%u0440%u0435%u0437%u0430%u043F%u0443%u0441%u0442%u0438%u0442%u044C%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%20%u0447%u0442%u043E%u0431%u044B%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%20%u0432%u0441%u0442%u0443%u043F%u0438%u043B%u0438%20%u0432%20%u0441%u0438%u043B%u0443%3F%22%2C%20%22%u0414%u0430%22%2C%20%22%u041E%u0442%u043C%u0435%u043D%u0430%22%29%20%29%20return%3B%20%0A%20%20%20%0A%20%20%20if%20%28%20cbu.getPrefs%28s%29%20%3D%3D%201%20%29%20%7B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28s%2C%2010%29%3B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22browser.tabs.remote.autostart%22%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22browser.tabs.remote.autostart.2%22%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22extensions.e10sBlocksEnabling%22%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22extensions.e10sBlockedByAddons%22%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22browser.tabs.remote.force-enable%22%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20else%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28s%2C%201%29%3B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22browser.tabs.remote.autostart%22%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22browser.tabs.remote.autostart.2%22%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22extensions.e10sBlocksEnabling%22%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22extensions.e10sBlockedByAddons%22%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22browser.tabs.remote.force-enable%22%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%0A%20%20%20Services.startup.quit%28Services.startup.eAttemptQuit%20%7C%20Services.startup.eRestart%29%3B%20%20%20%20%20%0A%7D%3B%0A%0A%0Avar%20s%20%3D%20%22dom.ipc.processCount%22%3B%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20self.style.filter%20%3D%20%28cbu.getPrefs%28s%29%20%3D%3D%201%29%20%3F%20%22grayscale%281%29%22%20%3A%20%22%22%3B%0A%7D%3B%20%20%20%20%20%20%20%20%0AtoggleImage%28%29%3B%0AServices.prefs.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20Services.prefs.removeObserver%28s%2C%20toggleImage%29%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация:

Выделить код

Код:

this._handleClick =()=> {
   if ( !custombuttons.confirmBox(null, "Перезапустить браузер чтобы изменения вступили в силу?", "Да", "Отмена") ) return; 
   
   if ( cbu.getPrefs(s) == 1 ) {
        cbu.setPrefs(s, 10);
        cbu.setPrefs("browser.tabs.remote.autostart", true);
        cbu.setPrefs("browser.tabs.remote.autostart.2", true);
        cbu.setPrefs("extensions.e10sBlocksEnabling", false);
        cbu.setPrefs("extensions.e10sBlockedByAddons", false);
        cbu.setPrefs("browser.tabs.remote.force-enable", true);
        }
   else
        {
        cbu.setPrefs(s, 1);
        cbu.setPrefs("browser.tabs.remote.autostart", false);
        cbu.setPrefs("browser.tabs.remote.autostart.2", false);
        cbu.setPrefs("extensions.e10sBlocksEnabling", true);
        cbu.setPrefs("extensions.e10sBlockedByAddons", true);
        cbu.setPrefs("browser.tabs.remote.force-enable", false);
        }
   
   Services.startup.quit(Services.startup.eAttemptQuit | Services.startup.eRestart);     
};


var s = "dom.ipc.processCount";
function toggleImage() {
   self.style.filter = (cbu.getPrefs(s) == 1) ? "grayscale(1)" : "";
};        
toggleImage();
Services.prefs.addObserver(s, toggleImage, false);
addDestructor(()=> Services.prefs.removeObserver(s, toggleImage));

Отсутствует

 

№15931-12-2016 18:31:43

shadow_user
Участник
 
Группа: Members
Зарегистрирован: 14-02-2007
Сообщений: 244
UA: Firefox 38.0

Re: Готовые кнопки для Custom Buttons

Открытие панели закладок в новом табе( Firefox ) от 31.12.2016.

Выделить код

Код:

getBrowser (). selectedTab = getBrowser (). addTab ("chrome://browser/content/bookmarks/bookmarksPanel.xul");

Иконка 24х24

Если вместо адреса в круглых скобках вставить выражение "about:addons", получится кнопка, открывающая в новом табе окно управления расширениями.

Отредактировано shadow_user (01-01-2017 17:37:14)

Отсутствует

 

№16003-01-2017 16:44:39

xseed
Участник
 
Группа: Members
Зарегистрирован: 24-03-2009
Сообщений: 58
UA: Firefox 50.0

Re: Готовые кнопки для Custom Buttons

Панель закладок в контекстном меню

Код инициализации:

Выделить код

Код:

(function() {
  if ( document.getElementById("contextBookmarksToolbar") ) return; 

  var contextMenu = document.getElementById("contentAreaContextMenu");
  var menu = document.createElement("menu");
  var menuPopup = document.createElement("menupopup");
  
  menu.setAttribute("id", "contextBookmarksToolbar");
  menu.setAttribute("class", "menu-iconic bookmark-item");
  menu.setAttribute("label", "Панель Закладок");
  menu.setAttribute("image", "chrome://browser/skin/places/bookmarksToolbar.png");

  menuPopup.setAttribute("id", "context_bookmarksToolbarPopup");
  menuPopup.setAttribute("placespopup", "true");
  menuPopup.setAttribute("context", "placesContext");
  menuPopup.setAttribute("openInTabs", "children");
  menuPopup.setAttribute("tooltip", "bhTooltip");
  menuPopup.setAttribute("popupsinherittooltip", "true");
  menuPopup.setAttribute("onpopupshowing", "if (!this.parentNode._placesView) new PlacesMenu(event, 'place:folder=TOOLBAR')");
  menuPopup.setAttribute("oncommand", "BookmarksEventHandler.onCommand(event, this.parentNode._placesView);");
  menuPopup.setAttribute("onclick", "BookmarksEventHandler.onClick(event, this.parentNode._placesView);");
  
  menu.appendChild(menuPopup);
  contextMenu.appendChild(menu);

  contextMenu.addEventListener("popupshowing", function() {
    menu.hidden = !gContextMenu; 
  }, false);
})();


Панель закладок в отдельном контекстном меню
можно вызывать через CTRL-RMB (event.ctrlKey), для этого нужно создать кнопку со следующим кодом, но добавлять ее нужно не в меню, а на Панель инструментов:
Код инициализации:

Выделить код

Код:

(function() {
  if (document.getElementById("context_bookmarksToolbarPopup")) return;
 
  var contextMenu = document.getElementById("contentAreaContextMenu");
  var menuPopup = document.createElement("menupopup");
  var parentNode = document.getElementById("mainPopupSet");
 
  menuPopup.setAttribute("id", "context_bookmarksToolbarPopup");
  menuPopup.setAttribute("placespopup", "true");
  menuPopup.setAttribute("context", "placesContext");
  menuPopup.setAttribute("openInTabs", "children");
  menuPopup.setAttribute("tooltip", "bhTooltip");
  menuPopup.setAttribute("popupsinherittooltip", "true");
  menuPopup.setAttribute("onpopupshowing", "if (!this.parentNode._placesView) new PlacesMenu(event, 'place:folder=TOOLBAR')");
  menuPopup.setAttribute("oncommand", "BookmarksEventHandler.onCommand(event, this.parentNode._placesView);");
  menuPopup.setAttribute("onclick", "BookmarksEventHandler.onClick(event, this.parentNode._placesView);");
 
  parentNode.appendChild(menuPopup);
 
  contextMenu.addEventListener("popupshowing", function(event) {
    if (!event.ctrlKey) return;
    event.preventDefault();
    event.stopPropagation();
    menuPopup.openPopupAtScreen(event.screenX, event.screenY);
  }, false);
})();

Отредактировано xseed (03-01-2017 19:11:59)


Три студента и лопата заменяют экскаватор

Отсутствует

 

№16104-01-2017 11:06:53

xoreax
Забанен
 
Группа: Members
Зарегистрирован: 07-11-2016
Сообщений: 54
UA: Firefox 32.0

Re: Готовые кнопки для Custom Buttons

Быстрый доступ к менеджеру паролей.( Firefox ) от 04.01.2017.
Открыть окно с сохранёнными паролями, отфильтрованное по домену открытой страницы.

Код кнопки(с иконкой) и просто Код:
Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041F%u0430%u0440%u043E%u043B%u0438%20%u0441%u0430%u0439%u0442%u043E%u0432%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACc0lEQVQ4jZXRXUiTARTG8ROubjYn4oUytUbFlG2+mro25yBBS8wsnBYLpJna0PlRkUpYRpiKlJqJhJhdSIJfCBUoigQlYQiWpgsnmak4bdWcZts7nfPpqiun2bn//TmcQ7TLqBkKuBbjP1B9Wb7UkH18repS0EJ+NP9lwlHi7+aIiChLymXqdCdWVww6rH+JhW1CAdagAPspCnfVgUtX5eS7Iz5P5FGuiZh3fNUAZhkwF4n+WuGKNoxbWab267FNKFB8ynNcH0M8t4F0CefhzNsbgFkG52w4NqfEuHXWa4qIKEPKqxhuloI1yJHF0GO3gYJo7x7LqAZYZLDxWQTH2BEYu4Su4pP8D513xIsr7zWY7UtEnmrfgNtArorf92MkGZgLwuakGPZRGdixONgMKVif1sExV4KFwRQUqMh9ICOEU2PsTQEWlHBNx4I1qmE3ZoKdKYbzWyWclqcwdEchnaFmt4H8SMGx5zWJWB5NBUzZcJoKsWGuwqa1CVv2F2Dn76E0njMZF0Fe2w8YRsJnZUms81c7+utCwRp1cFnrgd9tcNk6YTXexIOLvGW9kPy2v8+bvO5nKUwbax1oLZHA8VGEwaYENOcJHI25B+21Wp/v+Up6pQkigdvVCxMODTmsHWgpUWFrXILXT5JRrRWyusMUkhxMPgwR1y0kIroi47baLW1ouR0Py5twlJ7eP6NXckcKlSTdEf2dNDGnwvGzY6u3IR2NOSKUn/Mwnwkg/39CIqI0CZU5V7tc7zqLUJ/JQK+iJCI6sCdMRJQj57UPdxeht+4CHml9nRoBBe4ZExHlBpMoJ4pruh7jOaQLJdV/YSL6A4IrN1kmwC2QAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20host%20%3D%20content.document.domain.replace%28/%5Ewww./g%2C%27%27%29%3B%0A//%20alert%28host%29%3B%0Awindow.openDialog%28%22chrome%3A//passwordmgr/content/passwordManager.xul%22%2C%20%22SignonViewerDialog%22%2C%20%27%27%2C%20%7BfilterString%3A%20host%7D%29%3B%0A%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Код:

Выделить код

Код:

var host = content.document.domain.replace(/^www./g,'');
window.openDialog("chrome://passwordmgr/content/passwordManager.xul", "SignonViewerDialog", '', {filterString: host});

Отредактировано xoreax (08-01-2017 10:33:21)

Отсутствует

 

№16208-01-2017 10:31:46

xoreax
Забанен
 
Группа: Members
Зарегистрирован: 07-11-2016
Сообщений: 54
UA: Firefox 32.0

Re: Готовые кнопки для Custom Buttons

Функция для открытия программы с системными переменными в пути.( Firefox )
В примере IE открывает текущую ссылку(из меню кнопки openLinkAsMenu ) используя переменную %PROGRAMFILES% . Так же и с другими переменными, %SYSTEMROOT% или %USERPROFILE%.

скрытый текст

Выделить код

Код:

function openIElink() {
      var environment = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
      var localFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
      var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);

       localFile.initWithPath(environment.get("PROGRAMFILES")+ "\\Internet Explorer\\iexplore.exe");
       process.init(localFile);
       process.run(false, [content.location.href], 1);
  }
  openIElink();

Отсутствует

 

№16327-01-2017 20:13:35

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: Готовые кнопки для Custom Buttons

Удалить куки текущего сайта( Firefox24+ ) от 06.02.2017.
кнопка удаляет куки текущего сайта и все Flash куки.

ЛКМ => Удалить куки текущего сайта,
СКМ => Удалить куки и обновить все вкладки текущего сайта.

Код кнопки и инициализации:
Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0423%u0434%u0430%u043B%u0438%u0442%u044C%20%u043A%u0443%u043A%u0438%20%u0442%u0435%u043A%u0443%u0449%u0435%u0433%u043E%20%u0441%u0430%u0439%u0442%u0430%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAACaklEQVR42rVVu2piURTd6jW+FSMWRkW76WRsRBCbNFY2ATHFlCGdTaZXmU/wB/IHYjGdON2ANlapxELxRQpJjPH9yNy14dzx5prGmRwQb+4+Z2Wttdc+SvQJS/pU0EQi8f3t7S2t0+lOBtvtdr/q9foPBVSSpG+BQOCrXDiNnSRRp9P5Ij/+BXU6nROv10vb7fbDg0KFrEhTOzs7o6enp2eVfIfDQRcXF7Rer1WbAWCz2ZjJZrPhd0ajkVarFS0WC9Lr9fzObDbTaDRSeyozJVk+LZdLFROXy0WtVouq1SrkcQ0A6XSaotEoA0OB1WqldrutBQ0GgzSbzRSGbrebarUaFQoFZpRKpVhRs9mk6XRK4XCYJpMJg9rtdiagke/3++nl5YX/NplMfKBUKvHz/f09JZNJVgIb5vM57wNDoUgDiv/k8/lYGpbH42Ggx8dHur29pUwmw56hIdgDZfv9XrHp/PycialALRYLb0ZRdHM4HPIzGIqDHy2oQUNVoCIuh+EXDUO33+8T9WPDooDCI8REzpoiH3ZgNRoNymazSg1A+BzKR1OFzwooug7P0FUwQMMQGeHt5eUlxWIxbhSmDvVDdcg3zqpA8WIwGKgiBQ9zuRwVi0W6vr6mq6srZiTPN4VCIbq7u1PSgvNIiwoUxX6/z2EWC8wjkQjl83kql8tUqVR4shCdeDxO3W5X2Y9oaUDxotfracYUCQDjm5sbVoEhQJdhASZIWIDkaEBfX1+ZmZjvY5eJwWBgW47dZIigsOLQU8d4PKZ/ufpkYo73kfr58PDgOvWSls/pZPm/VaByFgvyV+F//Jz8AYsmOCaaWhXDAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20.............%0Athis.onclick%20%3De%3D%3E%20%7B%0A%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20%7B%20%20%20%20%20%20%20%20//%20%u041B%u041A%u041C%0A%20%20%20%20%20%20%20%20deleteCookiesFromHost%28%29%3B%0A%20%20%20%20%20%20%20%20//BrowserReload%28%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%201%20%29%20%7B%20%20%20%20%20%20%20%20//%20%u0421%u041A%u041C%20%0A%20%20%20%20%20%20%20%20deleteCookiesFromHost%28%29%3B%0A%20%20%20%20%20%20%20%20reloadAllTabsFromHost%28%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%202%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.shiftKey%20%26%26%20%21e.altKey%20%26%26%20%21e.metaKey%20%29%20%7B%20%20%20%20%20%20%20//%20%u041F%u041A%u041C%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%20%20%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20try%20%7B%20Services.wm.getMostRecentWindow%28%22Browser%3ACookies%22%29.close%28%29%20%7D%20catch%28e%29%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20var%20win%20%3D%20openDialog%20%28%22chrome%3A//browser/content/preferences/cookies.xul%22%2C%20%22_blank%22%2C%20%22resizable%2Cdialog%3Dyes%2Ccenterscreen%22%2C%20null%29%3B%0A%20%20%20%20%20%20%20%20addEventListener%28%22load%22%2C%20%28%29%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20var%20host%20%3D%20content.location.host%2C%20arr%20%3D%20host.split%28%27.%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20if%20%28%20arr.length%20%3E%202%20%29%20host%20%3D%20arr%5B1%5D%20+%20%22.%22%20+%20arr%5B2%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20var%20filter%20%3D%20win.document.getElementById%28%22filter%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20filter.value%20%3D%20host%3B%20setTimeout%28%28%29%3D%3E%20filter.doCommand%28%29%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%7D%2C%20false%2C%20win%29%3B%0A%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%0A%7D%3B%0A%0A%0A//%20%u0423%u0434%u0430%u043B%u0438%u0442%u044C%20%u043A%u0443%u043A%u0438%20%u0431%u0430%u0437%u043E%u0432%u043E%u0433%u043E%20%u0434%u043E%u043C%u0435%u043D%u0430%20.............%0Afunction%20deleteCookiesFromHost%28%29%20%7B%0A%20%20%20var%20host%20%3D%20Services.eTLD.getBaseDomain%28gBrowser.currentURI%29%3B%0A%0A%20%20%20//%20%u0443%u0434%u0430%u043B%u0438%u0442%u044C%20%u043E%u0431%u044B%u0447%u043D%u044B%u0435%20%u043A%u0443%u043A%u0438%20%u0434%u043E%u043C%u0435%u043D%u0430%0A%20%20%20for%20%28%20var%20en%20%3D%20Services.cookies.enumerator%3B%20en.hasMoreElements%28%29%3B%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20var%20cookie%20%3D%20en.getNext%28%29.QueryInterface%28Ci.nsICookie%29%3B%0A%20%20%20%20%20%20%20%20%20%7Ecookie.host.indexOf%28host.trim%28%29%29%20%26%26%20Services.cookies.remove%28cookie.host%2C%20cookie.name%2C%20cookie.path%2C%20false%29%3B%20%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%0A%20%20%20//%20%u0443%u0434%u0430%u043B%u0438%u0442%u044C%20%u043A%u0443%u043A%u0438%20%u0434%u043E%u043C%u0435%u043D%u0430%20%u0438%u0437%20%u0438%u0441%u0442%u043E%u0440%u0438%u0438%20%20%20%20%20%0A%20%20%20var%20reversedDomain%20%3D%20host.split%28%22%22%29.reverse%28%29.join%28%22%22%29%20+%20%22.%22%3B%0A%20%20%20Cu.import%28%22resource%3A//gre/modules/FileUtils.jsm%22%29%3B%0A%20%20%20var%20file%20%3D%20FileUtils.getFile%28%22ProfD%22%2C%20%5B%22webappsstore.sqlite%22%5D%29%3B%0A%20%20%20var%20dbConn%20%3D%20Services.storage.openDatabase%28file%29%3B%0A%20%20%20dbConn.executeSimpleSQL%28%22DELETE%20FROM%20webappsstore2%20WHERE%20scope%20LIKE%20%5C%22%25%22%20+%20reversedDomain%20+%22%25%5C%22%22%29%3B%0A%20%20%20dbConn.close%28%29%3B%0A%20%20%20%0A%20%20%20//%20%u0443%u0434%u0430%u043B%u0438%u0442%u044C%20%u0432%u0441%u0435%20Flash%20%u043A%u0443%u043A%u0438%0A%20%20%20var%20dir%20%3D%20Services.dirsvc.get%28%27Home%27%2C%20Ci.nsIFile%29%3B%0A%20%20%20dir.append%28%22Application%20Data%22%29%3B%0A%20%20%20dir.append%28%22Macromedia%22%29%3B%0A%20%20%20dir.remove%28true%29%3B%0A%20%20%20dir.create%28Ci.nsIFile.DIRECTORY_TYPE%2C%200777%29%3B%0A%7D%3B%0A%0A%0A//%20%u041F%u0435%u0440%u0435%u0437%u0430%u0433%u0440%u0443%u0437%u0438%u0442%u044C%20%u0432%u0441%u0435%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0442%u0435%u043A%u0443%u0449%u0435%u0433%u043E%20%u0441%u0430%u0439%u0442%u0430%20.............%0Afunction%20reloadAllTabsFromHost%28%29%20%7B%0A%20%20%20var%20host%20%3D%20content.document.domain%3B%0A%20%20%20%0A%20%20%20for%28%20var%20tab%20of%20gBrowser.tabs%20%29%20%7B%20%20%0A%20%20%20%20%20%20%20%20var%20tabHost%20%3D%20tab.linkedBrowser.contentDocument.location.host%3B%0A%20%20%20%20%20%20%20%20if%20%28%20host%20%3D%3D%20tabHost%20%29%20gBrowser.reloadTab%28tab%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0A%0A%0Athis.tooltipText%20%3D%20%22%u041B%3A%20%u0423%u0434%u0430%u043B%u0438%u0442%u044C%20%u043A%u0443%u043A%u0438%20%u0442%u0435%u043A%u0443%u0449%u0435%u0433%u043E%20%u0441%u0430%u0439%u0442%u0430%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cn%u0421%3A%20%u0423%u0434%u0430%u043B%u0438%u0442%u044C%20%u043A%u0443%u043A%u0438%20%u0442%u0435%u043A%u0443%u0449%u0435%u0433%u043E%20%u0441%u0430%u0439%u0442%u0430%20+%20%u043E%u0431%u043D%u043E%u0432%u0438%u0442%u044C%20%u0432%u0441%u0435%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0442%u0435%u043A%u0443%u0449%u0435%u0433%u043E%20%u0441%u0430%u0439%u0442%u0430%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cn%u041F%3A%20%u0423%u043F%u0440%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u043A%u0443%u043A%u0430%u043C%u0438%20%u0434%u043B%u044F%20%u0442%u0435%u043A%u0443%u0449%u0435%u0433%u043E%20%u0441%u0430%u0439%u0442%u0430%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5CnCtrl+%u041F%3A%20CB%20%u041C%u0435%u043D%u044E%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация:

Выделить код

Код:

// Настройка функций кликов мыши для кнопки .............
this.onclick =e=> {
   
   if ( e.button == 0 ) {        // ЛКМ
        deleteCookiesFromHost();
        //BrowserReload();
        }
      
   if ( e.button == 1 ) {        // СКМ 
        deleteCookiesFromHost();
        reloadAllTabsFromHost();
        }
        
   if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) {       // ПКМ
        e.preventDefault();  
        
        try { Services.wm.getMostRecentWindow("Browser:Cookies").close() } catch(e) {};
        var win = openDialog ("chrome://browser/content/preferences/cookies.xul", "_blank", "resizable,dialog=yes,centerscreen", null);
        addEventListener("load", ()=> {
           var host = content.location.host, arr = host.split('.');
           if ( arr.length > 2 ) host = arr[1] + "." + arr[2];
           var filter = win.document.getElementById("filter");
           filter.value = host; setTimeout(()=> filter.doCommand(), 0);
        }, false, win);
        }        
};


// Удалить куки базового домена .............
function deleteCookiesFromHost() {
   var host = Services.eTLD.getBaseDomain(gBrowser.currentURI);

   // удалить обычные куки домена
   for ( var en = Services.cookies.enumerator; en.hasMoreElements(); ) {
         var cookie = en.getNext().QueryInterface(Ci.nsICookie);
         ~cookie.host.indexOf(host.trim()) && Services.cookies.remove(cookie.host, cookie.name, cookie.path, false); 
         }
   
   // удалить куки домена из истории     
   var reversedDomain = host.split("").reverse().join("") + ".";
   Cu.import("resource://gre/modules/FileUtils.jsm");
   var file = FileUtils.getFile("ProfD", ["webappsstore.sqlite"]);
   var dbConn = Services.storage.openDatabase(file);
   dbConn.executeSimpleSQL("DELETE FROM webappsstore2 WHERE scope LIKE \"%" + reversedDomain +"%\"");
   dbConn.close();
   
   // удалить все Flash куки
   var dir = Services.dirsvc.get('Home', Ci.nsIFile);
   dir.append("Application Data");
   dir.append("Macromedia");
   dir.remove(true);
   dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);
};


// Перезагрузить все вкладки текущего сайта .............
function reloadAllTabsFromHost() {
   var host = content.document.domain;
   
   for( var tab of gBrowser.tabs ) {  
        var tabHost = tab.linkedBrowser.contentDocument.location.host;
        if ( host == tabHost ) gBrowser.reloadTab(tab);
        }
};


this.tooltipText = "Л: Удалить куки текущего сайта\
                  \nС: Удалить куки текущего сайта + обновить все вкладки текущего сайта\
                  \nП: Управление куками для текущего сайта\
                  \nCtrl+П: CB Меню";

Отсутствует

 

№16428-01-2017 20:18:36

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: Готовые кнопки для Custom Buttons

Запуск портативной программы из портативного Firefox( Firefox24+ ) от 28.01.2017.
Кнопка образец для запуска портативной программы которая находится папке портативного Firefox, для работы кнопки нужно создать в папке профиля Firefox папку Soft и помещать туда нужные портативные программы. В вначале кода инициализации кнопки нужно указать название папки программы и название exe файла программы, если папка и название exe файла указаны правильно иконка кнопки будет как у запускаемой программы(.exe файла), а в сплывающей подсказке у кнопке будет отображаться название запускаемой программы. Если для запуска программы нужны аргументы то их следует указать в строке var arg = [];. Можно быстро изменить запускаемую программу для кнопки или создать много кнопок для запуска разных портативных программ.

ЛКМ => Запуск программы.

Код кнопки и инициализации:
Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0417%u0430%u043F%u0443%u0441%u043A%20%u043F%u043E%u0440%u0442%u0430%u0442%u0438%u0432%u043D%u043E%u0439%20%u043F%u0440%u043E%u0433%u0440%u0430%u043C%u043C%u044B%20%u0438%u0437%20%u043F%u043E%u0440%u0442%u0430%u0442%u0438%u0432%u043D%u043E%u0433%u043E%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-2%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20app%20%3D%20%22fdm%22%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%20%u043F%u0430%u043F%u043A%u0438%20%u043F%u0440%u043E%u0433%u0440%u0430%u043C%u043C%u044B%20%20%20%20%0Avar%20appFolder%20%3D%20%22FreeDownloadManager%22%3B%20%20%20%20%20//%20%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%20exe%20%u0444%u0430%u0439%u043B%u0430%20%u043F%u0440%u043E%u0433%u0440%u0430%u043C%u043C%u044B%20%20%0A%0A%0Avar%20file%20%3D%20Services.dirsvc.get%28%27ProfD%27%2C%20Ci.nsIFile%29%3B%0Afile.initWithPath%28file.path%20+%20%22%5C%5CSoft%5C%5C%22%20+%20appFolder%20+%20%22%5C%5C%22%20+%20app%20+%20%22.exe%22%29%3B%0A%0Adocument.getAnonymousNodes%28self%29%5B0%5D.src%20%3D%20%22moz-icon%3A//file%3A//%22%20+%20file.path%3B%0Aself.tooltipText%20%3D%20%22%u041B%3A%20%u0417%u0430%u043F%u0443%u0441%u0442%u0438%u0442%u044C%20%22%20+%20app%20+%20%22%5Cn%u041F%3A%20CB%20%u041C%u0435%u043D%u044E%22%3B%0A%0Athis._handleClick%20%3D%28%29%3D%3E%20%7B%0A%20%20%20var%20arg%20%3D%20%5B%5D%3B%20//%20gClipboard.read%28%29%20%20content.location.href%20%20document.commandDispatcher.focusedWindow.getSelection%28%29%0A%0A%20%20%20var%20process%20%3D%20Cc%5B%22@mozilla.org/process/util%3B1%22%5D.createInstance%28Ci.nsIProcess%29%3B%0A%20%20%20process.init%28file%29%3B%0A%20%20%20process.run%28false%2C%20arg%2C%20%28arg.length%29%29%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация:

Выделить код

Код:

var app = "fdm";                           //  название папки программы    
var appFolder = "FreeDownloadManager";     //  название exe файла программы  


var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
file.initWithPath(file.path + "\\Soft\\" + appFolder + "\\" + app + ".exe");

document.getAnonymousNodes(self)[0].src = "moz-icon://file://" + file.path;
self.tooltipText = "Л: Запустить " + app + "\nП: CB Меню";

this._handleClick =()=> {
   var arg = []; // gClipboard.read()  content.location.href  document.commandDispatcher.focusedWindow.getSelection()

   var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
   process.init(file);
   process.run(false, arg, (arg.length));
};

Отсутствует

 

№16501-02-2017 01:02:15

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: Готовые кнопки для Custom Buttons

Кодировать изображение или текстовой файл в base64( Firefox24+ ) от 30.11.2017.
кнопка даёт возможность перекодировать в base64 изображение или текстовой файлы находящейся на жёстким диске, это полезно если нужно добавить изображение в css код.

ЛКМ => Кодировать изображение или текстовой файл в base64.

Код кнопки и вкладки Код:
Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041A%u043E%u0434%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u0438%u043B%u0438%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u043E%u0439%20%u0444%u0430%u0439%u043B%20%u0432%20base64%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACLElEQVR42pXTXUtUURTG8f/aZ58zppqjY4YhRgQBWRABRRgoEERlKNJlQn2ICOquIooi6Bt0FRDkOGlAUUBRQoEFmEYEZhSRYG/zojpzzl55cA6lUNFv89zszX5YN0tyIyNUDYdR1KfOoYCwQgSE1RQQMXiel7NhGFLVN9Dfz//I5nJ9VlX53buZ94BgDNT6HvuvjhNYQVAUcA4Obs9w7WQXqg7LGoHvIxIXCCk/HlM4e2w3Ym0yPOduPiMmgBERksRqampWkkoRBAFTF7q5MvSCcgQ3ns9SUYM1kLDW97POuf7IOW5ls6gqAlgDdRZOPwk43ruXu2/zNKfX87VsEH6x8eeu7h4iP8B5HjhFnCNllH0Xxxg4uofpwiKZpjTjj8dI204QIWEVMHX1iDV4bWnM1k14rS2kmjK8qUuz46HQe6iHe7dHeXnpCJ2nRgkjJaZJge8J5XqBnR3Ilja0JUPYkMEEjbxaesC2OxHXu8qAMHn5MGi1QMEAWMC0N2I60pjNzcvZgPpFFj9PsDAxxuvzByhWABUqIZQjqgWKVQUfWGptwGxshCCPzk3hiku42XmiyU9YoBIpiCBGiE/CoooPmMZadP4Dsj7EtK9Dfxi0FCL1Pj4xJWathYQIJnnQLx9hbga0gKldAClAOY+WF4gJwlpGBJtcp58W+RvfegwND+OcI2aMoVQqPZLlhcg71Qan/JERKBQK908MDp5hte8C7AI8/u0bMM0aPwHiYdBiB+lf7gAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20fp%20%3D%20window.makeFilePicker%28%29%3B%0Afp.init%28window%2C%20%22%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0444%u0430%u0439%u043B%22%2C%20fp.modeOpen%29%3B%0Afp.appendFilter%28%22Text%20and%20images%22%2C%20%22*.txt%3B%20*.text%3B%20*.css%3B%20*.js%3B%20*.ini%3B%20*.rdf%3B%20*.xml%3B%20*.html%3B%20*.htm%3B%20*.shtml%3B%20*.xhtml%3B%20*.jpe%3B%20*.jpg%3B%20*.jpeg%3B%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20*.gif%3B%20*.png%3B%20*.bmp%3B%20*.ico%3B%20*.svg%3B%20*.svgz%3B%20*.tif%3B%20*.tiff%3B%20*.ai%3B%20*.drw%3B%20*.pct%3B%20*.psp%3B%20*.xcf%3B%20*.psd%3B%20*.raw%22%29%3B%0Afp.open%28re%3D%3E%20%7B%20%0A%20%20%20if%20%28%20re%20%21%3D%20fp.returnOK%20%29%20return%3B%0A%20%20%20var%20file%20%3D%20fp.file%3B%0A%20%20%20%20%20%0A%20%20%20var%20inputStream%20%3D%20Cc%5B%22@mozilla.org/network/file-input-stream%3B1%22%5D.createInstance%28Ci.nsIFileInputStream%29%3B%0A%20%20%20inputStream.init%28file%2C%200x01%2C%200600%2C%200%29%3B%0A%20%20%20var%20stream%20%3D%20Cc%5B%22@mozilla.org/binaryinputstream%3B1%22%5D.createInstance%28Ci.nsIBinaryInputStream%29%3B%0A%20%20%20stream.setInputStream%28inputStream%29%3B%0A%20%20%20var%20encoded%20%3D%20btoa%28stream.readBytes%28stream.available%28%29%29%29%3B%0A%20%20%20var%20contentType%20%3D%20Cc%5B%22@mozilla.org/mime%3B1%22%5D.getService%28Ci.nsIMIMEService%29.getTypeFromFile%28file%29%3B%0A%20%20%20var%20dataURI%20%3D%20%22data%3A%22%20+%20contentType%20+%20%22%3Bcharset%3Dutf-8%3Bbase64%2C%22%20+%20encoded%3B%0A%20%20%20%20%20%20%0A%20%20%20gClipboard.write%28dataURI%29%3B%0A%20%20%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%0A%20%20%20.showAlertNotification%28self.image%2C%20self.label%2C%20%22%u0421%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u043B%20%u0444%u0430%u0439%u043B%20%u043A%u0430%u043A%20base64%22%29%3B%0A%7D%29%3B%0A%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

вкладка Код:

Выделить код

Код:

var fp = window.makeFilePicker();
fp.init(window, "Открыть файл", fp.modeOpen);
fp.appendFilter("Text and images", "*.txt; *.text; *.css; *.js; *.ini; *.rdf; *.xml; *.html; *.htm; *.shtml; *.xhtml; *.jpe; *.jpg; *.jpeg;\
                                    *.gif; *.png; *.bmp; *.ico; *.svg; *.svgz; *.tif; *.tiff; *.ai; *.drw; *.pct; *.psp; *.xcf; *.psd; *.raw");
fp.open(re=> { 
   if ( re != fp.returnOK ) return;
   var file = fp.file;
     
   var inputStream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
   inputStream.init(file, 0x01, 0600, 0);
   var stream = Cc["@mozilla.org/binaryinputstream;1"].createInstance(Ci.nsIBinaryInputStream);
   stream.setInputStream(inputStream);
   var encoded = btoa(stream.readBytes(stream.available()));
   var contentType = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService).getTypeFromFile(file);
   var dataURI = "data:" + contentType + ";charset=utf-8;base64," + encoded;
      
   gClipboard.write(dataURI);
   Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
   .showAlertNotification(self.image, self.label, "Скопировал файл как base64");
});

Отсутствует

 

№16612-02-2017 13:20:33

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: Готовые кнопки для Custom Buttons

HTTP Request Loger( Firefox24+ ) от 12.02.2017.
кнопка записивает сетевые запросы (referrer, HTTP method and URL) открытых сайтов в текстовый файл http-request-log.txt в папке профиля.

ЛКМ => Включить-Выключить запись(логирование),
СКМ => Открыть текстовый(лог) файл,
ПКМ => Удалить текстовый(лог) файл.

Код кнопки и инициализации:
Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EHTTP%20Request%20Logger%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/AAAA/wAAAP/AwMD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AwMD/AAAA/wAAAP/AwMD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AwMD/AAAA/wAAAP/AwMD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AwMD/AAAA/wAAAP/AwMD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/AwMD/AAAA/wAAAP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AACsQQAArEEAAKxBH/isQR/4rEEf+KxBH/isQR/4rEEf+KxBH/isQR/4rEEf+KxBH/isQQAArEEAAKxBAACsQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5BgBrowser.currentURI.spec%20%3D%3D%20%22about%3Acustomizing%22%20%7C%7C%20%28%28%29%20%3D%3E%20%7B%0A%09var%20fileName%20%3D%20%22http-request-log.txt%22%3B%0A%09var%20file%20%3D%20Services.dirsvc.get%28%22ProfD%22%2C%20Ci.nsIFile%29%3B%0A%09file.append%28fileName%29%3B%0A%0A%09var%20obsId%20%3D%20%22httpRequestLogger%22%3B%0A%09var%20pn%20%3D%20%22CB.%22%20+%20obsId%20+%20%22.on%22%3B%0A%09cbu.isPref%28pn%2C%20false%29%3B%0A%09var%20storageId%20%3D%20%22CB.%22%20+%20obsId%20+%20%22.Storage%22%3B%0A%09%0A%09var%20storage%20%3D%20%28function%28%29%20%7B%0A%09%09var%20global%20%3D%20Cu.import%28%22resource%3A//gre/modules/Services.jsm%22%2C%20%7B%7D%29%3B%0A%09%09var%20ns%20%3D%20storageId%3B%0A%09%09var%20storage%20%3D%20global%5Bns%5D%20%7C%7C%20%28global%5Bns%5D%20%3D%20global.Object.create%28null%29%29%3B%0A%09%09return%20%7B%0A%09%09%09get%3A%20function%28key%2C%20defaultVal%29%20%7B%0A%09%09%09%09if%28key%20in%20storage%29%0A%09%09%09%09%09return%20storage%5Bkey%5D%3B%0A%09%09%09%09return%20defaultVal%3B%0A%09%09%09%7D%2C%0A%09%09%09set%3A%20function%28key%2C%20val%29%20%7B%0A%09%09%09%09if%28key%20%3D%3D%3D%20null%29%0A%09%09%09%09%09delete%20storage%5Bkey%5D%3B%0A%09%09%09%09else%0A%09%09%09%09%09storage%5Bkey%5D%20%3D%20val%3B%0A%09%09%09%7D%0A%09%09%7D%3B%0A%09%7D%29%28%29%3B%0A%0A%09function%20obsConstructor%28%29%20%7B%0A%09%09var%20obs%20%3D%20storage.get%28obsId%2C%20null%29%3B%0A%09%09if%20%28%21obs%29%20%7B%0A%09%09%09obs%20%3D%20%7B%0A%09%09%09%09topic%3A%20%22http-on-modify-request%22%2C%0A%09%09%09%09init%3A%20function%28%29%20Services.obs.addObserver%28this%2C%20this.topic%2C%20false%29%2C%0A%09%09%09%09destroy%3A%20function%28%29%20%7B%0A%09%09%09%09%09try%20%7BServices.obs.removeObserver%28this%2C%20this.topic%29%3B%7D%0A%09%09%09%09%09catch%28ex%29%20%7BCu.reportError%28ex%29%3B%7D%0A%09%09%09%09%7D%2C%0A%09%09%09%09observe%3A%20function%28subj%29%20%7B%0A%09%09%09%09%09var%20channel%20%3D%20subj.QueryInterface%28Ci.nsIHttpChannel%29%3B%0A%09%09%09%09%09var%20ref%20%3D%20channel.referrer%20%3F%20channel.referrer.spec%20%3A%20%22%28none%29%22%3B%0A%09%09%09%09%09var%20str%3D%20ref%20+%20%22%20%22%20+%20channel.requestMethod%20+%20%22%20%22%20+%20channel.URI.spec%20+%20%22%5Cr%5Cn%22%3B%0A%09%09%09%09%09str%20%3D%20this.suc.ConvertFromUnicode%28str%29%3B%0A%09%09%09%09%09this.fos.write%28str%2C%20str.length%29%3B%0A%09%09%09%09%7D%2C%0A%09%09%09%09get%20fos%28%29%20%7B%0A%09%09%09%09%09delete%20this.fos%3B%0A%09%09%09%09%09var%20fos%20%3D%20Cc%5B%22@mozilla.org/network/file-output-stream%3B1%22%5D.createInstance%28Ci.nsIFileOutputStream%29%3B%0A%09%09%09%09%09//%20PR_WRONLY%20%7C%20PR_CREATE_FILE%20%7C%20PR_APPEND%0A%09%09%09%09%09fos.init%28file%2C%20parseInt%28%220x02%22%29%20%7C%20parseInt%28%220x08%22%29%20%7C%20parseInt%28%220x10%22%29%2C%20-1%2C%200%29%3B%0A%09%09%09%09%09return%20this.fos%20%3D%20fos%3B%0A%09%09%09%09%7D%2C%0A%09%09%09%09get%20suc%28%29%20%7B%0A%09%09%09%09%09delete%20this.suc%3B%0A%09%09%09%09%09var%20suc%20%3D%20Cc%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.createInstance%28Ci.nsIScriptableUnicodeConverter%29%3B%0A%09%09%09%09%09suc.charset%20%3D%20%22utf-8%22%3B%0A%09%09%09%09%09return%20this.suc%20%3D%20suc%3B%0A%09%09%09%09%7D%0A%09%09%09%09%0A%09%09%09%7D%3B%0A%09%09%09storage.set%28obsId%2C%20obs%29%3B%0A%09%09%09obs.init%28%29%3B%0A%09%09%7D%0A%09%7D%0A%09function%20obsDestructor%28reason%29%20%7B%20%20%0A%09%09if%20%28%20%21/delete%7Cupdate/.test%28reason%29%20%29%20return%3B%0A%09%09var%20obs%20%3D%20storage.get%28obsId%2C%20null%29%3B%0A%09%09if%20%28obs%29%20%7B%0A%09%09%09obs.destroy%28%29%3B%0A%09%09%09storage.set%28obsId%2C%20null%29%3B%0A%09%09%7D%0A%09%09reason%20%3D%3D%20%22delete%22%20%26%26%20cbu.clearPrefs%28pn%29%3B%0A%09%7D%0A%09addDestructor%28reason%20%3D%3E%20%7B%0A%09%09obsDestructor%28reason%29%3B%0A%09%09setTimeout%28function%28%29%20%7B%0A%09%09%09custombuttons.palette.querySelector%28%27toolbarbutton%5Bid%3D%22%27%20+%20_id%20+%20%27%22%5D%27%29%20%26%26%20obsDestructor%28%22delete%22%29%3B%0A%09%09%7D%2C%20500%29%3B%0A%09%7D%29%3B%0A%0A%09var%20imgON%20%3D%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/AAAA/wAAAP/AwMD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/AAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/wAAAP/AwMD/AAAA/wAAAP/AwMD/AAAA/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf8AAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/AAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/wAAAP/AwMD/AAAA/wAAAP/AwMD/AAAA/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf8AAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/AAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/wAAAP/AwMD/AAAA/wAAAP/AwMD/AAAA/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf8AAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/AAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/AwMD/AAAA/wAAAP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%22%3B%0A%09function%20setState%28on%29%20%7B%0A%09%09on%20%3F%20obsConstructor%28%29%20%3A%20obsDestructor%28%22delete%22%29%3B%0A%09%09cbu.setPrefs%28pn%2C%20on%29%3B%0A%09%09var%20src%20%3D%20on%20%3F%20imgON%20%3A%20self.image%3B%0A%09%09var%20en%20%3D%20Services.wm.getEnumerator%28%22navigator%3Abrowser%22%29%3B%0A%09%09while%28en.hasMoreElements%28%29%29%20%7B%0A%09%09%09var%20doc%20%3D%20en.getNext%28%29.document%3B%0A%09%09%09var%20btn%20%3D%20doc.getElementById%28_id%29%3B%0A%09%09%09var%20%5Bimg%5D%20%3D%20doc.getAnonymousNodes%28btn%29%3B%0A%09%09%09if%20%28img%29%20img.src%20%3D%20src%3B%0A%09%09%7D%0A%09%7D%0A%09setState%28cbu.getPrefs%28pn%29%29%3B%0A%09self.onclick%20%3De%3D%3E%20%7B%0A%09%09if%20%28%20e.button%20%3D%3D%200%20%29%20setState%28%21cbu.getPrefs%28pn%29%29%3B%0A%09%09%0A%09%09if%20%28%20e.button%20%3D%3D%201%20%29%20%0A%09%09%20%20%20%20%20file.exists%28%29%20%3F%20file.launch%28%29%20%3A%20custombuttons.alertSlide%28self.label%2C%20%22%u041B%u043E%u0433%20%u0444%u0430%u0439%u043B%20%u043D%u0435%20%u0441%u0443%u0449%u0435%u0441%u0442%u0432%u0443%u0435%u0442%22%29%3B%0A%09%09%0A%09%09if%20%28%20e.button%20%3D%3D%202%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.shiftKey%20%26%26%20%21e.altKey%20%26%26%20%21e.metaKey%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20setState%28false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28function%20f%28i%20%3D%2020%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%20file.remove%28true%29%3B%20custombuttons.alertSlide%28self.label%2C%20%22%u0423%u0434%u0430%u043B%u0438%u043B%20%u043B%u043E%u0433%20%u0444%u0430%u0439%u043B%22%29%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20catch%28e%29%20%7B%20i%20%26%26%20setTimeout%28%28%29%3D%3E%20f%28--i%29%2C%202000%29%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%09%7D%0A%7D%29%28%29%3B%0A%0A%0Athis.tooltipText%20%3D%20%22%u0417%u0430%u043F%u0438%u0441%u044B%u0432%u0430%u0442%u044C%20%u0441%u0435%u0442%u0435%u0432%u044B%u0435%20%u0437%u0430%u043F%u0440%u043E%u0441%u044B%20%u0441%u0430%u0439%u0442%u043E%u0432%20%u0432%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0439%20%u0444%u0430%u0439%u043B%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cn%u041B%3A%20%u0412%u043A%u043B%u044E%u0447%u0438%u0442%u044C-%u0412%u044B%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0430%u043F%u0438%u0441%u044C%28%u043B%u043E%u0433%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0435%29%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cn%u0421%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0439%28%u043B%u043E%u0433%29%20%u0444%u0430%u0439%u043B%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cn%u041F%3A%20%u0423%u0434%u0430%u043B%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0439%28%u043B%u043E%u0433%29%20%u0444%u0430%u0439%u043B%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5CnCtrl+%u041F%3A%20CB%20%u041C%u0435%u043D%u044E%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5BHTTP%20Request%20Logger%20-%20%u041A%u043D%u043E%u043F%u043A%u0430%20%u0441%u043E%u0445%u0440%u0430%u043D%u044F%u0435%u0442%20%u0437%u0430%u043F%u0440%u043E%u0441%u044B%20%u0441%u0430%u0439%u0442%u043E%u0432%20%u0432%20%u0441%u0435%u0442%u044C%20%u0432%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0439%20%u0444%u0430%u0439%u043B%20%u0432%20%u043F%u0430%u043F%u043A%u0435%20%u043F%u0440%u043E%u0444%u0438%u043B%u044F.%0A%u0418%u043C%u044F%20%u0444%u0430%u0439%u043B%u0430%20%22http-request-logger.txt%22.%0A*********************************************************************%0A%u041B%u041A%u041C%20-%20%u0412%u041A%u041B%u044E%u0447%u0438%u0442%u044C%20/%20%u0412%u042B%u041A%u041B%u044E%u0447%u0438%u0442%u044C%20%u0437%u0430%u043F%u0438%u0441%u044C%20%u0432%20%u0444%u0430%u0439%u043B%20%28%u043B%u043E%u0433%u0438%u0440%u043E%u0432%u0430%u043D%u0438%u0435%29.%0A%u0421%u041A%u041C%20-%20%u043E%u0442%u043A%u0440%u043E%u0435%u0442%20%u044D%u0442%u043E%u0442%20%u0444%u0430%u0439%u043B%20%u0432%20%u0432%u0430%u0448%u0435%u043C%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u043E%u043C%20%u0440%u0435%u0434%u0430%u043A%u0442%u043E%u0440%u0435%20%u043F%u043E-%u0443%u043C%u043E%u043B%u0447%u0430%u043D%u0438%u044E.%0A%u041F%u041A%u041C%20-%20%u0441%u0442%u0430%u043D%u0434%u0430%u0440%u0442%u043D%u043E%u0435%20%u043C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438.%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация:

Выделить код

Код:

gBrowser.currentURI.spec == "about:customizing" || (() => {
    var fileName = "http-request-log.txt";
    var file = Services.dirsvc.get("ProfD", Ci.nsIFile);
    file.append(fileName);

    var obsId = "httpRequestLogger";
    var pn = "CB." + obsId + ".on";
    cbu.isPref(pn, false);
    var storageId = "CB." + obsId + ".Storage";
    
    var storage = (function() {
        var global = Cu.import("resource://gre/modules/Services.jsm", {});
        var ns = storageId;
        var storage = global[ns] || (global[ns] = global.Object.create(null));
        return {
            get: function(key, defaultVal) {
                if(key in storage)
                    return storage[key];
                return defaultVal;
            },
            set: function(key, val) {
                if(key === null)
                    delete storage[key];
                else
                    storage[key] = val;
            }
        };
    })();

    function obsConstructor() {
        var obs = storage.get(obsId, null);
        if (!obs) {
            obs = {
                topic: "http-on-modify-request",
                init: function() Services.obs.addObserver(this, this.topic, false),
                destroy: function() {
                    try {Services.obs.removeObserver(this, this.topic);}
                    catch(ex) {Cu.reportError(ex);}
                },
                observe: function(subj) {
                    var channel = subj.QueryInterface(Ci.nsIHttpChannel);
                    var ref = channel.referrer ? channel.referrer.spec : "(none)";
                    var str= ref + " " + channel.requestMethod + " " + channel.URI.spec + "\r\n";
                    str = this.suc.ConvertFromUnicode(str);
                    this.fos.write(str, str.length);
                },
                get fos() {
                    delete this.fos;
                    var fos = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
                    // PR_WRONLY | PR_CREATE_FILE | PR_APPEND
                    fos.init(file, parseInt("0x02") | parseInt("0x08") | parseInt("0x10"), -1, 0);
                    return this.fos = fos;
                },
                get suc() {
                    delete this.suc;
                    var suc = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
                    suc.charset = "utf-8";
                    return this.suc = suc;
                }
                
            };
            storage.set(obsId, obs);
            obs.init();
        }
    }
    function obsDestructor(reason) {  
        if ( !/delete|update/.test(reason) ) return;
        var obs = storage.get(obsId, null);
        if (obs) {
            obs.destroy();
            storage.set(obsId, null);
        }
        reason == "delete" && cbu.clearPrefs(pn);
    }
    addDestructor(reason => {
        obsDestructor(reason);
        setTimeout(function() {
            custombuttons.palette.querySelector('toolbarbutton[id="' + _id + '"]') && obsDestructor("delete");
        }, 500);
    });

    var imgON = "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/AAAA/wAAAP/AwMD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/AAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/wAAAP/AwMD/AAAA/wAAAP/AwMD/AAAA/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf8AAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/AAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/wAAAP/AwMD/AAAA/wAAAP/AwMD/AAAA/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf8AAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/AAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/wAAAP/AwMD/AAAA/wAAAP/AwMD/AAAA/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf8AAAD/wMDA/wAAAP8AAAD/wMDA/wAAAP9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/Zv+Z/2b/mf9m/5n/AAAA/8DAwP8AAAD/AAAA/8DAwP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/AwMD/AAAA/wAAAP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ==";
    function setState(on) {
        on ? obsConstructor() : obsDestructor("delete");
        cbu.setPrefs(pn, on);
        var src = on ? imgON : self.image;
        var en = Services.wm.getEnumerator("navigator:browser");
        while(en.hasMoreElements()) {
            var doc = en.getNext().document;
            var btn = doc.getElementById(_id);
            var [img] = doc.getAnonymousNodes(btn);
            if (img) img.src = src;
        }
    }
    setState(cbu.getPrefs(pn));
    self.onclick =e=> {
        if ( e.button == 0 ) setState(!cbu.getPrefs(pn));
        
        if ( e.button == 1 ) 
             file.exists() ? file.launch() : custombuttons.alertSlide(self.label, "Лог файл не существует");
        
        if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { 
                     e.preventDefault();
                     setState(false);
                     
                     (function f(i = 20) {
                        try { file.remove(true); custombuttons.alertSlide(self.label, "Удалил лог файл") }
                        catch(e) { i && setTimeout(()=> f(--i), 2000) };
                     })();
                     }
    }
})();


this.tooltipText = "Записывать сетевые запросы сайтов в текстовый файл\
                  \nЛ: Включить-Выключить запись(логирование)\
                  \nС: Открыть текстовый(лог) файл\
                  \nП: Удалить текстовый(лог) файл\
                  \nCtrl+П: CB Меню";

Отсутствует

 

№16718-05-2017 00:38:04

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 53.0

Re: Готовые кнопки для Custom Buttons

FF Exp Imp CB(для Firefox 53) Автор Indomito ver 7.0.1 bild of 03.06.2017

Импорт и Экспорт кнопок из/в HTML-файл
Клики на кнопке:
Shift+Left            —  Запись кнопки
Left                     —  Запись всех кнопок
Middle                 —  Установить каталог кнопок
Ctrl+Middle         —  Сбос каталога кнопок
Right                   —  Чтение кнопок(ки)


По просьбе желающих размещаю старую кнопку.:

Mozilla FF to CB FF Exp Imp CB это HTML-файл от 2015 года. Установка через Mеню->Файл.

Инициализация: Надстроечная секция(не обязательно, но можно поменять по желанию)

Выделить код

Код:

/*Initialization Code
Автор Indomito ver 7.0.1 bild of 03.06.2017
-------------------------------------------------------------------------------------------------------
Обновление для совместимоси с FireFox 53 и ТВ(не проверено на необходимость, т.к. не обновлял ещё)
 1. Замена Application.prefs.setValue() на cbu.setPrefs() и Application.prefs.getValue() на gPrefService.getComplexValue(cEICB, Ci.nsISupportsString).data()
 2. Конвертации пути в UTF-8 из-за коллизий пути содержащей кириллицу:
   - запись: cbu.setPrefs(cEICB, convertFromUnicode("UTF-8", cPathEI))
   - чтение: gPrefService.getComplexValue(cEICB, Ci.nsISupportsString).data
 3. Правки которые я хотел внести с 2012 года, а может и ранее, точно непомю, самую первую версию кнопки
-------------------------------------------------------------------------------------------------------*/

//*********************************************************************
// ----------------Можно менять значения констант ---------------------
// ------------------------BEGIN DEF-----------------------------------
const cEICB = "Export.Import.CB.type.HTML"; // Желательно не трогать, т.к. старые кнопки будут считываться с ошибками
const cPathEI = "C:\\"; // Нет менять, используется для сброса Export.Import.CB.type.HTML 
const cPrefName = "Mozilla FF to CB "; // префикс заголовка для уточнения Mozilla FireFox или Mozilla Thunderbird
const cPathSetMsg = "Надо установить путь для чтения/записи кнопок";
const csExpT = "Экспорт кнопок в HTML";
const csExpOneT ="Экспорт одной кнопки в HTML";
const csExpOneMsg ="Выберите имя кнопки"; 
const csImpT = "Импорт кнопок из HTML";
const csSetIET = "Каталог для Экспорта/Импорта кнопок в/из HTML";
const dProc = 0.30; // процент открытия выбора окна кнопок, при dProc = 0.30 это 30% кнопок от общего числа
const csNoNameBT = "Для этой кнопки не определено имя";
const csNoBT = "Это не кнопка";
const spcTn = "=================================";
const spcTm = "               Не активные кнопки";
this.tooltipText = "  Импорт и Экспорт кнопок из/в HTML-файл\n———-——————————————————\nShift+Left        —  Запись кнопки"+
                   "\nLeft                  —  Запись всех кнопок" +
                   "\nMiddle            —  Установить каталог кнопок" +
                   "\nCtrl+Middle   —  Сбос каталога кнопок" +
                   "\nRight               —  Чтение кнопок(ки)";
// -------------------------END DEF-----------------------------------


Код кнопки, вкладки код и инициализации:
Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EFF%20Exp%20Imp%20CB%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAABV1JREFUSEutVmtsk1UYriF2qCSC4ibQDUcdaghCZAE2MGwosCEGJGBkKMQfWwISyBI0TqO/MBr5AQkalWiQAXGZLLu5revWtXa23bpetl7ZurbrdV2Za3dp13Ur8znfWbu1NAaSvnly8p7znfd5vvOe6xPz8/MVP/5ZIx4wuf2s1Fn6qqeP5HF/qTjF+vyH6uNfVYrUZiil0PRWD2grrlWzct6/JFQNppA6RiVUmUDOYu2+iKZIJGJSm1MIEIIW5IsC5j7LIIGVKRdg7o060XbaLVpaH45CC5BEwKIborBSR8uAOjobaY9W0YFAy7RobYs9Y4G6oUSB0FxkyGi3GR0om3RVR9XcHaoVCqVSa+yjUOlVil65VCkRy8VCcXtrB69F0PRXTdNm8Yq32jfUKqsQSBlsBpR2EMalKDgdcQ64HAwOqTlrKpc99TNrqN9GZ2x2dnZudi4UmpmanPL5/F6v1+PxuFxuSVv33kZOUSt3W10mE+t0mJhywAXCOIGpQMRtGabI62Gn/5a28gbL0m958GAeEIvF0qjJGLNYLE6nU9wu3f7r88VVOetuP+m2eKIMcDwgTBQYsXs99vsodynYa28sh8CgwRyJPIgtO6Q1GAxOTEyMjo663W673S7mSYukmR8oNuOHEBgFIUkiMOr+lyJfwX7p5jPpt1n3tKZweDYcDnd1dSkY6+npoaXVarXZbKIWSVEnBwLPXWfHwqmTKOAfn/Pd9/u9PpQQyLn9LAR0an0wOA1zOBwulws5wV8jOSaTCewwYbMYIyjpeR0CPq8fsQRwvH4QxqUI9YmxSQYTecq0jVUrOVUstbwXHQFj1AwGg16v12q1ZrMZgxA0ioql608qt0CAxjIgPEkEAhMBil1K9qbq1dl3l/VIFWNjPmQcjOCF6XQ6+BqNBoOABr+h45As+5RqKwRo7BTFeCBRYOR+IBQMTRNMQ2BLTXpO7XK5UIlpH7aNeMj8e+E4zS67yWEx2jA9BvW91uqO97q5H/e9sfo6ezoQCiGfFIEQCONShPrMTHgmFEaZr2Tn1r+4tWHVuboPz9aeOFtXApyrX8CF+pPn60+U15cAn9adPq54jQqQ2FA4DMwQJBGYgzEbareCvbORs7NpzY7mF4A8fjqwuy1jT8favaJ1+zszD0qykZnD3TlgxxIq1WyDAAklIJsSJEkEsMypYRW92ZJJ0MopaMkqbM4GsF2L+C8X8bn7eRsO8LLf4XGPSTYBWEJl+lwIxMKpkyjgcPmjvzCXr2IX8LIL+Fl72tZeqP5o3DOJpGvkeolAJvu7u7e7j0yAYuCy4LOr8i/umK/cGr50pfc7/DU9UegoQBg3B6jT9CGP+co0nF9AgTCzvOa0yCgoe0zDRCYRmA6Q2ccawFlULMwB9nWuxwgEfXzw0538KIbO4EkUsFhHsX7pWi6UZewXZR3+51VM5pnKYy3dDVQg9iIgY2ex6BlFHfqJtqAzSEAYlyLUY5tQ7ZFtb8vYJ1p/VL6x9PcjIs3CCGIUMeqHZagAqJII0DOEQm2Xv92Y+8ofnAPfFmI/PzwCEF1kLGEcVMDn9SUK9A8MJxyHS6sxgaWPj6VpSUgRYkEYlyLUR3AZ2OiZTg70pXiUOYhpozMYEgUMxmG3GdfZ0luJVkkLFVj6+//jo7Pb7AFh3Ag0fbhOyV2KS9U54CQgtyt80vKY26AM1zII4wSUCiteA0N4E5DHAXkZDJHHARzyzqDt9LlAng6k56LP9GFCFvs4QLggkP7u10KZXCoxphzNAgHIWaXf3DxYfq1B0JlaAZFUUnT+6pnvb5Ht9+VPd8krFe/I1AH//snlOyD/D9ukZ0RvxbAvAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code%0A%u0410%u0432%u0442%u043E%u0440%20Indomito%20ver%207.0.1%20bild%20of%2003.06.2017%0A-------------------------------------------------------------------------------------------------------%0A%u041E%u0431%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u0435%20%u0434%u043B%u044F%20%u0441%u043E%u0432%u043C%u0435%u0441%u0442%u0438%u043C%u043E%u0441%u0438%20%u0441%20FireFox%2053%20%u0438%20%u0422%u0412%28%u043D%u0435%20%u043F%u0440%u043E%u0432%u0435%u0440%u0435%u043D%u043E%20%u043D%u0430%20%u043D%u0435%u043E%u0431%u0445%u043E%u0434%u0438%u043C%u043E%u0441%u0442%u044C%2C%20%u0442.%u043A.%20%u043D%u0435%20%u043E%u0431%u043D%u043E%u0432%u043B%u044F%u043B%20%u0435%u0449%u0451%29%0A%201.%20%u0417%u0430%u043C%u0435%u043D%u0430%20Application.prefs.setValue%28%29%20%u043D%u0430%20cbu.setPrefs%28%29%20%u0438%20Application.prefs.getValue%28%29%20%u043D%u0430%20gPrefService.getComplexValue%28cEICB%2C%20Ci.nsISupportsString%29.data%28%29%0A%202.%20%u041A%u043E%u043D%u0432%u0435%u0440%u0442%u0430%u0446%u0438%u0438%20%u043F%u0443%u0442%u0438%20%u0432%20UTF-8%20%u0438%u0437-%u0437%u0430%20%u043A%u043E%u043B%u043B%u0438%u0437%u0438%u0439%20%u043F%u0443%u0442%u0438%20%u0441%u043E%u0434%u0435%u0440%u0436%u0430%u0449%u0435%u0439%20%u043A%u0438%u0440%u0438%u043B%u043B%u0438%u0446%u0443%3A%0A%20%20%20-%20%u0437%u0430%u043F%u0438%u0441%u044C%3A%20cbu.setPrefs%28cEICB%2C%20convertFromUnicode%28%22UTF-8%22%2C%20cPathEI%29%29%0A%20%20%20-%20%u0447%u0442%u0435%u043D%u0438%u0435%3A%20gPrefService.getComplexValue%28cEICB%2C%20Ci.nsISupportsString%29.data%0A%203.%20%u041F%u0440%u0430%u0432%u043A%u0438%20%u043A%u043E%u0442%u043E%u0440%u044B%u0435%20%u044F%20%u0445%u043E%u0442%u0435%u043B%20%u0432%u043D%u0435%u0441%u0442%u0438%20%u0441%202012%20%u0433%u043E%u0434%u0430%2C%20%u0430%20%u043C%u043E%u0436%u0435%u0442%20%u0438%20%u0440%u0430%u043D%u0435%u0435%2C%20%u0442%u043E%u0447%u043D%u043E%20%u043D%u0435%u043F%u043E%u043C%u044E%2C%20%u0441%u0430%u043C%u0443%u044E%20%u043F%u0435%u0440%u0432%u0443%u044E%20%u0432%u0435%u0440%u0441%u0438%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%0A-------------------------------------------------------------------------------------------------------*/%0A%0A//*********************************************************************%0A//%20----------------%u041C%u043E%u0436%u043D%u043E%20%u043C%u0435%u043D%u044F%u0442%u044C%20%u0437%u043D%u0430%u0447%u0435%u043D%u0438%u044F%20%u043A%u043E%u043D%u0441%u0442%u0430%u043D%u0442%20---------------------%0A//%20------------------------BEGIN%20DEF-----------------------------------%0Aconst%20cEICB%20%3D%20%22Export.Import.CB.type.HTML%22%3B%20//%20%u0416%u0435%u043B%u0430%u0442%u0435%u043B%u044C%u043D%u043E%20%u043D%u0435%20%u0442%u0440%u043E%u0433%u0430%u0442%u044C%2C%20%u0442.%u043A.%20%u0441%u0442%u0430%u0440%u044B%u0435%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0431%u0443%u0434%u0443%u0442%20%u0441%u0447%u0438%u0442%u044B%u0432%u0430%u0442%u044C%u0441%u044F%20%u0441%20%u043E%u0448%u0438%u0431%u043A%u0430%u043C%u0438%0Aconst%20cPathEI%20%3D%20%22C%3A%5C%5C%22%3B%20//%20%u041D%u0435%u0442%20%u043C%u0435%u043D%u044F%u0442%u044C%2C%20%u0438%u0441%u043F%u043E%u043B%u044C%u0437%u0443%u0435%u0442%u0441%u044F%20%u0434%u043B%u044F%20%u0441%u0431%u0440%u043E%u0441%u0430%20Export.Import.CB.type.HTML%20%0Aconst%20cPrefName%20%3D%20%22Mozilla%20FF%20to%20CB%20%22%3B%20//%20%u043F%u0440%u0435%u0444%u0438%u043A%u0441%20%u0437%u0430%u0433%u043E%u043B%u043E%u0432%u043A%u0430%20%u0434%u043B%u044F%20%u0443%u0442%u043E%u0447%u043D%u0435%u043D%u0438%u044F%20Mozilla%20FireFox%20%u0438%u043B%u0438%20Mozilla%20Thunderbird%0Aconst%20cPathSetMsg%20%3D%20%22%u041D%u0430%u0434%u043E%20%u0443%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u043F%u0443%u0442%u044C%20%u0434%u043B%u044F%20%u0447%u0442%u0435%u043D%u0438%u044F/%u0437%u0430%u043F%u0438%u0441%u0438%20%u043A%u043D%u043E%u043F%u043E%u043A%22%3B%0Aconst%20csExpT%20%3D%20%22%u042D%u043A%u0441%u043F%u043E%u0440%u0442%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u0432%20HTML%22%3B%0Aconst%20csExpOneT%20%3D%22%u042D%u043A%u0441%u043F%u043E%u0440%u0442%20%u043E%u0434%u043D%u043E%u0439%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0432%20HTML%22%3B%0Aconst%20csExpOneMsg%20%3D%22%u0412%u044B%u0431%u0435%u0440%u0438%u0442%u0435%20%u0438%u043C%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%22%3B%20%0Aconst%20csImpT%20%3D%20%22%u0418%u043C%u043F%u043E%u0440%u0442%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u0438%u0437%20HTML%22%3B%0Aconst%20csSetIET%20%3D%20%22%u041A%u0430%u0442%u0430%u043B%u043E%u0433%20%u0434%u043B%u044F%20%u042D%u043A%u0441%u043F%u043E%u0440%u0442%u0430/%u0418%u043C%u043F%u043E%u0440%u0442%u0430%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u0432/%u0438%u0437%20HTML%22%3B%0Aconst%20dProc%20%3D%200.30%3B%20//%20%u043F%u0440%u043E%u0446%u0435%u043D%u0442%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u044F%20%u0432%u044B%u0431%u043E%u0440%u0430%20%u043E%u043A%u043D%u0430%20%u043A%u043D%u043E%u043F%u043E%u043A%2C%20%u043F%u0440%u0438%20dProc%20%3D%200.30%20%u044D%u0442%u043E%2030%25%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u043E%u0442%20%u043E%u0431%u0449%u0435%u0433%u043E%20%u0447%u0438%u0441%u043B%u0430%0Aconst%20csNoNameBT%20%3D%20%22%u0414%u043B%u044F%20%u044D%u0442%u043E%u0439%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043D%u0435%20%u043E%u043F%u0440%u0435%u0434%u0435%u043B%u0435%u043D%u043E%20%u0438%u043C%u044F%22%3B%0Aconst%20csNoBT%20%3D%20%22%u042D%u0442%u043E%20%u043D%u0435%20%u043A%u043D%u043E%u043F%u043A%u0430%22%3B%0Aconst%20spcTn%20%3D%20%22%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%22%3B%0Aconst%20spcTm%20%3D%20%22%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%u041D%u0435%20%u0430%u043A%u0442%u0438%u0432%u043D%u044B%u0435%20%u043A%u043D%u043E%u043F%u043A%u0438%22%3B%0Athis.tooltipText%20%3D%20%22%20%20%u0418%u043C%u043F%u043E%u0440%u0442%20%u0438%20%u042D%u043A%u0441%u043F%u043E%u0440%u0442%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u0438%u0437/%u0432%20HTML-%u0444%u0430%u0439%u043B%5Cn%u2014%u2014%u2014-%u2014%u2014%u2014%u2014%u2014%u2014%u2014%u2014%u2014%u2014%u2014%u2014%u2014%u2014%u2014%u2014%u2014%u2014%5CnShift+Left%20%20%20%20%20%20%20%20%u2014%20%20%u0417%u0430%u043F%u0438%u0441%u044C%20%u043A%u043D%u043E%u043F%u043A%u0438%22+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%5CnLeft%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%u2014%20%20%u0417%u0430%u043F%u0438%u0441%u044C%20%u0432%u0441%u0435%u0445%20%u043A%u043D%u043E%u043F%u043E%u043A%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%5CnMiddle%20%20%20%20%20%20%20%20%20%20%20%20%u2014%20%20%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u043A%u0430%u0442%u0430%u043B%u043E%u0433%20%u043A%u043D%u043E%u043F%u043E%u043A%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%5CnCtrl+Middle%20%20%20%u2014%20%20%u0421%u0431%u043E%u0441%20%u043A%u0430%u0442%u0430%u043B%u043E%u0433%u0430%20%u043A%u043D%u043E%u043F%u043E%u043A%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%5CnRight%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%u2014%20%20%u0427%u0442%u0435%u043D%u0438%u0435%20%u043A%u043D%u043E%u043F%u043E%u043A%28%u043A%u0438%29%22%3B%0A//%20-------------------------END%20DEF-----------------------------------%0A%0A//*********************************************************************%0A//%20%u041A%u043E%u043D%u0432%u0435%u0440%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20UTF-8%0Afunction%20convertFromUnicode%28charset%2C%20str%29%20%7B%0A%20%20%20var%20converter%20%3D%20Cc%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.createInstance%28Ci.nsIScriptableUnicodeConverter%29%3B%0A%20%20%20converter.charset%20%3D%20charset%3B%0A%20%20%20str%20%3D%20converter.ConvertFromUnicode%28str%29%3B%0A%20%20%20return%20str%20+%20converter.Finish%28%29%3B%0A%7D%3B%0A//*********************************************************************%0A%0A%0A//*********************************************************************%0A//%20%u041E%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%20%u0441%u043E%u0431%u044B%u0442%u0438%u0439%20%u043F%u043E%20%u043D%u0430%u0436%u0430%u0442%u0438%u044E%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u043C%u044B%u0448%u0438%20%u0441/%u0431%u0435%u0437%20%u043C%u043E%u0434%u0438%u0444%u0438%u043A%u0430%u0442%u043E%u0440%u0430%u043C%u0438%0A//*********************************************************************%0Athis.onclick%20%3D%20function%28event%29%20%7B%0A%20%20%20%20if%28event.button%20%3D%3D%200%20%26%26%20event.shiftKey%29%20%7B%0A//%20%u0414%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20shift+%u041B%u041A%u041C%0AshKeylbMouse%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20else%20if%28event.button%20%3D%3D%200%29%20%7B%0A//%20%u0414%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u041B%u041A%u041C%0AlbMouse%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20else%20if%28event.button%20%3D%3D%201%20%26%26%20event.ctrlKey%29%0A%20%20%20%20%7B%0A%09ctrlKeymbMouse%28%29%3B%0A%20%20%20%20%7D%20%20%20%20%0A%20%20%20%20else%20if%28event.button%20%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20%20%20//%20%u0414%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u0421%u041A%u041C%0AmbMouse%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20else%20if%28event.button%20%3D%3D%202%20%26%26%20%21event.ctrlKey%20%26%26%21event.shiftKey%20%26%26%20%21event.altKey%20%26%26%20%21event.metaKey%29%20%7B%0A%20%20%20%20%20%20%20%20//%20%u0414%u0435%u0439%u0441%u0442%u0432%u0438%u0435%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u041F%u041A%u041C%20%u0431%u0435%u0437%20%u043C%u043E%u0434%u0438%u0444%u0438%u043A%u0430%u0442%u043E%u0440%u043E%u0432%0ArbMouse%28%29%3B%0A%20%20%20%20%7D%0A%7D%3B%0Athis.oncontextmenu%20%3D%20function%28event%29%20%7B%0A%20%20%20%20if%28event.button%20%3D%3D%202%20%26%26%20%21event.ctrlKey%20%26%26%21event.shiftKey%20%26%26%20%21event.altKey%20%26%26%20%21event.metaKey%29%20%7B%0A%20%20%20%20%20%20%20%20//%20%u0411%u043B%u043E%u043A%u0438%u0440%u0443%u0435%u043C%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043D%u043E%u0435%20%u043C%u0435%u043D%u044E%20%u043F%u0440%u0438%20%u043A%u043B%u0438%u043A%u0435%20%u041F%u041A%u041C%20%u0431%u0435%u0437%20%u043C%u043E%u0434%u0438%u0444%u0438%u043A%u0430%u0442%u043E%u0440%u043E%u0432%0A%20%20%20%20%20%20%20%20event.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20event.stopPropagation%28%29%3B%0A%20%20%20%20%7D%0A%7D%3B%0A%0A//*********************************************************************%0A//%u0421%u0431%u0440%u043E%u0441%u0438%u0442%u044C%20%u043A%u0430%u0442%u0430%u043B%u043E%u0433%20%u0437%u0430%u043F%u0438%u0441%u0438/%u0447%u0442%u0435%u043D%u0438%u044F%2C%20%u0435%u0441%u043B%u0438%20%u043E%u043D%20%u0443%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%0Afunction%20ctrlKeymbMouse%28%29%7B%0A%09cbu.setPrefs%28cEICB%2C%20convertFromUnicode%28%22UTF-8%22%2C%20cPathEI%29%20%29%3B%0A%09custombuttons.%20alertBox%20%28cEICB%2C%20%22%u0421%u0431%u0440%u043E%u0441%20-%20%22+cEICB+%22%20%3D%20%22+cPathEI%29%3B%0A%7D%3B%0A%0A//*********************************************************************%0A//%u0417%u0430%u043F%u0438%u0441%u044C%20%u043E%u0434%u043D%u043E%u0439%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043F%u043E%20%u0432%u044B%u0431%u043E%u0440%u0443%0Afunction%20shKeylbMouse%28%29%7B%0A%0Aif%20%28chkPath%28gPrefService.getComplexValue%28cEICB%2C%20Ci.nsISupportsString%29.data%29%20%21%3D%201%29%0A%20%20%20%7B%0A%20%20%20custombuttons.%20alertBox%20%28csExpT%2C%20cPathSetMsg%29%3B%0A%20%20%20return%3B%0A%20%20%20%7D%0A%0Avar%20name%20%3D%20%5B%5D%3B%20//%u043C%u0430%u0441%u0441%u0438%u0432%20%u0438%u043C%u0451%u043D%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u0434%u043B%u044F%20%u0432%u044B%u0432%u043E%u0434%u0430%0Avar%20namea%20%3D%20%5B%5D%3B%20//%u043C%u0430%u0441%u0441%u0438%u0432%20%u0438%u043C%u0451%u043D%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u0430%u043A%u0442%u0438%u0432%u043D%u044B%u0445%0Avar%20namep%20%3D%20%5B%5D%3B%20//%u043C%u0430%u0441%u0441%u0438%u0432%20%u0438%u043C%u0451%u043D%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u043D%u0435%20%u0430%u043A%u0442%u0438%u0432%u043D%u044B%u0445%0Avar%20i%2Cj%2C%20buts%3B%0A%0Abuts%20%3D%20document.%20getElementsByTagName%20%28%22toolbarbutton%22%29%3B%0Afor%20%28i%20%3D%200%2C%20j%20%3D%200%3B%20i%20%3C%20buts.%20length%3B%20i++%29%0A%20%20%20%20if%20%28buts%5Bi%5D.getAttribute%28%22id%22%29.indexOf%28%22custombuttons-button%22%29%3D%3D0%20%26%26%20typeof%28buts%20%5Bi%5D.name%29%3D%3D%22string%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20namea%5Bj++%5D%20%3D%20buts%20%5Bi%5D.%20name%3B%0Anamea.sort%28cmp%29%3B%0Anamea.splice%28j%2C0%2CspcTn%2CspcTm%2CspcTn%29%3B%0A%0Abuts%20%3D%20custombuttons.%20palette.%20getElementsByTagName%20%28%22toolbarbutton%22%29%3B%0Afor%20%28%20i%20%3D%200%2C%20j%20%3D%200%3B%20i%20%3C%20buts.%20length%3B%20i++%29%0A%20%20%20%20if%20%28buts%20%5Bi%5D.%20getAttribute%20%28%22id%22%29.%20indexOf%20%28%22custombuttons-button%22%29%20%3D%3D%200%26%26typeof%28buts%20%5Bi%5D.getAttribute%20%28%22label%22%29%29%3D%3D%22string%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20namep%5Bj++%5D%20%3D%20buts%20%5Bi%5D.%20getAttribute%20%28%22label%22%29%3B%0A%0Anamep.sort%28cmp%29%3B%0Aname%3Dnamea.concat%28namep%29%3B%0A%0A//%20%u041E%u0442%u043A%u0440%u044B%u0442%u0438%u0435%20%u043C%u043E%u0434%u0430%u043B%u044C%u043D%u043E%u0433%u043E%20%u043E%u043A%u043D%u0430%20%u0432%u044B%u0431%u043E%u0440%u0430%20%u0438%u043C%u0451%u043D%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u0441%20%u0443%u0447%u0451%u0442%u043E%u043C%20%u043E%u0431%u0449%u0435%u0433%u043E%20%u0447%u0438%u0441%u043B%u0430%20%u043A%u043D%u043E%u043F%u043E%u043A%0Avar%20rowsCount%20%3D%20name.length%20*%20dProc%3B%20%0Avar%20oSvc%20%3D%20Components.classes%5B%22@mozilla.org/observer-service%3B1%22%5D%0A%20%20%20%20.getService%28Components.interfaces.nsIObserverService%29%3B%0Avar%20observer%20%3D%20%7B%0A%20%20%20%20added%3A%20true%2C%0A%20%20%20%20observe%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20%20subject.addEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20handleEvent%3A%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20var%20doc%20%3D%20e.target%3B%0A%20%20%20%20%20%20%20%20var%20win%20%3D%20doc.defaultView%3B%0A%20%20%20%20%20%20%20%20win.removeEventListener%28%22load%22%2C%20this%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20if%28doc.location.href%20%21%3D%20%22chrome%3A//global/content/selectDialog.xul%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20oSvc.removeObserver%28this%2C%20%22domwindowopened%22%29%3B%0A%20%20%20%20%20%20%20%20this.added%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20var%20list%20%3D%20doc.getElementById%28%22list%22%29%3B%0A%20%20%20%20%20%20%20%20if%28list%29%0A%20%20%20%20%20%20%20%20%20%20%20%20list.setAttribute%28%22rows%22%2C%20rowsCount%29%3B%0A%20%20%20%20%7D%0A%7D%3B%0AoSvc.addObserver%28observer%2C%20%22domwindowopened%22%2C%20false%29%3B%0A%0Avar%20selected%20%3D%20%7B%7D%3B%0Avar%20bRt%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/prompt-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIPromptService%29%0A%20%20%20%20%20%20%20%20.select%28window%2C%20csExpOneT%2C%20csExpOneMsg%2C%20name.length%2C%20name%2C%20selected%20%29%0Aobserver.added%20%26%26%20oSvc.removeObserver%28observer%2C%20%22domwindowopened%22%29%3B%0A%0Aif%20%28%21bRt%29%20return%3B%20//%20%u041E%u0442%u043C%u0435%u043D%u0430%20-%20%u0432%u044B%u0445%u043E%u0434%0A%20else%20if%20%28spcTm%3D%3Dname%5Bselected.value%5D%7C%7CspcTn%3D%3Dname%5Bselected.value%5D%29%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20custombuttons.%20alertBox%20%28csExpOneT%2C%20csNoBT%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%0A%20else%20if%20%28name%5Bselected.value%5D%3D%3D%22%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20custombuttons.%20alertBox%20%28csExpOneT%2C%20csNoNameBT%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%0A%20%0A//OK%20%20-%20%u043D%u0430%u0447%u0438%u043D%u0430%u0435%u043C%20%u043E%u0431%u0440%u0430%u0431%u043E%u043A%u0443%20%u0438%20%u0437%u0430%u043F%u0438%u0441%u044C%20%u0432%u044B%u0431%u0440%u0430%u043D%u043D%u043E%u0439%20%u043A%u043D%u043E%u043F%u043A%u0438%0Avar%20mydir%3DgPrefService.getComplexValue%28cEICB%2C%20Ci.nsISupportsString%29.data%2C%20myfilename%3Dname%20%5Bselected.value%5D%3B%0A%20%20var%20fp%20%3D%20Components.classes%5B%22@mozilla.org/filepicker%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsIFilePicker%29%3B%0A%20%20fp.init%28window%2C%20csExpOneT%2C%20fp.modeSave%29%3B%0A%20%20var%20dd%20%3D%20Components.classes%5B%22@mozilla.org/file/local%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsILocalFile%29%3B%0Add.initWithPath%28mydir%29%3B%20//%u041F%u0443%u0442%u044C%20%u043A%u043E%u0442%u043E%u0440%u044B%u0439%20%u0443%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%0Afp.displayDirectory%20%3D%20dd%3B%0Afp.defaultString%20%3D%20cPrefName+myfilename+%22.html%22%3B%0Aif%28fp.show%28%29%20%21%3D%20fp.returnCancel%29%0A%20%20%20%20%20%20%20%20custombuttons.%20alertBox%20%28csExpOneT%2C%20%22%u041A%u043D%u043E%u043F%u043A%u0430%20%22+myfilename+%22%20%u0441%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u0430%20%u0432%20%5Cn%22+%20saveCB%28fp.file.path%2C%20myfilename%29%29%3B%0A%0A//******%20DefSub%0A//%u0421%u043E%u0440%u0442%u0438%u0440%u043E%u0432%u043A%u0430%20%u0441%u0442%u0440%u043E%u043A%20%u043F%u043E%20%u0432%u043E%u0437%u0440%u0430%u0441%u0442%u0430%u043D%u0438%u044E%0Afunction%20cmp%28a%2C%20b%29%20%7B%0A%20%20if%20%28a.toUpperCase%28%29%20%3E%20b.toUpperCase%28%29%29%20return%201%3B%0A%20%20if%20%28a.toUpperCase%28%29%20%3C%20b.toUpperCase%28%29%29%20return%20-1%3B%0A%20%20return%200%3B%0A%7D%3B%0A//******%20EndDefSub%0A%0A%7D%3B%0A%0A//*********************************************************************%0A//%u0417%u0430%u043F%u0438%u0441%u0430%u0442%u044C%20%u043A%u043D%u043E%u043F%u043A%u0438%0Afunction%20lbMouse%28%29%7B%0Aif%20%28chkPath%28gPrefService.getComplexValue%28cEICB%2C%20Ci.nsISupportsString%29.data%29%20%21%3D%201%29%20custombuttons.%20alertBox%20%28csExpT%2C%20cPathSetMsg%29%3B%0A%20else%20%20%7B%0Avar%20mydir%3DgPrefService.getComplexValue%28cEICB%2C%20Ci.nsISupportsString%29.data%2C%20myfilename%20%3D%20GenFileName%28%29%3B%0A%20%20var%20fp%20%3D%20Components.classes%5B%22@mozilla.org/filepicker%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsIFilePicker%29%3B%0A%20%20fp.init%28window%2C%20csExpT%2C%20fp.modeSave%29%3B%0A%20%20var%20dd%20%3D%20Components.classes%5B%22@mozilla.org/file/local%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsILocalFile%29%3B%0Add.initWithPath%28mydir%29%3B%20//%u041F%u0443%u0442%u044C%20%u043A%u043E%u0442%u043E%u0440%u044B%u0439%20%u0443%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%0Afp.displayDirectory%20%3D%20dd%3B%0Afp.defaultString%20%3D%20myfilename%3B%0Aif%28fp.show%28%29%20%21%3D%20fp.returnCancel%29%0A%20%20%20%20%20%20%20%20custombuttons.%20alertBox%20%28csExpT%2C%20%22%u041D%u0430%u0431%u043E%u0440%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u0441%u043E%u0445%u0440%u0430%u043D%u0451%u043D%20%u0432%20%5Cn%22+%20saveCB%28fp.file.path%2C%20%22%22%29%29%3B%0A%20%20%7D%0A%7D%3B%0A%0A//*********************************************************************%0A//%u0421%u0447%u0438%u0442%u0430%u0442%u044C%20%u043A%u043D%u043E%u043F%u043A%u0438%0Afunction%20rbMouse%28%29%7B%0Aif%20%28chkPath%28gPrefService.getComplexValue%28cEICB%2C%20Ci.nsISupportsString%29.data%29%20%21%3D%201%29%20custombuttons.%20alertBox%20%28csImpT%2C%20cPathSetMsg%29%3B%0A%20%20else%0A%20%20%7B%0A%20%20%20var%20mydir%3DgPrefService.getComplexValue%28cEICB%2C%20Ci.nsISupportsString%29.data%3B%20//%2C%20myfilename%20%3D%20GenFileName%28%29%3B%0A%20%20%20var%20fp%20%3D%20Components.classes%5B%22@mozilla.org/filepicker%3B1%22%5D%0A%20%20%20%20%20%20.createInstance%28Components.interfaces.nsIFilePicker%29%3B%0A%20%20%20fp.init%28window%2C%20csImpT%2C%20fp.modeOpen%29%3B%0A%20%20%20var%20dd%20%3D%20Components.classes%5B%22@mozilla.org/file/local%3B1%22%5D%0A%20%20%20%20%20%20%20.createInstance%28Components.interfaces.nsILocalFile%29%3B%0A%20%20%20dd.initWithPath%28mydir%29%3B%0A%20%20%20fp.displayDirectory%20%3D%20dd%3B%0A%20%20%20if%28fp.show%28%29%20%21%3D%20fp.returnCancel%29%20getBrowser%20%28%29.%20selectedTab%20%3D%20getBrowser%20%28%29.%20addTab%20%28fp.file.path%29%3B%0A%20%20%7D%0A%7D%3B%0A%0A%0A//*********************************************************************%0A//%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u043A%u0430%u0442%u0430%u043B%u043E%u0433%20%u0437%u0430%u043F%u0438%u0441%u0438/%u0447%u0442%u0435%u043D%u0438%u044F%0Afunction%20mbMouse%28%29%7B%0Avar%20sPathEI%3DgPrefService.getComplexValue%28cEICB%2C%20Ci.nsISupportsString%29.data%2C%20myfilename%20%3D%20GenFileName%28%29%3B%0Aif%20%28chkPath%28sPathEI%29%20%3D%3D%20-1%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20custombuttons.%20alertBox%20%28csSetIET%2C%20%22%u043F%u0435%u0440%u0435%u043C%u0435%u043D%u043D%u0430%u044F%20%20%20%22+cEICB+%22%20%u0443%u0436%u0435%20%u0441%u0443%u0449%u0435%u0441%u0442%u0432%u0443%u0435%u0442%20%u0438%20%u0437%u0430%u043D%u044F%u0442%u0430%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%20//%u041D%u0435%u043B%u044C%u0437%u044F%20%u0441%u043E%u0437%u0434%u0430%u0432%u0430%u0442%u044C%20%u0442%u043A%20%u043F%u0435%u0440%u0435%u043C%u0435%u043D%u043D%u0430%u044F%20%u0443%u0436%u0435%20%u0437%u0430%u043D%u044F%u0442%u0430%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A//%20%u0414%u0438%u0430%u043B%u043E%u0433%20%u0441%u043E%u0437%u0434%u0430%u043D%u0438%u044F%20%u0438%20%u0443%u0441%u0442%u0430%u043D%u043E%u0432%u043A%u0438%20%u043F%u0443%u0442%u0438%0Avar%20fp%20%3D%20Components.classes%5B%22@mozilla.org/filepicker%3B1%22%5D%0A%20%20%20%20.createInstance%28Components.interfaces.nsIFilePicker%29%3B%0Afp.init%28window%2C%20csSetIET%2C%20fp.modeGetFolder%29%3B%0Avar%20dd%20%3D%20Components.classes%5B%22@mozilla.org/file/local%3B1%22%5D%0A%20%20%20%20.createInstance%28Components.interfaces.nsILocalFile%29%3B%0Add.initWithPath%28sPathEI%29%3B%0Afp.displayDirectory%20%3D%20dd%3B%0Aif%28fp.show%28%29%20%3D%3D%20fp.returnCancel%29%20return%3B%0A%20%20%20else%0A%20%20%20%20%7B%0A%20%20%20%20sPathEI%20%3D%20fp.file.path%0A%20%20%20%20sPathEI+%3D%28sPathEI%5BsPathEI.length-1%5D%20%21%3D%20%22%5C%5C%22%29%3F%22%5C%5C%22%3A%22%22%0A%20%20%20%20cbu.setPrefs%28cEICB%2C%20convertFromUnicode%28%22UTF-8%22%2C%20sPathEI%29%29%0A%20%20%20%20//cbu.setPrefs%28cEICB%2C%20sPathEI+%3D%28sPathEI%5BsPathEI.length-1%5D%20%21%3D%20%22%5C%5C%22%29%3F%22%5C%5C%22%3A%22%22%29%3B%0A%20%20%20%20custombuttons.%20alertBox%20%28csSetIET%2C%20%22%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%20%u043F%u0443%u0442%u044C%20%u0434%u043B%u044F%20%u0437%u0430%u043F%u0438%u0441%u0438/%u0447%u0442%u0435%u043D%u0438%u044F%20%5Cn%20%22%20+%20sPathEI%29%3B%0A%20%20%20%20%7D%0A%7D%3B%0A%0A//*********************************************************************%0A//chkPath%20%u043F%u0440%u043E%u0432%u0435%u0440%u044F%u0435%u0442%20%u043F%u0443%u0442%u044C%20%u0438%20%u0442%u0434%2C%20%u043C%u043E%u0436%u043D%u043E%20%u0434%u043E%u0431%u043E%u0432%u043B%u044F%u0442%u044C%20%u043F%u0440%u043E%u0432%u0435%u0440%u043A%u0438%2C%20%u0442%u043A%20%u043D%u0435%20%u0432%u0441%u0451%20%u043F%u0440%u043E%u0432%u0435%u0440%u044F%u0435%u0442%u0441%u044F.%0A//return%20%3D%20-2%20%20%u043E%u0448%u0438%u0431%u043E%u0447%u043D%u044B%u0439%20%u043F%u0443%u0442%u044C%20%u0438%u043B%u0438%20%u0435%u0433%u043E%20%u043D%u0435%20%u0441%u0443%u0449%u0435%u0441%u0442%u0432%u0443%u0435%u0442%20%28%u043F%u043E%u0447%u0442%u0438%20%u043D%u0435%20%u0438%u0441%u043F%u043E%u043B%u044C%u0437%u0443%u0435%u0442%u0441%u044F%29%0A//%20return%20%3D%20-1%20%u043E%u0448%u0438%u0431%u043A%u0430%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%28%u0434%u043B%u044F%20%u0441%u043E%u0432%u043C%u0435%u0441%u0442%u0438%u043C%u043E%u0441%u0442%u0438%29%0A//%20return%20%3D%200%20%20%u0442%u0440%u0435%u0431%u0443%u0435%u0442%u0441%u044F%20%u0441%u043E%u0437%u0434%u0430%u0442%u044C%20%u0438%20%u043E%u043F%u0440%u0435%u0434%u0435%u043B%u0438%u0442%u044C%20%u043F%u0443%u0442%u044C%0A//%20return%20%3D%201%20%20%u0432%u0441%u0451%20%u041E%u041A%0A%0Afunction%20chkPath%28cPth%29%7B%0Avar%20vPth%20%3D%20gPrefService.getComplexValue%28cEICB%2C%20Ci.nsISupportsString%29.data%20//%u043F%u0440%u0435%u0434%u0443%u0441%u0442%u0430%u043D%u043E%u0432%u043A%u0430%0Aif%20%28vPth%20%3D%3D%20%22%22%29%7B%0A%20%20%20%20%20%20%20cbu.setPrefs%28cEICB%2C%20convertFromUnicode%28%22UTF-8%22%2C%20cPathEI%29%29%3B%20//%20%u0421%u043E%u0437%u0434%u0430%u043B%u0438%20%u0438%20%u043F%u0443%u0442%u044C%20%u043F%u043E%20%u0443%u043C%u043E%u043B%u0447%u0430%u043D%u0438%u044E%20%u0438%u0437%20%u043E%u043F%u0440%u0435%u0434%u0435%u043B%u0435%u043D%u0438%u044F%0A%20%20%20%20%20%20%20res%20%3D%201%3B%20//%u041F%u0435%u0440%u0435%u043C%u0435%u043D%u043D%u0430%u044F%20%u0441%u0443%u0449%u0435%u0441%u0442%u0432%u0443%u0435%u0442%20%u0438%20%u043E%u043F%u0440%u0435%u0434%u0435%u043B%u0435%u043D%u0430%0A%20%20%20%20%20%20%20%7D%0A%20else%20if%20%28typeof%28vPth%29%20%21%3D%20%22string%22%29%0A%20%20%20%20%20%20%20res%20%3D%20-1%3B%20//%u041F%u0435%u0440%u0435%u043C%u0435%u043D%u043D%u0430%u044F%20%u043E%u043F%u0440%u0435%u0434%u0435%u043B%u0435%u043D%u0430%20%u0438%20%u043D%u0435%20%u0442%u043E%u0433%u043E%20%u0442%u0438%u043F%u0430%2C%20%u0437%u043D%u0430%u0447%u0438%u0442%20%u043E%u043D%u0430%20%u043D%u0435%20%u043D%u0430%u0448%u0430%0A%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20//%u041F%u0440%u043E%u0431%u0443%u0435%u043C%20%u043F%u0440%u043E%u0432%u0435%u0440%u0438%u0442%u044C%20%u043F%u0443%u0442%u044C%20-%20%u043E%u0442%u0432%u0435%u0442%20%u0432%20%u0438%u0441%u043A%u043B%u044E%u0447%u0435%u043D%u0438%u0438.%0A%20%20%20%20%20%20%20%20var%20file%20%3D%20Components.classes%5B%22@mozilla.org/file/local%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%28Components.interfaces.nsILocalFile%29%3B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20file.initWithPath%28cPth%29%3B%0A%20%20%20%20%20%20%20%20%20if%20%28%21file.isDirectory%28%29%20%29%20res%20%3D%200%3B%20//%u0422%u0430%u043A%u043E%u0433%u043E%20%u043F%u0443%u0442%u0438%20%u043D%u0435%u0442%20%u043D%u0430%u0434%u043E%20%u0441%u043E%u0437%u0434%u0430%u0432%u0430%u0442%u044C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%20res%20%3D%201%3B%20//%20%u041F%u0443%u0442%u044C%20%u0435%u0441%u0442%u044C%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20catch%28e%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20res%20%3D%20-2%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20return%20res%3B%0A%7D%3B%0A%0A//*********************************************************************%0A//%u0413%u0435%u043D%u0435%u0440%u0430%u0446%u0438%u044F%20%u0438%u043C%u0435%u043D%u0438%20%u0444%u0430%u0439%u043B%u0430%20%u043F%u0440%u0438%20%u0437%u0430%u043F%u0438%u0441%u0438%20%u0432%u0441%u0435%u0445%20%u043A%u043D%u043E%u043F%u043E%u043A%0Afunction%20GenFileName%28%29%7B%0Avar%20t%3Dnew%20Date%28%29%3B%0Avar%20y%3D1900+t.getYear%28%29%3B%0Avar%20min%3Dt.getMinutes%28%29%3B%20if%20%28min%3C10%29%7Bmin%3D%220%22+min%7D%3B%0Avar%20h%3Dt.getHours%28%29%3B%20%20if%20%28h%3C10%29%7Bh%3D%220%22+h%7D%3B%0Avar%20m%3Dt.getMonth%28%29%3B%0Avar%20d%3Dt.getDate%28%29%3B%0Avar%20indDM%20%3D%20d+%2831*m-31%29%3B%20%20%0Aswitch%28m%29%7Bcase%200%3A%20m%3D%22Jan%22%3Bbreak%3Bcase%201%3A%20m%3D%22Feb%22%3Bbreak%3Bcase%202%3A%20m%3D%22Mar%22%3Bbreak%3Bcase%203%3A%20m%3D%22Apr%22%3Bbreak%3Bcase%204%3A%20m%3D%22May%22%3Bbreak%3Bcase%205%3A%20m%3D%22June%22%3Bbreak%3Bcase%206%3A%20m%3D%22July%22%3Bbreak%3Bcase%207%3A%20m%3D%22Aug%22%3Bbreak%3Bcase%208%3A%20m%3D%22Sept%22%3Bbreak%3Bcase%209%3A%20m%3D%22Oct%22%3Bbreak%3Bcase%2010%3A%20m%3D%22Nov%22%3Bbreak%3Bdefault%3A%20m%3D%22Dec%22%3B%7D%0Aif%20%28d%3C10%29%7Bd%3D%220%22+d%7D%3B%0A//if%20%28m%3C10%29%7Bm%3D%220%22+m%7D%3B%0A//y%20%3D%20y%20-%202000%3B%0Ay.toString%20%28%29%0A//var%20curdate%3D%20d%20+%20%22.%22%20+m+%20%22%28%22%20+h+%20%22.%22%20+min+%20%22%29%22%3B%0Avar%20curdate%3D%20y%20+%20%22%20%22%20+indDM+%20%22%28%22%20+h+%20%22.%22%20+min+%20%22%29%22%3B%0A//var%20myfilename%20%3D%20cPrefName+%20y%22%20id%3D%22%20+y+%20indDM%20+%22%20%22+%20curdate%20+%22.html%22%3B%0Avar%20myfilename%20%3D%20cPrefName+%20curdate%20+%22.html%22%3B%0Areturn%20myfilename%3B%0A%7D%3B%0A%0A//*********************************************************************%0A//%20%u0424%u0443%u043D%u043A%u0446%u0438%u044F%20%u0437%u0430%u043F%u0438%u0441%u0438%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u0432%20HTML-%u0444%u0430%u0439%u043B%0A//*********************************************************************%0A//%u0417%u0430%u043F%u0438%u0441%u044C%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u0432%20HTML%20%u0444%u0430%u0439%u043B%0Afunction%20saveCB%28fullfilepath%2C%20nameCB%29%7B%0Avar%20bu%3D%22%22%2C%20buts%2C%20doc%2C%20name%2C%20image%2C%20uri%2C%20mode%2C%20code%2C%20initCode%2C%20accelkey%2C%20help%3B%0A%0AVisibleConv%20%28nameCB%29%3B%0AAllConv%28nameCB%29%3B%0A%0A//var%20uc%20%3D%20Components.%20classes%20%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.%20createInstance%20%28Components.%20interfaces.%20nsIScriptableUnicodeConverter%29%3B%0A//uc.%20charset%20%3D%20%22utf-8%22%3B%0A//bu%20%3D%20uc.%20ConvertFromUnicode%20%28bu%29%3B%0Avar%20head%20%3D%20%22%3Chtml%3E%5Cn%3Chead%3E%5Cn%3Cmeta%20http-equiv%3D%27Content-Type%27%20content%3D%27text/html%3B%20charset%3Dutf-8%27%3E%5Cn%3C/head%3E%5Cn%3Cbody%3E%5Cn%22%3B%0Avar%20fileend%20%3D%20%22%5Cn%3C/body%3E%5Cn%3C/html%3E%22%0Avar%20htmlSource%20%3D%20head%20+%20bu%20+%20fileend%3B%0A%0Avar%20filedata%3DhtmlSource%3B%0A%0Avar%20file%20%3D%20Components.classes%5B%22@mozilla.org/file/local%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20createInstance%28Components.interfaces.nsILocalFile%29%3B%0Afile.initWithPath%28fullfilepath%29%3B%0Avar%20foStream%20%3D%20Components.classes%5B%22@mozilla.org/network/file-output-stream%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%28Components.interfaces.nsIFileOutputStream%29%3B%0A%0AfoStream.init%28file%2C%200x02%20%7C%200x08%20%7C%200x20%2C%200666%2C%200%29%3B%0Avar%20converter%20%3D%20Components.classes%5B%22@mozilla.org/intl/converter-output-stream%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%28Components.interfaces.nsIConverterOutputStream%29%3B%0Aconverter.init%28foStream%2C%20%22UTF-8%22%2C%200%2C%200%29%3B%0Aconverter.writeString%28filedata%29%3B%0Aconverter.close%28%29%3B%0Areturn%20fullfilepath%3B%0A%0A//*********************************************************************%0A//%u041F%u043E%u0434%u043F%u0440%u043E%u0433%u0440%u0430%u043C%u043C%u044B%20%u0434%u043B%u044F%20function%20saveCB%0A//*********************************************************************%0A//******DefSub%0A%0A//*********************************************************************%0Afunction%20VisibleConv%28nameCB%29%20%0A%7B%0Abuts%20%3D%20document.%20getElementsByTagName%20%28%22toolbarbutton%22%29%3B%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20buts.%20length%3B%20i++%29%0A%7B%0A%20%20%20%20if%20%28buts%20%5Bi%5D.getAttribute%20%28%22id%22%29.%20indexOf%20%28%22custombuttons-button%22%29%20%3D%3D%200%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20name%20%3D%20buts%20%5Bi%5D.%20name%3B%0A%20%20%20%20%20%20%20%20if%20%28nameCB%21%3D%22%22%26%26nameCB%21%3Dname%29%20continue%3B%0A%20%20%20%20%20%20%20%20image%20%3D%20buts%20%5Bi%5D.%20image%20%7C%7C%20buts%20%5Bi%5D.%20cbStdIcon%3B%0A%20%20%20%20%20%20%20%20uri%20%3D%20buts%20%5Bi%5D.%20URI%3B%0A%20%20%20%20%20%20%20%20bu%20+%3D%22%3Cimg%20src%3D%22%20+%20image%20+%20%22%3E%26nbsp%3Ca%20href%3D%22%20+%20uri%20+%20%22%3E%22%20+%20name%20+%22%3C/a%3E%3Cbr%3E%5Cn%22%3B%0A%20%20%20%20%7D%0A%7D%0Abu%20+%3D%22%3Chr%3E%22%3B%0A%7D%3B%0A%0A//*********************************************************************%0Afunction%20AllConv%28nameCB%29%0A%7B%0Abuts%20%3D%20custombuttons.%20palette.%20getElementsByTagName%20%28%22toolbarbutton%22%29%3B%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20buts.%20length%3B%20i++%29%0A%7B%0A%20%20%20%20if%20%28buts%20%5Bi%5D.%20getAttribute%20%28%22id%22%29.%20indexOf%20%28%22custombuttons-button%22%29%20%3D%3D%200%29%0A%20%20%20%20%7B%0A//%20%u0418%u043C%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u0432%20UTF-8%0A%20%20%20%20%20%20%20%20name%20%3D%20buts%20%5Bi%5D.%20getAttribute%20%28%22label%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28nameCB%21%3D%22%22%26%26nameCB%21%3Dname%29%20continue%3B%0A//%20%20%20%20%20%20%20%20var%20uc%20%3D%20Components.%20classes%20%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.%20createInstance%20%28Components.%20interfaces.%20nsIScriptableUnicodeConverter%29%3B%0A//%20%20%20%20%20%20%20%20uc.%20charset%20%3D%20%22utf-8%22%3B%0A//%20%20%20%20%20%20%20%20name%20%3D%20uc.%20ConvertFromUnicode%20%28name%29%3B%0A%0A//%20BASE64%20%u0432%20UTF-8%0A%20%20%20%20%20%20%20%20image%20%3D%20buts%20%5Bi%5D.%20getAttribute%20%28%22image%22%29%20%7C%7C%20buts%20%5Bi%5D.%20getAttribute%20%28%22cb-stdicon%22%29%3B%0A%20%20%20%20%20%20%20%20var%20uc%20%3D%20Components.%20classes%20%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.%20createInstance%20%28Components.%20interfaces.%20nsIScriptableUnicodeConverter%29%3B%0A%20%20%20%20%20%20%20%20uc.%20charset%20%3D%20%22utf-8%22%3B%0A%20%20%20%20%20%20%20%20image%20%3D%20uc.%20ConvertFromUnicode%20%28image%29%3B%0A%0A%20%20%20%20%20%20%20%20mode%20%3D%20buts%20%5Bi%5D.%20getAttribute%20%28%22cb-mode%22%29%3B%0A%20%20%20%20%20%20%20%20code%20%3D%20buts%20%5Bi%5D.%20getAttribute%20%28%22cb-oncommand%22%29%3B%0A%20%20%20%20%20%20%20%20initCode%20%3D%20buts%20%5Bi%5D.%20getAttribute%20%28%22cb-init%22%29%3B%0A%20%20%20%20%20%20%20%20accelkey%20%3D%20buts%20%5Bi%5D.%20getAttribute%20%28%22cb-accelkey%22%29%3B%0A%20%20%20%20%20%20%20%20help%20%3D%20buts%20%5Bi%5D.%20getAttribute%20%28%22Help%22%29%20%7C%7C%20buts%20%5Bi%5D.%20getAttribute%20%28%22help%22%29%20%7C%7C%20%22%22%3B%0A%20%20%20%20%20%20%20%20doc%20%3D%20document.%20implementation.%20createDocument%20%28%22%22%2C%20%22%22%2C%20null%29%3B%0A%20%20%20%20%20%20%20%20doc.%20async%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20doc.%20load%20%28%22chrome%3A//custombuttons/content/nbftemplate.xml%22%29%3B%0A%20%20%20%20%20%20%20%20setText%20%28doc%2C%20%22name%22%2C%20name%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20setText%20%28doc%2C%20%22mode%22%2C%20mode%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20setText%20%28doc%2C%20%22image%22%2C%20image%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20setText%20%28doc%2C%20%22code%22%2C%20code%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20setText%20%28doc%2C%20%22initcode%22%2C%20initCode%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20setText%20%28doc%2C%20%22accelkey%22%2C%20accelkey%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20setText%20%28doc%2C%20%22help%22%2C%20help%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20var%20ser%20%3D%20new%20XMLSerializer%20%28%29%3B%0A%20%20%20%20%20%20%20%20var%20data%20%3D%20ser.%20serializeToString%20%28doc%29%3B%0A%20%20%20%20%20%20%20%20uri%20%3D%20%22custombutton%3A//%22%20+%20escape%20%28data%29%3B%0A%20%20%20%20%20%20%20%20bu+%3D%22%3Cimg%20src%3D%22%20+%20image%20+%20%22%3E%26nbsp%3Ca%20href%3D%22%20+%20uri%20+%20%22%3E%22%20+%20name%20+%22%3C/a%3E%3Cbr%3E%5Cn%22%3B%0A%20%20%20%20%7D%0A%20%7D%0A%7D%3B%0A%0A//*********************************************************************%0Afunction%20setText%20%28doc%2C%20nodeName%2C%20text%2C%20make_CDATASection%29%0A%7B%0A%20%20%20%20var%20node%20%3D%20doc.%20getElementsByTagName%20%28nodeName%29%20%5B0%5D%2C%20cds%3B%0A%20%20%20%20if%20%28%21node%29%20return%3B%0A%20%20%20%20if%20%28make_CDATASection%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20try%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20cds%20%3D%20doc.%20createCDATASection%20%28text%20%7C%7C%20%22%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20catch%20%28e%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20cds%20%3D%20doc.%20createTextNode%20%28text%20%7C%7C%20%22%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20node.%20appendChild%20%28cds%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20else%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20node.%20textContent%20%3D%20text%3B%0A%20%20%20%20%7D%0A%7D%3B%0A//******%20EndDefSub%0A%0A//******%20End%20function%20saveCB%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация: Код полностью

Выделить код

Код:

/*Initialization Code
Автор Indomito ver 7.0.1 bild of 03.06.2017
-------------------------------------------------------------------------------------------------------
Обновление для совместимоси с FireFox 53 и ТВ(не проверено на необходимость, т.к. не обновлял ещё)
 1. Замена Application.prefs.setValue() на cbu.setPrefs() и Application.prefs.getValue() на gPrefService.getComplexValue(cEICB, Ci.nsISupportsString).data()
 2. Конвертации пути в UTF-8 из-за коллизий пути содержащей кириллицу:
   - запись: cbu.setPrefs(cEICB, convertFromUnicode("UTF-8", cPathEI))
   - чтение: gPrefService.getComplexValue(cEICB, Ci.nsISupportsString).data
 3. Правки которые я хотел внести с 2012 года, а может и ранее, точно непомю, самую первую версию кнопки
-------------------------------------------------------------------------------------------------------*/

//*********************************************************************
// ----------------Можно менять значения констант ---------------------
// ------------------------BEGIN DEF-----------------------------------
const cEICB = "Export.Import.CB.type.HTML"; // Желательно не трогать, т.к. старые кнопки будут считываться с ошибками
const cPathEI = "C:\\"; // Нет менять, используется для сброса Export.Import.CB.type.HTML 
const cPrefName = "Mozilla FF to CB "; // префикс заголовка для уточнения Mozilla FireFox или Mozilla Thunderbird
const cPathSetMsg = "Надо установить путь для чтения/записи кнопок";
const csExpT = "Экспорт кнопок в HTML";
const csExpOneT ="Экспорт одной кнопки в HTML";
const csExpOneMsg ="Выберите имя кнопки"; 
const csImpT = "Импорт кнопок из HTML";
const csSetIET = "Каталог для Экспорта/Импорта кнопок в/из HTML";
const dProc = 0.30; // процент открытия выбора окна кнопок, при dProc = 0.30 это 30% кнопок от общего числа
const csNoNameBT = "Для этой кнопки не определено имя";
const csNoBT = "Это не кнопка";
const spcTn = "=================================";
const spcTm = "               Не активные кнопки";
this.tooltipText = "  Импорт и Экспорт кнопок из/в HTML-файл\n———-——————————————————\nShift+Left        —  Запись кнопки"+
                   "\nLeft                  —  Запись всех кнопок" +
                   "\nMiddle            —  Установить каталог кнопок" +
                   "\nCtrl+Middle   —  Сбос каталога кнопок" +
                   "\nRight               —  Чтение кнопок(ки)";
// -------------------------END DEF-----------------------------------

//*********************************************************************
// Конвертировать текст в UTF-8
function convertFromUnicode(charset, str) {
   var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
   converter.charset = charset;
   str = converter.ConvertFromUnicode(str);
   return str + converter.Finish();
};
//*********************************************************************


//*********************************************************************
// Обработчик событий по нажатию кнопок мыши с/без модификаторами
//*********************************************************************
this.onclick = function(event) {
    if(event.button == 0 && event.shiftKey) {
// Действие при клике shift+ЛКМ
shKeylbMouse();
    }
    else if(event.button == 0) {
// Действие при клике ЛКМ
lbMouse();
    }
    else if(event.button == 1 && event.ctrlKey)
    {
    ctrlKeymbMouse();
    }    
    else if(event.button == 1) {
        // Действие при клике СКМ
mbMouse();
    }
    else if(event.button == 2 && !event.ctrlKey &&!event.shiftKey && !event.altKey && !event.metaKey) {
        // Действие при клике ПКМ без модификаторов
rbMouse();
    }
};
this.oncontextmenu = function(event) {
    if(event.button == 2 && !event.ctrlKey &&!event.shiftKey && !event.altKey && !event.metaKey) {
        // Блокируем контекстное меню при клике ПКМ без модификаторов
        event.preventDefault();
        event.stopPropagation();
    }
};

//*********************************************************************
//Сбросить каталог записи/чтения, если он установлен
function ctrlKeymbMouse(){
    cbu.setPrefs(cEICB, convertFromUnicode("UTF-8", cPathEI) );
    custombuttons. alertBox (cEICB, "Сброс - "+cEICB+" = "+cPathEI);
};

//*********************************************************************
//Запись одной кнопки по выбору
function shKeylbMouse(){

if (chkPath(gPrefService.getComplexValue(cEICB, Ci.nsISupportsString).data) != 1)
   {
   custombuttons. alertBox (csExpT, cPathSetMsg);
   return;
   }

var name = []; //массив имён кнопок для вывода
var namea = []; //массив имён кнопок активных
var namep = []; //массив имён кнопок не активных
var i,j, buts;

buts = document. getElementsByTagName ("toolbarbutton");
for (i = 0, j = 0; i < buts. length; i++)
    if (buts[i].getAttribute("id").indexOf("custombuttons-button")==0 && typeof(buts [i].name)=="string")
                     namea[j++] = buts [i]. name;
namea.sort(cmp);
namea.splice(j,0,spcTn,spcTm,spcTn);

buts = custombuttons. palette. getElementsByTagName ("toolbarbutton");
for ( i = 0, j = 0; i < buts. length; i++)
    if (buts [i]. getAttribute ("id"). indexOf ("custombuttons-button") == 0&&typeof(buts [i].getAttribute ("label"))=="string")
            namep[j++] = buts [i]. getAttribute ("label");

namep.sort(cmp);
name=namea.concat(namep);

// Открытие модального окна выбора имён кнопок с учётом общего числа кнопок
var rowsCount = name.length * dProc; 
var oSvc = Components.classes["@mozilla.org/observer-service;1"]
    .getService(Components.interfaces.nsIObserverService);
var observer = {
    added: true,
    observe: function(subject, topic, data) {
        subject.addEventListener("load", this, false);
    },
    handleEvent: function(e) {
        var doc = e.target;
        var win = doc.defaultView;
        win.removeEventListener("load", this, false);
        if(doc.location.href != "chrome://global/content/selectDialog.xul")
            return;
        oSvc.removeObserver(this, "domwindowopened");
        this.added = false;
        var list = doc.getElementById("list");
        if(list)
            list.setAttribute("rows", rowsCount);
    }
};
oSvc.addObserver(observer, "domwindowopened", false);

var selected = {};
var bRt = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
        .getService(Components.interfaces.nsIPromptService)
        .select(window, csExpOneT, csExpOneMsg, name.length, name, selected )
observer.added && oSvc.removeObserver(observer, "domwindowopened");

if (!bRt) return; // Отмена - выход
 else if (spcTm==name[selected.value]||spcTn==name[selected.value]) 
            {
             custombuttons. alertBox (csExpOneT, csNoBT);
             return;
            } 
 else if (name[selected.value]=="")
            {
             custombuttons. alertBox (csExpOneT, csNoNameBT);
             return;
            }          
 
//OK  - начинаем обрабоку и запись выбранной кнопки
var mydir=gPrefService.getComplexValue(cEICB, Ci.nsISupportsString).data, myfilename=name [selected.value];
  var fp = Components.classes["@mozilla.org/filepicker;1"]
          .createInstance(Components.interfaces.nsIFilePicker);
  fp.init(window, csExpOneT, fp.modeSave);
  var dd = Components.classes["@mozilla.org/file/local;1"]
         .createInstance(Components.interfaces.nsILocalFile);
dd.initWithPath(mydir); //Путь который установлен
fp.displayDirectory = dd;
fp.defaultString = cPrefName+myfilename+".html";
if(fp.show() != fp.returnCancel)
        custombuttons. alertBox (csExpOneT, "Кнопка "+myfilename+" сохранена в \n"+ saveCB(fp.file.path, myfilename));

//****** DefSub
//Сортировка строк по возрастанию
function cmp(a, b) {
  if (a.toUpperCase() > b.toUpperCase()) return 1;
  if (a.toUpperCase() < b.toUpperCase()) return -1;
  return 0;
};
//****** EndDefSub

};

//*********************************************************************
//Записать кнопки
function lbMouse(){
if (chkPath(gPrefService.getComplexValue(cEICB, Ci.nsISupportsString).data) != 1) custombuttons. alertBox (csExpT, cPathSetMsg);
 else  {
var mydir=gPrefService.getComplexValue(cEICB, Ci.nsISupportsString).data, myfilename = GenFileName();
  var fp = Components.classes["@mozilla.org/filepicker;1"]
          .createInstance(Components.interfaces.nsIFilePicker);
  fp.init(window, csExpT, fp.modeSave);
  var dd = Components.classes["@mozilla.org/file/local;1"]
         .createInstance(Components.interfaces.nsILocalFile);
dd.initWithPath(mydir); //Путь который установлен
fp.displayDirectory = dd;
fp.defaultString = myfilename;
if(fp.show() != fp.returnCancel)
        custombuttons. alertBox (csExpT, "Набор кнопок сохранён в \n"+ saveCB(fp.file.path, ""));
  }
};

//*********************************************************************
//Считать кнопки
function rbMouse(){
if (chkPath(gPrefService.getComplexValue(cEICB, Ci.nsISupportsString).data) != 1) custombuttons. alertBox (csImpT, cPathSetMsg);
  else
  {
   var mydir=gPrefService.getComplexValue(cEICB, Ci.nsISupportsString).data; //, myfilename = GenFileName();
   var fp = Components.classes["@mozilla.org/filepicker;1"]
      .createInstance(Components.interfaces.nsIFilePicker);
   fp.init(window, csImpT, fp.modeOpen);
   var dd = Components.classes["@mozilla.org/file/local;1"]
       .createInstance(Components.interfaces.nsILocalFile);
   dd.initWithPath(mydir);
   fp.displayDirectory = dd;
   if(fp.show() != fp.returnCancel) getBrowser (). selectedTab = getBrowser (). addTab (fp.file.path);
  }
};


//*********************************************************************
//Установить каталог записи/чтения
function mbMouse(){
var sPathEI=gPrefService.getComplexValue(cEICB, Ci.nsISupportsString).data, myfilename = GenFileName();
if (chkPath(sPathEI) == -1) {
              custombuttons. alertBox (csSetIET, "переменная   "+cEICB+" уже существует и занята")
              return; //Нельзя создавать тк переменная уже занята
              };
// Диалог создания и установки пути
var fp = Components.classes["@mozilla.org/filepicker;1"]
    .createInstance(Components.interfaces.nsIFilePicker);
fp.init(window, csSetIET, fp.modeGetFolder);
var dd = Components.classes["@mozilla.org/file/local;1"]
    .createInstance(Components.interfaces.nsILocalFile);
dd.initWithPath(sPathEI);
fp.displayDirectory = dd;
if(fp.show() == fp.returnCancel) return;
   else
    {
    sPathEI = fp.file.path
    sPathEI+=(sPathEI[sPathEI.length-1] != "\\")?"\\":""
    cbu.setPrefs(cEICB, convertFromUnicode("UTF-8", sPathEI))
    //cbu.setPrefs(cEICB, sPathEI+=(sPathEI[sPathEI.length-1] != "\\")?"\\":"");
    custombuttons. alertBox (csSetIET, "Установлен путь для записи/чтения \n " + sPathEI);
    }
};

//*********************************************************************
//chkPath проверяет путь и тд, можно добовлять проверки, тк не всё проверяется.
//return = -2  ошибочный путь или его не существует (почти не используется)
// return = -1 ошибка настройки (для совместимости)
// return = 0  требуется создать и определить путь
// return = 1  всё ОК

function chkPath(cPth){
var vPth = gPrefService.getComplexValue(cEICB, Ci.nsISupportsString).data //предустановка
if (vPth == ""){
       cbu.setPrefs(cEICB, convertFromUnicode("UTF-8", cPathEI)); // Создали и путь по умолчанию из определения
       res = 1; //Переменная существует и определена
       }
 else if (typeof(vPth) != "string")
       res = -1; //Переменная определена и не того типа, значит она не наша
   else {
        //Пробуем проверить путь - ответ в исключении.
        var file = Components.classes["@mozilla.org/file/local;1"].
                 createInstance(Components.interfaces.nsILocalFile);
    try {
        file.initWithPath(cPth);
         if (!file.isDirectory() ) res = 0; //Такого пути нет надо создавать
                 else  res = 1; // Путь есть
         }
    catch(e) {
             res = -2;
             }
        }
 return res;
};

//*********************************************************************
//Генерация имени файла при записи всех кнопок
function GenFileName(){
var t=new Date();
var y=1900+t.getYear();
var min=t.getMinutes(); if (min<10){min="0"+min};
var h=t.getHours();  if (h<10){h="0"+h};
var m=t.getMonth();
var d=t.getDate();
var indDM = d+(31*m-31);  
switch(m){case 0: m="Jan";break;case 1: m="Feb";break;case 2: m="Mar";break;case 3: m="Apr";break;case 4: m="May";break;case 5: m="June";break;case 6: m="July";break;case 7: m="Aug";break;case 8: m="Sept";break;case 9: m="Oct";break;case 10: m="Nov";break;default: m="Dec";}
if (d<10){d="0"+d};
//if (m<10){m="0"+m};
//y = y - 2000;
y.toString ()
//var curdate= d + "." +m+ "(" +h+ "." +min+ ")";
var curdate= y + " " +indDM+ "(" +h+ "." +min+ ")";
//var myfilename = cPrefName+ y" id=" +y+ indDM +" "+ curdate +".html";
var myfilename = cPrefName+ curdate +".html";
return myfilename;
};

//*********************************************************************
// Функция записи кнопок в HTML-файл
//*********************************************************************
//Запись кнопок в HTML файл
function saveCB(fullfilepath, nameCB){
var bu="", buts, doc, name, image, uri, mode, code, initCode, accelkey, help;

VisibleConv (nameCB);
AllConv(nameCB);

//var uc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
//uc. charset = "utf-8";
//bu = uc. ConvertFromUnicode (bu);
var head = "<html>\n<head>\n<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>\n</head>\n<body>\n";
var fileend = "\n</body>\n</html>"
var htmlSource = head + bu + fileend;

var filedata=htmlSource;

var file = Components.classes["@mozilla.org/file/local;1"].
           createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(fullfilepath);
var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].
               createInstance(Components.interfaces.nsIFileOutputStream);

foStream.init(file, 0x02 | 0x08 | 0x20, 0666, 0);
var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].
                createInstance(Components.interfaces.nsIConverterOutputStream);
converter.init(foStream, "UTF-8", 0, 0);
converter.writeString(filedata);
converter.close();
return fullfilepath;

//*********************************************************************
//Подпрограммы для function saveCB
//*********************************************************************
//******DefSub

//*********************************************************************
function VisibleConv(nameCB) 
{
buts = document. getElementsByTagName ("toolbarbutton");
for (var i = 0; i < buts. length; i++)
{
    if (buts [i].getAttribute ("id"). indexOf ("custombuttons-button") == 0)
    {
        name = buts [i]. name;
        if (nameCB!=""&&nameCB!=name) continue;
        image = buts [i]. image || buts [i]. cbStdIcon;
        uri = buts [i]. URI;
        bu +="<img src=" + image + ">&nbsp<a href=" + uri + ">" + name +"</a><br>\n";
    }
}
bu +="<hr>";
};

//*********************************************************************
function AllConv(nameCB)
{
buts = custombuttons. palette. getElementsByTagName ("toolbarbutton");
for (var i = 0; i < buts. length; i++)
{
    if (buts [i]. getAttribute ("id"). indexOf ("custombuttons-button") == 0)
    {
// Имя кнопки в UTF-8
        name = buts [i]. getAttribute ("label");
        if (nameCB!=""&&nameCB!=name) continue;
//        var uc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
//        uc. charset = "utf-8";
//        name = uc. ConvertFromUnicode (name);

// BASE64 в UTF-8
        image = buts [i]. getAttribute ("image") || buts [i]. getAttribute ("cb-stdicon");
        var uc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
        uc. charset = "utf-8";
        image = uc. ConvertFromUnicode (image);

        mode = buts [i]. getAttribute ("cb-mode");
        code = buts [i]. getAttribute ("cb-oncommand");
        initCode = buts [i]. getAttribute ("cb-init");
        accelkey = buts [i]. getAttribute ("cb-accelkey");
        help = buts [i]. getAttribute ("Help") || buts [i]. getAttribute ("help") || "";
        doc = document. implementation. createDocument ("", "", null);
        doc. async = false;
        doc. load ("chrome://custombuttons/content/nbftemplate.xml");
        setText (doc, "name", name, false);
        setText (doc, "mode", mode, false);
        setText (doc, "image", image, true);
        setText (doc, "code", code, true);
        setText (doc, "initcode", initCode, true);
        setText (doc, "accelkey", accelkey, true);
        setText (doc, "help", help, true);
        var ser = new XMLSerializer ();
        var data = ser. serializeToString (doc);
        uri = "custombutton://" + escape (data);
        bu+="<img src=" + image + ">&nbsp<a href=" + uri + ">" + name +"</a><br>\n";
    }
 }
};

//*********************************************************************
function setText (doc, nodeName, text, make_CDATASection)
{
    var node = doc. getElementsByTagName (nodeName) [0], cds;
    if (!node) return;
    if (make_CDATASection)
    {
        try
        {
            cds = doc. createCDATASection (text || "");
        }
        catch (e)
        {
            cds = doc. createTextNode (text || "");
        }
        node. appendChild (cds);
    }
    else
    {
        node. textContent = text;
    }
};
//****** EndDefSub

//****** End function saveCB
};


Спасибо bunda1 за кнопку Объекты: перебор свойств, а то я бы долго искал нужные/обновлённые функции. :)

P.S. Об ошибках, хотя все устранил, пожелания и вопросах — пишите в ЛС, я отвечу. Есть ошибка, если кнопки не было , т.е. отсутствует переменная в about:config - Export.Import.CB.type.HTML -

ИДЁТ УСТРАНЕНИЕ

Отредактировано Indomito (05-06-2017 07:29:20)


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№16826-08-2017 19:13:09

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: Готовые кнопки для Custom Buttons

Экспорт/импорт закладок в HTML-файл( Firefox52+ ) от 27.05.2019.
кнопка открывает меню, из которого можно экспортировать закладки в HTML-файл с запросом на место сохранения или без запроса в последнюю папку сохранения, также кнопка даёт возможность импортировать закладки из HTML-файла и открыть папку для экспорта закладок.

Скриншот меню
058772974bfee502906bcfc05fc8ae0f.png

ЛКМ => Открыть меню кнопки.

Код кнопки и инициализации:
Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u042D%u043A%u0441%u043F%u043E%u0440%u0442/%u0438%u043C%u043F%u043E%u0440%u0442%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%20%u0432%20HTML-%u0444%u0430%u0439%u043B%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAWAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAHAAAAAwAAAAAAAAANAAAAMwAAAEsAAABOAAAATgAAAE4AAABOAAAATgAAAE4AAABOAAAATgAAAE4AAABOAAAATgAAAE8AAABKAAAAMQAAAAwAAAAuLCwsl2tra89nZ2fNZ2dnz2dnZ89nZ2fPZ2dnz2dnZ89nZ2fPZ2dnz2dnZ89nZ2fPZ2dnz2dnZ81sbGzPKCgokwAAACsAAABHy8vL/7+/v/+/v7//v7+//729vf+/v7//v7+//7+/v/+/v7//v7+//76+vv++vr7/vr6+/7+/v/+/v7//ycnJ/wAAAEIKCgpQ0tLS/8PDw//Dw8P/wsLC/+fn5/3CwsL/w8PD/8PDw//Dw8P/wsLC/8nJyf/V1dX/x8fH/8PDw//ExMT/0tLS/wAAAEkJCQlQ39/f/9DQ0P/Q0ND/29vb/ykpKbfb29v/0NDQ/9DQ0P/Ozs7/7u7u/6ioqMVsbGyqvr6+0ujo6P/Pz8//39/f/wAAAEgKCgpQ6+vr/9vb2//b29v/5+fn/zIyMrfn5+f/29vb/9vb2//w8PD/ODg4jAAAAHw/Pz+oAAAAcHZ2dqvm5ub/6+vr/wAAAEgJCQlQ8PDw/9/f3//f39//7Ozs/zMzM7fs7Oz/39/f/+Tk5P+urq7ZAAAAa+jo6Prx8fH/w8PD5QAAAGPf39/18vLy/wAAAEgICAhQ9/f3/+bm5v/m5ub/8vLy/zQ0NLfy8vL/5ubm/+zs7P+RkZHOEhISd//////o6Oj//////gAAAGTLy8vq+fn5/wAAAEgJCQlQ/f39/+zs7P/s7Oz/+fn5/zMzM7j5+fn/7Ozs/+7u7v/l5eX3AAAAdoODg7Lq6urmUFBQmwQEBIr5+fn//f39/wAAAEgKCgpN//////Hx8f/x8fH//Pz8/0RERMH8/Pz/8fHx//Hx8f/4+Pj/vb294wAAAJAAAAB6GRkZnN3d3fH09PT//////wAAAEYFBQU3//////X19f/19fX/9fX1///////4+Pj/+Pj4//j4+P/4+Pj//f39//////////////////v7+//4+Pj//////wAAAC8AAAAKfn5+j/39/fn5+fn//Pz8/+Pj4+Pd3d3X3d3d193d3dfd3d3X3d3d193d3dfd3d3X3d3d193d3dfj4+PYeHh4ggcHBwkAAAAAAAAACZubm6b//////////gAAAC0FBQUGDQ0NBA4ODgQNDQ0EDQ0NBA0NDQQNDQ0EDQ0NBA0NDQQaGhoCAAAAAAAAAAAAAAAAFxcXARkZGQs3NzcwISEhHSkpKQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8AAgABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAwACD/8AA///AAP//wAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bself._handleClick%20%3D%28%29%3D%3E%20menuPopup.openPopup%28this%2C%20%22after_start%22%29%3B%20%20%0A%0A%0Avar%20array%20%3D%20%5B%0A%20%20%20%5B%20%22%u042D%u043A%u0441%u043F%u043E%u0440%u0442%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%20%u0432%20HTML-%u0444%u0430%u0439%u043B%22%2C%20%22setPathAndExportsBookmarksToHTMLFile%28%29%22%2C%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAWAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAADg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAADg/o/w4P6P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAADg/o/zUq6P8OD+j/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAADg/o/0RC//0cE+X/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAA/////xQW5/8tMOT/Njfw/0BA+v9JSP//UU///1hT//9aVv3/RUL5/zQy+f8zNPH/JSHa/w4P6P8AAAAAAAAAAAAAAAAAAAAA/////xAR5v0UFeL/Hh7v/Soo+P80Mf39PDn+/0I+//05NPn/F5sr/zlO0/08PeL/NDbb/Rwdyv8OD+j/AAAAAAAAAAAAAAAA/////w4P6P8XGOn/Hh7x/yQk9f8rKvX/MjD1/zk0+f85NPn/F5sr/xebK/8lQ6n/Hx/D/w4P6P8AAAAAAAAAAAAAAAAAAAAA/////w4P6P8OD+j/Dg/o/w4P6P8OD+j/Dg/o/w4P6P8OD+j/F5sr/zfyX/0Xmyv/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAA/////33EgP+W8J//m/Sk/6D5qv+k/K7/qPyz/6z8uP9t2H7/QuJf/zz/Xv8f7UX/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAA/////wOQFP8f5D3/KexI/zL3U/87/V3/Qf9k/0T/aP9K/2v/Qf9j/zn5Wf8571X/Kt1J/xebK/8AAAAAAAAAAAAAAAAAAAAA/////weUGf0Y6Tj/IvNE/Sn6Tv81/lj9Pv9h/0X9Z/1H/mf/Rvpk/0HvXP064VP/MtZL/RrHN/8Xmyv/AAAAAAAAAAAAAAAA/////wmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/zjgUf8x1kj/FMIy/xebK/8AAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAAKL08/zDXSP0NvCz/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAAHKsv/xS9Lv8Xmyv/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAAF5sr/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAAF5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8AAg9/AAIPPwACDx8AAg8PAAIABwACAAMAAgAHAAIADwACAA8AAgAHAAIAAwACAAcAAg8PAAIPHwACDz8AAg9/AAP//wAA%3D%22%5D%2C%0A%20%20%20%5B%20%22%u0418%u043C%u043F%u043E%u0440%u0442%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%20%u0438%u0437%20HTML-%u0444%u0430%u0439%u043B%u0430%22%2C%20%22importBookmarksOutHTMLFile%28%29%22%2C%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAWAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAADg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8OD+j/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////w4P6P81Kuj/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////Dg/o/xwT5f9EQv/9Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8OD+j/JSHa/zM08f80Mvn/RUL5/1pW/f9YU///UU///0lI//9AQPr/Njfw/y0w5P8UFuf/AAAAAAAAAAAAAAAA/////w4P6P8cHcr/NDbb/Tw94v85TtP9F5sr/zk0+f9CPv/9PDn+/zQx/f0qKPj/Hh7v/RQV4v8QEeb9AAAAAAAAAAAAAAAA//////////8OD+j/Hx/D/yVDqf8Xmyv/F5sr/zk0+f85NPn/MjD1/ysq9f8kJPX/Hh7x/xcY6f8OD+j/AAAAAAAAAAAAAAAA////////////////Dg/o/xebK/838l/9F5sr/w4P6P8OD+j/Dg/o/w4P6P8OD+j/Dg/o/w4P6P8OD+j/AAAAAAAAAAAAAAAA////////////////F5sr/x/tRf88/17/QuJf/23Yfv+s/Lj/qPyz/6T8rv+g+ar/m/Sk/5bwn/99xID/AAAAAAAAAAAAAAAA//////////8Xmyv/Kt1J/znvVf85+Vn/Qf9j/0r/a/9E/2j/Qf9k/zv9Xf8y91P/KexI/x/kPf8DkBT/AAAAAAAAAAAAAAAA/////xebK/8axzf/MtZL/TrhU/9B71z9Rvpk/0f+Z/9F/Wf9Pv9h/zX+WP0p+k7/IvNE/RjpOP8HlBn9AAAAAAAAAAAAAAAA//////////8Xmyv/FMIy/zHWSP844FH/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/AAAAAAAAAAAAAAAA////////////////F5sr/w28LP8w10j9KL08/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////xebK/8UvS7/HKsv/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8Xmyv/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAF5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8AAgv/AAID/wACA/8AAgP/AAIAAwACAAMAAgADAAIAAwACAAMAAgADAAIAAwACAAMAAgP/AAID/wACA/8AAgv/AAP//wAA%3D%22%5D%2C%20%20%0A%20%20%20%5B%20%22separator%22%20%5D%2C%0A%20%20%20%5B%20%22%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043F%u0430%u043F%u043A%u0443%20%u0434%u043B%u044F%20%u044D%u043A%u0441%u043F%u043E%u0440%u0442%u0430%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%22%2C%20%22openBookmarksFolder%28%29%22%2C%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOC8xMS8wNdiEE10AAAAldEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIE1YIDIwMDSHdqzPAAACiUlEQVR4nKWTy0uUYRTGf+/np6PTODOmMpaGhJRaZmQgRAQtglaBf4BRtGgTFLUqKjBoF1QQlBLdKCgrscuiFEq6gGmQBWWSYLfpMqXMTM71+773PS0kQXBR9MBvdZ7z8HDgKBHhf2T9jUkdUbVKKTXfzH7eqVpdXbDDzWvRmrDngePyMZniXfsxLtLBFuAWhziqlOoQET0n4dlprk5/uysisTncO7Gqt3s/N5eeWCjD8T5ZcWa5nNvFmc6d7AEKRAQRgaHT9Gcyb0XyB+ain8jGC+ul5/15GXTuSN+3bmntapHj2+kFyv6E2K7DSrw0Yw9v8ys6gS9chfbgWvA5K2qXUb2knAfZflaXrWXTqg2MByNt12sG25JTiaRSqsI2wuLU5HdyU19p2TZOga+IfX27CUdqqG8KMeK9IKdchtLP8GpdaivXcN8S1g3cDwERWxvIJmP4K1qwfRmQl5wc6p450B14dLiHCecTzf5mtp7aC0BlqJx1M44iywjk4q/xVzSDxMEkkYNXkIOXKSsOoESwUChgoS+At/8GI5u7JOswDIhlDKR/DBKoXA4mCiYxS124nBLxqKCQoGjqwuV46QSTH0fIOYwCjm0MuOnPFAXrwB2eKWY8yKdoDJbgd35S5eYJmWkaQqWYfCGf3wyQc4gCrm0EvMwXiksXQW4SslnIZ0GEhkAJC3IJIq4mpNM0lgaxiqpJTX1SP38xCni2ESgtsxBjgd0OAYHATJHGmgH8Ja1ECusIWSHqa6rI5MKk4lGejjEKuLbWvJqMmdVDZ5vwPGbRGr5rxeDjahJuCtsUE43FSOaFRJpLIx9IAK4CbKAS8AHzPsw8MkAaiCsRQSll/8PybIiI6N8D8VYf0gJ8eQAAAABJRU5ErkJggg%3D%3D%22%5D%2C%0A%20%20%20%5B%20%22%u042D%u043A%u0441%u043F%u043E%u0440%u0442%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%20%u0432%20HTML%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%22%2C%20%22exportsBookmarksToHTMLFile%28%29%22%2C%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wBPAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wBkAP8ATwD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wB6AP0AUgD/AE8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAP8AZQD/AG4A/wB3AP8AfwD/AIQA/wCHAP8AiAD/AHkA/wBtAP8AbAD/AFgA/wBPAP8AAAAAAAAAAAAAAAAAAAAAAAAAAABQAP0AUgD/AFwA/QBmAP8AbgD9AHQA/wB4AP0AbwD/F5sr/wBzAP0AbgD/AGcA/QBQAP8ATwD/AAAAAAAAAAAAAAAAAAAAAABPAP8AVgD/AF0A/wBiAP8AZwD/AGsA/wBvAP8AbwD/F5sr/xebK/8AXgD/AFAA/wBPAP8AAAAAAAAAAAAAAAAAAAAAAAAAAABPAP8ATwD/AE8A/wBPAP8ATwD/AE8A/wBPAP8ATwD/F5sr/zfyX/0Xmyv/AE8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH3EgP+W8J//m/Sk/6D5qv+k/K7/qPyz/6z8uP9t2H7/QuJf/zz/Xv8f7UX/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQFP8f5D3/KexI/zL3U/87/V3/Qf9k/0T/aP9K/2v/Qf9j/zn5Wf8571X/Kt1J/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAeUGf0Y6Tj/IvNE/Sn6Tv81/lj9Pv9h/0X9Z/1H/mf/Rvpk/0HvXP064VP/MtZL/RrHN/8Xmyv/AAAAAAAAAAAAAAAAAAAAAAmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/zjgUf8x1kj/FMIy/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKL08/zDXSP0NvCz/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHKsv/xS9Lv8Xmyv/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8BB/9/AQf/PwEH/x8BB/8PAQcABwEHAAMBBwAHAQcADwEHAA8BBwAHAQcAAwEHAAcBB/8PAQf/HwEH/z8BB/9/AQf//wEE%3D%22%5D%0A%5D%3B%0Avar%20menuPopup%20%3D%20self.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0Aarray.forEach%28%28m%2Ci%29%3D%3E%20%7B%0A%20%20%20if%20%28%20m%5B0%5D%20%3D%3D%20%22separator%22%20%29%20%7B%20menuPopup.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%20return%20%7D%3B%0A%20%20%20var%20mItem%20%3D%20menuPopup.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0A%20%20%20mItem.setAttribute%28%22label%22%2C%20m%5B0%5D%29%3B%0A%20%20%20mItem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%22%29%3B%0A%20%20%20mItem.setAttribute%28%22image%22%2C%20m%5B2%5D%29%3B%20%0A%20%20%20mItem.addEventListener%28%22command%22%2C%20%28%29%3D%3E%20eval%28m%5B1%5D%29%29%3B%0A%7D%29%3B%0AmenuPopup.setAttribute%28%22onclick%22%2C%20%22event.stopPropagation%28%29%22%29%3B%0A%0A%0Afunction%20importBookmarksOutHTMLFile%28%29%20%7B%0A%20%20%20var%20fp%20%3D%20window.makeFilePicker%28%29%3B%0A%20%20%20fp.init%28window%2C%20%22%u0412%u044B%u0431%u0435%u0440%u0438%u0442%u0435%20HTML-%u0444%u0430%u0439%u043B%20%u0434%u043B%u044F%20%u0438%u043C%u043F%u043E%u0440%u0442%u0430%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%22%2C%20fp.modeOpen%29%3B%0A%20%20%20fp.appendFilters%28fp.filterHTML%29%3B%0A%20%20%20Cu.import%28%22resource%3A//gre/modules/FileUtils.jsm%22%29%3B%0A%20%20%20fp.displayDirectory%20%3D%20FileUtils.File%28getPathToBookmarksFolder%28%29%29%3B%0A%20%20%20fp.open%28re%3D%3E%20%7B%20%0A%20%20%20%20%20%20if%20%28%20re%20%21%3D%20fp.returnOK%20%29%20return%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20Cu.import%28%22resource%3A//gre/modules/BookmarkHTMLUtils.jsm%22%29%3B%0A%20%20%20%20%20%20BookmarkHTMLUtils.importFromFile%28fp.file.path%2C%20%7Breplace%3A%20true%7D%29.then%28null%2C%20Cu.reportError%29%3B%0A%20%20%20%7D%29%0A%7D%3B%0A%0A%0Afunction%20exportsBookmarksToHTMLFile%28%29%20%7B%0A%20%20%20var%20file%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.createInstance%28Ci.nsIFile%29%3B%0A%20%20%20file.initWithPath%28getPathToBookmarksFolder%28%29%29%3B%0A%20%20%20var%20path%20%3D%20file.path%20+%20%22%5C%5Cbookmarks-%22%20+%20new%20Date%28%29.toLocaleDateString%28%29%20+%20%22%20%22%20+%20%28new%20Date%28%29.toLocaleTimeString%28%27lv-LV%27%29.replace%28/%3A/g%2C%20%22%u02F8%22%29%29%20+%20%22.html%22%3B%0A%0A%20%20%20Cu.import%28%22resource%3A//gre/modules/BookmarkHTMLUtils.jsm%22%29%3B%0A%20%20%20BookmarkHTMLUtils.exportToFile%28path%29.then%28null%2C%20Cu.reportError%29%3B%0A%0A%20%20%20var%20alertsService%20%3D%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%0A%20%20%20alertsService.showAlertNotification%28self.image%2C%20self.label%2C%20%22%u042D%u043A%u0441%u043F%u043E%u0440%u0442%u0438%u0440%u043E%u0432%u0430%u043B%20%u0437%u0430%u043A%u043B%u0430%u0434%u043A%u0438%20%u043A%u0430%u043A%20HTML%20%u0432%20%22%20+%20path%29%3B%0A%20%20%20setTimeout%28%28%29%3D%3E%20alertsService.closeAlert%28%29%2C%203500%29%3B%0A%7D%3B%0A%0A%0Afunction%20openBookmarksFolder%28%29%20%7B%0A%20%20%20var%20folder%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.createInstance%28Ci.nsIFile%29%3B%0A%20%20%20folder.initWithPath%28getPathToBookmarksFolder%28%29%29%3B%0A%20%20%20folder.launch%28%29%3B%0A%7D%3B%0A%0A%0Afunction%20setPathAndExportsBookmarksToHTMLFile%28%29%20%7B%20%20%20%20%20%0A%20%20%20var%20fp%20%3D%20window.makeFilePicker%28%29%3B%0A%20%20%20fp.init%28window%2C%20%22%u0423%u043A%u0430%u0436%u0438%u0442%u0435%20%u043F%u0430%u043F%u043A%u0443%20%u0434%u043B%u044F%20%u044D%u043A%u0441%u043F%u043E%u0440%u0442%u0430%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%21%22%2C%20fp.modeGetFolder%29%3B%0A%20%20%20fp.open%28re%3D%3E%20%7B%20%0A%20%20%20%20%20%20if%20%28%20re%20%21%3D%20fp.returnOK%20%29%20return%3B%0A%20%20%20%20%20%20cbu.setPrefs%28%22CB.exportsBookmarksToHTMLFile.path%22%2C%20convertFromUnicode%28%22UTF-8%22%2C%20fp.file.path%29%29%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20exportsBookmarksToHTMLFile%28%29%3B%0A%20%20%20%7D%29%0A%7D%3B%0A%0A%0Afunction%20getPathToBookmarksFolder%28%29%20%7B%0A%20%20%20var%20s%20%3D%20%22CB.exportsBookmarksToHTMLFile.path%22%2C%20pref%20%3D%20Services.prefs%3B%0A%20%20%20try%20%7B%20return%20%28pref.getStringPref%20%3F%20pref.getStringPref%28s%29%20%3A%20pref.getComplexValue%28s%2C%20Ci.nsISupportsString%29.data%29%20%7D%0A%20%20%20catch%28e%29%20%7B%20return%20%22C%3A%22%20%7D%3B%0A%7D%3B%0A%20%20%20%20%20%20%0A%0Afunction%20convertFromUnicode%28charset%2C%20str%29%20%7B%0A%20%20%20var%20converter%20%3D%20Cc%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.createInstance%28Ci.nsIScriptableUnicodeConverter%29%3B%0A%20%20%20converter.charset%20%3D%20charset%3B%0A%20%20%20str%20%3D%20converter.ConvertFromUnicode%28str%29%3B%0A%20%20%20return%20str%20+%20converter.Finish%28%29%3B%0A%7D%3B%0A%0A%0Athis.onmouseover%20%3D%28%29%3D%3E%20%7B%20%0A%20%20%20var%20path%20%3D%20getPathToBookmarksFolder%28%29%3B%0A%20%20%20this.tooltipText%20%3D%20self.label%20+%20%22%5Cn%u041B%3A%20%u041C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%5Cn%u041F%3A%20CB%20%u043C%u0435%u043D%u044E%5Cn%5Cn%u041F%u0430%u043F%u043A%u0430%20%u0434%u043B%u044F%20%u044D%u043A%u0441%u043F%u043E%u0440%u0442%u0430%3A%5Cn%22%20+%20path%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация:

Выделить код

Код:

self._handleClick =()=> menuPopup.openPopup(this, "after_start");  


var array = [
   [ "Экспорт закладок в HTML-файл", "setPathAndExportsBookmarksToHTMLFile()", "data:image/x-icon;base64,AAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAWAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAADg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAADg/o/w4P6P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAADg/o/zUq6P8OD+j/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAADg/o/0RC//0cE+X/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAA/////xQW5/8tMOT/Njfw/0BA+v9JSP//UU///1hT//9aVv3/RUL5/zQy+f8zNPH/JSHa/w4P6P8AAAAAAAAAAAAAAAAAAAAA/////xAR5v0UFeL/Hh7v/Soo+P80Mf39PDn+/0I+//05NPn/F5sr/zlO0/08PeL/NDbb/Rwdyv8OD+j/AAAAAAAAAAAAAAAA/////w4P6P8XGOn/Hh7x/yQk9f8rKvX/MjD1/zk0+f85NPn/F5sr/xebK/8lQ6n/Hx/D/w4P6P8AAAAAAAAAAAAAAAAAAAAA/////w4P6P8OD+j/Dg/o/w4P6P8OD+j/Dg/o/w4P6P8OD+j/F5sr/zfyX/0Xmyv/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAA/////33EgP+W8J//m/Sk/6D5qv+k/K7/qPyz/6z8uP9t2H7/QuJf/zz/Xv8f7UX/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAA/////wOQFP8f5D3/KexI/zL3U/87/V3/Qf9k/0T/aP9K/2v/Qf9j/zn5Wf8571X/Kt1J/xebK/8AAAAAAAAAAAAAAAAAAAAA/////weUGf0Y6Tj/IvNE/Sn6Tv81/lj9Pv9h/0X9Z/1H/mf/Rvpk/0HvXP064VP/MtZL/RrHN/8Xmyv/AAAAAAAAAAAAAAAA/////wmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/zjgUf8x1kj/FMIy/xebK/8AAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAAKL08/zDXSP0NvCz/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAAHKsv/xS9Lv8Xmyv/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAAF5sr/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAAAAAAAAAAAAAAAAAF5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8AAg9/AAIPPwACDx8AAg8PAAIABwACAAMAAgAHAAIADwACAA8AAgAHAAIAAwACAAcAAg8PAAIPHwACDz8AAg9/AAP//wAA="],
   [ "Импорт закладок из HTML-файла", "importBookmarksOutHTMLFile()", "data:image/x-icon;base64,AAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAWAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAADg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8OD+j/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////w4P6P81Kuj/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////Dg/o/xwT5f9EQv/9Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8OD+j/JSHa/zM08f80Mvn/RUL5/1pW/f9YU///UU///0lI//9AQPr/Njfw/y0w5P8UFuf/AAAAAAAAAAAAAAAA/////w4P6P8cHcr/NDbb/Tw94v85TtP9F5sr/zk0+f9CPv/9PDn+/zQx/f0qKPj/Hh7v/RQV4v8QEeb9AAAAAAAAAAAAAAAA//////////8OD+j/Hx/D/yVDqf8Xmyv/F5sr/zk0+f85NPn/MjD1/ysq9f8kJPX/Hh7x/xcY6f8OD+j/AAAAAAAAAAAAAAAA////////////////Dg/o/xebK/838l/9F5sr/w4P6P8OD+j/Dg/o/w4P6P8OD+j/Dg/o/w4P6P8OD+j/AAAAAAAAAAAAAAAA////////////////F5sr/x/tRf88/17/QuJf/23Yfv+s/Lj/qPyz/6T8rv+g+ar/m/Sk/5bwn/99xID/AAAAAAAAAAAAAAAA//////////8Xmyv/Kt1J/znvVf85+Vn/Qf9j/0r/a/9E/2j/Qf9k/zv9Xf8y91P/KexI/x/kPf8DkBT/AAAAAAAAAAAAAAAA/////xebK/8axzf/MtZL/TrhU/9B71z9Rvpk/0f+Z/9F/Wf9Pv9h/zX+WP0p+k7/IvNE/RjpOP8HlBn9AAAAAAAAAAAAAAAA//////////8Xmyv/FMIy/zHWSP844FH/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/AAAAAAAAAAAAAAAA////////////////F5sr/w28LP8w10j9KL08/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////xebK/8UvS7/HKsv/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8Xmyv/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////8AAAAAF5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8AAgv/AAID/wACA/8AAgP/AAIAAwACAAMAAgADAAIAAwACAAMAAgADAAIAAwACAAMAAgP/AAID/wACA/8AAgv/AAP//wAA="],  
   [ "separator" ],
   [ "Открыть папку для экспорта закладок", "openBookmarksFolder()", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOC8xMS8wNdiEE10AAAAldEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIE1YIDIwMDSHdqzPAAACiUlEQVR4nKWTy0uUYRTGf+/np6PTODOmMpaGhJRaZmQgRAQtglaBf4BRtGgTFLUqKjBoF1QQlBLdKCgrscuiFEq6gGmQBWWSYLfpMqXMTM71+773PS0kQXBR9MBvdZ7z8HDgKBHhf2T9jUkdUbVKKTXfzH7eqVpdXbDDzWvRmrDngePyMZniXfsxLtLBFuAWhziqlOoQET0n4dlprk5/uysisTncO7Gqt3s/N5eeWCjD8T5ZcWa5nNvFmc6d7AEKRAQRgaHT9Gcyb0XyB+ain8jGC+ul5/15GXTuSN+3bmntapHj2+kFyv6E2K7DSrw0Yw9v8ys6gS9chfbgWvA5K2qXUb2knAfZflaXrWXTqg2MByNt12sG25JTiaRSqsI2wuLU5HdyU19p2TZOga+IfX27CUdqqG8KMeK9IKdchtLP8GpdaivXcN8S1g3cDwERWxvIJmP4K1qwfRmQl5wc6p450B14dLiHCecTzf5mtp7aC0BlqJx1M44iywjk4q/xVzSDxMEkkYNXkIOXKSsOoESwUChgoS+At/8GI5u7JOswDIhlDKR/DBKoXA4mCiYxS124nBLxqKCQoGjqwuV46QSTH0fIOYwCjm0MuOnPFAXrwB2eKWY8yKdoDJbgd35S5eYJmWkaQqWYfCGf3wyQc4gCrm0EvMwXiksXQW4SslnIZ0GEhkAJC3IJIq4mpNM0lgaxiqpJTX1SP38xCni2ESgtsxBjgd0OAYHATJHGmgH8Ja1ECusIWSHqa6rI5MKk4lGejjEKuLbWvJqMmdVDZ5vwPGbRGr5rxeDjahJuCtsUE43FSOaFRJpLIx9IAK4CbKAS8AHzPsw8MkAaiCsRQSll/8PybIiI6N8D8VYf0gJ8eQAAAABJRU5ErkJggg=="],
   [ "Экспорт закладок в HTML без запроса", "exportsBookmarksToHTMLFile()", "data:image/x-icon;base64,AAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wBPAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wBkAP8ATwD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wB6AP0AUgD/AE8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAP8AZQD/AG4A/wB3AP8AfwD/AIQA/wCHAP8AiAD/AHkA/wBtAP8AbAD/AFgA/wBPAP8AAAAAAAAAAAAAAAAAAAAAAAAAAABQAP0AUgD/AFwA/QBmAP8AbgD9AHQA/wB4AP0AbwD/F5sr/wBzAP0AbgD/AGcA/QBQAP8ATwD/AAAAAAAAAAAAAAAAAAAAAABPAP8AVgD/AF0A/wBiAP8AZwD/AGsA/wBvAP8AbwD/F5sr/xebK/8AXgD/AFAA/wBPAP8AAAAAAAAAAAAAAAAAAAAAAAAAAABPAP8ATwD/AE8A/wBPAP8ATwD/AE8A/wBPAP8ATwD/F5sr/zfyX/0Xmyv/AE8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH3EgP+W8J//m/Sk/6D5qv+k/K7/qPyz/6z8uP9t2H7/QuJf/zz/Xv8f7UX/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQFP8f5D3/KexI/zL3U/87/V3/Qf9k/0T/aP9K/2v/Qf9j/zn5Wf8571X/Kt1J/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAeUGf0Y6Tj/IvNE/Sn6Tv81/lj9Pv9h/0X9Z/1H/mf/Rvpk/0HvXP064VP/MtZL/RrHN/8Xmyv/AAAAAAAAAAAAAAAAAAAAAAmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/zjgUf8x1kj/FMIy/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKL08/zDXSP0NvCz/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHKsv/xS9Lv8Xmyv/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8BB/9/AQf/PwEH/x8BB/8PAQcABwEHAAMBBwAHAQcADwEHAA8BBwAHAQcAAwEHAAcBB/8PAQf/HwEH/z8BB/9/AQf//wEE="]
];
var menuPopup = self.appendChild(document.createElement("menupopup"));
array.forEach((m,i)=> {
   if ( m[0] == "separator" ) { menuPopup.appendChild(document.createElement("menuseparator")); return };
   var mItem = menuPopup.appendChild(document.createElement("menuitem"));
   mItem.setAttribute("label", m[0]);
   mItem.setAttribute("class", "menuitem-iconic");
   mItem.setAttribute("image", m[2]); 
   mItem.addEventListener("command", ()=> eval(m[1]));
});
menuPopup.setAttribute("onclick", "event.stopPropagation()");


function importBookmarksOutHTMLFile() {
   var fp = window.makeFilePicker();
   fp.init(window, "Выберите HTML-файл для импорта закладок", fp.modeOpen);
   fp.appendFilters(fp.filterHTML);
   Cu.import("resource://gre/modules/FileUtils.jsm");
   fp.displayDirectory = FileUtils.File(getPathToBookmarksFolder());
   fp.open(re=> { 
      if ( re != fp.returnOK ) return;
      
      Cu.import("resource://gre/modules/BookmarkHTMLUtils.jsm");
      BookmarkHTMLUtils.importFromFile(fp.file.path, {replace: true}).then(null, Cu.reportError);
   })
};


function exportsBookmarksToHTMLFile() {
   var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
   file.initWithPath(getPathToBookmarksFolder());
   var path = file.path + "\\bookmarks-" + new Date().toLocaleDateString() + " " + (new Date().toLocaleTimeString('lv-LV').replace(/:/g, "˸")) + ".html";

   Cu.import("resource://gre/modules/BookmarkHTMLUtils.jsm");
   BookmarkHTMLUtils.exportToFile(path).then(null, Cu.reportError);

   var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
   alertsService.showAlertNotification(self.image, self.label, "Экспортировал закладки как HTML в " + path);
   setTimeout(()=> alertsService.closeAlert(), 3500);
};


function openBookmarksFolder() {
   var folder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
   folder.initWithPath(getPathToBookmarksFolder());
   folder.launch();
};


function setPathAndExportsBookmarksToHTMLFile() {     
   var fp = window.makeFilePicker();
   fp.init(window, "Укажите папку для экспорта закладок!", fp.modeGetFolder);
   fp.open(re=> { 
      if ( re != fp.returnOK ) return;
      cbu.setPrefs("CB.exportsBookmarksToHTMLFile.path", convertFromUnicode("UTF-8", fp.file.path));
      
      exportsBookmarksToHTMLFile();
   })
};


function getPathToBookmarksFolder() {
   var s = "CB.exportsBookmarksToHTMLFile.path", pref = Services.prefs;
   try { return (pref.getStringPref ? pref.getStringPref(s) : pref.getComplexValue(s, Ci.nsISupportsString).data) }
   catch(e) { return "C:" };
};
      

function convertFromUnicode(charset, str) {
   var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
   converter.charset = charset;
   str = converter.ConvertFromUnicode(str);
   return str + converter.Finish();
};


this.onmouseover =()=> { 
   var path = getPathToBookmarksFolder();
   this.tooltipText = self.label + "\nЛ: Меню кнопки\nП: CB меню\n\nПапка для экспорта:\n" + path;
};

Отсутствует

 

№16926-08-2017 21:58:29

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: Готовые кнопки для Custom Buttons

Папка загрузки( Firefox24+ ) от 28.11.2017.
кнопка даёт возможность открыть папку загрузки и установить папку загрузки. Сплывающая подсказка у кнопки отображает путь к папке загрузки.

Скриншот подсказки у кнопки
f73ebd8f440628204c160cbbb5133afd.png

ЛКМ => Открыть папку загрузки,
СКМ => CB меню,
ПКМ => Установить папку загрузки.

Код кнопки и инициализации:
Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041F%u0430%u043F%u043A%u0430%20%u0437%u0430%u0433%u0440%u0443%u0437%u043A%u0438%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAExIAAAEAIADIBQAAFgAAACgAAAATAAAAJAAAAAEAIAAAAAAAoAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwICAAAAAEBILx1bYE5THyImBBQTEgAAAAABAAAABAMDAwAHBwYJAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIBAAAAAiszIwafxGqnjLKg9kZRWUpMSkoTLSosAQcEBwBZPRlCqWoU0hgTDEQAAAAYAQEAFQAAAAgAAAACAAAAAAAAAAABAgEAAAAAAhkbFQCTuGmAib1j+IGnnfJARUpmU01FMWBpWzdjf3Bex4Yd2+KCAP+pbh/lCwsLNAAAABkCAgEWAAAABQAAAAAAAQAAAQEBAgoLCACHn2Bcjb9k5oi4cf6HraD3TnZ5w2efm9hex9v4nLqO/+6WB//Yigz73YQD/5BfGccMDg0YAAAAAwEBAAIAAAAAAgIBAAAAAAEdIBcAob5stYa2bP2SunX+ibGm/0qYrv9atc//cMLR/+SoMPzyoxH96ZwU/92OC/zehwf/g1kbshwbFwwAAAAAAAAAAQEBAQAAAAABFxgTAJ6zaL6Qt2//mbh1/Y2xpf9LkqX9W7HM/buxbv77tC3/9a4e//SoF//snxT/65sU/+eaIf+FbjuHNjMkBQQEAgACAgEAAAAAASorIQCvvHG9lbJu/5+0dP2bv7H/UaO//3qUgP/fmiP/56s3//awIf/9sxv+5p8Y/49yN6eAdElYbGA9O2FXOxtHQCsJAgIBAAAAAAEoKR4Asbduvpuwbv+jsHH9qcq7/2CvyP90koL/krmq/7Cwff/2qhr//rUd/eKdGP9PQCFaUEs2CFhPNhRaUTcQY1k8CgICAgAAAAABLS0lALq3db+fq2z/qK5y/a/MvP9nr8H/W6O3/27R9v+quZP/7KAa//auG/3hnBf/X0wmWlxUOwZgVjkOYlg8BEtELgECAgIAAAAAAS4sJQC8s3PAoqdr/6qqcP22zrz/bLHE/2Chr/94z+n/p7KL/+GYIv/rpBv92ZMR/11MKVFhWT8AUkkxBCUhFgACAgEAAgICAAAAAAErKiEAuqxtwKSjav+rpm/9uM68/2+zxf9ho7D/etPv/6asgv/dhw7/3Y4O/eWjKP9/dU1DJyMYAAUEAgMAAAAAAAAAAAICAQAAAAABKykhALunasCmn2n/raJt/bnOvP9xtMX/ZKa1/4LT6P+Vysj/q66E/aC7ov/IvJXINTEnBAAAAAECAQEAAQEBAAAAAAACAgEAAAAAASspIQC7omjBpZll/6ycav26zbz/d7nK/2uzw/+J1ub/kOD1/5Hp//2O4/z/uLWluSIeHwABAQEBAgICAAAAAAAAAAAAAgIBAAAAAAErKCAAuJtiwqmaa/+7rIL9v86+/3vA0P55xdT+j9zr/pji8f+c5fb9k+Dx/7+6pb0uKykAAAAAAQICAgAAAAAAAAAAAAICAQAAAAABKiYdAMSpecTAspD/0r+e/Zq0rf9szuf/iuT5/5Pp/f+b5/j8oeTy+J3R1vfQwqjAQ0JAAQAAAAADAwMAAAAAAAAAAAACAgEAAAAAACgjGgDRuZXGzL6k/dHBqvqUs6r0iby48aC3pu+utJntv7aU7c69l+zUuo7x7da3x0RFRAIAAAAAAwMDAQAAAAAAAAAAAgIBAAAAAAApJBoA59Kz1eLQt//Mt5Tpxa6G2cuthc3IrYm7v6mKpbCfh4uXinlrZ19TTU9MRSkREhEAAAAAAAEBAQAAAAAAAAAAAAEBAQAAAAABFxUSAJWGdWqMgHB8eXJlUGBcVjZCQ0EcKCorCBEUFgAAAwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20.............%0Athis.onclick%20%3De%3D%3E%20%7B%0A%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20openDownloadFolder%28%29%3B%20//%20%u041B%u041A%u041C%20%0A%0A%20%20%20if%20%28%20e.button%20%3D%3D%201%20%29%20gShowPopup%28this%29%3B%20//%20%u0421%u041A%u041C%20%0A%20%20%20%20%20%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%202%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.shiftKey%20%26%26%20%21e.altKey%20%26%26%20%21e.metaKey%20%29%20%7B%20//%20%u041F%u041A%u041C%20%0A%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20setPathToDownloadFolder%28%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%3B%0Athis.oncontextmenu%20%3De%3D%3E%20%7B%20e.button%20%26%26%20%21e.ctrlKey%20%26%26%20e.preventDefault%28%29%20%7D%3B%0A%0A%0A//%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u0433%u0440%u0443%u0437%u043A%u0438%20Firefox%20.............%0Afunction%20openDownloadFolder%28%29%20%7B%0A%20%20%20var%20file%20%3D%20Services.dirsvc.get%28%27ProfD%27%2C%20Ci.nsIFile%29%3B%0A%20%20%20file.initWithPath%28%20getPathToDownloadFolder%28%29%20%29%3B%20%0A%20%20%20file.launch%28%29%3B%0A%7D%3B%0A%0A%0A//%20%u0412%u044B%u0431%u0440%u0430%u0442%u044C%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u0433%u0440%u0443%u0437%u043A%u0438%20%u0438%20%u0437%u0430%u043F%u0438%u0441%u0430%u0442%u044C%20%u043F%u0443%u0442%u044C%20%u0432%20%27about%3Aconfig%27%20.............%0Afunction%20setPathToDownloadFolder%28%29%20%7B%0A%20%20%20var%20fp%20%3D%20window.makeFilePicker%28%29%3B%0A%20%20%20fp.init%28window%2C%20%22%u0412%u044B%u0431%u0435%u0440%u0438%u0442%u0435%20%u043F%u0430%u043F%u043A%u0443%20%u0434%u043B%u044F%20%u0437%u0430%u0433%u0440%u0443%u0437%u043E%u043A%21%22%2C%202%29%3B%0A%20%20%20fp.open%28re%3D%3E%20%7B%20%0A%20%20%20%20%20%20if%20%28%20re%20%21%3D%20fp.returnOK%20%29%20return%3B%0A%20%20%20%20%20%20cbu.setPrefs%28%22browser.download.folderList%22%2C%202%29%3B%0A%20%20%20%20%20%20cbu.setPrefs%28%22browser.download.useDownloadDir%22%2C%20true%29%3B%0A%20%20%20%20%20%20cbu.setPrefs%28%22browser.download.dir%22%2C%20convertFromUnicode%28%22UTF-8%22%2C%20fp.file.path%29%29%3B%0A%20%20%20%7D%29%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u043F%u0443%u0442%u044C%20%u043A%20%u043F%u0430%u043F%u043A%u0435%20%u0437%u0430%u0433%u0440%u0443%u0437%u043A%u0438%20.............%0Afunction%20getPathToDownloadFolder%28%29%20%7B%20%0A%20%20%20try%20%7B%20return%20Services.downloads.userDownloadsDirectory.path%20%7D%20%0A%20%20%20catch%28e%29%20%7B%20return%20Services.downloads.defaultDownloadsDirectory.path%20%7D%3B%20%0A%7D%3B%0A%0A%0A//%20%u041A%u043E%u043D%u0432%u0435%u0440%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20%u044E%u043D%u0438%u043A%u043E%u0434%20..................%0Afunction%20convertFromUnicode%28charset%2C%20str%29%20%7B%0A%20%20%20var%20converter%20%3D%20Cc%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.createInstance%28Ci.nsIScriptableUnicodeConverter%29%3B%0A%20%20%20converter.charset%20%3D%20charset%3B%0A%20%20%20str%20%3D%20converter.ConvertFromUnicode%28str%29%3B%0A%20%20%20return%20str%20+%20converter.Finish%28%29%3B%0A%7D%3B%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20..................%0Athis.onmouseover%20%3D%28%29%3D%3E%20%7B%20%0A%20%20%20this.tooltipText%20%3D%20self.label%20%20+%20%22%3A%20%22%20+%20getPathToDownloadFolder%28%29%20+%20%22%5Cn%u041B%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u0433%u0440%u0443%u0437%u043A%u0438%20%5Cn%u0421%3A%20CB%20%u043C%u0435%u043D%u044E%20%5Cn%u041F%3A%20%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u0433%u0440%u0443%u0437%u043A%u0438%22%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация:

Выделить код

Код:

// Настройка функций кликов мыши для кнопки .............
this.onclick =e=> {
   
   if ( e.button == 0 ) openDownloadFolder(); // ЛКМ 

   if ( e.button == 1 ) gShowPopup(this); // СКМ 
        
   if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { // ПКМ 
        e.preventDefault();
        setPathToDownloadFolder();
        }
};
this.oncontextmenu =e=> { e.button && !e.ctrlKey && e.preventDefault() };


// Открыть папку загрузки Firefox .............
function openDownloadFolder() {
   var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
   file.initWithPath( getPathToDownloadFolder() ); 
   file.launch();
};


// Выбрать папку загрузки и записать путь в 'about:config' .............
function setPathToDownloadFolder() {
   var fp = window.makeFilePicker();
   fp.init(window, "Выберите папку для загрузок!", 2);
   fp.open(re=> { 
      if ( re != fp.returnOK ) return;
      cbu.setPrefs("browser.download.folderList", 2);
      cbu.setPrefs("browser.download.useDownloadDir", true);
      cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", fp.file.path));
   })
};


// Получить путь к папке загрузки .............
function getPathToDownloadFolder() { 
   try { return Services.downloads.userDownloadsDirectory.path } 
   catch(e) { return Services.downloads.defaultDownloadsDirectory.path }; 
};


// Конвертировать текст в юникод ..................
function convertFromUnicode(charset, str) {
   var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
   converter.charset = charset;
   str = converter.ConvertFromUnicode(str);
   return str + converter.Finish();
};


// Подсказка для кнопки ..................
this.onmouseover =()=> { 
   this.tooltipText = self.label  + ": " + getPathToDownloadFolder() + "\nЛ: Открыть папку загрузки \nС: CB меню \nП: Установить папку загрузки";
};

Отсутствует

 

№17016-01-2018 20:43:57

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 52.0

Re: Готовые кнопки для Custom Buttons

Экспорт всех CB кнопок в HTML файл( Firefox, SeaMonkey, PaleMoon ) от 26.05.2019.
кнопка открывает меню, из которого можно экспортировать все установленые Сustom Buttons кнопки в HTML-файл с запросом на место сохранения или без запроса в последнюю папку сохранения, также кнопка даёт возможность открыть в вкладке HTML-файл с кнопками из последней папки сохранения и открыть папку для экспорта кнопок.

Скриншот меню
8b20442b83f14eb95af244d21f8c8fa2.png

ЛКМ => Открыть меню кнопки.

Код кнопки и инициализации:
Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u042D%u043A%u0441%u043F%u043E%u0440%u0442%20%u0432%u0441%u0435%u0445%20CB%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u0432%20HTML%20%u0444%u0430%u0439%u043B%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aapplication/text%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAJEylRHi9ZySAuVModLVTKHS1Uyh0sVModLFTKHCxUyhwsVMocLFTKHCxUyhwsVMocLFTKIS5UyR4vWc8JEymmHi9Zh4Oz6P92rNz7g7Ph/4Oz4f+Ds+H/g7Th/4S04f+EtOH/hbXh/4W14f+GteH/hLTh/3Ws3P2Cs+j/Hi9ZyyEvVIV0q9v/Wp7N+eny9/3v9/r96/P6/ejy+f3l8fn94u/5/eDu+P3d7Pj92uv4/d7s9v1cn877c6rb/yEvVMkfLlSHfLDf/2el0vvx9vv/4u34/9ro9v/W5vb/0OP1/8vg9f/G3fT/wdzz/7vZ9P/a6vn/bKfS/Xuv3/8fLlTKHi1Uh4Gz4v9sqdT78Pb7/+nx+v/h7fj/3uv4/9jo9//T5fb/z+P2/8rh9f/F3vb/2+v5/3Cr1P2Bs+H/Hi1Uyh0tVIeJt+T/c6zW+/H2+//q8vn/4u33/97r9//a6ff/1Ob2/9Dj9v/L4fX/xt71/9zr+P92rtf9h7bj/x0tVMoaK1OHnsPp/4S22/vu9fr/6vH4/+Ht9//e6/b/2uj2/9bm9v/Q5PX/zOH1/8ff9f/c6/j/fLHY/Y665f8dLFPKGitTh6/M7v+Tvt/77/X6//3+/v/0+Pz/8fb9/+zz/P/n8fz/4e76/9zq+f/W6Pr/3uz5/4C12f2Zwen/HS1UyhorU4e50/L/kr3e+93q9f/z9/v/7PT6/+vz+v/o8vn/5/H5/+Xv+f/i7vj/4u76/9rp9f99s9r9ocbs/x4tVMobLFOHv9f0/6zN5vuUv+H/m8Tl/5rD5P+aw+T/msPl/5nD5P+VweP/kb/j/4++4/+Gt97/jLzf/ajK7v8eLVTKHCxUh8HY9P/Q4vL7y93v/8XX6P/E1uf/wtTm/8DT5f++0uT/vNHj/7nP4/+2zOH/v9br/8Pb7/210fH/HCxTyhwsU4bE2fP/1+r7+6Svuf+MjIz/mJqc/5qcnf+eoKH/o6Sm/6WnqP+nqav/pKOj/6Ovuf/O5vn9utPx/xssU8kdLVOGy932/9jq+vqlrbb+oqCe/7S0tf+6ubn/wsLB/9HQ0P+5uLj/hYaF/87Myf+nsbv+z+T3/MTa9f8eLlXMGCpWgr/V8//0///7sLi9/5ybmv+wsLH/tLS0/7y7vP/Kysr/rq6u/3R1df/CwL//s7zD/+z///2wye7/FidStAQNJhFBXJu7fZTB9XuFm/WpqKT/s7O0/7q6uv/CwcL/0dHR/7q6uv+FhYb/1NLP/3+KoPV5k8H0OFCIwQAEEyUAAAEAAwQGCwAAAAA9PT2Gmpqa/5OTk/qZmZn/nZ2d/6Kiov+kpKT/o6Oj+rOzs/8/Pz+GAAAAAAMDBAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bself._handleClick%20%3D%28%29%3D%3E%20menuPopup.openPopup%28this%2C%20%22after_start%22%29%3B%0A%0A%0Avar%20array%20%3D%20%5B%0A%20%20%20%5B%20%22%u042D%u043A%u0441%u043F%u043E%u0440%u0442%20%u0432%u0441%u0435%u0445%20CB%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u0432%20HTML%20%u0444%u0430%u0439%u043B%22%2C%20%22setPathToHtmlFile%28%29%22%2C%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg/o/w4P6P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg/o/zUq6P8OD+j/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg/o/0RC//0cE+X/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQW5/8tMOT/Njfw/0BA+v9JSP//UU///1hT//9aVv3/RUL5/zQy+f8zNPH/JSHa/w4P6P8AAAAAAAAAAAAAAAAAAAAAAAAAABAR5v0UFeL/Hh7v/Soo+P80Mf39PDn+/0I+//05NPn/F5sr/zlO0/08PeL/NDbb/Rwdyv8OD+j/AAAAAAAAAAAAAAAAAAAAAA4P6P8XGOn/Hh7x/yQk9f8rKvX/MjD1/zk0+f85NPn/F5sr/xebK/8lQ6n/Hx/D/w4P6P8AAAAAAAAAAAAAAAAAAAAAAAAAAA4P6P8OD+j/Dg/o/w4P6P8OD+j/Dg/o/w4P6P8OD+j/F5sr/zfyX/0Xmyv/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH3EgP+W8J//m/Sk/6D5qv+k/K7/qPyz/6z8uP9t2H7/QuJf/zz/Xv8f7UX/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQFP8f5D3/KexI/zL3U/87/V3/Qf9k/0T/aP9K/2v/Qf9j/zn5Wf8571X/Kt1J/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAeUGf0Y6Tj/IvNE/Sn6Tv81/lj9Pv9h/0X9Z/1H/mf/Rvpk/0HvXP064VP/MtZL/RrHN/8Xmyv/AAAAAAAAAAAAAAAAAAAAAAmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/zjgUf8x1kj/FMIy/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKL08/zDXSP0NvCz/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHKsv/xS9Lv8Xmyv/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8BB/9/AQf/PwEH/x8BB/8PAQcABwEHAAMBBwAHAQcADwEHAA8BBwAHAQcAAwEHAAcBB/8PAQf/HwEH/z8BB/9/AQf//wEE%3D%22%5D%2C%0A%20%20%20%5B%20%22%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20HTML%20%u0444%u0430%u0439%u043B%22%2C%20%22openHtmlFileInTab%28%29%22%2C%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXmyv/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABebK/8UvS7/HKsv/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/w28LP8w10j9KL08/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXmyv/FMIy/zHWSP844FH/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/AAAAAAAAAAAAAAAAAAAAABebK/8axzf/MtZL/TrhU/9B71z9Rvpk/0f+Z/9F/Wf9Pv9h/zX+WP0p+k7/IvNE/RjpOP8HlBn9AAAAAAAAAAAAAAAAAAAAAAAAAAAXmyv/Kt1J/znvVf85+Vn/Qf9j/0r/a/9E/2j/Qf9k/zv9Xf8y91P/KexI/x/kPf8DkBT/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/x/tRf88/17/QuJf/23Yfv+s/Lj/qPyz/6T8rv+g+ar/m/Sk/5bwn/99xID/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg/o/xebK/838l/9F5sr/w4P6P8OD+j/Dg/o/w4P6P8OD+j/Dg/o/w4P6P8OD+j/AAAAAAAAAAAAAAAAAAAAAAAAAAAOD+j/Hx/D/yVDqf8Xmyv/F5sr/zk0+f85NPn/MjD1/ysq9f8kJPX/Hh7x/xcY6f8OD+j/AAAAAAAAAAAAAAAAAAAAAA4P6P8cHcr/NDbb/Tw94v85TtP9F5sr/zk0+f9CPv/9PDn+/zQx/f0qKPj/Hh7v/RQV4v8QEeb9AAAAAAAAAAAAAAAAAAAAAAAAAAAOD+j/JSHa/zM08f80Mvn/RUL5/1pW/f9YU///UU///0lI//9AQPr/Njfw/y0w5P8UFuf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg/o/xwT5f9EQv/9Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4P6P81Kuj/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOD+j/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8BB/v/AQfz/wEH4/8BB8P/AQeAAwEHAAMBB4ADAQfAAwEHwAMBB4ADAQcAAwEHgAMBB8P/AQfj/wEH8/8BB/v/AQf//wEE%3D%22%5D%2C%20%0A%20%20%20%5B%20%22separator%22%20%5D%2C%0A%20%20%20%5B%20%22%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043F%u0430%u043F%u043A%u0443%20%u0434%u043B%u044F%20%u044D%u043A%u0441%u043F%u043E%u0440%u0442%u0430%20CB%20%u043A%u043D%u043E%u043F%u043E%u043A%22%2C%20%22openHtmlFileFolder%28%29%22%2C%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOC8xMS8wNdiEE10AAAAldEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIE1YIDIwMDSHdqzPAAACiUlEQVR4nKWTy0uUYRTGf+/np6PTODOmMpaGhJRaZmQgRAQtglaBf4BRtGgTFLUqKjBoF1QQlBLdKCgrscuiFEq6gGmQBWWSYLfpMqXMTM71+773PS0kQXBR9MBvdZ7z8HDgKBHhf2T9jUkdUbVKKTXfzH7eqVpdXbDDzWvRmrDngePyMZniXfsxLtLBFuAWhziqlOoQET0n4dlprk5/uysisTncO7Gqt3s/N5eeWCjD8T5ZcWa5nNvFmc6d7AEKRAQRgaHT9Gcyb0XyB+ain8jGC+ul5/15GXTuSN+3bmntapHj2+kFyv6E2K7DSrw0Yw9v8ys6gS9chfbgWvA5K2qXUb2knAfZflaXrWXTqg2MByNt12sG25JTiaRSqsI2wuLU5HdyU19p2TZOga+IfX27CUdqqG8KMeK9IKdchtLP8GpdaivXcN8S1g3cDwERWxvIJmP4K1qwfRmQl5wc6p450B14dLiHCecTzf5mtp7aC0BlqJx1M44iywjk4q/xVzSDxMEkkYNXkIOXKSsOoESwUChgoS+At/8GI5u7JOswDIhlDKR/DBKoXA4mCiYxS124nBLxqKCQoGjqwuV46QSTH0fIOYwCjm0MuOnPFAXrwB2eKWY8yKdoDJbgd35S5eYJmWkaQqWYfCGf3wyQc4gCrm0EvMwXiksXQW4SslnIZ0GEhkAJC3IJIq4mpNM0lgaxiqpJTX1SP38xCni2ESgtsxBjgd0OAYHATJHGmgH8Ja1ECusIWSHqa6rI5MKk4lGejjEKuLbWvJqMmdVDZ5vwPGbRGr5rxeDjahJuCtsUE43FSOaFRJpLIx9IAK4CbKAS8AHzPsw8MkAaiCsRQSll/8PybIiI6N8D8VYf0gJ8eQAAAABJRU5ErkJggg%3D%3D%22%5D%2C%0A%20%20%20%5B%20%22%u042D%u043A%u0441%u043F%u043E%u0440%u0442%20%u0432%u0441%u0435%u0445%20CB%20%u043A%u043D%u043E%u043F%u043E%u043A%20%u0432%20HTML%20%u0444%u0430%u0439%u043B%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%22%2C%20%22exportsButtonsToHtmlFile%28%29%22%2C%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wBPAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wBkAP8ATwD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wB6AP0AUgD/AE8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAP8AZQD/AG4A/wB3AP8AfwD/AIQA/wCHAP8AiAD/AHkA/wBtAP8AbAD/AFgA/wBPAP8AAAAAAAAAAAAAAAAAAAAAAAAAAABQAP0AUgD/AFwA/QBmAP8AbgD9AHQA/wB4AP0AbwD/F5sr/wBzAP0AbgD/AGcA/QBQAP8ATwD/AAAAAAAAAAAAAAAAAAAAAABPAP8AVgD/AF0A/wBiAP8AZwD/AGsA/wBvAP8AbwD/F5sr/xebK/8AXgD/AFAA/wBPAP8AAAAAAAAAAAAAAAAAAAAAAAAAAABPAP8ATwD/AE8A/wBPAP8ATwD/AE8A/wBPAP8ATwD/F5sr/zfyX/0Xmyv/AE8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH3EgP+W8J//m/Sk/6D5qv+k/K7/qPyz/6z8uP9t2H7/QuJf/zz/Xv8f7UX/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQFP8f5D3/KexI/zL3U/87/V3/Qf9k/0T/aP9K/2v/Qf9j/zn5Wf8571X/Kt1J/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAeUGf0Y6Tj/IvNE/Sn6Tv81/lj9Pv9h/0X9Z/1H/mf/Rvpk/0HvXP064VP/MtZL/RrHN/8Xmyv/AAAAAAAAAAAAAAAAAAAAAAmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/zjgUf8x1kj/FMIy/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKL08/zDXSP0NvCz/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHKsv/xS9Lv8Xmyv/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8BB/9/AQf/PwEH/x8BB/8PAQcABwEHAAMBBwAHAQcADwEHAA8BBwAHAQcAAwEHAAcBB/8PAQf/HwEH/z8BB/9/AQf//wEE%3D%22%5D%0A%5D%3B%0Avar%20menuPopup%20%3D%20self.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0Aarray.forEach%28%28m%2Ci%29%3D%3E%20%7B%0A%20%20%20if%20%28%20m%5B0%5D%20%3D%3D%20%22separator%22%20%29%20%7B%20menuPopup.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%20return%20%7D%3B%0A%20%20%20var%20mItem%20%3D%20menuPopup.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0A%20%20%20mItem.setAttribute%28%22label%22%2C%20m%5B0%5D%29%3B%0A%20%20%20mItem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%22%29%3B%0A%20%20%20mItem.setAttribute%28%22image%22%2C%20m%5B2%5D%29%3B%20%0A%20%20%20mItem.addEventListener%28%22command%22%2C%20%28%29%3D%3E%20eval%28m%5B1%5D%29%29%3B%0A%7D%29%3B%0AmenuPopup.setAttribute%28%22onclick%22%2C%20%22event.stopPropagation%28%29%22%29%3B%0A%0A%0Afunction%20openHtmlFileInTab%28%29%20%7B%0A%20%20%20var%20fp%20%3D%20window.makeFilePicker%28%29%3B%0A%20%20%20fp.init%28window%2C%20%22%u0412%u044B%u0431%u0435%u0440%u0438%u0442%u0435%20HTML-%u0444%u0430%u0439%u043B%20%u0434%u043B%u044F%20%u0438%u043C%u043F%u043E%u0440%u0442%u0430%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%22%2C%20fp.modeOpen%29%3B%0A%20%20%20fp.appendFilters%28fp.filterHTML%29%3B%0A%20%20%20Cu.import%28%22resource%3A//gre/modules/FileUtils.jsm%22%29%3B%0A%20%20%20fp.displayDirectory%20%3D%20FileUtils.File%28getPathToHtmlFileFolder%28%29%29%3B%0A%20%20%20fp.open%28re%3D%3E%20%7B%20%0A%20%20%20%20%20%20if%20%28%20re%20%3D%3D%20fp.returnOK%20%29%0A%20%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28fp.file.path%2C%20%7B%20triggeringPrincipal%3A%20Services.scriptSecurityManager.getSystemPrincipal%28%29%2C%7D%29%0A%20%20%20%7D%29%0A%7D%3B%0A%0Afunction%20exportsButtonsToHtmlFile%28%29%20%7B%0A%20%20%20var%20visibleCBbuttons%20%3D%20%5B...document.querySelectorAll%28%27%5Bcb-mode%5D%27%29%5D%3B%0A%20%20%20var%20paletteCBbuttons%20%3D%20%5B...custombuttons.palette.querySelectorAll%28%27%5Bcb-mode%5D%27%29%5D%3B%0A%20%20%20var%20allCBbuttons%20%3D%20visibleCBbuttons.concat%28paletteCBbuttons%29%3B%0A%20%20%20%0A%20%20%20var%20array%20%3D%20%5B%5D%3B%0A%20%20%20allCBbuttons.forEach%28but%3D%3E%20%7B%0A%20%20%20%20%20%20var%20uri%20%3D%20but.URI%20%3F%20but.URI%20%3A%20getPaleteButtonsURI%28but%29%3B%0A%20%20%20%20%20%20var%20name%20%3D%20but.getAttribute%28%22label%22%29%20%7C%7C%20%22%u0411%u0435%u0437%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u044F%22%3B%0A%20%20%20%20%20%20var%20image%20%3D%20but.getAttribute%28%22image%22%29%20%7C%7C%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAACNFBMVEXDRgDweQDnbwC0NgDCRQC7PQDtpTu+QQD78q3PUwDCRAD//8vbYQDLTgDocAD0iQX1jQbGSgD7iAD4gwDVaw7vdwDyegD+igDweQDlawDyhAXveADmZwDzmBbtcwDwkhHveADmhBTkgxbweADkfRH+igD7hADXZQX0gADyjA/tfgvveQDiawDQVADRXgfnbwD1jAb9iQD9z0PVZAbxpinykRHtdgD5mRbERQDDRgDOYArCRAD9iQD3ewDxegD3dwDFRgDAQAD+hgD4fQDucgDtgQftfwTISQDCRQDvdgD5lxb1kRb2qh7wnynkagD766LDRQDDRwDDRQDspjbtpzbuqDbvqzv//8DUZAbCRQD//83pjhvveQbvggW+QQDfcxLlmUb//8veYADMTwDHSADVVwC8PgDwixb78q3oZgDUWADRVADCRQD9iQDERwDBQQDYVQC+PgC0NgDbYQDWWgDUWADSVQDFSAC+QAC7PAC0NgD+wRL+/kD+/zb+7i3+8Cv+/DX+wBL/+DD/rwz+qgz+rwz/tAz+sQzfbAT+3iP/+jD//Dz1jwP+nwf5iwf7pBz2tRr4lwb/ogfsdQT+2R7/9ET+2iT8yyLmgBL5iQL2egLokhP7zzT60zv1zUr0gAL1ewP50yn9+UL++EXooyngaAH41EPzowzyySj+xxzlhhHvvyruwjXxvTnUag3+zxrwigP+swz86U/ZXwD75lHqegD6xzb//kn+uhPTXAG3OAD/+UC2vFeJAAAAe3RSTlMAAAAAAAAAAAAAAAAAAAAAAAAAAACfnwAIaelpAAA2+wD7UQAAa3oArKzRzMysnwgAvPQA/gAAw3prw0oALr16vS4AACnF6bspAAAA/mIAADQAAAAAAI8AAEwA0vv7kd2yAuuvr+vKABL23U+8Sk/d9vUDIIAQAAAQgCAfvupHAAABB0lEQVR4Xi3IU3fDABgA0C+u26FdZ9u2bdu2vZSzbds2/tyac3IfLxjpGyA6MimqY6gHTNgiiNwkwRM1E7EhTrYyTfMzzsh0ZEPiH+D6+u5mV1jEhpe5haVCYW1T4suEvUOkk7PLpVJ5WFnl7hEUDN5LPvsHJ6cazdn13f3DYxu0B35+/Y2qVSr17NzGeUgohIVHLK/PMDa39qKieRATGxd/9cS4uU1MwnmQktqY/qGlaVr7/ZOVDTmQm5df8PwyNj4xOTVdjOM4kCRZOr+wWFa+srpWQVEU8PnV2zu7NbV19UfHDQRBAIfTdNHc0soVdnR2dfdgGAgEvW99/QNc4eDQ8O8Ihv0D77NPgbVLZ6kAAAAASUVORK5CYII%3D%22%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20array.push%28%22%3Cimg%20src%3D%22%20+%20image%20+%20%22%3E%26nbsp%3Ca%20href%3D%22%20+%20uri%20+%20%22%3E%22%20+%20name%20+%22%3C/a%3E%3Cbr%3E%5Cn%22%29%3B%0A%20%20%20%7D%29%3B%0A%20%20%20%0A%20%20%20var%20before%20%3D%20%22%3Chtml%3E%5Cn%3Chead%3E%5Cn%3Cmeta%20http-equiv%3D%27Content-Type%27%20content%3D%27text/html%3B%20charset%3Dutf-8%27%3E%5Cn%3C/head%3E%5Cn%3Cbody%3E%5Cn%22%3B%0A%20%20%20var%20after%20%3D%20%22%5Cn%3C/body%3E%5Cn%3C/html%3E%22%3B%0A%20%20%20var%20text%20%3D%20before%20+%20array.join%28%22%22%29%20+%20after%3B%0A%20%20%20var%20text%20%3D%20convertFromUnicode%28%22UTF-8%22%2C%20text%29%3B%20%0A%20%20%20%0A%20%20%20var%20date%20%3D%20new%20Date%28%29%3B%0A%20%20%20var%20time%20%3D%20date.toLocaleString%28%27ru%27%2C%20%7Byear%3A%20%27numeric%27%2C%20month%3A%20%27numeric%27%2C%20day%3A%20%27numeric%27%7D%29%0A%20%20%20var%20time%20%3D%20time%20+%20%27.%20%27%20+%20date.toLocaleTimeString%28%29.replace%28/%3A/g%2C%20%22%u02F8%22%29%3B%0A%0A%20%20%20var%20file%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.createInstance%28Ci.nsIFile%29%3B%0A%20%20%20file.initWithPath%28getPathToHtmlFileFolder%28%29%29%3B%0A%20%20%20file.append%28%22CB%20buttons%20%22%20+%20time%20+%20%22.html%22%29%3B%0A%20%20%20custombuttonsUtils.writeFile%28file.path%2C%20text%29%3B%0A%0A%20%20%20var%20alertsService%20%3D%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%0A%20%20%20alertsService.showAlertNotification%28self.image%2C%20self.label%2C%20%22%u042D%u043A%u0441%u043F%u043E%u0440%u0442%u0438%u0440%u043E%u0432%u0430%u043B%20%u0432%u0441%u0435%20CB%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043A%u0430%u043A%20HTML%20%u0432%20%22%20+%20file.path%29%3B%0A%20%20%20setTimeout%28%28%29%3D%3E%20alertsService.closeAlert%28%29%2C%204000%29%3B%0A%7D%3B%0A%0A%0Afunction%20getPaleteButtonsURI%28but%29%20%7B%0A%20%20%20var%20doc%20%3D%20document.implementation.createDocument%28%22%22%2C%20%22%22%2C%20null%29%3B%0A%20%20%20doc.async%20%3D%20false%3B%0A%20%20%20doc.load%28%22chrome%3A//custombuttons/content/nbftemplate.xml%22%29%3B%0A%0A%20%20%20%5B%22help%2CHelp%22%2C%20%22name%2Clabel%22%2C%20%22image%2Cimage%22%2C%20%22mode%2Ccb-mode%22%2C%20%22initcode%2Ccb-init%22%2C%20%22accelkey%2Ccb-accelkey%22%2C%20%22code%2Ccb-oncommand%22%5D%0A%20%20%20.forEach%28str%3D%3E%20%7B%0A%20%20%20%20%20%20var%20arr%20%3D%20str.split%28%27%2C%27%29%3B%0A%20%20%20%20%20%20var%20value%20%3D%20but.getAttribute%28arr%5B1%5D%29%2C%20name%20%3D%20arr%5B0%5D%3B%0A%20%20%20%20%20%20custombutton.buttonSetText%28doc%2C%20name%2C%20value%2C%20true%29%3B%0A%20%20%20%7D%29%3B%0A%0A%20%20%20var%20ser%20%3D%20new%20XMLSerializer%28%29%3B%0A%20%20%20return%20%22custombutton%3A//%22%20+%20escape%28ser.serializeToString%28doc%29%29%3B%0A%7D%3B%0A%0A%0Afunction%20openHtmlFileFolder%28%29%20%7B%0A%20%20%20var%20folder%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.createInstance%28Ci.nsIFile%29%3B%0A%20%20%20folder.initWithPath%28%20getPathToHtmlFileFolder%28%29%20%29%3B%0A%20%20%20folder.launch%28%29%3B%0A%7D%3B%0A%0A%0Afunction%20setPathToHtmlFile%28%29%20%7B%20%20%20%20%20%0A%20%20%20var%20fp%20%3D%20window.makeFilePicker%28%29%3B%0A%20%20%20fp.init%28window%2C%20%22%u0423%u043A%u0430%u0436%u0438%u0442%u0435%20%u043F%u0430%u043F%u043A%u0443%20%u0434%u043B%u044F%20%u044D%u043A%u0441%u043F%u043E%u0440%u0442%u0430%20CB%20%u043A%u043D%u043E%u043F%u043E%u043A%21%22%2C%20fp.modeGetFolder%29%3B%0A%20%20%20fp.open%28re%3D%3E%20%7B%20%0A%20%20%20%20%20%20if%20%28%20re%20%21%3D%20fp.returnOK%20%29%20return%3B%0A%20%20%20%20%20%20cbu.setPrefs%28%22CB.exportsButtonsToHtmlFile.path%22%2C%20convertFromUnicode%28%22UTF-8%22%2C%20fp.file.path%29%29%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20exportsButtonsToHtmlFile%28%29%3B%0A%20%20%20%7D%29%0A%7D%3B%0A%0A%0Afunction%20getPathToHtmlFileFolder%28%29%20%7B%0A%20%20%20var%20s%20%3D%20%22CB.exportsButtonsToHtmlFile.path%22%2C%20pref%20%3D%20Services.prefs%3B%0A%20%20%20var%20str%20%3D%20pref.getStringPref%20%3F%20pref.getStringPref%28s%29%20%3A%20pref.getComplexValue%28s%2C%20Ci.nsISupportsString%29.data%3B%0A%20%20%20try%20%7B%20return%20str%20%7D%20%0A%20%20%20catch%28e%29%20%7B%20return%20%22C%3A%22%20%7D%3B%0A%7D%3B%0A%0A%0Afunction%20convertFromUnicode%28charset%2C%20str%29%20%7B%0A%20%20%20var%20converter%20%3D%20Cc%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.createInstance%28Ci.nsIScriptableUnicodeConverter%29%3B%0A%20%20%20converter.charset%20%3D%20charset%3B%0A%20%20%20str%20%3D%20converter.ConvertFromUnicode%28str%29%3B%0A%20%20%20return%20str%20+%20converter.Finish%28%29%3B%0A%7D%3B%0A%0A%0Athis.onmouseover%20%3D%28%29%3D%3E%20%7B%20%0A%20%20%20this.tooltipText%20%3D%20self.label%20+%20%22%5Cn%u041B%3A%20%u041C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%5Cn%u041F%3A%20CB%20%u043C%u0435%u043D%u044E%5Cn%5Cn%u041F%u0430%u043F%u043A%u0430%20%u0434%u043B%u044F%20%u044D%u043A%u0441%u043F%u043E%u0440%u0442%u0430%3A%5Cn%22%20+%20getPathToHtmlFileFolder%28%29%3B%0A%7D%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Инициализация:

Выделить код

Код:

self._handleClick =()=> menuPopup.openPopup(this, "after_start");


var array = [
   [ "Экспорт всех CB кнопок в HTML файл", "setPathToHtmlFile()", "data:image/x-icon;base64,AAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg/o/w4P6P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg/o/zUq6P8OD+j/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg/o/0RC//0cE+X/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQW5/8tMOT/Njfw/0BA+v9JSP//UU///1hT//9aVv3/RUL5/zQy+f8zNPH/JSHa/w4P6P8AAAAAAAAAAAAAAAAAAAAAAAAAABAR5v0UFeL/Hh7v/Soo+P80Mf39PDn+/0I+//05NPn/F5sr/zlO0/08PeL/NDbb/Rwdyv8OD+j/AAAAAAAAAAAAAAAAAAAAAA4P6P8XGOn/Hh7x/yQk9f8rKvX/MjD1/zk0+f85NPn/F5sr/xebK/8lQ6n/Hx/D/w4P6P8AAAAAAAAAAAAAAAAAAAAAAAAAAA4P6P8OD+j/Dg/o/w4P6P8OD+j/Dg/o/w4P6P8OD+j/F5sr/zfyX/0Xmyv/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH3EgP+W8J//m/Sk/6D5qv+k/K7/qPyz/6z8uP9t2H7/QuJf/zz/Xv8f7UX/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQFP8f5D3/KexI/zL3U/87/V3/Qf9k/0T/aP9K/2v/Qf9j/zn5Wf8571X/Kt1J/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAeUGf0Y6Tj/IvNE/Sn6Tv81/lj9Pv9h/0X9Z/1H/mf/Rvpk/0HvXP064VP/MtZL/RrHN/8Xmyv/AAAAAAAAAAAAAAAAAAAAAAmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/zjgUf8x1kj/FMIy/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKL08/zDXSP0NvCz/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHKsv/xS9Lv8Xmyv/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8BB/9/AQf/PwEH/x8BB/8PAQcABwEHAAMBBwAHAQcADwEHAA8BBwAHAQcAAwEHAAcBB/8PAQf/HwEH/z8BB/9/AQf//wEE="],
   [ "Открыть в вкладке HTML файл", "openHtmlFileInTab()", "data:image/x-icon;base64,AAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXmyv/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABebK/8UvS7/HKsv/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/w28LP8w10j9KL08/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXmyv/FMIy/zHWSP844FH/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/AAAAAAAAAAAAAAAAAAAAABebK/8axzf/MtZL/TrhU/9B71z9Rvpk/0f+Z/9F/Wf9Pv9h/zX+WP0p+k7/IvNE/RjpOP8HlBn9AAAAAAAAAAAAAAAAAAAAAAAAAAAXmyv/Kt1J/znvVf85+Vn/Qf9j/0r/a/9E/2j/Qf9k/zv9Xf8y91P/KexI/x/kPf8DkBT/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/x/tRf88/17/QuJf/23Yfv+s/Lj/qPyz/6T8rv+g+ar/m/Sk/5bwn/99xID/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg/o/xebK/838l/9F5sr/w4P6P8OD+j/Dg/o/w4P6P8OD+j/Dg/o/w4P6P8OD+j/AAAAAAAAAAAAAAAAAAAAAAAAAAAOD+j/Hx/D/yVDqf8Xmyv/F5sr/zk0+f85NPn/MjD1/ysq9f8kJPX/Hh7x/xcY6f8OD+j/AAAAAAAAAAAAAAAAAAAAAA4P6P8cHcr/NDbb/Tw94v85TtP9F5sr/zk0+f9CPv/9PDn+/zQx/f0qKPj/Hh7v/RQV4v8QEeb9AAAAAAAAAAAAAAAAAAAAAAAAAAAOD+j/JSHa/zM08f80Mvn/RUL5/1pW/f9YU///UU///0lI//9AQPr/Njfw/y0w5P8UFuf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg/o/xwT5f9EQv/9Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4P6P81Kuj/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOD+j/Dg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg/o/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8BB/v/AQfz/wEH4/8BB8P/AQeAAwEHAAMBB4ADAQfAAwEHwAMBB4ADAQcAAwEHgAMBB8P/AQfj/wEH8/8BB/v/AQf//wEE="], 
   [ "separator" ],
   [ "Открыть папку для экспорта CB кнопок", "openHtmlFileFolder()", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOC8xMS8wNdiEE10AAAAldEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIE1YIDIwMDSHdqzPAAACiUlEQVR4nKWTy0uUYRTGf+/np6PTODOmMpaGhJRaZmQgRAQtglaBf4BRtGgTFLUqKjBoF1QQlBLdKCgrscuiFEq6gGmQBWWSYLfpMqXMTM71+773PS0kQXBR9MBvdZ7z8HDgKBHhf2T9jUkdUbVKKTXfzH7eqVpdXbDDzWvRmrDngePyMZniXfsxLtLBFuAWhziqlOoQET0n4dlprk5/uysisTncO7Gqt3s/N5eeWCjD8T5ZcWa5nNvFmc6d7AEKRAQRgaHT9Gcyb0XyB+ain8jGC+ul5/15GXTuSN+3bmntapHj2+kFyv6E2K7DSrw0Yw9v8ys6gS9chfbgWvA5K2qXUb2knAfZflaXrWXTqg2MByNt12sG25JTiaRSqsI2wuLU5HdyU19p2TZOga+IfX27CUdqqG8KMeK9IKdchtLP8GpdaivXcN8S1g3cDwERWxvIJmP4K1qwfRmQl5wc6p450B14dLiHCecTzf5mtp7aC0BlqJx1M44iywjk4q/xVzSDxMEkkYNXkIOXKSsOoESwUChgoS+At/8GI5u7JOswDIhlDKR/DBKoXA4mCiYxS124nBLxqKCQoGjqwuV46QSTH0fIOYwCjm0MuOnPFAXrwB2eKWY8yKdoDJbgd35S5eYJmWkaQqWYfCGf3wyQc4gCrm0EvMwXiksXQW4SslnIZ0GEhkAJC3IJIq4mpNM0lgaxiqpJTX1SP38xCni2ESgtsxBjgd0OAYHATJHGmgH8Ja1ECusIWSHqa6rI5MKk4lGejjEKuLbWvJqMmdVDZ5vwPGbRGr5rxeDjahJuCtsUE43FSOaFRJpLIx9IAK4CbKAS8AHzPsw8MkAaiCsRQSll/8PybIiI6N8D8VYf0gJ8eQAAAABJRU5ErkJggg=="],
   [ "Экспорт всех CB кнопок в HTML файл без запроса", "exportsButtonsToHtmlFile()", "data:image/x-icon;base64,AAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wBPAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wBkAP8ATwD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8A/wB6AP0AUgD/AE8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAP8AZQD/AG4A/wB3AP8AfwD/AIQA/wCHAP8AiAD/AHkA/wBtAP8AbAD/AFgA/wBPAP8AAAAAAAAAAAAAAAAAAAAAAAAAAABQAP0AUgD/AFwA/QBmAP8AbgD9AHQA/wB4AP0AbwD/F5sr/wBzAP0AbgD/AGcA/QBQAP8ATwD/AAAAAAAAAAAAAAAAAAAAAABPAP8AVgD/AF0A/wBiAP8AZwD/AGsA/wBvAP8AbwD/F5sr/xebK/8AXgD/AFAA/wBPAP8AAAAAAAAAAAAAAAAAAAAAAAAAAABPAP8ATwD/AE8A/wBPAP8ATwD/AE8A/wBPAP8ATwD/F5sr/zfyX/0Xmyv/AE8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH3EgP+W8J//m/Sk/6D5qv+k/K7/qPyz/6z8uP9t2H7/QuJf/zz/Xv8f7UX/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQFP8f5D3/KexI/zL3U/87/V3/Qf9k/0T/aP9K/2v/Qf9j/zn5Wf8571X/Kt1J/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAeUGf0Y6Tj/IvNE/Sn6Tv81/lj9Pv9h/0X9Z/1H/mf/Rvpk/0HvXP064VP/MtZL/RrHN/8Xmyv/AAAAAAAAAAAAAAAAAAAAAAmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/wmYHP8JmBz/CZgc/zjgUf8x1kj/FMIy/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKL08/zDXSP0NvCz/F5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHKsv/xS9Lv8Xmyv/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/xebK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5sr/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8BB/9/AQf/PwEH/x8BB/8PAQcABwEHAAMBBwAHAQcADwEHAA8BBwAHAQcAAwEHAAcBB/8PAQf/HwEH/z8BB/9/AQf//wEE="]
];
var menuPopup = self.appendChild(document.createElement("menupopup"));
array.forEach((m,i)=> {
   if ( m[0] == "separator" ) { menuPopup.appendChild(document.createElement("menuseparator")); return };
   var mItem = menuPopup.appendChild(document.createElement("menuitem"));
   mItem.setAttribute("label", m[0]);
   mItem.setAttribute("class", "menuitem-iconic");
   mItem.setAttribute("image", m[2]); 
   mItem.addEventListener("command", ()=> eval(m[1]));
});
menuPopup.setAttribute("onclick", "event.stopPropagation()");


function openHtmlFileInTab() {
   var fp = window.makeFilePicker();
   fp.init(window, "Выберите HTML-файл для импорта закладок", fp.modeOpen);
   fp.appendFilters(fp.filterHTML);
   Cu.import("resource://gre/modules/FileUtils.jsm");
   fp.displayDirectory = FileUtils.File(getPathToHtmlFileFolder());
   fp.open(re=> { 
      if ( re == fp.returnOK )
           gBrowser.selectedTab = gBrowser.addTab(fp.file.path, { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),})
   })
};

function exportsButtonsToHtmlFile() {
   var visibleCBbuttons = [...document.querySelectorAll('[cb-mode]')];
   var paletteCBbuttons = [...custombuttons.palette.querySelectorAll('[cb-mode]')];
   var allCBbuttons = visibleCBbuttons.concat(paletteCBbuttons);
   
   var array = [];
   allCBbuttons.forEach(but=> {
      var uri = but.URI ? but.URI : getPaleteButtonsURI(but);
      var name = but.getAttribute("label") || "Без названия";
      var image = but.getAttribute("image") || "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAACNFBMVEXDRgDweQDnbwC0NgDCRQC7PQDtpTu+QQD78q3PUwDCRAD//8vbYQDLTgDocAD0iQX1jQbGSgD7iAD4gwDVaw7vdwDyegD+igDweQDlawDyhAXveADmZwDzmBbtcwDwkhHveADmhBTkgxbweADkfRH+igD7hADXZQX0gADyjA/tfgvveQDiawDQVADRXgfnbwD1jAb9iQD9z0PVZAbxpinykRHtdgD5mRbERQDDRgDOYArCRAD9iQD3ewDxegD3dwDFRgDAQAD+hgD4fQDucgDtgQftfwTISQDCRQDvdgD5lxb1kRb2qh7wnynkagD766LDRQDDRwDDRQDspjbtpzbuqDbvqzv//8DUZAbCRQD//83pjhvveQbvggW+QQDfcxLlmUb//8veYADMTwDHSADVVwC8PgDwixb78q3oZgDUWADRVADCRQD9iQDERwDBQQDYVQC+PgC0NgDbYQDWWgDUWADSVQDFSAC+QAC7PAC0NgD+wRL+/kD+/zb+7i3+8Cv+/DX+wBL/+DD/rwz+qgz+rwz/tAz+sQzfbAT+3iP/+jD//Dz1jwP+nwf5iwf7pBz2tRr4lwb/ogfsdQT+2R7/9ET+2iT8yyLmgBL5iQL2egLokhP7zzT60zv1zUr0gAL1ewP50yn9+UL++EXooyngaAH41EPzowzyySj+xxzlhhHvvyruwjXxvTnUag3+zxrwigP+swz86U/ZXwD75lHqegD6xzb//kn+uhPTXAG3OAD/+UC2vFeJAAAAe3RSTlMAAAAAAAAAAAAAAAAAAAAAAAAAAACfnwAIaelpAAA2+wD7UQAAa3oArKzRzMysnwgAvPQA/gAAw3prw0oALr16vS4AACnF6bspAAAA/mIAADQAAAAAAI8AAEwA0vv7kd2yAuuvr+vKABL23U+8Sk/d9vUDIIAQAAAQgCAfvupHAAABB0lEQVR4Xi3IU3fDABgA0C+u26FdZ9u2bdu2vZSzbds2/tyac3IfLxjpGyA6MimqY6gHTNgiiNwkwRM1E7EhTrYyTfMzzsh0ZEPiH+D6+u5mV1jEhpe5haVCYW1T4suEvUOkk7PLpVJ5WFnl7hEUDN5LPvsHJ6cazdn13f3DYxu0B35+/Y2qVSr17NzGeUgohIVHLK/PMDa39qKieRATGxd/9cS4uU1MwnmQktqY/qGlaVr7/ZOVDTmQm5df8PwyNj4xOTVdjOM4kCRZOr+wWFa+srpWQVEU8PnV2zu7NbV19UfHDQRBAIfTdNHc0soVdnR2dfdgGAgEvW99/QNc4eDQ8O8Ihv0D77NPgbVLZ6kAAAAASUVORK5CYII=";
      
      array.push("<img src=" + image + ">&nbsp<a href=" + uri + ">" + name +"</a><br>\n");
   });
   
   var before = "<html>\n<head>\n<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>\n</head>\n<body>\n";
   var after = "\n</body>\n</html>";
   var text = before + array.join("") + after;
   var text = convertFromUnicode("UTF-8", text); 
   
   var date = new Date();
   var time = date.toLocaleString('ru', {year: 'numeric', month: 'numeric', day: 'numeric'})
   var time = time + '. ' + date.toLocaleTimeString().replace(/:/g, "˸");

   var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
   file.initWithPath(getPathToHtmlFileFolder());
   file.append("CB buttons " + time + ".html");
   custombuttonsUtils.writeFile(file.path, text);

   var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
   alertsService.showAlertNotification(self.image, self.label, "Экспортировал все CB кнопки как HTML в " + file.path);
   setTimeout(()=> alertsService.closeAlert(), 4000);
};


function getPaleteButtonsURI(but) {
   var doc = document.implementation.createDocument("", "", null);
   doc.async = false;
   doc.load("chrome://custombuttons/content/nbftemplate.xml");

   ["help,Help", "name,label", "image,image", "mode,cb-mode", "initcode,cb-init", "accelkey,cb-accelkey", "code,cb-oncommand"]
   .forEach(str=> {
      var arr = str.split(',');
      var value = but.getAttribute(arr[1]), name = arr[0];
      custombutton.buttonSetText(doc, name, value, true);
   });

   var ser = new XMLSerializer();
   return "custombutton://" + escape(ser.serializeToString(doc));
};


function openHtmlFileFolder() {
   var folder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
   folder.initWithPath( getPathToHtmlFileFolder() );
   folder.launch();
};


function setPathToHtmlFile() {     
   var fp = window.makeFilePicker();
   fp.init(window, "Укажите папку для экспорта CB кнопок!", fp.modeGetFolder);
   fp.open(re=> { 
      if ( re != fp.returnOK ) return;
      cbu.setPrefs("CB.exportsButtonsToHtmlFile.path", convertFromUnicode("UTF-8", fp.file.path));
      
      exportsButtonsToHtmlFile();
   })
};


function getPathToHtmlFileFolder() {
   var s = "CB.exportsButtonsToHtmlFile.path", pref = Services.prefs;
   var str = pref.getStringPref ? pref.getStringPref(s) : pref.getComplexValue(s, Ci.nsISupportsString).data;
   try { return str } 
   catch(e) { return "C:" };
};


function convertFromUnicode(charset, str) {
   var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
   converter.charset = charset;
   str = converter.ConvertFromUnicode(str);
   return str + converter.Finish();
};


this.onmouseover =()=> { 
   this.tooltipText = self.label + "\nЛ: Меню кнопки\nП: CB меню\n\nПапка для экспорта:\n" + getPathToHtmlFileFolder();
};

Отсутствует

 

№17125-01-2018 18:27:12

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: Firefox 52.0

Re: Готовые кнопки для Custom Buttons

Закрывать боковую панель кликом на пустом месте странице (PaleMoon 27 и FF52 esr проверялось)
по клику на пустом месте страницы(клик на ссылке игнорируется) или нажатием ESC (не делает stop если страница загружается), в код можно добавить список адресов где не нужно по клику закрывать панель, переменная arr. Сейчас там два исключения: не закрывать в ScrapBook и на страницах с адресами, которые начинаются на data:. Не обязательно создавать новую CB кнопку, можно использовать уже существующую и положить код в любую Custom Buttons кнопку, в инициализацию.

Код инициализации:

Выделить код

Код:

/*Initialization Code*/
// ---------12--------------------------- (auto-hide SideBar) ---------------------------------------------------------------

(function() { this.clickPageSB = function(event) { gBrowser.addEventListener('mousedown',on, false);   };

    function go() {
           clickPageSB(event);
           let selection = getBrowserSelection();
           const sidebarbox = window.document.getElementById("sidebar-box").hidden;
             if ( !sidebarbox && !selection && getLoc() ) toggleSidebar();
           }

    function on(e) {
      if ( e.button != 0 || e.target.tagName.toLowerCase() === 'a') return;
       gBrowser.removeEventListener('mousedown',on, false);
       timeoutId = setTimeout(go, 500)   
       }

    function off() {   clickPageSB(event);     clearTimeout(timeoutId)   }
      sidebar.addEventListener('click',off, false);
       clickPageSB(event);

// текущий адресс.
//  Исключения в массиве arr - если адресс совпадает, начинается с ... то выход. иначе возврат текущего урл.
 function getLoc() {
     let loc = content.location.href;
     let arr = ["chrome://scrapbook/","data:"];
    for (var i = 0; i < arr.length; i++) {
      if ( loc.startsWith(arr[i]) == 1 ) return;
      }
    return loc;
   };
       

// ------------ Закрывать по ESC бок. панель ------------
 document.addEventListener('keypress', function (e){
       const sidebarbox = window.document.getElementById("sidebar-box").hidden;
          // Shift=16, T=84, ESC == 27
          switch(e.keyCode) {
             case 27:
               if( gBrowser.webProgress.isLoadingDocument && !sidebarbox ) { e.preventDefault();  toggleSidebar(); }
                 else if ( !sidebarbox )  toggleSidebar();
             }
       }, false);
 })();


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]