скрытый текст
А чего это там код
два раза два раза
повторяется?
Исправь, если у тебя так.
А правка, может такую попробуй
/* mp.setAttribute("onpopupshowing", "this.updateMenu();"); mp.setAttribute("oncommand", "if(!event.button) this.handleEvent(event);"); // Ignore middle-click in Firefox 89+ mp.setAttribute("onmousedown", "if(event.button == 0) this.handleEvent(event);"); mp.setAttribute("onclick", "if(event.button > 0) this.handleEvent(event);"); mp.setAttribute("oncontextmenu", "return false;"); mp.setAttribute("onpopuphidden", "this.destroyMenu();"); */ addEventListener("popupshowing", () => mp.updateMenu(), false, mp); addEventListener("command", mp.onmousedown = mp.onclick = e => { if (!e.button || e.type.endsWith("k")) mp.handleEvent(e); }, false, mp); mp.toggleAttribute("context"); addEventListener("popuphidden", () => mp.destroyMenu(), false, mp);
Отсутствует
Dumby
Спасибо! Кнопка заработала.
Огромная просьба. Посмотри еще раз код
Дополнительные пункты в контекстном меню кнопки из моего
предыдущего поста. Очень полезная кнопка. Твоя правка к сожалению не сработала.
Ни один пункт меню не работает.
Отредактировано Garalf (08-02-2025 23:31:32)
Отсутствует
Огромная просьба. Посмотри еще раз код
Дополнительные пункты в контекстном меню кнопки
Посмотрел.
На сей раз на 137.0a1 (2025-02-09).
Создал кнопку с предоставленным кодом инициализации.
Сделал предложенные правки. Рестарт.
Пункты «Показать Id кнопки» и «Переместить кнопку...» точно работают.
Остальные не проверял, поскольку, таким образом, утверждение
«Ни один пункт меню не работает» уже не подтвердилось.
Отсутствует
Проверь пожалуйста пункт меню Редактирование кнопки.
Это не представляется возможным,
поскольку меня такого пункта вообще нет.
Есть пункт «Редактировать…».
#custombuttons-contextpopup-edit,
ну тот, который самый первый сверху.
Но этот пункт не из добавляемых кодом, а пункт самого расширения.
Если имееется в виду именно он, и если не работает именно он,
то, может, обновление встало криво,
или startupCache при этом, после рестарта не очистился,
или, даже не знаю что ещё.
Отсутствует
Dumby
Раз теме тишина попрошу полечить еще одну кнопку.
UserCSSLoader
(obj => { this.onclick = obj.click.bind(obj); this.oncontextmenu = obj.contextmenu.bind(obj); this.tooltipText = "L: Reload userChrome.css\nM: CB Menu\nR: Reload userContent.css"; })({ async click(e) { if (e.button == 1) return gShowPopup(self); if (e.button || !this.chromeSheet) return; await this.reload(this.chromeSheet); this.restyle(0); }, async contextmenu(e) { if (e.ctrlKey || e.shiftKey || e.detail != 1 || !this.contentSheetURL) return; e.preventDefault(); var count = Services.ppmm.childCount, one = count == 1; var data = await this.reloadTab("chrome://extensions/content/dummy.xul", one ? false : {}); if (one) this.reloadTab(); else if (data) { var url = "data:," + encodeURIComponent( self.Help + this.contentSheetURL + '", ' + JSON.stringify(data) + ");" ); var types = ["web", "file", "extension"]; for(var ind = 0; ind < count; ind++) { var child = Services.ppmm.getChildAt(ind); types.includes(child.remoteType) && child.loadProcessScript(url, false); } } this.restyle(250); }, async reload(sheet, obj) { try {var style = await (await fetch(sheet.href)).text();} catch (ex) {return obj;} InspectorUtils.parseStyleSheet(sheet, style); if (obj) obj[sheet.href] = style; for(var ind = 0, len = sheet.cssRules.length; ind < len; ind++) { var rule = sheet.cssRules.item(ind); rule.type == rule.IMPORT_RULE && rule.styleSheet.href.startsWith("file:///") && await this.reload(rule.styleSheet, obj); } return obj; }, reloadTab(url, obj) { var tab = gBrowser.addTab(url, {skipAnimation: true}); tab.style.setProperty("display", "none", "important"); return new Promise(resolve => { var result, stop, destroy = () => { if (!stop) resolve(result), gBrowser.removeTab(tab), stop = true; } setTimeout(destroy, 500); try { tab.linkedBrowser.addEventListener("DOMContentLoaded", async e => { var sheet = this.getSheet(e.target, this.contentSheetURL); if (sheet) result = await this.reload(sheet, obj); destroy(); }, {once: true}); } catch(ex) { destroy(); } }); }, getSheet(doc, href) { var sheets = InspectorUtils.getAllStyleSheets(doc); return sheets.find(sheet => sheet.href == href); }, get contentSheetURL() { var file = Services.dirsvc.get("UChrm", Ci.nsIFile); file.append("userContent.css"); if (!file.exists()) return null; delete this.contentSheetURL; return this.contentSheetURL = Services.io.newFileURI(file).spec; }, get restyle() { var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); var uri = Services.io.newURI("data:text/css,:root{}"), type = sss.USER_SHEET; delete this.restyle; return this.restyle = delay => setTimeout(() => { sss.loadAndRegisterSheet(uri, type); sss.unregisterSheet(uri, type); }, delay); }, get chromeSheet() { var file = Services.dirsvc.get("UChrm", Ci.nsIFile); file.append("userChrome.css"); if (!file.exists()) return null; var href = Services.io.newFileURI(file).spec; var sheet = this.getSheet(document, href); if (!sheet) return null; delete this.chromeSheet; return this.chromeSheet = sheet; } });
Напомню - это 136.b3 Кстати, пункт меню Edit в контекстном меню кнопки
неожиданно заработал.
Отредактировано Garalf (11-02-2025 10:19:25)
Отсутствует
Dumby
Справка
((href, data) => { var en = Services.ww.getWindowEnumerator(null); if (!en.hasMoreElements()) return; var doc = en.getNext().document; var du = Components.classes["@mozilla.org/inspector/dom-utils;1"] .getService(Components.interfaces.inIDOMUtils); var reload = sheet => { var style = data[sheet.href]; if (!style) return; du.parseStyleSheet(sheet, style); for(var ind = 0, len = sheet.cssRules.length; ind < len; ind++) { var rule = sheet.cssRules.item(ind); rule.type == rule.IMPORT_RULE && rule.styleSheet.href.startsWith("file:///") && reload(rule.styleSheet); } } var sheet = du.getAllStyleSheets(doc).find(sheet => sheet.href == href); if (sheet) reload(sheet); })("
Отсутствует
Справка
Другое дело.
Напомню - это 136.b3
Что-то я не вижу в кнопке
ни использования «on…» атрибутов, ни импорта модулей.
Но многовато чего-то совсем древнего,
поэтому попробую чуть переделать.
Код со Справки перенёс в Инициализацию.
(code => { this._handleClick = () => { var href = getHref("hrome"); if (!href) return; var sheet = getSheet(document, href); sheet && (this._handleClick = () => reload(sheet).then(restyle))(); } this.onauxclick = e => e.button > 1 || gShowPopup(this); this.oncontextmenu = e => { if (e.ctrlKey || e.shiftKey || e.detail != 1) return; e.preventDefault(); reloadContentSheet(); } this.tooltipText = "L: Reload userChrome.css\nM: CB Menu\nR: Reload userContent.css"; var getHref = str => { var file = Services.dirsvc.get("UChrm", Ci.nsIFile); file.append(`userC${str}.css`); if (file.exists()) return Services.io.newFileURI(file).spec; } var getSheet = (doc, href) => InspectorUtils.getAllStyleSheets(doc).find(sheet => sheet.href == href); var reload = async (sheet, obj) => { try {var style = await (await fetch(sheet.href)).text();} catch {return obj;} InspectorUtils.parseStyleSheet(sheet, style); if (obj) obj[sheet.href] = style; for(var ind = 0, len = sheet.cssRules.length; ind < len; ind++) { var rule = sheet.cssRules.item(ind); rule.type == rule.IMPORT_RULE && rule.styleSheet.href.startsWith("file:///") && await reload(rule.styleSheet, obj); } return obj; } var restyle = delay => { var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); var uri = Services.io.newURI("data:text/css,:root{}"), type = sss.USER_SHEET; var regUnreg = () => { sss.loadAndRegisterSheet(uri, type); sss.unregisterSheet(uri, type); }; (restyle = delay => setTimeout(regUnreg, delay))(delay); } var reloadContentSheet = async () => { var href = getHref("ontent"); if (!href) return; var {br} = this; if (!br) { br = this.br = document.createXULElement("browser"); br.setAttribute("type", "content"); this.append(br); await new Promise(resolve => br.addEventListener("pageshow", resolve, {once: true})); } var sheet = getSheet(br.contentDocument, href); if (!sheet) return; br.remove(); delete this.br; var {ppmm} = Services; var re = /^(?:web|file|extension|privileged)/; var prfx = "data:," + encodeURIComponent(code.trim() + sheet.href + '", '); (reloadContentSheet = async () => { var data = await reload(sheet, Object.create(null)); var url = prfx + encodeURIComponent(JSON.stringify(data)) + ");" for(var ind = 0, count = ppmm.childCount; ind < count; ind++) { var child = ppmm.getChildAt(ind); re.test(child.remoteType) && child.loadProcessScript(url, false); } restyle(350); })(); } })(` ((href, data) => { var en = Services.ww.getWindowEnumerator(null); if (!en.hasMoreElements()) return; var doc = en.getNext().document; var reload = sheet => { var style = data[sheet.href]; if (!style) return; InspectorUtils.parseStyleSheet(sheet, style); for(var ind = 0, len = sheet.cssRules.length; ind < len; ind++) { var rule = sheet.cssRules.item(ind); rule.type == rule.IMPORT_RULE && rule.styleSheet.href.startsWith("file:///") && reload(rule.styleSheet); } } var sheet = InspectorUtils.getAllStyleSheets(doc).find(sheet => sheet.href == href); sheet && reload(sheet); })(" `);
Отсутствует