Если закрыть браузер и запустить заново удаляется
А, наверно имеется ввиду не закрыть браузер как приложение (Выход, Ctrl+Shift+Q),
а когда последнее/единственное браузерное окно закрывается.
Хорошо, попробую.
(async (sel, self) => ({ icon: "circle", colors: [ "mediumseagreen", "silver", "crimson", "blue", "peru", ], initColors() { var colorName = "ucf-gen"; var css = "@-moz-document url(about:preferences#containers)," + " url-prefix(chrome://browser/content/browser.x) {\n"; this.colors.forEach((color, ind) => { var [ic, tc] = color.split(/\s*\|\s*/); css += `\t.identity-color-${colorName}${ind} {\n` + `\t\t--identity-tab-color: ${tc || ic};\n` + `\t\t--identity-icon-color: ${ic};\n\t}\n` }); var url = "data:text/css;charset=utf-8," + encodeURIComponent(css + "}"); var sss = Cc["@mozilla.org/content/style-sheet-service;1"] .getService(Ci.nsIStyleSheetService); sss.loadAndRegisterSheet(Services.io.newURI(url), sss.USER_SHEET); var len = this.colors.length; var pref = "ucf.openInGeneratedContainer.lastColor"; var ind = Math.min(Services.prefs.getIntPref(pref, -1), len - 1); this.nextColor = () => { var next = ind + 1; Services.prefs.setIntPref(pref, ind = next == len ? 0 : next); return colorName + ind; } }, quit: false, init(topic) { Services.obs.addObserver(self = this, topic); var lt = "browser-lastwindow-close-granted"; var lw = () => this.quit = true; Services.obs.addObserver(lw, lt); Services.obs.addObserver(function quit(s, t) { self.quit = true; Services.obs.removeObserver(self, topic); Services.obs.removeObserver(lw, lt); Services.obs.removeObserver(quit, t); }, "quit-application-granted"); this.initColors(); this.newUsercontext = name => { var id = this.cis.create( name || `[ ${this.cis._lastUserContextId + 1} ]`, this.icon, this.nextColor() ).userContextId; this.saveGens(this.gens.add(id)); return id; } var cpref = "ucf.openInGeneratedContainer.containers"; var arr = Services.prefs.getStringPref(cpref, "").split(",").map(Number).filter(Boolean); if (arr.length) { var ids = this.cis.getPublicIdentities().map(i => i.userContextId); arr = arr.filter(id => ids.includes(id)); } this.gens = new Set(arr); (this.saveGens = () => Services.prefs.setStringPref(cpref, Array.from(this.gens).join(",")))(); }, observe(doc) { var list = doc.querySelectorAll(sel); if (!list.length) return; var menuitem = doc.createXULElement("menuitem"); for(var args of Object.entries({ selectiontype: "single", oncommand: "cmd(window)", nodetype: "folder|query", selection: "folder|query", label: "Открыть всё в контейнере", id: "placesContext_openContainer:tabs:newUsercontext" })) menuitem.setAttribute(...args); menuitem.cmd = this.cmd; menuitem.rnd = menuitem.constructor.prototype.render; menuitem.render = this.render; var [m1, m2] = menuitem.list = Array.from(list); (m2 || m1).after(menuitem); if (doc.documentElement.getAttribute("windowtype") != "navigator:browser") return; for(var btn of [ doc.getElementById("tabs-newtab-button"), doc.getElementById("new-tab-button") || doc.ownerGlobal.gNavToolbox.palette.querySelector("#new-tab-button") ]) if (btn) btn.checkForMiddleClick = this.click; var win = doc.ownerGlobal; this.redefDoSearch(win, win.customElements.get("searchbar").prototype); win.gBrowser.tabContainer.addEventListener("TabClose", this.tabClose); win.addEventListener("unload", this.winUnload, {once: true}); this.quit = false; }, winUnload(e) { var win = e.target.ownerGlobal; win.removeEventListener("TabClose", self.tabClose); if (self.quit) return; var gb = win.gBrowser; if (gb) for(var tab of gb.tabs) self.tabClose(null, tab); }, closed: new Set(), cis: ChromeUtils.import("resource://gre/modules/ContextualIdentityService.jsm") .ContextualIdentityService, tabClose(e, tab = e.target) { var id = +tab.getAttribute("usercontextid"); id && self.gens.has(id) && self.closed.add(id); self.closed.size == 1 && ChromeUtils.idleDispatch(self.meaybeRemove); }, meaybeRemove() { var ids = Array.from(self.closed); self.closed.clear(); for(var id of ids) self.meaybeRemoveById(id); }, meaybeRemoveById(id) { for(var win of CustomizableUI.windows) if (win.document.querySelector(`tab.tabbrowser-tab[usercontextid="${id}"]`)) return; this.saveGens(this.gens.delete(id)); this.cis.remove(id); }, redefDoSearch(win, proto) { var code = `(openTrustedLinkIn => [ {${proto.doSearch}}, openTrustedLinkIn ])( function otl(url, where, params) { if (where != "current") params.userContextId = otl.newUsercontext( document.getElementById("searchbar").value ); openTrustedLinkIn(url, where, params); } );`; (this.redefDoSearch = (win, proto) => { var [obj, func] = win.eval(code); Object.assign(proto, obj); func.newUsercontext = this.newUsercontext; })(win, proto); }, click(btn, e) { if (!(e.button != 2 || e.ctrlKey || e.shiftKey)) { var txt = e.view.readFromClipboard(); if (txt) { var urls = txt.split("\n").map(self.map).filter(Boolean); if (urls.length) return e.preventDefault(), self.openFromClipboard(e.view, urls); } } e.view.checkForMiddleClick(btn, e); }, eo: Object.create(null), map(str) { str = str.trim(); try { var scheme = Services.io.extractScheme(str); var ph = Services.io.getProtocolHandler(scheme); if (ph.scheme == scheme) return Services.io.newURI(str) && {uri: str}; } catch {} }, openFromClipboard(win, urls) { if (win.OpenInTabsUtils.confirmOpenInTabs(urls.length, win)) urls.load = true, this.open(win, this.eo, urls); }, async render() { this.rnd(); await new Promise(this.ownerGlobal.requestAnimationFrame); this.hidden || (this.hidden = this.list.every(self.every)); }, every: node => node.disabled || node.hidden, cmd(win) { var view = this.parentNode._view; var node = win.document.popupNode; node = node._placesView && node._placesView.result.root; self.open(win, node || view.selectedNode || view.result.root); }, open(win, node, list) { var gbw = Cu.import("resource:///modules/PlacesUIUtils.jsm", {}).getBrowserWindow; var w = gbw(win); this.pu = w.PlacesUIUtils; this.fs = w.PlacesUtils.favicons; this.sysp = w.E10SUtils.SERIALIZED_SYSTEMPRINCIPAL; (this.open = (win, node, list) => { this.openURLs(gbw(win), list || win.PlacesUtils.getURLsForContainerNode(node)); node.bookmarkGuid && this.pu.doCommand(win, "placesCmd_delete"); })(win, node, list); }, async openURLs(win, urls) { var userContextId = this.newUsercontext(); var mark = !win.PrivateBrowsingUtils.isWindowPrivate(win); var {load} = urls, gb = win.gBrowser, pos = gb.selectedTab._tPos; for(var {uri, title, isBookmark} of urls) try { if (mark) isBookmark ? this.pu.markPageAsFollowedBookmark(uri) : this.pu.markPageAsTyped(uri); if (load) { gb.addTrustedTab(uri, {index: ++pos, userContextId}); continue; } var state = {userContextId, entries: [{ url: uri, title: title || uri, triggeringPrincipal_base64: this.sysp }]}; var [,, data, mime] = await new Promise( resolve => this.fs.getFaviconDataForPage( Services.io.newURI(uri), (...args) => resolve(args), 16 ) ); if (data.length) state.image = `data:${ mime || "image/x-icon" };base64,${ btoa(String.fromCharCode(...data)) }`; var tab = gb.addTrustedTab(null, {index: ++pos, userContextId}); win.SessionStore.setTabState(tab, state); } catch {}; } }).init("chrome-document-loaded"))( "#placesContext_openBookmarkContainer\\:tabs,#placesContext_openContainer\\:tabs" );
Отсутствует
Посоветуйте, каким расширением или user-скриптом сохранять такие картинки или убрать перекрывающий элемент страницы?
Image Picka и Text Linky Tool, извлекают изображения со страницы.
Для перекрывающих элементов пользуюсь Remove HTML Elements.
Отсутствует
kazarin - спасибо!
Подскажите, как найти ID пункта контекстного меню через DOM Inspector?
расширение SingleFile создаёт в контекстном меню строку: «Сохранить выделенное», нужен ID этой строки.
Три решения. 1) Инструкция от Viatcheslav
2) Инструменты браузера > Отключить автоскрытие всплывающих окон.
3) Кнопка Extensions Developer Tools > Инспектор атрибутов, открываем контекстное меню браузера. При этом отображается подсказка о выбранном пункте меню.
Отредактировано Dobrov (01-05-2021 04:44:43)
Отсутствует
Dobrov
https://forum.mozilla-russia.org/viewto … 83#p788883
или
Кнопка ucf для Attributes_Inspector от Dumby
https://forum.mozilla-russia.org/viewto … 07#p789007
Путь к attrsInspector.js прописать свой.
Сам attrsInspector.js
https://github.com/Infocatcher/Custom_B … _Inspector
Комбинации клавиш прописаны в начале attrsInspector.js
Отредактировано _zt (29-04-2021 17:39:12)
Отсутствует
Dumby, здравствуйте.
Посмотрите пожалуйста кнопку "Включить / отключить куки".
Можно ли ее починить?
Иконка " включить" не запоминает состояние переключения, если куки разрешены,
и после перезагрузки браузера, иконка показывает, что куки выключены.
var prefService = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefService); var prefDomain = "network.cookie.cookieBehavior"; function pref() { var p = prefService.getIntPref(prefDomain); return p; } this.toggleCookieBehavior = function() { if(pref() == 2) { prefService.setIntPref(prefDomain, 4); this.image = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIj48cGF0aCBkPSJNMTI5OSA4MTNsLTQyMiA0MjJxLTE5IDE5LTQ1IDE5dC00NS0xOWwtMjk0LTI5NHEtMTktMTktMTktNDV0MTktNDVsMTAyLTEwMnExOS0xOSA0NS0xOXQ0NSAxOWwxNDcgMTQ3IDI3NS0yNzVxMTktMTkgNDUtMTl0NDUgMTlsMTAyIDEwMnExOSAxOSAxOSA0NXQtMTkgNDV6bTE0MSA4M3EwLTE0OC03My0yNzN0LTE5OC0xOTgtMjczLTczLTI3MyA3My0xOTggMTk4LTczIDI3MyA3MyAyNzMgMTk4IDE5OCAyNzMgNzMgMjczLTczIDE5OC0xOTggNzMtMjczem0yMjQgMHEwIDIwOS0xMDMgMzg1LjV0LTI3OS41IDI3OS41LTM4NS41IDEwMy0zODUuNS0xMDMtMjc5LjUtMjc5LjUtMTAzLTM4NS41IDEwMy0zODUuNSAyNzkuNS0yNzkuNSAzODUuNS0xMDMgMzg1LjUgMTAzIDI3OS41IDI3OS41IDEwMyAzODUuNXoiLz4KCQoJPG1ldGFkYXRhPgoJCTxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgeG1sbnM6cmRmcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KCQkJPHJkZjpEZXNjcmlwdGlvbiBhYm91dD0iaHR0cHM6Ly9pY29uc2NvdXQuY29tL2xlZ2FsI2xpY2Vuc2VzIiBkYzp0aXRsZT0iQ2hlY2ssIFJpZ2h0LCBBY2NwZXQsIFZlcmlmeSwgUGVyZmVjdCwgQXBwcm92ZSwgQnV0dG9uLCBDaXJjbGUiIGRjOmRlc2NyaXB0aW9uPSJDaGVjaywgUmlnaHQsIEFjY3BldCwgVmVyaWZ5LCBQZXJmZWN0LCBBcHByb3ZlLCBCdXR0b24sIENpcmNsZSIgZGM6cHVibGlzaGVyPSJJY29uc2NvdXQiIGRjOmRhdGU9IjIwMTYtMTItMTQiIGRjOmZvcm1hdD0iaW1hZ2Uvc3ZnK3htbCIgZGM6bGFuZ3VhZ2U9ImVuIj4KCQkJCTxkYzpjcmVhdG9yPgoJCQkJCTxyZGY6QmFnPgoJCQkJCQk8cmRmOmxpPkZvbnQgQXdlc29tZTwvcmRmOmxpPgoJCQkJCTwvcmRmOkJhZz4KCQkJCTwvZGM6Y3JlYXRvcj4KCQkJPC9yZGY6RGVzY3JpcHRpb24+CgkJPC9yZGY6UkRGPgogICAgPC9tZXRhZGF0YT48L3N2Zz4K"; } else { prefService.setIntPref(prefDomain, 2); this.image = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIj48cGF0aCBkPSJNMTE1MiA4OTZxMCAxMDYtNzUgMTgxdC0xODEgNzUtMTgxLTc1LTc1LTE4MSA3NS0xODEgMTgxLTc1IDE4MSA3NSA3NSAxODF6bS0yNTYtNTQ0cS0xNDggMC0yNzMgNzN0LTE5OCAxOTgtNzMgMjczIDczIDI3MyAxOTggMTk4IDI3MyA3MyAyNzMtNzMgMTk4LTE5OCA3My0yNzMtNzMtMjczLTE5OC0xOTgtMjczLTczem03NjggNTQ0cTAgMjA5LTEwMyAzODUuNXQtMjc5LjUgMjc5LjUtMzg1LjUgMTAzLTM4NS41LTEwMy0yNzkuNS0yNzkuNS0xMDMtMzg1LjUgMTAzLTM4NS41IDI3OS41LTI3OS41IDM4NS41LTEwMyAzODUuNSAxMDMgMjc5LjUgMjc5LjUgMTAzIDM4NS41eiIvPgoJCgk8bWV0YWRhdGE+CgkJPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxuczpyZGZzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgoJCQk8cmRmOkRlc2NyaXB0aW9uIGFib3V0PSJodHRwczovL2ljb25zY291dC5jb20vbGVnYWwjbGljZW5zZXMiIGRjOnRpdGxlPSJEb3QsIENpcmNsZSwgUm91bmQsIEJsYWNrLCBIb2xlIiBkYzpkZXNjcmlwdGlvbj0iRG90LCBDaXJjbGUsIFJvdW5kLCBCbGFjaywgSG9sZSIgZGM6cHVibGlzaGVyPSJJY29uc2NvdXQiIGRjOmRhdGU9IjIwMTYtMTItMTQiIGRjOmZvcm1hdD0iaW1hZ2Uvc3ZnK3htbCIgZGM6bGFuZ3VhZ2U9ImVuIj4KCQkJCTxkYzpjcmVhdG9yPgoJCQkJCTxyZGY6QmFnPgoJCQkJCQk8cmRmOmxpPkZvbnQgQXdlc29tZTwvcmRmOmxpPgoJCQkJCTwvcmRmOkJhZz4KCQkJCTwvZGM6Y3JlYXRvcj4KCQkJPC9yZGY6RGVzY3JpcHRpb24+CgkJPC9yZGY6UkRGPgogICAgPC9tZXRhZGF0YT48L3N2Zz4K"; } }
Отсутствует
Можно ли ее починить?
Нет. Нельзя починить то, что не было сломано.
(pref => { var {BEHAVIOR_REJECT, BEHAVIOR_REJECT_TRACKER} = Ci.nsICookieService; var icons = { [BEHAVIOR_REJECT]: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIj48cGF0aCBkPSJNMTE1MiA4OTZxMCAxMDYtNzUgMTgxdC0xODEgNzUtMTgxLTc1LTc1LTE4MSA3NS0xODEgMTgxLTc1IDE4MSA3NSA3NSAxODF6bS0yNTYtNTQ0cS0xNDggMC0yNzMgNzN0LTE5OCAxOTgtNzMgMjczIDczIDI3MyAxOTggMTk4IDI3MyA3MyAyNzMtNzMgMTk4LTE5OCA3My0yNzMtNzMtMjczLTE5OC0xOTgtMjczLTczem03NjggNTQ0cTAgMjA5LTEwMyAzODUuNXQtMjc5LjUgMjc5LjUtMzg1LjUgMTAzLTM4NS41LTEwMy0yNzkuNS0yNzkuNS0xMDMtMzg1LjUgMTAzLTM4NS41IDI3OS41LTI3OS41IDM4NS41LTEwMyAzODUuNSAxMDMgMjc5LjUgMjc5LjUgMTAzIDM4NS41eiIvPgoJCgk8bWV0YWRhdGE+CgkJPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxuczpyZGZzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgoJCQk8cmRmOkRlc2NyaXB0aW9uIGFib3V0PSJodHRwczovL2ljb25zY291dC5jb20vbGVnYWwjbGljZW5zZXMiIGRjOnRpdGxlPSJEb3QsIENpcmNsZSwgUm91bmQsIEJsYWNrLCBIb2xlIiBkYzpkZXNjcmlwdGlvbj0iRG90LCBDaXJjbGUsIFJvdW5kLCBCbGFjaywgSG9sZSIgZGM6cHVibGlzaGVyPSJJY29uc2NvdXQiIGRjOmRhdGU9IjIwMTYtMTItMTQiIGRjOmZvcm1hdD0iaW1hZ2Uvc3ZnK3htbCIgZGM6bGFuZ3VhZ2U9ImVuIj4KCQkJCTxkYzpjcmVhdG9yPgoJCQkJCTxyZGY6QmFnPgoJCQkJCQk8cmRmOmxpPkZvbnQgQXdlc29tZTwvcmRmOmxpPgoJCQkJCTwvcmRmOkJhZz4KCQkJCTwvZGM6Y3JlYXRvcj4KCQkJPC9yZGY6RGVzY3JpcHRpb24+CgkJPC9yZGY6UkRGPgogICAgPC9tZXRhZGF0YT48L3N2Zz4K", [BEHAVIOR_REJECT_TRACKER]: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIj48cGF0aCBkPSJNMTI5OSA4MTNsLTQyMiA0MjJxLTE5IDE5LTQ1IDE5dC00NS0xOWwtMjk0LTI5NHEtMTktMTktMTktNDV0MTktNDVsMTAyLTEwMnExOS0xOSA0NS0xOXQ0NSAxOWwxNDcgMTQ3IDI3NS0yNzVxMTktMTkgNDUtMTl0NDUgMTlsMTAyIDEwMnExOSAxOSAxOSA0NXQtMTkgNDV6bTE0MSA4M3EwLTE0OC03My0yNzN0LTE5OC0xOTgtMjczLTczLTI3MyA3My0xOTggMTk4LTczIDI3MyA3MyAyNzMgMTk4IDE5OCAyNzMgNzMgMjczLTczIDE5OC0xOTggNzMtMjczem0yMjQgMHEwIDIwOS0xMDMgMzg1LjV0LTI3OS41IDI3OS41LTM4NS41IDEwMy0zODUuNS0xMDMtMjc5LjUtMjc5LjUtMTAzLTM4NS41IDEwMy0zODUuNSAyNzkuNS0yNzkuNSAzODUuNS0xMDMgMzg1LjUgMTAzIDI3OS41IDI3OS41IDEwMyAzODUuNXoiLz4KCQoJPG1ldGFkYXRhPgoJCTxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgeG1sbnM6cmRmcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KCQkJPHJkZjpEZXNjcmlwdGlvbiBhYm91dD0iaHR0cHM6Ly9pY29uc2NvdXQuY29tL2xlZ2FsI2xpY2Vuc2VzIiBkYzp0aXRsZT0iQ2hlY2ssIFJpZ2h0LCBBY2NwZXQsIFZlcmlmeSwgUGVyZmVjdCwgQXBwcm92ZSwgQnV0dG9uLCBDaXJjbGUiIGRjOmRlc2NyaXB0aW9uPSJDaGVjaywgUmlnaHQsIEFjY3BldCwgVmVyaWZ5LCBQZXJmZWN0LCBBcHByb3ZlLCBCdXR0b24sIENpcmNsZSIgZGM6cHVibGlzaGVyPSJJY29uc2NvdXQiIGRjOmRhdGU9IjIwMTYtMTItMTQiIGRjOmZvcm1hdD0iaW1hZ2Uvc3ZnK3htbCIgZGM6bGFuZ3VhZ2U9ImVuIj4KCQkJCTxkYzpjcmVhdG9yPgoJCQkJCTxyZGY6QmFnPgoJCQkJCQk8cmRmOmxpPkZvbnQgQXdlc29tZTwvcmRmOmxpPgoJCQkJCTwvcmRmOkJhZz4KCQkJCTwvZGM6Y3JlYXRvcj4KCQkJPC9yZGY6RGVzY3JpcHRpb24+CgkJPC9yZGY6UkRGPgogICAgPC9tZXRhZGF0YT48L3N2Zz4K" }; var setIcon = () => this.icon.src = icons[Services.prefs.getIntPref(pref)] || "chrome://browser/content/robot.ico"; setIcon(); Services.prefs.addObserver(pref, setIcon); addDestructor(() => Services.prefs.removeObserver(pref, setIcon)); this.toggleCookieBehavior = () => Services.prefs.setIntPref( pref, Services.prefs.getIntPref(pref) == BEHAVIOR_REJECT ? BEHAVIOR_REJECT_TRACKER : BEHAVIOR_REJECT ); })("network.cookie.cookieBehavior");
Отсутствует
Dumby,
Нельзя починить то, что не было сломано.
Да, да, сморозил.
Кнопка исправно работает. Большое вам спасибо.
Оставлю здесь, если кому-то нужно.
Кнопка отреставрированная Dumby.
"Включить / отключить куки"
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%u0412%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20/%20%u043E%u0442%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043A%u0443%u043A%u0438%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAArxJREFUeNqkU0tPE1EYPTNMIYUG+rIM71cRCNGKSCEtGNSgqZoQgi40caExrv0pLowxsjCi7jQmLiAmhiAtCgSNiSGEWN5SW4RSKM7QduaO906nqCsX3vTMTL57zun57nzDaZqG/1kCu4zcECDkcRB4gP7sHIcuWm6icBq8LYoF+l9TBIgr9KKo2m+DP5Y3z1x8RTzW43U0nmoqsNgcrJja39ne/jq7EP0SnCHy3gtamvkrgbG6TMWu2y2BO/2W0kpnvtkMXhAQCk3C19UpFjrKRFtdW+v86CO7ktikQTHFROwBNIwD+UXX3Odu9lvEKmd0axtpWYa0swNv+0n9mdXYHuMwLtMQzTBQVPQ63B1es93ljERjePr4GZbDS1AzGaSSSQQnQnqN7TEO4zKNSgyDNMGJkopmN4vtspZg4HIAZaVHoCqKjo42jw62xziMyzTpnEFG1ar4giIrx/NIHxygtqH2UByamNbv3ad9+l5w/APMVqeVaSiMBAryTSYTNzY6rpOl3d2s+N00gmPTWFlaP6z5e7wgqsoxDYVhoGJLSiaSvu52EEKwsriuk72dHgxeDaC8PNsOM5P395GIRZJMQ2G0QLTPy3OfYsl4HGvLG3g+9Aor4axJfWNNth1VxZnzfsh7e9hYmo8xjWlBA8dG+V6AF00F5qGeS9d7ba4yy7e1GCqrS5Eb88WHI5AWo+x1Q0mniRSPJ3mJrGoEU/og0fcZlWX5QejNS7vvwqCnrqG6KEUPLPR2Ft19HYiGv2PA35cbOJa6hOL4k+HhjJ6Ao8Nfb+Nwtk672Cya79a3eI7WuFscLrGikBpj8v5rJRaOIC3JKZIiMWSwa4zxx5wBS8Lm3um2Q/RVwV9jRauJR3n2jBBZTWDu/Tomw3Fs0tKPavqB3aId5QxYrEIDwj++YHr2+Ekhse5/CTAAXnxi0o4gTYMAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%28pref%20%3D%3E%20%7B%0A%09var%20%7BBEHAVIOR_REJECT%2C%20BEHAVIOR_REJECT_TRACKER%7D%20%3D%20Ci.nsICookieService%3B%0A%09var%20icons%20%3D%20%7B%0A%09%09%5BBEHAVIOR_REJECT%5D%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAArxJREFUeNqkU0tPE1EYPTNMIYUG+rIM71cRCNGKSCEtGNSgqZoQgi40caExrv0pLowxsjCi7jQmLiAmhiAtCgSNiSGEWN5SW4RSKM7QduaO906nqCsX3vTMTL57zun57nzDaZqG/1kCu4zcECDkcRB4gP7sHIcuWm6icBq8LYoF+l9TBIgr9KKo2m+DP5Y3z1x8RTzW43U0nmoqsNgcrJja39ne/jq7EP0SnCHy3gtamvkrgbG6TMWu2y2BO/2W0kpnvtkMXhAQCk3C19UpFjrKRFtdW+v86CO7ktikQTHFROwBNIwD+UXX3Odu9lvEKmd0axtpWYa0swNv+0n9mdXYHuMwLtMQzTBQVPQ63B1es93ljERjePr4GZbDS1AzGaSSSQQnQnqN7TEO4zKNSgyDNMGJkopmN4vtspZg4HIAZaVHoCqKjo42jw62xziMyzTpnEFG1ar4giIrx/NIHxygtqH2UByamNbv3ad9+l5w/APMVqeVaSiMBAryTSYTNzY6rpOl3d2s+N00gmPTWFlaP6z5e7wgqsoxDYVhoGJLSiaSvu52EEKwsriuk72dHgxeDaC8PNsOM5P395GIRZJMQ2G0QLTPy3OfYsl4HGvLG3g+9Aor4axJfWNNth1VxZnzfsh7e9hYmo8xjWlBA8dG+V6AF00F5qGeS9d7ba4yy7e1GCqrS5Eb88WHI5AWo+x1Q0mniRSPJ3mJrGoEU/og0fcZlWX5QejNS7vvwqCnrqG6KEUPLPR2Ft19HYiGv2PA35cbOJa6hOL4k+HhjJ6Ao8Nfb+Nwtk672Cya79a3eI7WuFscLrGikBpj8v5rJRaOIC3JKZIiMWSwa4zxx5wBS8Lm3um2Q/RVwV9jRauJR3n2jBBZTWDu/Tomw3Fs0tKPavqB3aId5QxYrEIDwj++YHr2+Ekhse5/CTAAXnxi0o4gTYMAAAAASUVORK5CYII%3D%22%2C%0A%09%09%5BBEHAVIOR_REJECT_TRACKER%5D%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAt5JREFUeNqkU0tPE1EU/qa0YAGhL9spUIFS5BUFrBRSwIDGByohJJpooglGQ8JKVhr3/gTjQhfGIBujMXEBkQUCrRFQFAuEEHlKxBZaoNa2dDoP750W1IUrb+bcmZzzfed+Z865jCRJ+J+lpFvfNSWUKQyUCoA8OoZBHXGXEDMkcX5ic+SsURHY5MnGC9LvBH8sR4o66yJ7uNGhLz5Wkpap1VNn7OdWIPDlw5x3yjUuRn88J67xvxQkV50qy3izrKWzLdOUZ0hVq6FQKuF2v4WzrpZN15tZbWF1xWz/Qx2/vU6EYpSS6AeIGD1SM67YTl5vy2QtBq8/AC4aRWRrCw77Ufmb+miMYiiWckQpmYAX0KS31TjUOqNhzetDz+OnWJpfhBCPIxYKwTXiln00RjEUSzmCmEzAiajKzi21UdlGTTbaL7TAbDoAgedlq6mulI3GKIZiKYfbTRAXJIsiLUPDKBTgdnZQUFSwR3aPjMnvhuNOOeYaege1xqChHGJJBTxSVSoVM9g/JIMjwWCCPDwG1+AYlhdX93z1jQ6IgsBQDrFEFzgB/khoO+RssGvoKSsLq7Dkm+GorYSZNSInJ1HOHe4NPMENFIVV8TOCPBvJEkRpcmnmoy+0uYmvS9/Q++glludXZZK1OD9RjiDAE/OhpvksPsV9MudVyb6EgriAvoXZyfYca3kuazJnXu5oRd5BE5WKCOnC3cgwpoUN0m8JQSGIcDgS627X3iIV1MoKSD+90Wj0gfv1C09g/Xu4sChPJrsGxkHvylTYC/2pcuhPV8DP+1FxqTm78XzTEcREO0MBDBl+q5bBiULpXCmr7raWVR7Kt5XpjWxuOkmM2+sD/OSODxEuGjN2VO2ffvZ5Qp5dBhO7CWgpdO4NNh1YpwX1+RpUqBTISfwjrK1sY6a3NeOq6UZB8dqTFQ96duzoSud3E9BS0pOm/Ofd7Uq9R+q1Q8W8x32uk1b/S4ABAB8mYiP34I0MAAAAAElFTkSuQmCC%22%0A%09%7D%3B%0A%09var%20setIcon%20%3D%20%28%29%20%3D%3E%20this.icon.src%20%3D%0A%09%09icons%5BServices.prefs.getIntPref%28pref%29%5D%20%7C%7C%20%22chrome%3A//browser/content/robot.ico%22%3B%0A%09setIcon%28%29%3B%0A%09Services.prefs.addObserver%28pref%2C%20setIcon%29%3B%0A%09addDestructor%28%28%29%20%3D%3E%20Services.prefs.removeObserver%28pref%2C%20setIcon%29%29%3B%0A%0A%09this.toggleCookieBehavior%20%3D%20%28%29%20%3D%3E%20Services.prefs.setIntPref%28%0A%09%09pref%2C%20Services.prefs.getIntPref%28pref%29%20%3D%3D%20BEHAVIOR_REJECT%0A%09%09%09%3F%20BEHAVIOR_REJECT_TRACKER%20%3A%20BEHAVIOR_REJECT%0A%09%29%3B%0A%7D%29%28%22network.cookie.cookieBehavior%22%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.toggleCookieBehavior%28%29%3B%0ABrowserReload%28%29%3B%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
Отсутствует
Уважаемые, подскажите, есть ли кнопка или скрипт, в который можно прописать адрес chrome://browser/content/places/places.xhtml?
И ещё вопрос такой, можно ли в одну кнопку прописать несколько папок, чтоб не делать отдельные на каждую?
Отсутствует
kazarin
this.onclick = function(event) { if(event.button == 0) { gBrowser. selectedTab = gBrowser. addTrustedTab ("chrome://browser/content/places/places.xhtml") } else if(event.button == 1) { document.getElementById('menu_openDownloads').click() } };
Отсутствует
kazarin - надо проверять ссылки, которые даёшь! Там файлы недоступны уже!
custom_buttons-0.0.7.0.0.17-fx-paxmod.xpi bootstrap
dom_inspector-7.0.9-fx-paxmod.xpi bootstrap
Отсутствует
Привет. Подскажите, почему я не могу получить выделенный текст?
И как можно получить выделенный текст самым простым способом?
var w = document.commandDispatcher.focusedWindow, d = w.document, q = w.getSelection().toString(); alert(q);
Отсутствует
почему я не могу получить выделенный текст?
Что значит «не могу»? Вместо alert'а что? Вообще ничего не происходит?
Или сразу краш? Или фига (кукиш) во весь экран? Или что-то ещё альтернативное?
Отсутствует
Необходимо получить куки, определённой вкладки, я новичок, помогите! Тут нашёл,
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/Tab
Что нужно подключить, чтобы работало? Нужно получить все куки вкладки, включая HttpOnly.
Отредактировано Deriax (03-05-2021 22:08:23)
Отсутствует
Путой алерт получается.
Пустой алерт означает, что в окне «document.commandDispatcher.focusedWindow»
ничего не выделено (выделенное в текстовых полях не считается, и никогда не считалось).
Текст на странице выделен, клик по кнопке
Кнопка находится в одном, родительском, процессе,
а текст на странице, как и сама страница, скорее всего, в другом, контентском, процессе.
Можешь проверить на странице, которая заведомо откроется в основном процессе,
например about:support (там выделенное будет алертиться так, как, наверно, и ожидалось).
Тут нашёл,
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/Tab
Где, интересно, «тут» могли куки померещиться?
Отсутствует
Cytrus пишетПутой алерт получается.
Пустой алерт означает, что в окне «document.commandDispatcher.focusedWindow»
ничего не выделено (выделенное в текстовых полях не считается, и никогда не считалось).Текст на странице выделен, клик по кнопке
Кнопка находится в одном, родительском, процессе,
а текст на странице, как и сама страница, скорее всего, в другом, контентском, процессе.
Можешь проверить на странице, которая заведомо откроется в основном процессе,
например about:support (там выделенное будет алертиться так, как, наверно, и ожидалось).Deriax пишетТут нашёл,
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/TabГде, интересно, «тут» могли куки померещиться?
Отсутствует
14f477a2ce81.png
Фу, в переводе это выглядит ещё более непонятно, чем в оригинале.
На самом деле, cookieStoreId — это всего лишь id'шник контейнера,
то есть, всего лишь уточняющий параметр для cookies.get() (и компании), не более того.
Типа — кука, именуемая так-то, с урлом каким-то эдаким, ограниченная контейнером (cookieStoreId) таким-то.
Еще раз: никакого «Хранилища файлов cookie вкладки» (так, как это звучит!) не существует.
Отредактировано Dumby (04-05-2021 02:11:30)
Отсутствует
Подскажите, а как можно получить URL по клику на ссылке?
document.addEventListener('click',e => { if (e.button!=0){return;} if (e.altKey){ e.preventDefault(); // console.log("IMG URL: "+e.target.src); console.log("IMG URL: "+e.target.href); // return; // } // let zzz = e.target.closest('href'); // console.log("URL: " + zzz.href); // return; // } });
Отсутствует
Dumby
В кнопке ucf Quick Toggle Settings на 88 не работает функция перезапуска, которая назначается в пунктах (restart: true,).
Поправьте пожалуйста.
Вот моя кнопка, не помню публиковалась ли она целиком, со всеми вашими правками на тот момент. Никаких недавно обсуждаемых новшеств я в нее не добавлял.
// Quick Toggle от Damby - Быстрое переключение параметров about:config // https://forum.mozilla-russia.org/viewtopic.php?pid=784165#p784165 // Ctrl+ЛКМ или ПКМ - сброс параметра по-умолчанию FF или удаление (async (name, id, func) => { if (name == "Object") return CustomizableUI.createWidget(func()); var win = name == "Window", g = Components.utils.import("resource://gre/modules/Services.jsm", {}); if (g[id]) {if (win) return;} else g[id] = func(); if (win) return CustomizableUI.createWidget(g[id]); addDestructor(r => r[5] == "e" && delete g[id]); g[id].onCreated(this); })(this.constructor.name, "QuickToggleAboutConfigSettings", () => { var {prefs} = Services, db = prefs.getDefaultBranch(""); var pv = parseInt(Services.appinfo.platformVersion); var xul_ns = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; //============================================================================= // refresh: // false - перезагрука текущей вкладки // true - перезагрука текущей вкладки минуя кэш // // restart: // false - перезапуск браузера // true - перезапуск браузера с подтверждением // // userChoice: // ваше значение - иконка назначается в 372 строке // // userAlt: // альтернативное значение - иконка назначается в 374 строке var primary = [{ pref: ["network.proxy.type", "Настройки прокси"], userChoice: 5, userAlt: 2, refresh: true, values: [ [0, "Не проксировать", "0"], [5, "Системные (IE)", "5"], [2, "Авто (pacfile)", "2"], [1, "Прописанные", "1"], [4, "Автоопределение", "4"] ]},{ pref: ["network.trr.uri", "DoH DNS провайдер"], userChoice: "https://firefox.dns.nextdns.io/", userAlt: "https://doh.dns.sb/dns-query", restart: true, values: [ ["https://firefox.dns.nextdns.io/", "NextDNS"], ["https://mozilla.cloudflare-dns.com/dns-query", "Cloudflare"], ["https://dns.comss.one/dns-query", "Comss DNS"], ["https://dns.google/dns-query", "Google DNS"] ]},{ pref: ["network.trr.mode", "DoH DNS режим (trr)"], userChoice: 3, userAlt: 2, refresh: true, values: [ [1, "Быстрейший"], [2, "DoH+St.as.reserve"], [3, "Строгий"] ]}, null, { pref: ["permissions.default.image", "Загружать web-графику"], userChoice: 1, userAlt: 2, refresh: true, values: [ [1, "Да"], [3, "С сайта"], [2, "Нет"] ]} ]; //============================================================================= var secondary = [{ pref: ["ui.prefersReducedMotion", "Анимация chrome"], userChoice: 1, userAlt: 0, restart: true, values: [[1, "Отключена"], [0, "Включена"]] },{ pref: ["gfx.webrender.enabled", "Web render"], userChoice: true, userAlt: false, restart: true, values: [[true, "Включен"], [false, "Отключен"]] },{ pref: ["gfx.webrender.force-disabled", "Web render (force-disabled)"], userChoice: false, userAlt: true, restart: true, values: [[true, "Да"], [false, "Нет"]] } ]; return { id: "QuickToggleAboutConfigSettings", label: "Quick Toggle Settings", tooltiptext: "Quick Toggle Settings\n ЛКМ ПКМ", localized: false, image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAKdSURBVDhPjZNLTxNRFMenM9OWTulTEx4KkSg+0mCCujExNTyiLKiQAUofIcR+AOPOlStdGDd+AzdGDQvF+IhBBY0ro8aNUkAXxFhKERRaYOhjOuP/j0NidONNfj2Puef0nHvPFUzT/C9EQQiC5p/JoXeQJ8Ax2jZ+/HtJNpsDwqiapm7ZnmoqWchq2qNGRYl8yRdetPq83dLN20zyezEIiNwMsxZ4obuAm/aitvVQkeX9CBoIOp1N6bX8K/g92+W1u1x+ZAqwJDOVNAsj0TfQW+EPQbbk4uoD+qGfAz2gn/a02vtSsEuSj0Za7b2BD8f10eGKtfnMcmLgg6WfnlUjk7DnGLySGJydUXunoPeIhmG4C+XK2yP+2ovo870kybKuV8rQJ3bX1LRPZXO3UGrwkN/bmdsq5uAfXy4Ws4f9vg74FSERCJxCppNmKmYS6IldkhSlXh0d1mHH6LMYYiWQbIPthG0sk/+EbAIOKA5RBuu08W/PKLnwLQaxBTYAr457SuJOMLbzZye4ZLG9MptaGqIINIsVkAerwgGHI45SBnlYVgvdLI221YIKoqAPdH6N9j+B5O20gr02/HQ87+k639lYP4KM26ta1Us4TCf1hU1tunls/Craufs5X5g86PN2za9vTLR4as+iraOIF1YYjEH5CMcQgnVJsjk5ME8z2bE9biXERJ9W114HnY4m+Pu8dvu+ubXCFNwBVlCviGKdZhh+OPyZmHqlQXG1YWOyTpYrS7peTquRC7xG+HjIPCM7r5PTyAQcXR+zAb4BjjHLNwDfAg/WPjMQucwK6u7cu/Q9MXiNsxC6//i6iAfDjDzRBbBkyXnwDWQs3zJ7/1EsZ/4ZpD+eqwPIwAX4dInHshtAGwhz/iE5SLgdIfwLnaFD0PXeqXgAAAAASUVORK5CYII=", onCreated(btn) { btn.setAttribute("image", this.image); var doc = btn.ownerDocument; btn.btn = true; btn.domParent = null; btn.popups = new btn.ownerGlobal.Array(); this.createPopup(doc, btn, "primary", primary); this.createPopup(doc, btn, "secondary", secondary); this.createCloseMenusOption(doc, btn); btn.linkedObject = this; for(var type of ["command", "contextmenu"]) btn.setAttribute("on" + type, `linkedObject.${type}(event)`); }, createPopup(doc, btn, name, data) { var popup = doc.createElementNS(xul_ns, "menupopup"); var prop = name + "Popup"; btn.popups.push(btn[prop] = popup); popup.id = this.id + "-" + prop; for (var type of ["popupshowing", "click"]) popup.setAttribute("on" + type, `parentNode.linkedObject.${type}(event)`); for(var obj of data) popup.append(this.createElement(doc, obj)); btn.append(popup); }, map: {b: "Bool", n: "Int", s: "String"}, createElement(doc, obj) { if (!obj) return doc.createElementNS(xul_ns, "menuseparator"); var pref = doc.ownerGlobal.Object.create(null), node, img, bool; for(var [key, val] of Object.entries(obj)) { if (key == "pref") { var [apref, lab, akey, ttt] = val; pref.pref = apref; pref.lab = lab || apref; if (ttt) pref.ttt = ttt; } else if (key == "image") img = val, pref.img = true; else if (key != "values") pref[key] = val; else pref.hasVals = true; } var type = prefs.getPrefType(pref.pref); var str = this.map[type == prefs.PREF_INVALID ? obj.values ? (typeof obj.values[0][0])[0] : "b" : type == prefs.PREF_BOOL ? "b" : type == prefs.PREF_INT ? "n" : "s" ]; pref.get = prefs[`get${str}Pref`]; pref.set = prefs[`set${str}Pref`]; node = doc.createElementNS(xul_ns, "menu"); node.className = "menu-iconic"; node.setAttribute("closemenu", "none"); img && node.setAttribute("image", img); akey && node.setAttribute("accesskey", akey); (node.pref = pref).vals = doc.ownerGlobal.Object.create(null); this.createRadios(doc, str.startsWith("B") && !pref.hasVals ? [[true, "true"], [false, "false"]] : obj.values, node.appendChild(doc.createElementNS(xul_ns, "menupopup")) ); if ("userChoice" in obj) pref.noAlt = !("userAlt" in obj); return node; }, createCloseMenusOption(doc, btn) { var pn = this.closePref = "QuickToggleAboutConfigSettings.closeMenus"; var data = [null, { pref: [pn, "Автозакрытие этого меню"], values: [[true, "Да"], [false, "Нет"]] }]; var setCloseMenus = e => { e.stopPropagation(); var trg = e.target, {pref, val} = trg, updPopup = true, clear; switch(e.type) { case "command": pref = (trg = trg.closest("menu")).pref; updPopup = false; break; case "click": if (e.button) return; break; case "contextmenu": e.preventDefault(); clear = pref; } if (!pref) return; if (clear) prefs.clearUserPref(pn); else if (!updPopup && val === pref.val) return; else pref.set(pn, val !== undefined ? val : !pref.val); this.upd(trg); updPopup && this.popupshowing(null, trg.querySelector("menupopup")); } (this.createCloseMenusOption = (doc, btn) => { for(var obj of data) btn.secondaryPopup.append(this.createElement(doc, obj)); var m = btn.secondaryPopup.lastChild; m.style.cssText = "fill: lightblue !important; list-style-image: url(chrome://browser/skin/menu.svg) !important;"; m.setAttribute("oncommand", "setCloseMenus(event)"); m.onclick = m.oncontextmenu = m.setCloseMenus = setCloseMenus; })(doc, btn); }, UserChoiceImg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHqSURBVDhPpVJBTxNBGH1LLakxVEJQQIkhlZCAJDYR/BGScNCDwZMcuEji2ZP+BD14MCGciDEaEw8e1At3QGLlwAUOFtm6tut2uwtb2t3p8GbZ0iXlVF/y5ttkv+/Nmzej5XI5/A+6otoxTh1ks9mwhniJHvRiBAHXLjRIEy7yeIqjqAPNuXYHS5jGVby7PTT27eHo7Or9zL3Va/19Xyj5FsuYjLpOcdbBG9xFGh+fZRaGJ5O3tB7tMrcXcGQZP+pb8tXuyjpdPcA89HYHynYazxdvzg5nkgOapFsPNleXP+uY6L6hzYxMT+EC5vCVa4SWAM880Ju4cyVxUXNkERUeuyJLIR1+O6wTqcEEUngEA5eiqZgAAxtMpfur0sIBLA7+hS2NkK5UGVpsqgEJjLMkT4biAkzbE27D5u7/ZAFWSB1l0iRtUokyEj+aCBEXMHcOA70Y/IElfsMUeyiJPIpBHiZZEvv4Vcsrge9Mi1ZO0BJQ98yw9w4tWT4yYNV1ki78AuyggHLNwLZjC1Txnpl60VRMQD2SBl5sGsHaT88XJd+DEzioCAd6rYpN1xf7Jj5T4BMe00eE9pf4GteZ8Ry6mbYKDDyzxAblP4TDT1BUbc2585+yumd1Vc201ZmV7djObQKdopVBRwCOAVyl9qcQtNEaAAAAAElFTkSuQmCC", notUserChoiceImg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHqSURBVDhPpVJNSxtRFD1PJ9GMMVpaKyWhRGwRFy7Utv+gVFyUgoWif8Ct+APMsvQX+BuUWhdBcOvSDwi1XVhK0WgmTr4mmphoJvPRe5NnxhLdpAcO9828d869794nXNfF/6BLxo7RqiAcDjciYx3oDwFRBxikT4ey5CtAcg64aZ4ANE1rxDaDLeB176Aae/zx/ZR/NDqEuu1UD39oxsZ2wnIRmwV+8rl7DeLAGzXg+/pidSWivBwVCPQDvH91AfPot/tn6fOedW3NzTT0TYNWD7hsVfWtjH1ZjCjPggImFV25AKpE+xr+6CMxsvzpVXePmE8AipR5Bnzn4bcT0yJoCZSyQDkPXOrEDDHXYG8k0B18/nSBdvukzDPghqlB/xOUi4BBgiIJDUleF0lmVaEo7ngd8EnZP2N0uiolBwXKmksDegrISubovvyPWauR3kPLgBb5q+O8hnMyOD8jJoknTaZPKZLRSQp2+eaA6q9JmWcwTHPWv2cT0E0XGcqos4lkhgz4X7Jql3O1NZNaK2WewSQ9EtqIHcWPd5FybWQNoECNNApkdgmcwv61k47TbDbf0VykrP0hfaPlADAfCmFBERiHQN2sY79UwTqLP1BX+NyDL5HBc+ZR3Xab78xl383cZtAp7o6xAwB/AT+Y7GFJS/NjAAAAAElFTkSuQmCC", UserAltImg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAH7SURBVDhPpVJLa1NBFP5mJolNcrWhtiq9Betjk0VFfNS1O7ciXbQguBDXxR9g3Lnown8g3SqCi24K/gCxVbqogiBaxdyY5nFrkt5H5j7GmZvxphDdxA8+Dgzn+86Zcw4RQuB/QHUcG2kHpmkmUWHtEo6DY55mUCIhYkHQOlXA97vv4esUWJaVxBGDp2Vcz54klakbN69kZ8wZRHHsVT9b7e2tHdFH5eEuPqi8vxqsLWDxmIGX5+8/mMufPkdA8zIBiMMuvNo3sbf+bCt2cWd1V+kHBukMVNuFE3h08d7SXHF6glC4oHFXGnTBmA9j1iBnb9+6xvJYfryIjJYdGaL889TlC1cLkyFhQQek3wThjYSUt8GCX9Iky/JniitGF0WtGhpQgdLEJJvO8AMpUgIbtK/JbflmI0cc2Y0oy/JZLRsaEIKYcCemXgvUlVXdOpj/c0Bnf0BXdhXxQEsSpAZqVU7NtkRPJh5aoAmrCYnzA9SpIbDr4G74Lsihr2VDA7Xn5kdvx2mGgnr7soNaSubXQb0GelUv8lt4Pj8rJ6yRGqgjERyVT68P3rarJIo6HojrJOS2h8Yejb6+OdyIe3i1tIlIy0YP6ckCTCOH5WIJKxmGsnwKeB/bbgcvlHj1Cxoq75+XqKD2rFb1Z9rqz6rto5VHDMZFOoPxAPwGQ077rbKVfhEAAAAASUVORK5CYII=", upd(node) { var {pref} = node, def = false, user = false, val; if (prefs.getPrefType(pref.pref) != prefs.PREF_INVALID) { var pn = pref.pref; try {val = pref.defVal = db[pref.get.name](pn); def = true} catch(ex) {def = false;} var user = prefs.prefHasUserValue(pn); if (user) try {val = pref.get(pn, undefined);} catch(ex) {} } if (val == pref.val && def == pref.def && user == pref.user) return; pref.val = val; pref.def = def; pref.user = user; var exists = def || user; var ttt = exists ? val : "Этот преф не существует"; if (ttt === "") ttt = "[ empty_string ]"; ttt += "\n" + pref.pref; if (pref.ttt) ttt += "\n" + pref.ttt; node.tooltipText = ttt; var img, alt = "userAlt" in pref && val == pref.userAlt; if (alt) img = this.UserAltImg; if ("userChoice" in pref) if (val == pref.userChoice) //node.style.removeProperty("color"), img = this.UserChoiceImg; else { //node.style.setProperty("color", "maroon", "important"); if (!alt) img = this.notUserChoiceImg; } if (!pref.img) img ? node.setAttribute("image", img) : node.removeAttribute("image"); user ? node.style.setProperty("font-style", "italic", "important") : node.style.removeProperty("font-style"); var {lab} = pref; if (exists && pref.hasVals) { if (val in pref.vals) var sfx = pref.vals[val] || val; else var sfx = user ? "Другое" : "По умолчанию"; lab += ` — "${sfx}"`; } node.setAttribute("label", lab); }, createRadios(doc, vals, popup) { for(var arr of vals) { if (!arr) { popup.append(doc.createElementNS(xul_ns, "menuseparator")); continue; } var [val, lab, key, ttt] = arr; var menuitem = doc.createElementNS(xul_ns, "menuitem"); menuitem.setAttribute("type", "radio"); menuitem.setAttribute("closemenu", "none"); menuitem.style.setProperty("font-style", "italic", "important"), menuitem.setAttribute("label", popup.parentNode.pref.vals[val] = lab); key && menuitem.setAttribute("accesskey", key); var tip = menuitem.val = val; if (ttt) tip += "\n" + ttt; menuitem.tooltipText = tip; popup.append(menuitem); } }, openPopup(popup) { var btn = popup.parentNode; if (btn.domParent != btn.parentNode) { btn.domParent = btn.parentNode; var pos; if (btn.matches(".widget-overflow-list > :scope")) pos = "after_start"; else var win = btn.ownerGlobal, {width, height, top, bottom, left, right} = btn.closest("toolbar").getBoundingClientRect(), pos = width > height ? `${win.innerHeight - bottom > top ? "after" : "before"}_start` : `${win.innerWidth - right > left ? "end" : "start"}_before`; for(var p of btn.popups) p.setAttribute("position", pos); } popup.openPopup(btn); }, maybeRestart(node, conf) { var msgRest = "Перезапустить браузер?", msgAbort = "Запрос на выход отменен."; if (pv >= 77) { var title = node.closest("toolbarbutton").label; var pp = domWin => Services.prompt.wrappedJSObject.pickPrompter({ domWin, modalType: Ci.nsIPrompt.MODAL_TYPE_WINDOW }); var confirm = win => pp(win).confirm(title, msgRest); var alert = win => pp(win).alert(title, msgAbort); } else { var confirm = win => win.confirm(msgRest); var alert = win => win.alert(msgAbort); } return (this.mayBeRestart = (node, conf) => { var win = node.ownerGlobal; if (conf && !confirm(win)) return; if (win.BrowserUtils.restartApplication() === false) alert(win); else return true; })(node, conf); }, regexpRefresh: /^(?:view-source:)?(?:https?|ftp)/, maybeRe(node, fe) { var {pref} = node; if ("restart" in pref) { if (this.maybeRestart(node, pref.restart)) return; } else this.popupshowing(fe, node.parentNode); if ("refresh" in pref) { var win = node.ownerGlobal; if (this.regexpRefresh.test(win.gBrowser.currentURI.spec)) pref.refresh ? win.BrowserReloadSkipCache() : win.BrowserReload(); } }, maybeClosePopup(e, trg) { !e.ctrlKey && prefs.getBoolPref(this.closePref, undefined) && trg.parentNode.hidePopup(); }, command(e) { var trg = e.target; if (trg.btn) return this.openPopup(trg.primaryPopup); var menu = trg.closest("menu"), newVal = trg.val; this.maybeClosePopup(e, menu); if (newVal != menu.pref.val) menu.pref.set(menu.pref.pref, newVal), this.maybeRe(menu, true); }, popupshowing(e, trg = e.target) { if (trg.state == "closed") return; if (trg.id) { for(var node of trg.children) { if (node.nodeName.endsWith("r")) continue; this.upd(node); !e && node.open && this.popupshowing(null, node.querySelector("menupopup")); } return; } var {pref} = trg.closest("menu"), findChecked = true; var findDef = "defVal" in pref; var checked = trg.querySelector("[checked]"); if (checked) { if (checked.val == pref.val) { if (findDef) findChecked = false; else return; } else checked.removeAttribute("checked"); } if (findDef) { var def = trg.querySelector("menuitem:not([style*=font-style]"); if (def) if (def.val == pref.defVal) { if (findChecked) findDef = false; else return; } else def.style.setProperty("font-style", "italic", "important"); } for(var node of trg.children) if ("val" in node) { if (findChecked && node.val == pref.val) { node.setAttribute("checked", true); if (findDef) findChecked = false; else break; } if (findDef && node.val == pref.defVal) { node.style.removeProperty("font-style"); if (findChecked) findDef = false; else break; } } }, contextmenu(e) { var trg = e.target; if (trg.btn) { if (e.ctrlKey || e.shiftKey) return; if (e.detail == 2) return trg.secondaryPopup.hidePopup(); this.openPopup(trg.secondaryPopup); } else if ("pref" in trg) { this.maybeClosePopup(e, trg); if (trg.pref.user) prefs.clearUserPref(trg.pref.pref), this.maybeRe(trg); } e.preventDefault(); }, click(e) { if (e.button) return; var trg = e.target, {pref} = trg; if (!pref) return; this.maybeClosePopup(e, trg); if (!("noAlt" in pref)) return; if (pref.val == pref.userChoice) if (pref.noAlt) return; else pref.set(pref.pref, pref.userAlt); else pref.set(pref.pref, pref.userChoice); this.maybeRe(trg); } }; });
Отсутствует
Dumby
В кнопке ucf Quick Toggle Settings на 88 не работает функция перезапуска, которая назначается в пунктах (restart: true,).
Поправьте пожалуйста.
Вот моя кнопка, не помню публиковалась ли она целиком, со всеми вашими правками на тот момент. Никаких недавно обсуждаемых новшеств я в нее не добавлял.
строка 282
//if (win.BrowserUtils.restartApplication() === false) alert(win);
if (Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit) === false) alert(win);
Отсутствует