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

Будьте в курсе последних изменений в мире Mozilla, следя за нашим микроблогом в Twitter.

№1492605-08-2020 10:11:38

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 79.0

Re: Custom Buttons

Dumby
Блокировки хороши, но со storage пришлось поработать..

Отсутствует

 

№1492705-08-2020 12:22:39

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2144
UA: Firefox 52.0

Re: Custom Buttons

Dobrov пишет

основной пункт меню всегда «Other», хотя должен подставляться

Ну так smval и smVal это не одно и то же.
И вообще, как-то многословно, на мой вкус.

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

Выделить код

Код:

`
		if (subMenu) {
			for (var smitem of subMenu.getElementsByTagName('menuitem')) {
				var smval = smitem.getAttribute('tooltiptext');
				smVal = smVal.replace(/\n.*/g,''); // оставить только первую строку
				smitem.setAttribute('checked', (val === smval) ? true : false);
			}
		}
`;
		if (subMenu) for(var smitem of subMenu.getElementsByTagName("menuitem"))
			smitem.setAttribute("checked", smitem.getAttribute("tooltiptext").replace(/\n.*/g, "") == val);


Вау, кнопка регистрирует в _handlers 103 (сто три!) листенера. Жесть.

Отсутствует

 

№1492805-08-2020 13:26:09

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 541
UA: Firefox 52.0

Re: Custom Buttons

Dumby пишет

Ну да, я же говорю — бесполезно :).

Ладно, бог с ним.
Просто мне попадалось пару-тройку скриптов для "обезьяны", которые подменяют все ссылки на странице с youtube на invidio налету.
Вот и подумал, что можно сделать нечто подобное, но только по клику.


Мне Vitaliy V. подогнал дополнение, в котором можно настроить почти любой редирект.
Но я не любитель большого количества дополнений, и по возможности сначала пытаюсь реализовать нужный мне функционал с помощью СВ или Tampermonkey.
Раз, в этом случае, не получается, то поставлю дополнение.


Спасибо за помощь!


«The Truth Is Out There»

Отсутствует

 

№1492905-08-2020 19:00:45

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 79.0

Re: Custom Buttons

Dumby
Вот теперь уже кое-что. Это после авторизации на ютуб...Storage - пуст...
twgiorun.jpg
А это сам storage - три папки , но они пусты(хотя аддонов, как грязи)....Класс !
62aeoofv.jpg

Отредактировано solombala (05-08-2020 19:01:35)

Отсутствует

 

№1493005-08-2020 23:33:03

egorsemenov06
Участник
 
Группа: Members
Зарегистрирован: 12-06-2018
Сообщений: 381
UA: Firefox 79.0

Re: Custom Buttons

Dumby
Можно Вас попросить пожалуйста сделать для user_chrome_files кнопку Proxy

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

Выделить код

Код:

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%3C%21%5BCDATA%5BProxy%5D%5D%3E%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAAYOQAAWJ2kADh1fAAAEKAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgICAgICAgICAgMBAQEAAAEEJBE4ULQ+fZ38ea/H/muhuv8gW3ztAxclewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMLNlO7PH+n/3Sgu/281eP9zuHr/mWZuP4XXon/ABAeZwAAAAAAAAAAAQEBAQAAAAAZGBoTKScsLyYkKjErJSgnIC8/XgZQgP9BcZb8b5q3/oiux/+qx9r/a5Ow+zFtlv8PRWrGAAACAAEBAQMHBwcbAAAAD2BeYn769/3/4eDm/Onh5v+DnrX/A0t9/j1vlv+FqMH/lrfN/7rS4f9+pL3+M26X/xJYhu0DEiMdAAAAAAEBAQEAAAABBgUGEaSiprbPzNP239fb/4OcsP4aXYr/RHOZ/5Gwx//T5e//mrjO/3KYtv40apP/D0x77AUTIhwhHyMmeXV7mXt4fqJ3dHmce3d+n6eirODMx8r/o6q3/kN4nf92m7n/vtPj/9Hg7P/C1OL/eJq1+jtulv8bSnC7AAEGAF1aYH7//////f39/P//////////////////////////lbHC/3ilvf/K4Oz/2OXv/7nN3f6FqcP/VIiv/AseMT8AAAAAXFtef+LY5/+AT534fU2d+4VXovyKXaf+jGGp/5BlrP+GWKT/ZmGc/4Cduf+ivtD+k7HH/1t/neUTJjhFAAAAAAEBAQJfXmB/3tHl/14giPxcIYr/Zy+S/244mP9yPZv/cj6c/3M9nP9wNpf/YDSP/1k0ivu7tdP/YmNmiAAAAAAEBAQGAAAAAF9eYIDg1Ob/cDqV/HE9mv9/TaT/hler/4tdr/+NXrD/iFms/4JTqP9+SqP/cjqW+9zJ4/9ubW6JAAAAAAMDBAQAAAAAX15ggODU5v94RZz8e0mi/4pcrv+Vabf/nXO9/6J5wf+jfMH/oXq//513u/+NY6z718bh/2pqa4gAAAAABAMEBAAAAABfXWCA4NTm/4VWpfyPY7L/onvA/7GPzP+8ndT/waTY/8Cj1/+6nNL/tZfO/6F9uvvYx+L/ampriAAAAAAEAwQEAAAAAF9eYH/e0uX/n3u5/LKTzP/Bpdf/zrbh/9jC6f/bxuv/2cTp/9O+5P/Qu+H/uJ3L+9jI4f9qaWuHAAAAAAQDBAQAAAAAX15gf97S5P+gfbf5sZPH/LqdzfzCqNT8ybHZ/My12vzKs9n8xq/W/Mav1fywksL418fh/2tqbIkAAAAABAMEBAAAAABZVlt3+fX8/+DU5vzj1un/5tvt/+ne7//r4PH/6t7w/+fb7f/k2Ov/4dPn/9nM4Pv79v//ZGFnfwAAAAADAwQEAAAAABcVGRpZVlt6YF9hgWBgYoBhYWKAYmFigGJiY4BiYmOAYmFigGFhYoBgYGGAX15ggF1aX4AbGR0eAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E%3C%21%5BCDATA%5B0%5D%5D%3E%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%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.onmousedown%20%3D%20e%20%3D%3E%20%7B%0A%0A%20%20%20%20if%20%28e.button%20%3D%3D%200%29%20//%20%u0434%u043B%u0438%u043D%u043D%u044B%u0439%20%u043B%u0435%u0432%u044B%u0439%20%u043A%u043B%u0438%u043A%0A%20%20%20%20%20%20%20%20self.timer%20%3D%20setTimeout%28%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20self.onmouseup%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20cbu.getPrefs%28%22CB.Proxy.connectionsInTab%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20openConnectionsInTab%28%29%20%3A%20openConnections%28%29%3B%0A%20%20%20%20%20%20%20%20%7D%2C%20500%29%3B%0A%0A%20%20%20%20this.onmouseup%20%3D%20e%20%3D%3E%20%7B%20//%20%u043B%u0435%u0432%u044B%u0439%20%u043A%u043B%u0438%u043A%0A%20%20%20%20%20%20%20%20if%20%28e.button%29%20return%3B%0A%20%20%20%20%20%20%20%20clearTimeout%28self.timer%29%3B%0A%0A%20%20%20%20%20%20%20%20switch%28cbu.getPrefs%28%22network.proxy.type%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%200%3A%20%20var%20data%20%3D%201%3B%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%201%3A%20%20var%20data%20%3D%202%3B%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%202%3A%20%20var%20data%20%3D%200%3B%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20default%3A%20var%20data%20%3D%200%3B%20%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22network.proxy.type%22%2C%20data%29%3B%0A%20%20%20%20%7D%0A%7D%0A//%20%u043F%u0440%u0430%u0432%u044B%u0439%20%u043A%u043B%u0438%u043A%0Athis.oncontextmenu%20%3D%20e%20%3D%3E%20e.detail%20%3D%3D%202%20%26%26%20%21menuPopup.hidePopup%28%29%0A%20%20%20%20%7C%7C%20e.ctrlKey%20%7C%7C%20%21%21menuPopup.openPopup%28this%2C%20%22after_start%22%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...................%0Athis.onmouseover%20%3D%20%28%29%20%3D%3E%20this.tooltipText%20%3D%0A%20%20%20%20%22Proxy%20%5Cn%u041B%3A%20%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043F%u0440%u043E%u043A%u0441%u0438%20%5Cn%u0414%u041B%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043F%u0440%u043E%u043A%u0441%u0438%22%20+%0A%20%20%20%20%22%5Cn%u041F%3A%20%20M%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%20%5Cn%u0414%u041F%3A%20CB%20%u043C%u0435%u043D%u044E%20%5Cn%5Cn%u0422%u0435%u043A%u0443%u0449%u0438%u0435%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043F%u0440%u043E%u043A%u0441%u0438%3A%20%22%20+%0A%20%20%20%20%22%5CnIP%3A%20%22%20+%20cbu.getPrefs%28%22network.proxy.http%22%29%20+%20%22%5Cn%u041F%u043E%u0440%u0442%3A%20%22%20+%0A%20%20%20%20cbu.getPrefs%28%22network.proxy.http_port%22%29%3B%0A%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...................%0Avar%20array%20%3D%20%5B%0A%20%20%20%20%7Blabel%3A%20%22%u0414%u043E%u0431%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u043F%u0440%u043E%u043A%u0441%u0438%20%u0432%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043E%u043C%20%u043C%u0435%u043D%u044E%22%2C%20value%3A%20%27CB.Proxy.inContextMenu%27%7D%2C%0A%20%20%20%20%7Blabel%3A%20%22%u041E%u0442%u043A%u0440%u044B%u0432%u0430%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043F%u0440%u043E%u043A%u0441%u0438%20%u043A%u0430%u043A%20%u0432%u043A%u043B%u0430%u0434%u043A%u0443%22%2C%20value%3A%20%27CB.Proxy.connectionsInTab%27%7D%2C%0A%20%20%20%20%7Blabel%3A%20%22%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u043D%u0430%20%u0440%u0435%u0436%u0438%u043C%20%27%u0411%u0435%u0437%20%u043F%u0440%u043E%u043A%u0441%u0438%27%20%u043F%u0440%u0438%20%u0437%u0430%u043A%u0440%u044B%u0442%u0438%u0438%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%20%22%2C%20value%3A%20%27CB.Proxy.reset%27%7D%0A%5D%3B%0A%0Avar%20menuPopup%20%3D%20document.getElementById%28%27mainPopupSet%27%29.appendChild%28document.createElementNS%28xulns%2C%20%22menupopup%22%29%29%3B%0Aarray.forEach%28m%20%3D%3E%20%7B%0A%20%20%20%20var%20mItem%20%3D%20document.createElementNS%28xulns%2C%20%22menuitem%22%29%3B%0A%20%20%20%20mItem.setAttribute%28%22label%22%2C%20m.label%29%3B%0A%20%20%20%20mItem.setAttribute%28%22type%22%2C%20%22checkbox%22%29%3B%0A%20%20%20%20mItem.setAttribute%28%22checked%22%2C%20cbu.getPrefs%28m.value%29%29%3B%0A%20%20%20%20mItem.onclick%20%3D%20%28%29%20%3D%3E%20cbu.setPrefs%28m.value%2C%20%21cbu.getPrefs%28m.value%29%29%3B%20%20%0A%20%20%20%20menuPopup.appendChild%28mItem%29%3B%0A%7D%29%3B%0AaddDestructor%28%28%29%20%3D%3E%20menuPopup.remove%28%29%29%3B%0A%0A%0Avar%20listenClick%20%3D%20win%20%3D%3E%20%7B%0A%20%20%20%20var%20args%20%3D%20%5B%22click%22%2C%20win.close.bind%28win%29%2C%20true%5D%3B%0A%20%20%20%20var%20unload%20%3D%20%28%29%20%3D%3E%20gBrowser.removeEventListener%28...args%29%3B%0A%20%20%20%20gBrowser.addEventListener%28...args%29%3B%0A%20%20%20%20win.addEventListener%28%22unload%22%2C%20unload%2C%20%7Bonce%3A%20true%7D%29%3B%0A%7D%0Avar%20version%20%3D%20parseInt%28Services.appinfo.platformVersion%29%3B%0Avar%20url%20%3D%20%60chrome%3A//browser/content/preferences/%24%7Bversion%20%3E%3D%2077%20%3F%20%22dialogs/%22%20%3A%20%22%22%7Dconnection.x%24%7Bversion%20%3E%3D%2072%20%3F%20%22htm%22%20%3A%20%22u%22%7Dl%60%3B%0A%0Avar%20fox73%20%3D%20version%20%3E%3D%2073%2C%20noop%20%3D%20%28%29%20%3D%3E%20%7B%7D%3B%0Aif%20%28fox73%29%20var%20grid%20%3D%20win%20%3D%3E%20%7B%0A%20%20%20%20var%20url%20%3D%20%22data%3Atext/css%3Bcharset%3Dutf-8%2C%22%20+%20encodeURIComponent%28%60%0A%20%20%20%20%20%20%20%20%23proxy-grid%2C%20%23dnsOverHttps-grid%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20display%3A%20grid%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20grid-template-columns%3A%20auto%201fr%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20align-items%3A%20center%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%23proxy-grid%20%3E%20.thin%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20grid-column-end%3A%203%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20height%3A%2020px%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%23dnsOverHttps-grid.custom-container-hidden%20%23networkCustomDnsOverHttpsInput%2C%0A%20%20%20%20%20%20%20%20%23dnsOverHttps-grid.custom-container-hidden%20%23networkCustomDnsOverHttpsInputLabelContainer%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20display%3A%20none%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%60%29%3B%0A%20%20%20%20%28grid%20%3D%20win%20%3D%3E%20win.windowUtils.loadSheetUsingURIString%28url%2C%20win.windowUtils.AUTHOR_SHEET%29%29%28win%29%3B%0A%7D%0Avar%20winOpen%20%3D%20win%20%3D%3E%20win.addEventListener%28%22readystatechange%22%2C%20winReady%2C%20%7Bonce%3A%20true%2C%20capture%3A%20true%7D%29%3B%0Avar%20winReady%20%3D%20e%20%3D%3E%20%7B%0A%20%20%20%20var%20win%20%3D%20e.target.ownerGlobal%2C%20cw%20%3D%20win.isChromeWindow%3B%0A%20%20%20%20if%20%28cw%20%7C%7C%20%28win.location%20%3D%3D%20url%20%26%26%20%21win.docShell.name%29%29%20winPatch%28win%2C%20cw%29%3B%0A%7D%0Avar%20winPatch%20%3D%20%28win%2C%20cw%29%20%3D%3E%20%7B%0A%20%20%20%20win.opener%20%3D%20%7BgSubDialog%3A%20%7B_dialogs%3A%20%5B%7B%0A%20%20%20%20%20%20%20%20_frame%3A%20%7Bget%20contentDocument%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20cw%20%26%26%20listenClick%28win%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20delete%20this.contentDocument%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20this.contentDocument%20%3D%20win.document%3B%0A%20%20%20%20%20%20%20%20%7D%7D%2C%0A%20%20%20%20%20%20%20%20resizeVertically%3A%20cw%20%3F%20%28%29%20%3D%3E%20win.sizeToContent%28%29%20%3A%20noop%0A%20%20%20%20%7D%5D%7D%7D%3B%0A%20%20%20%20fox73%20%26%26%20grid%28win%29%3B%0A%7D%0AaddEventListener%28%22MozBeforeInitialXULLayout%22%2C%20winReady%2C%20false%2C%20gBrowser.tabpanels%20%7C%7C%201%29%3B%0A%0Afor%28var%20%7BcontentWindow%3A%20win%7D%20of%20gBrowser.browsers%29%0A%20%20%20%20win%20%26%26%20win.location%20%3D%3D%20url%20%26%26%20%21win.opener%20%26%26%20winPatch%28win%29%3B%0A%0A%0A//%20%u0424%u0443%u043D%u043A%u0446%u0438%u044F%20%u043E%u0442%u043A%u0440%u044B%u0432%u0430%u0435%u0442%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043F%u0440%u043E%u043A%u0441%u0438%20%u0432%20%u043E%u043A%u043D%u0435%20...................%20%20%0Afunction%20openConnections%28%29%20%7B%0A%20%20%20%20var%20win%20%3D%20%5B...Services.wm.getEnumerator%28null%29%5D.find%28w%20%3D%3E%20w.location%20%3D%3D%20url%29%3B%0A%20%20%20%20win%20%3F%20win.focus%28%29%20%3A%20winOpen%28openDialog%28url%2C%20%22Proxy%22%2C%20%22centerscreen%22%29%29%3B%0A%7D%0A%0A//%20%u0424%u0443%u043D%u043A%u0446%u0438%u044F%20%u043E%u0442%u043A%u0440%u044B%u0432%u0430%u0435%u0442%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043F%u0440%u043E%u043A%u0441%u0438%20%u0432%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20...................%0Afunction%20openConnectionsInTab%28%29%20%7B%0A%20%20%20%20var%20connections%20%3D%20gBrowser.getBrowserForTab%28%0A%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTrustedTab%28url%29%0A%20%20%20%20%29%3B%0A%0A%20%20%20%20//%20o%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%20%u0436%u0434%u0435%u0442%20%u043F%u043E%u043A%u0430%20%u043E%u0442%u043A%u0440%u043E%u0435%u0442%u0441%u044F%20%u043F%u0440%u043E%u043A%u0441%u0438%2C%20%u0443%u0434%u0430%u043B%u044F%u0435%u0442%20%u0441%u0435%u0431%u044F%20%u0438%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0435%u0442%20%u0430%u0442%u0440%u0438%u0431%u0443%u0442%0A%20%20%20%20connections.addEventListener%28%22pageshow%22%2C%0A%20%20%20%20%20%20%20%20e%20%3D%3E%20e.target.documentElement.setAttribute%28%22type%22%2C%20%22prefwindow%22%29%0A%20%20%20%20%2C%20%7Bonce%3A%20true%7D%29%3B%0A%7D%0A%0A%0A//%20%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0438%u0432%u0430%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%u0431%u0430%u0443%u0437%u0435%u0440%u0430%20%u0438%u043B%u0438%20%u043F%u0440%u0438%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%u0445%20%u0432%20%27about%3Aconfig%27%20...................%0Avar%20s%20%3D%20%22network.proxy.type%22%3B%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20%20var%20%7Bicon%7D%20%3D%20self%3B%0A%20%20%20%20switch%28%20cbu.getPrefs%28s%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20//case%200%3A%20icon.src%20%3D%20self.image%3B%20break%3B%0A%20%20%20%20%20%20%20%20case%201%3A%20icon.src%20%3D%20%27data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAA4GQAAnFmkAHQ5fAAQAKAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgICAgICAgICAgMBAQEAAAQBJBFQOLQ+nX38ecev/mu6of8gfFvtAyUXewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMLUza7PKd//3S7oP2849X9zuvh/mW4mf4XiV7/AB4QZwAAAAAAAAAAAQEBAQAAAAAZGhgTKSwnLyYqJDErKCUnID8vXgaAUP9BlnH8b7ea/ojHrv+q2sf/a7CT+zGWbf8PakXGAAIAAAEBAQMHBwcbAAAAD2BiXn76/ff/4ebg/Onm4f+DtZ7/A31L/j2Wb/+Fwaj/ls23/7rh0v9+vaT+M5du/xKGWO0DIxIdAAAAAAEBAQEAAAABBgYFEaSmorbP08z239vX/4OwnP4ail3/RJlz/5HHsP/T7+X/ms64/3K2mP40k2r/D3tM7AUiExwhIx8meXt1mXt+eKJ3eXSce353n6esouDMysf/o7eq/kOdeP92uZv/vuPT/9Hs4P/C4tT/eLWa+juWbv8bcEq7AAYBAF1gWn7//////f39/P//////////////////////////lcKx/3i9pf/K7OD/2O/l/7ndzf6Fw6n/VK+I/AsxHj8AAAAAXF5bf+Ln2P+AnU/4fZ1N+4WiV/yKp13+jKlh/5CsZf+GpFj/Zpxh/4C5nf+i0L7+k8ex/1udf+UTOCZFAAAAAAEBAQJfYF5/3uXR/16IIPxciiH/Z5Iv/26YOP9ymz3/cpw+/3OcPf9wlzb/YI80/1mKNPu707X/YmZjiAAAAAAEBAQGAAAAAF9gXoDg5tT/cJU6/HGaPf9/pE3/hqtX/4uvXf+NsF7/iKxZ/4KoU/9+o0r/cpY6+9zjyf9ubm2JAAAAAAMEAwQAAAAAX2BegODm1P94nEX8e6JJ/4quXP+Vt2n/nb1z/6LBef+jwXz/ob96/527d/+NrGP71+HG/2praogAAAAABAQDBAAAAABfYF2A4ObU/4WlVvyPsmP/osB7/7HMj/+81J3/wdik/8DXo/+60pz/tc6X/6G6ffvY4sf/amtqiAAAAAAEBAMEAAAAAF9gXn/e5dL/n7l7/LLMk//B16X/zuG2/9jpwv/b68b/2enE/9Pkvv/Q4bv/uMud+9jhyP9qa2mHAAAAAAQEAwQAAAAAX2Bef97k0v+gt335sceT/LrNnfzC1Kj8ydmx/MzatfzK2bP8xtav/MbVr/ywwpL41+HH/2tsaokAAAAABAQDBAAAAABZW1Z3+fz1/+Dm1Pzj6db/5u3b/+nv3v/r8eD/6vDe/+ft2//k69j/4efT/9ngzPv7//b/ZGdhfwAAAAADBAMEAAAAABcZFRpZW1Z6YGFfgWBiYIBhYmGAYmJhgGJjYoBiY2KAYmJhgGFiYYBgYWCAX2BegF1fWoAbHRkeAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%27%3B%20break%3B%0A%20%20%20%20%20%20%20%20case%202%3A%20icon.src%20%3D%20%27data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAAcHQAAYGGkAEBBfAAEBKAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAQEAAgICAAICAgACAgMBAQEAAAEBJAA6OrQAf3/8ALCw/gCiov8AXl7tABkZewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMAOTm7AIOD/wCjo/0A1tb9AOHh/gCcnP4AY2P/ABISZwAAAAAAAAAAAAEBAQAAAAAAGBgTACgoLwAmJjEAJiYnADIyXgBWVv8Adnb8AJ2d/gCxsf8Aycn/AJeX+wBycv8ASkrGAAACAAABAQMABwcbAAAADwBfX34A+fn/AOHh/ADj4/8AoaH/AFJS/gB1df8Aq6v/ALm5/wDT0/8Ap6f+AHNz/wBeXu0AFRUdAAAAAAABAQEAAAABAAUFEQCjo7YAzs72ANnZ/wCfn/4AY2P/AHl5/wCzs/8A5ub/ALu7/wCcnP4AcHD/AFNT7AAVFRwAICAmAHd3mQB6eqIAdXWcAHl5nwClpeAAyMj/AK2t/gB9ff8An5//ANXV/wDh4f8A1tb/AJ6e+gB0dP8AUFC7AAEGAABcXH4A////AP39/AD///8A////AP///wD///8A////ALOz/wCnp/8A4eH/AObm/wDPz/4ArKz/AI2N/AAhIT8AAAAAAFxcfwDd3f8Aa2v4AGpq+wBycvwAeHj+AHt7/wB/f/8Ac3P/AHNz/wCiov8AwMD+ALS0/wCEhOUAKSlFAAAAAAABAQIAXl5/ANjY/wBGRvwARkb/AFJS/wBaWv8AX1//AF9f/wBfX/8AWVn/AFRU/wBRUfsAvr7/AGNjiAAAAAAABAQGAAAAAABeXoAA2tr/AFtb/ABeXv8AbGz/AHV1/wB6ev8Ae3v/AHd3/wBxcf8Aamr/AFtb+wDS0v8AbW2JAAAAAAADAwQAAAAAAF5egADa2v8AZGT8AGlp/wB5ef8AhYX/AI2N/wCTk/8AlJT/AJKS/wCPj/8AfX37AM/P/wBqaogAAAAAAAMDBAAAAAAAXl6AANra/wBycvwAf3//AJOT/wClpf8AsLD/ALa2/wC1tf8Ar6//AKqq/wCTk/sA0ND/AGpqiAAAAAAAAwMEAAAAAABeXn8A2dn/AJGR/ACnp/8At7f/AMXF/wDQ0P8A09P/ANHR/wDLy/8AyMj/AK2t+wDR0f8AaWmHAAAAAAADAwQAAAAAAF5efwDY2P8AkpL5AKWl/ACurvwAuLj8AL+//ADCwvwAwMD8AL29/AC8vPwAo6P4ANDQ/wBqaokAAAAAAAMDBAAAAAAAV1d3APf3/wDa2vwA3d3/AOHh/wDk5P8A5ub/AOTk/wDh4f8A39//ANra/wDT0/sA+fn/AGNjfwAAAAAAAwMEAAAAAAAWFhoAV1d6AF9fgQBgYIAAYWGAAGFhgABiYoAAYmKAAGFhgABhYYAAYGCAAF5egABbW4AAGhoeAAAAAAABAQEAAAAA/oOAQeEAgEH6AIBBoACAQQAAAEGAAABBAACAQQAAgEEAAQBBAAKAQQACgEEAAoBBAAKAQQACgEEAAoBBAAKAQQACgEE%3D%27%3B%20break%3B%0A%20%20%20%20%20%20%20%20default%3A%20icon.src%20%3D%20self.image%3B%0A%20%20%20%20%7D%0A%7D%0AtoggleImage%28%29%3B%0AServices.prefs.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28%28%29%20%3D%3E%20Services.prefs.removeObserver%28s%2C%20toggleImage%29%29%3B%0A%0A%0A//%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u043D%u0430%20%u0440%u0435%u0436%u0438%u043C%20%27%u0411%u0435%u0437%20%u043F%u0440%u043E%u043A%u0441%u0438%27%20%u043F%u0440%u0438%20%u0437%u0430%u043A%u0440%u044B%u0442%u0438%u0438%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%20%u0435%u0441%u043B%u0438%20%u044D%u0442%u043E%20%u0440%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u043E%20%u0432%20%27about%3Aconfig%27%20...................%0Avar%20toggleButton%20%3D%20%7B%0A%20%20%20%20observe%28s%2C%20t%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20%20cbu.getPrefs%28%22CB.Proxy.reset%22%29%20%26%26%20data%20%3D%3D%20%22shutdown%22%20%26%26%20cbu.setPrefs%28%22network.proxy.type%22%2C%200%29%3B%0A%20%20%20%20%7D%0A%7D%3B%0AServices.obs.addObserver%28toggleButton%2C%20%22quit-application%22%2C%20false%29%3B%0A%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0435%u043C%20%u043C%u0435%u043D%u044E%20%u0434%u043B%u044F%20%u0434%u043E%u0431%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u043F%u0440%u043E%u043A%u0441%u0438%20%u0432%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043D%u043E%u043C%20%u043C%u0435%u043D%u044E%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0433%u043E%20%u0442%u0435%u043A%u0441%u0442%u0430%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%20...................%0Avar%20contextMenu%20%3D%20document.getElementById%28%22contentAreaContextMenu%22%29%3B%0Avar%20menuitem%20%3D%20document.createElementNS%28xulns%2C%22menuitem%22%29%3B%0Amenuitem.setAttribute%28%22label%22%2C%20%22%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u043F%u0440%u043E%u043A%u0441%u0438%22%29%3B%0Amenuitem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%22%29%3B%0Amenuitem.setAttribute%28%22image%22%2C%20self.image%29%3B%0Amenuitem.onclick%20%3D%28%29%3D%3E%20addNewProxy%28menuitem%29%3B%0AcontextMenu.appendChild%28menuitem%29%3B%20//%20%u043A%u0430%u043A%20%u043F%u043E%u0441%u043B%u0435%u0434%u043D%u0438%u0439%20%u043F%u0443%u043D%u043A%u0442%20%u043C%u0435%u043D%u044E%0AaddDestructor%28%28%29%20%3D%3E%20menuitem.remove%28%29%29%3B%0AaddEventListener%28%22popupshowing%22%2C%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20menuitem.hidden%20%3D%20%21cbu.getPrefs%28%22CB.Proxy.inContextMenu%22%29%20%7C%7C%20%21gContextMenu.isContentSelected%3B%20//%20%21gContextMenu.isTextSelected%3B%0A%7D%2C%20false%2C%20contextMenu%29%3B%0A%0A%0A//%20%u0434%u043E%u0431%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u043F%u0440%u043E%u043A%u0441%u0438%20...................%0Afunction%20addNewProxy%28menuitem%29%20%7B%0A%20%20%20%20var%20sel%20%3D%20gBrowser.contentDocument%0A%20%20%20%20%20%20%20%20%3F%20gBrowser.contentDocument.defaultView.getSelection%28%29.toString%28%29%20//%20Pale%20Moon%20%20%0A%20%20%20%20%20%20%20%20%3A%20gContextMenu.selectionInfo.fullText%3B%20//%20Firefox%0A%0A%20%20%20%20sel%20%3D%20sel.replace%28/%5E%5Cs+%7C%5Cs+%24/g%2C%20%22%22%29%3B%20//%20%u0443%u0434%u0430%u043B%u0438%u0442%u044C%20%u043F%u0440%u043E%u0431%u0435%u043B%u044B%2C%20%u0441%u043B%u0435%u0432%u0430%20%u0438%20%u0441%u043F%u0440%u0430%u0432%u0430%20%u043E%u0442%20%u0441%u0442%u0440%u043E%u043A%u0438%0A%20%20%20%20sel%20%3D%20sel.replace%28/%5Cs+/g%2C%20%22%3A%22%29%3B%20%20%20%20%20%20//%20%u0437%u0430%u043C%u0435%u043D%u0438%u0442%u044C%20%u043F%u0440%u043E%u0431%u0435%u043B%u044B%20%u0432%u043D%u0443%u0442%u0440%u0438%20%u0441%u0442%u0440%u043E%u043A%u0438%0A%0A%20%20%20%20//%20%u0435%u0441%u043B%u0438%20%u0442%u043E%u043B%u044C%u043A%u043E%20%u043F%u043E%u0440%u0442%20...%0A%20%20%20%20if%20%28sel.length%20%3C%206%20%26%26%20isFinite%28sel%29%29%20%7B%20%0A%20%20%20%20%20%20%20%20var%20lab%20%3D%20%27%u043F%u043E%u0440%u0442%27%3B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22network.proxy.http_port%22%2C%20+sel%29%3B%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%7D%0A%0A%20%20%20%20//%20%u0435%u0441%u043B%u0438%20%u0442%u043E%u043B%u044C%u043A%u043E%20%u0430%u0434%u0440%u0435%u0441%20...%0A%20%20%20%20if%20%28sel.length%20%3E%205%20%26%26%20%21/%3A/.test%28sel%29%20%26%26%20sel.split%28%22.%22%29.length%20%3D%3D%204%29%20%7B%0A%20%20%20%20%20%20%20%20var%20lab%20%3D%20%27%u0430%u0434%u0440%u0435%u0441%27%3B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22network.proxy.http%22%2C%20convertFromUnicode%28%22UTF-8%22%2C%20sel%29%29%3B%20%20%0A%20%20%20%20%7D%0A%0A%20%20%20%20//%20%u0435%u0441%u043B%u0438%20%u0430%u0434%u0440%u0435%u0441%20%u0438%20%u043F%u043E%u0440%u0442%20...%20%20%20%20%0A%20%20%20%20if%20%28sel.length%20%3E%205%20%26%26%20/%3A/.test%28sel%29%20%26%26%20sel.split%28%22%3A%22%29.length%20%3D%3D%202%20%26%26%20sel.split%28%22.%22%29.length%20%3D%3D%204%29%20%7B%0A%20%20%20%20%20%20%20%20var%20lab%20%3D%20%27%u0430%u0434%u0440%u0435%u0441%20%u0438%20%u043F%u043E%u0440%u0442%27%3B%0A%20%20%20%20%20%20%20%20var%20arr%20%3D%20sel.split%28%22%3A%22%29%2C%20IP%20%3D%20arr%5B0%5D%2C%20port%20%3D%20arr%5B1%5D%3B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22network.proxy.http_port%22%2C%20+port%29%3B%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22network.proxy.http%22%2C%20convertFromUnicode%28%22UTF-8%22%2C%20IP%29%29%3B%0A%20%20%20%20%7D%0A%0A%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%u0440%u044F%u0434%u043E%u043C%20%u0441%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u043C%20%u0442%u0435%u043A%u0441%u0442%u043E%u043C%20...%0A%20%20%20%20var%20mainPopupSet%20%3D%20document.getElementById%28%27mainPopupSet%27%29%3B%0A%20%20%20%20var%20tooltip%20%3D%20mainPopupSet.appendChild%28document.createElementNS%28xulns%2C%22tooltip%22%29%29%3B%0A%20%20%20%20tooltip.style.cssText%20%3D%20%22color%3A%20red%20%21important%3B%20font-weight%3A%20bold%20%21important%3B%20font-size%3A%2014px%20%21important%3B%20-moz-box-orient%3A%20horizontal%3B%20text-align%3A%20center%3B%22%3B%0A%0A%20%20%20%20var%20image%20%3D%20tooltip.appendChild%28document.createElementNS%28xulns%2C%20%22image%22%29%29%3B%0A%20%20%20%20image.setAttribute%28%22src%22%2C%20self.image%29%3B%0A%0A%20%20%20%20var%20label%20%3D%20tooltip.appendChild%28document.createElementNS%28xulns%2C%20%22label%22%29%29%3B%0A%20%20%20%20label.setAttribute%28%22value%22%2C%20%22%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%20%22%20+%20lab%20+%20%22%20%u043F%u0440%u043E%u043A%u0441%u0438%3A%20%22%20+%20sel%29%3B%0A%0A%20%20%20%20tooltip.openPopup%28menuitem.parentNode%2C%20%22before_start%22%29%3B%0A%20%20%20%20setTimeout%28%28%29%20%3D%3E%20mainPopupSet.removeChild%28tooltip%29%2C%203000%29%3B%0A%7D%3B%0A%0A%0A//%20%u041A%u043E%u043D%u0432%u0435%u0440%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20%u044E%u043D%u0438%u043A%u043E%u0434%20.............%20%20%0Afunction%20convertFromUnicode%28charset%2C%20str%29%20%7B%0A%20%20%20%20var%20converter%20%3D%20Cc%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.createInstance%28Ci.nsIScriptableUnicodeConverter%29%3B%0A%20%20%20%20converter.charset%20%3D%20charset%3B%0A%20%20%20%20str%20%3D%20converter.ConvertFromUnicode%28str%29%3B%0A%20%20%20%20return%20str%20+%20converter.Finish%28%29%3B%0A%7D%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

Отсутствует

 

№1493106-08-2020 09:16:14

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2144
UA: Firefox 52.0

Re: Custom Buttons

egorsemenov06 пишет

Можно Вас попросить пожалуйста сделать для user_chrome_files кнопку Proxy

Разве что отдельным файлом.
Инициализацию в Proxy.js, а в custom_script.js

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

Выделить код

Код:

try {CustomizableUI.createWidget({
	label: "Proxy",
	image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAAYOQAAWJ2kADh1fAAAEKAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgICAgICAgICAgMBAQEAAAEEJBE4ULQ+fZ38ea/H/muhuv8gW3ztAxclewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMLNlO7PH+n/3Sgu/281eP9zuHr/mWZuP4XXon/ABAeZwAAAAAAAAAAAQEBAQAAAAAZGBoTKScsLyYkKjErJSgnIC8/XgZQgP9BcZb8b5q3/oiux/+qx9r/a5Ow+zFtlv8PRWrGAAACAAEBAQMHBwcbAAAAD2BeYn769/3/4eDm/Onh5v+DnrX/A0t9/j1vlv+FqMH/lrfN/7rS4f9+pL3+M26X/xJYhu0DEiMdAAAAAAEBAQEAAAABBgUGEaSiprbPzNP239fb/4OcsP4aXYr/RHOZ/5Gwx//T5e//mrjO/3KYtv40apP/D0x77AUTIhwhHyMmeXV7mXt4fqJ3dHmce3d+n6eirODMx8r/o6q3/kN4nf92m7n/vtPj/9Hg7P/C1OL/eJq1+jtulv8bSnC7AAEGAF1aYH7//////f39/P//////////////////////////lbHC/3ilvf/K4Oz/2OXv/7nN3f6FqcP/VIiv/AseMT8AAAAAXFtef+LY5/+AT534fU2d+4VXovyKXaf+jGGp/5BlrP+GWKT/ZmGc/4Cduf+ivtD+k7HH/1t/neUTJjhFAAAAAAEBAQJfXmB/3tHl/14giPxcIYr/Zy+S/244mP9yPZv/cj6c/3M9nP9wNpf/YDSP/1k0ivu7tdP/YmNmiAAAAAAEBAQGAAAAAF9eYIDg1Ob/cDqV/HE9mv9/TaT/hler/4tdr/+NXrD/iFms/4JTqP9+SqP/cjqW+9zJ4/9ubW6JAAAAAAMDBAQAAAAAX15ggODU5v94RZz8e0mi/4pcrv+Vabf/nXO9/6J5wf+jfMH/oXq//513u/+NY6z718bh/2pqa4gAAAAABAMEBAAAAABfXWCA4NTm/4VWpfyPY7L/onvA/7GPzP+8ndT/waTY/8Cj1/+6nNL/tZfO/6F9uvvYx+L/ampriAAAAAAEAwQEAAAAAF9eYH/e0uX/n3u5/LKTzP/Bpdf/zrbh/9jC6f/bxuv/2cTp/9O+5P/Qu+H/uJ3L+9jI4f9qaWuHAAAAAAQDBAQAAAAAX15gf97S5P+gfbf5sZPH/LqdzfzCqNT8ybHZ/My12vzKs9n8xq/W/Mav1fywksL418fh/2tqbIkAAAAABAMEBAAAAABZVlt3+fX8/+DU5vzj1un/5tvt/+ne7//r4PH/6t7w/+fb7f/k2Ov/4dPn/9nM4Pv79v//ZGFnfwAAAAADAwQEAAAAABcVGRpZVlt6YF9hgWBgYoBhYWKAYmFigGJiY4BiYmOAYmFigGFhYoBgYGGAX15ggF1aX4AbGR0eAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
	id: "ucf-cbbtn-Proxy",
	localized: false,
	get initCode() {
		delete this.initCode;
		return this.initCode = Cu.readUTF8URI(Services.io.newURI(
			"chrome://user_chrome_files/content/custom_scripts/Proxy.js"
		));
	},
	cbu: {
		128: "Bool", boolean: "Bool",
		64: "Int", number: "Int",
		32: "String", string: "String",

		getPrefs(pref) {
			try {return Services.prefs[`get${
					this[Services.prefs.getPrefType(pref)]
			}Pref`](pref);}
			catch {return null;}
		},
		setPrefs(pref, val) {
			Services.prefs[`set${this[typeof val]}Pref`](pref, val);
		}
	},
	addDestructor(destructor, context) {
		this._destructors.push({destructor, context});
	},
	addEventListener(...args) {
		var trg = args[3];
		if (!trg) trg = args[3] = this.ownerGlobal;
		trg.addEventListener(...args);
		this._handlers.push(args);
	},
	async onCreated(btn) {
		var win = btn.ownerGlobal;
		btn._handlers = new win.Array();
		btn._destructors = new win.Array();
		win.addEventListener("unload", this, {once: true});
		await new Promise(resolve => win.requestAnimationFrame(resolve));
		btn.image = this.image;
		new win.Function(
			"self,addDestructor,cbu,addEventListener,xulns", this.initCode
		).call(
			btn, btn, this.addDestructor.bind(btn),
			this.cbu, this.addEventListener.bind(btn),
			"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
		);
	},
	handleEvent(e) {
		var btn = e.target.getElementById(this.id);
		for(var args of btn._handlers)
			args.pop().removeEventListener(...args);
		delete btn._handlers;
		for(var {destructor, context} of btn._destructors)
			try {destructor.call(context, "destructor");}
			catch(ex) {Cu.reportError(ex);}
		delete btn._destructors;
	}
});} catch(ex) {Cu.reportError(ex);}

Отсутствует

 

№1493206-08-2020 10:11:13

egorsemenov06
Участник
 
Группа: Members
Зарегистрирован: 12-06-2018
Сообщений: 381
UA: Firefox 79.0

Re: Custom Buttons

Dumby пишет
egorsemenov06 пишет

Можно Вас попросить пожалуйста сделать для user_chrome_files кнопку Proxy

Разве что отдельным файлом.
Инициализацию в Proxy.js, а в custom_script.js

Огромное СПАСИБО Вам!!!!

Отсутствует

 

№1493307-08-2020 00:14:32

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 410
UA: Firefox 56.0

Re: Custom Buttons

Dumby пишет

Вау, кнопка регистрирует в _handlers 103 (сто три!) листенера. Жесть.

Dumby, в QuickSettings всего 26 пунктов меню и 9 горячих клавиш.
Откуда лишние листенеры? Можно как-то исключить создание ненужных?
То есть, сделать, чтобы в подменюшках подставлялись значения из about:config , но без лишних addEventListener ?

Отредактировано Dobrov (07-08-2020 13:08:16)

Отсутствует

 

№1493407-08-2020 03:05:34

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 541
UA: Firefox 52.0

Re: Custom Buttons

DEL

Отредактировано unter_officer (07-08-2020 04:06:30)


«The Truth Is Out There»

Отсутствует

 

№1493507-08-2020 13:53:13

Duche
Участник
 
Группа: Members
Зарегистрирован: 07-02-2016
Сообщений: 208
UA: unknown 0.0

Re: Custom Buttons

Добрый день. Посмотрите пожалуйста, может у кого ест в закромах кнопка  "Восстановить закрытую вкладку", сколько нажатий на кнопку  столько "восстановленный" , по порядку  закрытия , начиная с первой ,штук 8 вкладок. Заранее спасибо.

Отредактировано Duche (07-08-2020 13:54:31)

Отсутствует

 

№1493607-08-2020 14:01:10

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 541
UA: Firefox 52.0

Re: Custom Buttons

Duche.

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

Выделить код

Код:

/*Initialization Code*/

this.onclick = function(e) {
  if ( e.button == 0 ) {
    e.preventDefault();
    undoCloseTab();
  }
};


«The Truth Is Out There»

Отсутствует

 

№1493707-08-2020 14:06:19

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2144
UA: Firefox 52.0

Re: Custom Buttons

Dobrov пишет

Смотрю капс-V опечатка не исправлена.
Почему? Я что-то непонятное написал?

Откуда лишние листенеры?

Что значит откуда? Так сделано.
Да, 26 пунктов меню (плюс 7 сепараторов) каждый из которых
рождён функцией CreateMenu, которая регистрирует в _handlers
по три листенера на события command, popupshowing, contextmenu.
Уже 99, мало что ли?

Можно как-то исключить создание ненужных?
То есть, сделать, чтобы в подменюшках подставлялись значения из about:config , но без лишних addEventListener ?

Разумеется можно. Один обработчик на кнопку, регистрация
на эти три события, обработка событий в зависимости от target.
Но так перелопатить этот комбайн наверно непросто.


P.S. Заметил в кнопке интригующий комментарий:
«ЗАДАЧА 2: невозможно создать подменю с произвольными строками: меню > checkbox1, checkbox2, разделитель, radio1, radio2»
Никакая конечно не задача, а просто утверждение, однако
не отказался бы посмотреть какой-нибудь синтетический
отдельный демо-код, его доказывающий, а то, со стороны,
в таком виде, утверждение выглядит абсурдно.

Отсутствует

 

№1493807-08-2020 15:33:21

Duche
Участник
 
Группа: Members
Зарегистрирован: 07-02-2016
Сообщений: 208
UA: unknown 0.0

Re: Custom Buttons

unter_officer пишет

unter_officer

Спасибо большое , то, что надо.

Отсутствует

 

№1493908-08-2020 08:55:11

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 56.0

Re: Custom Buttons

приветствую,
пожалуйста, помогите подправить код.
нужно, чтобы при нажатии не было запроса где сохранить, а сразу сохранялось на рабочий стол ( C:\\Users\\USER\\Desktop\\)
и появлялось сообщение в углу - Страница сохранена на Рабочем столе.
спасибо

код кнопки Save snapshot to html

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

Выделить код

Код:

var saveToFile = function (fileContent, fileName) {
    var uc = Components.classes['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
    uc.charset = 'utf-8';
    fileContent = uc.ConvertFromUnicode(fileContent);

    var nsIFilePicker = Components.interfaces.nsIFilePicker;
    var fp = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
    fp.init(window, '', fp.modeSave);
    fp.defaultString = fileName;
    fp.appendFilters(fp.filterHTML);
    fp.appendFilters(fp.filterAll);
    if(fp.show() == fp.returnCancel) return;
    var stream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
    stream.init(fp.file, 0x02|0x20|0x08, 0666, 0);
    stream.write(fileContent, fileContent.length);
    stream.close();
};
var resolveURL = function (url, base) {
    try {
        var ioService = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService);
        var baseURI = ioService.newURI(base, null, null);
        var absURI = ioService.newURI(url, null, baseURI);
        return absURI.spec;
    } catch (e) {}
};

var getSelWin = function (w) {
    if (w.getSelection().toString()) return w;
    for (var i = 0, f, r; f = w.frames[i]; i++) {
        try {
            if (r = getSelWin(f)) return r;
        } catch(e) {}
    }
};
var encodeImg = function (src, obj) {
    var canvas, img, ret = src;
    if (/^https?:\/\//.test(src)) {
        canvas = doc.createElement('canvas');
        if (!obj || obj.nodeName.toLowerCase() != 'img') {
            img = doc.createElement('img');
            img.src = src;
        } else {
            img = obj;
        };
        if (img.complete) try{
            canvas.width = img.width;
            canvas.height = img.height;
            canvas.getContext('2d').drawImage(img, 0, 0);
            ret = canvas.toDataURL((/\.jpe?g/i.test(src) ? 'image/jpeg' : 'image/png'));
        } catch (e) {};
        if (img != obj) img.src = 'about:blank';
    };
    return ret;
};
var toSrc = function (obj) {
    var strToSrc = function (str) {
        var chr, ret = '', i = 0, meta = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '\x22' : '\\\x22', '\\': '\\\\'};
        while (chr = str.charAt(i++)) {
            ret += meta[chr] || chr;
        };
        return '\x22' + ret + '\x22';
    },
    arrToSrc = function (arr) {
        var ret = [];
        for (var i = 0; i < arr.length; i++) {
            ret[i] = toSrc(arr[i]) || 'null';
        };
        return '[' + ret.join(',') + ']';
    },
    objToSrc = function (obj) {
        var val, ret = [];
        for (var prop in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, prop) && (val = toSrc(obj[prop]))) ret.push(strToSrc(prop) + ': ' + val);
        };
        return '{' + ret.join(',') + '}';
    };

    switch (Object.prototype.toString.call(obj).slice(8, -1)) {
        case 'Array': return arrToSrc(obj);
        case 'Boolean':
        case 'Function':
        case 'RegExp': return obj.toString();
        case 'Date': return 'new Date(' + obj.getTime() + ')';
        case 'Math': return 'Math';
        case 'Number': return isFinite(obj) ? String(obj) : 'null';
        case 'Object': return objToSrc(obj);
        case 'String': return strToSrc(obj);
        default: return obj ? (obj.nodeType == 1 && obj.id ? 'document.getElementById(' + strToSrc(obj.id) + ')' : '{}') : 'null';
    }
};

var mainWin = document.commandDispatcher.focusedWindow.top == content ? document.commandDispatcher.focusedWindow : content;
var selWin = getSelWin(mainWin), win = selWin || mainWin, doc = win.document, loc = win.location;
var ele, pEle, clone, reUrl = /(url\(\x22)(.+?)(\x22\))/g;

if (selWin) {
    var rng = win.getSelection().getRangeAt(0);
    pEle = rng.commonAncestorContainer;
    ele = rng.cloneContents();
} else {
    pEle = doc.documentElement;
    ele = (doc.body || doc.getElementsByTagName('body')[0]).cloneNode(true);
};
while (pEle) {
    if (pEle.nodeType == 1) {
        clone = pEle.cloneNode(false);
        clone.appendChild(ele);
        ele = clone;
    };
    pEle = pEle.parentNode
};
var sel = doc.createElement('div');
sel.appendChild(ele);

for (var el, all = sel.getElementsByTagName('*'), i = all.length; i--;) {
    el = all[i];
    if (el.style && el.style.backgroundImage) el.style.backgroundImage = el.style.backgroundImage.replace(reUrl, function (a, prev, url, next) {
        if (!/^[a-z]+:/.test(url)) url = resolveURL(url, loc.href);
        return prev + encodeImg(url) + next;
    });
    switch (el.nodeName.toLowerCase()) {
        case 'link':
        case 'style':
        case 'script': el.parentNode.removeChild(el); break;
        case 'a': 
        case 'area': if (el.hasAttribute('href') && el.getAttribute('href').charAt(0) != '#') el.href = el.href; break;
        case 'img':
        case 'input': if (el.hasAttribute('src')) el.src = encodeImg(el.src, el); break;
        case 'audio':
        case 'video':
        case 'embed':
        case 'frame':
        case 'iframe': if (el.hasAttribute('src')) el.src = el.src; break;
        case 'object': if (el.hasAttribute('data')) el.data = el.data; break;
        case 'form': if (el.hasAttribute('action')) el.action = el.action; break;
    }
};

var head = ele.insertBefore(doc.createElement('head'), ele.firstChild);
var meta = doc.createElement('meta');
meta.httpEquiv = 'content-type';
meta.content = 'text/html; charset=utf-8';
head.appendChild(meta);
var title = doc.getElementsByTagName('title')[0];
if (title) head.appendChild(title.cloneNode(true));

head.copyScript = function (unsafeWin) {
    if ('$' in unsafeWin) return;
    var f = doc.createElement('iframe');
    f.src = 'about:blank';
    f.setAttribute('style', 'position:fixed;left:0;top:0;visibility:hidden;width:0;height:0;');
    doc.documentElement.appendChild(f);
    var str, script = doc.createElement('script');
    script.type = 'text/javascript';
    for (var name in unsafeWin) {
        if (name in f.contentWindow || !/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name)) continue;
        try {
            str = toSrc(unsafeWin[name]);
            if (!/\{\s*\[native code\]\s*\}/.test(str)) {
                script.appendChild(doc.createTextNode('var ' + name + ' = ' + str.replace(/<\/(script>)/ig, '<\\/$1') + ';\n'));
            }
        } catch (e) {};
    };
    f.parentNode.removeChild(f);
    if (script.childNodes.length) this.nextSibling.appendChild(script);
};
head.copyScript(win.wrappedJSObject || win);

head.copyStyle = function (s) {
    if (!s) return;
    var style = doc.createElement('style');
    style.type = 'text/css';
    if (s.media && s.media.mediaText) style.media = s.media.mediaText;
    try {
        for (var i = 0, rule; rule = s.cssRules[i]; i++) {
            if (rule.type != 3) {
                if((!rule.selectorText || rule.selectorText.indexOf(':') != -1) || (!sel.querySelector || sel.querySelector(rule.selectorText))) {
                    var css = !rule.cssText ? '' : rule.cssText.replace(reUrl, function (a, prev, url, next) {
                        if (!/^[a-z]+:/.test(url)) url = resolveURL(url, s.href || loc.href);
                        if(rule.type == 1 && rule.style && rule.style.backgroundImage) url = encodeImg(url);
                        return prev + url + next;
                    });
                    style.appendChild(doc.createTextNode(css + '\n'));
                }
            } else {
                this.copyStyle(rule.styleSheet);
            }
        }
    } catch(e) {
        if (s.ownerNode) style = s.ownerNode.cloneNode(false);
    };
    this.appendChild(style);
};
var sheets = doc.styleSheets;
for (var j = 0; j < sheets.length; j++) head.copyStyle(sheets[j]);
head.appendChild(doc.createTextNode('\n'));

var doctype = '', dt = doc.doctype;
if (dt && dt.name) {
    doctype += '<!DOCTYPE ' + dt.name;
    if (dt.publicId) doctype += ' PUBLIC \x22' + dt.publicId + '\x22';
    if (dt.systemId) doctype += ' \x22' + dt.systemId + '\x22';
    doctype += '>\n';
};
var fileName = selWin ? win.getSelection().toString() : (title && title.text ? title.text : loc.pathname.split('/').pop());
fileName = fileName.replace(/[:\\\/<>?*|"]+/g, '_').replace(/\s+/g, ' ').slice(0, 100).replace(/^\s+|\s+$/g, '');
fileName += ("  " + new Date().toLocaleFormat("%d.%m.%Y. %H:%M:%S"));
if(!/\.html?$/.test(fileName))fileName += '.html';

saveToFile(doctype + sel.innerHTML + '\n<!-- This document saved from ' + (loc.protocol != 'data:' ? loc.href : 'data:uri') + ' -->', fileName);

Отсутствует

 

№1494008-08-2020 13:09:39

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 410
UA: Firefox 56.0

Re: Custom Buttons

Dumby вопрос по кнопке QuickSettings :
Как вам задача сделать аналог, но работающий и на CustomButtons и (или) на скриптах от Виталия (профиль/chrome/user_chrome_files/)
Преимущества такой кнопки, открывающей меню настроек:
1) наглядно видны множество важных режимов работы браузера (нажатием на кнопку)
2) очень легко можно переключать настройки, например, загрузку графики, серверы VPN, юзер-агенты…
3) можно создать несколько виртуальных пунктов меню, переключающих несколько настроек. Это будут «профили» настроек.
3) можно открывать разные меню: Левая кнопка: основные настройки, Правая: системные (колёсико: внешний вид ?)


Dumby пишет

Смотрю капс-V опечатка не исправлена. Почему?

У себя я исправил сразу, но не вижу смысла выкладывать такие незначительные изменения…

Отредактировано Dobrov (09-08-2020 00:26:02)

Отсутствует

 

№1494108-08-2020 17:40:37

Duche
Участник
 
Группа: Members
Зарегистрирован: 07-02-2016
Сообщений: 208
UA: unknown 0.0

Re: Custom Buttons

Добрый день. Посмотрите пожалуйста два кода для FF710"Удалить активную вкладку из папки закладок" и " Удалить куки текущего сайта в контекстном меню на странице" для контекстного меню.

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

Выделить код

Код:

//Удалить активную вкладку из папки........................................
   
 (()=> {  
   ((popup, menugroup, bs) => addEventListener("popupshowing", {
    handleEvent(e) {
        if (this.shouldHide()) return;
        var before = popup.children[1];
        //var before = popup.querySelector("#page-menu-separator + *");  Строка ниже..........................
        var menuitem = popup.insertBefore(document.createElement("menuitem"), before);
        addDestructor(() => menuitem.remove());
        var attrs = {
            label: "Удалить эту страницу из закладок",
            class: "menuitem-iconic",
            oncommand: "removeBookmarks();"
        };
        for(var attr in attrs) menuitem.setAttribute(attr, attrs[attr]);

        var crop = (str, limit = 100) => str.length <= limit ? str : str.slice(0, limit) + "…";
        var notify = (num, msg) => {
            var forms = gNavigatorBundle.getString("editBookmark.removeBookmarks.label").replace(/ть/g, "л");
            (notify = (num, msg) => openDialog(
                "chrome://global/content/alerts/alert.xul", "", "popup=yes", menuitem.image,
                PluralForm.get(num, forms).replace("#1", num), msg, false, null, 4
            ))(num, msg);
        }
        menuitem.removeBookmarks = () => {
            var msg = crop(gBrowser.currentURI.spec) + "\n\n\Из:\n", num = 0;
            for(var id of this.ids) {
                var folder = bs.getFolderIdForItem(id);
                if (bs.getFolderIdForItem(folder) == PlacesUtils.tagsFolderId) continue;
                bs.removeItem(id);
                num++; msg += "\n" + (bs.getItemTitle(folder) || "[Безымянная папка]");
            }
            gBrowser.removeCurrentTab();
            notify(num, msg);
        }
        (this.handleEvent = () => {
            if ((menuitem.hidden = this.shouldHide())) return;
            var icon = gBrowser.selectedBrowser.mIconURL;
            menuitem.image = icon ? "moz-anno:favicon:" + icon : PlacesUtils.favicons.defaultFavicon.spec;
        })();
    },
    shouldHide(e) {
        if (menugroup.hidden) return true;
        var ids = bs.getBookmarkIdsForURI(gBrowser.currentURI);
        if (!ids.length) return true;
        this.ids = ids;
    }
}, false, popup))(
    document.getElementById("contentAreaContextMenu"),
    document.getElementById("context-navigation"), PlacesUtils.bookmarks
);
})();


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

Выделить код

Код:

// Удалить куки текущего сайта в контекстном меню на странице, от 06.03.2017. ................
  
 (()=> {
(contextMenu=> {
   var menu = contextMenu.appendChild(document.createElement("menu"));
   menu.id = "content-removeCookies."
   menu.setAttribute("label", "Удалить куки текущего сайта");
   menu.setAttribute("class", "menu-iconic");
   addEventListener("popupshowing", ()=> menu.setAttribute("image", gBrowser.mCurrentTab.image), false, contextMenu);
   addDestructor(()=> menu.remove() );
   
   var menuPopup = menu.appendChild(document.createElement("menupopup"));
   var menuitem = menuPopup.appendChild(document.createElement("menuitem"));               
   menuitem.setAttribute("label", "Удалить");
   menuitem.onclick =()=> {
      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();
      
      var host = content.document.domain;
      for( var tab of gBrowser.tabs ) {  
           var tabHost = tab.linkedBrowser.contentDocument.location.host;
           if ( host == tabHost ) gBrowser.reloadTab(tab);
           }
          
      // очистить кэш ....
      try { 
          Services.cache.evictEntries(1);
          Services.cache.evictEntries(2);
          } 
      catch(e) { Services.cache2.clear() };
   
      // удалить все 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);
      dir.exists() && dir.remove(true);                      // Удалить Flash кукисы222 ....
      !dir.exists() && dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);
   
      // Всплывающее сообщение ....
      var win = openDialog("chrome://global/content/alerts/alert.xul", "", "popup=yes", (gBrowser.mCurrentTab.image || "chrome://global/skin/icons/Portrait.png"),
           "", "Очистил куки, кеш текущего сайта и удалил Flash куки", false, null, 4);
      setTimeout(()=> win && win.close(), 2500);          
  };
})(document.getElementById("contentAreaContextMenu"));
})();

Отредактировано Duche (08-08-2020 17:41:08)

Отсутствует

 

№1494210-08-2020 14:17:30

Duche
Участник
 
Группа: Members
Зарегистрирован: 07-02-2016
Сообщений: 208
UA: unknown 0.0

Re: Custom Buttons

Добрый день. Посмотрите пожалуйста. Часики работают , тут все нормально но, недавно заменил вот такое, описать нет слов , лучше посмотреть.

скрытый текст
e4a0db9572ca.jpg

Код часы.

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

Выделить код

Код:

// Аналоговые часы, от 08.02.2016. ............... 
(()=> {
   var dia = 30; // диаметр аналоговых часов
   
   var canvas = document.createElementNS(xhtmlns, 'canvas');
   canvas.setAttribute("width", dia+"px;");
   canvas.setAttribute("height", dia+"px;");
   //canvas.style.cssText = "position: fixed !important; top: 30px; right: 218px; min-width: diapx; min-height: diapx; max-width: diapx; max-height: diapx".replace(/dia/g, dia);
   canvas.style.cssText = "min-width: diapx; min-height: diapx; max-width: diapx; max-height: diapx".replace(/dia/g, dia);
   var ctx = canvas.getContext("2d");
   ctx.scale(dia/122, dia/122);
   self.parentNode.insertBefore(canvas, self);
   addDestructor(()=> canvas.remove() );
   
   self.hidden = true;
   canvas.onclick =()=> self.hidden = !self.hidden;
 

      var interval = setInterval(()=> {
      var ctx = canvas.getContext("2d");
      ctx.save();
      ctx.clearRect(0, 0, 150, 150);
      ctx.translate(61, 61);
      ctx.scale (0.4, 0.4);
      ctx.fillStyle = "white";
      ctx.arc(0, 0, 142, 0, Math. PI * 2, true);
      ctx.fill();
      ctx.rotate(-Math. PI / 2);
      ctx.strokeStyle = "black";
      ctx.fillStyle = "white";
      ctx.lineWidth = 12;
      ctx.lineCap = "round";
      ctx.save();
      ctx.beginPath();
      for ( var i = 0; i < 12; i++ ) {
            ctx.rotate(Math. PI / 6);
            ctx.moveTo(100, 0);
            ctx.lineTo(120, 0);
            }
      ctx.stroke();
      ctx.restore();
      ctx.save();
      ctx.lineWidth = 5;
      ctx.beginPath();
      for ( var i = 0; i < 60; i++ ) {
            if ( i % 5 != 0 ) {
                 ctx. moveTo (117, 0);
                 ctx. lineTo (120, 0);
                 }
            ctx.rotate(Math. PI / 30);
            }
      ctx.stroke();
      ctx.restore();
      var now = new Date();
      now.setHours(now.getHours() + 1);  /*на час вперёд*/
      var sec = now.getSeconds();
      var min = now.getMinutes();
      var hr = now.getHours();
      self.tooltipText = [hr, min > 9? min: "0" + min, sec > 9? sec: "0" + sec]. join (" : ");
      hr = hr >= 12? hr - 12: hr;
      ctx.fillStyle = "black";
      ctx.save();
      ctx.strokeStyle = "black";
      ctx.rotate(hr * (Math. PI / 6) + (Math. PI / 360) * min + (Math. PI / 21600) * sec)
      ctx.lineWidth = 14;
      ctx.beginPath();
      ctx.moveTo(-20, 0);
      ctx.lineTo(80, 0);
      ctx.stroke();
      ctx.restore();
      ctx.save();
      ctx.rotate((Math. PI / 30) * min + (Math. PI / 1800) * sec)
      ctx.lineWidth = 10;
      ctx.beginPath();
      ctx.moveTo(-28, 0);
      ctx.lineTo(112, 0);
      ctx.stroke();
      ctx.restore();
      ctx.save();
      ctx.rotate(sec * Math. PI / 30);
      ctx.strokeStyle = "#ee0000";
      ctx.fillStyle = "#ee0000";
      ctx.lineWidth = 6;
      ctx.beginPath();
      ctx.moveTo(-30, 0);
      ctx.lineTo(93, 0);
      ctx.stroke();
      ctx.fillStyle = "#555";
      ctx.arc(0, 0, 3, 0, Math. PI * 2, true);
      ctx.fill();
      ctx.restore();
      ctx.beginPath();
      ctx.lineWidth = 14;
      ctx.strokeStyle = '#1581e6';
      ctx.arc(0, 0, 142, 0, Math. PI * 2, true);
      ctx.stroke();
      ctx.restore();
   }, 1000);
   addDestructor(()=> clearInterval(interval) );
   
})();


Там ещё в секции код
/*CODE*/

this.leftclick(event);

Отредактировано Duche (10-08-2020 14:23:55)

Отсутствует

 

№1494310-08-2020 16:04:11

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 541
UA: Firefox 52.0

Re: Custom Buttons

Duche пишет

Добрый день. Посмотрите пожалуйста. Часики работают , тут все нормально но, недавно заменил вот такое, описать нет слов , лучше посмотреть.

Duche, не уверен, что поможет, но попробуйте перед вашим кодом часов (в инициализации) вставить это:

Выделить код

Код:

this.setAttribute("stop","true");

Отредактировано unter_officer (10-08-2020 16:25:14)


«The Truth Is Out There»

Отсутствует

 

№1494410-08-2020 16:30:58

Duche
Участник
 
Группа: Members
Зарегистрирован: 07-02-2016
Сообщений: 208
UA: unknown 0.0

Re: Custom Buttons

unter_officer пишет

не уверен, что поможет, но попробуйте

Не помогло, а жаль.

Отсутствует

 

№1494510-08-2020 18:52:35

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2144
UA: Firefox 52.0

Re: Custom Buttons

firepox пишет

пожалуйста, помогите подправить код.
нужно, чтобы при нажатии не было запроса где сохранить, а сразу сохранялось на рабочий стол ( C:\\Users\\USER\\Desktop\\)
и появлялось сообщение в углу - Страница сохранена на Рабочем столе.

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

Выделить код

Код:

var saveToFile = this.stf || (this.stf = (suc => {
	suc.charset = "utf-8";
	var as = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
	var alertName = "Save_snapshot_to_html_alert";
	var notify = as.showAlertNotification.bind(
		as, null, "Страница сохранена на Рабочем столе", null, false, null, null, alertName
	);
	var desk = Services.dirsvc.get("Desk", Ci.nsIFile);
	var fos = Components.Constructor("@mozilla.org/network/file-output-stream;1", "nsIFileOutputStream", "init");
	return (html, name) => {
		var file = desk.clone()
		file.append(name);
		html = suc.ConvertFromUnicode(html);
		var stream = new fos(file, 0x02|0x20|0x08, 0o666, 0);
		stream.write(html, html.length);
		stream.close();
		notify();
		setTimeout(as.closeAlert, 2e3, alertName);
	}
})(Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter)));

Dobrov пишет

Как вам задача сделать аналог, но работающий и на CustomButtons и (или) на скриптах от Виталия

Ну вот, смотрю добавлено «(или)», получилась бессмыслица.
Задача «сделать аналог» энтузиазма не вызывает совсем.
А вот (когда было только) это «и» — заинтересовало, решил попробовать.
Типа тяп-ляп, только переключение настроек. Вроде работает, в «и»-смысле.


Что-то форум код не переваривает, пишет «Unable to create post».
Тогда base64 адрес, для открытия во вкладке.

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

Выделить код

Код:

data:text/plain;charset=utf-8;base64,KGFzeW5jIChuYW1lLCBpZCwgZnVuYykgPT4gew0KCWlmIChuYW1lID09ICJPYmplY3QiKSByZXR1cm4gQ3VzdG9taXphYmxlVUkuY3JlYXRlV2lkZ2V0KGZ1bmMoKSk7DQoJdmFyIHdpbiA9IG5hbWUgPT0gIldpbmRvdyIsIGcgPSBDb21wb25lbnRzLnV0aWxzLmltcG9ydCgicmVzb3VyY2U6Ly9ncmUvbW9kdWxlcy9TZXJ2aWNlcy5qc20iLCB7fSk7DQoJaWYgKGdbaWRdKSB7aWYgKHdpbikgcmV0dXJuO30gZWxzZSBnW2lkXSA9IGZ1bmMoKTsNCglpZiAod2luKSByZXR1cm4gQ3VzdG9taXphYmxlVUkuY3JlYXRlV2lkZ2V0KGdbaWRdKTsNCglhZGREZXN0cnVjdG9yKHIgPT4gcls1XSA9PSAiZSIgJiYgZGVsZXRlIGdbaWRdKTsNCglnW2lkXS5vbkNyZWF0ZWQodGhpcyk7DQp9KSh0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICJRdWlja1RvZ2dsZUFib3V0Q29uZmlnU2V0dGluZ3MiLCAoKSA9PiB7DQoNCgl2YXIge3ByZWZzfSA9IFNlcnZpY2VzLCBkYiA9IHByZWZzLmdldERlZmF1bHRCcmFuY2goIiIpOw0KCXZhciBwdiA9IHBhcnNlSW50KFNlcnZpY2VzLmFwcGluZm8ucGxhdGZvcm1WZXJzaW9uKTsNCgl2YXIgeHVsX25zID0gImh0dHA6Ly93d3cubW96aWxsYS5vcmcva2V5bWFzdGVyL2dhdGVrZWVwZXIvdGhlcmUuaXMub25seS54dWwiOw0KDQoJdmFyIGxvY2FsaG9zdCA9ICIxMjcuMC4wLjEiOw0KCXZhciBhbnRpY2Vuc29yaXR5ID0gImh0dHBzOi8vZ2l0LmlvL2FjLWFudGljZW5zb3JpdHktcGFjIjsNCgl2YXIgYW50aXphcHJldCA9ICJodHRwczovL2FudGl6YXByZXQucHJvc3RvdnBuLm9yZy9wcm94eS5wYWMiOw0KCXZhciBwYWNmaWxlID0gcHJlZnMuZ2V0U3RyaW5nUHJlZigidXNlci5wYWNmaWxlIiwgImZpbGU6Ly8vZXRjL3Byb3h5LnBhYyIpOw0KCXZhciB1c2VyYWdlbnQgPSAiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNi4xOyBXT1c2NDsgcnY6NTYuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC81Ni4wIjsNCg0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KCS8vIHJlZnJlc2g6DQoJLy8JZmFsc2UgLSByZWxvYWQgY3VycmVudCB0YWINCgkvLwl0cnVlIC0gcmVsb2FkIGN1cnJlbnQgdGFiIHNraXAgY2FjaGUNCgkvLw0KCS8vIHJlc3RhcnQ6DQoJLy8JZmFsc2UgLSByZXN0YXJ0IGJyb3dzZXINCgkvLwl0cnVlIC0gcmVzdGFydCBicm93c2VyIHdpdGggY29uZmlybQ0KDQoJdmFyIHByaW1hcnkgPSBbew0KDQoJCQlwcmVmOiBbIm5ldHdvcmsucHJveHkuYXV0b2NvbmZpZ191cmwiLCAi0J/RgNC+0LrRgdC4IChWUE4pIl0sDQoJCQl1c2VyQ2hvaWNlOiBsb2NhbGhvc3QsIHJlZnJlc2g6IHRydWUsIGltYWdlOiAiY2hyb21lOi8vYnJvd3Nlci9za2luL3ByaXZhdGVicm93c2luZy9mYXZpY29uLnN2ZyIsDQoJCQl2YWx1ZXM6IFsNCgkJCQlbbG9jYWxob3N0LCAi0L7RgtC60LvRjtGH0LXQveKApiIsICIwIl0sDQoJCQkJW2FudGl6YXByZXQsICLQkNC90YLQuNCX0LDQv9GA0LXRgiIsICIxIl0sDQoJCQkJW3BhY2ZpbGUsICJ1c2VyIC5wYWMg0YTQsNC50LsiLCAiMiJdLA0KCQkJCVthbnRpY2Vuc29yaXR5LCAiYWMtYW50aWNlbnNvcml0eSIsICIzIl0sDQoJCQkJWyJsb2NhbGhvc3QiLCAiVG9yIEJyb3dzZXIiLCAiNCJdDQoJXX0sew0KCQkJcHJlZjogWyJuZXR3b3JrLnByb3h5LmF1dG9jb25maWdfdXJsIiwgItCf0YDQvtC60YHQuCAo0LzQvdC+0LPQvtGB0YLRgNC+0YfQvdCw0Y8g0L/QvtC00YHQutCw0LfQutCwKSJdLA0KCQkJdXNlckNob2ljZTogbG9jYWxob3N0LCByZWZyZXNoOiB0cnVlLCBpbWFnZTogImNocm9tZTovL2Jyb3dzZXIvc2tpbi9wcml2YXRlYnJvd3NpbmcvZmF2aWNvbi5zdmciLA0KCQkJdmFsdWVzOiBbDQoJCQkJW2xvY2FsaG9zdCwgItC+0YLQutC70Y7Rh9C10L3igKYiLCAiMCIsICLQv9C+LdGD0LzQvtC70YfQsNC90LjRjiJdLA0KCQkJCVthbnRpemFwcmV0LCAi0JDQvdGC0LjQl9Cw0L/RgNC10YIiLCAiMSIsICLQstGC0L7RgNCw0Y8g0YHRgtGA0L7QutCwIl0sDQoJCQkJW3BhY2ZpbGUsICJ1c2VyIC5wYWMg0YTQsNC50LsiLCAiMiIsICJhYm91dDpjb25maWcg4oCUIHVzZXIucGFjZmlsZSJdLA0KCQkJCVthbnRpY2Vuc29yaXR5LCAiYWMtYW50aWNlbnNvcml0eSIsICIzIiwgItCy0YLQvtGA0LDRjyDRgdGC0YDQvtC60LAiXSwNCgkJCQlbImxvY2FsaG9zdCIsICJUb3IgQnJvd3NlciIsICI0IiwgItC40YHQv9C+0LvRjNC30YPQtdGC0YHRjyDRgdC10YDQstC40YEgdG9yIl0NCgldfSx7DQoJCQlwcmVmOiBbIm5ldHdvcmsucHJveHkudHlwZSIsICJwcm94eSDQodC10YDQstC10YAiXSwNCgkJCXVzZXJDaG9pY2U6IDAsIHJlZnJlc2g6IHRydWUsDQoJCQl2YWx1ZXM6IFsNCgkJCQlbMiwgItCw0LLRgtC+0L3QsNGB0YLRgNC+0LnQutCwIiwgIjIiXSwgWzEsICLQv9C+0LvRjNC30L7QstCw0YLQtdC70YwiLCAiMSJdLA0KCQkJCVs1LCAi0YHQuNGB0YLQtdC80L3Ri9C5IiwgIjUiXSwgWzAsICLQvtGC0LrQu9GO0YfQtdC9IiwgIjAiXSwgWzQsICLigKbQtNC70Y8g0YLQtdC60YPRidC10Lkg0YHQtdGC0LgiLCAiNCJdDQoJXX0sew0KCQkJcHJlZjogWyJDQi5Qcm94eS5yZXNldCIsICLRgNC10LbQuNC8ICfQkdC10Lcg0L/RgNC+0LrRgdC4JyDQv9GA0Lgg0LLRi9GF0L7QtNC1Il0sIHVzZXJDaG9pY2U6IGZhbHNlDQoJfSwNCgkJCW51bGwsDQoJew0KCQkJcHJlZjogWyJwZXJtaXNzaW9ucy5kZWZhdWx0LmltYWdlIiwgItCX0LDQs9GA0YPQttCw0YLRjCDQs9GA0LDRhNC40LrRgyJdLA0KCQkJdXNlckNob2ljZTogMSwgcmVmcmVzaDogZmFsc2UsDQoJCQl2YWx1ZXM6IFtbMSwgItCU0LAiXSwgWzMsICJTaXRlIG9ubHkiXSwgWzIsICLQndC10YIiXV0NCgl9LHsNCgkJCXByZWY6IFsiYnJvd3Nlci5kaXNwbGF5LnVzZV9kb2N1bWVudF9mb250cyIsICLQl9Cw0LPRgNGD0LbQsNGC0Ywg0YjRgNC40YTRgtGLIFdlYiJdLA0KCQkJdmFsdWVzOiBbWzAsICLQktGL0LrQuyJdLCBbMSwgItCS0LrQuyJdXQ0KCX0sew0KCQkJcHJlZjogWyJqYXZhc2NyaXB0LmVuYWJsZWQiLCAi0JLRi9C/0L7Qu9C90Y/RgtGMINGB0LrRgNC40L/RgtGLIEphdmEiLCAiaiJdLCB1c2VyQ2hvaWNlOiB0cnVlDQoJfSx7DQoJCQlwcmVmOiBbIm1lZGlhLmF1dG9wbGF5LmVuYWJsZWQiLCAi0LDQstGC0L7Qv9GA0L7QuNCz0YDRi9Cy0LDQvdC40LUg0LzQtdC00LjQsCIsICJtIl0sIHVzZXJDaG9pY2U6IHRydWUNCgl9LHsNCgkJCXByZWY6IFsibmV0d29yay5jb29raWUuY29va2llQmVoYXZpb3IiLCAi0JrRg9C60LgiXSwgdXNlckNob2ljZTogMCwNCgkJCXZhbHVlczogWw0KCQkJCVswLCAi0KDQsNC30YDQtdGI0LjRgtGMINCy0YHQtSDRgdCw0LnRgtGLIl0sDQoJCQkJWzIsICLQl9Cw0L/RgNC10YLQuNGC0Ywg0LLRgdC1INGB0LDQudGC0YsiXSwNCgkJCQlbMywgItCh0YLQvtGA0L7QvdC90LjQtSDQv9C+0YHQtdGJ0ZHQvdC90YvQtSDRgdCw0LnRgtGLIl0sDQoJCQkJWzEsICLQndC1INC/0YDQuNC90LjQvNCw0YLRjCDRgdC+INGB0YLQvtGA0L7QvdC90LjRhSDRgdCw0LnRgtC+0LIiXQ0KCV19LHsNCgkJCXByZWY6IFsiQ0IuUm9vdE1vZGUiLCAi0K3QutGB0L/QtdGA0YLQvdGL0Lkg0YDQtdC20LjQvCDQutC90L7Qv9C+0LoiXQ0KCX0sDQoJCQludWxsLA0KCXsNCgkJCXByZWY6IFsiZ2VuZXJhbC51c2VyYWdlbnQub3ZlcnJpZGUiLCAiVXNlckFnZW50IiwgInUiXSwNCgkJCXVzZXJDaG9pY2U6IHVzZXJhZ2VudCwgcmVmcmVzaDogdHJ1ZSwgaW1hZ2U6ICJjaHJvbWU6Ly9icm93c2VyL3NraW4vcHJpdmF0ZWJyb3dzaW5nL2Zhdmljb24uc3ZnIiwNCgkJCXZhbHVlczogWw0KCQkJCVsiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNi4xOyBXT1c2NDsgcnY6NTYuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC81Ni4wIiwgIkZpcmVmb3ggNTYiXSwNCgkJCQlbIk1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NDsgcnY6NTYuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC81Ni4wIiwgIkZpcmVmb3ggNTYgTGludXgiXSwNCgkJCQlbIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwLjEzOyBydjo2OC4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94LzY4LjAiLCAiRmlyZWZveCA2OCBNYWNPU1giXSwNCgkJCQlbIk1vemlsbGEvNS4wIChXaW5kb3dzOyBVOyBNU0lFIDYuMDsgV2luZG93cyBOVCA1LjE7IFNWMTsgLk5FVCBDTFIgMi4wLjUwNzI3KSIsICJNU0lFIDYuMCBXaW5kb3dzIl0sDQoJCQkJWyJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNy4wOyBQTFVTIEJ1aWxkL05SRDkwTSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzYxLjAuMzE2My45OCBNb2JpbGUgU2FmYXJpLzUzNy4zNiIsICJDaHJvbWU2MSBBbmRyb2lkNyJdLA0KCQkJCVsiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTJfNCkgQXBwbGVXZWJLaXQvNjAzLjEuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEwLjEgU2FmYXJpLzYwMy4xLjMwIiwgIlNhZmFyaSA2IE1hY09TWCJdLA0KCQkJCVsiT3BlcmEvOS44MCAoV2luZG93cyBOVCA2LjI7IFdpbjY0OyB4NjQpIFByZXN0by8yLjEyIFZlcnNpb24vMTIuMTYiLCAiT3BlcmExMiBXOCJdLA0KCQkJCVsiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNi4xOyBXT1c2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzU3LjAuMjk4Ny4xMzMgU2FmYXJpLzUzNy4zNiIsICJDaHJvbWU1NyBXNyJdLA0KCQkJCVsiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzYxLjAuMzE2My45OCBTYWZhcmkvNTM3LjM2IiwgIkNocm9tZTYxIFcxMCJdLA0KCQkJCVsiTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDUuMS4xOyBTTS1HOTI4WCBCdWlsZC9MTVk0N1gpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS80Ny4wLjI1MjYuODMgTW9iaWxlIFNhZmFyaS81MzcuMzYiLCAiU2Ftc3VuZyBHYWxheHkgUzYiXSwNCgkJCQlbIk1vemlsbGEvNS4wIChQbGF5U3RhdGlvbiA0IDMuMTEpIEFwcGxlV2ViS2l0LzUzNy43MyAoS0hUTUwsIGxpa2UgR2Vja28pIiwgIlBsYXlzdGF0aW9uIDQiXSwNCgkJCQlbIlhib3ggKFhib3g7IFhib3ggT25lKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNDYuMC4yNDg2LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYgRWRnZS8xMy4xMDU4NiIsICJYYm94IE9uZSAobW9iaWxlKSJdLA0KCQkJCVsiTW96aWxsYS81LjAgKFdpbmRvd3MgUGhvbmUgMTAuMDsgQW5kcm9pZCA0LjIuMTsgTWljcm9zb2Z0OyBMdW1pYSA5NTApIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS80Ni4wLjI0ODYuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNiBFZGdlLzEzLjEwNTg2IiwgIk1pY3Jvc29mdCBMdW1pYSA5NTAiXSwNCgkJCQlbIk1vemlsbGEvNS4wIChjb21wYXRpYmxlOyBNU0lFIDkuMDsgV2luZG93cyBQaG9uZSBPUyA3LjU7IFRyaWRlbnQvNS4wOyBJRU1vYmlsZS85LjA7IFNBTVNVTkc7IEdULUk4MzUwKSIsICJXaW5kb3dzIFBob25lIl0sDQoJCQkJWyJNb3ppbGxhLzUuMCAoY29tcGF0aWJsZTsgR29vZ2xlYm90LzIuMTsgK2h0dHA6Ly93d3cuZ29vZ2xlLmNvbS9ib3QuaHRtbCkiLCAiR29vZ2xlQm90Il0sDQoJCQkJWyIiLCAi0J/Rg9GB0YLQvtC1INC30L3QsNGH0LXQvdC40LUiXQ0KCV19XTsNCg0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KCXZhciBzZWNvbmRhcnkgPSBbew0KDQoJCQlwcmVmOiBbImltYWdlLmFuaW1hdGlvbl9tb2RlIiwgItCQ0L3QuNC80LDRhtC40Y8g0LjQt9C+0LHRgNCw0LbQtdC90LjQuSIsICJpIl0sDQoJCQl1c2VyQ2hvaWNlOiAibm9ybWFsIiwgcmVmcmVzaDogZmFsc2UsDQoJCQl2YWx1ZXM6IFtbIm5vcm1hbCIsICLQstC60LsuIl0sIFsibm9uZSIsICLQstGL0LrQuy4iXV0NCgl9LHsNCgkJCXByZWY6IFsiZG9tLndvcmtlcnMuZW5hYmxlZCIsICJPbkxpbmUg0LLQuNC00LXQviDwn46sICdkb20ud29ya2VycyciLCAidyJdLCB1c2VyQ2hvaWNlOiB0cnVlDQoJfSx7DQoJCQlwcmVmOiBbImRvbS5lbmFibGVfcGVyZm9ybWFuY2UiLCAi0KHQvtC+0LHRidC40YLRjCDQviDQt9Cw0LPRgNGD0LfQutC1INGB0YLRgNCw0L3QuNGG0YsiXSwgdXNlckNob2ljZTogZmFsc2UNCgl9LA0KCQkJbnVsbCwNCgl7DQoJCQlwcmVmOiBbImJyb3dzZXIuY2FjaGUuZGlzay5lbmFibGUiLCAi0J7RgtC60LsuINC00LjRgdC60L7QstC+0LPQviDQutGN0YjQsCJdLCB1c2VyQ2hvaWNlOiBmYWxzZQ0KCX0sew0KCQkJcHJlZjogWyJicm93c2VyLmNhY2hlLm1lbW9yeS5lbmFibGUiLCAi0J7RgtC60LsuINC60Y3RiNCwINCyINC+0L/QtdGA0LDRgtC40LLQvdC+0Lkg0L/QsNC80Y/RgtC4Il0sIHVzZXJDaG9pY2U6IGZhbHNlDQoJfSx7DQoJCQlwcmVmOiBbImRvbS5pbmRleGVkREIuZW5hYmxlZCIsICLQm9C+0LrQsNC70YzQvdC+0LUg0YXRgNCw0L3QuNC70LjRidC1IGluZGV4ZWREQiIsICJkIl0sIHVzZXJDaG9pY2U6IHRydWUNCgl9LHsNCgkJCXByZWY6IFsiZG9tLnN0b3JhZ2UuZW5hYmxlZCIsICLQntGC0LrQuy4g0LvQvtC60LDQu9GM0L3QvtCz0L4g0YXRgNCw0L3QuNC70LjRidCwIiwgInMiXQ0KCX0sDQoJCQludWxsLA0KCXsNCgkJCXByZWY6IFsiZ2VuZXJhbC51c2VyYWdlbnQubG9jYWxlIiwgInVzZXJhZ2VudC5sb2NhbGUiLCAibCJdLCByZXN0YXJ0OiB0cnVlLA0KCQkJdmFsdWVzOiBbDQoJCQkJWyJlbi1VUyIsICJFbmdsaXNoIiwgImUiXSwNCgkJCQlbInJ1LVJVIiwgItCg0YPRgSAocnUtUlUpIiwgInIiXSwNCgkJCQlbInJ1IiwgItGA0YPRgdGB0LrQuNC5IChydSkiXQ0KCV19LHsNCgkJCXByZWY6IFsiaW50bC5hY2NlcHRfbGFuZ3VhZ2VzIiwgImxhbmd1YWdlIl0sDQoJCQl2YWx1ZXM6IFtbImVuLVVTLCBlbjtxPTAuNSIsICJlbi1VUywgZW47cT0wLjUiLCAiZSJdLCBbImVuLVVTLCBlbiwgcnUtUlUsIHJ1IiwgImVuLVVTLCBlbiwgcnUtUlUsIHJ1IiwgInIiXV0NCgl9LHsNCgkJCXByZWY6IFsiYnJvd3Nlci5kaXNwbGF5LmRvY3VtZW50X2NvbG9yX3VzZSIsICJkb2N1bWVudF9jb2xvcl91c2UiLCAiYyJdLCB1c2VyQ2hvaWNlOiAwLA0KCQkJdmFsdWVzOiBbWzAsICJBdXRvIiwgIjAiXSwgWzEsICJBbHdheXMiLCAiMSJdLCBbMiwgIk5ldmVyIiwgIjIiXV0NCgl9LA0KCQkJbnVsbCwNCgl7DQoJCQlwcmVmOiBbIm5ldHdvcmsuaHR0cC5yZWZlcmVyLnNwb29mU291cmNlIiwgItCSINC60LDRh9C10YHRgtCy0LUg0YDQtdGE0LXRgNC10YDQsCDQutC+0YDQtdC90Ywg0YHQsNC50YLQsCJdLCB1c2VyQ2hvaWNlOiB0cnVlDQoJfSx7DQoJCQlwcmVmOiBbIm5ldHdvcmsuaHR0cC5zZW5kUmVmZXJlckhlYWRlciIsICLQktC60Lsv0JLRi9C60LsgUmVmZXJlciJdLCB1c2VyQ2hvaWNlOiAyLA0KCQkJdmFsdWVzOiBbWzAsICIwIl0sIFsyLCAiMiJdXQ0KCX0sew0KCQkJcHJlZjogWyJuZXR3b3JrLmh0dHAucmVmZXJlci50cmltbWluZ1BvbGljeSIsICJyZWZlcmVyLnRyaW1taW5nUG9saWN5Il0sDQoJCQl2YWx1ZXM6IFtbMCwgIjAiXSwgWzIsICIyIl1dDQoJfSwNCgkJCW51bGwsDQoJew0KCQkJcHJlZjogWyJtZWRpYS5tZWRpYXNvdXJjZS5lbmFibGVkIl0sIHVzZXJDaG9pY2U6IHRydWUNCgl9LHsNCgkJCXByZWY6IFsibWVkaWEucGVlcmNvbm5lY3Rpb24uZW5hYmxlZCJdDQoJfSx7DQoJCQlwcmVmOiBbImJyb3dzZXIudGFicy5yZW1vdGUuYXV0b3N0YXJ0IiwgItCc0L3QvtCz0L7Qv9C+0YLQvtGH0L3QvtGB0YLRjCDQstC60LvQsNC00L7QuiAoQ1BVKSJdLA0KCQkJdXNlckNob2ljZTogZmFsc2UsIHJlc3RhcnQ6IHRydWUNCgl9LA0KCQkJbnVsbA0KCV07DQoNCg0KCXJldHVybiB7DQoJCWxhYmVsOiAiUXVpY2sgdG9nZ2xlIiwNCgkJaWQ6ICJRdWlja1RvZ2dsZUFib3V0Q29uZmlnU2V0dGluZ3MiLA0KCQlsb2NhbGl6ZWQ6IGZhbHNlLA0KCQlpbWFnZTogImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUI2a2xFUVZRNGpaV1R2MnRVUVJESHY4bnRkMjhHTExRUWZ3UzVWa3VEU2dSRi93bFJpSWlDUVFRaGhaMVZJSTEvd0RVV2trTFRCQXNiQzBGSllaR1EzTnVaUmNIWVc2VVFFUXpvZVhrVzc5MXhYaDVDcHRvZFpyOHo4NWtkNEJCV1JKd0RnQjV3eW9DamgzbUxiZks4Qy9kZFcxMVhKbGR1TmdZYWVURnB2SldBMCtQK0JCeDNDZjJzTEV5NW00V3JTOEEwQUdBTmFCVVNyZ0tBS3pkY1k1azBQRjRISkdtNDdOSzZuU1VNWE9JWEFFZ1Nycm5HMG9VL0FHREtOYjZxSGU5YytNczFscWJ4cXdzL3VvVGZXVnAza3NSbGwvRFRKTTZiY01XRW4xS2JEeXNCQ1crenNuU05wV3NzVGJnM1BOZjN1dzdNdUhEZ3ltOHVvVzhhWDQ5NlN4S1hzN0owaVRzRk9iY0dSQmZleThyU2hQMUVYdGhTbkRIaFNoSjB2TTBIMXVZaUFLQlNIV1pxTFl5RGMrSDdzU3BlTmxNWDlsMWpXV2ViRUFnamdTeGNiUlJZQjQ2WWhDY1Z4SDlicURQM25ieVVCQjBYUGsrQ2pnbnZqMXFvcW9odkpxRHRUVUJkY0dBbVN6Z0lFUUJNMlIwZlkvVTQxR1Brd05wY1RCS2ZtbkRQTk40dzRUT1grTm5iZkFRQVdBS21YY01WQU1nYU5xck0xVWZxa2JNbXJYa1QvbkdKTzFYRjRYb2Q4LzBBazRLY0t6VGUzQVJPalBzL0FNZE0yTThhdGsyNWE4SVhBS1lhd1RaWmo1ak5FdlpOMlRWbGRnM055L1Jma1lpekFMQUZuQnl1ODE5dHp2Q1JXWEtxVHdBQUFBQkpSVTVFcmtKZ2dnPT0iLA0KCQlvbkNyZWF0ZWQoYnRuKSB7DQoJCQlidG4uc2V0QXR0cmlidXRlKCJpbWFnZSIsIHRoaXMuaW1hZ2UpOw0KCQkJdmFyIGRvYyA9IGJ0bi5vd25lckRvY3VtZW50Ow0KDQoJCQlidG4uZG9tUGFyZW50ID0gbnVsbDsNCgkJCWJ0bi5wb3B1cHMgPSBuZXcgYnRuLm93bmVyR2xvYmFsLkFycmF5KCk7DQoJCQl0aGlzLmNyZWF0ZVBvcHVwKGRvYywgYnRuLCAicHJpbWFyeSIsIHByaW1hcnkpOw0KCQkJdGhpcy5jcmVhdGVQb3B1cChkb2MsIGJ0biwgInNlY29uZGFyeSIsIHNlY29uZGFyeSk7DQoNCgkJCWJ0bi5saW5rZWRPYmplY3QgPSB0aGlzOw0KCQkJZm9yKHZhciB0eXBlIG9mIFsiY29tbWFuZCIsICJjb250ZXh0bWVudSJdKQ0KCQkJCWJ0bi5zZXRBdHRyaWJ1dGUoIm9uIiArIHR5cGUsIGBsaW5rZWRPYmplY3QuJHt0eXBlfShldmVudClgKTsNCgkJfSwNCgkJY3JlYXRlUG9wdXAoZG9jLCBidG4sIG5hbWUsIGRhdGEpIHsNCgkJCXZhciBwb3B1cCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoeHVsX25zLCAibWVudXBvcHVwIik7DQoJCQl2YXIgcHJvcCA9IG5hbWUgKyAiUG9wdXAiOw0KCQkJYnRuLnBvcHVwcy5wdXNoKGJ0bltwcm9wXSA9IHBvcHVwKTsNCgkJCXBvcHVwLmlkID0gdGhpcy5pZCArICItIiArIHByb3A7DQoJCQlwb3B1cC5zZXRBdHRyaWJ1dGUoIm9ucG9wdXBzaG93aW5nIiwgInBhcmVudE5vZGUubGlua2VkT2JqZWN0LnBvcHVwc2hvd2luZyhldmVudCkiKTsNCgkJCWZvcih2YXIgb2JqIG9mIGRhdGEpIHBvcHVwLmFwcGVuZCh0aGlzLmNyZWF0ZUVsZW1lbnQoZG9jLCBvYmopKTsNCgkJCWJ0bi5hcHBlbmQocG9wdXApOw0KCQl9LA0KCQljcmVhdGVFbGVtZW50KGRvYywgb2JqKSB7DQoJCQlpZiAoIW9iaikgcmV0dXJuIGRvYy5jcmVhdGVFbGVtZW50TlMoeHVsX25zLCAibWVudXNlcGFyYXRvciIpOw0KCQkJdmFyIHByZWYgPSBkb2Mub3duZXJHbG9iYWwuT2JqZWN0LmNyZWF0ZShudWxsKSwgbm9kZSwgaW1nOw0KCQkJZm9yKHZhciBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHsNCgkJCQlpZiAoa2V5ID09ICJwcmVmIikgew0KCQkJCQl2YXIgW2FwcmVmLCBsYWIsIGFrZXksIHR0dF0gPSB2YWw7DQoJCQkJCXByZWYucHJlZiA9IGFwcmVmOyBwcmVmLmxhYiA9IGxhYiB8fCBhcHJlZjsNCgkJCQkJaWYgKGFrZXkpIHByZWYua2V5ID0gYWtleTsNCgkJCQkJaWYgKHR0dCkgcHJlZi50dHQgPSB0dHQ7DQoJCQkJfQ0KCQkJCWVsc2UgaWYgKGtleSA9PSAiaW1hZ2UiKSBpbWcgPSB2YWw7DQoJCQkJZWxzZSBpZiAoa2V5ICE9ICJ2YWx1ZXMiKSBwcmVmW2tleV0gPSB2YWw7DQoJCQl9DQoJCQl2YXIgdHlwZSA9IHByZWZzLmdldFByZWZUeXBlKHByZWYucHJlZik7DQoJCQl2YXIgcGludCA9IHR5cGUgPT0gcHJlZnMuUFJFRl9JTlQsIGludiA9IHR5cGUgPT0gcHJlZnMuUFJFRl9JTlZBTElEOw0KCQkJaWYgKGludiAmJiBvYmoudmFsdWVzIHx8IHBpbnQgfHwgdHlwZSA9PSBwcmVmcy5QUkVGX1NUUklORykgew0KCQkJCW5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudE5TKHh1bF9ucywgIm1lbnUiKTsNCgkJCQlpbWcgJiYgbm9kZS5zZXRBdHRyaWJ1dGUoImltYWdlIiwgaW1nKTsNCgkJCQlpZiAoaW1nIHx8ICFwcmVmLmtleSkgbm9kZS5jbGFzc05hbWUgPSAibWVudS1pY29uaWMiOyAvLyBDRSBidWc/DQoJCQkJbm9kZS5hcHBlbmQoZG9jLmNyZWF0ZUVsZW1lbnROUyh4dWxfbnMsICJtZW51cG9wdXAiKSk7DQoJCQkJcHJlZi5ib29sID0gZmFsc2U7DQoJCQkJdmFyIHN0ciA9IHBpbnQgfHwgKGludiAmJiB0eXBlb2Ygb2JqLnZhbHVlc1swXVswXSA9PSAibnVtYmVyIikgPyAiSW50IiA6ICJTdHJpbmciOw0KCQkJCXByZWYuZ2V0ID0gcHJlZnNbYGdldCR7c3RyfVByZWZgXTsNCgkJCQlwcmVmLnNldCA9IHByZWZzW2BzZXQke3N0cn1QcmVmYF07DQoJCQl9IGVsc2Ugew0KCQkJCW5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudE5TKHh1bF9ucywgIm1lbnVpdGVtIik7DQoJCQkJbm9kZS5zZXRBdHRyaWJ1dGUoInR5cGUiLCAiY2hlY2tib3giKTsNCgkJCQlub2RlLnNldEF0dHJpYnV0ZSgiY2xvc2VtZW51IiwgIm5vbmUiKTsNCgkJCQlwcmVmLmJvb2wgPSB0cnVlOw0KCQkJCXByZWYuZ2V0ID0gcHJlZnMuZ2V0Qm9vbFByZWY7DQoJCQkJcHJlZi5zZXQgPSBwcmVmcy5zZXRCb29sUHJlZjsNCgkJCX0NCgkJCShub2RlLnByZWYgPSBwcmVmKS52YWxzID0gZG9jLm93bmVyR2xvYmFsLk9iamVjdC5jcmVhdGUobnVsbCk7DQoJCQlwcmVmLmtleSAmJiBub2RlLnNldEF0dHJpYnV0ZSgiYWNjZXNza2V5IiwgcHJlZi5rZXkpOw0KCQkJcHJlZi5ib29sIHx8IHRoaXMuY3JlYXRlUmFkaW9zKGRvYywgb2JqLnZhbHVlcywgbm9kZS5maXJzdENoaWxkKTsNCgkJCXJldHVybiBub2RlOw0KCQl9LA0KCQl1cGQobm9kZSkgew0KCQkJdmFyIHtwcmVmfSA9IG5vZGUsIGRlZiA9IGZhbHNlLCB1c2VyID0gZmFsc2UsIHZhbDsNCgkJCWlmIChwcmVmcy5nZXRQcmVmVHlwZShwcmVmLnByZWYpICE9IHByZWZzLlBSRUZfSU5WQUxJRCkgew0KCQkJCXZhciBwbiA9IHByZWYucHJlZjsNCgkJCQl0cnkge3ZhbCA9IGRiW3ByZWYuZ2V0Lm5hbWVdKHBuKTsgZGVmID0gdHJ1ZX0gY2F0Y2goZXgpIHtkZWYgPSBmYWxzZTt9DQoJCQkJdmFyIHVzZXIgPSBwcmVmcy5wcmVmSGFzVXNlclZhbHVlKHBuKTsNCgkJCQlpZiAodXNlcikgdHJ5IHt2YWwgPSBwcmVmLmdldChwbiwgdW5kZWZpbmVkKTt9IGNhdGNoKGV4KSB7fQ0KCQkJfQ0KCQkJaWYgKHZhbCA9PSBwcmVmLnZhbCAmJiBkZWYgPT0gcHJlZi5kZWYgJiYgdXNlciA9PSBwcmVmLnVzZXIpIHJldHVybjsNCgkJCXByZWYudmFsID0gdmFsOyBwcmVmLmRlZiA9IGRlZjsgcHJlZi51c2VyID0gdXNlcjsNCgkJCXZhciBleGlzdHMgPSBkZWYgfHwgdXNlcjsNCg0KCQkJdmFyIHR0dCA9IGV4aXN0cyA/IHZhbCA6ICJUaGlzIHByZWZlcmVuY2VzIGRvZXMgbm90IGV4aXN0IjsNCgkJCWlmICh0dHQgPT09ICIiKSB0dHQgPSAiWyBlbXB0eV9zdHJpbmcgXSI7DQoJCQlpZiAocHJlZi50dHQpIHR0dCArPSAiXG4iICsgcHJlZi50dHQ7DQoJCQlub2RlLnRvb2x0aXBUZXh0ID0gdHR0Ow0KDQoJCQlpZiAocHJlZi5ib29sKSB2YWwNCgkJCQk/IG5vZGUuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwgdHJ1ZSkNCgkJCQk6IG5vZGUucmVtb3ZlQXR0cmlidXRlKCJjaGVja2VkIik7DQoNCgkJCWlmICgidXNlckNob2ljZSIgaW4gcHJlZikgdmFsID09IHByZWYudXNlckNob2ljZQ0KCQkJCT8gbm9kZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiY29sb3IiKQ0KCQkJCTogbm9kZS5zdHlsZS5zZXRQcm9wZXJ0eSgiY29sb3IiLCAibWFyb29uIiwgImltcG9ydGFudCIpDQoJCQl1c2VyDQoJCQkJPyBub2RlLnN0eWxlLnNldFByb3BlcnR5KCJmb250LXdlaWdodCIsICJib2xkIiwgImltcG9ydGFudCIpDQoJCQkJOiBub2RlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJmb250LXdlaWdodCIpOw0KDQoJCQl2YXIge2xhYn0gPSBwcmVmOw0KCQkJaWYgKGV4aXN0cyAmJiAhcHJlZi5ib29sKSB7DQoJCQkJaWYgKHZhbCBpbiBwcmVmLnZhbHMpIHZhciBzZnggPSBwcmVmLnZhbHNbdmFsXSB8fCB2YWw7DQoJCQkJZWxzZSB2YXIgc2Z4ID0gdXNlciA/ICJPdGhlciIgOiAiRGVmYXVsdCI7DQoJCQkJbGFiICs9IGAg4oCUICIke3NmeH0iYDsNCgkJCX0NCgkJCW5vZGUuc2V0QXR0cmlidXRlKCJsYWJlbCIsIGxhYik7DQoJCX0sDQoJCWNyZWF0ZVJhZGlvcyhkb2MsIHZhbHMsIHBvcHVwKSB7DQoJCQlmb3IodmFyIGFyciBvZiB2YWxzKSB7DQoJCQkJaWYgKCFhcnIpIHsNCgkJCQkJcG9wdXAuYXBwZW5kKGRvYy5jcmVhdGVFbGVtZW50TlMoeHVsX25zLCAibWVudXNlcGFyYXRvciIpKTsNCgkJCQkJY29udGludWU7DQoJCQkJfQ0KCQkJCXZhciBbdmFsLCBsYWIsIGtleSwgdHR0XSA9IGFycjsNCgkJCQl2YXIgbWVudWl0ZW0gPSBkb2MuY3JlYXRlRWxlbWVudE5TKHh1bF9ucywgIm1lbnVpdGVtIik7DQoJCQkJbWVudWl0ZW0uc2V0QXR0cmlidXRlKCJ0eXBlIiwgInJhZGlvIik7DQoJCQkJbWVudWl0ZW0uc2V0QXR0cmlidXRlKCJjbG9zZW1lbnUiLCAibm9uZSIpOw0KCQkJCW1lbnVpdGVtLnNldEF0dHJpYnV0ZSgibGFiZWwiLCBwb3B1cC5wYXJlbnROb2RlLnByZWYudmFsc1t2YWxdID0gbGFiKTsNCgkJCQlrZXkgJiYgbWVudWl0ZW0uc2V0QXR0cmlidXRlKCJhY2Nlc3NrZXkiLCBrZXkpOw0KCQkJCXZhciB0aXAgPSBtZW51aXRlbS52YWwgPSB2YWw7DQoJCQkJaWYgKHR0dCkgdGlwICs9ICJcbiIgKyB0dHQ7DQoJCQkJbWVudWl0ZW0udG9vbHRpcFRleHQgPSB0aXA7DQoJCQkJcG9wdXAuYXBwZW5kKG1lbnVpdGVtKTsNCgkJCX0NCgkJfSwNCgkJb3BlblBvcHVwKHBvcHVwKSB7DQoJCQl2YXIgYnRuID0gcG9wdXAucGFyZW50Tm9kZTsNCgkJCWlmIChidG4uZG9tUGFyZW50ICE9IGJ0bi5wYXJlbnROb2RlKSB7DQoJCQkJYnRuLmRvbVBhcmVudCA9IGJ0bi5wYXJlbnROb2RlOw0KCQkJCXZhciBwb3M7DQoJCQkJaWYgKGJ0bi5tYXRjaGVzKCIud2lkZ2V0LW92ZXJmbG93LWxpc3QgPiA6c2NvcGUiKSkNCgkJCQkJcG9zID0gImFmdGVyX3N0YXJ0IjsNCgkJCQllbHNlIHZhciB3aW4gPSBidG4ub3duZXJHbG9iYWwsIHt3aWR0aCwgaGVpZ2h0LCB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHR9ID0NCgkJCQkJYnRuLmNsb3Nlc3QoInRvb2xiYXIiKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgcG9zID0gd2lkdGggPiBoZWlnaHQNCgkJCQkJCT8gYCR7d2luLmlubmVySGVpZ2h0IC0gYm90dG9tID4gdG9wID8gImFmdGVyIiA6ICJiZWZvcmUifV9zdGFydGANCgkJCQkJCTogYCR7d2luLmlubmVyV2lkdGggLSByaWdodCA+IGxlZnQgPyAiZW5kIiA6ICJzdGFydCJ9X2JlZm9yZWA7DQoJCQkJZm9yKHZhciBwIG9mIGJ0bi5wb3B1cHMpIHAuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIHBvcyk7DQoJCQl9DQoJCQlwb3B1cC5vcGVuUG9wdXAoYnRuKTsNCgkJfSwNCgkJbWF5YmVSZXN0YXJ0KG5vZGUsIGNvbmYpIHsNCgkJCXZhciBtc2dSZXN0ID0gIlJlc2FydD8iLCBtc2dBYm9ydCA9ICJUaGUgcXVpdCByZXF1ZXN0IGhhcyBiZWVuIGNhbmNlbGVkLiI7DQoJCQlpZiAocHYgPj0gNzcpIHsNCgkJCQl2YXIgdGl0bGUgPSBub2RlLmNsb3Nlc3QoInRvb2xiYXJidXR0b24iKS5sYWJlbDsNCgkJCQl2YXIgcHAgPSBkb21XaW4gPT4gU2VydmljZXMucHJvbXB0LndyYXBwZWRKU09iamVjdC5waWNrUHJvbXB0ZXIoew0KCQkJCQlkb21XaW4sIG1vZGFsVHlwZTogQ2kubnNJUHJvbXB0Lk1PREFMX1RZUEVfV0lORE9XDQoJCQkJfSk7DQoJCQkJdmFyIGNvbmZpcm0gPSB3aW4gPT4gcHAod2luKS5jb25maXJtKHRpdGxlLCBtc2dSZXN0KTsNCgkJCQl2YXIgYWxlcnQgPSB3aW4gPT4gcHAod2luKS5hbGVydCh0aXRsZSwgbXNnQWJvcnQpOw0KCQkJfSBlbHNlIHsNCgkJCQl2YXIgY29uZmlybSA9IHdpbiA9PiB3aW4uY29uZmlybShtc2dSZXN0KTsNCgkJCQl2YXIgYWxlcnQgPSB3aW4gPT4gd2luLmFsZXJ0KG1zZ0Fib3J0KTsNCgkJCX0NCgkJCXJldHVybiAodGhpcy5tYXlCZVJlc3RhcnQgPSAobm9kZSwgY29uZikgPT4gew0KCQkJCXZhciB3aW4gPSBub2RlLm93bmVyR2xvYmFsOw0KCQkJCWlmIChjb25mICYmICFjb25maXJtKHdpbikpIHJldHVybjsNCgkJCQlpZiAod2luLkJyb3dzZXJVdGlscy5yZXN0YXJ0QXBwbGljYXRpb24oKSA9PT0gZmFsc2UpIGFsZXJ0KHdpbik7DQoJCQkJZWxzZSByZXR1cm4gdHJ1ZTsNCgkJCX0pKG5vZGUsIGNvbmYpOw0KCQl9LA0KCQlyZWdleHBSZWZyZXNoOiAvXig/OnZpZXctc291cmNlOik/KD86aHR0cHM/fGZ0cCkvLA0KCQltYXliZVJlKG5vZGUpIHsNCgkJCXZhciB7cHJlZn0gPSBub2RlOw0KCQkJaWYgKCJyZXN0YXJ0IiBpbiBwcmVmKSB7DQoJCQkJaWYgKHRoaXMubWF5YmVSZXN0YXJ0KG5vZGUsIHByZWYucmVzdGFydCkpIHJldHVybjsNCgkJCX0NCgkJCWVsc2UgdGhpcy5wb3B1cHNob3dpbmcobnVsbCwgbm9kZS5wYXJlbnROb2RlKTsNCgkJCWlmICgicmVmcmVzaCIgaW4gcHJlZikgew0KCQkJCXZhciB3aW4gPSBub2RlLm93bmVyR2xvYmFsOw0KCQkJCWlmICh0aGlzLnJlZ2V4cFJlZnJlc2gudGVzdCh3aW4uZ0Jyb3dzZXIuY3VycmVudFVSSS5zcGVjKSkgcHJlZi5yZWZyZXNoDQoJCQkJCT8gd2luLkJyb3dzZXJSZWxvYWRTa2lwQ2FjaGUoKSA6IHdpbi5Ccm93c2VyUmVsb2FkKCk7DQoJCQl9DQoJCX0sDQoJCWNvbW1hbmQoZSkgew0KCQkJdmFyIHRyZyA9IGUudGFyZ2V0Ow0KCQkJaWYgKHRyZy5ub2RlTmFtZS5zdGFydHNXaXRoKCJ0IikpDQoJCQkJcmV0dXJuIHRoaXMub3BlblBvcHVwKHRyZy5wcmltYXJ5UG9wdXApOw0KDQoJCQl2YXIgbm9kZSA9IHRyZy5jbG9zZXN0KCJtZW51IikgfHwgdHJnOw0KCQkJdmFyIG5ld1ZhbCA9ICJwcmVmIiBpbiB0cmcgPyAhdHJnLnByZWYudmFsIDogdHJnLnZhbDsNCgkJCWlmIChuZXdWYWwgPT0gbm9kZS5wcmVmLnZhbCkgcmV0dXJuOw0KCQkJbm9kZS5wcmVmLnNldChub2RlLnByZWYucHJlZiwgbmV3VmFsKTsNCgkJCXRoaXMubWF5YmVSZShub2RlKTsNCgkJfSwNCgkJcG9wdXBzaG93aW5nKGUsIHRyZyA9IGUudGFyZ2V0KSB7DQoJCQlpZiAodHJnLmlkKSB7DQoJCQkJZm9yKHZhciBub2RlIG9mIHRyZy5jaGlsZHJlbikgew0KCQkJCQlpZiAobm9kZS5ub2RlTmFtZS5lbmRzV2l0aCgiciIpKSBjb250aW51ZTsNCgkJCQkJdGhpcy51cGQobm9kZSk7DQoJCQkJCSFlICYmIG5vZGUub3BlbiAmJiB0aGlzLnBvcHVwc2hvd2luZyhudWxsLCBub2RlLnF1ZXJ5U2VsZWN0b3IoIm1lbnVwb3B1cCIpKTsNCgkJCQl9DQoJCQkJcmV0dXJuOw0KCQkJfQ0KCQkJdmFyIHt2YWx9ID0gdHJnLmNsb3Nlc3QoIm1lbnUiKS5wcmVmOw0KCQkJdmFyIGNoZWNrZWQgPSB0cmcucXVlcnlTZWxlY3RvcigiW2NoZWNrZWRdIik7DQoJCQlpZiAoY2hlY2tlZCkgew0KCQkJCWlmIChjaGVja2VkLnZhbCA9PSB2YWwpIHJldHVybjsNCgkJCQllbHNlIGNoZWNrZWQucmVtb3ZlQXR0cmlidXRlKCJjaGVja2VkIik7DQoJCQl9DQoJCQlmb3IodmFyIG5vZGUgb2YgdHJnLmNoaWxkcmVuKSBpZiAoInZhbCIgaW4gbm9kZSAmJiBub2RlLnZhbCA9PSB2YWwpIHsNCgkJCQlub2RlLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsIHRydWUpOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9LA0KCQljb250ZXh0bWVudShlKSB7DQoJCQl2YXIgdHJnID0gZS50YXJnZXQ7DQoJCQlpZiAodHJnLm5vZGVOYW1lLnN0YXJ0c1dpdGgoInQiKSkgew0KCQkJCWlmIChlLmN0cmxLZXkgfHwgZS5zaGlmdEtleSkgcmV0dXJuOw0KCQkJCWlmIChlLmRldGFpbCA9PSAyKSByZXR1cm4gdHJnLnNlY29uZGFyeVBvcHVwLmhpZGVQb3B1cCgpOw0KCQkJCXRoaXMub3BlblBvcHVwKHRyZy5zZWNvbmRhcnlQb3B1cCk7DQoJCQl9DQoJCQllbHNlIGlmICgicHJlZiIgaW4gdHJnICYmIHRyZy5wcmVmLnVzZXIpDQoJCQkJcHJlZnMuY2xlYXJVc2VyUHJlZih0cmcucHJlZi5wcmVmKSwNCgkJCQl0aGlzLm1heWJlUmUodHJnKTsNCgkJCWUucHJldmVudERlZmF1bHQoKTsNCgkJfQ0KCX07DQp9KTs=

Duche пишет

для FF710"Удалить активную вкладку из папки закладок"

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

Выделить код

Код:

((popup, menugroup, bs) => addEventListener("popupshowing", {
	async handleEvent() {
		if (await this.shouldHide()) return;
		var before = popup.children[1];
		//var before = popup.querySelector("#page-menu-separator + *");  Строка ниже..........................
		var menuitem = document.createXULElement("menuitem");
		var attrs = {
			label: "Удалить эту страницу из закладок",
			class: "menuitem-iconic menuitem-with-favicon",
			oncommand: "removeBookmarks();"
		};
		for(var attr in attrs) menuitem.setAttribute(attr, attrs[attr]);
		popup.insertBefore(menuitem, before);
		addDestructor(() => menuitem.remove());

		var crop = (str, limit = 100) => str.length <= limit ? str : str.slice(0, limit) + "…";
		var url = "chrome://global/content/alerts/alert.x";
		try {await fetch(url + "html", {method: "head"}); url += "html";} catch {url += "ul";}
		var notify = (num, msg) => {
			var forms = gNavigatorBundle.getString("editBookmark.removeBookmarks.label").replace(/ть/g, "л");
			(notify = (num, msg) => setTimeout(win => win.close(), 3e3, openDialog(
				url, "", "popup=yes", menuitem.image,
				PluralForm.get(num, forms).replace("#1", num), msg, false, null, 4
			)))(num, msg);
		}
		menuitem.removeBookmarks = async () => {
			var msg = crop(this.bookmarks.spec) + "\n\n\Из:\n", num = 0;
			for(var bookmark of this.bookmarks) {
				try {
					var title = bs.getLocalizedTitle(await bs.fetch({guid: bookmark.parentGuid}));
					await bs.remove(bookmark);
				} catch {continue;}
				num++; msg += `\n${title || "[Безымянная папка]"}`;
			}
			gBrowser.removeCurrentTab();
			notify(num, msg);
		}
		this.collect = this.bookmarks.add.bind(this.bookmarks);
		var setIcon = () => menuitem.image = "page-icon:" + this.bookmarks.spec;
		this.handleEvent = async () => (menuitem.hidden = await this.shouldHide()) || setIcon();
		setIcon();
	},
	shouldHide() {
		var bms = this.bookmarks = new Set(), collect = bms.add.bind(bms);
		return (this.shouldHide = async () => menugroup.hidden || bms.clear() ||
			!(await bs.fetch({url: bms.spec = gBrowser.currentURI.spec}, collect, this)))();
	},
	concurrent: true
}, false, popup))(
	document.getElementById("contentAreaContextMenu"),
	document.getElementById("context-navigation"), PlacesUtils.bookmarks
);

Отсутствует

 

№1494610-08-2020 18:56:32

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 56.0

Re: Custom Buttons

Dumby
огромное спасибо
а куда вставить код?

Отсутствует

 

№1494710-08-2020 19:03:01

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2144
UA: Firefox 52.0

Re: Custom Buttons

firepox
Эээ...


firepox пишет

помогите подправить код

Заменить функцию saveToFile, видимо.
Она там в самом начале определяется.

Отсутствует

 

№1494810-08-2020 19:08:17

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 56.0

Re: Custom Buttons

ничего не происходит при нажатии
огромная просьба, можно весь код кнопки с исправлениями
спасибо

Отредактировано firepox (10-08-2020 19:08:41)

Отсутствует

 

№1494910-08-2020 19:24:06

Duche
Участник
 
Группа: Members
Зарегистрирован: 07-02-2016
Сообщений: 208
UA: unknown 0.0

Re: Custom Buttons

Dumby.  Спасибо большое за помощь.

Отсутствует

 

№1495010-08-2020 19:41:38

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2144
UA: Firefox 52.0

Re: Custom Buttons

firepox пишет

ничего не происходит при нажатии
огромная просьба, можно весь код кнопки с исправлениями

Вот шляпа, всё надо проверять.
Недоглядел, что fileName кривой передаётся. Хорошо, весь

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

Выделить код

Код:

var saveToFile = this.stf || (this.stf = (suc => {
    suc.charset = "utf-8";
    var as = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
    var alertName = "Save_snapshot_to_html_alert";
    var notify = as.showAlertNotification.bind(
        as, null, "Страница сохранена на Рабочем столе", null, false, null, null, alertName
    );
    var desk = Services.dirsvc.get("Desk", Ci.nsIFile);
    var fos = Components.Constructor("@mozilla.org/network/file-output-stream;1", "nsIFileOutputStream", "init");
    return (html, name) => {
        var file = desk.clone()
        file.append(name);
        html = suc.ConvertFromUnicode(html);
        var stream = new fos(file, 0x02|0x20|0x08, 0o666, 0);
        stream.write(html, html.length);
        stream.close();
        notify();
        setTimeout(as.closeAlert, 2e3, alertName);
    }
})(Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter)));

var resolveURL = function (url, base) {
    try {
        var ioService = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService);
        var baseURI = ioService.newURI(base, null, null);
        var absURI = ioService.newURI(url, null, baseURI);
        return absURI.spec;
    } catch (e) {}
};

var getSelWin = function (w) {
    if (w.getSelection().toString()) return w;
    for (var i = 0, f, r; f = w.frames[i]; i++) {
        try {
            if (r = getSelWin(f)) return r;
        } catch(e) {}
    }
};
var encodeImg = function (src, obj) {
    var canvas, img, ret = src;
    if (/^https?:\/\//.test(src)) {
        canvas = doc.createElement('canvas');
        if (!obj || obj.nodeName.toLowerCase() != 'img') {
            img = doc.createElement('img');
            img.src = src;
        } else {
            img = obj;
        };
        if (img.complete) try{
            canvas.width = img.width;
            canvas.height = img.height;
            canvas.getContext('2d').drawImage(img, 0, 0);
            ret = canvas.toDataURL((/\.jpe?g/i.test(src) ? 'image/jpeg' : 'image/png'));
        } catch (e) {};
        if (img != obj) img.src = 'about:blank';
    };
    return ret;
};
var toSrc = function (obj) {
    var strToSrc = function (str) {
        var chr, ret = '', i = 0, meta = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '\x22' : '\\\x22', '\\': '\\\\'};
        while (chr = str.charAt(i++)) {
            ret += meta[chr] || chr;
        };
        return '\x22' + ret + '\x22';
    },
    arrToSrc = function (arr) {
        var ret = [];
        for (var i = 0; i < arr.length; i++) {
            ret[i] = toSrc(arr[i]) || 'null';
        };
        return '[' + ret.join(',') + ']';
    },
    objToSrc = function (obj) {
        var val, ret = [];
        for (var prop in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, prop) && (val = toSrc(obj[prop]))) ret.push(strToSrc(prop) + ': ' + val);
        };
        return '{' + ret.join(',') + '}';
    };

    switch (Object.prototype.toString.call(obj).slice(8, -1)) {
        case 'Array': return arrToSrc(obj);
        case 'Boolean':
        case 'Function':
        case 'RegExp': return obj.toString();
        case 'Date': return 'new Date(' + obj.getTime() + ')';
        case 'Math': return 'Math';
        case 'Number': return isFinite(obj) ? String(obj) : 'null';
        case 'Object': return objToSrc(obj);
        case 'String': return strToSrc(obj);
        default: return obj ? (obj.nodeType == 1 && obj.id ? 'document.getElementById(' + strToSrc(obj.id) + ')' : '{}') : 'null';
    }
};

var mainWin = document.commandDispatcher.focusedWindow.top == content ? document.commandDispatcher.focusedWindow : content;
var selWin = getSelWin(mainWin), win = selWin || mainWin, doc = win.document, loc = win.location;
var ele, pEle, clone, reUrl = /(url\(\x22)(.+?)(\x22\))/g;

if (selWin) {
    var rng = win.getSelection().getRangeAt(0);
    pEle = rng.commonAncestorContainer;
    ele = rng.cloneContents();
} else {
    pEle = doc.documentElement;
    ele = (doc.body || doc.getElementsByTagName('body')[0]).cloneNode(true);
};
while (pEle) {
    if (pEle.nodeType == 1) {
        clone = pEle.cloneNode(false);
        clone.appendChild(ele);
        ele = clone;
    };
    pEle = pEle.parentNode
};
var sel = doc.createElement('div');
sel.appendChild(ele);

for (var el, all = sel.getElementsByTagName('*'), i = all.length; i--;) {
    el = all[i];
    if (el.style && el.style.backgroundImage) el.style.backgroundImage = el.style.backgroundImage.replace(reUrl, function (a, prev, url, next) {
        if (!/^[a-z]+:/.test(url)) url = resolveURL(url, loc.href);
        return prev + encodeImg(url) + next;
    });
    switch (el.nodeName.toLowerCase()) {
        case 'link':
        case 'style':
        case 'script': el.parentNode.removeChild(el); break;
        case 'a': 
        case 'area': if (el.hasAttribute('href') && el.getAttribute('href').charAt(0) != '#') el.href = el.href; break;
        case 'img':
        case 'input': if (el.hasAttribute('src')) el.src = encodeImg(el.src, el); break;
        case 'audio':
        case 'video':
        case 'embed':
        case 'frame':
        case 'iframe': if (el.hasAttribute('src')) el.src = el.src; break;
        case 'object': if (el.hasAttribute('data')) el.data = el.data; break;
        case 'form': if (el.hasAttribute('action')) el.action = el.action; break;
    }
};

var head = ele.insertBefore(doc.createElement('head'), ele.firstChild);
var meta = doc.createElement('meta');
meta.httpEquiv = 'content-type';
meta.content = 'text/html; charset=utf-8';
head.appendChild(meta);
var title = doc.getElementsByTagName('title')[0];
if (title) head.appendChild(title.cloneNode(true));

head.copyScript = function (unsafeWin) {
    if ('$' in unsafeWin) return;
    var f = doc.createElement('iframe');
    f.src = 'about:blank';
    f.setAttribute('style', 'position:fixed;left:0;top:0;visibility:hidden;width:0;height:0;');
    doc.documentElement.appendChild(f);
    var str, script = doc.createElement('script');
    script.type = 'text/javascript';
    for (var name in unsafeWin) {
        if (name in f.contentWindow || !/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name)) continue;
        try {
            str = toSrc(unsafeWin[name]);
            if (!/\{\s*\[native code\]\s*\}/.test(str)) {
                script.appendChild(doc.createTextNode('var ' + name + ' = ' + str.replace(/<\/(script>)/ig, '<\\/$1') + ';\n'));
            }
        } catch (e) {};
    };
    f.parentNode.removeChild(f);
    if (script.childNodes.length) this.nextSibling.appendChild(script);
};
head.copyScript(win.wrappedJSObject || win);

head.copyStyle = function (s) {
    if (!s) return;
    var style = doc.createElement('style');
    style.type = 'text/css';
    if (s.media && s.media.mediaText) style.media = s.media.mediaText;
    try {
        for (var i = 0, rule; rule = s.cssRules[i]; i++) {
            if (rule.type != 3) {
                if((!rule.selectorText || rule.selectorText.indexOf(':') != -1) || (!sel.querySelector || sel.querySelector(rule.selectorText))) {
                    var css = !rule.cssText ? '' : rule.cssText.replace(reUrl, function (a, prev, url, next) {
                        if (!/^[a-z]+:/.test(url)) url = resolveURL(url, s.href || loc.href);
                        if(rule.type == 1 && rule.style && rule.style.backgroundImage) url = encodeImg(url);
                        return prev + url + next;
                    });
                    style.appendChild(doc.createTextNode(css + '\n'));
                }
            } else {
                this.copyStyle(rule.styleSheet);
            }
        }
    } catch(e) {
        if (s.ownerNode) style = s.ownerNode.cloneNode(false);
    };
    this.appendChild(style);
};
var sheets = doc.styleSheets;
for (var j = 0; j < sheets.length; j++) head.copyStyle(sheets[j]);
head.appendChild(doc.createTextNode('\n'));

var doctype = '', dt = doc.doctype;
if (dt && dt.name) {
    doctype += '<!DOCTYPE ' + dt.name;
    if (dt.publicId) doctype += ' PUBLIC \x22' + dt.publicId + '\x22';
    if (dt.systemId) doctype += ' \x22' + dt.systemId + '\x22';
    doctype += '>\n';
};
var fileName = selWin ? win.getSelection().toString() : (title && title.text ? title.text : loc.pathname.split('/').pop());
fileName = fileName.replace(/[:\\\/<>?*|"]+/g, '_').replace(/\s+/g, ' ').slice(0, 100).replace(/^\s+|\s+$/g, '');
fileName += ("  " + new Date().toLocaleFormat("%d.%m.%Y. %H-%M-%S"));
if(!/\.html?$/.test(fileName))fileName += '.html';

saveToFile(doctype + sel.innerHTML + '\n<!-- This document saved from ' + (loc.protocol != 'data:' ? loc.href : 'data:uri') + ' -->', fileName);

Отсутствует

 

Board footer

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