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

Mozilla Россия — свежие версии программ Mozilla, а также масса полезной информации по каждому продукту.

№122-11-2009 13:29:00

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

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

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




Как добавить кнопку(помощь для новичка)
gif
http://ipic.su/img/img7/tn/1.1449045699.gif

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]
тут код из вкладки Код(если он есть)

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

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


Важно!
На Firefox51 и выше последняя версия Custom Buttons :: Add-ons for Firefox не работает, но можно сделать это Как отключить проверку цифровых подписей в дополнениях Firefox и установить исправлений custombuttons@xsms.org.xpi / Облако Mail.Ru
Или можно удалить или отключить установленый Custom Buttons и установить от сюда подписаную версию Custom Buttons: Custom Buttons • View topic - [Signed fixed extension attached] CB broken on Firefox 48+

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

На форуме

 

№15223-07-2016 16:17:47

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

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

Раскукоживатель коротких ссылок(Firefox 24+), от 28.08.2016.
Добавляет пункт контекстного меню ссылок и текстовых ссылок, сокращенных с помощью сервисов сокращения ссылок, позволяющий получить полный адрес без перехода по ним.
ЛКМ по самой кнопке - "раскукожит" ссылку из буфера обмена.

(Прим.: Выполняется фоновый асинхронный xmlhttprequest к сервису коротких ссылок. Без передачи кукисов, реферера и реального юзерагента)

Возможности:
Добавлять свои сервисы сокращения ссылок
Заменять адрес короткой ссылки на странице "раскукоженной"
Показывать всплывающие уведомления с открытием "раскукоженной" ссылки в новой вкладке по клику
Показывать пункт контекстного меню на выделенных текстовых ссылках
Показывать диалоговое окно с результатом для текстовых ссылок
Копировать "раскукоженную" ссылку в буфер обмена
Индикация цветом ссылки ожидания ответа и результата
Возвращать цвет ссылок к исходному, после паузы
Задать цвет для "раскукоженных" ссылок

Все вышеописанные поведения можно задать с помощью опций (см. комментарии в коде)

Изменения (28.08.2016):

28.08.2016
Незначительные оптимизации

26.07.2016
Исправлена и переделана проверка текстовых ссылок

Код кнопки, вкладки инициализации и иконки в svg и png 16х16 (замените svg-шную, если есть проблемы):


Код кнопки:

Выделить код

Код:

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%u0420%u0430%u0441%u043A%u0443%u043A%u043E%u0436%u0438%u0432%u0430%u0442%u0435%u043B%u044C%20%u043A%u043E%u0440%u043E%u0442%u043A%u0438%u0445%20%u0441%u0441%u044B%u043B%u043E%u043A%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/svg+xml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MjUuNDY2cHgiIGhlaWdodD0iNDI1LjQ2N3B4IiB2aWV3Qm94PSIwIDAgNDI1LjQ2NiA0MjUuNDY3Ij4KPGcgaWQ9Imc3IiBzdHlsZT0iZmlsbDojNzk3YzgwO2ZpbGwtb3BhY2l0eToxIj4KPHBhdGggZD0iTTMxOC4xNSwyMzAuMTk1bDc3LjkzNC03Ny45MzdjMzEuODk0LTMxLjg5MiwzMS44OTQtODMuNzgyLTAuMDA0LTExNS42NzRsLTEyLjY2LTEyLjY2ICAgICBjLTMxLjg5My0zMS44OTYtODMuNzgtMzEuODk2LTExNS42NzQtMC4wMDRsLTc3LjkzNyw3Ny45MzRjLTE3LjU4OCwxNy41ODgtMjUuNDU3LDQxLjI2NC0yMy42NDYsNjQuMzExICAgICBjLTIzLjA0NS0xLjgxMy00Ni43MjIsNi4wNTYtNjQuMzA4LDIzLjY0N0wyMy45MiwyNjcuNzQ4Yy0zMS44OTQsMzEuODg5LTMxLjg5NCw4My43NzksMCwxMTUuNjc0bDEyLjY2NCwxMi42NjIgICAgIGMzMS44OTMsMzEuODkzLDgzLjc4MywzMS44OTMsMTE1LjY3NCwwbDc3LjkzNS03Ny45MzZjMTcuNTkyLTE3LjU5LDI1LjQ1OS00MS4yNjYsMjMuNjQ3LTY0LjMwOSAgICAgQzI3Ni44ODQsMjU1LjY1NCwzMDAuNTYsMjQ3Ljc4MywzMTguMTUsMjMwLjE5NXogTTIwMi42NTMsMjkwLjYwNWwtNzcuOTM2LDc3LjkzOGMtMTYuNzA1LDE2LjcwMy00My44ODksMTYuNzAzLTYwLjU5LDAgICAgIGwtMTIuNjY2LTEyLjY2NmMtMTYuNzA1LTE2LjcwMS0xNi43MDMtNDMuODg1LDAtNjAuNTk0bDc3LjkzNi03Ny45MzJjMTQuMTQtMTQuMTQxLDM1Ljc3OS0xNi4zMDYsNTIuMjI2LTYuNTE2bC0zMi4zMDIsMzIuMzA3ICAgICBjLTcuNjA2LDcuNjA0LTcuNjA2LDE5LjkzOCwwLDI3LjU0MWM3LjYwNSw3LjYwNywxOS45MzcsNy42MDcsMjcuNTQxLDBsMzIuMzA2LTMyLjMwMyAgICAgQzIxOC45NTksMjU0LjgyOCwyMTYuNzk1LDI3Ni40NjksMjAyLjY1MywyOTAuNjA1eiBNMjM4LjM4MiwyMDkuMTY5bDMyLjI5OS0zMi4zMDZjNy42MDgtNy42MDIsNy42MDgtMTkuOTM1LDAtMjcuNTM4ICAgICBjLTcuNjA0LTcuNjEtMTkuOTM2LTcuNjEtMjcuNTQxLTAuMDA0bC0zMi4zMDMsMzIuMzAzYy05Ljc5MS0xNi40NDYtNy42MjctMzguMDg3LDYuNTE0LTUyLjIyNmw3Ny45MzUtNzcuOTM1ICAgICBjMTYuNzA3LTE2LjcwNyw0My44OS0xNi43MDcsNjAuNTk0LDBsMTIuNjY0LDEyLjY2NGMxNi43MDUsMTYuNzA1LDE2LjcwNSw0My44ODYsMCw2MC41OTFsLTc3LjkzNiw3Ny45MzcgICAgIEMyNzYuNDY4LDIxNi43OTcsMjU0LjgyOCwyMTguOTU5LDIzOC4zODIsMjA5LjE2OXoiCmlkPSJwYXRoOSIgc3R5bGU9ImZpbGw6Izc5N2M4MCIgLz4KPHBhdGggZD0iTTM0My40NjYsMjYxLjQ2NWMtNDUuMjg3LDAtODIsMzYuNzEzLTgyLDgyczM2LjcxMyw4Miw4Miw4MmM0NS4yODYsMCw4Mi0zNi43MTMsODItODJTMzg4Ljc1MywyNjEuNDY1LDM0My40NjYsMjYxLjQ2NXogICAgICBNMzcyLjUwNSwzMzMuNTY0bC01Ni4wNDYsNTYuMTA0Yy0wLjIzOSwwLjIzOC0wLjUzNiwwLjQxLTAuODYyLDAuNDk2bC0yMi4zMTUsNS44NWMtMC42NDksMC4xNjgtMS4zNDctMC4wMi0xLjgyMi0wLjQ5NCAgICAgYy0wLjQ3Ny0wLjQ3OS0wLjY2Ni0xLjE3Mi0wLjQ5Ni0xLjgyNGw1LjgyNi0yMi4zMThjMC4wODQtMC4zMjYsMC4yNTYtMC42MjcsMC40OTQtMC44NjNsNTYuMDQ3LTU2LjEwNCAgICAgYzAuNzQyLTAuNzQyLDEuOTQ1LTAuNzQ0LDIuNjg4LTAuMDAybDQuNTQ4LDQuNTQxYzAuNzM5LDAuNzQsMC43NDEsMS45NDMsMCwyLjY4OGwtMzcuNDMzLDM3LjQ3MWw0LjcwOSw0LjcwM2wzNy40MzUtMzcuNDcxICAgICBjMC43MzktMC43NDIsMS45NC0wLjc0MiwyLjY4Mi0wLjAwMmw0LjU1LDQuNTQxQzM3My4yNSwzMzEuNjE3LDM3My4yNSwzMzIuODIyLDM3Mi41MDUsMzMzLjU2NHogTTM5NS40NzIsMzEwLjU3NGwtMTcsMTcuMDE4ICAgICBjLTAuNzM5LDAuNzQ0LTEuOTQyLDAuNzQ0LTIuNjg1LDAuMDAybC0xNi40ODktMTYuNDc1Yy0wLjc0NC0wLjc0LTAuNzQ0LTEuOTQzLTAuMDAyLTIuNjg4bDE3LTE3LjAyICAgICBjMC43NDEtMC43NCwxLjk0NC0wLjc0LDIuNjg4LTAuMDAybDE2LjQ4NywxNi40NzdDMzk2LjIxNiwzMDguNjI5LDM5Ni4yMTYsMzA5LjgzMiwzOTUuNDcyLDMxMC41NzR6IgppZD0icGF0aDExIiBzdHlsZT0iZmlsbDojNzk3YzgwIiAvPjwvZz4KPC9zdmc+%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u0420%u0430%u0441%u043A%u0443%u043A%u043E%u0436%u0438%u0432%u0430%u0442%u0435%u043B%u044C%20%u043A%u043E%u0440%u043E%u0442%u043A%u0438%u0445%20%u0441%u0441%u044B%u043B%u043E%u043A%2C%20%u043E%u0442%2028.08.2016%0A%28%28cntxtMenu%2C%20elm%2C%20mItem%29%20%3D%3E%20%7B%0A%20%20mItem.id%20%3D%20%22cb-unshorten-url%22%3B%0A%20%20mItem.setAttribute%28%22label%22%2C%20%22%u0420%u0430%u0441%u043A%u0443%u043A%u043E%u0436%u0438%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%22%29%3B%0A%20%20mItem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%22%29%3B%0A%20%20mItem.setAttribute%28%22image%22%2C%20self.image%29%3B%0A%20%20elm.parentNode.insertBefore%28mItem%2C%20elm%29%3B%0A%0A%20%20const%20alertsService%20%3D%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%3B%0A%0A%20%20var%20url%2C%20link%2C%20isUnshortened%2C%0A%20%20%20%20%20%20//%20%u0421%u0435%u0440%u0432%u0438%u0441%u044B%20%u0441%u043E%u043A%u0440%u0430%u0449%u0435%u043D%u0438%u044F%20%u0441%u0441%u044B%u043B%u043E%u043A.%20%u041C%u043E%u0436%u043D%u043E%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0442%u044C%20%u0441%u0432%u043E%u0438.%20%u0420%u0430%u0431%u043E%u0442%u0430%u0442%u044C%2C%20%u0432%20%u0442%u0435%u043E%u0440%u0438%u0438%2C%20%u0434%u043E%u043B%u0436%u043D%u043E%20%u0441%20%u043B%u044E%u0431%u044B%u043C%u0438%0A%20%20%20%20%20%20shortenerServices%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%22tinyurl.com%22%2C%0A%20%20%20%20%20%20%20%20%22po.st%22%2C%0A%20%20%20%20%20%20%20%20%22img.ly%22%2C%0A%20%20%20%20%20%20%20%20%22bit.ly%22%2C%0A%20%20%20%20%20%20%20%20%22goo.gl%22%2C%0A%20%20%20%20%20%20%20%20%22youtu.be%22%2C%0A%20%20%20%20%20%20%20%20%22t.co%22%2C%0A%20%20%20%20%20%20%20%20%22db.tt%22%2C%0A%20%20%20%20%20%20%20%20%22u.to%22%2C%0A%20%20%20%20%20%20%20%20%22shortlinks.de%22%0A%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20//%20%u041E%u043F%u0446%u0438%u0438%3A%0A%20%20%20%20%20%20options%20%3D%20%7B%0A%20%20%20%20%20%20%20%20replaceShortenedLinks%3A%20true%2C%20//%20%u0417%u0430%u043C%u0435%u043D%u044F%u0442%u044C%20%u0430%u0434%u0440%u0435%u0441%20%u0441%u0441%u044B%u043B%u043A%u0438%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%20%u0440%u0430%u0441%u043A%u0443%u043A%u043E%u0436%u0435%u043D%u043D%u043E%u0439%0A%20%20%20%20%20%20%20%20showAlert%3A%20true%2C%20//%20%u041F%u043E%u043A%u0430%u0437%u044B%u0432%u0430%u0442%u044C%20%u0432%u0441%u043F%u043B%u044B%u0432%u0430%u044E%u0449%u0438%u0435%20%u0443%u0432%u0435%u0434%u043E%u043C%u043B%u0435%u043D%u0438%u044F%0A%20%20%20%20%20%20%20%20clickAlertToOpen%3A%20true%2C%20//%20%u041A%u043B%u0438%u043A%20%u043F%u043E%20%u0443%u0432%u0435%u0434%u043E%u043C%u043B%u0435%u043D%u0438%u044E%20%u0441%20%u0440%u0430%u0441%u043A%u0443%u043A%u043E%u0436%u0435%u043D%u043D%u043E%u0439%20%u0441%u0441%u044B%u043B%u043A%u043E%u0439%20-%20%u043E%u0442%u043A%u0440%u043E%u0435%u0442%20%u0435%u0435%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%0A%20%20%20%20%20%20%20%20showOnShortenedTextLinks%3A%20true%2C%20//%20%u041F%u043E%u043A%u0430%u0437%u044B%u0432%u0430%u0442%u044C%20%u043F%u0443%u043D%u043A%u0442%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043D%u043E%u0433%u043E%20%u043C%u0435%u043D%u044E%20%u043D%u0430%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0445%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0445%20%u0441%u0441%u044B%u043B%u043A%u0430%u0445%0A%20%20%20%20%20%20%20%20promptDialogForTextLinks%3A%20true%2C%20//%20%u041F%u043E%u043A%u0430%u0437%u044B%u0432%u0430%u0442%u044C%20%u0434%u0438%u0430%u043B%u043E%u0433%20%u0441%20%u0440%u0435%u0437%u0443%u043B%u044C%u0442%u0430%u0442%u043E%u043C%20%u0434%u043B%u044F%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0445%20%u0441%u0441%u044B%u043B%u043E%u043A%0A%20%20%20%20%20%20%20%20copyToClipboard%3A%20true%2C%20//%20%u041A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0440%u0430%u0441%u043A%u0443%u043A%u043E%u0436%u0435%u043D%u043D%u0443%u044E%20%u0441%u0441%u044B%u043B%u043A%u0443%20%u0432%20%u0431%u0443%u0444%u0435%u0440%20%u043E%u0431%u043C%u0435%u043D%u0430%0A%20%20%20%20%20%20%20%20changeColorForUnshortenedLinks%3A%20true%2C%20//%20%u0418%u043D%u0434%u0438%u043A%u0430%u0446%u0438%u044F%20%u0446%u0432%u0435%u0442%u043E%u043C%20%u0441%u0441%u044B%u043B%u043A%u0438%20%u043E%u0436%u0438%u0434%u0430%u043D%u0438%u044F%20%u043E%u0442%u0432%u0435%u0442%u0430%20%u0438%20%u0440%u0435%u0437%u0443%u043B%u044C%u0442%u0430%u0442%u0430%0A%20%20%20%20%20%20%20%20changeColorBackAfterTimeout%3A%20false%2C%20//%20%u0412%u043E%u0437%u0432%u0440%u0430%u0449%u0430%u0442%u044C%20%u0446%u0432%u0435%u0442%20%u0441%u0441%u044B%u043B%u043E%u043A%20%u043A%20%u0438%u0441%u0445%u043E%u0434%u043D%u043E%u043C%u0443%2C%20%u043F%u043E%u0441%u043B%u0435%20%u043F%u0430%u0443%u0437%u044B%0A%20%20%20%20%20%20%20%20unshortenedLinksColor%3A%20%22lightgreen%22%20//%20%u0426%u0432%u0435%u0442%20%u0440%u0430%u0441%u043A%u0443%u043A%u043E%u0436%u0435%u043D%u043D%u044B%u0445%20%u0441%u0441%u044B%u043B%u043E%u043A%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20isFF32%20%3D%20%28parseFloat%28Services.appinfo.platformVersion%29%20%3E%3D%2032%29%3B%0A%0A%20%20function%20isShortenedURL%28aURL%29%20%7B%0A%20%20%20%20if%20%28aURL%20%26%26%20%28gContextMenu%20%26%26%20%28gContextMenu.onLink%20%26%26%20%21gContextMenu.isTextSelected%20%7C%7C%20gContextMenu.onPlainTextLink%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20%21aURL.match%28/%5Cs/%29%20%26%26%20%21%21aURL.match%28/%5C//%29%29%29%20%7B%0A%0A%20%20%20%20%20%20if%20%28%21aURL.startsWith%28%27http%27%29%29%20aURL%20%3D%20%27http%3A//%27%20+%20aURL.split%28/%5E%28%28%5Cw+%29%3F%3A%5C/%5C/%29%3F%28.+%29/%29%5B3%5D%3B%0A%0A%20%20%20%20%20%20var%20host%20%3D%20aURL.split%28/http%28s%29%3F%3A%5C/%5C/%28%5B%5Cw%5C.-%5D+%29/%29%5B2%5D%3B%0A%0A%20%20%20%20%20%20if%20%28shortenerServices.indexOf%28host%29%20%21%3D%3D%20-1%29%20%7B%0A%20%20%20%20%20%20%20%20url%20%3D%20aURL%3B%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20false%3B%0A%20%20%7D%3B%0A%0A%20%20function%20promptDialog%28aURL%29%20%7B%0A%20%20%20%20var%20input%20%3D%20%7Bvalue%3A%20aURL%7D%3B%0A%20%20%20%20var%20prompt%20%3D%20Services.prompt.prompt%28null%2C%20options.copyToClipboard%20%3F%20%22%u0420%u0430%u0441%u043A%u0443%u043A%u043E%u0436%u0435%u043D%u043D%u0430%u044F%20%u0441%u0441%u044B%u043B%u043A%u0430%20%u0441%u043A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u043D%u0430%21%22%20%3A%20%22%u0421%u0441%u044B%u043B%u043A%u0430%20%u0440%u0430%u0441%u043A%u0443%u043A%u043E%u0436%u0435%u043D%u0430%21%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%20%22%u041E%u0442%u0440%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0438%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%3F%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%20%20%20%20if%20%28prompt%29%0A%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28input.value%29%3B%0A%20%20%7D%3B%0A%0A%20%20function%20xhr%28aURL%2C%20cb%29%20%7B%0A%20%20%20%20let%20reURL%20%3D%20null%3B%0A%20%20%20%20let%20xhr%20%3D%20Cc%5B%22@mozilla.org/xmlextras/xmlhttprequest%3B1%22%5D.createInstance%28Ci.nsIXMLHttpRequest%29%3B%0A%20%20%20%20let%20alertListener%20%3D%20%7B%0A%20%20%20%20%20%20observe%3A%20function%28aSubject%2C%20aTopic%2C%20aData%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28aTopic%20%21%3D%20%27alertclickcallback%27%29%20return%3B%0A%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28aData%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20let%20handler%20%3D%20ev%20%3D%3E%20%7B%0A%20%20%20%20%20%20evf%28m%20%3D%3E%20xhr.removeEventListener%28m%2C%20handler%2C%20%211%29%29%3B%0A%20%20%20%20%20%20switch%20%28ev.type%29%20%7B%0A%20%20%20%20%20%20%20%20case%20%27load%27%3A%0A%20%20%20%20%20%20%20%20%20%20if%20%28xhr.status%20%3D%3D%20200%20%7C%7C%20%28isFF32%20%3F%20xhr.responseURL%20%3A%20xhr.channel.URI.spec%29%20%21%3D%20aURL%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20reURL%20%3D%20isFF32%20%3F%20xhr.responseURL%20%3A%20xhr.channel.URI.spec%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20cb%28reURL%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20options.showAlert%20%26%26%20%28options.clickAlertToOpen%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%3F%20alertsService.showAlertNotification%28self.image%2C%20self.label%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%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%27%u0421%u0441%u044B%u043B%u043A%u0430%20%u0440%u0430%u0441%u043A%u0443%u043A%u043E%u0436%u0435%u043D%u0430%21%5Cn%u041D%u0430%u0436%u043C%u0438%u0442%u0435%2C%20%u0447%u0442%u043E%u0431%u044B%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%3A%5Cn%27%20+%20%28reURL.length%20%3E%20100%20%3F%20%28%5BreURL.slice%280%2C45%29%2C%20reURL.slice%28-45%29%5D%29.join%28%27...%27%29%20%3A%20reURL%29%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%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%20true%2C%20reURL%2C%20alertListener%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%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20alertsService.showAlertNotification%28self.image%2C%20self.label%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%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%27%u0421%u0441%u044B%u043B%u043A%u0430%20%u0440%u0430%u0441%u043A%u0443%u043A%u043E%u0436%u0435%u043D%u0430%3A%5Cn%27%20+%20%28reURL.length%20%3E%20100%20%3F%20%28%5BreURL.slice%280%2C45%29%2C%20reURL.slice%28-45%29%5D%29.join%28%27...%27%29%20%3A%20reURL%29%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%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%20false%2C%20%22%22%2C%20null%2C%20%22%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20%20%20%20%20cb%28reURL%29%3B%0A%20%20%20%20%20%20%20%20%20%20options.showAlert%20%26%26%20alertsService.showAlertNotification%28self.image%2C%20self.label%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%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%27%u041E%u0448%u0438%u0431%u043A%u0430%20%u043F%u0440%u0438%20%u043F%u043E%u043F%u044B%u0442%u043A%u0435%20%u043F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%3A%20%27%20+%20xhr.statusText%20+%20%27%20%5B%27%20+%20ev.type%20+%20%27%3A%27%20+%20xhr.status%20+%20%27%5D%27%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%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%20false%2C%20%22%22%2C%20null%2C%20%22%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20let%20evf%20%3D%20f%20%3D%3E%20%5B%27load%27%2C%20%27error%27%2C%20%27abort%27%5D.forEach%28f%29%3B%0A%20%20%20%20evf%28m%20%3D%3E%20xhr.addEventListener%28m%2C%20handler%2C%20false%29%29%3B%0A%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20xhr.mozBackgroundRequest%20%3D%20true%3B%0A%20%20%20%20%20%20xhr.open%28%27HEAD%27%2C%20aURL%2C%20true%29%3B%0A%20%20%20%20%20%20xhr.channel.loadFlags%20%7C%3D%20Ci.nsIRequest.LOAD_ANONYMOUS%20%7C%20Ci.nsIRequest.LOAD_BYPASS_CACHE%20%7C%20Ci.nsIRequest.INHIBIT_CACHING%3B%0A%20%20%20%20%20%20xhr.setRequestHeader%28%22User-Agent%22%2C%20%22Mozilla/5.0%20%28compatible%3B%20Googlebot/2.1%3B%20+http%3A//www.google.com/bot.html%29%22%2C%20false%29%3B%0A%20%20%20%20%20%20xhr.setRequestHeader%28%22Accept%22%2C%20%22text/html%2Ctext/xml%22%2C%20false%29%3B%0A%20%20%20%20%20%20xhr.send%28null%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20catch%20%28ex%29%20%7B%0A%20%20%20%20%20%20cb%28reURL%29%3B%0A%20%20%20%20%20%20options.showAlert%20%26%26%20alertsService.showAlertNotification%28self.image%2C%20self.label%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%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%u041D%u0435%u043F%u0440%u0430%u0432%u0438%u043B%u044C%u043D%u0430%u044F%20%u0441%u0441%u044B%u043B%u043A%u0430%3A%20%27%20+%20%28ex.toString%28%29.length%20%3E%20100%20%3F%20%28%5Bex.toString%28%29.slice%280%2C45%29%2C%20ex.toString%28%29.slice%28-45%29%5D%29.join%28%27...%27%29%20%3A%20ex.toString%28%29%29%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%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20false%2C%20%22%22%2C%20null%2C%20%22%22%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20function%20shouldDisplay%28%29%20%7B%0A%20%20%20%20mItem.label%20%3D%20%22%u0420%u0430%u0441%u043A%u0443%u043A%u043E%u0436%u0438%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%22%3B%0A%0A%20%20%20%20if%20%28gContextMenu.onLink%20%26%26%20%21gContextMenu.isTextSelected%29%20%7B%0A%20%20%20%20%20%20url%20%3D%20gContextMenu.getLinkURL%28%29%3B%0A%20%20%20%20%20%20link%20%3D%20gContextMenu.link%3B%0A%20%20%20%20%20%20isUnshortened%20%3D%20link.getAttribute%28%22cb-short-url%22%29%3B%0A%20%20%20%20%20%20if%20%28isUnshortened%29%20mItem.label%20%3D%20%22%u0421%u043A%u0443%u043A%u043E%u0436%u0438%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%22%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28gContextMenu.onPlainTextLink%29%20%7B%0A%20%20%20%20%20%20url%20%3D%20gContextMenu.linkURL%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28%21gContextMenu.onPlainTextLink%20%26%26%20gContextMenu.isTextSelected%29%20%7B%0A%20%20%20%20%20%20url%20%3D%20document.commandDispatcher.focusedWindow.content.document.getSelection%28%29.toString%28%29.trim%28%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20mItem.hidden%20%3D%20%21%28%28gContextMenu.onLink%20%7C%7C%20%28gContextMenu.onPlainTextLink%20%7C%7C%20gContextMenu.isTextSelected%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%20options.showOnShortenedTextLinks%29%20%26%26%20isShortenedURL%28url%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7C%7C%20gContextMenu.onLink%20%26%26%20isUnshortened%29%3B%0A%20%20%7D%3B%0A%20%20cntxtMenu.addEventListener%28%22popupshowing%22%2C%20shouldDisplay%2C%20false%29%3B%0A%20%20addDestructor%28%28%29%3D%3E%20%7B%0A%20%20%20%20cntxtMenu.removeEventListener%28%22popupshowing%22%2C%20shouldDisplay%2C%20false%29%3B%0A%20%20%20%20cntxtMenu.removeChild%28mItem%29%3B%0A%20%20%7D%29%3B%0A%0A%20%20mItem.onclick%20%3D%28%29%3D%3E%20%7B%0A%20%20%20%20if%20%28gContextMenu.onLink%20%26%26%20%21gContextMenu.isTextSelected%29%20%7B%0A%20%20%20%20%20%20if%20%28%21isUnshortened%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28options.changeColorForUnshortenedLinks%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20linkClr%20%3D%20link.style.getPropertyValue%28%27color%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20linkClr%20%26%26%20link.style.setProperty%28%27-cb-old-color%27%2C%20linkClr%2C%20link.style.getPropertyPriority%28%27color%27%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20var%20oldClr%20%3D%20link.style.getPropertyValue%28%27-cb-old-color%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20var%20oldClrPrrt%20%3D%20link.style.getPropertyPriority%28%27-cb-old-color%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20link.style.setProperty%28%22color%22%2C%20%22orangered%22%2C%20%22important%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20xhr%28url%2C%20reURL%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21reURL%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20options.changeColorForUnshortenedLinks%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%20%28oldClr%20%3F%20%28link.style.setProperty%28%22color%22%2C%20oldClr%2C%20oldClrPrrt%29%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%20link.removeProperty%28%27-cb-old-color%27%29%29%20%3A%20link.style.removeProperty%28%22color%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20if%20%28options.changeColorForUnshortenedLinks%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20link.style.setProperty%28%22color%22%2C%20options.unshortenedLinksColor%2C%20%22important%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20options.changeColorBackAfterTimeout%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%20setTimeout%28%28%29%3D%3E%20oldClr%20%3F%20%28link.style.setProperty%28%22color%22%2C%20oldClr%2C%20oldClrPrrt%29%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%20%20%20%20link.removeProperty%28%27-cb-old-color%27%29%29%20%3A%20link.style.removeProperty%28%22color%22%29%2C%201000%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20options.copyToClipboard%20%26%26%20gClipboard.write%28reURL%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20options.replaceShortenedLinks%20%26%26%20%28link.setAttribute%28%22cb-short-url%22%2C%20link.href%29%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%20%20%20%20%20link.setAttribute%28%22href%22%2C%20reURL%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%29%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20oldClr%20%3F%20%28link.style.setProperty%28%22color%22%2C%20oldClr%2C%20oldClrPrrt%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20link.removeProperty%28%27-cb-old-color%27%29%29%20%3A%20link.style.removeProperty%28%22color%22%29%3B%0A%0A%20%20%20%20%20%20%20%20link.setAttribute%28%22href%22%2C%20isUnshortened%29%3B%0A%20%20%20%20%20%20%20%20link.removeAttribute%28%22cb-short-url%22%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20else%20%7B%0A%20%20%20%20%20%20xhr%28url%2C%20reURL%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21reURL%29%20return%3B%0A%0A%20%20%20%20%20%20%20%20options.copyToClipboard%20%26%26%20gClipboard.write%28reURL%29%3B%0A%20%20%20%20%20%20%20%20options.promptDialogForTextLinks%20%26%26%20promptDialog%28reURL%29%3B%0A%20%20%20%20%20%20%7D%29%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20this._handleClick%20%3D%28%29%3D%3E%20%7B%0A%20%20%20%20url%20%3D%20gClipboard.read%28%29%3B%0A%0A%20%20%20%20if%20%28%21url%20%7C%7C%20%21isShortenedURL%28url%29%29%20%7B%0A%20%20%20%20%20%20options.showAlert%20%26%26%20alertsService.showAlertNotification%28self.image%2C%20self.label%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%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27%u041D%u0435%u043F%u0440%u0430%u0432%u0438%u043B%u044C%u043D%u0430%u044F%20%u0441%u0441%u044B%u043B%u043A%u0430%21%27%2C%20false%2C%20%22%22%2C%20null%2C%20%22%22%29%3B%0A%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20xhr%28url%2C%20reURL%20%3D%3E%20%7B%0A%20%20%20%20%20%20if%20%28%21reURL%29%20return%3B%0A%0A%20%20%20%20%20%20options.copyToClipboard%20%26%26%20gClipboard.write%28reURL%29%3B%0A%20%20%20%20%20%20promptDialog%28reURL%29%3B%0A%20%20%20%20%7D%29%0A%20%20%7D%3B%0A%20%20this.tooltipText%20%3D%20%22%u041F%u041A%u041C%3A%20%u0420%u0430%u0441%u043A%u0443%u043A%u043E%u0436%u0438%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%20%u0432%20%u0431%u0443%u0444%u0435%u0440%u0435%20%u043E%u0431%u043C%u0435%u043D%u0430%22%3B%0A%7D%29%28document.getElementById%28%22contentAreaContextMenu%22%29%2C%20document.getElementById%28%22context-sep-open%22%29%2C%20document.createElement%28%22menuitem%22%29%29%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

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

Выделить код

Код:

// Раскукоживатель коротких ссылок, от 28.08.2016
((cntxtMenu, elm, mItem) => {
  mItem.id = "cb-unshorten-url";
  mItem.setAttribute("label", "Раскукожить ссылку");
  mItem.setAttribute("class", "menuitem-iconic");
  mItem.setAttribute("image", self.image);
  elm.parentNode.insertBefore(mItem, elm);

  const alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);

  var url, link, isUnshortened,
      // Сервисы сокращения ссылок. Можно добавлять свои. Работать, в теории, должно с любыми
      shortenerServices = [
        "tinyurl.com",
        "po.st",
        "img.ly",
        "bit.ly",
        "goo.gl",
        "youtu.be",
        "t.co",
        "db.tt",
        "u.to",
        "shortlinks.de"
      ],
      // Опции:
      options = {
        replaceShortenedLinks: true, // Заменять адрес ссылки на странице раскукоженной
        showAlert: true, // Показывать всплывающие уведомления
        clickAlertToOpen: true, // Клик по уведомлению с раскукоженной ссылкой - откроет ее в новой вкладке
        showOnShortenedTextLinks: true, // Показывать пункт контекстного меню на выделенных текстовых ссылках
        promptDialogForTextLinks: true, // Показывать диалог с результатом для текстовых ссылок
        copyToClipboard: true, // Копировать раскукоженную ссылку в буфер обмена
        changeColorForUnshortenedLinks: true, // Индикация цветом ссылки ожидания ответа и результата
        changeColorBackAfterTimeout: false, // Возвращать цвет ссылок к исходному, после паузы
        unshortenedLinksColor: "lightgreen" // Цвет раскукоженных ссылок
      },
      isFF32 = (parseFloat(Services.appinfo.platformVersion) >= 32);

  function isShortenedURL(aURL) {
    if (aURL && (gContextMenu && (gContextMenu.onLink && !gContextMenu.isTextSelected || gContextMenu.onPlainTextLink)
                 || !aURL.match(/\s/) && !!aURL.match(/\//))) {

      if (!aURL.startsWith('http')) aURL = 'http://' + aURL.split(/^((\w+)?:\/\/)?(.+)/)[3];

      var host = aURL.split(/http(s)?:\/\/([\w\.-]+)/)[2];

      if (shortenerServices.indexOf(host) !== -1) {
        url = aURL;
        return true;
      }
    }
    return false;
  };

  function promptDialog(aURL) {
    var input = {value: aURL};
    var prompt = Services.prompt.prompt(null, options.copyToClipboard ? "Раскукоженная ссылка скопирована!" : "Ссылка раскукожена!",
                                        "Отредактировать и открыть в новой вкладке?",
                                        input, null, {value: false});
    if (prompt)
      gBrowser.selectedTab = gBrowser.addTab(input.value);
  };

  function xhr(aURL, cb) {
    let reURL = null;
    let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
    let alertListener = {
      observe: function(aSubject, aTopic, aData) {
        if (aTopic != 'alertclickcallback') return;
        gBrowser.selectedTab = gBrowser.addTab(aData);
      }
    }

    let handler = ev => {
      evf(m => xhr.removeEventListener(m, handler, !1));
      switch (ev.type) {
        case 'load':
          if (xhr.status == 200 || (isFF32 ? xhr.responseURL : xhr.channel.URI.spec) != aURL) {
            reURL = isFF32 ? xhr.responseURL : xhr.channel.URI.spec;
            cb(reURL);
            options.showAlert && (options.clickAlertToOpen
                                  ? alertsService.showAlertNotification(self.image, self.label,
                                                                        'Ссылка раскукожена!\nНажмите, чтобы открыть в новой вкладке:\n' + (reURL.length > 100 ? ([reURL.slice(0,45), reURL.slice(-45)]).join('...') : reURL),
                                                                        true, reURL, alertListener, "")
                                  : alertsService.showAlertNotification(self.image, self.label,
                                                                        'Ссылка раскукожена:\n' + (reURL.length > 100 ? ([reURL.slice(0,45), reURL.slice(-45)]).join('...') : reURL),
                                                                        false, "", null, ""));
            break;
          }

        default:
          cb(reURL);
          options.showAlert && alertsService.showAlertNotification(self.image, self.label,
                                                                   'Ошибка при попытке получить ссылку: ' + xhr.statusText + ' [' + ev.type + ':' + xhr.status + ']',
                                                                   false, "", null, "");
          break;
      }
    };

    let evf = f => ['load', 'error', 'abort'].forEach(f);
    evf(m => xhr.addEventListener(m, handler, false));

    try {
      xhr.mozBackgroundRequest = true;
      xhr.open('HEAD', aURL, true);
      xhr.channel.loadFlags |= Ci.nsIRequest.LOAD_ANONYMOUS | Ci.nsIRequest.LOAD_BYPASS_CACHE | Ci.nsIRequest.INHIBIT_CACHING;
      xhr.setRequestHeader("User-Agent", "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)", false);
      xhr.setRequestHeader("Accept", "text/html,text/xml", false);
      xhr.send(null);
    }
    catch (ex) {
      cb(reURL);
      options.showAlert && alertsService.showAlertNotification(self.image, self.label,
                                                               'Неправильная ссылка: ' + (ex.toString().length > 100 ? ([ex.toString().slice(0,45), ex.toString().slice(-45)]).join('...') : ex.toString()),
                                                               false, "", null, "");
    }
  };

  function shouldDisplay() {
    mItem.label = "Раскукожить ссылку";

    if (gContextMenu.onLink && !gContextMenu.isTextSelected) {
      url = gContextMenu.getLinkURL();
      link = gContextMenu.link;
      isUnshortened = link.getAttribute("cb-short-url");
      if (isUnshortened) mItem.label = "Скукожить ссылку";
    }

    if (gContextMenu.onPlainTextLink) {
      url = gContextMenu.linkURL;
    }

    if (!gContextMenu.onPlainTextLink && gContextMenu.isTextSelected) {
      url = document.commandDispatcher.focusedWindow.content.document.getSelection().toString().trim();
    }

    mItem.hidden = !((gContextMenu.onLink || (gContextMenu.onPlainTextLink || gContextMenu.isTextSelected)
                      && options.showOnShortenedTextLinks) && isShortenedURL(url)
                     || gContextMenu.onLink && isUnshortened);
  };
  cntxtMenu.addEventListener("popupshowing", shouldDisplay, false);
  addDestructor(()=> {
    cntxtMenu.removeEventListener("popupshowing", shouldDisplay, false);
    cntxtMenu.removeChild(mItem);
  });

  mItem.onclick =()=> {
    if (gContextMenu.onLink && !gContextMenu.isTextSelected) {
      if (!isUnshortened) {
        if (options.changeColorForUnshortenedLinks) {
          var linkClr = link.style.getPropertyValue('color');
          linkClr && link.style.setProperty('-cb-old-color', linkClr, link.style.getPropertyPriority('color'));
          var oldClr = link.style.getPropertyValue('-cb-old-color');
          var oldClrPrrt = link.style.getPropertyPriority('-cb-old-color');
          link.style.setProperty("color", "orangered", "important");
        }

        xhr(url, reURL => {
          if (!reURL) {
            options.changeColorForUnshortenedLinks
              && (oldClr ? (link.style.setProperty("color", oldClr, oldClrPrrt),
                            link.removeProperty('-cb-old-color')) : link.style.removeProperty("color"));
            return;
          }

          if (options.changeColorForUnshortenedLinks) {
            link.style.setProperty("color", options.unshortenedLinksColor, "important");
            options.changeColorBackAfterTimeout
              && setTimeout(()=> oldClr ? (link.style.setProperty("color", oldClr, oldClrPrrt),
                                           link.removeProperty('-cb-old-color')) : link.style.removeProperty("color"), 1000);
          }

          options.copyToClipboard && gClipboard.write(reURL);

          options.replaceShortenedLinks && (link.setAttribute("cb-short-url", link.href),
                                            link.setAttribute("href", reURL));
        })
      }
      else {
        oldClr ? (link.style.setProperty("color", oldClr, oldClrPrrt),
                  link.removeProperty('-cb-old-color')) : link.style.removeProperty("color");

        link.setAttribute("href", isUnshortened);
        link.removeAttribute("cb-short-url");
      }
    }
    else {
      xhr(url, reURL => {
        if (!reURL) return;

        options.copyToClipboard && gClipboard.write(reURL);
        options.promptDialogForTextLinks && promptDialog(reURL);
      })
    }
  };

  this._handleClick =()=> {
    url = gClipboard.read();

    if (!url || !isShortenedURL(url)) {
      options.showAlert && alertsService.showAlertNotification(self.image, self.label,
                                                               'Неправильная ссылка!', false, "", null, "");
      return;
    }

    xhr(url, reURL => {
      if (!reURL) return;

      options.copyToClipboard && gClipboard.write(reURL);
      promptDialog(reURL);
    })
  };
  this.tooltipText = "ПКМ: Раскукожить ссылку в буфере обмена";
})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-sep-open"), document.createElement("menuitem"));

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

Выделить код

Код:

data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MjUuNDY2cHgiIGhlaWdodD0iNDI1LjQ2N3B4IiB2aWV3Qm94PSIwIDAgNDI1LjQ2NiA0MjUuNDY3Ij4KPGcgaWQ9Imc3IiBzdHlsZT0iZmlsbDojNzk3YzgwO2ZpbGwtb3BhY2l0eToxIj4KPHBhdGggZD0iTTMxOC4xNSwyMzAuMTk1bDc3LjkzNC03Ny45MzdjMzEuODk0LTMxLjg5MiwzMS44OTQtODMuNzgyLTAuMDA0LTExNS42NzRsLTEyLjY2LTEyLjY2ICAgICBjLTMxLjg5My0zMS44OTYtODMuNzgtMzEuODk2LTExNS42NzQtMC4wMDRsLTc3LjkzNyw3Ny45MzRjLTE3LjU4OCwxNy41ODgtMjUuNDU3LDQxLjI2NC0yMy42NDYsNjQuMzExICAgICBjLTIzLjA0NS0xLjgxMy00Ni43MjIsNi4wNTYtNjQuMzA4LDIzLjY0N0wyMy45MiwyNjcuNzQ4Yy0zMS44OTQsMzEuODg5LTMxLjg5NCw4My43NzksMCwxMTUuNjc0bDEyLjY2NCwxMi42NjIgICAgIGMzMS44OTMsMzEuODkzLDgzLjc4MywzMS44OTMsMTE1LjY3NCwwbDc3LjkzNS03Ny45MzZjMTcuNTkyLTE3LjU5LDI1LjQ1OS00MS4yNjYsMjMuNjQ3LTY0LjMwOSAgICAgQzI3Ni44ODQsMjU1LjY1NCwzMDAuNTYsMjQ3Ljc4MywzMTguMTUsMjMwLjE5NXogTTIwMi42NTMsMjkwLjYwNWwtNzcuOTM2LDc3LjkzOGMtMTYuNzA1LDE2LjcwMy00My44ODksMTYuNzAzLTYwLjU5LDAgICAgIGwtMTIuNjY2LTEyLjY2NmMtMTYuNzA1LTE2LjcwMS0xNi43MDMtNDMuODg1LDAtNjAuNTk0bDc3LjkzNi03Ny45MzJjMTQuMTQtMTQuMTQxLDM1Ljc3OS0xNi4zMDYsNTIuMjI2LTYuNTE2bC0zMi4zMDIsMzIuMzA3ICAgICBjLTcuNjA2LDcuNjA0LTcuNjA2LDE5LjkzOCwwLDI3LjU0MWM3LjYwNSw3LjYwNywxOS45MzcsNy42MDcsMjcuNTQxLDBsMzIuMzA2LTMyLjMwMyAgICAgQzIxOC45NTksMjU0LjgyOCwyMTYuNzk1LDI3Ni40NjksMjAyLjY1MywyOTAuNjA1eiBNMjM4LjM4MiwyMDkuMTY5bDMyLjI5OS0zMi4zMDZjNy42MDgtNy42MDIsNy42MDgtMTkuOTM1LDAtMjcuNTM4ICAgICBjLTcuNjA0LTcuNjEtMTkuOTM2LTcuNjEtMjcuNTQxLTAuMDA0bC0zMi4zMDMsMzIuMzAzYy05Ljc5MS0xNi40NDYtNy42MjctMzguMDg3LDYuNTE0LTUyLjIyNmw3Ny45MzUtNzcuOTM1ICAgICBjMTYuNzA3LTE2LjcwNyw0My44OS0xNi43MDcsNjAuNTk0LDBsMTIuNjY0LDEyLjY2NGMxNi43MDUsMTYuNzA1LDE2LjcwNSw0My44ODYsMCw2MC41OTFsLTc3LjkzNiw3Ny45MzcgICAgIEMyNzYuNDY4LDIxNi43OTcsMjU0LjgyOCwyMTguOTU5LDIzOC4zODIsMjA5LjE2OXoiCmlkPSJwYXRoOSIgc3R5bGU9ImZpbGw6Izc5N2M4MCIgLz4KPHBhdGggZD0iTTM0My40NjYsMjYxLjQ2NWMtNDUuMjg3LDAtODIsMzYuNzEzLTgyLDgyczM2LjcxMyw4Miw4Miw4MmM0NS4yODYsMCw4Mi0zNi43MTMsODItODJTMzg4Ljc1MywyNjEuNDY1LDM0My40NjYsMjYxLjQ2NXogICAgICBNMzcyLjUwNSwzMzMuNTY0bC01Ni4wNDYsNTYuMTA0Yy0wLjIzOSwwLjIzOC0wLjUzNiwwLjQxLTAuODYyLDAuNDk2bC0yMi4zMTUsNS44NWMtMC42NDksMC4xNjgtMS4zNDctMC4wMi0xLjgyMi0wLjQ5NCAgICAgYy0wLjQ3Ny0wLjQ3OS0wLjY2Ni0xLjE3Mi0wLjQ5Ni0xLjgyNGw1LjgyNi0yMi4zMThjMC4wODQtMC4zMjYsMC4yNTYtMC42MjcsMC40OTQtMC44NjNsNTYuMDQ3LTU2LjEwNCAgICAgYzAuNzQyLTAuNzQyLDEuOTQ1LTAuNzQ0LDIuNjg4LTAuMDAybDQuNTQ4LDQuNTQxYzAuNzM5LDAuNzQsMC43NDEsMS45NDMsMCwyLjY4OGwtMzcuNDMzLDM3LjQ3MWw0LjcwOSw0LjcwM2wzNy40MzUtMzcuNDcxICAgICBjMC43MzktMC43NDIsMS45NC0wLjc0MiwyLjY4Mi0wLjAwMmw0LjU1LDQuNTQxQzM3My4yNSwzMzEuNjE3LDM3My4yNSwzMzIuODIyLDM3Mi41MDUsMzMzLjU2NHogTTM5NS40NzIsMzEwLjU3NGwtMTcsMTcuMDE4ICAgICBjLTAuNzM5LDAuNzQ0LTEuOTQyLDAuNzQ0LTIuNjg1LDAuMDAybC0xNi40ODktMTYuNDc1Yy0wLjc0NC0wLjc0LTAuNzQ0LTEuOTQzLTAuMDAyLTIuNjg4bDE3LTE3LjAyICAgICBjMC43NDEtMC43NCwxLjk0NC0wLjc0LDIuNjg4LTAuMDAybDE2LjQ4NywxNi40NzdDMzk2LjIxNiwzMDguNjI5LDM5Ni4yMTYsMzA5LjgzMiwzOTUuNDcyLDMxMC41NzR6IgppZD0icGF0aDExIiBzdHlsZT0iZmlsbDojNzk3YzgwIiAvPjwvZz4KPC9zdmc+

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

Выделить код

Код:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAACFAAAAhQHi7P/BAAABNmlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjarY6xSsNQFEDPi6LiUCsEcXB4kygotupgxqQtRRCs1SHJ1qShSmkSXl7VfoSjWwcXd7/AyVFwUPwC/0Bx6uAQIYODCJ7p3MPlcsGo2HWnYZRhEGvVbjrS9Xw5+8QMUwDQCbPUbrUOAOIkjvjB5ysC4HnTrjsN/sZ8mCoNTIDtbpSFICpA/0KnGsQYMIN+qkHcAaY6addAPAClXu4vQCnI/Q0oKdfzQXwAZs/1fDDmADPIfQUwdXSpAWpJOlJnvVMtq5ZlSbubBJE8HmU6GmRyPw4TlSaqo6MukP8HwGK+2G46cq1qWXvr/DOu58vc3o8QgFh6LFpBOFTn3yqMnd/n4sZ4GQ5vYXpStN0ruNmAheuirVahvAX34y/Axk/96FpPYgAAACBjSFJNAAB6JQAAgIMAAPn/AACA6AAAUggAARVYAAA6lwAAF2/XWh+QAAABj0lEQVR42pSTz0qWYRDFX0gQRRAUwmrRxkVQK28haNM23OguEG+gM3SmfssiEHQrdAHfIiEvwQhvwIX9AQ2yXYi1icx824wfb19fZovZPMM5c+aceZq2bZuLlMwdmZcyezIPZabbtm0uBI7kqUwrsx3JuswXmQ8yo/8DftZRcyOSHzIL/5L9RKaNZGVI75XMxnnguwVeHdK7JvNNZuk8gp7Mvsy4zKLMVL3PRLIr81lm4m+TezKHkezLbEZyIjMrMyOzK3MoM/dHCpH9nfdrelt1X+bmIPg3go7bqyV7M7JPcBzJqcynLrhP0AGv1BqLMic1+VhmS2ZZZrLIR/oEdWGDOU9FMluyTwt8OZI1maNIDmQeRzLW1HluDzmgKzJvSvakzFrHkxelcrmp214fSOJqJG/PDItkXOaoDO7JPJD5GMlOUx/jq8ytAl+Xed91W2ZE5kDmeST3ZN6Vkq0mkun6GD9lXst8ryOZG1jpUSS3a622Epo/a47KLMhsRLIkMzHEk7Eyc6dSmY/k0q8BAFXPYK4TxOuUAAAAAElFTkSuQmCC


Спасибо за помощь Dumby и всем в чьи кнопки подглядывал при создании.

Отредактировано turbot (28-08-2016 16:12:04)

Отсутствует

 

№15302-09-2016 00:35:49

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

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

Сайты в боковой панели(Firefox 38+), от 02.09.2016
Позволяет открывать сайты в боковой панели из контекстного меню ссылок, кликами на кнопке и из сохраненного списка добавляемых в меню кнопки сайтов.
Предотвращает открытие ссылок, со страниц в боковой панели, в обычных вкладках (для открытия в обычной вкладке/окне - используйте контекстное меню ссылки/клик СКМ/Ctrl или Shift + клик).
Также частично восстанавливает контекстную навигацию и добавляет кнопки навигации в заголовок боковой панели.
До некоторой степени может служить заменой аддону All-in-One Sidebar.

(Прим.: Пользователям [firefox] 48+ следует обратить внимание на имеющийся баг в Custom Buttons, который делает нерабочими все кнопки берущие код с вкладки "Справка". Подробнее, как можно исправить, тут.)

Клики на кнопке:
ЛКМ:  Открыть меню со списком сохраненных адресов (ЛКМ по которым - откроет их в боковой панели, ПКМ - удалит из списка) и пунктом добавляющим в этот список адрес активной вкладки.
(Название сайта, адрес и иконка сохраняются во вкладке справки кнопки и записываются с новой строки. Сохраненные сайты разделяются пустой строкой. Для сайтов без фавиконки устанавливается дефолтная: chrome://mozapps/skin/places/defaultFavicon.png.)
СКМ: Открыть адрес из буфера
ПКМ (без клавиш модификаторов): Открыть в боковой панели адрес активной вкладки

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


Код кнопки:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0421%u0430%u0439%u0442%u044B%20%u0432%20%u0431%u043E%u043A%u043E%u0432%u043E%u0439%20%u043F%u0430%u043D%u0435%u043B%u0438%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAiEAAAIhAENVwL6AAAAIGNIUk0AAHolAACAgwAA+f8AAIDoAABSCAABFVgAADqXAAAXb9daH5AAAAHqSURBVHjarJM9aBVBFIW/s2wkgmDnDxoUgoJWokXERlEbf5pY2AhCCkWUgCaNvs3b2Z335lmZoETRINhKLPxD0CZgI0GtLFQUG8FGmxSBmBRzbSYSJE2IB4b5u/cMc+65MjOWYsT57cAVM9sL7AIi8EnSuxjjWKdV/Vgar0WCRrPqknQDuAB0AR+BsbS+DOwEfku6GWNsdFpV/EvQaFa5pElJ+8xsFlhrZn2dVvUrkW+R9Bb4CWyW9CrGONBpVTEHkDQK9JvZHNADzEv6WpQ16R6gG9gELJjZ2SzLvgNNXRtx2yR9AS5JOmJmfcAQy+Me8Bz4AFw3s95cUi8wHLy7X5T1LPA4ePdkueyirNcDM8G7p0VZr5G0Q41mdTB497oo6/3Bu+mirA+b2beUEwGyLMuTXj0p9kDw7k1R1kfVaFYvgUfA3VSBfqANXAUMyNPsgQ7wEJgAzgOnMuA2MJ4O7gCjwbtpYKOkBUDAuuDd+/TIOHBxMTYzsxfAieDdA+BY8G4qKT8QYxyWNCjpHICZPQOOB+8mgJPBu6lc0iFgNzAFbCjK+nTwbrJdl5//FVHSGWAmbfcUZT2/6jLKzCjK+hYwCMwlw8ynsRTdydYLQLekdrsum3n625CkrSuw8mSM0f2/ZlpNO/8ZAGBFAEu2Gqq+AAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u0421%u0430%u0439%u0442%u044B%20%u0432%20%u0431%u043E%u043A%u043E%u0432%u043E%u0439%20%u043F%u0430%u043D%u0435%u043B%u0438%20%u043E%u0442%2002.09.2016%0Athis.onclick%20%3De%3D%3E%20%7B%0A%20%20if%20%28e.target%20%21%3D%20this%29%20return%3B%0A%20%20let%20clipboard%20%3D%20gClipboard.read%28%29%3B%0A%20%20if%20%28e.button%20%3D%3D%200%29%0A%20%20%20%20menuPopup.openPopup%28this%2C%20%27after_start%27%29%3B%0A%20%20if%20%28e.button%20%3D%3D%201%29%0A%20%20%20%20openWebPanel%28clipboard%2C%20clipboard%29%3B%0A%20%20if%20%28e.button%20%3D%3D%202%20%26%26%20%21e.shiftKey%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.altKey%29%20%7B%0A%20%20%20%20e.preventDefault%28%29%3B%20e.stopPropagation%28%29%3B%0A%20%20%20%20openWebPanel%28window.content.document.title%2C%20window.content.document.location%29%0A%20%20%7D%0A%7D%0Athis.tooltipText%20%3D%20%27%u041B%u041A%u041C%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043C%u0435%u043D%u044E%20%u0441%u043E%20%u0441%u043F%u0438%u0441%u043A%u043E%u043C%20%u0441%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u043D%u044B%u0445%20%u0430%u0434%u0440%u0435%u0441%u043E%u0432%5Cn%5C%u0421%u041A%u041C%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0430%u0434%u0440%u0435%u0441%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%5Cn%5C%u041F%u041A%u041C%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0430%u0434%u0440%u0435%u0441%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%27%3B%0A%0Avar%20menuPopup%20%3D%20createNode%28%22menupopup%22%2C%20self%2C%20false%2C%20%7Bcontext%3A%20%22%22%7D%29%2C%0A%20%20%20%20sbBox%20%3D%20SidebarUI._box%2C%0A%20%20%20%20sbClsBtn%20%3D%20sbBox.querySelector%28%22.close-icon.tabbable%22%29%2C%0A%20%20%20%20wps%20%3D%20%22SidebarUI.browser.contentDocument.querySelector%28%27browser%23web-panels-browser%27%29.%22%2C%0A%20%20%20%20sep%20%3D%20%22%5Cn%5Cn%22%2C%0A%20%20%20%20//%20%u0417%u0430%u043C%u0435%u043D%u0438%u0442%u044C%20%u0441%u0442%u0440%u043E%u043A%u0443%20%u043D%u0438%u0436%u0435%20%u043D%u0430%3A%20help%20%3D%20custombutton.buttonGetHelp%28self%29.trim%28%29%2C%0A%20%20%20%20//%20%u0435%u0441%u043B%u0438%20%u043D%u0435%20%u0445%u043E%u0442%u0438%u0442%u0435%20%u0432%u043E%u0437%u0438%u0442%u044C%u0441%u044F%20%u0441%20%u043E%u0442%u043A%u043B%u044E%u0447%u0435%u043D%u0438%u0435%u043C%20%u043F%u0440%u043E%u0432%u0435%u0440%u043A%u0438%20%u0440%u0430%u0441%u0448%u0438%u0440%u0435%u043D%u0438%u0439%0A%20%20%20%20//%20%u0438%20%u0443%u0441%u0442%u0430%u043D%u043E%u0432%u043A%u043E%u0439%20%u043F%u043E%u0444%u0438%u043A%u0448%u0435%u043D%u043D%u043E%u0433%u043E%20CB%20%u0432%20%u0444%u044448+%0A%20%20%20%20help%20%3D%20self.Help.trim%28%29%2C%0A%20%20%20%20items%20%3D%20help%0A%20%20%20%20%20%20%3F%20help.split%28sep%29%0A%20%20%20%20%20%20%3A%20%5B%22About%20Config%5Cnabout%3Aconfig%5Cnchrome%3A//mozapps/skin/places/defaultFavicon.png%22%5D%2C%0A%20%20%20%20menugroup%20%3D%20createNode%28%22menugroup%22%2C%20menuPopup%2C%20false%2C%20%7B%0A%20%20%20%20%20%20orient%3A%20%22vertical%22%2C%0A%20%20%20%20%20%20oncommand%3A%20%22openPage%28event.target%29%3B%22%2C%0A%20%20%20%20%20%20oncontextmenu%3A%20%22removePage%28event.target%29%3B%22%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20cnMenu%20%3D%20document.getElementById%28%22contentAreaContextMenu%22%29%2C%0A%20%20%20%20cnOpen%20%3D%20document.getElementById%28%22context-sep-open%22%29%2C%0A%20%20%20%20cnItem%20%3D%20createNode%28%22menuitem%22%2C%20cnOpen%2C%20true%2C%20%7B%0A%20%20%20%20%20%20id%3A%20%22open-in-sidebar%22%2C%0A%20%20%20%20%20%20label%3A%20%22%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%20%u0411%u043E%u043A%u043E%u0432%u043E%u0439%20%u041F%u0430%u043D%u0435%u043B%u0438%22%2C%0A%20%20%20%20%20%20oncommand%3A%20%22openWebPanel%28gContextMenu.getLinkURL%28%29%2C%20gContextMenu.getLinkURL%28%29%29%3B%20document.getElementById%28%27verticaltoolbar-button%27%29.click%28%29%3B%22%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20cnListener%20%3D%20cnMenu.addEventListener%28%22popupshowing%22%2C%20%28%29%3D%3E%20cnItem.hidden%20%3D%20%21gContextMenu.onLink%29%2C%0A%20%20%20%20cnDestructor%20%3D%20addDestructor%28%28%29%3D%3E%20%7B%0A%20%20%20%20%20%20cnMenu.removeEventListener%28%22popupshowing%22%2C%20cnListener%29%3B%0A%20%20%20%20%20%20cnMenu.removeChild%28cnItem%29%0A%20%20%20%20%7D%29%2C%0A%20%20%20%20sbNav%20%3D%20%5B%0A%20%20%20%20%20%20%5B%22back%22%2C%20%22goBack%28%29%3B%22%2C%20%22back-button-tooltip%22%5D%2C%0A%20%20%20%20%20%20%5B%22forward%22%2C%20%22goForward%28%29%3B%22%2C%20%22forward-button-tooltip%22%5D%2C%0A%20%20%20%20%20%20%5B%22reload%22%2C%20%22reload%28%29%3B%22%2C%2C%20%22Reload%20current%20page%22%5D%2C%0A%20%20%20%20%20%20%5B%22stop%22%2C%20%22stop%28%29%3B%22%2C%2C%20%22Stop%20loading%20this%20page%22%5D%0A%20%20%20%20%5D%3B%0A%0Aitems.forEach%28%28item%2C%20index%29%20%3D%3E%20%7B%0A%20%20var%20%5Btitle%2C%20url%2C%20icon%5D%20%3D%20item.split%28%22%5Cn%22%29%3B%0A%20%20icon%20%3D%20%28icon.startsWith%28%27chrome%3A%27%29%20%7C%7C%20icon.startsWith%28%27file%3A%27%29%20%7C%7C%20icon.startsWith%28%27data%3A%27%29%29%20%3F%20icon%20%3A%20%27moz-anno%3Afavicon%3A%27%20+%20icon%3B%0A%20%20createNode%28%22menuitem%22%2C%20menugroup%2C%20false%2C%20%7B%0A%20%20%20%20tooltiptext%3A%20url%2C%0A%20%20%20%20class%3A%20%22menuitem-iconic%22%2C%0A%20%20%20%20label%3A%20title%2C%0A%20%20%20%20image%3A%20icon%0A%20%20%7D%29.index%20%3D%20index%3B%0A%7D%29%3B%0Amenugroup.openPage%20%3D%20%28%7Bindex%7D%29%20%3D%3E%20openWebPanel%28...items%5Bindex%5D.split%28%22%5Cn%22%29%29%3B%0Amenugroup.removePage%20%3D%20%28%7Bindex%7D%29%20%3D%3E%20items.splice%28index%2C%201%29%20%26%26%20installButton%28items.join%28sep%29%29%3B%0A%0A%5B%0A%20%20%5B%27menuseparator%27%5D%2C%0A%20%20%5B%27menuitem%27%2C%20%27%u0420%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u043A%u043D%u043E%u043F%u043A%u0443%27%2C%20%27custombuttons.editButton%28this.parentNode.parentNode%29%3B%27%5D%2C%0A%20%20%5B%27menuitem%27%2C%20%27%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0430%u0434%u0440%u0435%u0441%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%20%u043E%u0431%u043C%u0435%u043D%u0430%27%2C%20%27openWebPanel%28gClipboard.read%28%29%2C%20gClipboard.read%28%29%29%3B%27%5D%2C%0A%20%20%5B%27menuitem%27%2C%20%27%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0442%u0435%u043A%u0443%u0449%u0438%u0439%20%u0441%u0430%u0439%u0442%27%2C%20%27this.parentNode.parentNode.addPage%28window.content.document.title%2C%20window.content.document.location.href%2C%20gBrowser.mCurrentTab.image%29%3B%27%5D%0A%5D.forEach%28%28%5Btype%2C%20lbl%2C%20cmd%5D%29%20%3D%3E%20%0A%20%20%20%20%20%20%20%20%20%20createNode%28type%2C%20menuPopup%2C%20false%2C%20%7Blabel%3A%20lbl%2C%20oncommand%3A%20cmd%7D%29%29%3B%0A%0Aif%20%28%21sbBox.hasAttribute%28%22navbuttons%22%29%29%20%7B%0A%20%20sbNav.forEach%28%28%5Bid%2C%20cmd%2C%20tltp%2C%20ttxt%5D%29%20%3D%3E%20%7B%0A%20%20%20%20var%20icon%20%3D%20%22chrome%3A//browser/skin/content-contextmenu.svg%23%22%20+%20id%3B%0A%20%20%20%20id%20%3D%20%27sb-%27%20+%20id%20+%20%27-button%27%3B%0A%20%20%20%20createNode%28%22toolbarbutton%22%2C%20sbClsBtn%2C%20true%2C%20%7B%0A%20%20%20%20%20%20id%3A%20id%2C%0A%20%20%20%20%20%20oncommand%3A%20wps%20+%20cmd%2C%0A%20%20%20%20%20%20tooltip%3A%20tltp%2C%0A%20%20%20%20%20%20tooltiptext%3A%20ttxt%2C%0A%20%20%20%20%20%20style%3A%20%27list-style-image%3A%20url%28%22%27%20+%20icon%20+%20%27%22%29%3B%20-moz-image-region%3A%20rect%280%2011px%2011px%200%29%3B%27%0A%20%20%20%20%7D%29%0A%20%20%7D%29%0A%20%20sbBox.setAttribute%28%27navbuttons%27%2C%20%27true%27%29%3B%0A%7D%0A%0Afunction%20installButton%28help%29%20%7B%0A%20%20%20%20var%20link%20%3D%20custombuttons.makeButtonLink%28%22edit%22%2C%20_id%29%3B%0A%20%20%20%20var%20param%20%3D%20custombuttons.cbService.getButtonParameters%28link%29%3B%0A%20%20%20%20param%20%3D%20param.wrappedJSObject%20%7C%7C%20param%3B%0A%20%20%20%20param.help%20%3D%20help%3B%0A%20%20%20%20custombuttons.cbService.installButton%28param%29%3B%0A%7D%0A%0Afunction%20createNode%28type%2C%20elm%2C%20before%2C%20attrs%29%20%7B%0A%20%20var%20node%20%3D%20before%0A%20%20%3F%20elm.parentNode.insertBefore%28document.createElement%28type%29%2C%20elm%29%0A%20%20%3A%20elm.appendChild%28document.createElement%28type%29%29%3B%0A%20%20for%28var%20name%20in%20attrs%29%20%7B%0A%20%20%20%20if%20%28attrs%5Bname%5D%29%0A%20%20%20%20%20%20node.setAttribute%28name%2C%20attrs%5Bname%5D%29%3B%0A%20%20%7D%0A%20%20return%20node%3B%0A%7D%0A%0Athis.addPage%20%3D%28title%2C%20url%2C%20icon%29%3D%3E%20%7B%0A%20%20title%20%3D%20%21title%20%3F%20url%20%3A%20title%3B%0A%20%20icon%20%3D%20%21icon%20%3F%20%27chrome%3A//mozapps/skin/places/defaultFavicon.png%27%20%3A%20icon%3B%0A%20%20var%20newItem%20%3D%20%5Btitle%2C%20url%2C%20icon%5D.join%28%27%5Cn%27%29%3B%0A%20%20installButton%28%5Bhelp%2C%20newItem%5D.join%28sep%29%29%3B%0A%7D%0A%0A%28%28browser%2C%20listener%2C%20br%29%20%3D%3E%20%7B%20if%20%28browser%29%20%7B%0A%20%20addEventListener%28%22DOMFrameContentLoaded%22%2C%20listener%2C%20true%2C%20browser%29%3B%0A%20%20var%20getBr%20%3D%20%28%29%20%3D%3E%20browser.contentDocument.querySelector%28listener.selector%29%3B%0A%20%20if%20%28%28br%20%3D%20getBr%28%29%29%29%20br.window%20%3D%20%7Bparent%3A%20listener.parent%7D%3B%0A%20%20addDestructor%28%28%29%20%3D%3E%20%7B%0A%20%20%20%20if%20%28%28br%20%3D%20getBr%28%29%29%29%20delete%20br.window%3B%0A%20%20%7D%29%3B%0A%7D%7D%29%28SidebarUI.browser%2C%20%7B%0A%20%20selector%3A%20%22browser%23web-panels-browser%22%2C%0A%20%20handleEvent%28e%29%20%7B%0A%20%20%20%20if%20%28e.target.matches%28this.selector%29%20%26%26%20%21e.target.hasAttribute%28%22disableglobalhistory%22%29%29%20%7B%0A%20%20%20%20%20%20sbNav.forEach%28%28%5Bid%2C%20cmd%5D%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20id%20%3D%20%27%23context-%27%20+%20id%3B%0A%20%20%20%20%20%20%20%20var%20mItem%20%3D%20SidebarUI.browser.contentDocument.querySelector%28id%29%3B%0A%20%20%20%20%20%20%20%20if%20%28id%20%3D%3D%20%22%23context-reload%22%29%0A%20%20%20%20%20%20%20%20%20%20mItem.style.setProperty%28%27display%27%2C%20%27-moz-box%27%2C%20%27important%27%29%3B%0A%20%20%20%20%20%20%20%20mItem.onclick%20%3D%28%29%3D%3E%20eval%28wps%20+%20cmd%29%3B%0A%20%20%20%20%20%20%7D%29%0A%20%20%20%20%20%20e.target.setAttribute%28%22disableglobalhistory%22%2C%20%27false%27%29%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28e.target.matches%28this.selector%29%20%26%26%20%21%28%22window%22%20in%20e.target%29%29%0A%20%20%20%20%20%20e.target.window%20%3D%20%7Bparent%3A%20this.parent%7D%3B%0A%20%20%7D%2C%0A%20%20get%20parent%28%29%20%7B%0A%20%20%20%20delete%20this.parent%3B%0A%20%20%20%20var%20parent%20%3D%20%7B%7D%3B%0A%20%20%20%20parent.contentAreaClick%20%3D%20eval%28%60%28%24%7B%0A%20%20%20%20%20%20contentAreaClick.toString%28%29.replace%28%0A%20%20%20%20%20%20%20%20%27linkNode.getAttribute%28%22onclick%22%29%27%2C%0A%20%20%20%20%20%20%20%20%22%21target%20%26%26%20this.shouldLoadInPanelBrowser%28linkNode%29%20%7C%7C%20%24%26%22%0A%20%20%20%20%20%20%29%0A%20%20%20%20%7D%29%60%29%3B%0A%20%20%20%20parent.shouldLoadInPanelBrowser%20%3D%20link%20%3D%3E%20%7B%0A//%20%u0417%u0434%u0435%u0441%u044C%20%u043C%u043E%u0436%u043D%u043E%20%u0437%u0430%u0434%u0430%u0442%u044C%20%u0438%u0441%u043A%u043B%u044E%u0447%u0435%u043D%u0438%u044F%2C%20%u043A%u0430%u043A%u0438%u0435%20%u0441%u0441%u044B%u043B%u043A%u0438%20%u0441%u043B%u0435%u0434%u0443%u0435%u0442%20%u043E%u0442%u043A%u0440%u044B%u0432%u0430%u0442%u044C%20%u0432%20%u043E%u0431%u044B%u0447%u043D%u044B%u0445%20%u0432%u043A%u043B%u0430%u0434%u043A%u0430%u0445%3A%0A//%20%20%20%20%20%20%20if%20%28%21%28link.ownerDocument.location.protocol%20%3D%3D%20%22file%3A%22%0A//%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%20link.className%20%3D%3D%20%27file%27%29%29%20return%20true%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20this.parent%20%3D%20parent%3B%0A%20%20%7D%0A%7D%29%3B%0A%0Avar%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0Avar%20uri%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28%0A%20%20%5B%0A%20%20%20%20%27@namespace%20xul%20url%28%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%29%3B%27%2C%0A%20%20%20%20%27@namespace%20html%20url%28%22http%3A//www.w3.org/1999/xhtml%22%29%3B%27%2C%0A%20%20%20%20%27@namespace%20svg%20url%28http%3A//www.w3.org/2000/svg%29%3B%27%2C%0A%20%20%20%20%27%27%2C%0A%20%20%20%20%27@-moz-document%20url%28%22chrome%3A//browser/content/browser.xul%22%29%20%7B%27%2C%0A%20%20%20%20%27%20%20%23sidebar-throbber%5Bloading%5D%20%7E%20%23sb-reload-button%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20display%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%20%20%23sidebar-throbber%3Anot%28%5Bloading%5D%29%20%7E%20%23sb-stop-button%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20display%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%20%20%23sidebar-box%20toolbarbutton%5Bid%5E%3D%22sb-%22%5D%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20-moz-appearance%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20padding%3A%203.5px%206px%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20margin%3A%20.5px%200%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20background%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20background-clip%3A%20border-box%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20border%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20border-radius%3A%200%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20box-shadow%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%20%20%23sidebar-box%3Anot%28%5Bsidebarcommand%3D%22viewWebPanelsSidebar%22%5D%29%20toolbarbutton%5Bid%5E%3D%22sb-%22%5D%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20display%3A%20none%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%20%20%23sidebar-box%20toolbarbutton%5Bid%5E%3D%22sb-%22%5D%20.toolbarbutton-icon%20%7B%27%2C%0A//%20%20%20%u0420%u0430%u0441%u043A%u043E%u043C%u043C%u0435%u043D%u0442%u0438%u0440%u0443%u0439%u0442%u0435%20%u0441%u0442%u0440%u043E%u043A%u0443%20%u043D%u0438%u0436%u0435%2C%20%u0435%u0441%u043B%u0438%20%u0443%20%u0432%u0430%u0441%20%u0437%u0430%u0433%u043E%u043B%u043E%u0432%u043A%u0430%20%u0441%u0430%u0439%u0434%u0431%u0430%u0440%u0430%20%u0438%u043C%u0435%u0435%u0442%20%u0442%u0435%u043C%u043D%u044B%u0439%20%u0444%u043E%u043D%3A%0A//%20%20%20%20%20%27%20%20%20%20filter%3A%20invert%28.9%29%20%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20opacity%3A%200.5%20%21important%3B%27%2C%0A%20%20%20%20%27%20%20%20%20transition%3A%20opacity%20ease%20200ms%20%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%20%20%23sidebar-box%20toolbarbutton%5Bid%5E%3D%22sb-%22%5D%3Ahover%20.toolbarbutton-icon%20%7B%27%2C%0A%20%20%20%20%27%20%20%20%20opacity%3A%200.9%20%21important%3B%27%2C%0A%20%20%20%20%27%20%20%7D%27%2C%0A%20%20%20%20%27%7D%27%0A%20%20%5D.join%28%27%5Cn%27%29%29%29%3B%0AaddDestructor%28%28%29%3D%3E%20sss.unregisterSheet%28this.uri%2C%200%20%7C%7C%20uri%2C%200%29%29%3B%0Athis.uri%20%3D%20uri%3B%0Asss.loadAndRegisterSheet%28uri%2C%200%29%3B%0A%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

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

Выделить код

Код:

// Сайты в боковой панели от 02.09.2016
this.onclick =e=> {
  if (e.target != this) return;
  let clipboard = gClipboard.read();
  if (e.button == 0)
    menuPopup.openPopup(this, 'after_start');
  if (e.button == 1)
    openWebPanel(clipboard, clipboard);
  if (e.button == 2 && !e.shiftKey && !e.ctrlKey && !e.altKey) {
    e.preventDefault(); e.stopPropagation();
    openWebPanel(window.content.document.title, window.content.document.location)
  }
}
this.tooltipText = 'ЛКМ: Открыть меню со списком сохраненных адресов\n\СКМ: Открыть адрес из буфера\n\ПКМ: Открыть адрес активной вкладки';

var menuPopup = createNode("menupopup", self, false, {context: ""}),
    sbBox = SidebarUI._box,
    sbClsBtn = sbBox.querySelector(".close-icon.tabbable"),
    wps = "SidebarUI.browser.contentDocument.querySelector('browser#web-panels-browser').",
    sep = "\n\n",
    // Заменить строку ниже на: help = custombutton.buttonGetHelp(self).trim(),
    // если не хотите возиться с отключением проверки расширений
    // и установкой пофикшенного CB в фф48+
    help = self.Help.trim(),
    items = help
      ? help.split(sep)
      : ["About Config\nabout:config\nchrome://mozapps/skin/places/defaultFavicon.png"],
    menugroup = createNode("menugroup", menuPopup, false, {
      orient: "vertical",
      oncommand: "openPage(event.target);",
      oncontextmenu: "removePage(event.target);"
    }),
    cnMenu = document.getElementById("contentAreaContextMenu"),
    cnOpen = document.getElementById("context-sep-open"),
    cnItem = createNode("menuitem", cnOpen, true, {
      id: "open-in-sidebar",
      label: "Открыть в Боковой Панели",
      oncommand: "openWebPanel(gContextMenu.getLinkURL(), gContextMenu.getLinkURL()); document.getElementById('verticaltoolbar-button').click();"
    }),
    cnListener = cnMenu.addEventListener("popupshowing", ()=> cnItem.hidden = !gContextMenu.onLink),
    cnDestructor = addDestructor(()=> {
      cnMenu.removeEventListener("popupshowing", cnListener);
      cnMenu.removeChild(cnItem)
    }),
    sbNav = [
      ["back", "goBack();", "back-button-tooltip"],
      ["forward", "goForward();", "forward-button-tooltip"],
      ["reload", "reload();",, "Reload current page"],
      ["stop", "stop();",, "Stop loading this page"]
    ];

items.forEach((item, index) => {
  var [title, url, icon] = item.split("\n");
  icon = (icon.startsWith('chrome:') || icon.startsWith('file:') || icon.startsWith('data:')) ? icon : 'moz-anno:favicon:' + icon;
  createNode("menuitem", menugroup, false, {
    tooltiptext: url,
    class: "menuitem-iconic",
    label: title,
    image: icon
  }).index = index;
});
menugroup.openPage = ({index}) => openWebPanel(...items[index].split("\n"));
menugroup.removePage = ({index}) => items.splice(index, 1) && installButton(items.join(sep));

[
  ['menuseparator'],
  ['menuitem', 'Редактировать кнопку', 'custombuttons.editButton(this.parentNode.parentNode);'],
  ['menuitem', 'Открыть адрес из буфера обмена', 'openWebPanel(gClipboard.read(), gClipboard.read());'],
  ['menuitem', 'Добавить текущий сайт', 'this.parentNode.parentNode.addPage(window.content.document.title, window.content.document.location.href, gBrowser.mCurrentTab.image);']
].forEach(([type, lbl, cmd]) => 
          createNode(type, menuPopup, false, {label: lbl, oncommand: cmd}));

if (!sbBox.hasAttribute("navbuttons")) {
  sbNav.forEach(([id, cmd, tltp, ttxt]) => {
    var icon = "chrome://browser/skin/content-contextmenu.svg#" + id;
    id = 'sb-' + id + '-button';
    createNode("toolbarbutton", sbClsBtn, true, {
      id: id,
      oncommand: wps + cmd,
      tooltip: tltp,
      tooltiptext: ttxt,
      style: 'list-style-image: url("' + icon + '"); -moz-image-region: rect(0 11px 11px 0);'
    })
  })
  sbBox.setAttribute('navbuttons', 'true');
}

function installButton(help) {
    var link = custombuttons.makeButtonLink("edit", _id);
    var param = custombuttons.cbService.getButtonParameters(link);
    param = param.wrappedJSObject || param;
    param.help = help;
    custombuttons.cbService.installButton(param);
}

function createNode(type, elm, before, attrs) {
  var node = before
  ? elm.parentNode.insertBefore(document.createElement(type), elm)
  : elm.appendChild(document.createElement(type));
  for(var name in attrs) {
    if (attrs[name])
      node.setAttribute(name, attrs[name]);
  }
  return node;
}

this.addPage =(title, url, icon)=> {
  title = !title ? url : title;
  icon = !icon ? 'chrome://mozapps/skin/places/defaultFavicon.png' : icon;
  var newItem = [title, url, icon].join('\n');
  installButton([help, newItem].join(sep));
}

((browser, listener, br) => { if (browser) {
  addEventListener("DOMFrameContentLoaded", listener, true, browser);
  var getBr = () => browser.contentDocument.querySelector(listener.selector);
  if ((br = getBr())) br.window = {parent: listener.parent};
  addDestructor(() => {
    if ((br = getBr())) delete br.window;
  });
}})(SidebarUI.browser, {
  selector: "browser#web-panels-browser",
  handleEvent(e) {
    if (e.target.matches(this.selector) && !e.target.hasAttribute("disableglobalhistory")) {
      sbNav.forEach(([id, cmd]) => {
        id = '#context-' + id;
        var mItem = SidebarUI.browser.contentDocument.querySelector(id);
        if (id == "#context-reload")
          mItem.style.setProperty('display', '-moz-box', 'important');
        mItem.onclick =()=> eval(wps + cmd);
      })
      e.target.setAttribute("disableglobalhistory", 'false')
    }

    if (e.target.matches(this.selector) && !("window" in e.target))
      e.target.window = {parent: this.parent};
  },
  get parent() {
    delete this.parent;
    var parent = {};
    parent.contentAreaClick = eval(`(${
      contentAreaClick.toString().replace(
        'linkNode.getAttribute("onclick")',
        "!target && this.shouldLoadInPanelBrowser(linkNode) || $&"
      )
    })`);
    parent.shouldLoadInPanelBrowser = link => {
// Здесь можно задать исключения, какие ссылки следует открывать в обычных вкладках:
//       if (!(link.ownerDocument.location.protocol == "file:"
//             && link.className == 'file')) return true;
    }
    return this.parent = parent;
  }
});

var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
var uri = makeURI("data:text/css," + encodeURIComponent(
  [
    '@namespace xul url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");',
    '@namespace html url("http://www.w3.org/1999/xhtml");',
    '@namespace svg url(http://www.w3.org/2000/svg);',
    '',
    '@-moz-document url("chrome://browser/content/browser.xul") {',
    '  #sidebar-throbber[loading] ~ #sb-reload-button {',
    '    display: none!important;',
    '  }',
    '  #sidebar-throbber:not([loading]) ~ #sb-stop-button {',
    '    display: none!important;',
    '  }',
    '  #sidebar-box toolbarbutton[id^="sb-"] {',
    '    -moz-appearance: none!important;',
    '    padding: 3.5px 6px!important;',
    '    margin: .5px 0!important;',
    '    background: none!important;',
    '    background-clip: border-box!important;',
    '    border: none!important;',
    '    border-radius: 0!important;',
    '    box-shadow: none!important;',
    '  }',
    '  #sidebar-box:not([sidebarcommand="viewWebPanelsSidebar"]) toolbarbutton[id^="sb-"] {',
    '    display: none!important;',
    '  }',
    '  #sidebar-box toolbarbutton[id^="sb-"] .toolbarbutton-icon {',
//   Раскомментируйте строку ниже, если у вас заголовок сайдбара имеет темный фон:
//     '    filter: invert(.9) !important;',
    '    opacity: 0.5 !important;',
    '    transition: opacity ease 200ms !important;',
    '  }',
    '  #sidebar-box toolbarbutton[id^="sb-"]:hover .toolbarbutton-icon {',
    '    opacity: 0.9 !important;',
    '  }',
    '}'
  ].join('\n')));
addDestructor(()=> sss.unregisterSheet(this.uri, 0 || uri, 0));
this.uri = uri;
sss.loadAndRegisterSheet(uri, 0);

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

Выделить код

Код:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAiEAAAIhAENVwL6AAAAIGNIUk0AAHolAACAgwAA+f8AAIDoAABSCAABFVgAADqXAAAXb9daH5AAAAHqSURBVHjarJM9aBVBFIW/s2wkgmDnDxoUgoJWokXERlEbf5pY2AhCCkWUgCaNvs3b2Z335lmZoETRINhKLPxD0CZgI0GtLFQUG8FGmxSBmBRzbSYSJE2IB4b5u/cMc+65MjOWYsT57cAVM9sL7AIi8EnSuxjjWKdV/Vgar0WCRrPqknQDuAB0AR+BsbS+DOwEfku6GWNsdFpV/EvQaFa5pElJ+8xsFlhrZn2dVvUrkW+R9Bb4CWyW9CrGONBpVTEHkDQK9JvZHNADzEv6WpQ16R6gG9gELJjZ2SzLvgNNXRtx2yR9AS5JOmJmfcAQy+Me8Bz4AFw3s95cUi8wHLy7X5T1LPA4ePdkueyirNcDM8G7p0VZr5G0Q41mdTB497oo6/3Bu+mirA+b2beUEwGyLMuTXj0p9kDw7k1R1kfVaFYvgUfA3VSBfqANXAUMyNPsgQ7wEJgAzgOnMuA2MJ4O7gCjwbtpYKOkBUDAuuDd+/TIOHBxMTYzsxfAieDdA+BY8G4qKT8QYxyWNCjpHICZPQOOB+8mgJPBu6lc0iFgNzAFbCjK+nTwbrJdl5//FVHSGWAmbfcUZT2/6jLKzCjK+hYwCMwlw8ynsRTdydYLQLekdrsum3n625CkrSuw8mSM0f2/ZlpNO/8ZAGBFAEu2Gqq+AAAAAElFTkSuQmCC


Спасибо Dumby за помощь и код и Stakhovsky - за идею кнопки.

Отсутствует

 

№15402-09-2016 01:07:00

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

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

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

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

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

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

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


Код кнопки:

Выделить код

Код:

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

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

Выделить код

Код:

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

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

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

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

this.tooltipText = '';

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

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

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

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

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

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

        return;
    }

    var step = .05;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Выделить код

Код:

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


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

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

Отсутствует

 

№15511-10-2016 19:28:14

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

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

Поиск выделенного текста в файловом поисковике( Firefox24+ ) от 29.01.2017.
Кнопка для поиска выделенного текста в бесплатном и простом файловом поисковике 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.nsILocalFile%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%20%0A%20%20%20try%20%7B%20return%20gPrefService.getComplexValue%28s%2C%20Ci.nsISupportsString%29.data%3B%20%7D%20%0A%20%20%20catch%28e%29%20%7B%20return%20%22%3F%3F%3F%3F%3F%3F%22%3B%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%20var%20el%20%3D%20document.commandDispatcher.focusedElement%3B%0A%20%20%20try%20%7B%20return%20el.value.substring%28el.selectionStart%2C%20el.selectionEnd%29%20%7D%20catch%28e%29%20%7B%7D%3B%0A%20%20%20var%20sel%20%3D%20document.commandDispatcher.focusedWindow.getSelection%28%29%3B%0A%20%20%20return%20%28sel%20%3D%3D%20%27%27%29%20%3F%20false%20%3A%20sel.toString%28%29.replace%28/%5E%5Cs+%7C%5Cs+%24/g%2C%22%22%29%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%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

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

Выделить код

Код:

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.nsILocalFile);
   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() { 
   try { return gPrefService.getComplexValue(s, Ci.nsISupportsString).data; } 
   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() {
   var el = document.commandDispatcher.focusedElement;
   try { return el.value.substring(el.selectionStart, el.selectionEnd) } catch(e) {};
   var sel = document.commandDispatcher.focusedWindow.getSelection();
   return (sel == '') ? false : sel.toString().replace(/^\s+|\s+$/g,"");
};

На форуме

 

№15618-10-2016 08:54:01

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

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

Часы( Firefox24+ ) от 17.10.2016.
кнопка отображает дигитальные часики, в сплывающей подсказке кнопки отображается дата и название дня недели. Css стиль для часиков можно редактировать в вкладке кнопки Справка.

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

Выделить код

Код:

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.toLocaleFormat%28%22%25H%3A%25M%22%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%20var%20day%20%3D%20date.toLocaleFormat%28%22%25A%22%29%3B%0A%20%20%20self.tooltipText%20%3D%20date.toLocaleFormat%28%22%25d.%25m.%25Y.%20%22%29%20+%20day%5B0%5D.toUpperCase%28%29%20+%20day.slice%281%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().toLocaleFormat("%H:%M"), 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();
   var day = date.toLocaleFormat("%A");
   self.tooltipText = date.toLocaleFormat("%d.%m.%Y. ") + day[0].toUpperCase() + day.slice(1);
};

Справка:

Выделить код

Код:

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

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

На форуме

 

№15727-10-2016 18:53:43

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

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

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

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

Выделить код

Код:

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

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

Выделить код

Код:

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


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

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

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


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

На форуме

 

№15813-11-2016 12:59:27

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

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

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

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

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

Выделить код

Код:

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

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

Выделить код

Код:

/*Initialization Code*/

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

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


var sum = 0;

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


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

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

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


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


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


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

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

Отсутствует

 

№15906-12-2016 20:50:07

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

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

Добавить все открытие вкладки в папку закладок( Firefox24+ ) от 08.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%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%20parentFolderName%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%20newFolderName%20%3D%20new%20Date%28%29.toLocaleFormat%28%22%25d.%25m.%25Y%20%25H%3A%25M%3A%25S%22%29%3B%0A%20%20%20var%20newFolderId%20%3D%20PlacesUtils.bookmarks.createFolder%28parentFolderId%2C%20newFolderName%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%28newFolderId%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%20parentFolderName%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+%20parentFolderName%20+%20%22%20%3E%20%22%20+%20newFolderName%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%20id%20%u043F%u0430%u043F%u043A%u0438%20%u0437%u0430%u043A%u043B%u0430%u0434%u043E%u043A%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%20parentFolderName%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%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

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

Выделить код

Код:

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


// Настройка функций кликов мыши для кнопки ..........
this._handleClick =()=> {
   
   // создать новую подпапку закладок в указанной папке закладок или на панели закладок
   var parentFolderId = getBookFolderId() || 3;
   var newFolderName = new Date().toLocaleFormat("%d.%m.%Y %H:%M:%S");
   var newFolderId = PlacesUtils.bookmarks.createFolder(parentFolderId, newFolderName, index);     

   var array = getTabsInfo();

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


// Получить id папки закладок .......... 
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 == parentFolderName) {
               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;
};

На форуме

 

№16011-12-2016 00:44:21

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

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

Переключить многопроцессный режим( Firefox50+ ) от 27.12.2016.
кнопка включает - выключает многопроцессный режим (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%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%22extensions.e10sBlocksEnabling%22%2C%20true%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%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%0AgPrefService.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20gPrefService.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("extensions.e10sBlocksEnabling", false);
        cbu.setPrefs("extensions.e10sBlockedByAddons", false);
        cbu.setPrefs("browser.tabs.remote.force-enable", true);
        }
   else
        {
        cbu.setPrefs(s, 1);
        cbu.setPrefs("extensions.e10sBlocksEnabling", true);
        cbu.setPrefs("browser.tabs.remote.autostart", false);
        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();
gPrefService.addObserver(s, toggleImage, false);
addDestructor(()=> gPrefService.removeObserver(s, toggleImage));

На форуме

 

№16131-12-2016 18:31:43

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

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

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

Выделить код

Код:

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

Иконка 24х24

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

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

Отсутствует

 

№16203-01-2017 16:44:39

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

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

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

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

Выделить код

Код:

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

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

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

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


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

Выделить код

Код:

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

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


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

Отсутствует

 

№16304-01-2017 11:06:53

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

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

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

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

Выделить код

Код:

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

Код:

Выделить код

Код:

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

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

Отсутствует

 

№16408-01-2017 10:31:46

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

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

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

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

Выделить код

Код:

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

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

Отсутствует

 

№16527-01-2017 20:13:35

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

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

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

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

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

Выделить код

Код:

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

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

Выделить код

Код:

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


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

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


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


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

На форуме

 

№16628-01-2017 20:18:36

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

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

Запуск портативной программы из портативного браузера( 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));
};

На форуме

 

№16701-02-2017 01:02:15

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

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

Кодировать изображение или текстовой файл в base64( Firefox24+ ) от 31.01.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%5Bthis._handleClick%20%3D%28%29%3D%3E%20copyDataURI%28%29%3B%0A%0Afunction%20copyDataURI%28%29%20%7B%0A%20%20%20var%20file%20%3D%20getFile%28%29%3B%0A%20%20%20if%20%28%20%21file%20%29%20return%3B%0A%20%20%20var%20dataURI%20%3D%20generateDataURI%28file%29%3B%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%20%20%20%20%20%0A%7D%3B%0A%0Afunction%20getFile%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%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0444%u0430%u0439%u043B%22%2C%20fp.modeOpen%29%3B%0A%20%20%20fp.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%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%0A%20%20%20if%20%28%20fp.show%28%29%20%3D%3D%20fp.returnCancel%20%29%20return%3B%0A%20%20%20return%20fp.file%3B%0A%7D%3B%0A%0Afunction%20generateDataURI%28file%29%20%7B%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%20return%20%22data%3A%22%20+%20contentType%20+%20%22%3Bcharset%3Dutf-8%3Bbase64%2C%22%20+%20encoded%3B%0A%7D%3B%0A%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

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

Выделить код

Код:

this._handleClick =()=> copyDataURI();

function copyDataURI() {
   var file = getFile();
   if ( !file ) return;
   var dataURI = generateDataURI(file);
   gClipboard.write(dataURI);
   Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
   .showAlertNotification(self.image, self.label, "Скопировал файл как base64");     
};

function getFile() {
   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");
   if ( fp.show() == fp.returnCancel ) return;
   return fp.file;
};

function generateDataURI(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);
   return "data:" + contentType + ";charset=utf-8;base64," + encoded;
};

На форуме

 

№16812-02-2017 13:20:33

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

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

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

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

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

Выделить код

Код:

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

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

Выделить код

Код:

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

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

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

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


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

На форуме

 

Board footer

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