И все-таки продолжу еще:
1) как добавить путь к иконке, напр. "D:\\temp\\ico.dll" iconId=3 ?
2) как будет выглядеть код кнопки копирующей, перемещающей и удаляющей файл
Отредактировано ruslaw (27-06-2020 01:19:57)
Отсутствует
Dumby
Возможно ли сделать для 68+ "в виде кнопки CB или скрипта для...", очистку хвостов -> (Profile/extensions/staged, trash; Profile/browser-extension-data; Profile/storage/default) после удаления расширения ?
Win7
Отсутствует
И все-таки продолжу еще:
1) как добавить путь к иконке, напр. "D:\\temp\\ico.dll" iconId=3 ?
А что, по ссылке что-то непонятное написано?
И «напр.» какой-то странный, у меня такой dll'ки нет.
var shortcut = FileUtils.File("D:\\Мое хранилище\\Тест.lnk") .QueryInterface(Ci.nsILocalFileWin); var trg = FileUtils.File("C:\\Мой файл.txt"); var icon = Services.dirsvc.get("SysD", Ci.nsIFile); icon.append("imageres.dll"); shortcut.setShortcut(trg, null, null, null, icon, 102);
2) как будет выглядеть код кнопки копирующей, перемещающей и удаляющей файл
Если внимательно прочитать про nsIFile, и вдумчиво применить,
то код кнопки, скорее всего, будет выглядеть хорошо.
Возможно ли сделать для 68+ "в виде кнопки CB или скрипта для...", очистку хвостов -> (Profile/extensions/staged, trash; Profile/browser-extension-data; Profile/storage/default) после удаления расширения ?
Звучит как малополезная и небезопасная затея.
Но если хочешь нахлобучить какой-нибудь тестовый
неповседневный браузер, тогда попробуй в custom_script.js
(trash не вписал, не знаю что надо сделать,
чтобы эта папка в extensions нарисовалась).
try {(g => g.AddonManager.addAddonListener({ get staged() { var prof = this.storage = Services.dirsvc.get("ProfD", Ci.nsIFile); var staged = prof.clone(); ["extensions", "staged"].forEach(staged.append); (this.data = prof.clone()).append("browser-extension-data"); ["storage", "default"].forEach(prof.append); delete this.staged; return this.staged = staged; }, onUninstalling(addon) { if (addon.type == "extension" && addon.isWebExtension) try { this.uuids = JSON.parse(Services.prefs.getStringPref( "extensions.webextensions.uuids", "{}" )); } catch {this.uuids = {};} }, onUninstalled(addon) { if (addon.type != "extension") return; var {id} = addon; this.remove(this.staged, id, true); if (!Array.from(this.staged.directoryEntries).length) try {this.staged.remove(false);} catch {} if (!addon.isWebExtension) return; this.remove(this.data, id, true); var uuid = this.uuids[id]; uuid && this.remove(this.storage, "moz-extension+++" + uuid); }, remove(dir, str, once) { if (!dir.exists()) return; var trg = once ? this.eq : this.sw; for(var entry of dir.directoryEntries) if (trg(entry.leafName, str)) try {entry.remove(true);} finally {if (once) break;} }, eq: (str1, str2) => str1 == str2, sw: (str1, str2) => str1.startsWith(str2) }))(Cu.import("resource://gre/modules/AddonManager.jsm", {}));} catch (ex) {Cu.reportError(ex);}
Отсутствует
«Merge Day»
custom_buttons-0.0.7.0.0.15-fx-paxmod.xpi
custom_buttons-0.0.7.0.0.15-fx-bootstrap.xpi
[?] Custom Buttons для Thunderbird 78
Только для TB, и только для 78.
custom_buttons-78.0-tb.xpi
Да, и DOMi 7.0.7 тоже можно
попробовать поставить (paxmod, разумеется).
Отсутствует
Dumby
Этот код упал
// Проверка орфографии addEventListener('click', e=> { if ( e.target.tagName && (e.target.tagName == 'TEXTAREA'|| e.target.tagName == 'INPUT')) e.target.setAttribute('spellcheck', 'true'); }, content.document.body);
Отсутствует
Этот код упал
С чего бы ему упасть?
Разве что только однопроцессный режим слетел.
И что там за странный замысел, что третий аргумент
функции addEventListener() должен от чего-то зависеть,
да ещё и приколачивать ссылку на боди (if any) в _handlers?
Убери content.document.body
Отсутствует
Dumby
Гуд...Не в курсе, что там с поисковиками понакрутили? Вставляю от 77 search-extensions и не фига...Google и Mailru , а остальные не того...
И youtube - cходу запускается, автовоспроизведение - прибито (5) , что за мансы?
Отредактировано solombala (29-06-2020 23:27:54)
Отсутствует
Не в курсе, что там с поисковиками понакрутили? Вставляю от 77 search-extensions и не фига...Google и Mailru , а остальные не того...
Откуда же, я таким не занимаюсь.
Дефолтное значение настройки browser.search.modernConfig изменили.
Если имеется в виду папка resource:///chrome/browser/search-extensions/
то, если её выложишь, тогда попробую подменить, посмотрю в консоль,
может что-нибудь обнаружится. Без эксперимента на практике никак.
Отсутствует
Добрый день. Просьба починить код кнопки, под FF60.0 ESR . С тройной функцией кнопки 1-е, исходное-"Без прокси" , 2-е, нажатие-"Ручная настройка прокси", 3-е ,нажатие-"URL автоматической настройки прокси" . Сама кнопка работает ,но при нажатии не меняет отображение состояния на самой кнопке, там под каждое состояние своя иконка и сама иконка блёклая.
Заранее спасибо.
/*Initialization Code*/ // Proxy, от 25.02.2016. // Настройка функций кликов мыши для кнопки ................... this.onmousedown =e=> { this.onmouseup =e=>{ // левый клик if ( e.button ) return; clearTimeout(self.timer); switch( cbu.getPrefs("network.proxy.type") ) { case 0: var data = 1; break; case 1: var data = 2; break; case 2: var data = 0; break; default: var data = 0; } cbu.setPrefs("network.proxy.type", data); } if ( e.button == 0 ) // длинный левый клик self.timer = setTimeout(()=>{ self.onmouseup = ''; cbu.getPrefs("CB.Proxy.connectionsInTab") ? openConnectionsInTab() : openConnections(); }, 500); if ( e.button == 2 ) // правый клик menuPopup.showPopup(self, -1, -1, "popup", "bottomleft", "topleft"); }; self.onclick =e=> e.preventDefault(); // Подсказка для кнопки ................... this.onmouseover =()=> { this.tooltipText = "Proxy \nЛ: Переключить прокси \nДЛ: Открыть настройки прокси" + "\nП: Mеню кнопки \n\nТекущие настройки прокси: " + "\nIP: " + Services.prefs.getComplexValue("network.proxy.http", Ci.nsISupportsString).data + "\nПорт: "+ cbu.getPrefs("network.proxy.http_port"); }; // Создать меню для кнопки ................... var array = [ { label: "Добавление прокси в контекстом меню", value: 'CB.Proxy.inContextMenu' }, { label: "Открывать настройки прокси как вкладку", value: 'CB.Proxy.connectionsInTab' }, { label: "Переключать на режим 'Без прокси' при закрытии браузера ", value: 'CB.Proxy.reset' } ]; var menuPopup = document.getElementById('mainPopupSet').appendChild(document.createElement("menupopup")); array.forEach((m)=> { var mItem = document.createElement("menuitem"); mItem.setAttribute("label", m.label); mItem.setAttribute('type', 'checkbox'); mItem.setAttribute('checked', cbu.getPrefs(m.value) ); mItem.onclick =()=> cbu.setPrefs(m.value, !cbu.getPrefs(m.value)); menuPopup.appendChild(mItem); }); addDestructor(()=> menuPopup.remove() ); // добавить стандартное контекстное меню menuPopup.appendChild(document.createElement("menuseparator")); menuPopup.appendChild(document.createElement("menu")).setAttribute("label", "Меню кнопки"); var clone = menuPopup.lastChild.appendChild(document.getElementById("custombuttons-contextpopup").cloneNode(true)); clone.setAttribute("onpopupshowing", "document.popupNode = document.getElementById('" + _id + "')"); // Функция открывает настройки прокси в окне ................... function openConnections() { for ( var win, nm = Services.wm.getEnumerator(null); win = nm.getNext(); ) if ( win.name == 'Proxy') { win.focus(); break; } var win = openDialog("chrome://browser/content/preferences/connection.xul", "Proxy", "centerscreen"); // добавить атрибут "prefwindow" win.addEventListener("load", function f(e) { this.removeEventListener("load", f, true); e.target.documentElement.setAttribute("type", "prefwindow"); }, true ); // закрыть настройки прокси по клику на странице gBrowser.addEventListener("click", function c() { this.removeEventListener("click", c ); try { win.close() } catch(e) {}; }, true ); }; // Функция открывает настройки прокси в вкладке ................... function openConnectionsInTab() { var connections = gBrowser.getBrowserForTab( gBrowser.selectedTab = gBrowser.addTab("chrome://browser/content/preferences/connection.xul") ); // oбработчик ждет пока откроется прокси, удаляет себя и добавляет атрибут connections.addEventListener("pageshow", function c(e) { this.removeEventListener(e.type, c); e.originalTarget.documentElement.setAttribute("type", "prefwindow"); }) }; // Установливать нужную иконку кнопки при старте баузера или при изменениях в 'about:config' ................... var s = "network.proxy.type"; function toggleImage() { var icon = self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon"); switch( cbu.getPrefs(s) ) { case 0: icon.src = self.image; break; case 1: icon.src = 'data:image/png;base64,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'; break; case 2: icon.src = 'data:image/gif;base64,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'; break; default:icon.src = self.image; } }; toggleImage(); gPrefService.addObserver(s, toggleImage, false); addDestructor(()=> gPrefService.removeObserver(s, toggleImage) ); // Переключать на режим 'Без прокси' при закрытии браузера если это разрешено в 'about:config' ................... var switchOffProxy = { observe: function(subject, topic, data) { if ( data == "shutdown" && cbu.getPrefs("CB.Proxy.reset") ) cbu.setPrefs("network.proxy.type", 0); } }; Services.obs.addObserver(switchOffProxy, "quit-application", false); // Создаем меню для добавление прокси в контекстном меню выделенного текста на странице ................... ((contextMenu)=> { // создать новый пункт меню var menuitem = contextMenu.appendChild( document.createElement("menuitem") ); menuitem.setAttribute("label", "Добавить прокси"); menuitem.setAttribute("class", "menuitem-iconic"); menuitem.setAttribute("image", self.image); menuitem.onclick =()=> addNewProxy(); addDestructor(()=> menuitem.remove() ); // устанавливаем где показывать пункт меню addEventListener("popupshowing", ()=>{ menuitem.hidden = !cbu.getPrefs("CB.Proxy.inContextMenu") || !gContextMenu.isContentSelected; // !gContextMenu.isTextSelected; }, false, contextMenu); // добавление прокси function addNewProxy(sel) { var selection = document.commandDispatcher.focusedWindow.getSelection().toString(); var sel = ( sel == undefined ) ? selection : sel.toString(); sel = sel.replace(/^\s+|\s+$/g, ""); // удалить пробелы, слева и справа от строки sel = sel.replace(/\s+/g,":"); // заменить пробелы внутри строки // если только порт ... if ( sel.length < 6 && isFinite(sel) ) { sel = sel.replace(/:/g, ""); var lab = 'порт'; cbu.setPrefs("network.proxy.http_port", +sel); } // если только адрес ... if ( sel.length > 5 && !/:/.test(sel) && sel.split(".").length == 4 ) { var lab = 'адрес'; cbu.setPrefs("network.proxy.http", convertFromUnicode("UTF-8", sel)); } // если адрес и порт ... if ( sel.length > 5 && /:/.test(sel) && sel.split(":").length == 2 && sel.split(".").length == 4 ) { var lab = 'адрес и порт'; var array = sel.split(":"); array.forEach((str)=> addNewProxy(str) ); } if ( lab == undefined ) return; // всплывающая подсказка рядом с выделенным текстом ... function showTooltip() { var tooltip = gBrowser.appendChild( document.createElement("tooltip") ); tooltip.style.cssText = "color: red !important; font-weight: bold !important; font-size: 14px !important; -moz-box-orient: horizontal; text-align: center;"; var image = tooltip.appendChild( document.createElement("image") ); image.setAttribute("src", self.image); var label = tooltip.appendChild( document.createElement("label")); label.setAttribute("value", "Установлен " + lab + " прокси: " + sel); var focused = document.commandDispatcher.focusedWindow; var selection = focused.getSelection().getRangeAt(0).getBoundingClientRect(); var posX = focused.mozInnerScreenX + selection.left; var posY = focused.mozInnerScreenY + selection.bottom - 5; tooltip.showPopup(gBrowser, posX, posY); setTimeout(()=> gBrowser.removeChild(tooltip), 3000); }; showTooltip(); }; })(document.getElementById("contentAreaContextMenu"));
Отсутствует
о, кстати, да. у меня тоже кнопка "прокси" не совсем работает. ну свои функции выполняет штатно, то есть переключает настройки прокси, а остальное так себе. при попытке открыть настройки прокси выводит вот такое
саму кнопку взял ессно из этой темы, она столько раз менялась, конкретную редакцию кнопки даже не помню, код такой
/*Initialization Code*/ // Настройка функций кликов мыши для кнопки ................... this.onmousedown = e => { if (e.button == 0) // длинный левый клик self.timer = setTimeout(() => { self.onmouseup = null; cbu.getPrefs("CB.Proxy.connectionsInTab") ? openConnectionsInTab() : openConnections(); }, 500); this.onmouseup = e => { // левый клик if (e.button) return; clearTimeout(self.timer); switch(cbu.getPrefs("network.proxy.type")) { case 0: var data = 1; break; case 1: var data = 2; break; case 2: var data = 0; break; default: var data = 0; } cbu.setPrefs("network.proxy.type", data); } } // правый клик this.oncontextmenu = e => e.detail == 2 && !menuPopup.hidePopup() || e.ctrlKey || !!menuPopup.openPopup(this, "after_start"); // Подсказка для кнопки ................... this.onmouseover = () => this.tooltipText = "Proxy \nЛ: Переключить прокси \nДЛ: Открыть настройки прокси" + "\nП: Mеню кнопки \nДП: CB меню \n\nТекущие настройки прокси: " + "\nIP: " + cbu.getPrefs("network.proxy.http") + "\nПорт: " + cbu.getPrefs("network.proxy.http_port"); // Создать меню для кнопки ................... var array = [ {label: "Добавление прокси в контекстом меню", value: 'CB.Proxy.inContextMenu'}, {label: "Открывать настройки прокси как вкладку", value: 'CB.Proxy.connectionsInTab'}, {label: "Переключать на режим 'Без прокси' при закрытии браузера ", value: 'CB.Proxy.reset'} ]; var menuPopup = document.getElementById('mainPopupSet').appendChild(document.createElementNS(xulns, "menupopup")); array.forEach(m => { var mItem = document.createElementNS(xulns, "menuitem"); mItem.setAttribute("label", m.label); mItem.setAttribute("type", "checkbox"); mItem.setAttribute("checked", cbu.getPrefs(m.value)); mItem.onclick = () => cbu.setPrefs(m.value, !cbu.getPrefs(m.value)); menuPopup.appendChild(mItem); }); addDestructor(() => menuPopup.remove()); var listenClick = win => { var args = ["click", win.close.bind(win), true]; var unload = () => gBrowser.removeEventListener(...args); gBrowser.addEventListener(...args); win.addEventListener("unload", unload, {once: true}); } var version = parseInt(Services.appinfo.platformVersion); var url = `chrome://browser/content/preferences/connection.x${version >= 72 ? "htm" : "u"}l`; var fox73 = version >= 73, noop = () => {}; if (fox73) var grid = win => { var url = "data:text/css;charset=utf-8," + encodeURIComponent(` #proxy-grid, #dnsOverHttps-grid { display: grid; grid-template-columns: auto 1fr; align-items: center; } #proxy-grid > .thin { grid-column-end: 3; height: 20px; } #dnsOverHttps-grid.custom-container-hidden #networkCustomDnsOverHttpsInput, #dnsOverHttps-grid.custom-container-hidden #networkCustomDnsOverHttpsInputLabelContainer { display: none; } `); (grid = win => win.windowUtils.loadSheetUsingURIString(url, win.windowUtils.AUTHOR_SHEET))(win); } var winOpen = win => win.addEventListener("readystatechange", winReady, {once: true, capture: true}); var winReady = e => { var win = e.target.ownerGlobal, cw = win.isChromeWindow; if (cw || (win.location == url && !win.docShell.name)) winPatch(win, cw); } var winPatch = (win, cw) => { win.opener = {gSubDialog: {_dialogs: [{ _frame: {get contentDocument() { cw && listenClick(win); delete this.contentDocument; return this.contentDocument = win.document; }}, resizeVertically: cw ? () => win.sizeToContent() : noop }]}}; fox73 && grid(win); } addEventListener("MozBeforeInitialXULLayout", winReady, false, gBrowser.tabpanels || 1); for(var {contentWindow: win} of gBrowser.browsers) win && win.location == url && !win.opener && winPatch(win); // Функция открывает настройки прокси в окне ................... function openConnections() { var win = [...Services.wm.getEnumerator(null)].find(w => w.location == url); win ? win.focus() : winOpen(openDialog(url, "Proxy", "centerscreen")); } // Функция открывает настройки прокси в вкладке ................... function openConnectionsInTab() { var connections = gBrowser.getBrowserForTab( gBrowser.selectedTab = gBrowser.addTrustedTab(url) ); // oбработчик ждет пока откроется прокси, удаляет себя и добавляет атрибут connections.addEventListener("pageshow", e => e.target.documentElement.setAttribute("type", "prefwindow") , {once: true}); } // Установливать нужную иконку кнопки при старте баузера или при изменениях в 'about:config' ................... var s = "network.proxy.type"; function toggleImage() { var {icon} = self; switch( cbu.getPrefs(s) ) { //case 0: icon.src = self.image; break; case 1: icon.src = 'data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAA4GQAAnFmkAHQ5fAAQAKAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgICAgICAgICAgMBAQEAAAQBJBFQOLQ+nX38ecev/mu6of8gfFvtAyUXewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMLUza7PKd//3S7oP2849X9zuvh/mW4mf4XiV7/AB4QZwAAAAAAAAAAAQEBAQAAAAAZGhgTKSwnLyYqJDErKCUnID8vXgaAUP9BlnH8b7ea/ojHrv+q2sf/a7CT+zGWbf8PakXGAAIAAAEBAQMHBwcbAAAAD2BiXn76/ff/4ebg/Onm4f+DtZ7/A31L/j2Wb/+Fwaj/ls23/7rh0v9+vaT+M5du/xKGWO0DIxIdAAAAAAEBAQEAAAABBgYFEaSmorbP08z239vX/4OwnP4ail3/RJlz/5HHsP/T7+X/ms64/3K2mP40k2r/D3tM7AUiExwhIx8meXt1mXt+eKJ3eXSce353n6esouDMysf/o7eq/kOdeP92uZv/vuPT/9Hs4P/C4tT/eLWa+juWbv8bcEq7AAYBAF1gWn7//////f39/P//////////////////////////lcKx/3i9pf/K7OD/2O/l/7ndzf6Fw6n/VK+I/AsxHj8AAAAAXF5bf+Ln2P+AnU/4fZ1N+4WiV/yKp13+jKlh/5CsZf+GpFj/Zpxh/4C5nf+i0L7+k8ex/1udf+UTOCZFAAAAAAEBAQJfYF5/3uXR/16IIPxciiH/Z5Iv/26YOP9ymz3/cpw+/3OcPf9wlzb/YI80/1mKNPu707X/YmZjiAAAAAAEBAQGAAAAAF9gXoDg5tT/cJU6/HGaPf9/pE3/hqtX/4uvXf+NsF7/iKxZ/4KoU/9+o0r/cpY6+9zjyf9ubm2JAAAAAAMEAwQAAAAAX2BegODm1P94nEX8e6JJ/4quXP+Vt2n/nb1z/6LBef+jwXz/ob96/527d/+NrGP71+HG/2praogAAAAABAQDBAAAAABfYF2A4ObU/4WlVvyPsmP/osB7/7HMj/+81J3/wdik/8DXo/+60pz/tc6X/6G6ffvY4sf/amtqiAAAAAAEBAMEAAAAAF9gXn/e5dL/n7l7/LLMk//B16X/zuG2/9jpwv/b68b/2enE/9Pkvv/Q4bv/uMud+9jhyP9qa2mHAAAAAAQEAwQAAAAAX2Bef97k0v+gt335sceT/LrNnfzC1Kj8ydmx/MzatfzK2bP8xtav/MbVr/ywwpL41+HH/2tsaokAAAAABAQDBAAAAABZW1Z3+fz1/+Dm1Pzj6db/5u3b/+nv3v/r8eD/6vDe/+ft2//k69j/4efT/9ngzPv7//b/ZGdhfwAAAAADBAMEAAAAABcZFRpZW1Z6YGFfgWBiYIBhYmGAYmJhgGJjYoBiY2KAYmJhgGFiYYBgYWCAX2BegF1fWoAbHRkeAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='; break; case 2: icon.src = 'data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAAcHQAAYGGkAEBBfAAEBKAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAQEAAgICAAICAgACAgMBAQEAAAEBJAA6OrQAf3/8ALCw/gCiov8AXl7tABkZewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMAOTm7AIOD/wCjo/0A1tb9AOHh/gCcnP4AY2P/ABISZwAAAAAAAAAAAAEBAQAAAAAAGBgTACgoLwAmJjEAJiYnADIyXgBWVv8Adnb8AJ2d/gCxsf8Aycn/AJeX+wBycv8ASkrGAAACAAABAQMABwcbAAAADwBfX34A+fn/AOHh/ADj4/8AoaH/AFJS/gB1df8Aq6v/ALm5/wDT0/8Ap6f+AHNz/wBeXu0AFRUdAAAAAAABAQEAAAABAAUFEQCjo7YAzs72ANnZ/wCfn/4AY2P/AHl5/wCzs/8A5ub/ALu7/wCcnP4AcHD/AFNT7AAVFRwAICAmAHd3mQB6eqIAdXWcAHl5nwClpeAAyMj/AK2t/gB9ff8An5//ANXV/wDh4f8A1tb/AJ6e+gB0dP8AUFC7AAEGAABcXH4A////AP39/AD///8A////AP///wD///8A////ALOz/wCnp/8A4eH/AObm/wDPz/4ArKz/AI2N/AAhIT8AAAAAAFxcfwDd3f8Aa2v4AGpq+wBycvwAeHj+AHt7/wB/f/8Ac3P/AHNz/wCiov8AwMD+ALS0/wCEhOUAKSlFAAAAAAABAQIAXl5/ANjY/wBGRvwARkb/AFJS/wBaWv8AX1//AF9f/wBfX/8AWVn/AFRU/wBRUfsAvr7/AGNjiAAAAAAABAQGAAAAAABeXoAA2tr/AFtb/ABeXv8AbGz/AHV1/wB6ev8Ae3v/AHd3/wBxcf8Aamr/AFtb+wDS0v8AbW2JAAAAAAADAwQAAAAAAF5egADa2v8AZGT8AGlp/wB5ef8AhYX/AI2N/wCTk/8AlJT/AJKS/wCPj/8AfX37AM/P/wBqaogAAAAAAAMDBAAAAAAAXl6AANra/wBycvwAf3//AJOT/wClpf8AsLD/ALa2/wC1tf8Ar6//AKqq/wCTk/sA0ND/AGpqiAAAAAAAAwMEAAAAAABeXn8A2dn/AJGR/ACnp/8At7f/AMXF/wDQ0P8A09P/ANHR/wDLy/8AyMj/AK2t+wDR0f8AaWmHAAAAAAADAwQAAAAAAF5efwDY2P8AkpL5AKWl/ACurvwAuLj8AL+//ADCwvwAwMD8AL29/AC8vPwAo6P4ANDQ/wBqaokAAAAAAAMDBAAAAAAAV1d3APf3/wDa2vwA3d3/AOHh/wDk5P8A5ub/AOTk/wDh4f8A39//ANra/wDT0/sA+fn/AGNjfwAAAAAAAwMEAAAAAAAWFhoAV1d6AF9fgQBgYIAAYWGAAGFhgABiYoAAYmKAAGFhgABhYYAAYGCAAF5egABbW4AAGhoeAAAAAAABAQEAAAAA/oOAQeEAgEH6AIBBoACAQQAAAEGAAABBAACAQQAAgEEAAQBBAAKAQQACgEEAAoBBAAKAQQACgEEAAoBBAAKAQQACgEE='; break; default: icon.src = self.image; } } toggleImage(); Services.prefs.addObserver(s, toggleImage, false); addDestructor(() => Services.prefs.removeObserver(s, toggleImage)); // Переключать на режим 'Без прокси' при закрытии браузера если это разрешено в 'about:config' ................... var toggleButton = { observe(s, t, data) { cbu.getPrefs("CB.Proxy.reset") && data == "shutdown" && cbu.setPrefs("network.proxy.type", 0); } }; Services.obs.addObserver(toggleButton, "quit-application", false); // Создаем меню для добавление прокси в контекстном меню выделенного текста на странице ................... var contextMenu = document.getElementById("contentAreaContextMenu"); var menuitem = document.createElementNS(xulns,"menuitem"); menuitem.setAttribute("label", "Добавить прокси"); menuitem.setAttribute("class", "menuitem-iconic"); menuitem.setAttribute("image", self.image); menuitem.onclick =()=> addNewProxy(menuitem); contextMenu.appendChild(menuitem); // как последний пункт меню addDestructor(() => menuitem.remove()); addEventListener("popupshowing", () => { menuitem.hidden = !cbu.getPrefs("CB.Proxy.inContextMenu") || !gContextMenu.isContentSelected; // !gContextMenu.isTextSelected; }, false, contextMenu); // добавление прокси ................... function addNewProxy(menuitem) { var sel = gBrowser.contentDocument ? gBrowser.contentDocument.defaultView.getSelection().toString() // Pale Moon : gContextMenu.selectionInfo.fullText; // Firefox sel = sel.replace(/^\s+|\s+$/g, ""); // удалить пробелы, слева и справа от строки sel = sel.replace(/\s+/g, ":"); // заменить пробелы внутри строки // если только порт ... if (sel.length < 6 && isFinite(sel)) { var lab = 'порт'; cbu.setPrefs("network.proxy.http_port", +sel); } // если только адрес ... if (sel.length > 5 && !/:/.test(sel) && sel.split(".").length == 4) { var lab = 'адрес'; cbu.setPrefs("network.proxy.http", convertFromUnicode("UTF-8", sel)); } // если адрес и порт ... if (sel.length > 5 && /:/.test(sel) && sel.split(":").length == 2 && sel.split(".").length == 4) { var lab = 'адрес и порт'; var arr = sel.split(":"), IP = arr[0], port = arr[1]; cbu.setPrefs("network.proxy.http_port", +port); cbu.setPrefs("network.proxy.http", convertFromUnicode("UTF-8", IP)); } // всплывающая подсказка рядом с выделенным текстом ... var mainPopupSet = document.getElementById('mainPopupSet'); var tooltip = mainPopupSet.appendChild(document.createElementNS(xulns,"tooltip")); tooltip.style.cssText = "color: red !important; font-weight: bold !important; font-size: 14px !important; -moz-box-orient: horizontal; text-align: center;"; var image = tooltip.appendChild(document.createElementNS(xulns, "image")); image.setAttribute("src", self.image); var label = tooltip.appendChild(document.createElementNS(xulns, "label")); label.setAttribute("value", "Установлен " + lab + " прокси: " + sel); tooltip.openPopup(menuitem.parentNode, "before_start"); setTimeout(() => mainPopupSet.removeChild(tooltip), 3000); }; // Конвертировать текст в юникод ............. function convertFromUnicode(charset, str) { var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); converter.charset = charset; str = converter.ConvertFromUnicode(str); return str + converter.Finish(); }
FF 78 ESR
Отредактировано sonyas75 (01-07-2020 09:38:42)
Отсутствует
На 78 версии перестал работать Custom Buttons (custom_buttons-0.0.7.0.0.9-fx-paxmod). Хотя в дополнениях значится. Все кнопки исчезли. На попытку добавить новую кнопку выходит вот это:
Может кто знает как исправить?
Windows 10 LTSC
Отсутствует
Может кто знает как исправить?
Отсутствует
https://forum.mozilla-russia.org/viewto … 38#p782238
Не помогло... Всё по прежнему не работает...
Windows 10 LTSC
Отсутствует
vending_machine пишетhttps://forum.mozilla-russia.org/viewto … 38#p782238
Не помогло... Всё по прежнему не работает...
Надо очистить startupCache из локального каталога и перегрузить
Отредактировано vending_machine (01-07-2020 10:20:07)
Отсутствует
Надо очистить startupCache из локального каталога и перегрузить
Ура, заработало! Сенькаю!
p.s. Как же надоело всё налаживать при переходе на новую версию. Иногда начинаешь понимать тех знакомых, которые ненавидят Мозиллу...
Windows 10 LTSC
Отсутствует
Сама кнопка работает ,но при нажатии не меняет отображение состояния на самой кнопке, там под каждое состояние своя иконка и сама иконка блёклая.
... //+ "\nIP: " + Services.prefs.getComplexValue("network.proxy.http", Ci.nsISupportsString).data + `\nIP: ${Services.prefs.getStringPref("network.proxy.http") || "< empty string >"}` ... //gPrefService.addObserver(s, toggleImage, false); //addDestructor(()=> gPrefService.removeObserver(s, toggleImage) ); Services.prefs.addObserver(s, toggleImage); addDestructor(() => Services.prefs.removeObserver(s, toggleImage));
при попытке открыть настройки прокси выводит вот такое
//var url = `chrome://browser/content/preferences/connection.x${version >= 72 ? "htm" : "u"}l`; var url = `chrome://browser/content/preferences/${version >= 77 ? "dialogs/" : ""}connection.x${version >= 72 ? "htm" : "u"}l`;
Отсутствует
Вопрос не совсем по теме.
Возможность назначать для определенных сайтов свой UserAgent в крайних версиях выпилили окончательно?
Теперь для этого придется использовать только дополнения или все-таки возможно как-то реализовать это с помощью СВ?
«The Truth Is Out There»
Отсутствует
Dumby что-то на 78 кнопка - консоль браузера не хочет работать.
Выдает ошибку: Uncaught (in promise) TypeError: Cu.isCrossProcessWrapper is not a function) в строчке if (!doc || Cu.isCrossProcessWrapper(doc) || doc.documentURI != this.url) return;
Отсутствует
Dumby
Недьзя код рестарта подрихтовать? папки создаются при перезапуске в user/администратор , как будто это не портабл...
var appStartup = Components.classes["@mozilla.org/toolkit/app-startup;1"] .getService(Components.interfaces.nsIAppStartup); var num = gBrowser.browsers.length; var dlg = "Есть открытые вкладки !" + "\nПерезапустить браузер ?"; if (num > 0) { var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] .getService(Components.interfaces.nsIPromptService); Services.appinfo.invalidateCachesOnRestart(); var RestartProceed = prompts.confirm(null, "", dlg); if (RestartProceed) { appStartup.quit(appStartup.eForceQuit | appStartup.eRestart); } } else appStartup.quit(appStartup.eForceQuit | appStartup.eRestart);
Отредактировано solombala (02-07-2020 23:48:09)
Отсутствует