Dumby
Не могли бы Вы адаптировать для user_chrome_files две кнопки в 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)
Отсутствует
отстают на один час от системных
Может это RFP так выкрутасничает.
В любом случае, можно подвести на час вперёд
цифра
Код "Proxy"
Не души тёмнозелёным, возьми лучше какой-нибудь такой.
Иконки, надеюсь, сам сможешь заменить.
Отсутствует
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
Отредактировано egorsemenov06 (02-08-2020 23:54:22)
Отсутствует
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)
Отсутствует
две кнопки
Вместо ваших двух кнопок достаточно одной в расширении Async Run Applications https://github.com/VitaliyVstyle/Vitali … xperiments
Отсутствует
egorsemenov06 пишетдве кнопки
Вместо ваших двух кнопок достаточно одной в расширении Async Run Applications https://github.com/VitaliyVstyle/Vitali … xperiments
Спасибо Вам но расширение ставить не хочеться
Отсутствует
egorsemenov06
Это расширение подписать нельзя, только отключать проверку подписи или использовать Firefox Developer Edition.
Актуальный код спросите подскажут для этого.
Отсутствует
egorsemenov06
Это расширение подписать нельзя, только отключать проверку подписи или использовать Firefox Developer Edition.
Актуальный код спросите подскажут для этого.
Расширение то устанавливаеться просто не хочеться ставить расширение мне лучше для user_chrome_files если можете помогите пожалуйста
Отсутствует
egorsemenov06
Ну для user_chrome_files наподобие этого https://forum.mozilla-russia.org/viewto … 54#p782454
можно сделать только с кнопкой, или можете использовать contextmenuopenwith. Ну а с интерфейсом для добавления приложений как в расширении увольте.
Отредактировано Vitaliy V. (02-08-2020 20:45:40)
Отсутствует
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)
Отсутствует
Andrey_Krropotkin
Большое спасибо за "Autocopy+3" и "Двойным левым". Меня волновали не столько место всплывающих подсказок (их расположение), сколько время которое оно висит перед главами ,в старом коде 15-20 секунд это перебор. А так и в верху хорошо и в низу хорошо. В Вашем коде интереснее, на мой взгляд.
Ещё бы починить "CB drag and go" и можно окончательно переходить на FF71.
Отсутствует
Обратите пожалуйста внимание на пост
Да видел. Хорошо, попробую. Один код на обе.
Во второй, передвиг пунктов заменил с колеса на перетаскивание.
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);}
можно Вас попросить пожалуйста адаптировать для 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);}
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);
Ещё бы починить "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+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?$|^custombutton:\/\/\S+$/ }).init(), true, gBrowser.tabpanels || 1);
Отсутствует
Ещё не легче, совсем поперёк ситуации.
От души Огромнейшее СПАСИБО ВАМ!!!
Отсутствует
Dumby
Видимо, создать числовую настройку permissions.default.persistent-storage со значением 2
Уй,шикардос! А, "иметь доступ к экрану" ? тоже заблокировать на глушняк.
Отредактировано solombala (04-08-2020 11:10:15)
Отсутствует
Добрый день. Поправьте пожалуйста кнопку "Закрыть все вкладки и перейти на домашнюю." Вкладки закрывает а на домашнюю не переходит.
/*CODE*/ [...gBrowser.tabs].forEach((tab)=> !tab.pinned && gBrowser.removeTab(tab)); /*закрыть все вкладки*/ getBrowser (). selectedTab = getBrowser (). addTab ("https://yandex.ru"); /*Закрытие всех вкладок приводило к открытию домашней страницы*/
Отсутствует
Добрый день. Поправьте пожалуйста кнопку "Закрыть все вкладки и перейти на домашнюю." Вкладки закрывает а на домашнюю не переходит.
/*CODE*/ [...gBrowser.tabs].forEach((tab)=> !tab.pinned && gBrowser.removeTab(tab)); /*закрыть все вкладки*/ var url = "https://yandex.ru"; openUILinkIn(url, 'current', { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() }); /*Закрытие всех вкладок приводило к открытию домашней страницы*/
«The Truth Is Out There»
Отсутствует
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.
«The Truth Is Out There»
Отсутствует
А, "иметь доступ к экрану" ?
То же самое, только persistent-storage заменить на screen
Возможно ли реализовать такую штуку.
Странно, мне казалось ты повнимательнее, и, в отличие от некоторых,
понимаешь, что меня бесполезно спрашивать про контентские дела.
Может попробуй какую-нибудь обезьяну ({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) );
Отсутствует
Может попробуй какую-нибудь обезьяну ({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 установлен. Однако скрипт не срабатывает.
«The Truth Is Out There»
Отсутствует
Однако скрипт не срабатывает.
Ну да, я же говорю — бесполезно .
Но, всё таки, немного любопытно почему не срабатывает.
Вот, провёл такой эксперимент на Firefox 78.0
Открыл новую пустую вкладку и скормил адресной строке
data: адрес (простая html'ка с двумя ссылками, которые ты предоставил).
Открыл веб-консоль (Ctrl+Shift+K) и запустил с js-терминала код.
ЛКМ по ссылке на странице — GET-запрос на invidio.us есть,
и в адресной строке, в конце концов, invidio.us тоже появляется.
А Ctrl+ЛКМ или СКМ — новая вкладка, и снова с invidio.us
Так же и на Firefox 52.0.
Попробуй повторить, если интересно. Лучше на чистом, по возможности.
В смысле, если так работает, то дело не в самом коде, а в чём-то другом, наверно.
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
Отсутствует
Dumby - привет! Доработал кнопку (возможно твоего авторства), но получаю ошибку при использовании многострочной подсказки в параметрах, подробно расписал в коде…
код приготовлен для быстрой проверки. При запуске кнопки сразу видны два варианта меню переключения.
в кнопке 2 удобных меню переключения опций Firefox. (проверял на Waterfox)
Хотел сделать многострочные подсказки, но не получилось. ОШИБКА видна в строке меню: «Прокси (многострочная подсказка)» —
основной пункт меню всегда «Other», хотя должен подставляться, исходя из параметра в strValues:localhost+"\n МНОГОСТРОЧНАЯ ПОДСКАЗКА,,,отключен…,,,0|||…
Отсутствует