Dumby,
описание не предоставленно
Критику учел.
С первым кодом, обертывание не подлечило, кнопка не реагировала.
Ваш код работает безупречно.
Да пребудет с вами JS-сила, мастер. Спасибо.
Оставлю рабочий вариант кнопки. Автор 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%u0418%u0437%u043C%u0435%u043D%u0438%u0442%u044C%20%u0443%u0440%u043E%u0432%u0435%u043D%u044C%20%u044F%u0440%u043A%u043E%u0441%u0442%u0438%20%u044D%u043A%u0440%u0430%u043D%u0430%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA7klEQVR4nKWTQW6EMAxFP2gugLgIC87AnmMjIXECLhL7213MxHIo6rQdS1aiyH7+cZwOgOMDe7zWLh8uywKSUFWQhJmBJLZti5h5nrHvuyMp8L/4NE0A4A8kO44jqqlquIiEGpJY1xUkmysAQByaGcwM7h57MwsIAIjIPcDdoxJJiEisvwLkaqUUkIy1OgCc5/kdoKpw96iaFVSIqt4+Y6NARBrp1fMVbgE16PoCpZRmJn4EVJkVlqFvAaoaDazzcPUroL/2oCbnRtZEd4f7c3CHYYi8f43yC9CMcvOhso3jGAq67hnW930kffSdvwAkRmw4ZXkwxgAAAABJRU5ErkJggg%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//%20%u0410%u0432%u0442%u043E%u0440%20%u043A%u043E%u0434%u0430%20%u0434%u043B%u044F%20%u044D%u0442%u043E%u0439%20%u043A%u043D%u043E%u043F%u043A%u0438%20-%20Dumby.%20%0A//%20%u0424%u043E%u0440%u0443%u043C.%20Mozilla%20%u0420%u043E%u0441%u0441%u0438%u044F.%20%0A//%20https%3A//forum.mozilla-russia.org/viewtopic.php%3Fpid%3D795613%23p795613%0A%0A%28%28ovar%2C%20obs%29%20%3D%3E%20%7B%0A%09this.appendChild%28document.createElement%28%22style%22%29%29.append%28%0A%09%09%22%23tabbrowser-tabbox%20%7Bbackground-color%3A%20black%20%21important%3B%7D%5Cn%22%0A%09%09+%20%60%23tabbrowser-tabpanels%20%7Bopacity%3A%20var%28%24%7Bovar%7D%29%20%21important%3B%7D%60%0A%09%29%3B%0A%09var%20pref%20%3D%20%22CB.tabbrowser-tabpanels.opacity%22%3B%0A%09var%20gp%20%3D%20%28%29%20%3D%3E%20Services.prefs.getIntPref%28pref%2C%20100%29%3B%0A%09var%20sp%20%3D%20val%20%3D%3E%20Services.prefs.setIntPref%28pref%2C%20val%29%3B%0A%0A%09var%20st%20%3D%20document.documentElement.style%3B%0A%09%28obs%20%3D%20%28%29%20%3D%3E%20st.setProperty%28ovar%2C%20gp%28%29%20/%20100%2C%20%22important%22%29%29%28%29%3B%0A%09Services.prefs.addObserver%28pref%2C%20obs%29%3B%0A%0A%09this.onwheel%20%3D%20e%20%3D%3E%20%7B%0A%09%09var%20val%20%3D%20gp%28%29%20+%20%28e.deltaY%20%3C%200%20%3F%201%20%3A%20-1%29%3B%0A%09%09val%20%3C%200%20%7C%7C%20val%20%3E%20100%20%7C%7C%20sp%28val%29%3B%0A%09%7D%0A%09this.onauxclick%20%3D%20e%20%3D%3E%20e.button%20%21%3D%201%20%7C%7C%20sp%28100%29%3B%0A%0A%09addDestructor%28reason%20%3D%3E%20%7B%0A%09%09st.removeProperty%28ovar%29%3B%0A%09%09Services.prefs.removeObserver%28pref%2C%20obs%29%3B%0A%09%09reason%20%3D%3D%20%22delete%22%20%26%26%20Services.prefs.clearUserPref%28pref%29%3B%0A%09%7D%29%3B%0A%7D%29%28%22--cb-tabbrowser-tabpanels-opacity%22%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bcustombuttons.alertBox%28this.name%2C%20this.Help%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%u041F%u0440%u0438%20%u043D%u0430%u0432%u0435%u0434%u0435%u043D%u0438%u0438%20%u043A%u0443%u0440%u0441%u043E%u0440%u0430%20%u043D%u0430%20%u0438%u043A%u043E%u043D%u043A%u0443%2C%20%u043F%u0440%u043E%u043A%u0440%u0443%u0442%u0438%u0442%u0435%20%u043A%u043E%u043B%u0435%u0441%u043E%20%u043C%u044B%u0448%u0438%20%u0432%u0432%u0435%u0440%u0445%20/%20%u0432%u043D%u0438%u0437%2C%20%u0434%u043B%u044F%20%u0440%u0435%u0433%u0443%u043B%u0438%u0440%u043E%u0432%u043A%u0438%20%u044F%u0440%u043A%u043E%u0441%u0442%u0438.%0AC%u0440%u0435%u0434%u043D%u0438%u0439%20%u043A%u043B%u0438%u043A%2C%20%u043F%u0440%u0438%20%u043D%u0430%u0432%u0435%u0434%u0435%u043D%u0438%u0438%20%u043A%u0443%u0440%u0441%u043E%u0440%u0430%20%u043D%u0430%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%2C%20%u0441%u0431%u0440%u043E%u0441%u0438%u0442%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u043F%u043E-%u0443%u043C%u043E%u043B%u0447%u0430%u043D%u0438%u044E.%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Отсутствует
Dumby
Адаптируйте, пожалуйста, кнопку Изменить уровень яркости экрана, которую выложил выше Пострел для UCF.
Отсутствует
Адаптируйте, пожалуйста, кнопку Изменить уровень яркости экрана, которую выложил выше Пострел для UCF.
Какая-то шляпа получилась, надеюсь сойдёт.
(async pref => CustomizableUI.createWidget(({ label: "Изменить уровень яркости экрана", tooltiptext: "Изменить уровень яркости экрана", id: "ucf-tabbrowser-tabpanels-opacity-changer", localized: false, get pref() { return Services.prefs.getIntPref(pref, 100); }, onCreated(btn) { var txt = "При наведении курсора на иконку, прокрутите колесо мыши вверх / вниз, для регулировки яркости.\n" + "Cредний клик, при наведении курсора на иконку кнопки, сбросит яркость по-умолчанию."; var click = () => Services.prompt.alert(null, this.label, txt); var setPref = (e, val = 100) => { Services.prefs.setIntPref(pref, val); e.target.toggleAttribute("rst"); } var auxclick = e => e.button != 1 || setPref(e); var wheel = e => { var val = this.pref + (e.deltaY < 0 ? 1 : -1); val < 0 || val > 100 || setPref(e, val); } (this.onCreated = btn => { btn.onwheel = wheel; btn._handleClick = click; btn.onauxclick = auxclick; btn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA7klEQVR4nKWTQW6EMAxFP2gugLgIC87AnmMjIXECLhL7213MxHIo6rQdS1aiyH7+cZwOgOMDe7zWLh8uywKSUFWQhJmBJLZti5h5nrHvuyMp8L/4NE0A4A8kO44jqqlquIiEGpJY1xUkmysAQByaGcwM7h57MwsIAIjIPcDdoxJJiEisvwLkaqUUkIy1OgCc5/kdoKpw96iaFVSIqt4+Y6NARBrp1fMVbgE16PoCpZRmJn4EVJkVlqFvAaoaDazzcPUroL/2oCbnRtZEd4f7c3CHYYi8f43yC9CMcvOhso3jGAq67hnW930kffSdvwAkRmw4ZXkwxgAAAABJRU5ErkJggg=="); })(btn); }, init() { var css = [ "@-moz-document url(chrome://browser/content/browser.xhtml) {", "\t#${this.id}[rst] {filter: grayscale(1%) !important;}", "\t:root:not([chromehidden*=toolbar]) #tabbrowser-tabbox {background-color: black !important;}", `\t:root:not([chromehidden*=toolbar]) #tabbrowser-tabpanels {opacity: ${this.pref / 100} !important;}`, "}" ].join("\n"); var url = `resource://${this.id}/`; Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler) .setSubstitution(this.id, Services.io.newURI("data:text/css," + 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 st = InspectorUtils.getAllStyleSheets(( Services.appShell.hiddenDOMWindow || Services.wm.getEnumerator(null).getNext() ).document).find(s => s.href == url).cssRules[0].cssRules[2].style; var obs = () => st.setProperty("opacity", this.pref / 100, "important"); Services.prefs.addObserver(pref, obs); Services.obs.addObserver(function quit(s, topic) { Services.obs.removeObserver(quit, topic); Services.prefs.removeObserver(pref, obs); }, "quit-application-granted"); return this; } }).init()))("ucf.tabbrowser-tabpanels.opacity");
Отсутствует
Какой большой прок от этой "яркости" ? Ну, затемняет и все ? А ,прибавить яркость выше номинала? Или это нерешаемо?
Мне-то откуда знать, что дали, то и есть.
Прибавить яркость — вряд ли, световой поток из под пикселей не поднять.
Есть filter: brightness(), можно под него переделать,
но сомневаюсь, что результат понравится.
Подскажите как на 91esr запустить кнопки. Пытаюсь переехать с 52, пока не сильно то и получается. Поставил Custom Buttons 0.0.7.0.0.21, но кнопки не устанавлива.тся
Не, 0.0.7.0.0.21 на 91 ставить не следует, там есть косяк несовместимости.
Для 91 вполне должен подойти 0.0.7.0.0.19.
А «запустить кнопки», если имеется в виду, что код, работающий в 52,
будет работать и в 91, то нет, не будет. Зависит, конечно, от кода,
могут быть исключения, но в общем случае — нет, такого ожидать не стоит.
закрыть все вкладки кроме активной
gBrowser.removeAllTabsBut(gBrowser.selectedTab);
Отсутствует
Я не просил, так теперь прошу.
Я что-то непонятное написал? Нет у меня ничего.
Где-то может есть какой-то хитрый svg-фильтр, не знаю.
Или хочешь покрутить колесо, посмотреть как выглядит brightness(),
но самому код менять несподручно? Ну покрути
((bvar, obs) => { this.appendChild(document.createElement("style")).append( `#tabbrowser-tabpanels .browserStack > browser {filter: brightness(var(${bvar})) !important;}` ); var pref = "CB.tabbrowser-browser.brightness"; var gp = () => Services.prefs.getIntPref(pref, 100); var sp = val => Services.prefs.setIntPref(pref, val); var st = document.documentElement.style; (obs = () => st.setProperty(bvar, gp() + "%", "important"))(); Services.prefs.addObserver(pref, obs); this.onwheel = e => { var val = gp() + (e.deltaY < 0 ? 2 : -2); val < 100 || val > 200 || sp(val); } this.onauxclick = e => e.button != 1 || sp(100); addDestructor(reason => { st.removeProperty(bvar); Services.prefs.removeObserver(pref, obs); reason == "delete" && Services.prefs.clearUserPref(pref); }); })("--cb-tabbrowser-browser-brightness");
Отсутствует
Жаль с первой не совместить. Типа, эта прибавляет, а, та наоборот...
Ну почему же, меньше 100% brightness() тоже работает,
можно val < 100 заменить на val < 0, вот, для наглядности, - 50-100-200.
Отсутствует
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%u041F%u0440%u0438%u0431%u0430%u0432%u0438%u0442%u044C%20/%u0423%u0431%u0430%u0432%u0438%u0442%u044C%20%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u044D%u043A%u0440%u0430%u043D%u0430%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bfile%3A///C%3A/Users/%25D0%2590%25D0%25BD%25D0%25B4%25D1%2580%25D0%25B5%25D0%25B9/Desktop/index.png%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0A%0A%28%28bvar%2C%20obs%29%20%3D%3E%20%7B%0A%09this.appendChild%28document.createElement%28%22style%22%29%29.append%28%0A%09%09%60%23tabbrowser-tabpanels%20.browserStack%20%3E%20browser%20%7Bfilter%3A%20brightness%28var%28%24%7Bbvar%7D%29%29%20%21important%3B%7D%60%0A%09%29%3B%0A%09var%20pref%20%3D%20%22CB.tabbrowser-browser.brightness%22%3B%0A%09var%20gp%20%3D%20%28%29%20%3D%3E%20Services.prefs.getIntPref%28pref%2C%20100%29%3B%0A%09var%20sp%20%3D%20val%20%3D%3E%20Services.prefs.setIntPref%28pref%2C%20val%29%3B%0A%0A%09var%20st%20%3D%20document.documentElement.style%3B%0A%09%28obs%20%3D%20%28%29%20%3D%3E%20st.setProperty%28bvar%2C%20gp%28%29%20+%20%22%25%22%2C%20%22important%22%29%29%28%29%3B%0A%09Services.prefs.addObserver%28pref%2C%20obs%29%3B%0A%0A%09this.onwheel%20%3D%20e%20%3D%3E%20%7B%0A%09%09var%20val%20%3D%20gp%28%29%20+%20%28e.deltaY%20%3C%200%20%3F%202%20%3A%20-2%29%3B%0A%09%09val%20%3C%200%20%7C%7C%20val%20%3E%20200%20%7C%7C%20sp%28val%29%3B%0A%09%7D%0A%09this.onauxclick%20%3D%20e%20%3D%3E%20e.button%20%21%3D%201%20%7C%7C%20sp%28100%29%3B%0A%0A%09addDestructor%28reason%20%3D%3E%20%7B%0A%09%09st.removeProperty%28bvar%29%3B%0A%09%09Services.prefs.removeObserver%28pref%2C%20obs%29%3B%0A%09%09reason%20%3D%3D%20%22delete%22%20%26%26%20Services.prefs.clearUserPref%28pref%29%3B%0A%09%7D%29%3B%0A%7D%29%28%22--cb-tabbrowser-browser-brightness%22%29%3B%0Athis.onclick%20%3D%20this.oncontextmenu%20%3D%20function%28event%29%20%7B%0A%20if%28event.button%20%3D%3D%202%20%26%26%20%21event.ctrlKey%20%26%26%20%21event.shiftKey%20%26%26%20%21event.altKey%20%26%26%20%21event.metaKey%29%7B%0Acustombuttons.alertBox%28this.name%2C%20this.Help%29%3B%0A%7D%3B%0A%7D%20%0Athis.oncontextmenu%20%3De%3D%3E%20%7B%20e.button%20%26%26%20%21e.ctrlKey%20%26%26%20e.preventDefault%28%29%20%7D%3B%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%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%5B%u041F%u0440%u0438%20%u043D%u0430%u0432%u0435%u0434%u0435%u043D%u0438%u0438%20%u043A%u0443%u0440%u0441%u043E%u0440%u0430%20%u043D%u0430%20%u0438%u043A%u043E%u043D%u043A%u0443%2C%20%u043F%u0440%u043E%u043A%u0440%u0443%u0442%u0438%u0442%u0435%20%u043A%u043E%u043B%u0435%u0441%u043E%20%u043C%u044B%u0448%u0438%20%u0432%u0432%u0435%u0440%u0445%20/%20%u0432%u043D%u0438%u0437%2C%20%u0434%u043B%u044F%20%u0440%u0435%u0433%u0443%u043B%u0438%u0440%u043E%u0432%u043A%u0438%20%u044F%u0440%u043A%u043E%u0441%u0442%u0438.%0AC%u0440%u0435%u0434%u043D%u0438%u0439%20%u043A%u043B%u0438%u043A%2C%20%u043F%u0440%u0438%20%u043D%u0430%u0432%u0435%u0434%u0435%u043D%u0438%u0438%20%u043A%u0443%u0440%u0441%u043E%u0440%u0430%20%u043D%u0430%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%2C%20%u0441%u0431%u0440%u043E%u0441%u0438%u0442%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u043F%u043E-%u0443%u043C%u043E%u043B%u0447%u0430%u043D%u0438%u044E.%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Отсутствует
Dumby
В 94 начал некорректно работать скрипт ucf-mem-indicator (не отображется счетчик)
Можно это поправить?
(async id => ({ delay: 2e3, val: "", init(topic, mm) { Services.obs.addObserver(mm = this, topic); Services.obs.addObserver(function quit(s, t) { this.timer?.cancel(); Services.obs.removeObserver(mm, topic); Services.obs.removeObserver(quit, t); }, "quit-application-granted"); }, observe(win) { var df = win.MozXULElement.parseXULToFragment( `<hbox id="${id}"><label id="${id += "-label"}"/></hbox>` ); this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); (this.observe = async win => { this.timer.cancel(); await new Promise(ChromeUtils.idleDispatch); win.document.getElementById("star-button-box") .after(win.document.importNode(df, true)); this.notify(); })(win); }, async notify() { var info = await ChromeUtils.requestProcInfo(); var bytes = info.residentSetSize; for(var child of info.children) bytes += child.residentUniqueSize; this.timer.initWithCallback(this, this.delay, this.timer.TYPE_ONE_SHOT); var prev = this.val; if ((this.val = this.mgb(bytes)) != prev) for(var win of CustomizableUI.windows) win.document.getElementById(id).value = this.val; }, mgb: bytes => bytes < 1073741824 ? Math.round(bytes / 1048576) + "MB" : (bytes / 1073741824).toFixed(2) + "GB" }).init("browser-delayed-startup-finished"))("ucf-mem-indicator");
На форуме
Можно это поправить?
Да, вроде поправлял, когда-то
(async id => ({ delay: 2e3, val: "", init(topic, mm) { Services.obs.addObserver(mm = this, topic); Services.obs.addObserver(function quit(s, t) { this.timer?.cancel(); Services.obs.removeObserver(mm, topic); Services.obs.removeObserver(quit, t); }, "quit-application-granted"); }, observe(win) { var df = win.MozXULElement.parseXULToFragment( `<hbox id="${id}" align="center"><label id="${id += "-label"}"/></hbox>` ); this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); // Bug 1665318 - In about:processes refresh, ResidentUniqueDistinguishedAmount is slow (Firefox 94+) // https://bugzilla.mozilla.org/show_bug.cgi?id=1665318 parseInt(Services.appinfo.platformVersion) < 94 && Object.assign(this, eval( `({${this.notify}})`.replace("memory", "residentSetSize").replace("memory", "residentUniqueSize") )); (this.observe = async win => { this.timer.cancel(); await new Promise(ChromeUtils.idleDispatch); var ind = win.document.importNode(df, true); win.document.getElementById("star-button-box").after(ind); this.notify(); })(win); }, async notify() { var info = await ChromeUtils.requestProcInfo(); var bytes = info.memory; for(var child of info.children) bytes += child.memory; this.timer.initWithCallback(this, this.delay, this.timer.TYPE_ONE_SHOT); var prev = this.val; if ((this.val = this.mgb(bytes)) != prev) for(var win of CustomizableUI.windows) { var lab = win.document.getElementById(id); if (lab) lab.value = this.val; } }, mgb: bytes => bytes < 1073741824 ? Math.round(bytes / 1048576) + "MB" : (bytes / 1073741824).toFixed(2) + "GB" }).init("browser-delayed-startup-finished"))("ucf-mem-indicator");
Отсутствует
Dumby - спасибо за подсказки! В моём FF-профиле 90% твоих скриптов!
Чуть поменял код - помоги объединить скрипт яркости со скриптом дополнительных кликов Звёздочки?
(async (id, sel) => { // Клики на Звёздочке, ToolTip: расположение закладки в Избранном, Недавняя папка var g = Cu.getGlobalForObject(Cu), stt = g[id]; // https://forum.mozilla-russia.org/viewtopic.php?pid=790890#p790890 if (!stt) { var {obs, prefs} = Services, {bookmarks: bm, observers: pobs} = PlacesUtils; stt = g[id] = { bm, help_star: ` Правый клик: ⤾ Вернуть вкладку …+ Alt Перевод выдел.текст | Сайт …+ Shift Яндекс-поиск выделенного\n Колесико ± Яркость страницы …+ клик Полная яркость`, pref: `ucf.${id}Guid`, events: ["bookmark-added"], async init() { this.handleEvent = e => this[e.type](e); if ((this.pbm = typeof PlacesBookmarkMoved == "function")) this.events.push("bookmark-moved"); else this.QueryInterface = g.ChromeUtils.generateQI([Ci.nsINavBookmarkObserver]), bm.addObserver(this); pobs.addListener(this.events, this.added = events => { for(var e of events) e.isTagging || this[e.constructor.name](e); }); obs.addObserver(this, "quit-application-granted"); this.args = [b => this.bguids.add(b.parentGuid), {concurrent: true}]; var guid = prefs.getStringPref(this.pref, ""); if (!guid) try {var [guid] = await PlacesUtils.metadata.get( PlacesUIUtils.LAST_USED_FOLDERS_META_KEY, [] )} catch {} this.guids.push(guid || await PlacesUIUtils.defaultParentGuid || bm.unfiledGuid); }, observe() { this.pbm || bm.removeObserver(this); pobs.removeListener(this.events, this.added); obs.removeObserver(this, "quit-application-granted"); prefs.setStringPref(this.pref, this.guids[0]); }, bguids: new g.Set(), guids: new g.Array(), skipTags: true, tt(win) { var list = win.InspectorUtils .getChildrenForNode(win.document.documentElement, true); return list.item(list.length - 1); }, PlacesBookmarkAddition(e) { if (e.itemType == bm.TYPE_BOOKMARK && e.source == bm.SOURCES.DEFAULT) this.guids[0] = e.parentGuid; }, PlacesBookmarkMoved(e) { e.parentGuid != e.oldParentGuid && this.PlacesBookmarkAddition(e); }, onItemMoved(a, b, c, d, e, itemType, f, oldParentGuid, parentGuid, source) { this.PlacesBookmarkMoved({itemType, source, oldParentGuid, parentGuid}); }, fetch(win) { this.bguids.clear(); return bm.fetch({url: win.gBrowser.currentURI.spec}, ...this.args); }, addTab: function(win, url, add, params = {relatedToCurrent: true}) { // открыть адрес [add: в новой вкладке] params.triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal(); return (add) ? win.gBrowser.addTab(url, params) : win.gBrowser.loadURI(url, params); }, translate(browserMM, win, e, go) { // Google-перевод сайта | выделенного текста (go) поиск выдел. текста в Яндекс browserMM.addMessageListener('getSelect', function listener(msg) { var url = (msg.data) ? (go) ? "https://yandex.ru/search/?text="+ msg.data +"&src=suggest_Pers&lang=ru" // поиск текста в Яндекс : "https://translate.google.com/#view=home&op=translate&sl=auto&tl=ru&text="+ msg.data // Гугл перевод : "http://translate.google.com/translate?u="+ gURLBar.value +"&hl=ru&ie=UTF-8&sl=auto&tl=ru"; // Перевод сайта if (go && !msg.data) // Перевод сайти в Яндекс. ничего не выделено + go не пуст gBrowser.selectedTab = e.addTab(win, "https://translate.yandex.com/translate?url=" + gURLBar.value + "&dir=&ui=ru&lang=auto-ru", 1) else gBrowser.selectedTab = e.addTab(win, url, 1); browserMM.removeMessageListener('getSelect', listener, true); }); browserMM.loadFrameScript('data:,sendAsyncMessage("getSelect", content.document.getSelection().toString())', false); }, auxclick(e) { if (e.button == 0) return; var win = e.view; if (e.button == 2) { if (e.altKey) this.translate(gBrowser.selectedBrowser.messageManager, win, this) else if (e.shiftKey) this.translate(gBrowser.selectedBrowser.messageManager, win, this, 1) else win.undoCloseTab(); } else this.addTab(win, "about:newtab"); }, find: obj => obj.name == "tooltiptext" }; var ps = ["onBeginUpdateBatch", "onEndUpdateBatch", "onItemChanged", "onItemVisited"]; var noop = () => {}; for(var p of ps) stt[p] = noop; stt.init(); var func = id => this[id].mouseenter = async function(e) { var win = e.view, star = e.target, result = [], starred = star.hasAttribute("starred"); // star.tooltipText = "\u3164"; // лишнее starred && await this.fetch(win); for(var guid of (starred ? this.bguids : this.guids)) { var arr = [], num = 50; while(--num) { if (!star.matches(":hover")) return; var res = await this.bm.fetch(guid); if (!res) break; if ((guid = res.parentGuid) == this.bm.rootGuid) { arr.unshift(this.bm.getLocalizedTitle(res)); break; } arr.unshift(res.title || "[Безымянная папка]"); } arr.length && result.push(arr.join("\\")); } if (!star.matches(":hover")) return; var text = (await win.document.l10n.formatMessages([{ id: star.getAttribute("data-l10n-id"), args: JSON.parse(star.getAttribute("data-l10n-args")) }]))[0].attributes.find(this.find).value, txt; if (result.length) { txt = result.join("\n"); txt = starred ? `\n\n★ ${result.length > 1 ? "Данные закладки добавлены" : "Данная закладка добавлена"} в:\n${txt}` : "\n\n★ Недавно добавленная папка:\n" + txt; // text += this.help_star +'\n'+ txt; } win.document.tooltipNode == star ? this.tt(win).label = text + this.help_star + txt : star.tooltipText = text + this.help_star + txt; } var url = "data:;charset=utf-8," + encodeURIComponent(`(${func})("${id}")`); g.ChromeUtils.compileScript(url).then(ps => ps.executeInGlobal(g)); } await delayedStartupPromise; var stars = Array.from(document.querySelectorAll(sel)); for(var star of stars) star.addEventListener("auxclick", stt), star.addEventListener("mouseenter", stt); star.setAttribute("context", "event.stopPropagation()"); var destructor = () => { for(var star of stars) star.removeEventListener("auxclick", stt), star.removeEventListener("mouseenter", stt); } var ucf = window.ucf_custom_script_win || window.ucf_custom_script_all_win; if (ucf) ucf[id] = {destructor}, ucf.unloadlisteners.push(id); else window.addEventListener("unload", destructor, {once: true}); })("ucfBookmarksStarFTooltipHelper", "#star-button, #context-bookmarkpage");
(async pref => CustomizableUI.createWidget(({ label: "Изменить уровень яркости страницы", tooltiptext: "Колесико мыши меняет яркость страницы,\nCредний клик: полная яркость", id: "ucf-tabbrowser-tabpanels-opacity-changer", localized: false, get pref() { return Services.prefs.getIntPref(pref, 100); }, onCreated(btn) { var txt = this.tooltiptext; var click = () => Services.prompt.alert(null, this.label, txt); var setPref = (e, val = 100) => { Services.prefs.setIntPref(pref, val); e.target.toggleAttribute("rst"); } var auxclick = e => e.button != 1 || setPref(e); var wheel = e => { var val = this.pref + (e.deltaY < 0 ? 1 : -1); val < 0 || val > 100 || setPref(e, val); } (this.onCreated = btn => { btn.onwheel = wheel; btn._handleClick = click; btn.onauxclick = auxclick; btn.style.setProperty("list-style-image", `url("chrome://user_chrome_files/content/vertical_top_bottom_bar/svg/restart-app-16.svg")`, "important"); })(btn); }, init() { var css = [ "@-moz-document url(chrome://browser/content/browser.xhtml) {", "\t#${this.id}[rst] {filter: grayscale(1%) !important;}", "\t:root:not([chromehidden*=toolbar]) #tabbrowser-tabbox {background-color: black !important;}", `\t:root:not([chromehidden*=toolbar]) #tabbrowser-tabpanels {opacity: ${this.pref / 100} !important;}`, "}" ].join("\n"); var url = `resource://${this.id}/`; Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler) .setSubstitution(this.id, Services.io.newURI("data:text/css," + 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 st = InspectorUtils.getAllStyleSheets(( Services.appShell.hiddenDOMWindow || Services.wm.getEnumerator(null).getNext() ).document).find(s => s.href == url).cssRules[0].cssRules[2].style; var obs = () => st.setProperty("opacity", this.pref / 100, "important"); Services.prefs.addObserver(pref, obs); Services.obs.addObserver(function quit(s, topic) { Services.obs.removeObserver(quit, topic); Services.prefs.removeObserver(pref, obs); }, "quit-application-granted"); return this; } }).init()))("ucf.tabbrowser-tabpanels.opacity");
Отсутствует
помоги объединить
Хорошо, попробую вписать, раз самому сложно
(async (id, sel) => { // Клики на Звёздочке, ToolTip: расположение закладки в Избранном, Недавняя папка var g = Cu.getGlobalForObject(Cu), stt = g[id]; // https://forum.mozilla-russia.org/viewtopic.php?pid=790890#p790890 if (!stt) { var {obs, prefs} = Services, {bookmarks: bm, observers: pobs} = PlacesUtils; stt = g[id] = { bm, help_star: ` Правый клик: ⤾ Вернуть вкладку …+ Alt Перевод выдел.текст | Сайт …+ Shift Яндекс-поиск выделенного\n Колесико ± Яркость страницы …+ клик Полная яркость`, pref: `ucf.${id}Guid`, events: ["bookmark-added"], async init() { this.handleEvent = e => this[e.type](e); if ((this.pbm = typeof PlacesBookmarkMoved == "function")) this.events.push("bookmark-moved"); else this.QueryInterface = g.ChromeUtils.generateQI([Ci.nsINavBookmarkObserver]), bm.addObserver(this); pobs.addListener(this.events, this.added = events => { for(var e of events) e.isTagging || this[e.constructor.name](e); }); obs.addObserver(this, "quit-application-granted"); this.args = [b => this.bguids.add(b.parentGuid), {concurrent: true}]; var guid = prefs.getStringPref(this.pref, ""); if (!guid) try {var [guid] = await PlacesUtils.metadata.get( PlacesUIUtils.LAST_USED_FOLDERS_META_KEY, [] )} catch {} this.guids.push(guid || await PlacesUIUtils.defaultParentGuid || bm.unfiledGuid); var pref = "ucf.tabbrowser-tabpanels.opacity"; var getPref = () => Services.prefs.getIntPref(pref, 100); var css = [ "@-moz-document url(chrome://browser/content/browser.xhtml) {", `\t:is(${sel})[rst] {filter: grayscale(1%) !important;}`, "\t:root:not([chromehidden*=toolbar]) #tabbrowser-tabbox {background-color: black !important;}", `\t:root:not([chromehidden*=toolbar]) #tabbrowser-tabpanels {opacity: ${getPref() / 100} !important;}`, "}" ].join("\n"); var subst = "ucf-tabbrowser-tabpanels-opacity-style", url = `resource://${subst}/`; Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler) .setSubstitution(subst, Services.io.newURI("data:text/css," + 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 st = InspectorUtils.getAllStyleSheets(document) .find(s => s.href == url).cssRules[0].cssRules[2].style; this.setPref = (e, val = 100) => { Services.prefs.setIntPref(pref, val); e.target.toggleAttribute("rst"); } this.wheel = e => { var val = getPref() + (e.deltaY < 0 ? 1 : -1); val < 0 || val > 100 || this.setPref(e, val); } var observer = () => st.setProperty("opacity", getPref() / 100, "important"); Services.prefs.addObserver(pref, observer); this.removePrefObs = () => Services.prefs.removeObserver(pref, observer); }, observe() { this.pbm || bm.removeObserver(this); pobs.removeListener(this.events, this.added); obs.removeObserver(this, "quit-application-granted"); prefs.setStringPref(this.pref, this.guids[0]); this.removePrefObs(); }, bguids: new g.Set(), guids: new g.Array(), skipTags: true, tt(win) { var list = win.InspectorUtils .getChildrenForNode(win.document.documentElement, true); return list.item(list.length - 1); }, PlacesBookmarkAddition(e) { if (e.itemType == bm.TYPE_BOOKMARK && e.source == bm.SOURCES.DEFAULT) this.guids[0] = e.parentGuid; }, PlacesBookmarkMoved(e) { e.parentGuid != e.oldParentGuid && this.PlacesBookmarkAddition(e); }, onItemMoved(a, b, c, d, e, itemType, f, oldParentGuid, parentGuid, source) { this.PlacesBookmarkMoved({itemType, source, oldParentGuid, parentGuid}); }, fetch(win) { this.bguids.clear(); return bm.fetch({url: win.gBrowser.currentURI.spec}, ...this.args); }, addTab: function(win, url, add, params = {relatedToCurrent: true}) { // открыть адрес [add: в новой вкладке] params.triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal(); return (add) ? win.gBrowser.addTab(url, params) : win.gBrowser.loadURI(url, params); }, translate(browserMM, win, e, go) { // Google-перевод сайта | выделенного текста (go) поиск выдел. текста в Яндекс browserMM.addMessageListener('getSelect', function listener(msg) { var url = (msg.data) ? (go) ? "https://yandex.ru/search/?text="+ msg.data +"&src=suggest_Pers&lang=ru" // поиск текста в Яндекс : "https://translate.google.com/#view=home&op=translate&sl=auto&tl=ru&text="+ msg.data // Гугл перевод : "http://translate.google.com/translate?u="+ gURLBar.value +"&hl=ru&ie=UTF-8&sl=auto&tl=ru"; // Перевод сайта if (go && !msg.data) // Перевод сайти в Яндекс. ничего не выделено + go не пуст gBrowser.selectedTab = e.addTab(win, "https://translate.yandex.com/translate?url=" + gURLBar.value + "&dir=&ui=ru&lang=auto-ru", 1) else gBrowser.selectedTab = e.addTab(win, url, 1); browserMM.removeMessageListener('getSelect', listener, true); }); browserMM.loadFrameScript('data:,sendAsyncMessage("getSelect", content.document.getSelection().toString())', false); }, auxclick(e) { if (e.button == 2) { var win = e.view; if (e.altKey) this.translate(gBrowser.selectedBrowser.messageManager, win, this); else if (e.shiftKey) this.translate(gBrowser.selectedBrowser.messageManager, win, this, 1); else win.undoCloseTab(); } else //this.addTab(win, "about:newtab"); this.setPref(e); }, find: obj => obj.name == "tooltiptext" }; var ps = ["onBeginUpdateBatch", "onEndUpdateBatch", "onItemChanged", "onItemVisited"]; var noop = () => {}; for(var p of ps) stt[p] = noop; stt.init(); var func = id => this[id].mouseenter = async function(e) { var win = e.view, star = e.target, result = [], starred = star.hasAttribute("starred"); // star.tooltipText = "\u3164"; // лишнее starred && await this.fetch(win); for(var guid of (starred ? this.bguids : this.guids)) { var arr = [], num = 50; while(--num) { if (!star.matches(":hover")) return; var res = await this.bm.fetch(guid); if (!res) break; if ((guid = res.parentGuid) == this.bm.rootGuid) { arr.unshift(this.bm.getLocalizedTitle(res)); break; } arr.unshift(res.title || "[Безымянная папка]"); } arr.length && result.push(arr.join("\\")); } if (!star.matches(":hover")) return; var text = (await win.document.l10n.formatMessages([{ id: star.getAttribute("data-l10n-id"), args: JSON.parse(star.getAttribute("data-l10n-args")) }]))[0].attributes.find(this.find).value, txt; if (result.length) { txt = result.join("\n"); txt = starred ? `\n\n★ ${result.length > 1 ? "Данные закладки добавлены" : "Данная закладка добавлена"} в:\n${txt}` : "\n\n★ Недавно добавленная папка:\n" + txt; // text += this.help_star +'\n'+ txt; } win.document.tooltipNode == star ? this.tt(win).label = text + this.help_star + txt : star.tooltipText = text + this.help_star + txt; } var url = "data:;charset=utf-8," + encodeURIComponent(`(${func})("${id}")`); g.ChromeUtils.compileScript(url).then(ps => ps.executeInGlobal(g)); } await delayedStartupPromise; var types = ["auxclick", "mouseenter", "wheel"]; var stars = Array.from(document.querySelectorAll(sel)); for(var star of stars) for(var type of types) star.addEventListener(type, stt); star.setAttribute("context", "event.stopPropagation()"); var destructor = () => { for(var star of stars) for(var type of types) star.removeEventListener(type, stt); } var ucf = window.ucf_custom_script_win || window.ucf_custom_script_all_win; if (ucf) ucf[id] = {destructor}, ucf.unloadlisteners.push(id); else window.addEventListener("unload", destructor, {once: true}); })("ucfBookmarksStarFTooltipHelper", "#star-button, #context-bookmarkpage");
нет цветового переключения на самой кнопке
Даже не знаю, сейчас лисьи кнопки оформлены иначе, чем в те годы.
Может так сойдёт
(sss => { var on = "#131d24"; var off = "#ffeeaa"; var pref = `CB.${_id.slice(20)}.setStyleForPage`; var url = "data:text/css," + encodeURIComponent(this.Help); var args = [Services.io.newURI(url), sss.AGENT_SHEET]; var reg = add => { var has = sss.sheetRegistered(...args); if (add) has || sss.loadAndRegisterSheet(...args); else has && sss.unregisterSheet(...args); } var bgs = [off, on].map(c => `linear-gradient(${c}, ${c})`); var st = this.icon.style; st.cssText = ` background-repeat: no-repeat !important; background-origin: content-box !important; `; var setState = () => { var state = Services.prefs.getBoolPref(pref, false); st.setProperty("background-image", bgs[+state], "important"); reg(state); } setState(); this._handleClick = () => Services.prefs.setBoolPref( pref, !Services.prefs.getBoolPref(pref, false) ); Services.prefs.addObserver(pref, setState, false); addDestructor(reason => { Services.prefs.removeObserver(pref, setState); reason[5] == "e" && reg(); }); })( Cc["@mozilla.org/content/style-sheet-service;1"] .getService(Ci.nsIStyleSheetService) ); // Подсказка для кнопки .......... this.tooltipText = self.label + "\nЛ: Переключить черный фон страниц";
Отсутствует
для UCF-скриптов есть отдельная тема!
https://forum.mozilla-russia.org/viewtopic.php?id=76642
Через сомнения приходим к истине. Цицерон
Отсутствует
Dumby
Что-то java script не работает, выключить, в смысле.
/*CODE*/ // ВКЛ / ВЫКЛ js на странице + разрешить выделение // Результат появляется сразу без перезагрузки. const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); var uri = makeURI("data:text/css," + encodeURIComponent( "*{ -moz-user-select: text !important;}" )); // Для текущей вкладки: gBrowser.selectedBrowser.messageManager.loadFrameScript( "data:,docShell.allowJavascript=!docShell.allowJavascript", false ); alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService); alertsService.showAlertNotification("chrome://global/skin/icons/cpd_OK.png", "Javascript", "ОТКЛ" ); setTimeout(()=> alertsService.closeAlert(), 2000);
Отсутствует