popup появляется , но пункт "удалить с панели..." не работает. При ctrl + ПКМ - работает ....Это как код поменяли
Да, действительно, вижу.
Это всё этот мерзкий баг, сколько же всего повылезало.
Вот, ещё больше сумбура, но, надеюсь, будет работать.
Custom Buttons 0.0.7.0.0.21
paxmod и bootstrap в zip-папке.
Отсутствует
Dumby
бЛАГОДАРЮ, тут другое BrowserUtils.jsm такого понавертели , что кн. "увел. изображение " лопнула... Команда handleCommand(); не работает. Заманался рихтовать сам BrowserUtils.jsm ....Что делать? Снят вопрос , люди скрипт подсказали , но можно и кнопкой
/*Initialization Code*/ addEventListener("popupshowing", { imgZoom: 190, // на сколько увеличить изображение из меню scrollZoom: 20, // на сколько увеличивать/уменьшать колесиком мыши scrollTop: 1, // или -1, переключение направление прокрутки для увеличение колёсиком receiveMessage(msg) { var container = document.documentElement .appendChild(document.createElement("div")); addDestructor(() => container.remove()); var image = container.appendChild(document.createXULElement("image")); image.style.cssText = "width: 100% !important; height: 100% !important;"; image.setAttribute("validate", "never"); var st = container.style; var dz = this.scrollZoom/100 * this.scrollTop; var currScale = 1, x, y, initialZoom = this.imgZoom/100 - 1; var hide, props = ["width", "height", "left", "top"], p = n => n + "px"; var set = (...args) => props.forEach((prop, ind) => st[prop] = p(args[ind])); (hide = () => { st.cssText = "position: fixed; display: none; z-index: 2147483647;"; currScale = 1; image.src = null; })(); container.onwheel = (e, ds = e.deltaY > 0 ? -dz : dz) => { if (currScale < .15 && ds < 0) return; st.transform = `scale(${currScale += ds})`; var {width, height, left, top, bottom, right} = container.getBoundingClientRect(); if (height < innerHeight) { if (top < 0) st.top = p(y -= top); if (bottom > innerHeight) st.top = p(y -= bottom - innerHeight); } if (width < innerWidth) { if (left < 0) st.left = p(x -= left); if (right > innerWidth) st.left = p(x -= right - innerWidth); } } (this.receiveMessage = msg => { var {src, width, height, left, top} = msg.data; image.src = src; left -= mozInnerScreenX; top -= mozInnerScreenY; set(width, height, x = left, y = top); st.display = "block"; container.onwheel(null, initialZoom); window.addEventListener("mousedown", hide, {once: true, capture: true}); })(msg); }, handleEvent(e) { if (!gContextMenu.onImage) return; var menuitem = document.createXULElement("menuitem"); menuitem.setAttribute("label", "Увеличить размер"); menuitem.className = "menuitem-iconic"; menuitem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADZElEQVR42oXSe0xbVRwH8N8597a35e7SAmUFukGhY66AMiNzw4GvTCQLCssc4pQsmTOa+ERMlrktW1zigpnEuWn8x2eMmiVGMBDCFjS+cJHEDIk8RoSNV1+3tLWX3t72nnO8sETJFrfvP7/k5Pw+Ob9fDoLrYi8ow9GFUbq+5aRLrGraqQcX6hlF2wkFEWn6EDIJAyQy9+3VT58cWb6PrmvmjGZS/FSHlxbXtbtLobGqJlPKMhNepWb0V8hKpi8FNd/gzCCogbdmvtg/8C9gz9+Eor5x5nn2tDOZ98Dx2i3C/uYai9mOGCxiDQIIg1/PgUCEhyvDMox9PXYBkPzaaoAzAFL0yle7ShtqO/eWJ9w1vJ1oGsVzYhTNATMQG4Q1G40ldDw6PB339fs7VgMmA0jnHfioo6F9Z3tDYYJzKSZKMYcDvAILiICfZUNYEYFixMKpKBk8MfTTasBsACnngU/6Wg4+VL/VFSOmBHAYY1BAhzAvgmyMEIkh0EUOBD1Eu49eStwA5D3z4TcPv9TYdHvxEhXSGgaEIMkJkKAS+ONmSKYolOVqMBlRSd8bv8v/AQXlJoiHUE5rZ1tFa/Nhj1uVrCaNMoQxYSaIqDxAGqAuQ2XZ1iS8HUTpkZMXe1eATOdtiCcJblGe1a3PnWp0uEvfv3tbeX5RhSet/q3wxh6xgAncZUmw2hxEryQx9/LHE7I2RV5HNudGFAtcZsuQd919u/kiz56JOwobcjd6xerqKnB4HIB4RvMzCM1DGj8X0GD64pL2Xdf850z+4djKC8wl24XUpj1P75sdfe/+sSHoq3uQnSuwa+s2Vy5uubd2jQWUTAYchJK8HpyIzvv7p/rMkV/OzPeeGEWi+x6LufiR573h8VO7Zr4n9fEZNeiqXHOofFvPsKPkS1fKsX5JU6uNZQh8Wh/hRcuvOC3/fLXrcGj52yOo7zzU9udvbzbN9uglggK2MhsnvfiE0tY9tfed7vM98D+x53tx1DdG0Z2b97Ejf3SRSiGGCysyENvdoipZa4+/8NmPp8+N+Ei2ZEVpQhG71rdcqFFozD+xcoQugFUvlDS8wWsl8Uebk5C79ujjHwyc6R/309ysDBRauEzhJkG9ErAdG0xEe6yVkwqcr+549/zZgcmQ7pAEkH2TDG6RfwCoJI0uEWJP5QAAAABJRU5ErkJggg=="); menuitem.setAttribute("oncommand", "handleCommand();"); e.target.append(menuitem); addDestructor(() => menuitem.remove()); menuitem.handleCommand = () => this.cmd(); this.handleEvent = () => menuitem.hidden = !gContextMenu.onImage; }, cmd() { var msg = this.msg = "UCF:GetImageScreenRectForMosuseZoom"; var code = `(targetIdentifier => { var image = ChromeUtils.import("resource://gre/modules/ContentDOMReference.jsm") .ContentDOMReference.resolve(targetIdentifier); var mm = image.ownerGlobal.docShell.messageManager; var rect = image.getBoundingClientRect(); var win = image.ownerGlobal; var x = rect.left, y = rect.top; var parentFrame = win.frameElement; while (parentFrame) { win = parentFrame.ownerGlobal; let cstyle = win.getComputedStyle(parentFrame); let framerect = parentFrame.getBoundingClientRect(); x += framerect.left + parseFloat(cstyle.borderLeftWidth) + parseFloat(cstyle.paddingLeft); y += framerect.top + parseFloat(cstyle.borderTopWidth) + parseFloat(cstyle.paddingTop); parentFrame = win.frameElement; } x += win.mozInnerScreenX; y += win.mozInnerScreenY; var fullZoom = win.windowUtils.fullZoom; mm.sendAsyncMessage("${msg}", { src: image.currentSrc, left: x * fullZoom, top: y * fullZoom, width: rect.width * fullZoom, height: rect.height * fullZoom, } ); })(`; messageManager.addMessageListener(msg, this); (this.cmd = () => { var {osPid} = gContextMenu.actor.manager.browsingContext.currentWindowGlobal; if (osPid == -1) osPid = Services.appinfo.processID; for(var ind = 0, len = Services.ppmm.childCount; ind < len; ind++) { var pmm = Services.ppmm.getChildAt(ind); if (pmm.osPid == osPid) break; } pmm.loadProcessScript("data:;charset=utf-8," + encodeURIComponent( code + JSON.stringify(gContextMenu.targetIdentifier) + ")" ), false); })(); } }, false, document.getElementById("contentAreaContextMenu") || 1);
Отредактировано ВВП (16-10-2021 10:22:27)
Отсутствует
Приветствую всех! Как прочитать CSS (текстовый файл) в переменную? Данный код не работает:
var reader = new FileReader(); reader.readAsText('chrome://user_chrome_files/content/custom_scripts/ucf_Reader.css'); var green = reader.result;
Второй вопрос: перестал работать CSS, переключающий стиль на любой странице на более подходящий для чтения. Остаётся только зелёный фон, а должен меняться и фон и текст.
/*AGENT_SHEET*/ @-moz-document url-prefix("http"), url-prefix("https"), url-prefix("ftp"), url-prefix("file") { html *, html { background: #ccd1d1 !important; text-shadow: none !important; color: #000000 !important; -moz-border-top-colors: #8FBC8F !important; -moz-border-bottom-colors: #8FBC8F!important; -moz-border-left-colors: #8FBC8F !important; -moz-border-right-colors: #8FBC8F !important; } code, pre, input, samp, kbd, var, dfn,.postright { -moz-appearance: none !important; background-color: #BADBAD !important; } input, select, textarea, button { -moz-appearance: none !important; border: 1px solid #BADBAD !important; background-color: #BADBAD !important; } .codebox, BLOCKQUOTE, TEXTAREA, .spoiler { -moz-border-top-colors: #444 !important; -moz-border-bottom-colors: #444 !important; -moz-border-left-colors: #444 !important; -moz-border-right-colors: #444 !important; } }
try { CustomizableUI.createWidget({ tooltiptext: `ЛКМ: Reader`, type: "custom", id: "ucf_Reader", label: "Reader", localized: false, onBuild(doc) { var trbn = doc.createXULElement("toolbarbutton"); trbn.id = this.id; trbn.tooltipText = this.tooltiptext; trbn.label = this.label; trbn.className = "toolbarbutton-1 chromeclass-toolbar-additional"; trbn.setAttribute("context", false); trbn.style.setProperty("list-style-image", 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACS0lEQVR4Xt1VIZCkMBBcGYlERiKRSCQSuTISiUQiVyJXIle8QCKRSOTJkyterDtU8t1cpipVl937f3mpmkuupnt6MjNhTz9v1XWdYi1Jkjit9YilXuGBGYDfySH3WwEAR2xODCLdi+BtiCX32+yVUg8cd5BvJPH/WGZVVRF790lM5ITYqGVZZkhAeVbnnOIOkivLMosIZPARu2ERu5DrY8QXQFNYFgTWsOoZviiKSsSlXBCan5VH84qwXUj/YuSAK2XSsYZJeZb/nUByfQWamHOmM8/z3hiTNU2T/q1A27YpOeTGysSGHeWRqZGrYuwm+J6Wiz5OkHDCGIwZn2eaUnJmNnfUN4/UPIfvPcahMeaX2qVa2/Y62mHdbD/NNitKK2OLF52gBAWNZ6yVPmKIJYdcxgh66buPRwKCI2janZ0eznEf3x9W57n1r3TjHp7pIybkUAjixH1Oo0xPZZoD+Ov37sRIaIbrIRAz+oi53T/x3MlBLEnKnND9leCW4IcIfBzGrIZlFYEd5TE0nmH0kQNsIIAYrU8Kk7id8Gf9zGZANqHAAXaXeQlrGvaMvi8C4a0ZmyU6E1zWZ1/LAyhgZy6D1H0QAX+m78AInlwKlOfzIcDYbLJ8Ilx/m+wcNOy6vXEqnH+ApQj4s6OPGGkyuYzBWPJl9RnpngSF7tdtZzuAzOUSjtwU+d2YvAixB4dcxvDZ9+FTVyDcggmxwUNbi6JIBRvcIqUvxoH42HWdiv0eNFB+4xWx32E9xJMX36CEGGI5++BvjHH6UesPIe4VKP0pWeUAAAAASUVORK5CYII=")', "important"); trbn.addEventListener("click", function(e) { var win = e.view; if (e.button == 0) { var green = ` @-moz-document url-prefix("http"), url-prefix("https"), url-prefix("ftp"), url-prefix("file") { html *, html { background: #ccd1d1 !important; text-shadow: none !important; color: #000000 !important; -moz-border-top-colors: #8FBC8F !important; -moz-border-bottom-colors: #8FBC8F!important; -moz-border-left-colors: #8FBC8F !important; -moz-border-right-colors: #8FBC8F !important; } code, pre, input, samp, kbd, var, dfn,.postright { -moz-appearance: none !important; background-color: #BADBAD !important; } input, select, textarea, button { -moz-appearance: none !important; border: 1px solid #BADBAD !important; background-color: #BADBAD !important; } .codebox, BLOCKQUOTE, TEXTAREA, .spoiler { -moz-border-top-colors: #444 !important; -moz-border-bottom-colors: #444 !important; -moz-border-left-colors: #444 !important; -moz-border-right-colors: #444 !important; } a:link { color: #300090 !important; } a:visited { color: #489412 !important; } a:active { color: #d81e1e !important; } a:hover { color: #d81e1e !important; } }`; var sss = this.sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); var uri = this.uri = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService).newURI("data:text/css,"+ encodeURIComponent(green),null,null); function setStyleForPages( reason ) { var style = sss.sheetRegistered(uri, sss.AGENT_SHEET); style ? sss.unregisterSheet(uri, sss.AGENT_SHEET) : sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET); }; setStyleForPages(); return; } }, false); return trbn; }, }); } catch(e) {}
На форуме
Приветствую всех! Есть папка по пути C:\ФАЙЛЫ нужно вывести true или false в зависимости от того есть ли файл(ы) в папке. Папки не в счёт. Заранее благодарю!
Отредактировано Senflex (16-10-2021 12:21:41)
Отсутствует
Как прочитать CSS (текстовый файл) в переменную? Данный код не работает
Интересно, зачем бы это могло понадобиться.
FileReader здесь совсем неудобен. Мало того, что ему
в качестве аргумента нужен Blob или File, так он ещё и читает асинхронно.
Можно так:
var green = Cu.readUTF8URI(Services.io.newURI("chrome://user_chrome_files/content/custom_scripts/ucf_Reader.css"));
Есть папка по пути C:\ФАЙЛЫ нужно вывести true или false в зависимости от того есть ли файл в папке.
var result = false, en = FileUtils.File("C:\\ФАЙЛЫ").directoryEntries; while(en.hasMoreElements()) if ((result = en.getNext().QueryInterface(Ci.nsIFile).isFile())) break; alert(result);
Отсутствует
Dumby
Как сюда Ваш код прилепить? this.onclick = e => e.button != 1 || gShowPopup(this); ....Тут reload идет на СКМ ...Чет знает зачем.
/*Initialization Code*/ var src = "gBrowser.addTab = " + gBrowser.addTab.toString() .replace(/^(?!function )/, "function "); this.oncontextmenu =e=> { e.button && !e.ctrlKey && e.preventDefault() }; this.tooltipText = "Л: См. ПАРОЛИ\nП: См. КУКИ"; (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 .QueryInterface(Ci.nsIPlaintextEditor).insertText(domain); } });
Отсутствует
.
Отредактировано ALEX_45_ORP (16-10-2021 14:46:30)
Win 10х64
Отсутствует
Тут reload идет на СКМ ...Чет знает зачем
Что ещё за зачемки, эту просили перерисовать, вот и идёт.
прилепить
Ну, например, если много не менять, то удалить это:
if (e.button) for(var br of gBrowser.browsers) try {
this.domain(br) == domain && br.reload();
} catch(ex) {}
И после true(e) { добавить
if (e.button) return gShowPopup(self);
Отсутствует
Dumby
И после true(e) { добавить
if (e.button) return gShowPopup(self);
Вроде так и делал , так да не так...Благодарю. Кстати, как культурно избавиться от trash в папке extensions ? Рихтанул XPIProvider.jsm . Избавился от features в профиле, но эта шняга(trash) иногда вылазит. А в ней опять мутные аддоны...
Отредактировано ВВП (16-10-2021 18:19:50)
Отсутствует
Интересно, зачем бы это могло понадобиться. «Как прочитать CSS (текстовый файл) в переменную?»
Чтобы кнопка переключения стиля страницы подгружала внешний CSS, который можно было бы изменять.
Если содержание CSS встроено в скрипт, то при каждом изменении скрипта нужно пересоздавать кэш быстрого запуска.
На форуме
Избавился от features в профиле, но эта шняга(trash) иногда вылазит. А в ней опять мутные аддоны...
Не знаю, у меня нет в профиле features. А от «мутных аддонов»,
возможно, избавит DisableSystemAddonUpdate в policies.json
Чтобы кнопка переключения стиля страницы подгружала внешний CSS, который можно было бы изменять.
Я не вижу здесь со стороны браузера какого-то отказа читать CSS самому.
(async () => CustomizableUI.createWidget({ label: "Reader", tooltiptext: "ЛКМ: Reader", id: "ucf_Reader", localized: false, onCreated(btn) { var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); var args = [Services.io.newURI("chrome://user_chrome_files/content/custom_scripts/ucf_Reader.css"), sss.AGENT_SHEET]; var reg = () => (this.flag = !this.flag) ? sss.loadAndRegisterSheet(...args) : sss.unregisterSheet(...args); (this.onCreated = btn => { btn._handleClick = reg; btn.style.setProperty("list-style-image", 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACS0lEQVR4Xt1VIZCkMBBcGYlERiKRSCQSuTISiUQiVyJXIle8QCKRSOTJkyterDtU8t1cpipVl937f3mpmkuupnt6MjNhTz9v1XWdYi1Jkjit9YilXuGBGYDfySH3WwEAR2xODCLdi+BtiCX32+yVUg8cd5BvJPH/WGZVVRF790lM5ITYqGVZZkhAeVbnnOIOkivLMosIZPARu2ERu5DrY8QXQFNYFgTWsOoZviiKSsSlXBCan5VH84qwXUj/YuSAK2XSsYZJeZb/nUByfQWamHOmM8/z3hiTNU2T/q1A27YpOeTGysSGHeWRqZGrYuwm+J6Wiz5OkHDCGIwZn2eaUnJmNnfUN4/UPIfvPcahMeaX2qVa2/Y62mHdbD/NNitKK2OLF52gBAWNZ6yVPmKIJYdcxgh66buPRwKCI2janZ0eznEf3x9W57n1r3TjHp7pIybkUAjixH1Oo0xPZZoD+Ov37sRIaIbrIRAz+oi53T/x3MlBLEnKnND9leCW4IcIfBzGrIZlFYEd5TE0nmH0kQNsIIAYrU8Kk7id8Gf9zGZANqHAAXaXeQlrGvaMvi8C4a0ZmyU6E1zWZ1/LAyhgZy6D1H0QAX+m78AInlwKlOfzIcDYbLJ8Ilx/m+wcNOy6vXEqnH+ApQj4s6OPGGkyuYzBWPJl9RnpngSF7tdtZzuAzOUSjtwU+d2YvAixB4dcxvDZ9+FTVyDcggmxwUNbi6JIBRvcIqUvxoH42HWdiv0eNFB+4xWx32E9xJMX36CEGGI5++BvjHH6UesPIe4VKP0pWeUAAAAASUVORK5CYII=")', "important"); })(btn); } }))();
Отсутствует
Отсутствует
Dumby,
Пожалуйста, если будет время и настроение, адаптируйте кнопку для Firefox 93.
const prefName = "Изменить уровень яркости экрана"; function getDarkLevel() { try { return cbu.ps.getIntPref(prefName); } catch (ex) { return 0; } } function getOpacity(aDarkLevel) { var opacity = 0; if (aDarkLevel === 50) opacity = aDarkLevel / 100; else opacity = (100 - aDarkLevel) / 100; return opacity; } function mouseWheel(aEvent) { var darkLevel = getDarkLevel(); if (aEvent.detail > 0) { if (darkLevel < 100) darkLevel++; else aEvent.stopPropagation(); } else { if (darkLevel > 0) darkLevel--; else aEvent.stopPropagation(); // else stop (min = 0) } gBrowser.style.opacity = getOpacity(darkLevel); cbu.ps.setIntPref(prefName, darkLevel); } this.onclick = function onclick(aEvent) { if (aEvent.button !== 1) return; gBrowser.style.opacity = "1"; cbu.ps.setIntPref(prefName, 0); } this.addEventListener("DOMMouseScroll", mouseWheel); var browser = document.getElementById("browser"); browser.style.backgroundColor = "black"; gBrowser.style.opacity = getOpacity(getDarkLevel()); this.tooltipText = this.name + "\n" + this.Help;
Отсутствует
Dumby
Забыл как...Снова кнопку закачку поставил с YT.dl.exe ...Но закачка идет в каталог браузера, а надо там где сам D:\\Загрузки\\видео\\youtube-dl.exe
(func => { var sysPlayerName = "YTPlayer"; var path = "D:\\Загрузки\\видео\\youtube-dl.exe"; var videoMoved = "Видео перенесено в " + sysPlayerName; var noFound = "Не найдено видео на странице, доступное для переноса в " + sysPlayerName; this.image = "moz-icon://file://" + path; this.label = "Открыть видео в " + sysPlayerName; this.tooltipText = "Л: Видео в плеер\nП: Видео из Clipboard"; this._handleClick = () => { var msgName = _id + ":Player"; var listener = ({data}) => data ? run([data]) : notify(); var listener = ({data}) => data ? run([data], true) : notify(); messageManager.addMessageListener(msgName, listener); addDestructor(() => messageManager.removeMessageListener(msgName, listener)); var url = "data:charset=utf-8," + encodeURIComponent( `(${func})()`.replace("MSG_NAME", msgName) .replace("VIDEO_MOVED", encodeURIComponent(videoMoved)) .replace("CONFIRM", encodeURIComponent("Открыть ссылку в плеере ?")) ); (this._handleClick = () => gBrowser.selectedBrowser.messageManager.loadFrameScript(url, false))(); } this.onclick = e => e.button != 1 || gShowPopup(this); this.oncontextmenu = e => { if (e.ctrlKey || e.shiftKey || e.altKey) return; e.preventDefault(); custombuttons.confirmBox(null, "Запустить плеер из буфера обмена ?", "Да", "Нет") && run([gClipboard.read(),]); } var popup = document.getElementById("contentAreaContextMenu"); addEventListener("popupshowing", { get hidden() { return !(gContextMenu.onLink || gContextMenu.onVideo || gContextMenu.onPlainTextLink); }, handleEvent() { if (this.hidden) return; var menuitem = document.createXULElement("menuitem"); for(var args of Object.entries({ image: self.image, oncommand: "play()", class: "menuitem-iconic", label: "Открыть в " + sysPlayerName })) menuitem.setAttribute(...args); menuitem.play = () => play(gContextMenu.linkURL || gContextMenu.mediaURL); document.getElementById("context-savelink").before(menuitem); addDestructor(() => menuitem.remove()); this.handleEvent = e => { if (e.target == popup) menuitem.hidden = this.hidden; } } }, false, popup || 1); var play = link => custombuttons.confirmBox(null, "Открыть ссылку в плеере ?", "Да", "Отмена") && run([link]); /* var run = args => { var file = FileUtils.File(path); (run = args => { if (!file.exists()) return custombuttons.alertBox("File not exists!", path); var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); process.init(file); process.runwAsync(args, args.length); })(args); } */ var run = (...a) => { var file = FileUtils.File(path); (run = (args, quit) => { if (!file.exists()) return custombuttons.alertBox("File not exists!", path); var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); process.init(file); process.runwAsync(args, args.length); })(...a); } var notify = () => { var name = _id + "-noFound"; var as = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService); (notify = () => setTimeout(as.closeAlert, 1150, name, as.showAlertNotification( "chrome://global/skin/icons/question-48.png", "", noFound, false, "", null, name )))(); } })(() => { var found, videoMoved, SEND = msg => { found = true; if (!msg || Cc["@mozilla.org/embedcomp/prompt-service;1"] .getService(Ci.nsIPromptService) .confirm(content, null, decodeURIComponent("CONFIRM")) ) { if (msg) videoMoved = decodeURIComponent("VIDEO_MOVED"); sendAsyncMessage("MSG_NAME", msg); } else return true; } var YoutubeID = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})(?:\W|$)/; var tmp = '', tmpp = '', innerA = '<div style="display:block!important;color:#00ff00!important;width:250px!important;font:bold 16px serif!important;z-index:999!important;opacity:1!important;visibility: visible!important;', innerB = 'left:5px!important;position:absolute!important;height:auto!important;box-sizing:border-box!important;padding:5px!important;margin:5px!important;', //stopPl = "javascript:(function(){v=document.getElementById('movie_player');if(v){v.stopVideo()}else{v=document.getElementsByTagName('video');if(v){v[0].src='';try{v[0].load()}catch(e){}};}})();", ytIMGouter = function (ytID) { return '<div width="100%"><br /><a target="_blank" href="https://www.youtube.com/watch?v=' + ytID + '"><img src="https://i.ytimg.com/vi/' + ytID + '/hqdefault.jpg"></a><br />' + innerA + 'background-color:black!important;position:relative!important;bottom:20px!important;"> ' + videoMoved + '</div><br /></div><br />' }, handlWin = function (currentWin) { tmp = ''; var elem = currentWin.document.getElementsByTagName('video'), currLoc = currentWin.location; if (elem.length > 0) { if (currLoc.hostname.indexOf('youtu') != -1 && (tmp = currLoc.toString().match(YoutubeID)) && tmp[1].length == 11) { if (SEND('https://www.youtube.com/watch?v=' + tmp[1])) return; videoMovedbox = currentWin.document.createElement('videoMoved'); videoMovedbox.innerHTML = innerA + innerB + 'top:-15px!important;"><b>' + videoMoved + '</b></div>'; //loadURI(stopPl); (function(d){var v=d.getElementById('movie_player');if(v){try{v.stopVideo()}catch{}} else{v=d.getElementsByTagName('video');if(v[0]){v[0].src='';try{v[0].load()}catch{}};}})(currentWin.document); currentWin.document.getElementById('eow-title').appendChild(videoMovedbox); return true; }; for (i = 0; i < elem.length; i++) { if (((tmp = getSrc(elem[i].parentNode, currLoc)) && tmp.length > 2) || (i == 0 && currentWin.document.body.innerHTML.substring(0, 7) == '<video ' && (tmp = currLoc.toString()))) { if (SEND(tmp)) return; videoMovedbox = currentWin.document.createElement('videoMoved'); videoMovedbox.innerHTML = innerA + innerB + 'top:20px!important;background-color:black!important;">' + videoMoved + '</div>'; if (currLoc.hostname == 'www.youtube.com') { elem[i].parentNode.parentNode.appendChild(videoMovedbox); } else { elem[i].parentNode.appendChild(videoMovedbox); }; elem[i].src = ''; try { elem[i].load() } catch (e) {}; return true; } } }; currentWin._elems = currentWin.document.getElementsByTagName('iframe'); if (currentWin._elems.length > 0) { for (currentWin._iCounter = 0; currentWin._iCounter < currentWin._elems.length; currentWin._iCounter++) { if ((currentWin._elems[currentWin._iCounter].src.indexOf('youtube.com') > -1) && (tmp = currentWin._elems[currentWin._iCounter].src.match(YoutubeID)) && (tmp[1].length == 11)) { if (SEND('https://www.youtube.com/watch?v=' + tmp[1])) return; currentWin._elems[currentWin._iCounter].outerHTML = ytIMGouter(tmp[1]); return true; }; if (currentWin._elems[currentWin._iCounter].clientWidth > 80 && currentWin._elems[currentWin._iCounter].clientHeight > 40 && handlWin(currentWin._elems[currentWin._iCounter].contentWindow)) return true; } }; elem = currentWin.document.getElementsByTagName('object'); currLoc = currentWin.location; if (elem.length == 0) { elem = currentWin.document.getElementsByTagName('embed') }; if (elem.length > 0) { for (i = 0; i < elem.length; i++) { if (elem[i].innerHTML.indexOf('youtu') != -1 && (tmp = elem[i].innerHTML.match(YoutubeID)) && tmp[1].length == 11) { if (SEND('https://www.youtube.com/watch?v=' + tmp[1])) return; elem[i].outerHTML = ytIMGouter(tmp[1]); return true; } else { if (elem[i].clientWidth > 80 && elem[i].clientHeight > 40) { if (((tmp = getSrc(elem[i].parentNode, currLoc)) || (tmp = getLink(elem[i], currLoc))) && tmp.length > 2) { if (SEND(tmp)) return; elem[i].outerHTML = innerA + 'background-color:black!important;bottom:20px!important;"> ' + videoMoved + '</div>'; return true; }; }; } }; }; return false; }; function restProtHost(lnkR, curLoc) { if (lnkR.length == 0) return ''; let tr = lnkR.replace(/^:\/\//, curLoc.protocol + "//"); if (!tr.match(/^https?:\/\//i)) { lnkR = tr.replace(/^\/+/, ''); if (lnkR.split('/')[0].split('?')[0].split('#')[0].toLowerCase().match(/^(?:[-a-z\d]+\.)+[a-z\d]{2,6}$/)) { tr = curLoc.protocol + '//' + lnkR; } else { tr = curLoc.protocol + '//' + curLoc.host + "/" + lnkR; } }; return tr; }; function getSrc(vobj, currentLoc) { var t = '', tt = ''; if ((((t = vobj.innerHTML.match(/<video.*?\ssrc=(?:(?:'([^']*)')|(?:"([^"]*)")|([^\s]*))/i)) && (t) && (tt = t[1] || t[2] || t[3]) && tt.indexOf('blob:') == -1) || ((t = vobj.innerHTML.match(/<source.*?\ssrc=(?:(?:'([^']*)')|(?:"([^"]*)")|([^\s]*)).*?\stype=['"]?video\//i)) && (t) && (tt = t[1] || t[2] || t[3]))) && tt.length > 2 && tt.indexOf('blob:') == -1) { if (tt.indexOf(".mp4/?") == -1) { tt = tt.replace(/&/g, "&") }; t = restProtHost(tt, currentLoc); return t; }; return ''; }; function getLink(obj, curLocation) { if (!obj || !obj.tagName) return ''; q = obj.tagName.toLowerCase(); var getParam = function (e, n) { var v = '', r = new RegExp('^(' + n + ')$', 'i'), param = e.getElementsByTagName('param'); for (var igp = 0, p; p = param[igp]; igp++) { if (p.hasAttribute('name') && p.getAttribute('name').match(r)) { v = p.getAttribute('value'); break }; }; return v; }; var restPath = function (f, s) { return (f.substring(0, 4) == 'http') ? f : s.replace(/[#?].*$/, '').replace(/[^\/]*$/, f) }; function videoLinkExtract(fl) { alert(fl); var linkArr = [], outLinks = [], jj = 0, lba = '', lbb = '', decodeURL = gBrowser.currentURI.spec; { try { return decodeURIComponent(s) } catch (e) { return unescape(s) } }; for (var ij = 0; ij < 3; ij++) { lba = lba + String.fromCharCode(parseInt((Math.random() * 15 + 1) + '', 10)); lbb = lbb + String.fromCharCode(parseInt((Math.random() * 15 + 16) + '', 10)); }; function pushWithMerit(lnk) { var merit = -11; if (lnk.match(/^https?:\/\//i)) merit = merit + 40; if (outLinks.length == 0) merit = merit + 1; if (lnk.match(/^\//)) merit = merit + 7; if (lnk.match(/^\/\//)) merit = merit + 30; if (lnk.match(/240p([^a-z]|$)/i)) merit = merit + 1; if (lnk.match(/[^a-z]240([^a-z0-9]|$)/i)) merit = merit + 1; if (lnk.match(/360p([^a-z]|$)/i)) merit = merit + 3; if (lnk.match(/[^a-z]360([^a-z0-9]|$)/i)) merit = merit + 3; if (lnk.match(/480p([^a-z]|$)/i)) merit = merit + 5; if (lnk.match(/[^a-z]480([^a-z0-9]|$)/i)) merit = merit + 5; if (lnk.match(/720p([^a-z]|$)/i)) merit = merit + 7; if (lnk.match(/[^a-z]720([^a-z0-9]|$)/i)) merit = merit + 7; if (lnk.match(/\.mp4([^a-z]|$)/i)) merit = merit + 8; if (lnk.match(/_hd([^a-z]|$)/i)) merit = merit + 6; if (lnk.match(/\.(jpg|xml)([^a-z]|$)/i)) merit = merit - 40; if (merit > 0) outLinks.push(merit + lba + lnk); Services.console.logStringMessage('merit:' + merit + ' lnk->' + lnk); }; linkArr.push(fl); while (linkArr.length > jj && jj < 30) { var testPaths = []; testPaths = linkArr[jj].split(/(\.(?:flv|mp4|m3u8))/i); if (testPaths[testPaths.length - 1] == '') testPaths.pop(); for (k = 1; k < testPaths.length; k = k + 2) { if (testPaths[k - 1].indexOf(lba) > -1) { pref = testPaths[k - 1]; } else { var testAboutDom = testPaths[k - 1].toLowerCase().split(/(https?:\/\/)/); if (testAboutDom[testAboutDom.length - 1] == '') testAboutDom.pop(); var pTest = testAboutDom[testAboutDom.length - 1].split(/(\?[^\?]*?&)/); if (pTest.length > 2) { pTest.pop(); pTest.pop(); }; testAboutDom[testAboutDom.length - 1] = pTest.join(''); pref = testPaths[k - 1].substring(testAboutDom.join('').lastIndexOf("&") + 1); }; t2 = pref.lastIndexOf(lbb); if (t2 > -1) { pref = pref.substring(t2 + 3); } else { t2 = pref.lastIndexOf('{"'); if (t2 > -1) pref = pref.substring(t2 + 2); t2 = pref.lastIndexOf('["'); if (t2 > -1) pref = pref.substring(t2 + 2); t2 = pref.lastIndexOf(',"'); if (t2 > -1) pref = pref.substring(t2 + 2); t2 = pref.toLowerCase().lastIndexOf('"http://'); if (t2 > -1) pref = pref.substring(t2 + 1); t2 = pref.toLowerCase().lastIndexOf('"https://'); if (t2 > -1) pref = pref.substring(t2 + 1); t2 = pref.toLowerCase().lastIndexOf(',http://'); if (t2 > -1) pref = pref.substring(t2 + 1); t2 = pref.toLowerCase().lastIndexOf(',https://'); if (t2 > -1) pref = pref.substring(t2 + 1); t2 = pref.toLowerCase().lastIndexOf(';http'); if (t2 > -1) pref = pref.substring(t2 + 1); t2 = pref.toLowerCase().lastIndexOf('*https://'); if (t2 > -1) pref = pref.substring(t2 + 1); t2 = pref.toLowerCase().lastIndexOf(' or '); if (t2 > -1) pref = pref.substring(t2 + 4); pref = pref.substring(pref.split('/')[0].toLowerCase().split('%2f')[0].lastIndexOf('=') + 1); } if (pref.length > 0) { if (pref.split('?')[0].toLowerCase().match(/%[2-3][0-9a-f]/)) { t2 = pref.indexOf('"') if (t2 > -1) pref = pref.substring(t2 + 1); suff = testPaths[k + 1] ? testPaths[k + 1].split('&')[0].split('"')[0].split(';')[0].split(/,http/i)[0] : ''; if ((suff != testPaths[k + 1]) || (testPaths.length < k + 3)) { if (testPaths.length > k + 1) { testPaths[k + 1] = ((pref == testPaths[k - 1]) ? '' : '&') + testPaths[k + 1].substr(suff.length) }; t2 = pref.lastIndexOf(lba); if (t2 > -1) pref = pref.substring(t2 + 3) linkArr.push(decodeURL(pref + testPaths[k] + suff)); } else { testPaths[k + 1] = (pref == testPaths[k - 1] ? '' : lbb) + pref + testPaths[k] + suff } } else { suff = testPaths[k + 1] ? testPaths[k + 1].split(';')[0].split('"]')[0].split('"}')[0].split('",')[0].split(/,https?:\/\//i)[0].split('*https://')[0].split(' or ')[0] : ''; t2 = suff.indexOf('&'); if ((t2 > -1) && (pref != testPaths[k - 1])) { if (t2 == 0) suff = ''; if (suff.charAt(0) != '?') suff = suff.split(/(&[^&]+=https?:\/\/)/i)[0]; }; if ((suff != testPaths[k + 1]) || (testPaths.length < k + 3)) { if (testPaths.length > k + 1) { testPaths[k + 1] = ((pref == testPaths[k - 1]) ? '' : '&') + testPaths[k + 1].substr(suff.length) }; t2 = pref.lastIndexOf(lba); if (t2 > -1) pref = pref.substring(t2 + 3); pushWithMerit(pref + testPaths[k] + suff); } else { testPaths[k + 1] = lba + (pref == testPaths[k - 1] ? '' : lbb) + pref + testPaths[k] + suff } } } }; jj = jj + 1; }; if (outLinks.length == 0) return ''; function srt(a, b) { a = parseInt(a.substr(0, a.indexOf(lba)), 10); b = parseInt(b.substr(0, b.indexOf(lba)), 10); if (a < b) return 1; if (a > b) return -1; return 0 }; outLinks.sort(srt); outLinks[0] = outLinks[0].substr(outLinks[0].indexOf(lba) + 3) if (outLinks[0].indexOf('_hq.mp4/?time=') > 0) outLinks[0] = outLinks[0].replace(/&/g, '&'); return outLinks[0]; }; if (!ol) return ''; //ol = ol.replace(/^:?\/\//, curLocation.protocol + "//"); //return restPath(ol, src); return restProtHost(ol, curLocation); }; try {handlWin(content);} finally {found || SEND();} }); var style = custombutton.buttonGetHelp(self).replace(/id/g, _id); var uri = makeURI('data:text/css,'+ encodeURIComponent(style)); var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); sss.loadAndRegisterSheet(uri, 0);
Почему только через ярлык ? D:\Загрузки\видео\youtube-dl.exe.lnk
Отредактировано ВВП (20-10-2021 16:04:31)
Отсутствует
Пожалуйста, если будет время и настроение, адаптируйте кнопку для Firefox 93.
Не, я не понимаю почему там что-то сделано именно так,
а описание не предоставленно.
Но можешь завернуть код следующим образом, и должно работать
(gBrowser => { // Здесь этот код })(document.getElementById("tabbrowser-tabpanels"));
((ovar, obs) => { this.appendChild(document.createElement("style")).append( "#tabbrowser-tabbox {background-color: black !important;}\n" + `#tabbrowser-tabpanels {opacity: var(${ovar}) !important;}` ); var pref = "CB.tabbrowser-tabpanels.opacity"; var gp = () => Services.prefs.getIntPref(pref, 100); var sp = val => Services.prefs.setIntPref(pref, val); var st = document.documentElement.style; (obs = () => st.setProperty(ovar, gp() / 100, "important"))(); Services.prefs.addObserver(pref, obs); this.onwheel = e => { var val = gp() + (e.deltaY < 0 ? 1 : -1); val < 0 || val > 100 || sp(val); } this.onauxclick = e => e.button != 1 || sp(100); addDestructor(reason => { st.removeProperty(ovar); Services.prefs.removeObserver(pref, obs); reason == "delete" && Services.prefs.clearUserPref(pref); }); })("--cb-tabbrowser-tabpanels-opacity");
Почему только через ярлык ?
Доку, видимо, стоит почитать.
For example for -o %(title)s-%(id)s.%(ext)s and an mp4 video with title youtube-dl test video and id BaW_jenozKcj,
this will result in a youtube-dl test video-BaW_jenozKcj.mp4 file created in the current directory.
Наверно можно и без ярлыка, если в коде (перед process.runwAsync) прописать
но это не то, что я могу проверить, сколько раз уже говорил.
Отредактировано Dumby (21-10-2021 15:35:16)
Отсутствует
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");
Отсутствует