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

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

№1490101-08-2020 20:59:06

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

Re: Custom Buttons

Dumby
Не могли бы Вы адаптировать для user_chrome_files две кнопки в [firefox] 79.0

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

Выделить код

Код:

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%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0432%u043D%u0435%u0448%u043D%u0435%u0435%20win%20%u043F%u0440%u0438%u043B%u043E%u0436%u0435%u043D%u0438%u0435%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAMAAwQAKCImDyo4IWkYaBzFQ6xI8FG/V/VCq0jcGGQbkwAQACQAAAAAAAIAAwAAAAAAAAAAAAAAAAEAAAIAAgIAQy4iYp9YOuZUah3/QMJQ/nfxgP97+Yb/f/+L/m/7ev87v0L1BzwIawAAAAAAAgADAAAAAAEAAAIAAAAAQR4Ki7pwNP//tG79aXQg/CGwM/tL3lP+SeJU/krmVf5I5lT8ROZQ/SjIMf8DQgWFAAAAAAACAAMAAAAAMRoKX5hKHP/qoVT69JtU/WVsGP8RmyP/LMAz/ynHM/4ozTP8Jc4w+x/KK/sbxyn7Daoa/wAlA1QAAAEAAgAAA2o5G9GhVyT/z305/N54Nv9eWxTyAnMR6Qp+DvsIig//CpQR/wucE/8KnQ//CpkG/QedAf8FZADWAwIACigYIklrMln7h0VB/6dcJPvBaCz/XC8RlgABAAACDgAlABUANAAfAUsAKABeAz8RlAhfUvkDZnP/CFtw+gcXKklSLEeVlUiB/6VamPykYGD7o1wl/2A4H5YAAAAAAgEBBAAAAAAAAQMEAAAAAAUoVmcHcfT/AIL5+QCK//8BOZ2rXjJRsJtOhf/SgLr9zoK++5hbW/9AKhaGAAAAAAICAQYAAQACAAMDBwAAAAABLlprD4///wqh9/oJsf//Al7M1FsxT6ucUYf/1Iq//Oyd1vzYkMf/X0FVhQAAAAADAgMEAAAAAAACBAQBAAAAAC1aYRSQ//8lpPr6Irj//wtt1t5GJT2DmlCF/82Juvz2reH/8Kbb/eej1P9jR1t+AAAAAAMCAwQBAwUGAAAAAAYkV2wjkv//PLP7+jzE//8VaMXMHhAaP5FLff+4d6b++rno//iz5P/3suP88rLg/2hPYn8AAAAAAQAAAAgPYW1bXeD/PJL0/1DB/fxSy///EkiRlwAAAABqOFzBp16S/+ev2Pz/we///b7s//u86vr7wev/dFxfcgAJYmhxeP//lJH+/juS+/5q0f/+V7n4/AASODwAAAAAHA4YP5NMgP+6fKj9/Mzw/f3H8/7/y/X/7LvU811Ywd54gPv8r6z//puZ/P1Akff5g+L//y5hmZ8AAAAAAgECAwAAAAA1Gy5vmlGG/8iOuP3/1vX/8sfe811YxNZ6g/f5ubb9/a6u+/uvrfz8TZPt/1GFvMcAAQwNAQAAAAAAAAACAQEDAAAAACoVJVh/QW3umWuP7V5fzeSMk/j9zcn//7+//v7Av///o6Pz+yU2XH0AAwYKAQAAAAAAAQEAAAAAAAAAAAEBAQMAAAAADwkHFAcCKUsJGb3VO0vn9lRf5/RdZMzXRkmTmw4OKTUAAAAAAgIDAwABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%0Avar%20array%3D%5B%5B%22IE%22%2C%22C%3A%5C%5CProgram%20files%5C%5CInternet%20Explorer%5C%5Ciexplore.exe%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22Explorer%22%2C%22C%3A%5C%5Cwindows%5C%5Cexplorer.exe%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22separator%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22Cmd%20Prompt%22%2C%22C%3A%5C%5Cwindows%5C%5Csystem32%5C%5Ccmd.exe%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22Media%20Player%22%2C%22C%3A%5C%5CProgram%20Files%5C%5CWindows%20Media%20Player%5C%5Cwmplayer.exe%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22Task%20Manager%22%2C%22C%3A%5C%5Cwindows%5C%5Csystem32%5C%5Ctaskmgr.exe%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22Control%20Panel%22%2C%22C%3A%5C%5Cwindows%5C%5Csystem32%5C%5Ccontrol.exe%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22separator%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22Notepad%22%2C%22C%3A%5C%5Cwindows%5C%5Cnotepad.exe%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22Calculator%22%2C%22C%3A%5C%5Cwindows%5C%5Csystem32%5C%5Ccalc.exe%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22Virtual%20Keyboard%22%2C%22C%3A%5C%5Cwindows%5C%5Csystem32%5C%5COSK.exe%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22Character%20table%22%2C%22C%3A%5C%5Cwindows%5C%5Csystem32%5C%5Ccharmap.exe%22%5D%5D%3B%0A%0Avar%20menuPopup%3Dself.appendChild%28document.createXULElement%28%22menupopup%22%29%29%3B%0Aarray.forEach%28%28m%29%3D%3E%7Bif%28m%3D%3D%22separator%22%29%7BmenuPopup.appendChild%28document.createXULElement%28%22menuseparator%22%29%29%3Breturn%7D%3B%0A%20%20%20var%20mItem%3Ddocument.createXULElement%28%22menuitem%22%29%3B%20//document.createElement%28%22menuitem%22%29%3B%0A%20%20%20mItem.setAttribute%28%22label%22%2Cm%5B0%5D%29%3B%0A%20%20%20mItem.setAttribute%28%22class%22%2C%22menuitem-iconic%22%29%3B%0A%20%20%20mItem.setAttribute%28%22image%22%2C%22moz-icon%3A//file%3A//%22+m%5B1%5D%29%3B%0A%20%20%20mItem.onclick%3De%3D%3EComponents.Constructor%28%22@mozilla.org/file/local%3B1%22%2C%22nsIFile%22%2C%22initWithPath%22%29%28m%5B1%5D%29.launch%28%29%3B%0A%20%20%20menuPopup.appendChild%28mItem%29%3B%7D%29%3B%0Athis.type%20%3D%20%22menu%22%3B%0Athis.matches%28%22toolbar%5Borient%3Dvertical%5D%20%3E%20%3Ascope%22%29%20%26%26%20menuPopup.setAttribute%28%22position%22%2C%20%22end_before%22%29%3B%0Avar%20vStart%20%3D%20this.parentNode.parentNode.getAttribute%28%22v_vertical_bar_start%22%29%3B%0AvStart%20%26%26%20menuPopup.setAttribute%28%22position%22%2C%20%60%24%7BvStart%20%3D%3D%20%22true%22%20%3F%20%22end%22%20%3A%20%22start%22%7D_before%60%29%3B%0A%0A//%20Autoopen/close%20feature%0Avar%20openDelay%20%3D%20200%3B%0Avar%20closeDelay%20%3D%20350%3B%0A%0Avar%20_openTimer%20%3D%200%3B%0Avar%20_closeTimer%20%3D%200%3B%0Athis.onmouseover%20%3D%20function%28e%29%20%7B%0A%09clearTimeout%28_closeTimer%29%3B%0A%09if%28e.target%20%3D%3D%20this%20%26%26%20closeOtherMenus%28%29%29%20%7B%0A%09%09this.open%20%3D%20true%3B%0A%09%09return%3B%0A%09%7D%0A%09_openTimer%20%3D%20setTimeout%28function%28%29%20%7B%0A%09%09self.open%20%3D%20true%3B%0A%09%7D%2C%20openDelay%29%3B%0A%7D%3B%0Athis.onmouseout%20%3D%20function%28e%29%20%7B%0A%09clearTimeout%28_openTimer%29%3B%0A%09_closeTimer%20%3D%20setTimeout%28function%28%29%20%7B%0A%09%09if%28%21isContextOpened%28%29%29%0A%09%09%09self.open%20%3D%20false%3B%0A%09%7D%2C%20closeDelay%29%3B%0A%7D%3B%0Afunction%20closeOtherMenus%28%29%20%7B%0A%09return%20Array.prototype.some.call%28%0A%09%09self.parentNode.getElementsByTagName%28%22*%22%29%2C%0A%09%09function%28node%29%20%7B%0A%09%09%09if%28%0A%09%09%09%09node%20%21%3D%20self%0A%09%09%09%09%26%26%20node.namespaceURI%20%3D%3D%20xulns%0A%09%09%09%09//%20See%20https%3A//github.com/Infocatcher/Custom_Buttons/issues/28%0A%09%09%09%09//%26%26%20node.boxObject%0A%09%09%09%09//%26%26%20node.boxObject%20instanceof%20Components.interfaces.nsIMenuBoxObject%0A%09%09%09%09%26%26%20%22open%22%20in%20node%0A%09%09%09%09%26%26%20node.open%0A%09%09%09%09%26%26%20node.getElementsByTagName%28%22menupopup%22%29.length%0A%09%09%09%29%20%7B%0A%09%09%09%09node.open%20%3D%20false%3B%0A%09%09%09%09return%20true%3B%0A%09%09%09%7D%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%29%3B%0A%7D%0Afunction%20isContextOpened%28%29%20%7B%0A%09return%20inBtn%28document.popupNode%29%3B%0A%7D%0Afunction%20inBtn%28node%29%20%7B%0A%09for%28%3B%20node%3B%20node%20%3D%20node.parentNode%29%0A%09%09if%28node%20%3D%3D%20self%29%0A%09%09%09return%20true%3B%0A%09return%20false%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

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

Выделить код

Код:

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%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0443%20%u0432%20%u0434%u0440%u0443%u0433%u043E%u043C%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0435%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAAsSAAALEgHS3X78AAAEgUlEQVQ4jU2TW2yTZQCG3+/7v/79266HraN1G8cNVoERNhk42BBmghiQBF3IMJnghYcbxUPEREiYF0bgihBREyNRQ4wENCwkBjlsyIA5WclWOe3ANrq2W1u6reu5/f//+7xQI8/tmzx5bx4yMjKCgYEByLIMAYBTirymEUYpbIrimkslzKXOpwLrV3NNceTAhZERNVfFC1mnNifGjO6i8NB4grCOjg7s378foBSVNju+3b6D+NUC/d43oGeK7dXLFlfu9BhKr244XObntvuvkPDURszNGiSjkhKTaYAtPO7tT15iQggAAASHVZJIs8sFlDqx69l1O4Lh+EeVddXPidrZN2XeZcDvswrGqnhBXXXowK2rRxtXGF0vy4XWzvOhG4wQ8o+IUCIAkYcoYrr+pXlqdo+nwQXR6BUk1WP13qhE5pRZX2cDMRRpn9U/LK870/egrfkZ66WCqir/P4IQakGHIad/LUaDbWrLIs2w+TbFyB16J75PDNg3I9V8XbKdO4GaEiffXWpqmZ8tN01Oq20ffLwuTv+1SOACvM7S+hcLtknbyzR56z0p2T9If3nYjmtTtSQV9BF51RqML1yOlP8hiQUfqU00va33RGD3a69fEZRQQgDoJmaAceu8t+/tWwxsDxK9o5OcOduICxE3ykvSSBUvhR66D1W/heyyGDG/GJLwxgSWb4q8NXh3xkgBEABQi6WqxvUr6neVzwHXbtJQO8dgQEWJG4gqZfDM3URZVzuml21DyRYdhk0JwutzWN0CT2OttJY6HApxWICG5uqad6qZVRry8s8j88j9YAJJi4JR5kZvnxfV1w+id8EupBreA1m5CNSVJZxRYTYT04JyuoTt2bNGb939KQjXthUNX8DJqAU/Oi1IbnFiY0UFgots2Onx4BQ/iC6sRX0sCclTBuR8EIQAnEAiRGYyM4MZ3PV06trz/Y81nM4UwZXOYLhlIbKPFdTHIzjh8+G3+FLkC1nU1uiQ2AMUIAlGOclnZR6OIcI4MTGiJzfoY4OlP0zbM1mJmx2KhHSxBe6KOKKBIdyOOFBpIHjaY8SOJV8AGT9ALKCEIDDBogODWj8DrBpJB+smxjPdV84Xeua3LjjCZUmzaBbmjffAVNGPl6pWIJGVYNW9KFE7IJgZah6abDYbfvq18HNsjocoVD8QuOWyrWzqyT1Qj4b/CPsU2cSy+bSWt+YwU4ihO9mJ7vhlNCndsBiMSGaYbmFWg7fX4D92OnEEACjJ+iEyYatTqI9qXBJ8x3yt492ROxQyQ07S5QLTcxmb/oKS0TebVS2dtOpWUSz19Rn9be2xV2eTPEQJqHTow70Q8T/X0vjjpuaaeRdnptPR/gujPekEXyOZjfN1JhOH0Ogn9gi15BTyKKDQ785lR949Htk7EVV7KAHlApyok5ehDn9lZdnJ9yU9l6Ys03X4ZMR/4GzCqtjleqnCXu1xs+IGU56MRrX43bHcWGimcJsQhADkhYAOAESdvIj80Dcw5vMYGQ7i4KlBdN4tIJEVIBD4L+knoRSAAPgT49/cEBl9hsIr+QAAAABJRU5ErkJggg%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.onclick%20%3De%3D%3E%20%7B%0A%20%20%20e.button%20%3D%3D%200%20%26%26%20menu.openPopup%28this%2C%20%22after_start%22%29%3B%0A%20%20%20e.button%20%3D%3D%201%20%26%26%20getAppPath%28%29%3B%20%20%20%20%0A%7D%3B%0A%0A%0Avar%20menu%20%3D%20self.appendChild%28document.createElementNS%28xulns%2C%22menupopup%22%29%29%3B%0AaddEventListener%28%22popuphidden%22%2C%20%28%29%3D%3E%20setTimeout%28%28%29%3D%3E%20addToHelp%28%29%2C%2050%29%2C%20true%2C%20menu%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%0Afunction%20setItemsToMenu%28newPath%20%3D%20false%29%20%7B%0A%20%20%20menu.textContent%20%3D%20%22%22%3B%0A%20%20%20%0A%20%20%20menu.onclick%20%3D%28e%2C%20el%20%3D%20e.target%2C%20but%20%3D%20e.button%29%3D%3E%20%7B%0A%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20but%20%3D%3D%200%20%26%26%20el.path%20%26%26%20openWith%28el.path%29%3B%0A%20%20%20%20%20%20but%20%3D%3D%201%20%26%26%20addToSeparator%28e%29%3B%0A%20%20%20%20%20%20%21e.ctrlKey%20%26%26%20but%20%3D%3D%202%20%26%26%20removeNode%28e%29%3B%0A%20%20%20%20%20%20e.ctrlKey%20%26%26%20but%20%3D%3D%202%20%26%26%20changeMenuitemLabel%28e%29%3B%0A%20%20%20%7D%0A%0A%20%20%20var%20array%20%3D%20newPath%20%3F%20%28getHelp%28%29%20+%20%27%2C%27%20+%20newPath%29.split%28%27%2C%27%29%20%3A%20getHelp%28%29%3B%20%20%20%20%20%20%20%0A%20%20%20array.forEach%28path%3D%3E%20%7B%0A%20%20%20%20%20%20if%20%28path%20%3D%3D%20%22%22%29%20return%3B%0A%20%20%20%20%20%20if%20%28path%20%3D%3D%20%22separator%22%29%20%7B%20menu.appendChild%28document.createElementNS%28xulns%2C%22menuseparator%22%29%29%3B%20return%20%7D%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20var%20mItem%20%3D%20menu.appendChild%28document.createElementNS%28xulns%2C%22menuitem%22%29%29%3B%0A%20%20%20%20%20%20mItem.value%20%3D%20path%3B%0A%20%20%20%20%20%20mItem.path%20%3D%20path.split%28%22%3E%22%29.shift%28%29%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20var%20name%20%3D%20path.split%28%22%5C%5C%22%29.pop%28%29.replace%28%22.exe%22%2C%20%22%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20name%20%3D%20%28/%3E/.test%28name%29%29%20%3F%20name.split%28%22%3E%22%29.pop%28%29%20%3A%20name%2C%0A%20%20%20%20%20%20%20%20%20%20name%20%3D%20name%5B0%5D.toUpperCase%28%29%20+%20name.slice%281%29%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20mItem.setAttribute%28%22label%22%2C%20name%29%3B%0A%20%20%20%20%20%20mItem.setAttribute%28%22tooltiptext%22%2C%20mItem.path%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%22image%22%2C%20%22moz-icon%3A//file%3A//%22%20+%20mItem.path%29%3B%0A%20%20%20%20%20%20mItem.onwheel%20%3De%3D%3E%20moveNode%28e%29%3B%0A%20%20%20%7D%29%0A%7D%3B%0AsetItemsToMenu%28%29%3B%0A%0A%0Afunction%20moveNode%28e%2C%20el%20%3D%20e.target%29%20%7B%0A%20%20%20menu.insertBefore%28el%2C%20e.deltaY%20%3E%200%20%3F%20el.nextSibling.nextSibling%20%3A%20%28el.previousSibling%20%7C%7C%20el%29%29%3B%0A%7D%3B%0A%0A%0Afunction%20addToSeparator%28e%2C%20el%20%3D%20e.target%29%20%7B%0A%20%20%20menu.insertBefore%28document.createElementNS%28xulns%2C%22menuseparator%22%29%2C%20el.nextSibling%29%3B%0A%7D%3B%0A%0A%0Afunction%20removeNode%28e%2C%20el%20%3D%20e.target%29%20%7B%0A%20%20%20el.remove%28%29%3B%0A%7D%3B%0A%0A%0Afunction%20changeMenuitemLabel%28e%2C%20el%20%3D%20e.target%29%20%7B%0A%20%20%20menu.hidePopup%28%29%3B%0A%20%20%20el.setAttribute%28%22context%22%2C%20%22event.stopPropagation%28%29%22%29%3B%0A%20%20%20%0A%20%20%20var%20label%20%3D%20custombuttons.promptBox%28%27%27%2C%20%27%u0412%u0435%u0434%u0438%u0442%u0435%20%u0434%u0440%u0443%u0433%u043E%u0435%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%20%u043F%u0443%u043D%u043A%u0442%u0430%27%29%5B1%5D%3B%0A%20%20%20if%20%28label%20%21%3D%20%27%27%29%20%7B%0A%20%20%20%20%20%20%20el.value%20%3D%20el.value.split%28%22%3E%22%29.shift%28%29%20+%20%22%3E%22%20+%20label%3B%0A%20%20%20%20%20%20%20el.setAttribute%28%27label%27%2C%20label%29%3B%0A%20%20%20%20%20%20%20%7D%0A%7D%3B%0A%0A%20%0Afunction%20getAppPath%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.appendFilters%28fp.filterApps%29%3B%0A%20%20%20fp.init%28window%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%29%3B%0A%20%20%20fp.open%28result%20%3D%3E%20result%20%3D%3D%20fp.returnOK%20%26%26%20setItemsToMenu%28fp.file.path%29%29%3B%0A%7D%3B%0A%0A%0Afunction%20getHelp%28%29%20%7B%20%0A%20%20%20return%20self.getAttribute%28%27Help%27%29.split%28%27%5Cn%27%29.filter%28%28path%29%3D%3E%20/%5CS/.test%28path%29%29%3B%20%0A%7D%3B%0A%0A%0Afunction%20addToHelp%28%29%20%7B%0A%20%20%20var%20paths%20%3D%20%5B...menu.children%5D.map%28%28el%29%3D%3E%20el.value%20%7C%7C%20%22separator%22%29.join%28%22%5Cn%22%29%3B%0A%0A%20%20%20var%20link%20%3D%20custombuttons.makeButtonLink%28%22update%22%2C%20_id%29%3B%0A%20%20%20var%20params%20%3D%20custombuttons.cbService.getButtonParameters%28link%29.wrappedJSObject%3B%0A%20%20%20params.help%20%3D%20paths%3B%0A%20%20%20custombuttons.cbService.installButton%28params.wrappedJSObject%20%3D%20params%29%3B%0A%7D%3B%0A%0A%0Afunction%20openWith%28path%29%20%7B%0A%20%20%20var%20uri%20%3D%20gBrowser.currentURI.spec%3B%0A%20%20%20var%20uri%20%3D%20/.%u0440%u0444/.test%28uri%29%20%3F%20Services.io.newURI%28uri%2C%20null%2C%20null%29.asciiSpec%20%3A%20uri%3B%20%20%0A%0A%20%20%20var%20file%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.createInstance%28Ci.nsIFile%29%3B%0A%20%20%20file.initWithPath%28path%29%3B%0A%20%20%20%21file.exists%28%29%20%26%26%20custombuttons.alertSlide%28self.label%2C%20%22%u0424%u0430%u0439%u043B%20%u043D%u0435%20%u0441%u0443%u0449%u0435%u0441%u0442%u0432%u0443%u0435%u0442%22%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%20process.run%28false%2C%20%5Buri%5D%2C%201%29%3B%0A%7D%3B%0A%0A%0Athis.tooltipText%20%3D%20%22%u041B%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043C%u0435%u043D%u044E%20%u0441%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%u043C%u044B%20%5Cn%u0421%3A%20%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0432%20%u043C%u0435%u043D%u044E%20%u043D%u043E%u0432%u044B%u0439%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cn%5Cn%u0424%u0443%u043D%u043A%u0446%u0438%u0438%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043C%u0435%u043D%u044E%3A%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cn%20%20%u041B%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0443%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cn%20%20%u0421%3A%20%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0440%u0430%u0437%u0434%u0435%u043B%u0438%u0442%u0435%u043B%u044C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cn%20%20%u041F%3A%20%u0423%u0434%u0430%u043B%u0438%u0442%u044C%20%u043F%u0443%u043D%u043A%u0442%20%u043C%u0435%u043D%u044E%20%u0438%u043B%u0438%20%u0440%u0430%u0437%u0434%u0435%u043B%u0438%u0442%u0435%u043B%u044C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cn%20%20Ctrl+%u041F%3A%20%u0418%u0437%u043C%u0435%u043D%u0438%u0442%u044C%20%u043D%u0430%u0437%u0432%u0430%u043D%u0438%u0435%20%u043F%u0443%u043D%u043A%u0442%u0430%20%u043C%u0435%u043D%u044E%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cn%20%20%u041A%u043E%u043B%u0451%u0441%u0438%u043A%u043E%u043C%20%u043C%u044B%u0448%u0438%20%u043C%u043E%u0436%u043D%u043E%20%u043F%u0435%u0440%u0435%u0434%u0432%u0438%u0433%u0430%u0442%u044C%20%u043F%u0443%u043D%u043A%u0442%u044B%20%u043C%u0435%u043D%u044E%20%u0438%u043B%u0438%20%u0440%u0430%u0437%u0434%u0435%u043B%u0438%u0442%u0435%u043B%u0438%22%3B%0Athis.type%20%3D%20%22menu%22%3B%0A%0A//%20Autoopen/close%20feature%0Avar%20openDelay%20%3D%20200%3B%0Avar%20closeDelay%20%3D%20350%3B%0A%0Avar%20_openTimer%20%3D%200%3B%0Avar%20_closeTimer%20%3D%200%3B%0Athis.onmouseover%20%3D%20function%28e%29%20%7B%0A%09clearTimeout%28_closeTimer%29%3B%0A%09if%28e.target%20%3D%3D%20this%20%26%26%20closeOtherMenus%28%29%29%20%7B%0A%09%09this.open%20%3D%20true%3B%0A%09%09return%3B%0A%09%7D%0A%09_openTimer%20%3D%20setTimeout%28function%28%29%20%7B%0A%09%09self.open%20%3D%20true%3B%0A%09%7D%2C%20openDelay%29%3B%0A%7D%3B%0Athis.onmouseout%20%3D%20function%28e%29%20%7B%0A%09clearTimeout%28_openTimer%29%3B%0A%09_closeTimer%20%3D%20setTimeout%28function%28%29%20%7B%0A%09%09if%28%21isContextOpened%28%29%29%0A%09%09%09self.open%20%3D%20false%3B%0A%09%7D%2C%20closeDelay%29%3B%0A%7D%3B%0Afunction%20closeOtherMenus%28%29%20%7B%0A%09return%20Array.prototype.some.call%28%0A%09%09self.parentNode.getElementsByTagName%28%22*%22%29%2C%0A%09%09function%28node%29%20%7B%0A%09%09%09if%28%0A%09%09%09%09node%20%21%3D%20self%0A%09%09%09%09%26%26%20node.namespaceURI%20%3D%3D%20xulns%0A%09%09%09%09//%20See%20https%3A//github.com/Infocatcher/Custom_Buttons/issues/28%0A%09%09%09%09//%26%26%20node.boxObject%0A%09%09%09%09//%26%26%20node.boxObject%20instanceof%20Components.interfaces.nsIMenuBoxObject%0A%09%09%09%09%26%26%20%22open%22%20in%20node%0A%09%09%09%09%26%26%20node.open%0A%09%09%09%09%26%26%20node.getElementsByTagName%28%22menupopup%22%29.length%0A%09%09%09%29%20%7B%0A%09%09%09%09node.open%20%3D%20false%3B%0A%09%09%09%09return%20true%3B%0A%09%09%09%7D%0A%09%09%09return%20false%3B%0A%09%09%7D%0A%09%29%3B%0A%7D%0Afunction%20isContextOpened%28%29%20%7B%0A%09return%20inBtn%28document.popupNode%29%3B%0A%7D%0Afunction%20inBtn%28node%29%20%7B%0A%09for%28%3B%20node%3B%20node%20%3D%20node.parentNode%29%0A%09%09if%28node%20%3D%3D%20self%29%0A%09%09%09return%20true%3B%0A%09return%20false%3B%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%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%5BD%3A%5C%u041F%u0440%u043E%u0433%u0440%u0430%u043C%u043D%u043E%u0435%20%u043E%u0431%u0435%u0441%u043F%u0435%u0447%u0435%u043D%u0438%u0435%5C%u0424%u043B%u0435%u0448%u043A%u0430%20%u0437%u0430%u0433%u0440%u0443%u0437%u043E%u0447%u043D%u0430%u044F%5CWindows%207%20SP1%5C%u041F%u0440%u043E%u0433%u0440%u0430%u043C%u043C%u044B%5CChromePortable%5CChromePortable.exe%3EChrome%0AD%3A%5C%u041F%u0440%u043E%u0433%u0440%u0430%u043C%u043D%u043E%u0435%20%u043E%u0431%u0435%u0441%u043F%u0435%u0447%u0435%u043D%u0438%u0435%5C%u0424%u043B%u0435%u0448%u043A%u0430%20%u0437%u0430%u0433%u0440%u0443%u0437%u043E%u0447%u043D%u0430%u044F%5CWindows%207%20SP1%5C%u041F%u0440%u043E%u0433%u0440%u0430%u043C%u043C%u044B%5COpera_1217%5COpera%5Clauncher.exe%3EOpera%0AC%3A%5CProgram%20Files%20%28x86%29%5CMaxthon5%5CBin%5CMaxthon.exe%0AC%3A%5CProgram%20Files%20%28x86%29%5CInternet%20Explorer%5Ciexplore.exe%0AD%3A%5C%u041F%u0440%u043E%u0433%u0440%u0430%u043C%u043D%u043E%u0435%20%u043E%u0431%u0435%u0441%u043F%u0435%u0447%u0435%u043D%u0438%u0435%5C%u0424%u043B%u0435%u0448%u043A%u0430%20%u0437%u0430%u0433%u0440%u0443%u0437%u043E%u0447%u043D%u0430%u044F%5CWindows%207%20SP1%5C%u041F%u0440%u043E%u0433%u0440%u0430%u043C%u043C%u044B%5CMicrosoft%20Edge%5CProgramFiles%5Cmsedge.exe%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отредактировано egorsemenov06 (02-08-2020 13:21:56)

Отсутствует

 

№1490201-08-2020 21:10:43

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

Re: Custom Buttons

Duche пишет

отстают на один час от системных

Может это RFP так выкрутасничает.
В любом случае, можно подвести на час вперёд

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

аналог

Выделить код

Код:

...
      var now = new Date();
      now.setHours(now.getHours() + 1);

цифра

Выделить код

Код:

//var myGMToffset = (offset/60)*-1;
var myGMToffset = (offset/60)*-1 + 1;

Duche пишет

Код "Proxy"

Не души тёмнозелёным, возьми лучше какой-нибудь такой.
Иконки, надеюсь, сам сможешь заменить.

Отсутствует

 

№1490302-08-2020 12:57:03

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

Re: Custom Buttons

Dumby
Обратите пожалуйста внимание на пост https://forum.mozilla-russia.org/viewto … 56#p783656 и еще можно Вас попросить пожалуйста адаптировать для user_chrome_files вот эту кнопку

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

Выделить код

Код:

/*CODE*/
// »конка дл¤ создани¤ кнопки ¤рлыка без значка веб-сайта .................
var defaultFavicon = "chrome://custombuttons/skin/stdicons/gbutton.png";


// ѕолучить иконку сайта и запустить создание кнопки ¤рлыка .................
PlacesUtils.favicons.getFaviconDataForPage(
    gBrowser.currentURI,
    (uri, len, arr, mmt) => createButton(len
        ? `data:${mmt};base64,${btoa(String.fromCharCode(...arr))}`
        : defaultFavicon
    )
);

// ƒублировать кнопку и установить дл¤ новый кнопки иконку, название и код .................
function createButton(favicon) {  
    custombuttons.cloneButton(self, true);

    var newButtonLink = custombuttons.makeButtonLink("update", self.nextSibling.id);
    var params = custombuttons.cbService.getButtonParameters(newButtonLink).wrappedJSObject;

    params.image = favicon;
    params.name = gBrowser.contentTitle.slice(0, 75);
    params.code = `gBrowser.selectedTab = gBrowser.addTrustedTab("${gBrowser.currentURI.spec}", {userContextId: 1});`;

    custombuttons.cbService.installButton(params.wrappedJSObject = params);
}


иконка
скрытый текст

Выделить код

Код:

data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewQAAHsEBw2lUUwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABYSURBVDiNY2CgEjjKwMDwHw0fwaIOJgcHjEgS2AAjGv8/ujgLkS5EtwBuEBORBuAExLoA3atwL8BccBSLJmyBOIgBoXSAU57YdIBTnuJoHDwGEEoHtEsnALmSHj9YVKEQAAAAAElFTkSuQmCC


[firefox] 79.0

Отредактировано egorsemenov06 (02-08-2020 23:54:22)

Отсутствует

 

№1490402-08-2020 13:21:23

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

Re: Custom Buttons

Dumby.  Спасибо большое за отзывчивость и реальную помощь. Всё заработало.
Еще одна хотелочка и можно отказаться от расширений и полностью переходить на FF71

Три кода: Первые два не работают на FF71 а третий код "Двойным левым кликом на папке закладок добавлять закладку в папку закладок" работает но долго 15 секунд висит "транспарант" что закладка добавлена.

Первый "CB drag and go"

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

Выделить код

Код:

// CB drag and go, от 09.01.2017.перетаскивая выделенного текста левой клавишей на странице. ..................

({

  link: 
        {
        U: {
            name: "Открыть ссылку в новой активной странице", cmd: ()=> {
               gBrowser.selectedTab = gBrowser.addTab(self.link);
           }},
        //D: {
            //name: "Открыть ссылку в новой активной странице", cmd: ()=> {
               //gBrowser.selectedTab = gBrowser.addTab(self.link);
           //}}, 
        D: {
            name: "Открыть ссылку в новой фоновой странице", cmd: ()=> {
               gBrowser.addTab(self.link);
           }},      
        },
           
  text: 
        {
                U: {
            name: "Поиск текста поисковиком по умолчанию в новой активной странице", cmd: ()=> {
               var submission = Services.search.currentEngine.getSubmission(self.text, null);
               gBrowser.loadOneTab(submission.uri.spec, null, null, submission.postData, false, false);
               
           }},
        D: {
            name: "Поиск текста поисковиком по умолчанию в новой фоновой странице", cmd: ()=> {
               var submission = Services.search.currentEngine.getSubmission(self.text, null);
               gBrowser.loadOneTab(submission.uri.spec, null, null, submission.postData, false, false);
           }},
        },
        
  init: function() {
     self.this = this;

     // создать подсказку у кнопки
     
     var arr = [];
     ["link", "text"].forEach(ob=> {
        arr.push("\n" + ob);
        for (var key in this[ob]) arr.push(key + ':' + ["     ", "   ", " "][key.length-1] + this[ob][key].name);
     });
     self.tooltipText = self.label + "\n" + arr.join("\n");
     
     ["dragstart", "dragover", "drop"].forEach(type=> addEventListener(type, this, false, gBrowser));
  },
  
  convertFromUnicode: function(charset, str) {
     var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
     converter.charset = charset;
     str = converter.ConvertFromUnicode(str);
     return str + converter.Finish();
  },

  handleEvent: function(e) {
     if ( !content.location.protocol.startsWith("http") ) return; // если не http(s) страница

     switch (e.type) {
        
        case "dragstart": {
           self.lastDirection = "";
           self.currentPoint = [e.screenX, e.screenY];
     
            
           // получить перетаскиваемый элемент, текст или адрес ссылки или изображения
           self.el = e.target;
           self.text = e.dataTransfer.getData("text/unicode");
           self.img = e.dataTransfer.getData("application/x-moz-file-promise-url").split("\n")[0];
           var textLink = /^([a-z]+:\/\/)?([a-z]([a-z0-9\-]*\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(:[0-9]{1,5})?(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?$|^custombutton:\/\/\S+$/.test(self.text);
           self.link = textLink ? self.text : e.dataTransfer.getData("text/x-moz-url").split("\n")[0];
           
           // получить и обявить тип перетаскиваемого элемента
           self.type = (self.img || self.link) ? "link" : "text";
           
           break;
           }
           
    case "dragover": {
           Cc["@mozilla.org/widget/dragservice;1"].getService(Ci.nsIDragService).getCurrentSession().canDrop = true;
           
           // получить направление перетаскивания, L налево, R направо, U верх, D вниз
           var [subX, subY] = [e.screenX - self.currentPoint[0], e.screenY - self.currentPoint[1]];
           var [distX, distY] = [(subX > 0 ? subX : (-subX)), (subY > 0 ? subY : (-subY))];
           if ( distX < 10 && distY < 10 ) return;
           var direction = distX > distY ? (subX < 0 ? "L" : "R") : (subY < 0 ? "U" : "D");
           self.currentPoint = [e.screenX, e.screenY];
                      
           // получить весь жест, указать код жеста и показать подсказку жеста
           if ( direction != self.lastDirection.split('').pop() ) {
                self.lastDirection += direction;
                var dir = self.lastDirection, ob = this[self.type][dir];
                
                this.cmd = ob ? ob.cmd : "";
                XULBrowserWindow.statusTextField.label = ob ? "Жест мыши: " + dir + "   " + ob.name : "Неизвестный жест мыши: " + dir;
                }

           break;
           }
        
    case "drop": {
           // если перетаскивается в поле текстового ввода или из-за пределов окна браузера
           if ( !self.currentPoint || e.target instanceof Ci.nsIDOMNSEditableElement ) return;
           e.preventDefault();

           // запустить код жеста и сбросить подсказку жеста
           this.cmd && this.cmd();
           XULBrowserWindow.statusTextField.label = "";
           }
    }
   }
}).init();



Второй Autocopy+3


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

Выделить код

Код:

// Autocopy+3 от 26.12.2013.

// Настройка функций кликов мыши для кнопки ................................
this.onclick = function(e) {
   if ( e.button == 0 ) cbu.setPrefs("Autocopy", !cbu.getPrefs("Autocopy") ); 
       
   if ( e.button == 2 ) { 
        e.preventDefault();  
        menuPopup.showPopup( this, -1, -1, "popup", "bottomleft", "topleft");
        }     
}; 



// Проверить наличие строк в 'about:config' и создать если не существует ................................
if ( !cbu.isPref("Autocopy.saveWithDoubleClick") ) {
     ["Autocopy", "Autocopy.reset", "Autocopy.selectingTextBlink", "Autocopy.selectWithDoubleClick",
      "Autocopy.copyWithDoubleClick", "Autocopy.saveWithDoubleClick"].forEach(function(pref) { cbu.setPrefs( pref, false ) });
};



// Создать меню ................................
var array = [
    { label: 'Выключать автокопирование при выходе из браузера', value: 'Autocopy.reset' },
    { label: 'Выделенный текст мигает при автокопировании', value: 'Autocopy.selectingTextBlink' },
    { separator: ''},
    { label: 'Двойной правый клик мыши копирует выделенный текст', value: 'Autocopy.copyWithDoubleClick' },
    { label: 'Двойной левый клик мыши выделяет все в текстовых полях', value: 'Autocopy.selectWithDoubleClick' },
    { label: 'Двойной правый клик мыши сохраняет изображение без запроса', value: 'Autocopy.saveWithDoubleClick' }, 
    { label: 'Средним кликом вставлятъ текст с заменой выделенного текста', value: 'middlemouse.paste' }
];

var menuPopup = self.appendChild( document.createElement("menupopup") );
array.forEach(function( m ) {
    if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };
    var mItem = document.createElement("menuitem");
    mItem.setAttribute("label", m.label);
    mItem.setAttribute('type', 'checkbox');
    mItem.setAttribute('checked', custombuttons.getPrefs( m.value ) );
    mItem.setAttribute('onclick', 'custombuttons.setPrefs("' + m.value + '", !custombuttons.getPrefs("' + m.value + '"))');  
    menuPopup.appendChild( mItem );
});
menuPopup.setAttribute("onclick", "event.stopPropagation()");

// добавить стандартное контекстное меню ....
menuPopup.appendChild( document.createElement("menuseparator") );
menuPopup.appendChild( document.createElement("menu") ).setAttribute("label", "Меню кнопки");
var clone = menuPopup.lastChild.appendChild( document.getElementById("custombuttons-contextpopup").cloneNode(true) );
clone.setAttribute("onpopupshowing", "document.popupNode = document.getElementById('" + _id + "')");



// Установить нужную иконку кнопки при старте браузера или при изменениях настроек в 'about:config' ................................
const s = "Autocopy";
function toggleImage() {  
    self.image = cbu.getPrefs(s)
    ? "data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH1gUCFysoMPbyDwAABE5JREFUOI2NlV1sFFUUx39z73S/6C67s6UsQisWAgZBKRTUhBhDJAhEoyQ2QqMlhjcSP158MMYHoo+YGF5MjNCHqkmJKJpgaYAEFYhalWio2EWXpZgIS3G3uzu783Hn+tAPW2zRk5zcySTnd//nf+fMNfr6+qK1Wq1Fa50BWoCMlLJNSrkUWBIEwUKlVFJKWRZCDPu+3+O67sd79+69xR3C6Onp0alUyrYsSyeTSdHY2BiKxWIyEokQCoVoaGhgdHSUQqGAEALXdf1sNuvX6/WD4XB4f2dnZ2VWcG9vb6mrqyvheR5aa4IgmFonn33fx/O8qfR9H9u2g6Ghoeu2ba+eTb1pGEZJKZWwbRut9axtpVIpgiCY2sBxHJLJpIhGo5nBwcGXgTdurxGGYYz6vo9hGHP6FQQBUkrK5TK5XI5qtUosFiOdThuGYSyfrcYECq7r3hHsOA6u6zI2NkZLSwsAWmtM06Rx9MLKi7sj+UCqpBf1ztg+XZsOURZa6/8Eu64LgGVZU++01ri/n+NRZbWveun71tVbjiWWRNq3zWvgHQAhhFBBEMwJnSuql04j3RrRrdsN74lXKR88QqRpp6k8dgEIpZQ316HNFfalUxh/ZZm/PIrHm1x/aw038yPYbhEhGAUQeoJ6JytmKB0aQJav0LR+FfLas0Sv96GXVTBe6OBG8aijFPsmwbbv+/8LWvn5OGZ1hKZ1K5HXdkFxDOoWSQlF2e84tdyeDYc5BmBKKRuFEHN+wzB+UJWfPiPs3yK9fiXyaheUxsBJ44a2MXL881pQyO/ZcIi+yRpTax2fC6y1Hode+JQIZdLty5FXd0OpDE4TrrmVX0+cw72Z7+44xJHptUJKmbjd3+mjXfnxCFEqpNe2IfO7oVgGZwGu+TiXT33Dbwu2qY73Z0IBBDBPSjmlbnqODX5EVDhYa5eOQ0sV8Jpxza1kT54ntX0/lYUP1WezTwRBkJi0YvrPZ+zbXuaFNNYDrdOgC8ehA2eJbH6N2OrtBEHgAPJ2sAlEDcNAKfVP+4MfMj+VInnvAkTuGShVwc3gNGwhe+IrQptfRy99hGKxiO/79QmOBqYmTWito4ZhzLDAufgJ1sZORHwVXvg58BbhmI+R/eJL3I2vUEyuoVqtUq/XUUrVJiwV/1IshCAUCqGUwisXiLdtBKOOU7xJPbaTsKwx3H+a0v37MJrXIZVCa02tVgMoTKidMQym7/tWf3+/a1mWE4/HzUhuILJi01OGcmoEQRhcn+H+M5TbX0S0PsykiHg8ju/7BEEwCqQBeyIdALO7u1scOHCgNZ/PrwiFQm0dv7y9/4e7Hmy+r3SeP08e5sbwd2Sbn/ak16wW1+sik8mEEokEsViMfD5PoVAoAhngyiQUxm8QDeSBq4A8+7zxbum9Jy8fvVX74MRlBr6uLCns2KEXtYiRxcVisSWXyy0Lh8MrDMO4Wyl1j23bfwCXgOp0K/4GqDBYgeGFbWEAAAAASUVORK5CYII="
    : "data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAEj0lEQVR42n2Vf0xbVRTHv49HSwsFSvmxmtLBmMOZ6TYYcyNbYoQAMUAIRFEoyJxEidOYLP6jC8ZgImpCTGb8wwiMAS0bxD8WI4FGDIOamYBi9odaysY6wIGlBVqgfa+/PO+5kraAN7npu/f2fu4533Puuczg4KDc7XZrg8GgGoCWuppl2Rzq2fSdGQgEDvj9fiWNXTExMbM+n6+H5/nvmpubHfifxvT09ARTUlK2VSpVUKlUxigUCml8fDwrk8kglUohkUhgt9ths9lAYBDUZ7FYfB6P56u4uLi22trazT3B/f39G7qGhqTQhMftBlkPslTswjdZCa/Xu9OF8ZHcXPH/XZ2dqXtZz+j1+of1Op02NLG+trbr9OTkZPGQ0AGKxMSdNYNe/4lOp/toF9hgMMzU1NScjCPX94MnEog0xurqKtLS03fm7TQ2Go0D9dT2AhsrKipKEpOSotd2DhC0Jm2hTEmJWN9YX8dE36e/Hb5zNS3A+pVeuff2tg+6891wCVLoy8rK6ikQES5GWx4NdTmd8MyZIJu4G0wsrGRgtsI2fcW3xM305X2Di8zAwEBvcXFxo1wuFzWMhgjw6LEYZMttSAN+JCUfQfD5D+DJygAqczD7oNVT0A25kBVdJSUlFynF9gTv5cH2X2NgnfNIO3UMvK0HdlMOvFemEf/mCfy93LGU34lMpq+vr7O0tPSNhIQEMeL7uR6Cbv1hROzWAtLynwa7WEcLTiwE3oHfqIBr8ybHbc2/cvoabjG9vb1XSYp3hZQKgfezeHFCD4nnEUGfIqhOhMKjgktej3tGE+db/v3C6S7cCOVxd1FR0et040Qp9oOGmt/+PdiHBN0gKJcKXvIi5kYn3R6b9cKpbgzupBtpPEQavyQELzrl1hwO8eapUlMj6ePUuTTwsWUwG++AX71fW9CFoYg8pqwYJSlK0zMyIvY6qD4IbXNmiELMIb34vYh1fqwBc2O/YFZV5q9+/+vYXReEwKZX6+rORUMFS12/3kCCxA/ViWywVnI/P7LePDIZMDbv32psbFTsApPGd6lWPBuaEK6pCJ3SQyFnoTqeSdAG0nQL8B4ASlciAL3XrzuampoEd/3RYAuBnxQGq1QaBejmtAHJFETl0XTEzL/8H5RXg5OUwDI6iWc+fxBpHSAUGiGlAuHBW6ysrNQIqRYqk47eWhy9PAIEV+A1fwbJ0i1wbDEsI5Pgz16GL/MsnjtzJhwc/xjsCwfbq6qqVAKQXgp4XTbwU99CU/0huLV78DgdiLuvx+zIT9g4fglM9jmx0glZdDIvLwSW048nwgvhBaFbx9MLwlF5jJXNG2W5519gYlWHwG/awTsWYO18G668S8DBQvEVEaodvTZi3o+Pj//Q0tLyFrG2H3dOBJOlTEdHx0H6zqUNOQV/ftyG+psZx1KdWP7xGv6ZnYIlo9rLZhX6NRpNjFqtliZRvgu1xWq1Ynh4WN/a2vol7ReEt4fJEy4V2J9fY7wbkM2tONz60TkYTZuZtvLy8ie0Wq2GPNIS8DCV2FyGYbJIukNms/mL9vb2Ntq7FS7Fv/ChKzVwIHr3AAAAAElFTkSuQmCC";
    
};  
toggleImage();
gPrefService.addObserver( s, toggleImage, false );
addDestructor(function() { gPrefService.removeObserver( s, toggleImage, false ) });  



// Выключать кнопку при закрытии браузера если это разрешено в 'about:config' ................................
var turnOffButton = {
    observe: function(subject, topic, data) {
       if ( cbu.getPrefs("Autocopy.reset") && data == "shutdown" ) cbu.setPrefs("Autocopy", false );  
    }
};
Services.obs.addObserver( turnOffButton, "quit-application", false);
addDestructor(function() { Services.obs.addObserver( turnOffButton, "quit-application", false ) });  



// Функции автоматически копирует выделенный текст на странице, если это разрешено в 'about:config' ................................
function autocopy(e) {
   if ( e.button == 2 ) return;

   if ( /input|password|textarea|textbox|searchbar|findbar|tabbrowser/.test( e.target.localName.toLowerCase() ) ) return;
   
   if ( e.type == 'mousedown' ) var lastSelection = getBrowserSelection();
   
   if ( e.type !== 'mouseup' ) return; 
   
   var selection = getBrowserSelection();
   if ( cbu.getPrefs("Autocopy") && selection && selection !== lastSelection ) {
        goDoCommand('cmd_copy');
         
        // выделенный текст мигает ....
        if ( !cbu.getPrefs("Autocopy.selectingTextBlink") ) return;
             document.activeElement.blur();  
             setTimeout(function() { window.content.focus() }, 300);
        }
};
addEventListener("mouseup", autocopy, false, gBrowser );
addEventListener("mousedown", autocopy, false, gBrowser );



// Cредней кнопкой мыши вставить текст из буфера обмена в текстовые поля с заменой выделенного текста ................................
function middleMousePaste(e) { 
    if ( e.button == 1 && cbu.getPrefs('middlemouse.paste') ) {

         if ( /input|password|textarea|textbox|searchbar|findbar|cbeditor/.test( e.target.localName.toLowerCase() ) 
              && document.commandDispatcher.getControllerForCommand("cmd_paste") ) {
      
              e.preventDefault();
              e.stopPropagation();
               
              // вставить текст ....
              var cmd = "cmd_insertText"; 
              var commandDispatcher = ( this.document || document ).commandDispatcher; 
              var controller = commandDispatcher.getControllerForCommand(cmd);
  
              if ( controller && controller.isCommandEnabled(cmd) ) {
                   controller = controller.QueryInterface(Components.interfaces.nsICommandController);
                   var params = Components.classes["@mozilla.org/embedcomp/command-params;1"]
                                          .createInstance(Components.interfaces.nsICommandParams);
                   params.setStringValue("state_data", gClipboard.read() );    
                   controller.doCommandWithParams(cmd, params);
                   }
              }              
         }
};
addEventListener("click", middleMousePaste, true, document.documentElement );



// Дополнительные возможности для значка идентификации сайта в строке адреса ................................
addEventListener("click", function(e) { 
   e.preventDefault();
   e.stopPropagation();
   
   // ЛКМ без запроса открывает информацию о странице в вкладке 'Разрешения' ....
   if ( e.button == 0 ) {
        var doc = content.document;
        BrowserPageInfo( doc, ( (doc.location.protocol).slice(0,4) == "http") ? "permTab" : "generalTab" );
        }
        
   // ПКМ копирует текущий адрес ....     
   if ( e.button == 2) { 
        gClipboard.write( content.location );
                 
        // значок идентификации сайта мигает красным ....
        document.getElementById("identity-box").setAttribute("style", "background: red;");
        setTimeout(function() { document.getElementById("identity-box").removeAttribute("style") }, 500);
        }
}, true, document.getElementById("identity-box") );

   
   
// Дополнительные возможности для двойного клика мыши, если это разрешено в 'about:config' ................................
function handleDblClick(e) {

  var node = e.target;
  var editor = node.editor;
  
  // выделить все в текстовых полях ....
  if ( e.button == 0 && custombuttons.getPrefs("Autocopy.selectWithDoubleClick") ) {    
       e.preventDefault();

       if ( /input|textbox|textarea/.test( node.localName ) ) !editor ? node.select() : editor.selectAll();
       }
           
  // сохранить изображение без запроса ....    
  if ( e.button == 2 && cbu.getPrefs("Autocopy.saveWithDoubleClick") && node.localName == 'img' ) {
       saveImageURL( gContextMenu.imageURL, 0, 0, 0, 1, null, content.document );
       setTimeout(function() { document.getElementById("contentAreaContextMenu").hidePopup() }, 20);
       }      
       
  // скопировать выделенный текст ....
  if ( e.button == 2 && cbu.getPrefs("Autocopy.copyWithDoubleClick") && !/findbar|tabbrowser/.test( node.localName ) ) { 
       e.preventDefault();
       !editor ? goDoCommand("cmd_copy") : editor.copy();       
       try {        
           var box = ( node.textbox || node ).inputField.parentNode;
           var popup = box.ownerDocument.getAnonymousElementByAttribute( box, "anonid", "input-box-contextmenu");
           setTimeout(function() popup.hidePopup(), 50);
           }
       catch(e) { document.getElementById("contentAreaContextMenu").hidePopup() }; 
       }        
};
addEventListener("dblclick", handleDblClick, false, gBrowser );



// Наблюдатель следит за открытием окон адреса которых указанны в коде и добавляет им обработчики ................................
var observer = {  
       observe: function(subject, topic, data) {
          subject.addEventListener("load", this, false);
          },
      
       handleEvent: function(e) {
          var doc = e.target;
          var win = doc.defaultView;
          var href = doc.location.href; 
          win.removeEventListener("load", this, false);
         
          // закрывать 'Информацию о странице' или 'Библиотеку' двойным кликом на ней ....            
          if ( /pageInfo.xul|places.xul/.test( href ) ) {
          
               win.addEventListener("dblclick", function close() { this.close() }, true);
                         
               win.addEventListener("unload", function(e) {
                   win.removeEventListener(e.type, arguments.callee, false);
                             
                   win.removeEventListener("dblclick", close, true);
                   }, false);                  
               };
    
          // добавлять и удалять обработчики клика для редактора Custom Buttons ....
          if ( href.substring(0, 41) == "chrome://custombuttons/content/editor.xul" ) { 

               win.addEventListener("click", middleMousePaste, true );
               win.addEventListener("dblclick", handleDblClick, false );
          
               win.addEventListener("unload", function(e) {
                   win.removeEventListener(e.type, arguments.callee, false );
          
                   win.removeEventListener("click", middleMousePaste, true );
                   win.removeEventListener("dblclick", handleDblClick, false );
                   }, false);
               };
      }
};
Services.obs.addObserver(observer, "domwindowopened", false);
addDestructor(function() { Services.obs.removeObserver(observer, "domwindowopened", false) }); 



// Подсказка для кнопки ................................
this.tooltipText = "Autocopy \nЛ: Переключить автоматическое копирование \nП: Меню + CB меню";



Третий "Двойным левым кликом на папке закладок добавлять закладку в папку закладок"


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

Выделить код

Код:

// Двойным левым кликом на папке закладок добавлять закладку в папку закладок, от 06.06.2019. ......................
addEventListener("dblclick", (e, targ = e.originalTarget)=> {     
   if ( e.button || !targ._placesNode || !PlacesUtils.nodeIsFolder(targ._placesNode) ) return;          
   
   var docTitle = gBrowser.selectedTab.label.substr(0, 50);
   var folderId = PlacesUtils.getConcreteItemId(targ._placesNode);
   var folderTitle = PlacesUtils.bookmarks.getItemTitle(folderId);
   var currentURI = Services.io.newURI(gBrowser.currentURI.spec, null, null);
   PlacesUtils.bookmarks.insertBookmark(folderId, currentURI, 0, docTitle);  

   // всплывающая подсказка ....
   var favicon = gBrowser.selectedTab.image || "chrome://global/skin/icons/Portrait.png";
   Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
   .showAlertNotification(favicon, "Добавил в папку " + folderTitle + ":", docTitle);

   setTimeout(()=> { document.getElementById("bookmarksMenuPopup").hidePopup() }, 50);
  
});

Отредактировано Duche (02-08-2020 16:27:27)

Отсутствует

 

№1490502-08-2020 19:08:32

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 1619
UA: Firefox 79.0

Re: Custom Buttons

egorsemenov06 пишет

две кнопки

Вместо ваших двух кнопок достаточно одной в расширении Async Run Applications https://github.com/VitaliyVstyle/Vitali … xperiments

Отсутствует

 

№1490602-08-2020 19:57:37

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

Re: Custom Buttons

Vitaliy V. пишет
egorsemenov06 пишет

две кнопки

Вместо ваших двух кнопок достаточно одной в расширении Async Run Applications https://github.com/VitaliyVstyle/Vitali … xperiments

Спасибо Вам но расширение ставить не хочеться

Отсутствует

 

№1490702-08-2020 20:23:00

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 1619
UA: Firefox 80.0

Re: Custom Buttons

egorsemenov06
Это расширение подписать нельзя, только отключать проверку подписи или использовать Firefox Developer Edition.
Актуальный код спросите подскажут для этого.

Отсутствует

 

№1490802-08-2020 20:34:23

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

Re: Custom Buttons

Vitaliy V. пишет

egorsemenov06
Это расширение подписать нельзя, только отключать проверку подписи или использовать Firefox Developer Edition.
Актуальный код спросите подскажут для этого.

Расширение то устанавливаеться просто не хочеться ставить расширение мне лучше для user_chrome_files если можете помогите пожалуйста

Отсутствует

 

№1490902-08-2020 20:44:34

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 1619
UA: Firefox 80.0

Re: Custom Buttons

egorsemenov06
Ну для user_chrome_files наподобие этого https://forum.mozilla-russia.org/viewto … 54#p782454
можно сделать только с кнопкой, или можете использовать contextmenuopenwith. Ну а с интерфейсом для добавления приложений как в расширении увольте.

Отредактировано Vitaliy V. (02-08-2020 20:45:40)

Отсутствует

 

№1491003-08-2020 10:29:36

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

Re: Custom Buttons

Duche

Duche пишет

Третий "Двойным левым кликом на папке закладок добавлять закладку в папку закладок"

можно поприкалываться и сделать уведомления вверху

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

Выделить код

Код:

// Двойным левым кликом на папке закладок добавлять закладку в папку закладок, от 06.06.2019. .............................................................
addEventListener("dblclick", (e, targ = e.originalTarget)=> {     
   if ( e.button || !targ._placesNode || !PlacesUtils.nodeIsFolder(targ._placesNode) ) return;          
   
   var docTitle = gBrowser.selectedTab.label.substr(3, 50);
   var folderId = PlacesUtils.getConcreteItemId(targ._placesNode);
   var folderTitle = PlacesUtils.bookmarks.getItemTitle(folderId);
   var currentURI = Services.io.newURI(gBrowser.currentURI.spec, null, null);
   PlacesUtils.bookmarks.insertBookmark(folderId, currentURI, 0, docTitle);  

   // всплывающая подсказка ....
Components.utils.import('resource://gre/modules/PopupNotifications.jsm');
var notify  = new PopupNotifications(gBrowser,
                    document.getElementById("notification-popup"),
                    document.getElementById("notification-popup-box"));

var notification =  notify.show(
// browser
gBrowser.selectedBrowser,
// popup id
"PDES-popup",
// message
"Добавил в папку " + folderTitle + ":",
// anchor id
null,
// main action
null,
// secondary action
null,
// options
{ 
  // Alternative way to set the popup icon
  popupIconURL: gBrowser.selectedTab.image || "chrome://global/skin/icons/Portrait.png"
}
);

setTimeout(function(){
  notification.remove();
}, 2000); // Time in milliseconds to disappear the door-hanger popup.
});

Насчет Autocopy+3, где-то здесь Dumby выкладывал

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

Выделить код

Код:

/*Initialization Code*/
this.closest("toolbarpaletteitem") || (script => {
    var id = `CB${_id.slice(20)}:Autocopy`, pid = id + "Parent";
    var nsvoStr = `Components.utils.import("resource://gre/modules/Services.jsm", {})`;
    var nsvo = eval(nsvoStr), {Services} = nsvo, parent = nsvo[pid];
    if (!parent) {
        var cid = id + "Child", u = code => "data:," + encodeURIComponent(code);
        var pref = "CB.Autocopy.settings", topic = "quit-application-granted";
        var PREF_ENABLED = 1, PREF_BLINK = 2, PREF_RESET = 4;

        (parent = nsvo[pid] = {
            init() {
                this.readSettings();
                if (!this[PREF_ENABLED]) return;
                this.initChild();
                if (this[PREF_RESET]) this.setObserver(true);
            },
            destroy(reason) {
                var ud = reason[5] == "e";
                if (ud || !this.obsAdded) this.saveSettings();
                delete nsvo[pid];
                if (reason == "delete") Services.prefs.clearUserPref(pref);
                if (!this[PREF_ENABLED]) return;

                this.destroyChild();
                if (ud && this[PREF_RESET]) this.setObserver(false);
            },
            get processURL() {
                delete this.processURL;
                this.frameURL = u(`${nsvoStr}["${cid}"].init(this);`);
                return this.processURL = u(script.replace(/%ID%/g, cid)
                    .replace("%NSVO%", nsvoStr)
                    .replace("%PREF%", pref)
                    .replace("%PREF_BLINK%", PREF_BLINK)
                );
            },
            get frameURLDestroy() {
                delete this.frameURLDestroy;
                this.processURLDestroy = u(`${nsvoStr}["${cid}"].forget();`);
                return this.frameURLDestroy = u(`${nsvoStr}["${cid}"].destroy(this);`);
            },
            initChild() {
                Services.ppmm.loadProcessScript(this.processURL, true);
                Services.mm.loadFrameScript(this.frameURL, true);
            },
            destroyChild() {
                Services.mm.removeDelayedFrameScript(this.frameURL);
                Services.mm.loadFrameScript(this.frameURLDestroy, false);
                Services.ppmm.removeDelayedProcessScript(this.processURL);
                Services.ppmm.loadProcessScript(this.processURLDestroy, false);
            },
            readSettings() {
                var val = Services.prefs.getIntPref(pref, 3);
                for(var setting of [PREF_ENABLED, PREF_BLINK, PREF_RESET])
                    this[setting] = Boolean(val & setting);
            },
            saveSettings() {
                var settings = 0;
                for(var setting of [PREF_ENABLED, PREF_BLINK, PREF_RESET])
                    if (this[setting]) settings += setting;
                Services.prefs.setIntPref(pref, settings);
            },
            btns: new Set(),
            register(btn) {
                this.btns.add(btn);
                btn._handleClick = this.click;
                btn.oncontextmenu = this.context;
                this.setImg(btn, this[PREF_ENABLED]);
            },
            unregister(btn, reason) {
                this.btns.delete(btn);
                if (!this.btns.size) this.destroy(reason);
            },
            setImg(btn, state) {
                (btn.icon || btn.ownerDocument.getAnonymousElementByAttribute(
                    btn, "class", "toolbarbutton-icon"
                )).src = state
                    ? "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMBAAQIAAcEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAcACAMEAQEAAAAAAAAAAAAAAAACAwADAAAAABUnAB9cqgC3a7wB4Gq5Ad1qugHearoB3mq6Ad5qugHearoB3mi4AN1qugHgYrMAxR43AC8AAAAAAAEAAAECAAQAAAQAV6AAprP9Vv/W/qn80/+f/9T/ov/U/6L/1P+i/9T/ov/U/6L/1/+n/9X+pfy3/WL/Y7QAvwEAAQAAAAAAFSgAH1ehAKlyzwD1htgf/YzcJ/2K2yP9i9sk/YvbJf2L2yX9i9sm/YnaIv2b4kP92/21/Nf+qv9quwHdBQkACAAAAQBeqwCzr/tR/8X0j/u+8X//vvJ//77ygP++8oD/vvKA/77yf/+98n7/wvSH/4zcKv+e4kv93v+0/2i5AN0DBwAIBQkACGu8AdzV/af/4v/B/d//u//h/7//4f+//+H/v//h/7//4f+//9/+u//n/8n/w/GK/4zaK/3g/7r/aroC3gMHAAgEBwAIarkC3dX/pf/g/sD93v67/9/+vv/g/r//4P6//+D+v//f/r7/3f66/+T/xv/B8Yb/j9st/eT/w/9qugPeAwcACAQHAAhqugLe2v+w/+j/z/3l/8r/5//N/+f/zv/n/87/5//O/+f/zf/l/sj/7P/W/8Xyj/+Q2y/96f/N/2q6A94DBwAIBAcACGq6At7f/7n/7v/c/ev/1v/t/9n/7f/a/+3/2v/t/9r/7f/Z/+r+1f/y/+P/yPKW/5DbMf3s/9X/aroE3gMHAAgEBwAIaroC3uP/wf/z/+j98P/h//L/5P/z/+X/8//l//P/5f/y/+T/8P7g//j/7v/L8p3/kdsy/fD/3P9rugTeAwcACAQHAAhqugLe5v/J//j/8v31/+r/9v/t//f/7v/3/+//9//u//b/7f/0/un//f/4/87yo/+R2zL98f/f/2q5Bd0DBwAIBAcACGq6At7p/8///P/6/fj/8f/6//T/+v/1//r/9f/6//X/+v/0//f+8P//////0fGo/5PbNf30/+f/a7wE3AQJAAgEBwAIabkC3er/0f/+//79+v/0//v/9//8//j//P/4//z/+P/7//f/+f70///////T8qz/i9go+8P9ef9dqwCzAAACAAUJAAhquwHd7f7a//////z+//39/////f////3////9/////f////39/vz9/////dzzvv5v0AD1VqECqRUnAB8AAAAAAQACAGK0AL/J/Yf/8v7k/O3/1//u/9n/7v/Z/+7/2f/u/9n/7v/Z/+3/1//x/eP8vfxu/1WgAKYAAAUAAQIABAABAAAAAAAAHjcALmGzAMVquwLgarkC3Wq6At5qugLearoC3mq6At5qugLearkC3Wu8AeBbqgC3FScAHwAAAAACAwADAAAAAAAAAAAAAAAAAwQCAQQIAAgEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAgABwMDAgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
                    : "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEDAAQACAcEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAHCAMBBAEAAAAAAAAAAAAAAAACAAMDAAAAABUAJx9cAKq3awG84GoBud1qAbreagG63moBut5qAbreagG63mgAuN1qAbrgYgCzxR4ANy8AAAAAAAABAAEAAgQABAAAVwCgprNW/f/Wqf7805///9Si///Uov//1KL//9Si///Uov//16f//9Wl/vy3Yv3/YwC0vwEBAAAAAAAAFQAoH1cAoalyAM/1hh/Y/Ywn3P2KI9v9iyTb/Ysl2/2LJdv9iybb/Yki2v2bQ+L927X9/Neq/v9qAbvdBQAJCAABAABeAKuzr1H7/8WP9Pu+f/H/vn/y/76A8v++gPL/voDy/75/8v+9fvL/wof0/4wq3P+eS+L93rT//2gAud0DAAcIBQAJCGsBvNzVp/3/4sH//d+7///hv///4b///+G////hv///4b///9+7/v/nyf//w4rx/4wr2v3guv//agK63gMABwgEAAcIagK53dWl///gwP793rv+/9++/v/gv/7/4L/+/+C//v/fvv7/3br+/+TG///BhvH/jy3b/eTD//9qA7reAwAHCAQABwhqArre2rD//+jP//3lyv//583//+fO///nzv//587//+fN///lyP7/7Nb//8WP8v+QL9v96c3//2oDut4DAAcIBAAHCGoCut7fuf//7tz//evW///t2f//7dr//+3a///t2v//7dn//+rV/v/y4///yJby/5Ax2/3s1f//agS63gMABwgEAAcIagK63uPB///z6P/98OH///Lk///z5f//8+X///Pl///y5P//8OD+//ju///LnfL/kTLb/fDc//9rBLreAwAHCAQABwhqArre5sn///jy//316v//9u3///fu///37///9+7///bt///06f7//fj//86j8v+RMtv98d///2oFud0DAAcIBAAHCGoCut7pz////Pr//fjx///69P//+vX///r1///69f//+vT///fw/v//////0ajx/5M12/305///awS83AQACQgEAAcIaQK53erR///+/v/9+vT///v3///8+P///Pj///z4///79///+fT+///////TrPL/iyjY+8N5/f9dAKuzAAIAAAUACQhqAbvd7dr+//////z+/f/9/////f////3////9/////f////39/P79/////dy+8/5vAND1VgKhqRUAJx8AAAAAAQIAAGIAtL/Jh/3/8uT+/O3X///u2f//7tn//+7Z///u2f//7tn//+3X///x4/38vW78/1UAoKYABQAAAQACBAAAAQAAAAAAHgA3LmEAs8VqArvgagK53WoCut5qArreagK63moCut5qArreagK53WsBvOBbAKq3FQAnHwAAAAACAAMDAAAAAAAAAAAAAAAAAwIEAQQACAgEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAIBwMCAwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
            },
            click() {
                var newState = parent[PREF_ENABLED] = !parent[PREF_ENABLED];
                for(var btn of parent.btns) parent.setImg(btn, newState);
                newState ? parent.initChild() : parent.destroyChild();
                if (parent[PREF_RESET]) parent.setObserver(newState);
            },
            context(e) {
                if (e.ctrlKey || e.shiftKey) return;
                var btn = e.target;
                if (btn.btnPopup && e.detail > 1) return btn.btnPopup.hidePopup();
                e.preventDefault();
                (btn.btnPopup || parent.getPopup(btn)).openPopup(btn, "after_start");
            },
            getPopup(btn) {
                var win = btn.ownerGlobal, doc = win.document;
                var popup = doc.createElementNS(xulns, "menupopup");
                popup.setAttribute("onclick", "event.stopPropagation();");
                popup.setAttribute("oncommand", "handleCommand(event.target);");
                popup.setAttribute("onpopupshowing", "handlePopupshowing();");
                popup.menuitems = [];
                for(var [lab, pref] of win.Object.entries({
                    "Выделенный текст мигает при автокопировании": PREF_BLINK,
                    "Выключать автокопирование при выходе из браузера": PREF_RESET
                })) {
                    var menuitem = popup.appendChild(doc.createElementNS(xulns, "menuitem"));
                    menuitem.setAttribute("label", lab);
                    menuitem.setAttribute("type", "checkbox");
                    menuitem.pref = pref;
                    popup.menuitems.push(menuitem);
                }
                popup.handleCommand = menuitem => {
                    var newState = this[menuitem.pref] = menuitem.hasAttribute("checked");
                    if (!this[PREF_ENABLED]) return;

                    if (menuitem.pref == PREF_BLINK)
                        this.saveSettings(),
                        Services.ppmm.broadcastAsyncMessage(cid + ":FromParent", {blink: newState});
                    else if (menuitem.pref == PREF_RESET)
                        this.setObserver(newState);
                }
                popup.handlePopupshowing = () => {
                    for(var menuitem of popup.menuitems) this[menuitem.pref]
                        ? menuitem.setAttribute("checked", true)
                        : menuitem.removeAttribute("checked");
                }
                return btn.appendChild(btn.btnPopup = popup);
            },
            obsAdded: false,
            setObserver(set) {this.obsAdded = set
                ? Services.obs.addObserver(this, topic, false)
                : Services.obs.removeObserver(this, topic);
            },
            observe() {
                Services.obs.removeObserver(this, topic);
                this[PREF_ENABLED] = false;
                this.saveSettings();
            }
        }).init();
    }
    parent.register(this);
    addDestructor(reason => parent.unregister(this, reason), parent);

})(`(nsvo => (nsvo["%ID%"] = {
    x: -1, y: -1, down: false,
    handleEvent(e) {e.button || this[e.type](e);},
    mousedown(e) {this.x = e.screenX; this.y = e.screenY, this.down = true;},
    mouseup(e) {
        var {down} = this; this.down = false; if (!down) return;
        if (e.screenX == this.x && e.screenY == this.y && (e.detail == 1 || e.target.matches(
            "textarea[disabled],input[disabled],button,select,summary"
        )))
            return;
        var name = e.originalTarget.nodeName;
        if (/^(?:(?:xul:)?(?:slider|scrollbarbutton)|resizer)$/.test(name))
            return;
        this.x = this.y = -1;
        var win = this.getFocusedWin(e.target.ownerGlobal);
        var sel = win.getSelection();
        if (sel.toString()) {
            (win.docShell || win.document.docShell).doCommand("cmd_copy", null, win);
            this.blinkEnabled && this.blink(win, e.detail > 1);
        }
    },
    blinkEnabled: Boolean(
        Components.classes["@mozilla.org/preferences-service;1"]
            .getService(Components.interfaces.nsIPrefService)
            .getIntPref("%PREF%", 3) & %PREF_BLINK%
    ),
    blink(win, pause) {
        if (pause) return win.setTimeout(() => this.blink(win), 100);
        var sc = (win.docShell || win.document.docShell)
            .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
            .getInterface(Components.interfaces.nsISelectionDisplay)
            .QueryInterface(Components.interfaces.nsISelectionController);
        sc.setDisplaySelection(sc.SELECTION_OFF);
        sc.repaintSelection(sc.SELECTION_NORMAL);
        win.setTimeout(() => {
            sc.setDisplaySelection(sc.SELECTION_ON);
            sc.repaintSelection(sc.SELECTION_NORMAL);
        }, 150);
    },
    getFocusedWin(win) {
        var focusedWin = {};
        var elm = this.fm.getFocusedElementForWindow(win.top, true, focusedWin);
        return focusedWin.value;
    },
    get fm() {
        delete this.fm;
        return this.fm = Components.classes["@mozilla.org/focus-manager;1"]
            .getService(Components.interfaces.nsIFocusManager);
    },
    count: 0,
    init(cfmm) {
        this.count += 1;
        cfmm.addEventListener("mousedown", this);
        cfmm.addEventListener("mouseup", this);
        cfmm.addEventListener("unload", this);
        if (this.count == 1)
            this.cpmm.addMessageListener("%ID%:FromParent", this);
    },
    destroy(cfmm) {
        this.count -= 1;
        cfmm.removeEventListener("mousedown", this);
        cfmm.removeEventListener("mouseup", this);
        cfmm.removeEventListener("unload", this);
        if (!this.count)
            this.cpmm.removeMessageListener("%ID%:FromParent", this);
    },
    receiveMessage(msg) {
        if ("blink" in msg.data) this.blinkEnabled = msg.data.blink;
    },
    unload(e) {this.destroy(e.target);},
    forget: () => delete nsvo["%ID%"]

}).cpmm = this)(%NSVO%);`);

а насчет всплывающих подсказок - вверху -там  больше возможностей https://developer.mozilla.org/en-US/doc … ifications

Отредактировано Andrey_Krropotkin (03-08-2020 10:34:20)

Отсутствует

 

№1491103-08-2020 11:31:40

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

Re: Custom Buttons

Andrey_Krropotkin пишет

Andrey_Krropotkin

Большое спасибо за "Autocopy+3" и "Двойным левым". Меня волновали не столько место всплывающих подсказок (их расположение), сколько время которое оно висит перед главами ,в старом коде 15-20 секунд это перебор. А так и в верху хорошо и в низу хорошо. В Вашем коде интереснее, на мой взгляд.

Ещё бы починить "CB drag and go"  и можно окончательно переходить на FF71.

Отсутствует

 

№1491203-08-2020 16:48:13

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

Re: Custom Buttons

egorsemenov06 пишет

Обратите пожалуйста внимание на пост

Да видел. Хорошо, попробую. Один код на обе.
Во второй, передвиг пунктов заменил с колеса на перетаскивание.

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

Выделить код

Код:

try {((ext, data) => data.forEach(([id, impl]) => {
	impl.id = "ucf-cbbtn-" + id;
	CustomizableUI.createWidget(Object.assign(impl, ext))
}))({
	localized: false,
	onCreated(btn) {
		btn.owner = this;
		btn.type = "menu";
		btn.setAttribute("image", this.image);
		btn.openPopup = btn.openMenu;
		btn.openMenu = this.openMenu;

		var popup = btn.appendChild(btn.ownerDocument.createXULElement("menupopup"));
		popup.setAttribute("context", "");
		popup.setAttribute("oncommand", "owner.command(event)");

		this.init(btn, popup);
		var {openDelay, closeDelay} = this;
		this.autoOpenCloseFeature(btn.ownerGlobal, btn, openDelay, closeDelay);
	},
	file: Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile),
	openMenu(...args) {
		if (this.parentNode != this.domParent) {
			this.domParent = this.parentNode;
			this.owner.setPopupPosition(this);
		}
		this.openPopup(...args);
	},
	setPopupPosition(node) {
		if (node.matches(".widget-overflow-list > :scope"))
			var pos = "after_start";
		else var win = node.ownerGlobal, {width, height, top, bottom, left, right} =
			node.closest("toolbar").getBoundingClientRect(), pos = width > height
				? `${win.innerHeight - bottom > top ? "after" : "before"}_start`
				: `${win.innerWidth - right > left ? "end" : "start"}_before`;
		node.firstChild.setAttribute("position", pos);
	},
	// https://github.com/Infocatcher/Custom_Buttons/blob/master/code_snippets/autoOpenCloseMenu.js
	// Automatically open menu on mouse over (and hide it on mouse out)
	autoOpenCloseFeature(win, btn, openDelay = 200, closeDelay = 350) {
		var _openTimer = 0;
		var _closeTimer = 0;
		btn.onmouseover = function(e) {
			win.clearTimeout(_closeTimer);
			if(e.target == btn && closeOtherMenus()) {
				btn.open = true;
				return;
			}
			_openTimer = win.setTimeout(function() {
				btn.open = true;
			}, openDelay);
		};
		btn.onmouseout = function(e) {
			win.clearTimeout(_openTimer);
			_closeTimer = win.setTimeout(function() {
				if(!isContextOpened())
					btn.open = false;
			}, closeDelay);
		};
		function closeOtherMenus() {
			return win.Array.prototype.some.call(
				btn.parentNode.getElementsByTagName("*"),
				function(node) {
					if(
						node != btn
						&& win.XULElement.isInstance(node)
						// See https://github.com/Infocatcher/Custom_Buttons/issues/28
						//&& node.boxObject
						//&& node.boxObject instanceof Components.interfaces.nsIMenuBoxObject
						&& "open" in node
						&& node.open
						&& node.getElementsByTagName("menupopup").length
					) {
						node.open = false;
						return true;
					}
					return false;
				}
			);
		}
		function isContextOpened() {
			return inBtn(win.document.popupNode);
		}
		function inBtn(node) {
			for(; node; node = node.parentNode)
				if(node == btn)
					return true;
			return false;
		}
	}
}, Object.entries({

	OpenPageInOtherBrowser: {
		label: "Открыть страницу в другом браузере",
		image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAAsSAAALEgHS3X78AAAEgUlEQVQ4jU2TW2yTZQCG3+/7v/79266HraN1G8cNVoERNhk42BBmghiQBF3IMJnghYcbxUPEREiYF0bgihBREyNRQ4wENCwkBjlsyIA5WclWOe3ANrq2W1u6reu5/f//+7xQI8/tmzx5bx4yMjKCgYEByLIMAYBTirymEUYpbIrimkslzKXOpwLrV3NNceTAhZERNVfFC1mnNifGjO6i8NB4grCOjg7s378foBSVNju+3b6D+NUC/d43oGeK7dXLFlfu9BhKr244XObntvuvkPDURszNGiSjkhKTaYAtPO7tT15iQggAAASHVZJIs8sFlDqx69l1O4Lh+EeVddXPidrZN2XeZcDvswrGqnhBXXXowK2rRxtXGF0vy4XWzvOhG4wQ8o+IUCIAkYcoYrr+pXlqdo+nwQXR6BUk1WP13qhE5pRZX2cDMRRpn9U/LK870/egrfkZ66WCqir/P4IQakGHIad/LUaDbWrLIs2w+TbFyB16J75PDNg3I9V8XbKdO4GaEiffXWpqmZ8tN01Oq20ffLwuTv+1SOACvM7S+hcLtknbyzR56z0p2T9If3nYjmtTtSQV9BF51RqML1yOlP8hiQUfqU00va33RGD3a69fEZRQQgDoJmaAceu8t+/tWwxsDxK9o5OcOduICxE3ykvSSBUvhR66D1W/heyyGDG/GJLwxgSWb4q8NXh3xkgBEABQi6WqxvUr6neVzwHXbtJQO8dgQEWJG4gqZfDM3URZVzuml21DyRYdhk0JwutzWN0CT2OttJY6HApxWICG5uqad6qZVRry8s8j88j9YAJJi4JR5kZvnxfV1w+id8EupBreA1m5CNSVJZxRYTYT04JyuoTt2bNGb939KQjXthUNX8DJqAU/Oi1IbnFiY0UFgots2Onx4BQ/iC6sRX0sCclTBuR8EIQAnEAiRGYyM4MZ3PV06trz/Y81nM4UwZXOYLhlIbKPFdTHIzjh8+G3+FLkC1nU1uiQ2AMUIAlGOclnZR6OIcI4MTGiJzfoY4OlP0zbM1mJmx2KhHSxBe6KOKKBIdyOOFBpIHjaY8SOJV8AGT9ALKCEIDDBogODWj8DrBpJB+smxjPdV84Xeua3LjjCZUmzaBbmjffAVNGPl6pWIJGVYNW9KFE7IJgZah6abDYbfvq18HNsjocoVD8QuOWyrWzqyT1Qj4b/CPsU2cSy+bSWt+YwU4ihO9mJ7vhlNCndsBiMSGaYbmFWg7fX4D92OnEEACjJ+iEyYatTqI9qXBJ8x3yt492ROxQyQ07S5QLTcxmb/oKS0TebVS2dtOpWUSz19Rn9be2xV2eTPEQJqHTow70Q8T/X0vjjpuaaeRdnptPR/gujPekEXyOZjfN1JhOH0Ogn9gi15BTyKKDQ785lR949Htk7EVV7KAHlApyok5ehDn9lZdnJ9yU9l6Ys03X4ZMR/4GzCqtjleqnCXu1xs+IGU56MRrX43bHcWGimcJsQhADkhYAOAESdvIj80Dcw5vMYGQ7i4KlBdN4tIJEVIBD4L+knoRSAAPgT49/cEBl9hsIr+QAAAABJRU5ErkJggg==",
		tooltiptext: [
			"Л: Открыть меню с браузерами",
			"С: Добавить в меню новый браузер",
			"\nФункции кликов мыши для меню:",
				"\tЛ: Открыть страницу",
				"\tС: Добавить разделитель",
				"\tП: Удалить пункт меню или разделитель",
				"\tCtrl+П: Изменить название пункта меню",
			"Перетаскиванием можно передвигать пункты меню или разделители"
		].join("\n"),

		init(btn, popup) {
			btn.onauxclick = this.auxclick;
			popup.setAttribute("onpopupshowing", "this.shouldRebuild && owner.rebuild(this)");
			popup.ondragstart = this.dragstart;
			popup.shouldRebuild = true;
		},
		get markup() {
			try {var data = Cu.readUTF8URI(Services.io.newURI(
				`chrome://user_chrome_files/content/custom_scripts/${this.id}-data.txt`
			)).split("\n").filter(line => /\S/.test(line));}
			catch {var data = [
				"D:\\Програмное обеспечение\\Флешка загрузочная\\Windows 7 SP1\\Программы\\ChromePortable\\ChromePortable.exe>Chrome",
				"D:\\Програмное обеспечение\\Флешка загрузочная\\Windows 7 SP1\\Программы\\Opera_1217\\Opera\\launcher.exe>Opera",
				"C:\\Program Files (x86)\\Maxthon5\\Bin\\Maxthon.exe",
				"C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe",
				"D:\\Програмное обеспечение\\Флешка загрузочная\\Windows 7 SP1\\Программы\\Microsoft Edge\\ProgramFiles\\msedge.exe",
			];}
			delete this.markup;
			return this.markup = this.dataToMarkup(data);
		},
		setMarkup(popup) {
			this.markup = popup.innerHTML;
			for(var {node} of CustomizableUI.getWidget(this.id).instances)
				if (node.firstChild != popup) node.firstChild.shouldRebuild = true;
			this.write(Array.from(popup.children,
				node => node.hasAttribute("value")
					? node.tooltipText + (node.value == "true" ? ">" + node.label : "")
					: "separator"
			).join("\n"));
		},
		dataToMarkup(data) {
			var markup = "";
			for(var str of data) markup += str == "separator"
				? "<menuseparator/>" : this.strToMenuitem(str);
			return markup;
		},
		repl: [/^./, c => c.toUpperCase()],
		strToMenuitem(str, ind = str.lastIndexOf(">")) {
			var name, val, path = str;
			if ((val = ind != -1))
				path = str.slice(0, ind),
				name = str.slice(ind + 1);
			else
				this.file.initWithPath(path),
				name = this.file.leafName.split(".")
					.shift().replace(...this.repl);

			return `<menuitem label="${name}" tooltiptext="${path}" value="${val}"`
				+ ` class="menuitem-iconic" image="moz-icon://file://${path}"/>`;
		},
		append(popup, xul = this.markup) {
			popup.append(popup.ownerGlobal.MozXULElement.parseXULToFragment(xul));
		},
		rebuild(popup) {
			popup.textContent = "";
			this.append(popup);
			delete popup.shouldRebuild;
		},
		auxclick(e) {
			var trg = e.target, popup = this.firstChild;
			if (trg == this && e.button == 1)
				return this.owner.addMenuitem(popup);

			else if (trg.parentNode != popup) return;

			if (e.button == 1) {
				var up = e.screenY < trg.screenY + trg.clientHeight/2;
				up = up ? trg.previousSibling : !trg.nextSibling;
				trg[up ? "before" : "after"](
					trg.ownerDocument.createXULElement("menuseparator")
				);
			} else {
				if (e.ctrlKey) {
					if (trg.nodeName.endsWith("r")) return;

					var name = this.owner.prompt(
						"Введите другое название пункта",
						trg.label, trg.ownerGlobal
					);
					if (name && name != trg.label)
						trg.label = name,
						trg.value = true;
				}
				else trg.remove();
			}
			this.owner.changeMarkup(popup);
		},
		prompt(msg, value, domWin) {
			var res = {value};
			return Services.prompt.wrappedJSObject.pickPrompter({
				domWin, modalType: Ci.nsIPrompt.MODAL_TYPE_WINDOW
			}).nsIPrompt_prompt(this.label, msg, res, null, {})
				? res.value : null;
		},
		addMenuitem(popup) {
			var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
			fp.appendFilters(fp.filterApps);
			fp.init(popup.ownerGlobal, "Укажите путь к программе", fp.modeOpen);
			fp.open(res => {
				if (res == fp.returnOK)
					this.append(popup, this.strToMenuitem(fp.file.path, -1)),
					this.setMarkup(popup);
			});
		},
		changeMarkup(popup) {
			popup.state == "open"
				? popup.addEventListener("popuphidden", this, {once: true})
				: this.setMarkup(popup);
		},
		handleEvent(e) {
			this[e.type](e);
		},
		popuphidden(e) {
			this.setMarkup(e.target);
		},
		dragstart(e) {
			var trg = e.target;
			if (trg.parentNode.nodeName != "menupopup") return;

			var {owner} = this.parentNode;
			var pn = trg.flattenedTreeParentNode;
			owner.dragData = {trg, pn, ns: trg.nextSibling};

			trg.style.cssText = "font-weight: bold; color: red;"
				+ "outline: 2px solid red; outline-offset: -2px;"
					.replace(/;/g, " !important;");
			var win = trg.ownerGlobal;
			win.setCursor("grabbing");
			pn.addEventListener("mousemove", owner);
			win.addEventListener("mouseup", owner, {once: true});
		},
		mousemove(e) {
			var trg = e.target, dtrg = this.dragData.trg;
			if (trg == dtrg) return;

			e.movementY > 0
				? trg.nextSibling != dtrg && trg.after(dtrg)
				: trg.previousSibling != dtrg && trg.before(dtrg);
		},
		mouseup(e) {
			e.preventDefault();
			var {trg, pn, ns} = this.dragData;
			delete this.dragData;
			trg.removeAttribute("style");
			trg.ownerGlobal.setCursor("auto");
			pn.removeEventListener("mousemove", this);
			trg.nextSibling != ns && this.changeMarkup(trg.parentNode);
		},

		command(e) {
			this.file.initWithPath(e.target.tooltipText);
			if (this.file.exists()) {
				var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
				process.init(this.file);
				return process.run(false, [e.view.gBrowser.currentURI.spec], 1);
			}
			Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
				.showAlertNotification(this.image, this.label, "Файл не существует");
		},
		write(txt) {
			var file = Services.dirsvc.get("UChrm", Ci.nsIFile), CC = Components.Constructor;
			["user_chrome_files", "custom_scripts", this.id + "-data.txt"].forEach(file.append);
			var te = new (Cu.getGlobalForObject(Cu).TextEncoder)();
			var fos = CC("@mozilla.org/network/file-output-stream;1", "nsIFileOutputStream", "init")
				// MODE_{WRONLY, CREATE, TRUNCATE}, PERMS_FILE
				.bind(null, file, 0x02 | 0x08 | 0x20, 0o644, 0);
			var bos = CC("@mozilla.org/binaryoutputstream;1", "nsIBinaryOutputStream", "setOutputStream");

			(this.write = txt => {
				var stream = new fos();
				try {new bos(stream).writeByteArray(te.encode(txt));}
				catch(ex) {Cu.reportError(ex);}
				finally {stream.close();}
			})(txt);
		}
	},

	openExternalWinApplication: {
		label: "Открыть внешнее win приложение",
		image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAMAAwQAKCImDyo4IWkYaBzFQ6xI8FG/V/VCq0jcGGQbkwAQACQAAAAAAAIAAwAAAAAAAAAAAAAAAAEAAAIAAgIAQy4iYp9YOuZUah3/QMJQ/nfxgP97+Yb/f/+L/m/7ev87v0L1BzwIawAAAAAAAgADAAAAAAEAAAIAAAAAQR4Ki7pwNP//tG79aXQg/CGwM/tL3lP+SeJU/krmVf5I5lT8ROZQ/SjIMf8DQgWFAAAAAAACAAMAAAAAMRoKX5hKHP/qoVT69JtU/WVsGP8RmyP/LMAz/ynHM/4ozTP8Jc4w+x/KK/sbxyn7Daoa/wAlA1QAAAEAAgAAA2o5G9GhVyT/z305/N54Nv9eWxTyAnMR6Qp+DvsIig//CpQR/wucE/8KnQ//CpkG/QedAf8FZADWAwIACigYIklrMln7h0VB/6dcJPvBaCz/XC8RlgABAAACDgAlABUANAAfAUsAKABeAz8RlAhfUvkDZnP/CFtw+gcXKklSLEeVlUiB/6VamPykYGD7o1wl/2A4H5YAAAAAAgEBBAAAAAAAAQMEAAAAAAUoVmcHcfT/AIL5+QCK//8BOZ2rXjJRsJtOhf/SgLr9zoK++5hbW/9AKhaGAAAAAAICAQYAAQACAAMDBwAAAAABLlprD4///wqh9/oJsf//Al7M1FsxT6ucUYf/1Iq//Oyd1vzYkMf/X0FVhQAAAAADAgMEAAAAAAACBAQBAAAAAC1aYRSQ//8lpPr6Irj//wtt1t5GJT2DmlCF/82Juvz2reH/8Kbb/eej1P9jR1t+AAAAAAMCAwQBAwUGAAAAAAYkV2wjkv//PLP7+jzE//8VaMXMHhAaP5FLff+4d6b++rno//iz5P/3suP88rLg/2hPYn8AAAAAAQAAAAgPYW1bXeD/PJL0/1DB/fxSy///EkiRlwAAAABqOFzBp16S/+ev2Pz/we///b7s//u86vr7wev/dFxfcgAJYmhxeP//lJH+/juS+/5q0f/+V7n4/AASODwAAAAAHA4YP5NMgP+6fKj9/Mzw/f3H8/7/y/X/7LvU811Ywd54gPv8r6z//puZ/P1Akff5g+L//y5hmZ8AAAAAAgECAwAAAAA1Gy5vmlGG/8iOuP3/1vX/8sfe811YxNZ6g/f5ubb9/a6u+/uvrfz8TZPt/1GFvMcAAQwNAQAAAAAAAAACAQEDAAAAACoVJVh/QW3umWuP7V5fzeSMk/j9zcn//7+//v7Av///o6Pz+yU2XH0AAwYKAQAAAAAAAQEAAAAAAAAAAAEBAQMAAAAADwkHFAcCKUsJGb3VO0vn9lRf5/RdZMzXRkmTmw4OKTUAAAAAAgIDAwABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
		data: [
			["IE", "C:\\Program files\\Internet Explorer\\iexplore.exe"],
			["Explorer", "C:\\windows\\explorer.exe"],
			null,
			["Cmd Prompt", "C:\\windows\\system32\\cmd.exe"],
			["Media Player", "C:\\Program Files\\Windows Media Player\\wmplayer.exe"],
			["Task Manager", "C:\\windows\\system32\\taskmgr.exe"],
			["Control Panel", "C:\\windows\\system32\\control.exe"],
			null,
			["Notepad", "C:\\windows\\notepad.exe"],
			["Calculator", "C:\\windows\\system32\\calc.exe"],
			["Virtual Keyboard", "C:\\windows\\system32\\OSK.exe"],
			["Character table", "C:\\windows\\system32\\charmap.exe"]
		],
		init(btn) {
			btn.tooltipText = btn.label;
			btn.ownerGlobal.Object.defineProperty(btn, "domParent", this);
		},
		configurable: true,
		get() {
			delete this.domParent;
			var doc = this.ownerDocument, df = doc.createDocumentFragment();
			for(var arr of this.owner.data) {
				if (!arr) {
					df.append(doc.createXULElement("menuseparator"));
					continue;
				}
				var menuitem = df.appendChild(doc.createXULElement("menuitem"));
				menuitem.className = "menuitem-iconic";
				menuitem.setAttribute("label", arr[0]);
				menuitem.setAttribute("image", "moz-icon://file://" + arr[1]);
			}
			this.firstChild.append(df);
		},
		command(e) {
			this.file.initWithPath(e.target.getAttribute("image").slice(18));
			this.file.launch();
		}
	}
}))} catch(ex) {Cu.reportError(ex);}

egorsemenov06 пишет

можно Вас попросить пожалуйста адаптировать для user_chrome_files вот эту кнопку

Ещё не легче, совсем поперёк ситуации.

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

Выделить код

Код:

try {CustomizableUI.createWidget(({
	label: "XXXXX XXXXXXX",
	image: "data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewQAAHsEBw2lUUwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABYSURBVDiNY2CgEjjKwMDwHw0fwaIOJgcHjEgS2AAjGv8/ujgLkS5EtwBuEBORBuAExLoA3atwL8BccBSLJmyBOIgBoXSAU57YdIBTnuJoHDwGEEoHtEsnALmSHj9YVKEQAAAAAElFTkSuQmCC",
	defaultFavicon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjIyt5EXfQAAAmZJREFUOE91k1tIVFEUhj/v0l0LHyoiqoemKHowKaywMm9EIhVJRFl01aBIuphYliKNWqIv5pOgZWGGdHspJUtCSkW6vBRYb4EIEWJhzTSr/8xMg1ke+Nh7r73Ot9feZ58wKgGf8IjvYvwTRiO/FBhj/19x7wz4NAJeJ+oIrogycU4UhYilPGqIi5FDnCBWwBFxUhRIkKU2baLAHQVngqJzHKN1gY8Wl48C9fMVH26CQ8qZVHA1GmrjApIi+hjKNj7nmAR9lChuXXBQOZMKqjV5PQEKSaIuzoMvxfyUz/FQlpCD9f9XUEA55zkrSmmjemYbF6a+5t1mw5IC9GcZhfGDNKTdZ4dy9sY0skX5aaoNNx3cmG8MbB5lINF4myxcxo9Nhnd1gLEtxsulxtNlxnONO9ca+dNNkg5HkEVDQjc9WsmXqRdV8tgq4+ty48uKAE7/p2LedcZoqtGsBfKmdJPqfAu3DqyYlSqok0dzjfcLjI+L/+XDEqN3kVE321R6Jyl6J9X5jBWiRJzCxaWYFzRP03YkmkiPtlkRZ2TyRKW7BAFBvU69VlSJRtcBVWJ0xRvPxuGMH2vlPWHOvhNJD14iR0JLEtwSt8Wd5BoqI4wHqqJdtAbbh2rvieORjmCrf/U/cDOZENfmvaFGgsYYo0oURXu4HOWhPtpo0vi0BBupFYTAenXD/IRTqlLd4cZ5kccw2bSTIXapX6pYseQbeMV6Cf7AyF2CxHNUezysfzKXQV2YbLYrcZtIV3+jYjs1t4FvuqcRAj/+HzXAQvbpAHfrPuYyS8mEBBnqpyi2TnNrlJOk3KDgN9P8GjD3yqukAAAAAElFTkSuQmCC",
	id: "ucf-cbbtn-LnkCreator",
	localized: false,
	onCreated(btn) {
		btn.owner = this;
		btn.tooltipText = this.label;
		btn.setAttribute("image", this.image);
		btn.setAttribute("oncommand", "owner.createLnk(this)");
	},
	init() {
		this.widget.parent = this;
		this.widget.contextmenu.destroy = id => {
			CustomizableUI.destroyWidget(id);
			delete this.data[id.slice(8)];
			this.save();
		}
		try {this.data = JSON.parse(Cu.readUTF8URI(Services.io.newURI(
			`chrome://user_chrome_files/content/custom_scripts/${this.id}-data.json`
		)))}
		catch {this.data = {}; return this;}
		for(var [id, inf] of Object.entries(this.data))
			this.createWidget(id, inf.url, inf.name);
		return this;
	},
	get fs() {
		delete this.fs;
		return this.fs = Cc["@mozilla.org/browser/favicon-service;1"]
			.getService(Ci.nsIFaviconService);
	},
	createLnk(btn) {
		var id = Date.now();
		var gb = btn.ownerGlobal.gBrowser;
		var uri = gb.currentURI;
		var label = gb.contentTitle.slice(0, 75);

		var widget = this.createWidget(id, uri, label);
		var {area, position} = CustomizableUI.getPlacementOfWidget(this.id);
		CustomizableUI.addWidgetToArea(widget.id, area, position + 1);

		this.data[id] = {name: label, url: uri.spec};
		this.save();
	},
	createWidget(id, url, label) {
		var obj = {
			uri: url.spec ? url : Services.io.newURI(url),
			id: "ucf-lnk-" + id, label, ...this.widget
		};
		var widget = obj.widget = CustomizableUI.createWidget(obj);
		this.fs.getFaviconDataForPage(obj.uri, obj);
		return widget;
	},
	tip: "\nShift+ПКМ - Удалить кнопку",
	widget: {
		localized: false,
		onCreated(btn) {
			btn.uri = this.uri;
			btn.addTab = this.addTab;
			btn.oncontextmenu = this.contextmenu;
			btn.setAttribute("oncommand", "addTab(this)");
			btn.tooltipText = this.label + this.parent.tip;
			this.image && btn.setAttribute("image", this.image);
		},
		addTab(btn) {
			var gb = btn.ownerGlobal.gBrowser;
			gb.selectedTab = gb.addTrustedTab(btn.uri.spec, {userContextId: 1});
		},
		contextmenu: function checkShift(e) {
			if (e.shiftKey)
				e.preventDefault(),
				checkShift.destroy(e.target.id);
		},
		onComplete(uri, len, arr, mmt) {
			this.image = len
				? `data:${mmt};base64,${btoa(String.fromCharCode(...arr))}`
				: this.parent.defaultFavicon
			for(var {node} of this.widget.instances)
				node.hasAttribute("image") || node.setAttribute("image", this.image);
			delete this.widget;
		}
	},
	save() {
		var file = Services.dirsvc.get("UChrm", Ci.nsIFile), CC = Components.Constructor;
		["user_chrome_files", "custom_scripts", this.id + "-data.json"].forEach(file.append);
		var te = new (Cu.getGlobalForObject(Cu).TextEncoder)();
		var fos = CC("@mozilla.org/network/file-output-stream;1", "nsIFileOutputStream", "init")
			// MODE_{WRONLY, CREATE, TRUNCATE}, PERMS_FILE
			.bind(null, file, 0x02 | 0x08 | 0x20, 0o644, 0);
		var bos = CC("@mozilla.org/binaryoutputstream;1", "nsIBinaryOutputStream", "setOutputStream");

		(this.write = () => {
			var stream = new fos();
			try {new bos(stream).writeByteArray(
				te.encode(JSON.stringify(this.data))
			);} catch(ex) {Cu.reportError(ex);}
			finally {stream.close();}
		})();
	}
}).init())} catch(ex) {Cu.reportError(ex);}

Duche пишет

15-20 секунд это перебор

Можно точно так же закрыть по таймауту.

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

Выделить код

Код:

...
   // всплывающая подсказка ....
   var favicon = gBrowser.selectedTab.image || "chrome://global/skin/icons/Portrait.png";
   var as = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
   var name = "bookmarks-alert-" + Date.now();
   as.showAlertNotification(
   	favicon, "Добавил в папку " + folderTitle + ":", docTitle, false, null, null, name
   );
   setTimeout(() => as.closeAlert(name), 2e3);

Duche пишет

Ещё бы починить "CB drag and go"  и можно окончательно переходить на FF71.

Ну, перетаскиваемого добра в процессе кнопок нет, однако,
какой-то dataTransfer проброшен, теоретически прицепиться можно.
Но лучше бы WebExtensions поискал, они должны уметь делать то, что в кнопке.

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

Выделить код

Код:

addEventListener("dragstart", ({
	link: {
		U: {
			name: "Открыть ссылку в новой активной странице", cmd() {
				openUILinkIn(this.val, "tab", this.opts);
			}
		},
		D: {
			name: "Открыть ссылку в новой фоновой странице", cmd() {
				openUILinkIn(this.val, "tabshifted", this.opts);
			}
		}
	},
	text: {
		U: {
			name: "Поиск текста поисковиком по умолчанию в новой активной странице", cmd() {
				this.search("tab");
			}
		},
		D: {
			name: "Поиск текста поисковиком по умолчанию в новой фоновой странице", cmd() {
				this.search("tabshifted");
			}
		}
	},
	search(where) {
		var engine = Services.search[`default${this.opts.private ? "Private" : ""}Engine`];
		var submission = engine.getSubmission(this.val, null, "");
		openUILinkIn(submission.uri.spec, where, {postData: submission.postData, ...this.opts});
	},
	opts: {
		//relatedToCurrent: true,
		triggeringPrincipal: document.nodePrincipal,
		get userContextId() {
			return parseInt(gBrowser.selectedBrowser.getAttribute("usercontextid"));
		},
		get private() {
			return PrivateBrowsingUtils.isWindowPrivate(window);
		}
	},
	init() {
		var arr = [];
		for(var type of ["link", "text"]) arr.push(
			type + "\n" + Object.entries(this[type]).map(a => a[0] + ":\t" + a[1].name).join("\n")
		);
		self.tooltipText = (self.label ? self.label + "\n\n" : "") + arr.join("\n\n");

		this.drop = () => this.drag();
		this.handleEvent = e => this[e.type](e);
		return this;
	},
	dragstart(e) {
		//if (!gBrowser.currentURI.spec.startsWith("http")) return;
		if (!e.dataTransfer.mozItemCount || !gBrowser.selectedBrowser.matches(":hover"))
			return;

		var dt = e.dataTransfer;
		this.type = this.link;
		this.dir = this.val = "";

		
		var url = dt.getData("text/x-moz-url-data");
		if (url) this.val = url;
		else {
			var txt = dt.getData("text/plain");
			if (txt) {
				this.val = txt;
				if (!this.textLinkRe.test(txt)) this.type = this.text;
			}
			else return;
		}
		this.x = e.screenX; this.y = e.screenY;
		this.drag(true);
	},
	drag(init) {
		var meth = `${init ? "add" : "remove"}EventListener`;
		for(var type of this.events) window[meth](type, this, true);
		init || StatusPanel.panel.setAttribute("inactive", true);
	},
	events: ["dragover", "drop", "dragend"],
	dragover(e) {
		var {x, y} = this, cx = e.screenX, cy = e.screenY;
		var dx = cx - x, ax = Math.abs(dx), dy = cy - y, ay = Math.abs(dy);
		if (ax < 10 && ay < 10) return;

		this.x = cx; this.y = cy;
		var dir = ax > ay ? dx > 0 ? "R" : "L" : dy > 0 ? "D" : "U";
		if (this.dir.endsWith(dir)) return;

		dir = this.dir += dir;
		var obj = this.type[dir];
		var txt = `${
			obj ? "Ж" : "Неизвестный ж"
		}ест мыши: ${dir + (obj ? "  " + obj.name : "")}`;

		StatusPanel._labelElement.value = txt;
		StatusPanel.panel.removeAttribute("inactive");
	},
	dragend(e) {
		var dt = e.dataTransfer;
		this.drag();

		var obj = this.type[this.dir];
		if (!obj || dt.mozUserCancelled) return;

		var x = e.screenX, y = e.screenY;
		var wx = mozInnerScreenX, wy = mozInnerScreenY;
		x > wx && y > wy && x < wx + innerWidth && y < wy + innerHeight
			&& obj.cmd.call(this);
	},
	textLinkRe: /^([a-z]+:\/\/)?([a-z]([a-z0-9\-]*\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(:[0-9]{1,5})?(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&amp;]*)?)?(#[a-z][a-z0-9_]*)?$|^custombutton:\/\/\S+$/
}).init(), true, gBrowser.tabpanels || 1);

Отсутствует

 

№1491303-08-2020 17:39:14

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

Re: Custom Buttons

Dumby пишет

Ещё не легче, совсем поперёк ситуации.

От души Огромнейшее СПАСИБО ВАМ!!!

Отсутствует

 

№1491404-08-2020 00:00:11

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

Re: Custom Buttons

Dumby
как блокировать всегда? если смысл ? летит шняга в storage c youtube и яндекса
la4shnet.jpg

Отсутствует

 

№1491504-08-2020 07:45:18

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

Re: Custom Buttons

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

Отсутствует

 

№1491604-08-2020 09:09:36

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

Re: Custom Buttons

solombala пишет

как блокировать всегда?

Видимо, создать числовую настройку permissions.default.persistent-storage со значением 2

Отсутствует

 

№1491704-08-2020 10:56:23

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

Re: Custom Buttons

Dumby

Dumby пишет

Видимо, создать числовую настройку permissions.default.persistent-storage со значением 2

Уй,шикардос! А, "иметь доступ к экрану" ? тоже заблокировать на глушняк.

Отредактировано solombala (04-08-2020 11:10:15)

Отсутствует

 

№1491804-08-2020 13:47:44

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

Re: Custom Buttons

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


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

Выделить код

Код:

/*CODE*/


[...gBrowser.tabs].forEach((tab)=> !tab.pinned && gBrowser.removeTab(tab));   /*закрыть все вкладки*/

 getBrowser (). selectedTab = getBrowser (). addTab ("https://yandex.ru");  /*Закрытие всех вкладок приводило к открытию домашней страницы*/

Отсутствует

 

№1491904-08-2020 13:58:47

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

Re: Custom Buttons

Duche пишет

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

:/

Выделить код

Код:

/*CODE*/

[...gBrowser.tabs].forEach((tab)=> !tab.pinned && gBrowser.removeTab(tab)); /*закрыть все вкладки*/
  var url = "https://yandex.ru";
  openUILinkIn(url, 'current', { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() }); /*Закрытие всех вкладок приводило к открытию домашней страницы*/

Отсутствует

 

№1492004-08-2020 14:55:54

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

Re: Custom Buttons

Dumby
Возможно ли реализовать такую штуку.

Заходя на любую страницу любого сайта получить массив ссылок.
И, если какие-то из них ссылаются на youtube.com или на youtu.be, то при клике на такие ссылки происходил редирект на invidio.us.


Например:
https://www.youtube.com/watch?v=MdGDMFuT8vU  --->  https://invidio.us/watch?v=MdGDMFuT8vU
https://youtu.be/336Z5BhM7h0  --->  https://invidio.us/336Z5BhM7h0


P.S. Желательно, чтобы код работал как на FF52 ESR, так и на FF78 ESR.

Отсутствует

 

№1492104-08-2020 15:11:06

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

Re: Custom Buttons

unter_officer 

Спасибо большое.

Отсутствует

 

№1492204-08-2020 20:20:57

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

Re: Custom Buttons

solombala пишет

А, "иметь доступ к экрану" ?

То же самое, только persistent-storage заменить на screen


unter_officer пишет

Возможно ли реализовать такую штуку.

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


Может попробуй какую-нибудь обезьяну ({Tamper, Grease, Violent}monkey)
под это дело подрядить. Например, чтобы href по клику подменялся, типа

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

Выделить код

Код:

((re, ret) => {
	var listener = e => {
		if (e.button > 1) return;
		var link = e.target.closest("a[href]");
		if (link && re.test(link.href)) {
			var was = link.getAttribute("href");
			link.href = "https://invidio.us/" + RegExp.rightContext;
			setTimeout(ret, 200, link, was);
		}
	}
	addEventListener("click", listener, true);
	"onauxclick" in document && addEventListener("auxclick", listener, true);
})(
	/^https:\/\/(?:www\.)?youtu(?:be\.com|\.be)\//,
	(link, href) => link.setAttribute("href", href)
);

Отсутствует

 

№1492305-08-2020 03:14:23

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

Re: Custom Buttons

Dumby пишет

Может попробуй какую-нибудь обезьяну ({Tamper, Grease, Violent}monkey)
под это дело подрядить. Например, чтобы href по клику подменялся, типа

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

Выделить код

Код:

((re, ret) => {
	var listener = e => {
		if (e.button > 1) return;
		var link = e.target.closest("a[href]");
		if (link && re.test(link.href)) {
			var was = link.getAttribute("href");
			link.href = "https://invidio.us/" + RegExp.rightContext;
			setTimeout(ret, 200, link, was);
		}
	}
	addEventListener("click", listener, true);
	"onauxclick" in document && addEventListener("auxclick", listener, true);
})(
	/^https:\/\/(?:www\.)?youtu(?:be\.com|\.be)\//,
	(link, href) => link.setAttribute("href", href)
);

Собственно, у меня Tampermonkey установлен. Однако скрипт не срабатывает.

Отсутствует

 

№1492405-08-2020 08:50:11

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

Re: Custom Buttons

unter_officer пишет

Однако скрипт не срабатывает.

Ну да, я же говорю — бесполезно :).
Но, всё таки, немного любопытно почему не срабатывает.


Вот, провёл такой эксперимент на Firefox 78.0
Открыл новую пустую вкладку и скормил адресной строке
data: адрес (простая html'ка с двумя ссылками, которые ты предоставил).


Открыл веб-консоль (Ctrl+Shift+K) и запустил с js-терминала код.


ЛКМ по ссылке на странице — GET-запрос на invidio.us есть,
и в адресной строке, в конце концов, invidio.us тоже появляется.
А Ctrl+ЛКМ или СКМ — новая вкладка, и снова с invidio.us
Так же и на Firefox 52.0.


Попробуй повторить, если интересно. Лучше на чистом, по возможности.
В смысле, если так работает, то дело не в самом коде, а в чём-то другом, наверно.

url

Выделить код

Код:

data:text/html;charset=utf-8,%3C!DOCTYPE%20html%3E%0A%3Chtml%3E%0A%09%3Chead%3E%0A%09%09%3Ctitle%3ETest%20yt%20links%3C%2Ftitle%3E%0A%09%09%3Cmeta%20http-equiv%3D%22Content-Type%22%20content%3D%22text%2Fhtml%3B%20charset%3Dutf-8%22%3E%0A%09%3C%2Fhead%3E%0A%09%3Cbody%3E%0A%09%09%3Ccenter%3E%0A%09%09%09%3Cbr%2F%3E%3Cbr%2F%3E%0A%09%09%09%3Ca%20href%3D%22https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DMdGDMFuT8vU%22%3Ewww.youtube.com%2Fwatch%3Fv%3DMdGDMFuT8vU%3C%2Fa%3E%0A%09%09%09%3Cbr%2F%3E%3Cbr%2F%3E%0A%09%09%09%3Ca%20href%3D%22https%3A%2F%2Fyoutu.be%2F336Z5BhM7h0%22%3Eyoutu.be%2F336Z5BhM7h0%3C%2Fa%3E%0A%09%09%3C%2Fcenter%3E%0A%09%3C%2Fbody%3E%0A%3C%2Fhtml%3E

Отсутствует

 

№1492505-08-2020 08:58:53

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

Re: Custom Buttons

Dumby - привет! Доработал кнопку (возможно твоего авторства), но получаю ошибку при использовании многострочной подсказки в параметрах, подробно расписал в коде…
код приготовлен для быстрой проверки. При запуске кнопки сразу видны два варианта меню переключения.
в кнопке 2 удобных меню переключения опций Firefox. (проверял на Waterfox)

Хотел сделать многострочные подсказки, но не получилось. ОШИБКА видна в строке меню: «Прокси (многострочная подсказка)» —
основной пункт меню всегда «Other», хотя должен подставляться, исходя из параметра в strValues:localhost+"\n МНОГОСТРОЧНАЯ ПОДСКАЗКА,,,отключен…,,,0|||…

экспортированная кнопка

Отсутствует

 

Board footer

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