в CB
Mea culpa – не обратил внимание, что ветка "Custom Buttons". На скрине настройки FlagFox.
Отсутствует
Уважаемые гуру! Не смогли бы вы, отредактировать кнопку User-agent change, так что бы
изменения сохранялись постоянно, пока сам не вернешь обратно. А то не очень удобно, когда
после перезагрузки, изменение отключается.
var ps = Components. classes ["@mozilla.org/preferences-service;1"]. getService (Components. interfaces. nsIPrefService). getBranch ("general."); ps. setCharPref ("useragent.override", "reset"); this.PS = Components.classes['@mozilla.org/preferences-service;1'] .getService(Components.interfaces.nsIPrefBranch); this.PS.clearUserPref("general.useragent.override"); this.image= 'data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD///8A////AJkyAACZMwAAmTIAAJcwAACUKQBAqVIh1J48CX6YMAAAmTMAAJkzAACZMwAAmDEAAP///wD///8A////AP///wCZMgAAmTMAAJQqABadNwiRz45Y+fTUo/+fPgyKlSoAAJcvAACZMgAAmTMAAJgxAAD///8A////AP///wD///8Aly8AAZUvAV65Xyji8LBn///XiP/6xoD/r1wq56hRIcmkSxm7ljEBcZcwAAeZMQAA////AP///wD///8A////AKFCEcfhkkn//7VY//+vUP//qEn//7BY//+5Yv//uF7//LVd/92NQ/+fPAq4li8AC////wD///8A////AP///wCdOQiLyGYe8vieP///rkz//6ZE//6nS//vkTj/7Ywz//qcPf//tFD/4og3/5gwAIb///8A////AP///wD///8AmDEAAJMrACikQQ2w2o9J///RgP/8xHn/oD4LyZYvAYmjPwzH8bNn///Zh/+0WiDn////AP///wD///8A////AJkyAACZMgAAli4AAJQrAFa3ZjDb5rp9/6JCDoqXLgAAkykALbhoMf/Wpmr/sVsl/////wD///8A////AP///wCZMwAAmTMAAJkzAACZMgAAlCsAEZo3BIiaNAFPmTMAAJo0AAeWLgBGkykASpcwAEX///8A////AP///wD///8AmDEAU5QqAFmWLgBXmjQADJkzAACaNQJJnj0Km5QqAB+ZMQAAmTMAAJkzAACZMwAA////AP///wD///8A////ALBZI//dr3H/wHU9/5IpAECWLgAAnjsIeem9gP/Bdz7qli8BbZUtAAOZMgAAmTIAAP///wD///8A////AP///wCtUBff/858//e6a/+qSRLYmTIEmaA9CMr3um///9J//+ObUf+rShPFkysAPJcwAAD///8A////AP///wD///8AlS4Acth8L///tE///6E///OSNv/0lTn//qVJ//+jQP//q0j//aNB/9JyJf2fPQug////AP///wD///8A////AJcvAAObNgaf1II9//eyXv/+tmD//rdj//+zXf//q0z//7JU//+1Wf/fkUn/okMSv////wD///8A////AP///wCYMAAAmDEAAJUuAFugQxKqpEoauqhRINz2xID//9qM/+6vZ/+2XCXelC4AWZcwAAD///8A////AP///wD///8AmDAAAJkzAACZMwAAlzAAAJYsAACcOAZ47sub/8yLVvWbNQaKlCsAEpkyAACZMwAA////AP///wD///8A////AJgwAACZMwAAmTMAAJkzAACYMQAAnDkGbqZMG9STKQA8ly8AAJkzAACZMgAAmTMAAP///wD///8A/H8AAPB/AADABwAAwAMAAMADAADgAwAA+EMAAPxDAADCPwAAwg8AAMAHAADAAwAAwAMAAPAHAAD+DwAA/j8AAA=='; var меню = '<menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"\n\ oncommand="this.parentNode.сменитьЮзерагент(event)">\n\ <menuitem type="radio" value="reset" label="Default User-Agent"/>\n\ <menuseparator/>\n\ <menuitem type="radio" value="Mozilla/5.0 (X11; Linux i686 on x86_64; rv:10.0) Gecko/20100101 Firefox/40.0 " label="Firefox 40.0"/>\n\ <menuitem type="radio" value="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0 " label="Firefox 78.0"/>\n\ <menuitem type="radio" value="Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko" label="Win8.1 x64 IE-11.0"/>\n\ <menuitem type="radio" value="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0 Safari/537.36" label="Chrome 43.0"/>\n\ <menuitem type="radio" value="Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16" label="Opera 12.16 / Linux"/>\n\ <menuitem type="radio" value="Mozilla/5.0 (Android 4.2; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/38.0 Fennec/38.0" label="Android 4.2 / Fennec 38.0"/>\n\ <menuitem type="radio" value="AppEngine-Google; (+http://code.google.com/appengine; appid: unblock4myspace)" label="AppEngine-Google"/>\n\ <menuitem type="radio" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.15 YB/3.5.1" label="FF 3.6.15+yandexbar"/>\n\ <menuitem type="radio" value="iCab/3.0.2 (Macintosh; U; PPC Mac OS)" label="iCab/Mac"/>\n\ <menuitem type="radio" value="Mozilla/5.0 (X11; Linux x86_64; rv:2.0b6pre) Gecko/20100401 Firefox/38.0.1" label="Firefox-38.0.1 / Linux"/>\n\ <menuitem type="radio" value="AmigaVoyager/3.2 (AmigaOS/MC680x0)" label="AmigaVoyager"/>\n\ <menuitem type="radio" value="Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090914 Slackware/13.0_stable Firefox/3.5.3" label="Slackware"/>\n\ <menuitem type="radio" value="Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; ru; rv:1.9.2.3) Gecko/20100401 Firefox/38.0.1" label="Firefox-38.0.1 Mac OS"/>\n\ <menuitem type="radio" value="NCSA Mosaic/1.0 (X11;SunOS 4.1.4 sun4m)" label="NCSA Mosaic-1.0 / SunOS 4.1.4"/>\n\ <menuitem type="radio" value="NetSurf/2.0 (RISC OS; armv5l; NetSurf/2.0)" label="NetSurf-2.0 RISC OS"/>\n\ <menuitem type="radio" value="Mozilla/5.0 (BeOS; U; Haiku BePC; en-US; rv:38.0.1.1) Gecko/20080112" label="Mozilla-38.0.1 / BeOS"/>\n\ <menuitem type="radio" value="Mozilla/5.0 (OS/2; U; Warp 4.5; en-US; rv:1.8.1.3pre) Gecko/20070307" label="Mozilla/5.0 OS/2"/>\n\ <menuitem type="radio" value="Mozilla/5.0 (PLAYSTATION 3; 2.00)" label="Mozilla/5.0 (PLAYSTATION 3; 2.00)"/>\n\ <menuitem type="radio" value="Links (6.9; Unix 6.9-astral sparc; 80x25)" label="Links / Unix"/>\n\ </menupopup>'; меню = e4xConv_parseXULFromString (меню); меню. childNodes [0]. setAttribute ("checked", "true"); this. orient = "horizontal"; this. type = "menu"; this. appendChild (меню); this. сменитьЮзерагент = function (событие) { var юзерагент = событие. target. getAttribute ("value"); var ps = Components. classes ["@mozilla.org/preferences-service;1"]. getService (Components. interfaces. nsIPrefService). getBranch ("general."); ps. setCharPref ("useragent.override", юзерагент); this.PS = Components.classes['@mozilla.org/preferences-service;1'] .getService(Components.interfaces.nsIPrefBranch); this.pref='general.useragent.override'; var state=this.PS.getCharPref(this.pref); if (state=="reset") { this.PS = Components.classes['@mozilla.org/preferences-service;1'] .getService(Components.interfaces.nsIPrefBranch); this.pref='general.useragent.override'; var state=this.PS.getCharPref(this.pref); this.PS = Components.classes['@mozilla.org/preferences-service;1'] .getService(Components.interfaces.nsIPrefBranch); this.PS.clearUserPref("general.useragent.override"); this.image= 'data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD///8A////AJkyAACZMwAAmTIAAJcwAACUKQBAqVIh1J48CX6YMAAAmTMAAJkzAACZMwAAmDEAAP///wD///8A////AP///wCZMgAAmTMAAJQqABadNwiRz45Y+fTUo/+fPgyKlSoAAJcvAACZMgAAmTMAAJgxAAD///8A////AP///wD///8Aly8AAZUvAV65Xyji8LBn///XiP/6xoD/r1wq56hRIcmkSxm7ljEBcZcwAAeZMQAA////AP///wD///8A////AKFCEcfhkkn//7VY//+vUP//qEn//7BY//+5Yv//uF7//LVd/92NQ/+fPAq4li8AC////wD///8A////AP///wCdOQiLyGYe8vieP///rkz//6ZE//6nS//vkTj/7Ywz//qcPf//tFD/4og3/5gwAIb///8A////AP///wD///8AmDEAAJMrACikQQ2w2o9J///RgP/8xHn/oD4LyZYvAYmjPwzH8bNn///Zh/+0WiDn////AP///wD///8A////AJkyAACZMgAAli4AAJQrAFa3ZjDb5rp9/6JCDoqXLgAAkykALbhoMf/Wpmr/sVsl/////wD///8A////AP///wCZMwAAmTMAAJkzAACZMgAAlCsAEZo3BIiaNAFPmTMAAJo0AAeWLgBGkykASpcwAEX///8A////AP///wD///8AmDEAU5QqAFmWLgBXmjQADJkzAACaNQJJnj0Km5QqAB+ZMQAAmTMAAJkzAACZMwAA////AP///wD///8A////ALBZI//dr3H/wHU9/5IpAECWLgAAnjsIeem9gP/Bdz7qli8BbZUtAAOZMgAAmTIAAP///wD///8A////AP///wCtUBff/858//e6a/+qSRLYmTIEmaA9CMr3um///9J//+ObUf+rShPFkysAPJcwAAD///8A////AP///wD///8AlS4Acth8L///tE///6E///OSNv/0lTn//qVJ//+jQP//q0j//aNB/9JyJf2fPQug////AP///wD///8A////AJcvAAObNgaf1II9//eyXv/+tmD//rdj//+zXf//q0z//7JU//+1Wf/fkUn/okMSv////wD///8A////AP///wCYMAAAmDEAAJUuAFugQxKqpEoauqhRINz2xID//9qM/+6vZ/+2XCXelC4AWZcwAAD///8A////AP///wD///8AmDAAAJkzAACZMwAAlzAAAJYsAACcOAZ47sub/8yLVvWbNQaKlCsAEpkyAACZMwAA////AP///wD///8A////AJgwAACZMwAAmTMAAJkzAACYMQAAnDkGbqZMG9STKQA8ly8AAJkzAACZMgAAmTMAAP///wD///8A/H8AAPB/AADABwAAwAMAAMADAADgAwAA+EMAAPxDAADCPwAAwg8AAMAHAADAAwAAwAMAAPAHAAD+DwAA/j8AAA=='; } else { this.image= 'data:image/x-icon;base64,AAABAAEAEBAAAAEAIADkAgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAAFzUkdCAK7OHOkAAAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGHRFWHRTb2Z0d2FyZQBwYWludC5uZXQgNC4wLjOM5pdQAAACVUlEQVQ4T3WTMWhTURSG2zSaNqRRqU0N1MbUUGnStNDGtMagoqFFaR2qCELpoBUUFaQ4SV2kOKmDODrJm+Th9CYJDhK3ThLFIThlKpkkSCuvuX5/zJM3aODjvHty/v/ed867XW7LDXTxU4QkxCDo/myGKi9fLdnpCVP7WLno/nJz5KchA1MwBjEJuzsGQTiAMOH+aAYQDFWebho3EDRuOGLK6w9Nc7uxQP4KdddgAdIS9oJ270EY33pjGWd1Zds+X3Lt0dQfgw7OaGqX//eovQpZaWWgY2vHPnt1pVXzCf6HdaZoqL+PbkYGURb9lRfPZrd8RXVo+NYeZeCE59CdhLwMDmEwYo0M170ii8Y5N9bM63zONDu5dr5QVEMn0VyCSXRhGaRkYgWCvEjQ6BS19+XnNDNZfrL5Rblq7LBhIp8QLFN7llgixuGWDBLQXX1rT8AUTZpVMzUZjAo6SeNr9SY1MYQ5yMIR1v1w0DPQFAbhKMQp6GVkw86jDYPpEjmNd6z6zh7HdABC5IbguAzSUEAUgRNwD5Epd0bI/Hf1bdQ/VzNOIPit3QtAsw5ZGYTbJhyLo363Ly/u+BunRuojUgO9nE1P0DyGjAx6IEnRAzsa+VvkoVFqpN5az7yaNtQrTMtgv3a32Mkv/Bcys+ZLhibfRqNxRmUQYtFHzDCBoqPj+URaO5jzaRs+tg36MUPtsQ77ZDCgB8hjNEf3l/XOnkH7ueWu8d8i8TRRF+ku8Q4xIQONUBdKp1A/xiFW+1BOcJV3uJHXKT5FTrdvvhMvwJzbcgd/A3Q4lrpREVkLAAAAAElFTkSuQmCC'; }; } function e4xConv_parseXULFromString(xul) { xul = xul.replace(/>\s+</g, "><"); return new DOMParser().parseFromString(xul, "application/xml").documentElement; }
Отсутствует
Подскажите код, с помощь которого выполняется Removing cookies and site data:
//
Спасибо Dumby.
№15897
Отредактировано thrower (18-09-2021 20:16:45)
Отсутствует
Подскажите код, с помощь которого выполняется Removing cookies and site data:
/*Initialization Code*/ // Автор: Dumby (https://forum.mozilla-russia.org/viewtopic.php?pid=775136#p775136) ..... (obj => { this.setAttribute("context", ""); this.onclick = e => obj[e.button < 2](e); })({ true(e) { var domain = this.domain(); if (!domain) return; this.cookies(domain); this.webappstore(domain); this.macromedia(); if (e.button) for(var br of gBrowser.browsers) try { this.domain(br) == domain && br.reload(); } catch(ex) {} }, false(e) { e.ctrlKey || e.shiftKey ? gShowPopup(self) : this.window(); }, domain(br = gBrowser.selectedBrowser, res) { try { res = new URL(br.currentURI.spec).hostname; res = res.includes(".") ? Services.eTLD.getBaseDomainFromHost(res) : undefined; } finally {return res;} }, remove(...args) { (this.remove = Services.cookies.remove.length == 4 ? Services.cookies.remove : (h, n, p, a) => Services.cookies.remove(h, n, p, false, a) )(...args); }, cookies(domain, has) { for(var {host, name, path, originAttributes, rawHost} of ( Services.cookies.enumerator || Services.cookies.cookies )) Services.eTLD.hasRootDomain(rawHost, domain) && this.remove(host, name, path, originAttributes); }, webappstore(domain) { var db = FileUtils.getFile("ProfD", ["webappsstore.sqlite"]); var conn = Services.storage.openDatabase(db); conn.executeSimpleSQL(`DELETE FROM webappsstore2 WHERE scope LIKE "%${ domain.split("").reverse().join("") + "." }%"`); conn.close(); }, macromedia() { var dir = Services.dirsvc.get("AppData", Ci.nsIFile); dir.append("Macromedia"); dir.exists() && dir.isDirectory() && dir.remove(true); dir.create(dir.DIRECTORY_TYPE, 0o755); }, get sdm() { this.url = "chrome://browser/content/preferences/dialogs/siteDataSettings.x" + (parseInt(Services.appinfo.platformVersion) <= 71 ? "ul" : "html"); delete this.sdm; return this.sdm = ChromeUtils.import( "resource:///modules/SiteDataManager.jsm" ).SiteDataManager; }, async window() { var domain = this.domain(); var win = Services.wm.getMostRecentWindow("Browser:SiteDataSettings"); win && win.close(); await this.sdm.updateSites(); win = openDialog(this.url, "_blank", ""); if (!domain) return; await new Promise(resolve => win.addEventListener("DOMContentLoaded", resolve, {once: true}) ); var list = win.document.getElementById("sitesList"); list.clearSelection = () => { delete list.clearSelection; list.selectedIndex = 0; list.focus(); } win.document.getElementById("searchBox").inputField.editor .insertText(domain); } }); this.tooltipText = "Л: Удалить куки текущего сайта\ \nП: Управление куками для текущего сайта\ \nCtrl+П: CB Меню";
Отредактировано unter_officer (17-09-2021 23:37:55)
«The Truth Is Out There»
Отсутствует
Dumby
А как это сделать для произвольного текущего домена (активный таб)?
Я пытался аккуратно вырезать необходимый фрагмент кода из кнопки, но что-то не заработал.
А еще вытащил код из background.js небольшого расширения, но тоже не получается его прицепить:
// Init let browserName = "NonFirefox"; // Default value // browser.runtime.getBrowserInfo() is not available // https://github.com/mozilla/webextension-polyfill/issues/116 async function init(){ // Get the browserName (likely will only work in case it's Firefox) if(browser.runtime.getBrowserInfo !== undefined){ let info = await browser.runtime.getBrowserInfo(); browserName = info.name; } // Events browser.browserAction.onClicked.addListener(async (tab) => { await deleteCookies(tab); await browser.tabs.reload(); // Page was reloaded }); } init(); // Functionality async function deleteCookies(tab){ let cookies = await browser.cookies.getAll( getCookieQueryAll(tab) ); let promises = cookies.map(cookie => browser.cookies.remove(getCookieRemoveQuery(cookie)) ); return Promise.all(promises); } // Helper functions function getCookieQueryAll(tab){ let cookieQueryAll = { url: tab.url, storeId: tab.cookieStoreId }; console.log("browserName is", browserName); if(browserName === "Firefox"){ cookieQueryAll.firstPartyDomain = null; } console.log("cookieQueryAll", cookieQueryAll); return cookieQueryAll; } function getCookieRemoveQuery(cookie){ let cookieRemoveQuery = { url: getCookieUrl(cookie), name: cookie.name, storeId: cookie.storeId }; console.log("browserName is", browserName); if(browserName === "Firefox"){ cookieRemoveQuery.firstPartyDomain = cookie.firstPartyDomain; } return cookieRemoveQuery; } function getCookieUrl(cookie) { let cookieProtocol = (cookie.secure) ? 'https://' : 'http://'; return cookieProtocol + cookie.domain + cookie.path; }
Отредактировано thrower (18-09-2021 14:08:42)
Отсутствует
А как это сделать для произвольного текущего домена (активный таб)?
Ну, для каких-то стандартных ситуаций, возможно, сойдёт и так:
SiteDataManager.remove(gBrowser.contentPrincipal.baseDomain);
Отсутствует
egorsemenov06
А, теперь понял, код разделить.
Хорошо, попробую. Ну так, чисто формально.
(async id => CustomizableUI.createWidget({ 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"), id, 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)"); btn.onauxclick = this.auxclick; popup.setAttribute("onpopupshowing", "this.shouldRebuild && owner.rebuild(this)"); popup.ondragstart = this.dragstart; popup.shouldRebuild = true; 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; } }, get markup() { try {var data = Cu.readUTF8URI(Services.io.newURI( `chrome://user_chrome_files/content/custom_scripts/${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)\\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(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) { if (e.button) return; 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", 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); } }))("ucf-cbbtn-OpenPageInOtherBrowser");
(async () => CustomizableUI.createWidget({ 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: [ ["QTranslate", "C:\\Users\\Роман\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\8sr9ujrx.default-release\\_QTranslate\\QTranslate.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"] ], id: "ucf-cbbtn-openExternalWinApplication", 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)"); btn.tooltipText = btn.label; btn.ownerGlobal.Object.defineProperty(btn, "domParent", this); 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; } }, 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(); } }))();
Отредактировано Dumby (22-09-2021 15:32:19)
Отсутствует
Отсутствует
vending_machine пишетegorsemenov06
Подскажите, как удалить эту кнопку. А то там нет такого пункта менюили отредактировать
Если Вы об этом "Л: Открыть меню с браузерами",откройте в Notepad++ и удалите эту строку.
Кнопку как удалить, через какие клавиши? Вторая удаляется, эта — нет.
Отредактировано vending_machine (22-09-2021 18:19:52)
Отсутствует
vending_machine пишетКнопку как удалить, через какие клавиши? Вторая удаляется, эта — нет.
я не пойму какую кнопку удалить?
Из этой кнопки, кнопку открытия в другом браузере.
Отредактировано vending_machine (22-09-2021 18:41:40)
Отсутствует
egorsemenov06
У кнопки обычно, даже всегда, есть пункт удалить кнопку. И вот, как же всё-таки удалить кнопку открывающую страницу в другом браузере. Вторая из двух удаляется благополучно, оставляя эту.
А у этой нет такого пункта в меню.
Dumby ее же разделил
У меня разделённые не работают
Отсутствует
Dumby
Возможно ли как-то отключить обновление иконок всех закладок при импорте закладок из файла?
Дело в том, что при импорте закладок из файла (в моём случае из html-файла), Firefox начинает ломиться в инет и обновлять иконки всех закладок.
А если учесть, что у меня более 5400 закладок, то Firefox начинает создавать тысячи запросов на разные IP.
Как бы отключить такое поведение Firefox?
Метод отключения не важен - с помощью СВ, UCF или через config.js (лучше бы через config.js).
P.S. Для Firefox 91 ESR.
«The Truth Is Out There»
Отсутствует
лучше бы через config.js
Неужели это такое частое действие?
Не лучше ли: перевёл лису в оффлайн и импортируй.
А код, даже не знаю, наверно так попробовать
(закомментированое можно расскомментировать,
если insertFaviconForNode() может использоваться сторонним кодом).
(async url => { var nsvo = Cu.import(url, {}), key = "insertFaviconForNode", func = nsvo[key]; nsvo[key] = node => { if ( node.iconUri?.startsWith("http") //&& Components.stack.caller.filename == url ) node.iconUri = null; func(node); } })("resource://gre/modules/BookmarkHTMLUtils.jsm");
Отсутствует
Неужели это такое частое действие?
Да. Очень много приходится работать с закладками и потом переносить на другой комп.
Пару раз синхронизация убила мне все закладки (хорошо, что бэкап был сделан), поэтому от синхронизации пришлось отказаться от слова совсем, и использовать экспорт/импорт.
Не лучше ли: перевёл лису в оффлайн и импортируй.
Так и делал, но жутко надоело.
наверно так попробовать
Код работает, но при импорте из файла в консоль сыплется большое количество одинаковых ошибок:
Failed to import favicon data:[Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIFaviconService.replaceFaviconDataFromDataURL]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: resource://gre/modules/BookmarkHTMLUtils.jsm :: insertFaviconForNode :: line 1066" data: no] BookmarkHTMLUtils.jsm:1081
Хотя, как по мне, то лучше пусть ошибки в консоли, чем тысячи запросов в минуту в инет.
Большое спасибо.
Отредактировано unter_officer (23-09-2021 19:27:59)
«The Truth Is Out There»
Отсутствует
Код работает, но в консоль сыплется большое количество одинаковых ошибок
Да, такие ошибки я видел, но у меня их ровно столько же
и без всякого кода, так что, думаю, это не связанные вещи.
Можно попробовать вырезать репортинг.
Вот, переписал так, импортирую и ... тишина.
(async url => { var nsvo = Cu.import(url, {}); var code = `eval(\`${nsvo.insertFaviconForNode}\`);` .replace( ".iconUri", '$& || node.iconUri.startsWith("http")' //+ `\n && Components.stack.caller.filename == "${url}"\n ` ) .replace(/(catch \(ex\) {).+?}/s, "$1}"); var subst = "bookmarks-html-import-meds-tmp-script"; var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); var rph = ios.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler); rph.setSubstitution(subst, ios.newURI("data:," + encodeURIComponent(code))); Cc["@mozilla.org/moz/jssubscript-loader;1"] .getService(Ci.mozIJSSubScriptLoader).loadSubScript("resource://" + subst, nsvo); rph.setSubstitution(subst, null); })("resource://gre/modules/BookmarkHTMLUtils.jsm");
Отсутствует
Вот, переписал так, импортирую и ... тишина.
То, что надо. Огромное спасибо!
«The Truth Is Out There»
Отсутствует
Почему это не работает ? goDoCommand("cmd_closeWindow");
Добавлено 24-09-2021 11:25:03
Senflex
Команда пауза в батнике
var file = Services.dirsvc.get('ProfD', Ci.nsIFile); file.initWithPath(file.path + "\\твой.cmd"); file.launch();
Отредактировано ВВП (24-09-2021 11:25:03)
Отсутствует
Почему это не работает ? goDoCommand("cmd_closeWindow");
Потому, что для этой команды нет контроллера.
Можно запускать её код напрямую:
BrowserTryToCloseWindow();
Батник - в профиле !
Хмм, а мне показалось, что спрашивалось запускать
не «твой.cmd», а непосредственно сам cmd.exe, ну типа так
var cmd = Services.dirsvc.get("SysD", Ci.nsIFile); cmd.append("cmd.exe"); var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); process.init(cmd); var args = ["/k", "echo Как видно?", "&&", "pause"]; process.runwAsync(args, args.length);
Отсутствует