1 Устанавливаем расширение Custom Buttons.
2 Выделяем всё что есть в секции Kод кнопки.
3 Копируем в адресную строку и жмём перейти.
4 Откроется окно диалога добавления кнопки.
5 Добавив кнопку жмём правой кнопкой мыши по свободному месту на панели и выбираем настроить.
6 Перетаскиваем кнопку в нужное место на панели.
этот способ устанавливает кнопку с иконкой.
второй способ:
ПКМ на любой панели и в открывшемся меню нажимаем пункт Добавить новую кнопку, откроется окно редактирования новой кнопки куда копируем коды из секций Код и Инициализация. Потом в окне редактирования кнопки нажимаем Ok, открываем настройку панелей инструментов (Customize) и вытаскиваем новую кнопку на нужную панель. иконку кнопки в этом случае придётся нарисовать самим или выбрать готовую(картинка 16х16 пикселей подойдёт к большинству тем), не забывайте конвертировать её в base64 иначе при перемещении файла иконки изображение с кнопки пропадёт.
[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] + ссылка на страницу кнопки если такая есть.
Отредактировано bunda1 (27-12-2013 14:29:59)
Отсутствует
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=
Отредактировано turbot (02-09-2016 01:09:18)
Отсутствует
Поиск выделенного текста в файловом поисковике( 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(); };
Отсутствует
Часы( 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; }
Отсутствует
Переключить текущий поисковик( 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"));
Отсутствует
Сумматор ( 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) );
Отредактировано Inko7 (14-11-2016 21:54:50)
Отсутствует
Добавить все открытие вкладки в папку закладок( 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; };
Отсутствует
Переключить многопроцессный режим( 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));
Отсутствует
Открытие панели закладок в новом табе( Firefox ) от 31.12.2016.
getBrowser (). selectedTab = getBrowser (). addTab ("chrome://browser/content/bookmarks/bookmarksPanel.xul");
Если вместо адреса в круглых скобках вставить выражение "about:addons", получится кнопка, открывающая в новом табе окно управления расширениями.
Отредактировано shadow_user (01-01-2017 17:37:14)
Отсутствует
Панель закладок в контекстном меню
(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); })();
(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)
Три студента и лопата заменяют экскаватор
Отсутствует
Быстрый доступ к менеджеру паролей.( 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)
Отсутствует
Функция для открытия программы с системными переменными в пути.( 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();
Отсутствует
Удалить куки текущего сайта( 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 Меню";
Отсутствует
Запуск портативной программы из портативного 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)); };
Отсутствует
Кодировать изображение или текстовой файл в 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"); });
Отсутствует
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 Меню";
Отсутствует
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 + "> <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 + "> <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 };
P.S. Об ошибках, хотя все устранил, пожелания и вопросах — пишите в ЛС, я отвечу. Есть ошибка, если кнопки не было , т.е. отсутствует переменная в about:config - Export.Import.CB.type.HTML -
Отредактировано Indomito (05-06-2017 07:29:20)
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
Экспорт/импорт закладок в HTML-файл( Firefox52+ ) от 27.05.2019.
кнопка открывает меню, из которого можно экспортировать закладки в HTML-файл с запросом на место сохранения или без запроса в последнюю папку сохранения, также кнопка даёт возможность импортировать закладки из HTML-файла и открыть папку для экспорта закладок.
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; };
Отсутствует
Папка загрузки( Firefox24+ ) от 28.11.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%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П: Установить папку загрузки"; };
Отсутствует
Экспорт всех CB кнопок в HTML файл( Firefox, SeaMonkey, PaleMoon ) от 26.05.2019.
кнопка открывает меню, из которого можно экспортировать все установленые Сustom Buttons кнопки в HTML-файл с запросом на место сохранения или без запроса в последнюю папку сохранения, также кнопка даёт возможность открыть в вкладке HTML-файл с кнопками из последней папки сохранения и открыть папку для экспорта кнопок.
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 + "> <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(); };
Отсутствует
Закрывать боковую панель кликом на пустом месте странице (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
Отсутствует