VORON
Есть еще такое. Тема UserChromeFiles.
upd: Похоже, файл удален. (Можете восстановить - "Load diff". Там можно увидеть и запись в файл).
Если так трудно, можно было папку профиля скопировать и запустить. А там разобраться уже легко, главное настроить config.js, config-prefs.js. Пути файлов видны по ссылке. Дальше, копируем chrome в папку профиля, или же сам профиль. Запускаем, разбираемся.
Если уже есть UCF, добавить запись в CustomStylesScripts.mjs. Почитайте "встроенная Справка" - Полный список▼.
В контекстном меню, есть функцию вызова "менеджера паролей". Когда добавили не знаю, может он там всегда был. Не пользуюсь. Ну в общем, при вызове, он сразу подстраивает под домен с которого вызван. По идее, надобность в ucf_cooks-pass.js не имеет смысла. Потому наверно и был удален, за ненадобностью. Сам не пользовался, так как у меня сторонний менеджер. Куки же, можно настроить в настройках и нужен редко, нет нужды в постоянном его вызове.
momo2000, ucf_aom-button.js
Отредактировано b0ttle (31-03-2024 23:26:13)
Отсутствует
VORON
А [CB]Toggle Restartless Add-ons рабочая есть?
Отредактировано momo2000 (31-03-2024 10:04:22)
Отсутствует
momo2000
Давно не попадалась. Спроси у Dumby, может есть возможность починить.
Добавлено 31-03-2024 10:30:39
b0ttle
С этим вообще не понял.
Скачал,закинул в папку custom_scripts, перезапустил,с созданием нового кеша и ничего не появилось/не происходит.
Как это работает?
Отредактировано VORON (31-03-2024 10:30:39)
Отсутствует
VORON - надо прописать скрипты в CustomStylesScripts.mjs.
В демо-профиле всё уже сделано, читайте шапку темы.
Отсутствует
Dumby
Добрый день.
Можно Вас попросить подправить кнопку для 115.9.1esr
((script, ID, NSVO) => { var nsvo = eval(NSVO), u = code => "data:," + encodeURIComponent(code); if (!(ID in nsvo)) { var processURL = u(script.replace(/%ID%/g, ID).replace("%NSVO%", NSVO)); Services.ppmm.loadProcessScript(processURL, true); nsvo[ID].processURL = processURL; Services.mm.loadFrameScript(nsvo[ID].frameURL = u(`${NSVO}["${ID}"].init(this);`), true); } addDestructor(reason => { if (reason[5] != "e" || !(ID in nsvo)) return; Services.mm.removeDelayedFrameScript(nsvo[ID].frameURL); Services.mm.loadFrameScript(u(`${NSVO}["${ID}"].destroy(this);`), false); Services.ppmm.removeDelayedProcessScript(nsvo[ID].processURL); Services.ppmm.loadProcessScript(u(`${NSVO}["${ID}"].forget();`), false); }); })(`\ (nsvo => nsvo["%ID%"] = { dblclick({target}) { if (target.hasAttribute("typechanged")) { target.type = "password"; target.removeAttribute("typechanged"); } else if ( target.hasAttribute("type") && target.getAttribute("type").toLowerCase() == "password" ) { target.type = "text"; target.setAttribute("typechanged", true); } }, init(cpmm) { cpmm.addEventListener("dblclick", this); cpmm.addEventListener("unload", this); }, destroy(cpmm) { cpmm.removeEventListener("dblclick", this); cpmm.removeEventListener("unload", this); }, handleEvent(e) {this[e.type](e);}, unload(e) {this.destroy(e.target);}, forget() {delete nsvo["%ID%"];} })(%NSVO%);`, `CB${_id.slice(20)}:PasswordTypeToggler`, `Components.utils.import("resource://gre/modules/Services.jsm", {})` );
Отсутствует
Можно Вас попросить
Попросить-то можно, ...
(frag => { var g = Cu.getGlobalForObject(Cu); var ID = `CB${_id.slice(20)}:PasswordTypeToggler`; var u = code => "data:," + encodeURIComponent(code); if (!(ID in g)) { var processURL = u(`(id => globalThis[id] = ${frag})("${ID}");`); Services.ppmm.loadProcessScript(processURL, true); g[ID].processURL = processURL; Services.mm.loadFrameScript(g[ID].frameURL = u(`globalThis["${ID}"].init(this);`), true); } addDestructor(reason => { if (reason[5] != "e" || !(ID in g)) return; Services.mm.removeDelayedFrameScript(g[ID].frameURL); Services.mm.loadFrameScript(u(`globalThis["${ID}"].destroy(this);`), false); Services.ppmm.removeDelayedProcessScript(g[ID].processURL); Services.ppmm.loadProcessScript(u(`globalThis["${ID}"].forget();`), false); }); })(`\ { dblclick(e) { var trg = e.target, ed = trg.editor; if (ed instanceof Ci.nsIEditor && ed.flags & ed.eEditorPasswordMask) trg.revealPassword = !trg.revealPassword; }, init(cfmm) { cfmm.addEventListener("dblclick", this); cfmm.addEventListener("unload", this); }, destroy(cfmm) { cfmm.removeEventListener("dblclick", this); cfmm.removeEventListener("unload", this); }, handleEvent(e) {this[e.type](e);}, unload(e) {this.destroy(e.target);}, forget: () => delete globalThis[id] }`);
Отредактировано Dumby (31-03-2024 23:37:24)
Отсутствует
Alex_one
Для чего код? Показать пароль под звездочками в контекстном меню? Вроде такая функция встроена в контекстном меню.
Похоже в какой-то версий добавили. В esr наверно еще нет. Пробовал проверить код, так и не понял что делает.
Отредактировано b0ttle (31-03-2024 23:12:27)
Отсутствует
Для чего код? Показать пароль под звездочками в контекстном меню? Вроде такая функция встроена в контекстном меню.
Ну, видимо, есть непреодолимое желание,
чтобы именно по двойному клику.
Но, кстати да, с пунктом контекстного меню,
получается, не гармонирует, переделал как в нём.
Отсутствует
Dumby придумай исчезающий диалог !
Идея такая: при опасных действиях (перезапуск браузера и т.п.) открываем диалог с текстом предупреждения или панель или подсказку.
Диалог или панель должны исчезнуть через пару секунд, не выполняя опасную команду.
Если юзер кликнул по кнопке «Да» или по форме/панели/предупреждению с текстом, то выполняем опасное действие.
Отсутствует
Dumby придумай исчезающий диалог !
Идея такая: при опасных действиях (перезапуск браузера и т.п.) открываем диалог с текстом предупреждения или панель
Нашёл кого спросить. Ну, допустим, <panel>'ь
var ask = (...args) => { var popup = document.createXULElement("panel"); var popupset = document.getElementById("mainPopupSet"); popup.setAttribute("onpopupshown", "move();"); popup.setAttribute("onpopuphidden", "this.remove()"); var box = popup.appendChild(document.createXULElement("box")); box.style.cssText = "font-size: 32px; margin: 1em 2em 1.3em 2em; font-weight: bold; max-width: 680px;"; var tn = box.appendChild(new Text()); var hide = () => { popup.hidePopup(); popup.onclick = null; } var {style} = popup; popup.move = () => { var sc = window.screen; var pr = popup.getOuterScreenRect(); popup.moveTo((sc.width - pr.width) / 2, (sc.height - pr.height) / 2.7); style.opacity = "1"; } (ask = (text, onclick, timeout = 2e3) => { tn.data = text; style.opacity = "0"; popupset.append(popup); popup.onclick = onclick; popup.openPopup(); setTimeout(hide, timeout); })(...args); } ask( "Кликните здесь, чтобы стереть диск Цэ.", () => alert("Диск Цэ стёрт!") );
Отсутствует
Dumby спасибо! Но перенос строки не пашет!
И желательно добавить ниже мелким шрифтом текст пояснения, например: выполнение команды «format C:»
нашёл только такой способ:
// var tn = box.appendChild(new Text()); const div = document.createElement("div"); var tn = box.appendChild(div); div.insertAdjacentHTML("afterbegin", '<p>afterbegin - В начало элемента</p>'); div.insertAdjacentHTML("beforeend", '<p>beforeend - В конец элемента</p>');
Отредактировано Dobrov (02-04-2024 16:22:45)
Отсутствует
перенос строки не пашет
white-space: pre-wrap; или типа того.
createElement("div")
Можно и div
var ask = (...args) => { var popup = document.createXULElement("panel"); var popupset = document.getElementById("mainPopupSet"); popup.setAttribute("onpopupshown", "move();"); popup.setAttribute("onpopuphidden", "this.remove()"); var div = popup.appendChild(document.createElement("div")); div.style.cssText = "font-size: 32px; margin: 1em 2em 1.3em 2em; font-weight: bold; max-width: 680px; white-space: pre-wrap;"; var header = div.appendChild(document.createElement("div")).appendChild(new Text()); var footer = div.appendChild(header.parentNode.cloneNode(true)); footer.style.cssText = "font-size: 16px; font-style: italic; margin-top: 1em;"; footer = footer.firstChild; var hide = () => { popup.hidePopup(); popup.onclick = null; } var {style} = popup; popup.move = () => { var sc = window.screen; var pr = popup.getOuterScreenRect(); popup.moveTo((sc.width - pr.width) / 2, (sc.height - pr.height) / 2.7); style.opacity = "1"; } (ask = (text, explainer, onclick, timeout = 2e3) => { header.data = text; footer.data = explainer; style.opacity = "0"; popupset.append(popup); popup.onclick = onclick; popup.openPopup(); setTimeout(hide, timeout); })(...args); } ask( "Кликните здесь,\nчтобы стереть диск Цэ.", "выполнение команды «format C:»\n(не рекомендуется)", () => alert("Диск Цэ стёрт!") );
Отсутствует
Всем привет!
Даже не знаю в какой теме правильно будет задать этот вопрос.
Ну попробую здесь, может подскажите или совет какой дадите.
Использую кнопку для Custom Buttons
Вот собственно в этом и вопрос, что нужно сделать, чтобы после перезагрузки браузера загружалось это расширение?
Отсутствует
Alex_one
Тоже иногда бывает. И даже не при рестарте, а просто при запуске браузера. У меня это происходит, обычно, после бэкапа профиля. Когда чищу профиль, частично куки и удаляю кэш. Приложение Group Speed Dial. Давно писал об этой проблеме автору, он поправил, но проблема вернулась.
значит это дело никак не победить
Отсутствует
Dumby подскажи где ошибка
//Вызвать окно поиска по текущему сайту по правому клику на search-go-button.................................................................................................... (bar => { if (!bar) return; var searchbar = window.document.getElementById("searchbar"); if (!searchbar) return; var btn = searchbar.querySelector(".search-go-button") || window.document.getAnonymousElementByAttribute(searchbar, "class", "search-go-button"); btn.setAttribute("hidden", "false"); var UpdateExt = function(event) { var Sel="javascript: var getSel=function(w){ var s,d=w.document; if(d.selection){ var r=d.selection.createRange(); s=r?r.text:''} else {s=d.getSelection().toString(); if(!s){var e,t=d.getElementsByTagName('textarea'),u=d.getElementsByTagName('input'),i=t.length; while(e=(i>0)?t[--i]:u[-i--]) try{ if(e.offsetHeight>0&&(s=e.value.substring(e.selectionStart,e.selectionEnd)))break}catch(x){}}}; if(!s)for(var j=0,f;f=w.frames[j];j++){try{if(s=getSel(f))break}catch(x){}}; return s}; var w=content,s=w.prompt('Поиск на этом сайте с помощью Google',getSel(w)); if(s){open('http://www.google.com/search?as_q='+encodeURIComponent(s)+'&as_sitesearch='+w.location.hostname) } void(0);"; if (event.button != 2) return; //отключать реакцию по умолчанию event.preventDefault(); event.stopPropagation(); gBrowser.fixupAndLoadURIString(Sel, { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() }); }; // добавляем обработчик для кнопки поиска.......... btn.addEventListener("click", UpdateExt, false); })(BrowserSearch.searchBar);
Отредактировано Andrey_Krropotkin (17-04-2024 01:14:30)
Отсутствует
Подскажите последнюю рабочую версию кнопки - вставка спец. символов
(this.type != "menu" && (this.type = "menu") && !this.hasAttribute("is")) || (popup => { var columns = [ ' \u0027 " ‘ ’ ‚ ; “ ” „ “ ” ` // ', ' /* */ ( ) { } [ ] « » ‹ › ¦ ', ' … ≈ ≠ × ± — № => → # • ° ¤ ', ' Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ ', ' \uD83E\uDD8A \uD83D\uDE0E § & \u0027 \u002Fn \u002Fb \u002F @ ✓ ✗ ¬ ' ]; var css = //0&& ` #${_id} menuitem > .menu-text { font-size: 18px; font-family: Consolas, Rockwell, Verdana; text-align: center; -moz-appearance: none; margin: 0; padding: 0 14px; } #${_id} menuitem > :not(.menu-text) { display: none; } #${_id} menugroup, #${_id} > menupopup > arrowscrollbox { background-color: menu; } `.replace(/;/g, " !important;"); var inserter = { get docShell() { delete this.docShell; return this.docShell = "docShell" in document && document.docShell instanceof Ci.nsIDocShell ? document.docShell : window.docShell; }, get insertText() { delete this.insertText; return this.insertText = text => { if (!this.docShell.isCommandEnabled("cmd_insertText")) return; var params = "createCommandParams" in Components.utils ? Cu.createCommandParams() : Components.classes["@mozilla.org/embedcomp/command-params;1"] .createInstance(Components.interfaces.nsICommandParams); params.setStringValue("state_data", text); this.docShell.doCommandWithParams("cmd_insertText", params); } }, insert(text) { var br = document.activeElement; !br || br.localName != "browser" || !br.isRemoteBrowser ? this.insertText(text) : br.messageManager.loadFrameScript( `data:,(${this.insertText})${encodeURIComponent(text.toSource())}` , false, true); } }; this.onclick = function(e) { if (e.button == 1) { var profileDir1 = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get("SysD", Components.interfaces.nsIFile) .path; var tracepath = profileDir1 + "\\..\\system32\\charmap.exe"; Components.Constructor("@mozilla.org/file/local;1", "nsIFile", "initWithPath")(tracepath).launch(); } }; addEventListener("popupshowing", function ps() { removeEventListener("popupshowing", ps, true, popup); if (css) { var dwu = "windowUtils" in window && windowUtils instanceof Ci.nsIDOMWindowUtils ? windowUtils : window.QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIDOMWindowUtils); var type = dwu.AGENT_SHEET; var url = "data:text/css," + encodeURIComponent(css); dwu.loadSheetUsingURIString(url, type); addDestructor(() => dwu.removeSheetUsingURIString(url, type)); } var df = document.createDocumentFragment(); for(var symbols of columns) { var menugroup = popup.appendChild(document.createElementNS(xulns, "menugroup")); menugroup.setAttribute("orient", "vertical"); for(var sym of symbols.split(" ")) menugroup.appendChild( document.createElementNS(xulns, "menuitem") ).setAttribute("label", sym); } popup.append(df); var parent = "boxObject" in menugroup ? menugroup.boxObject.parentBox : menugroup.flattenedTreeParentNode; if (parent.localName == "slot") parent = parent.parentNode; parent.setAttribute("orient", "horizontal"); if (parent.localName == "scrollbox") parent.style.setProperty("-moz-box-orient", "horizontal", "important"); popup.setAttribute("context", ""); popup.inserter = inserter; popup.setAttribute("oncommand", "inserter.insert(event.target.label);"); popup.onauxclick = e => { var sym = e.target.label; sym && inserter.insert(sym); } }, true, popup); this.prepend(popup); })(document.createElementNS(xulns, "menupopup")); this.tooltipText="Вставка символов.\n\nЛКМ - Вставить симвлоы\nСКМ - Таблица символов Windows\nПКМ - Меню кнопки";
Отсутствует
подскажи где ошибка
Консоль подскажет.
Может content заменить на window
вставка спец. символов
raf, вроде, помогает, если ты об этом
/* addEventListener("popupshowing", function ps() { */ addEventListener("popupshowing", async function ps() { /* popup.append(df); */ popup.append(df); await new Promise(requestAnimationFrame);
Отсутствует
Dumby большое спасибо
Отредактировано Andrey_Krropotkin (17-04-2024 12:09:47)
Отсутствует
Здравствуйте, уважаемые кнопкоделы!
¿ Не могли бы вы посмотреть кнопку Открыть страницу в другом браузере( Firefox ) от 20.05.2019., и как-нибудь её адаптировать к актуальным версиям. В ней уже сразу не работает ЛКМ => Открыть меню с браузерами.
Заранее спасибо.
Или может у кого есть уже готовая похожая кнопка ?
Отсутствует
Есть в виде скрипта, добавляет пунктики в конт. меню.
Да пригодился бы. Поставил Вивальди, хочу посмотреть, чем оно лучше Edge в споре за второе место.
Отсутствует
vending_machine
// ==UserScript== // @name OpenWith.uc.js // @description Пункты в конт. меню для открытия текущей страницы или ссылки в другом браузере // @version 1.2.1a 63+ // @author y2k // @include main // @charset UTF-8 // @namespace http://tabunfirefox.web.fc2.com/ // @note Показывает значок приложения // @note Переписан как сценарий .uc.js // ==UserScript== (function() { "use strict"; /* Перед использованием измените пути к собственным браузерам (\ заменяется на \\) Для передачи аргументов выполните следующие действия: C:\\Program Files\\Internet Explorer\\iexplore.exe<>$1 Argument Argument ※ $1 преобразуется в URL */ const BrowserPath = { // "Nightly ": "D:\\Nightly 64\\NightlyMultiLoader.exe", // "Nightly Neu ": "D:\\Nightly Neu\\MultipleFirefoxLoader.exe", // "Beta": "D:\\Beta 64\\BetaMultiLoader.exe", // "Neu": "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe", // "Test": "D:\\Test\\MultiLoader.exe", "IE": "C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe", // "ESR 91": "D:\\ESR 91\\MultiLoader.exe", // "ESR 78": "D:\\ESR 78\\MultiLoader.exe", // "ESR 68": "D:\\ESR 68\\MultiLoader.exe", // "ESR 60": "D:\\ESR 60\\MultiLoader.exe", // "ESR 52": "D:\\ESR 52\\MultipleFirefoxLoader.exe", "Chrome": "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe", // "Edge": "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", }; const FlatMenu = false; const OpenWith = { start: function() { const cm = document.getElementById("contentAreaContextMenu"); cm.addEventListener("popupshowing", function(e) { if (e.target == this) { OpenWith.onpopup(e); } }, false); }, createMenu: function() { if (this.pageItem || this.linkItem) { return; } const contextMenu = document.getElementById("contentAreaContextMenu"); const pageMenu = this.$C("menu", { id: "context-open-with-page", label: "Открыть страницу в браузере:", class: "menu-iconic", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADLElEQVQ4jW2T20+bdQCGv79lcxx6HN9HYZhl2cyuNEQTvTBZTIyHWxe9MYveaGKi0RtJyDY2FGo/l8G2MkCElhZaoO2go6OTcuhaWoRCSw+jLS0dX3+PN5vJCM/1+1697yNJx7iUtCtt4RG1Nfh3SvG7hTzjFWb3o5RpLKS2TySV4/nXsMTudrfHhmmLuVFCDuQ5Fy2eaSyeEHpXBONoFNke7z6x3L5p87ZrLuT1Bxgf38McGEGem8Q0NU2nb4nvI1voR9bQuSro72x6Xyu3bvd0fVCf59fcMudWhsWHUQ9frIcweCdocXtoGp3hp7UtIsUjYRmKIU9VMNh2uiRJkqTLZZtRzvXxaXEKhBDJahkhBN/Gn2KecyB7PBjG/TTaH5GoHIIQ4jN/njN9eZSBmlHqyPb2t5at2CvPGNqPYXyicjW+gBCCOzvb6CcnMTn9nL4X4KPZONTr9K09540/Shh+K/RLbZkbqfN7NnZrFS7F7JjDf/KklGO1VKJl1olpysVZZwDDaJC3nKsIrY66XuTUrTS6nnxKsuxdF2+nB0nUnmNcsfLldoCVUhGdb4gm9yh61ySGCR+64QXG/s0jtCOC+SqKmqKhpyAkJXNdvL93n2fVAsaVPq5sTIMm+CGxgprewpnNYnb4OT3oYzazD9oR1OvIaoozN/NCsmRupi7nBkjXyrRFB5HDAyAEQtP4cSPKlaUlGoY9nHc9pVI7Ak3jQazEqd4Mut58SurI9vZbyirLhxmu7QTQPb7N1Y1FModVvlr9h/cWgny3miBXfcHtaJZDrcbn3jSN6gH6W/l+6ULZZlRyfXz8csaLa6M0+610hmcYye4yXygytLvHRXcEWzwHQohvFos09Ocx/l4zSpIkSW/uWrtatYf8XAiDEOLrRIiWhb9onh5DPzmN7JznWjgJQohflnM0jVXRWV8e6RUdSatXeTHOJztzRA4KZA5rxCtlogcVdg9qeLL7vDu3SaOjis527MqvOJe4221ev8/ZqIMLYQ+doQDvLARp8y7S7IrQ9HAVkz12skz/S5W0K0poSDX7RlJGn0MYpjzCMO5LmcaCqnyCzv8BRmmCMzO3S40AAAAASUVORK5CYII=" }); contextMenu.insertBefore(pageMenu, contextMenu.querySelector(":scope > #context-bookmarkpage, :scope > #context-savepage")); const linkMenu = this.$C("menu", { id: "context-open-with-link", label: "Открыть ссылку в браузере:", class: "menu-iconic", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADLElEQVQ4jW2T20+bdQCGv79lcxx6HN9HYZhl2cyuNEQTvTBZTIyHWxe9MYveaGKi0RtJyDY2FGo/l8G2MkCElhZaoO2go6OTcuhaWoRCSw+jLS0dX3+PN5vJCM/1+1697yNJx7iUtCtt4RG1Nfh3SvG7hTzjFWb3o5RpLKS2TySV4/nXsMTudrfHhmmLuVFCDuQ5Fy2eaSyeEHpXBONoFNke7z6x3L5p87ZrLuT1Bxgf38McGEGem8Q0NU2nb4nvI1voR9bQuSro72x6Xyu3bvd0fVCf59fcMudWhsWHUQ9frIcweCdocXtoGp3hp7UtIsUjYRmKIU9VMNh2uiRJkqTLZZtRzvXxaXEKhBDJahkhBN/Gn2KecyB7PBjG/TTaH5GoHIIQ4jN/njN9eZSBmlHqyPb2t5at2CvPGNqPYXyicjW+gBCCOzvb6CcnMTn9nL4X4KPZONTr9K09540/Shh+K/RLbZkbqfN7NnZrFS7F7JjDf/KklGO1VKJl1olpysVZZwDDaJC3nKsIrY66XuTUrTS6nnxKsuxdF2+nB0nUnmNcsfLldoCVUhGdb4gm9yh61ySGCR+64QXG/s0jtCOC+SqKmqKhpyAkJXNdvL93n2fVAsaVPq5sTIMm+CGxgprewpnNYnb4OT3oYzazD9oR1OvIaoozN/NCsmRupi7nBkjXyrRFB5HDAyAEQtP4cSPKlaUlGoY9nHc9pVI7Ak3jQazEqd4Mut58SurI9vZbyirLhxmu7QTQPb7N1Y1FModVvlr9h/cWgny3miBXfcHtaJZDrcbn3jSN6gH6W/l+6ULZZlRyfXz8csaLa6M0+610hmcYye4yXygytLvHRXcEWzwHQohvFos09Ocx/l4zSpIkSW/uWrtatYf8XAiDEOLrRIiWhb9onh5DPzmN7JznWjgJQohflnM0jVXRWV8e6RUdSatXeTHOJztzRA4KZA5rxCtlogcVdg9qeLL7vDu3SaOjis527MqvOJe4221ev8/ZqIMLYQ+doQDvLARp8y7S7IrQ9HAVkz12skz/S5W0K0poSDX7RlJGn0MYpjzCMO5LmcaCqnyCzv8BRmmCMzO3S40AAAAASUVORK5CYII=" }); contextMenu.insertBefore(linkMenu, contextMenu.querySelector(":scope > #context-sep-open")); this.pageItem = this.createMenuItem(pageMenu, "openPage", FlatMenu? "Открыть страницу в $1 ":" $1"); this.linkItem = this.createMenuItem(linkMenu, "openLink", FlatMenu? "Открыть ссылку в $1 ":" $1"); }, createMenuItem: function(menu, method, format) { const frag = document.createDocumentFragment(); let menuitem = []; for (let i of Object.keys(BrowserPath)) { const item = this.$C("menuitem", { label: format.replace("$1", i), class: "menuitem-iconic", image: "moz-icon:file:///" + BrowserPath[i].split("<>")[0] + "?size=16", value: JSON.stringify([ method, i ]), }); item.addEventListener("command", this, false); frag.appendChild(item); menuitem[menuitem.length] = item; } if (!FlatMenu) { const menupopup = this.$C("menupopup"); menupopup.appendChild(frag); menu.appendChild(menupopup); menuitem = [ menu ]; } else { const parent = menu.parentNode; parent.insertBefore(frag, menu); parent.removeChild(menu); } return menuitem; }, $C: function(tag, attrs) { const elem = document.createXULElement(tag); if (attrs) { for (let key of Object.keys(attrs)) elem.setAttribute(key, attrs[key]); } return elem; }, onpopup: function(e) { this.createMenu(); const isHtml = /^(https?|file):/.test(gBrowser.currentURI.spec); const pageItemHidden = !isHtml || gContextMenu.onLink || gContextMenu.onTextInput; const linkItemHidden = !isHtml || !gContextMenu.onLink || gContextMenu.onTextInput; const pageItem = this.pageItem; for (let i = 0, l = pageItem.length; i < l; i++) { pageItem[i].hidden = pageItemHidden; } const linkItem = this.linkItem; for (let i = 0, l = linkItem.length; i < l; i++) { linkItem[i].hidden = linkItemHidden; } }, handleEvent: function(event) { if (event.type === "command") { const [ method, key ] = JSON.parse(event.originalTarget.getAttribute("value")); const url = method === "openPage"? gBrowser.currentURI.spec: gContextMenu.linkURL; this.launch(BrowserPath[key], url); } }, launch: function(browserPath, openURL) { let [ path, args ] = browserPath.split("<>"); if (args) { args = args.split("^^").map(a => a.replace("$1", openURL)); } else { args = [ openURL ]; } const file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); file.initWithPath(path); const process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); process.init(file); process.run(false, args, args.length, {}); }, }; OpenWith.start(); })();
Отсутствует