Vitaliy V.
На мой взгляд самое логичное место для одиночного файла пользовательских настроек (CustomStylesScripts.mjs) это корень user_chrome_files. Сейчас надо слишком много щелчков мыши в проводнике сделать, что бы перейти от одного файла к другому, а потом возможно еще и обратно.
custom_script_all_win.js и custom_script_win.js используются для тестирования скриптов, перед тем как создать файл скрипта и прописать его нормально. Я б не стал их убирать, это никакого профита не принесет.
Я бы создал папочки под скрипты, например: "Background", "DOMContentLoaded_all", "DOMContentLoaded_child", "DOMContentLoaded_win", "DOMWindowCreated_child", "Load_all","Load_win", "Pageshow_child". Чтоб они одной кучей не лежали затрудняя поиск нужного. В этом случае можно вообще CustomStylesScripts.mjs ликвидировать и сделать автозагрузку скриптов из соответствующих папок или оставить только CustomStyles.mjs, или стили тоже сделать с автозагрузкой, только уже из соответствующих файлов. Или не автозагрузку, а кнопку/окно с меню лежащих в папках скриптов. Закинул в папку скрипт и включил галку в браузере.
Отсутствует
Т.е. в папке chrome две папки UserChromeFiles ?
Да-да, именно две.
Новоначальный (if any) — разворачивает обе две.
Обновляющийся — заменяет только вторую.
или можно вообще убрать
Не надо ничего нигде убирать.
Идея была услышана, рассмотрена, прикинута, и отвергнута.
Это совершенно нормально, на то оно и обсуждение.
Продолжаем так, как оно есть сейчас,
ещё не хватало чего-то поперёк здорового консерватизма.
Отсутствует
самое логичное место для одиночного файла пользовательских настроек (CustomStylesScripts.mjs) это корень user_chrome_files
Да возможно так и сделаю это уже мелочи, в принципе и сами можете в двух местах пути подправить в user_chrome.js и StylesScriptsChild.mjs
сделать автозагрузку скриптов
Нет этого делать не буду, это может задерживать запуск не случайно же даже для userChrome.css userContent.css сделали настройку чтобы не искать файлы в директории
Или не автозагрузку, а кнопку/окно с меню лежащих в папках скриптов. Закинул в папку скрипт и включил галку в браузере
Я не любитель gui там где это не к чему, не потому что это сложно сделать, хотя и это тоже это вам не userChromeJS (или как там называется) где одинаковые оконные скрипты по одному событию загружаются и все. Так что кому нужны gui, автозакрузки ищите замену если найдете
Отредактировано Vitaliy V. (17-04-2024 00:38:04)
Отсутствует
и каким образом оконный скрипт увидит globalThis background скрипта (если UcfPrefs.customSandbox не использовать)
globalThis[Symbol.for('UcfGlob')] = this.UcfGlob; - общие функции в scriptsbackground:
UcfGlob = Cu.getGlobalForObject(Cu)[Symbol.for("UcfGlob")]; // код оконного скрипта из scriptschrome:
Отсутствует
Dobrov
ES модули и background скрипты загруженные в песочницу не одно и тоже, в песочнице globalThis не равно Cu.getGlobalForObject(Cu)
а UcfPrefs.customSandbox дает ссылку именно на песочницу, надеюсь теперь понятно
Отсутствует
не случайно же даже для userChrome.css userContent.css сделали настройку чтобы не искать файлы в директории
Я что то пропустил, что за настройка? А, типа что б только по импорту в основных файлах?
Отредактировано _zt (17-04-2024 11:14:13)
Отсутствует
Я что то пропустил, что за настройка?
Наверняка знаете давно сделали toolkit.legacyUserProfileCustomizations.stylesheets не помню с какой версии
Отсутствует
Bug 1541233 - Stop loading userContent.css or userChrome.css by default unless a preference is set
Status: RESOLVED FIXED
Milestone: mozilla69
Отсутствует
Dummy
Bug 1880914 Move Browser* helper functions used from global menubar and similar commands to a single object in a separate file, loaded as-needed
What is the relplacement of BrowserReloadSkipCache() in the latest version
Edit: I searched through the code at searchfox.org, may be this can work.
Отредактировано brake (17-04-2024 16:08:16)
Отсутствует
Bug 1880914
этот баг закрыт и он 2020 года.
P.S. тут вообще-то обсуждение скриптов, кнопок… Нужно отдельную тему создать для багов и особенностей версий Firefox!
Отсутствует
Dumby
В окно управления куками не вызывается, вообще падает.
// https://forum.mozilla-russia.org/viewtopic.php?pid=788786#p788786 // Для custom_script.js в user_chrome_files try {CustomizableUI.createWidget({ label: "Пароли / Cookies", tooltiptext: "ЛКМ: Показать пароли\nПКМ: Показать cookies", id: "ucf-logins-sitedata", localized: false, onCreated(btn) { btn._handleClick = btn.oncontextmenu = e => this.view(e, btn.ownerGlobal); btn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAADo0lEQVR42pWUf0idVRzGP+d4vVfbFFeu/SErV1bUBiI6ivajUcEiiiBoaTEEo7Lsj2W1P6Q2xFiL0Qp0q/7pB2GLijZGG/aDSPuBxBbkGm3O7IJuRJmod+t6r+89p+d9b6TWhu17uefe97zn+5zn+3yfcwznCz9e7c2S5fr3i8Ec5yLCzHtq96txdGNZSoE+a8mxgRG2cx/t5uTFAd7u17GOPrbl9oDdibGjdPgrtOIlwd7TtI2aN8zCbGcBn/dJJb7LdtP2n1XP+Q8Z+a2St5bVzVPmlPInBVKHnw/Y7tdr7OE7yjhksnM2sTxrHJ/7Sr0booIbaDSDeC9pjec8EQH6TdRzgofNALddqBR/HWNU84B5n0+j533EWcYKKZwyjZyZz/BJ36XxVkrpZPDnOMUJy4xmCmOSsxDSZwPKrtylhjXwqtnvR3mGczxBwOXEbIaU+4YMLWYNSUPTcA9pt1GLFQEUFek3fBCQE6oNp204NUXvWIUfrGsmyS6mNV/bo+F6bfg0HP/gNHWsMmwaDCKLhGGtwwks5mweKcS2OawrYOJchz9Y08ExsjgxTweOm/pNhhvD3YPE+B0JPv5kh2HzcEogi0XOEQtfCcxGdKeEWRqRDfHHf7/L71hjuYSDpFVFThQvXeGpOkqaJa6YPsPXt/xqaBhWoitRWi4PmFH2oja6K3fyYLILm20hq6ljRzb6vfUZyvmS6bi2KTBk0lpaDtVbHGO9hhOf/WFoTKaEIoaiFdO6YMZhF9fyzvIBGpJ3knOHKEy8RnfFY35AJnexVn1d1FAn/81MezUklC3Bn7wSAk4JpYRpARa5nMovJBv7iKnE/ZS508RzX/B2ZYP/kRcFslXsQq3lQSeHSPrY338X5Yaoyq6eZZgVYFyAQUbtLe7lK1fP0p+2cvTuVn9SzNK05hsVWslGWNhgMqqqwB0W10fN1fLkPxo6aRjHRQydPUV31bWRgb+3ezT/ePiGbNwSm56Uo/qY4GW1bUgbeXMvo7PG3jw8KcDSqMs2ZBgaMPYm+65qkoFfV+IjODVBFlUFlkTwgrmGNi4QAkz6yHuhP0JtstYwemaV79xQBdkDcnq+UiffpYNmbuY9Y0jNOZQS0My5HJpGugTYooLziamz8EP/Wn/4oRpm4p1IAbl4QjrtNytp+n/XV/PYSpV5GaYge2RvSXHtt/JaGVsk9O6o1BKekuC7FwKbfx/++3Y5oINvdFBzGsvpN+uj07tg/AUtF37/2LRsMgAAAABJRU5ErkJggg=="); }, view(e, win) { if (e && (e.ctrlKey || e.shiftKey)) return; var uri = win.gBrowser.selectedBrowser.currentURI; try { var url = win.ReaderMode.getOriginalUrl(uri.spec); if (url) uri = Services.io.newURI(url); } catch {} try {var tld = Services.eTLD.getBaseDomain(uri);} catch {var tld = uri.asciiHost;} e ? this.viewCookies(tld, win) : this.viewPasswords(tld, uri, win); return false; }, viewPasswords(tld, uri, win) { try { tld = Services.io.newURI(`${uri.scheme}://${tld}`).displayHost; } catch {} var params = new win.URLSearchParams({...(tld && {filter: tld})}); var gb = win.gBrowser; var separator = params.toString() ? "?" : ""; var tabToSelect, url = `about:logins${separator}${params}`; for (var tab of gb.visibleTabs) { var {spec} = tab.linkedBrowser.currentURI; if (!spec.startsWith("about:logins")) continue; if (spec != url) { var pending = tab.hasAttribute("pending"); if (pending) gb.selectedTab = tab; tab.linkedBrowser.fixupAndLoadURIString( url, {triggeringPrincipal: tab.nodePrincipal} ); if (pending) return; } tabToSelect = tab; break; } gb.selectedTab = tabToSelect || gb.addTrustedTab(url); }, async viewCookies(tld, window) { var wt = "Browser:SiteDataSettings"; var win = Services.wm.getMostRecentWindow(wt); if (!win) { await window.SiteDataManager.updateSites(); var url = "chrome://browser/content/preferences/dialogs/siteDataSettings.xhtml"; var id = "SiteDataSettingsDialog", xs = Services.xulStore; var x = xs.getValue(url, id, "screenX") || 0; var y = xs.getValue(url, id, "screenY") || 0; var features = "chrome,dialog=no,resizable," + ( x || y ? `screenX=${x},screenY=${y}` : "centerscreen" ); win = window.openDialog(url, wt, features); //var xenoWin = win.document.readyState == "complete"; // ??? var e = await new Promise(resolve => win.windowRoot.addEventListener("DOMContentLoaded", resolve, {once: true}) ); e.target.documentElement.setAttribute("windowtype", wt); } var doc = win.document; doc.documentElement.setAttribute("persist", "screenX screenY width height"); var sb = doc.querySelector("#searchBox"); sb.inputField.setUserInput(tld); setTimeout(() => sb.editor.selection.collapseToEnd(), 50); win.focus(); } });} catch(ex) {Cu.reportError(ex);}
(this.viewcookieswithrightclick = { init(that) { var star = this.star = document.querySelector("#star-button-box"); if (!star) return; star.addEventListener("contextmenu", this, true); star.addEventListener("click", this, true); that.unloadlisteners.push("viewcookieswithrightclick"); }, handleEvent(e) { if (e.button != 2) return; e.preventDefault(); e.stopPropagation(); e.stopImmediatePropagation(); if (e.type != "click") return; this.viewCookies(); }, getETDL(uri) { var eTLD = ""; try { eTLD = Services.eTLD.getBaseDomain(uri); } catch (e) { try { eTLD = uri.asciiHost; } catch (e) {} } return eTLD; }, async viewCookies() { var sds = "chrome://ucfsdswnd/content/sds.xhtml"; var type = "Browser:SiteDataSettings", g = Cu.getGlobalForObject(Cu); if (!Object.hasOwn(g, sds)) { var xhtml = (await (await fetch("chrome://browser/content/preferences/dialogs/siteDataSettings.xhtml")).text()) .replace(/(persist=".+)"/, `$1 screenX screenY sizemode" windowtype="${type}"`); g[sds] = Cc["@mozilla.org/addons/addon-manager-startup;1"] .getService(Ci.amIAddonManagerStartup).registerChrome( Services.io.newFileURI(Services.dirsvc.get("ProfD", Ci.nsIFile)), [["override", sds, "data:application/xhtml+xml," + encodeURIComponent(xhtml)]] ); } (this.viewCookies = async () => { var uri = gBrowser.selectedBrowser.currentURI; try { let _uri = ReaderMode.getOriginalUrl(uri.spec); if (_uri) uri = Services.io.newURI(_uri); } catch(e) {} uri = this.getETDL(uri); var _win = Services.wm.getMostRecentWindow(type); await SiteDataManager.updateSites(); if (!_win) await new Promise(resolve => (_win = openDialog(sds, type, "chrome,dialog=no,resizable")) .addEventListener("DOMContentLoaded", resolve, {once: true}) ); else if ("_gSiteDataSettings" in _win) _win._gSiteDataSettings(); else { Services.scriptloader.loadSubScript("data:," + encodeURIComponent(` var _gSiteDataSettings = gSiteDataSettings._gSiteDataSettings = (function() { SiteDataManager.getSites().then(sites => { this._sites = sites; var sortCol = document.querySelector("treecol[data-isCurrentSortCol=true]"); this._sortSites(this._sites, sortCol); this._buildSitesList(this._sites); }); }).bind(gSiteDataSettings); _gSiteDataSettings(); var updateSetInterval = setInterval(async () => { await SiteDataManager.updateSites(); _gSiteDataSettings(); }, 5000); let removeBtns = document.querySelectorAll("#removeSelected, #removeAll"); var updateClearInterval = () => { clearInterval(updateSetInterval); for (let btn of removeBtns) btn.removeEventListener("command", updateClearInterval); updateClearInterval = null; }; for (let btn of removeBtns) btn.addEventListener("command", updateClearInterval); `), _win); _win.addEventListener("unload", () => { _win.updateClearInterval?.(); }, { once: true }); } _win.focus(); var filter = _win.document.getElementById("searchBox"); if (!filter) return; filter.value = uri; filter.focus(); filter.dispatchEvent(new _win.Event("input", { bubbles: true })); })(); }, destructor() { this.star.removeEventListener("contextmenu", this, true); this.star.removeEventListener("click", this, true); }, }).init(this);
Отредактировано _zt (18-04-2024 19:48:35)
Отсутствует
Уже было, но на всякий случай продублирую.
// 126+ Функция Ctrl+Shift+R по ПКМ на стандартной кнопке обновления страницы // https://forum.mozilla-russia.org/viewtopic.php?pid=784200#p784200 try { (() => { var node = CustomizableUI.getWidget("stop-reload-button").forWindow(window).node.querySelector("#reload-button"), tooltipid = "reload-button-shortcut-tooltip", tooltiporig = node.tooltip; if (!document.querySelector(`#${tooltipid}`)) { document.querySelector("#dynamic-shortcut-tooltip").after(MozXULElement.parseXULToFragment(` <tooltip id="${tooltipid}"> <description class="tooltip-label">ЛКМ Обновить страницу (Ctrl+R)</description> <description class="tooltip-label">СКМ Дублировать вкладку (Ctrl+ЛКМ)</description> <description class="tooltip-label">ПКМ Обновить минуя кэш (Ctrl+Shift+R)</description> </tooltip> `)); } node.tooltip = tooltipid; node.setAttribute("context", "false"); var click = e => { if (e.button != 2) return; e.preventDefault(); e.stopPropagation(); e.stopImmediatePropagation(); BrowserCommands.reloadSkipCache(); }; node.addEventListener("click", click); this.browsercommands.reloadskipcache = { destructor() { node.removeEventListener("click", click); node.tooltip = tooltiporig; node.removeAttribute("context"); } }; this.unloadlisteners.push("browsercommands.reloadskipcache"); })(); } catch(e) {}
Добавлено 18-04-2024 20:30:52
Vitaliy V.
Можете этот скрипт для переделать, не работает.
Отредактировано _zt (18-04-2024 20:30:52)
Отсутствует
управления куками не вызывается, вообще падает
Хмм, у меня, с этого окна — не падает.
127.0a1 (2024-04-17) (32-разрядный), но, правда, у меня и кук нет.
Однако, какой-то crash-жести, определённо, завезли целый вагон.
Поэтому, я пока пребываю в состоянии «да шло бы оно всё ...».
Еще fileToBase64 не открывает обзор файлов
[censored]
picker.init(win,
picker.init(win.browsingContext,
Отсутствует
Dumby
fileToBase64 ожил, спасибо.
А куки я скриптом из спойлера вызываю, просто все кнопки жмакал и вот нажмакал два падения, решил поделится.
ps^ Изменил
var x = xs.getValue(url, id, "screenX") || 100; var y = xs.getValue(url, id, "screenY") || 100;
и заработало! У меня размер экрана подделывается, это может быть связано?
Там уже 240418 выложили.
Отредактировано _zt (18-04-2024 21:26:45)
Отсутствует
Vitaliy V.
Можете этот скрипт для переделать, не работает.
Это тоже с BrowserCommands связано, добавил совместимость с
Отсутствует
Vitaliy V.
Поставил новый ATB, при вызове окна управлением кук браузер опять упал (я выше писал об этом). Изменил в нем строки
let sx = xs.getValue(url, id, "screenX") || 10; let sy = xs.getValue(url, id, "screenY") || 10;
Браузер больше не падает.
Отсутствует
я выше писал об этом
Видел но у меня не падает, скорее всего баг ,
я так понял у вас не работает с параметром centerscreen
попробуйте заменить
let features = ...;
на
let features = "chrome,dialog=no,resizable,centerscreen";
а потом так например
let features = "chrome,dialog=no,resizable,screenX=10,screenY=10";
И удалить xulstore.json
Отредактировано Vitaliy V. (20-04-2024 14:34:49)
Отсутствует
Помогите решить задачу:
Кнопка не видит функции, прописанные перед CustomizableUI.createWidget(… ?
на первой строке меню ошибка: Uncaught ReferenceError is not defined
Если убрать «var», то код работает, но мусорит переменными в окно браузера.
(async id => { // UserMenu var BrowserReloadEx = (skip) =>{ // ошибка –> Uncaught ReferenceError is not defined if(parseInt(Services.appinfo.version) < 126) skip ? BrowserReloadSkipCache() : BrowserReload(); else skip ? BrowserCommands.reloadSkipCache() : BrowserCommands.reload(); }, G = { v: "permissions.default.image", Pref(key,set){key = [key]; var t = Services.prefs.getPrefType(key[0]), m = {b:"Bool",n:"Int",s:"String"}; t = m[t == 128 ? "b" : t == 64 ? "n" : t == 32 ? "s" : ""]; if (!t) t = m[set != undefined ? (typeof set)[0] : (typeof key[1])[0]]; if (t) if (set != undefined) Services.prefs[`set${t}Pref`](key[0],set) else set = Services.prefs[`get${t}Pref`](...key); return set; } } var MyMenu = { //имя курсивом: есть подсказка, обводка: изменяемые строки, alt() клик правой кнопкой Pics: { // Графика сайтов Вкл/Выкл permissions.default.image upd() { // обновлять сроку перед показом меню var s = G.Pref(G.v) == 1, i = "chrome://browser/skin/canvas-blocked.svg"; this.label = `Графика страниц ${s ? "загружается" : G.Pref(G.v) == 3 ? "кроме сторонних" : "отключена"}`; this.image = s ? i.replace("-blocked","") : i; this.tooltipText = `${G.v} = ${G.Pref(G.v)}\nRClick – кроме сторонних`; }, cmd(){ BrowserReloadEx(); G.Pref(G.v, G.Pref(G.v) == 2 ? 1 : 2); } }, "SubMenu": { //сперва разделитель sep: 1, men: 1, //это подменю "Censor Tracker": { upd(){this.image = `chrome://devtools/skin/images/${G.Pref("network.proxy.type") == 2 ? "check" : "close"}.svg`} } } } CustomizableUI.getWidget(id)?.label || (self => CustomizableUI.createWidget(self = {id, id: id, label: id, tooltiptext: id, localized: false, defaultArea: CustomizableUI.AREA_NAVBAR, onCreated(btn) { btn.style.setProperty("list-style-image", "url(chrome://branding/content/icon32.png)"); btn.type = "menu"; var doc = btn.ownerDocument, m = nn => doc.createXULElement(nn); var popup = m("menupopup"), menu = m("menuitem"); menu.m = m; menu.fill = this.fill; menu.render = this.render; popup.append(menu); btn.prepend(popup); }, render(){ var popup = this.parentNode; this.remove(); this.fill(MyMenu, popup); }, renderSub(){ delete this.render; this.render(); this.render = self.updSub; this.upd(); }, updSub(){ this.parentNode.state.startsWith("c") || this.upd(); }, fill(o, popup){ for (key in o){ var val = o[key]; if(typeof val != "object") continue; var {lab, inf, img, cmd, alt, sep, men, upd} = val; sep && popup.append(this.m("menuseparator")); var name = men ? "menu" : "menuitem"; var item = this.m(name); item.setAttribute("label", lab || key); item.alt = alt; //RClick в ucf_hookClicks.js {Mouse… if (inf) item.tooltipText = inf, item.style.setProperty("font-style", "italic", "important"); if(img || /this\.image.*=/.test(upd)) item.className = name + "-iconic", item.setAttribute("image", img || "chrome://devtools/skin/images/blocked.svg"); men || cmd && item.setAttribute("oncommand", cmd.toString().replace( /cmd\(.*?\){/, "{var trg = event.target || event;")); popup.append(item); if(upd){ //выделить обновляемый пункт меню item.style.filter = "drop-shadow(0.1px 1px 0.1px #c99)"; if(item.renderedOnce) (item.render = upd).call(item); else item.upd = upd, item.render = self.renderSub; } men && this.fill(val, item.appendChild(this.m("menupopup"))); } } }))(); })("ucf_test_menu");
Отсутствует
Vitaliy V.
Первый вариант вызывает падения даже после удаления xulstore.json, а второй заработал без удаления. Я ранее xulstore.json уже несколько раз удалял за эти дни, тоже на него сразу подумал.
Еще есть проблема, которая возможно связана и которая меня больше волнует. Браузерные алерты теперь с заголовком, у меня они появляются тонкими (#alertTitleBox под этот заголовок уезжает и не весь #alertTextBox показывается) и с большим отступом от правого/нижнего края экрана. Причем если chrome://global/content/alerts/alert.xhtml открыть в строке адреса, то окно падает в правый угол правильно, вплотную к панели задач и правому краю экрана. Я чего то наколхозил, что в большинстве случаев приводит к нормальному отображению, но не меняет позицию алертов
@-moz-document url("chrome://global/content/alerts/alert.xhtml") { :root { min-height: 216px !important; min-width: 400px !important; } #alertNotification { padding: 18px 16px 0 0 !important; } #alertTitleBox { font-size: 12px !important; color: #0074E8 !important; padding: 0 !important; margin: 0 !important; } #alertTextBox { min-width: 300px !important; font-weight: bold; flex-direction: row !important; align-items: center !important; justify-content: center !important; padding: 0 !important; margin: 0 !important; } #alertBox { box-shadow: rgba(10, 10, 12, 0.32) 0 0 5px !important; } @media (prefers-color-scheme: dark) { #alertBox { border-color: #0074E8 !important; background-color: var(--menu-background-color, var(--arrowpanel-background, Field)) !important; color: var(--menu-color, var(--arrowpanel-color, FieldText)) !important; } } /* !!! */ }
Отредактировано _zt (20-04-2024 16:51:01)
Отсутствует
Кнопка не видит функции
Ну с cmd.toString() это не представляется возможным,
попробуй может заменить
item.setAttribute("oncommand", cmd.toString().replace(
/cmd\(.*?\){/, "{var trg = event.target || event;"));
на
item.addEventListener("command", cmd);
Upd: нет так не пойдет в другом окне работать не будет,
зачем вообще в оконном скрипте делать CustomizableUI.createWidget ...
Вот если немного переделать для custom_script.js
(async id => { // UserMenu var BrowserReloadEx = (win, skip) =>{ // ошибка –> Uncaught ReferenceError is not defined if(parseInt(Services.appinfo.version) < 126) skip ? win.BrowserReloadSkipCache() : win.BrowserReload(); else skip ? win.BrowserCommands.reloadSkipCache() : win.BrowserCommands.reload(); }; var G = { v: "permissions.default.image", Pref(key,set){key = [key]; var t = Services.prefs.getPrefType(key[0]), m = {b:"Bool",n:"Int",s:"String"}; t = m[t == 128 ? "b" : t == 64 ? "n" : t == 32 ? "s" : ""]; if (!t) t = m[set != undefined ? (typeof set)[0] : (typeof key[1])[0]]; if (t) if (set != undefined) Services.prefs[`set${t}Pref`](key[0],set) else set = Services.prefs[`get${t}Pref`](...key); return set; } }; var MyMenu = { //имя курсивом: есть подсказка, обводка: изменяемые строки, alt() клик правой кнопкой Pics: { // Графика сайтов Вкл/Выкл permissions.default.image upd() { // обновлять сроку перед показом меню var s = G.Pref(G.v) == 1, i = "chrome://browser/skin/canvas-blocked.svg"; this.label = `Графика страниц ${s ? "загружается" : G.Pref(G.v) == 3 ? "кроме сторонних" : "отключена"}`; this.image = s ? i.replace("-blocked","") : i; this.tooltipText = `${G.v} = ${G.Pref(G.v)}\nRClick – кроме сторонних`; }, cmd(e){ BrowserReloadEx(e.view); G.Pref(G.v, G.Pref(G.v) == 2 ? 1 : 2); } }, "SubMenu": { //сперва разделитель sep: 1, men: 1, //это подменю "Censor Tracker": { upd(){this.image = `chrome://devtools/skin/images/${G.Pref("network.proxy.type") == 2 ? "check" : "close"}.svg`} } } }; (self => CustomizableUI.createWidget(self = { id: id, label: id, tooltiptext: id, localized: false, defaultArea: CustomizableUI.AREA_NAVBAR, onCreated(btn) { btn.style.setProperty("list-style-image", "url(chrome://branding/content/icon32.png)"); btn.type = "menu"; var doc = btn.ownerDocument, m = nn => doc.createXULElement(nn); var popup = m("menupopup"), menu = m("menuitem"); menu.m = m; menu.fill = this.fill; menu.render = this.render; popup.append(menu); btn.prepend(popup); }, render(){ var popup = this.parentNode; this.remove(); this.fill(MyMenu, popup); }, renderSub(){ delete this.render; this.render(); this.render = self.updSub; this.upd(); }, updSub(){ this.parentNode.state.startsWith("c") || this.upd(); }, fill(o, popup){ for (key in o){ var val = o[key]; if(typeof val != "object") continue; var {lab, inf, img, cmd, alt, sep, men, upd} = val; sep && popup.append(this.m("menuseparator")); var name = men ? "menu" : "menuitem"; var item = this.m(name); item.setAttribute("label", lab || key); item.alt = alt; //RClick в ucf_hookClicks.js {Mouse… if (inf) item.tooltipText = inf, item.style.setProperty("font-style", "italic", "important"); if(img || /this\.image.*=/.test(upd)) item.className = name + "-iconic", item.setAttribute("image", img || "chrome://devtools/skin/images/blocked.svg"); men || (item.cmd = cmd) && item.setAttribute("oncommand", "this.cmd(event);"); popup.append(item); if(upd){ //выделить обновляемый пункт меню item.style.filter = "drop-shadow(0.1px 1px 0.1px #c99)"; if(item.renderedOnce) (item.render = upd).call(item); else item.upd = upd, item.render = self.renderSub; } men && this.fill(val, item.appendChild(this.m("menupopup"))); } } }))(); })("ucf_test_menu");
а второй заработал без удаления
Обновил расширение сделал без centerscreen все равно это не особо нужно, проверяйте
Нельзя ли алерты гвоздями (скриптом или стилем) прибить в правый нижний угол, над панелью задач?
Ну возможно скриптом можно и то не всегда и не везде, зависит от оконного менеджера позволит он перемещать окна или нет.
А что системные уведомления не проще включить, в они включены по умолчанию
alerts.useSystemBackend - true
Отредактировано Vitaliy V. (21-04-2024 15:50:07)
Отсутствует
Vitaliy V.
Спасибо за расширение.
А что системные уведомления не проще включить
Да я с удовольствием бы, но они мелькают ровно на секунду и в истории не сохраняются, хотя в настройках уведомлений Win, для Fx указано иное.
Добавлено 21-04-2024 15:38:29
Хотя, действительно, лучше включу системные.
Отредактировано _zt (21-04-2024 15:38:29)
Отсутствует
попробуй заменить на item.addEventListener("command", cmd);
Я так переделал, и всё работает: item.onclick = cmd
Менюшка в оконном скрипте потому, что там весь основной код – перехват кликов и прочие функции.
Отсутствует