Вобщем, переделал. Надо смотреть не испортил ли чего.
Всё прекрасно работает. Огромное спасибо.
Содержимое файла можно было разместить там же, внутри кода.
Напрямую как `строку`, но там много экранировать нужно,
или как тело функции и дальше func.toString().slice(N, -M);
Что-то я не очень понимаю, как это реализовать на практике.
Если не очень сложно, можете в качестве примера показать оба этих варианта.
«The Truth Is Out There»
Отсутствует
можете в качестве примера показать оба этих варианта
Ну, записать каждый из них можно ведь по-разному, навскидку:
cразу строка
(async initCode => CustomizableUI.createWidget({ id: "0123456789", label: "0123456789", defaultArea: CustomizableUI.AREA_NAVBAR, localized: false, onCreated(btn) { btn.setAttribute("image", "resource://usercontext-content/fence.svg"); new btn.ownerGlobal.Function(initCode).call(btn); } }))(`(u => { var id, lfs = url => gBrowser.selectedBrowser.messageManager.loadFrameScript(url, false); var max = () => { var url = u([ "var args = [scroller.scrollHeight, 0];", "scroller.scrollTop != 0 || args.reverse();", "content.scrollTo(...args);" ].join("\\n\\t")); (max = () => lfs(url))(); } var mid = () => { var url = u("content.scrollTo(0, (scroller.scrollHeight - scroller.clientHeight) / 2);"); (mid = () => id = lfs(url))(); } var obj = { mousedown: () => id = setTimeout(mid, 500), mouseup: () => id && max(id = clearTimeout(id)) }; this.onmousedown = this.onmouseup = e => e.button || obj[e.type](); this.tooltipText = "Л: Вверх/Вниз по странице \\nдЛ: Центрирование страницы"; }) (code => "data:," + encodeURIComponent(\`(doc => { var root = doc.documentElement; var body = doc.body || root; var scroller = body.scrollHeight > root.scrollHeight ? body : root; \${code} })(content.document)\`));`);
(async initCode => CustomizableUI.createWidget({ id: "0123456789", label: "0123456789", defaultArea: CustomizableUI.AREA_NAVBAR, localized: false, onCreated(btn) { btn.setAttribute("image", "resource://usercontext-content/fence.svg"); new btn.ownerGlobal.Function(initCode).call(btn); } }))((() => { (u => { var id, lfs = url => gBrowser.selectedBrowser.messageManager.loadFrameScript(url, false); var max = () => { var url = u([ "var args = [scroller.scrollHeight, 0];", "scroller.scrollTop != 0 || args.reverse();", "content.scrollTo(...args);" ].join("\n\t")); (max = () => lfs(url))(); } var mid = () => { var url = u("content.scrollTo(0, (scroller.scrollHeight - scroller.clientHeight) / 2);"); (mid = () => id = lfs(url))(); } var obj = { mousedown: () => id = setTimeout(mid, 500), mouseup: () => id && max(id = clearTimeout(id)) }; this.onmousedown = this.onmouseup = e => e.button || obj[e.type](); this.tooltipText = "Л: Вверх/Вниз по странице \nдЛ: Центрирование страницы"; }) (code => "data:," + encodeURIComponent(`(doc => { var root = doc.documentElement; var body = doc.body || root; var scroller = body.scrollHeight > root.scrollHeight ? body : root; ${code} })(content.document)`)); }).toString().slice(9, -3));
Отсутствует
Ну, записать каждый из них можно ведь по-разному, навскидку:
Большое спасибо. Теперь более или менее понятно.
«The Truth Is Out There»
Отсутствует
Dumby
Подскажите пожалуйста, возможно ли в UCF реализовать что-то подобное:
var switchOff = { observe: function(subject, topic, data) { if ( data == "shutdown" ) cbu.setPrefs("network.proxy.type", 0); } } Services.obs.addObserver(switchOff, "quit-application", false); ------------------------------------------------------------------------------- function funcDefault() { .......... } var switchOff = { observe: function(subject, topic, data) { if ( data == "shutdown" ) funcDefault(); } } Services.obs.addObserver(switchOff, "quit-application", false);
«The Truth Is Out There»
Отсутствует
возможно ли
А откуда сомнение?
Оба примера вобщем-то одинаковые, и должны работать
(cbu только от Custom Buttons, но это дело десятое).
Вот, например, добавил в custom_script.js, и результат есть.
var switchOff = { observe(subject, topic, data) { Services.obs.removeObserver(this, topic); //if (data == "shutdown") Services.prefs.setStringPref( "+++TEST+++.quit-application", data + " " + new Date().toLocaleString("mn") ); } }; Services.obs.addObserver(switchOff, "quit-application");
Отсутствует
А откуда сомнение?
Оба примера вобщем-то одинаковые, и должны работать
(cbu только от Custom Buttons, но это дело десятое).
Вот, например, добавил в custom_script.js, и результат есть.
Dumby, большое спасибо.
«The Truth Is Out There»
Отсутствует
Dumby
Если не сложно, переделайте кнопочку для UCF.
/*Initialization Code*/ // Compact Menu .......... // Dumby: https://forum.mozilla-russia.org/viewtopic.php?pid=792206#p792206 ..... this.parentNode.nodeName == "toolbarpaletteitem" || (icons => { this.type = "menu"; var bar = document.getElementById("main-menubar"); var menupopup = document.createXULElement("menupopup"); menupopup.toggleAttribute("context"); this.prepend(menupopup); var move = (from, to, ico) => { from.querySelector("#bookmarksMenu")._placesView?.uninit(); for(var menu of Array.from(from.children)) { var popup = menu.menupopup; popup.remove(); menu.textContent = menu.renderedOnce = ""; if (ico) { var img = icons[menu.id]; if (img) menu.className = "menu-iconic", menu.setAttribute("image", img); } else menu.removeAttribute("class"), menu.removeAttribute("image"); to.append(menu); menu.render(); menu.append(popup); } } move(bar, menupopup, true); addDestructor(() => move(menupopup, bar)); })({ "file-menu": "chrome://browser/content/robot.ico", "edit-menu": "chrome://browser/skin/preferences/face-smile.svg", "view-menu": "chrome://browser/skin/preferences/face-sad.svg", "history-menu": "chrome://browser/content/robot.ico", "bookmarksMenu": "chrome://browser/skin/preferences/face-smile.svg", "tools-menu": "chrome://browser/skin/preferences/face-sad.svg", "helpMenu": "chrome://browser/content/robot.ico" });
«The Truth Is Out There»
Отсутствует
unter_officer
(async icons => CustomizableUI.createWidget({ id: "797097", label: "Compact Menu", tooltiptext: "Compact Menu", localized: false, onCreated(btn) { btn.type = "menu"; btn.setAttribute("image", "resource://usercontext-content/briefcase.svg"); var doc = btn.ownerDocument; var menupopup = doc.createXULElement("menupopup"); menupopup.toggleAttribute("context"); btn.prepend(menupopup); var bar = doc.getElementById("main-menubar"); bar.querySelector("#bookmarksMenu")._placesView?.uninit(); for(var menu of Array.from(bar.children)) { var popup = menu.menupopup; popup.remove(); menu.textContent = menu.renderedOnce = ""; var img = icons[menu.id]; if (img) menu.className = "menu-iconic", menu.setAttribute("image", img); menupopup.append(menu); menu.render(); menu.append(popup); menu.disabled = false; } } }))({ "file-menu": "chrome://browser/content/robot.ico", "edit-menu": "chrome://browser/skin/preferences/face-smile.svg", "view-menu": "chrome://browser/skin/preferences/face-sad.svg", "history-menu": "chrome://browser/content/robot.ico", "bookmarksMenu": "chrome://browser/skin/preferences/face-smile.svg", "tools-menu": "chrome://browser/skin/preferences/face-sad.svg", "helpMenu": "chrome://browser/content/robot.ico" });
Отсутствует
unter_officer
скрытый текстВыделить кодКод:
(async icons => CustomizableUI.createWidget({ id: "797097", label: "Compact Menu", tooltiptext: "Compact Menu", localized: false, onCreated(btn) { btn.type = "menu"; btn.setAttribute("image", "resource://usercontext-content/briefcase.svg"); var doc = btn.ownerDocument; var menupopup = doc.createXULElement("menupopup"); menupopup.toggleAttribute("context"); btn.prepend(menupopup); var bar = doc.getElementById("main-menubar"); bar.querySelector("#bookmarksMenu")._placesView?.uninit(); for(var menu of Array.from(bar.children)) { var popup = menu.menupopup; popup.remove(); menu.textContent = menu.renderedOnce = ""; var img = icons[menu.id]; if (img) menu.className = "menu-iconic", menu.setAttribute("image", img); menupopup.append(menu); menu.render(); menu.append(popup); menu.disabled = false; } } }))({ "file-menu": "chrome://browser/content/robot.ico", "edit-menu": "chrome://browser/skin/preferences/face-smile.svg", "view-menu": "chrome://browser/skin/preferences/face-sad.svg", "history-menu": "chrome://browser/content/robot.ico", "bookmarksMenu": "chrome://browser/skin/preferences/face-smile.svg", "tools-menu": "chrome://browser/skin/preferences/face-sad.svg", "helpMenu": "chrome://browser/content/robot.ico" });
Dumby, большое спасибо.
«The Truth Is Out There»
Отсутствует
Dumby
Я у себя переделываю кнопочку под UCF.
В общем сама кнопка нормально работает:
// Переключить прокси .......... try { ((id, label, tooltiptext, timeout, pref, img, img1, img2) => { CustomizableUI.createWidget({ id: id, label: label, tooltiptext: tooltiptext, localized: false, // defaultArea: CustomizableUI.AREA_NAVBAR, onCreated: function(btn) { if (Services.prefs.getIntPref(pref) == 1) { btn.setAttribute("image", img1); } else if (Services.prefs.getIntPref(pref) == 2) { btn.setAttribute("image", img2); } else { btn.setAttribute("image", img); } }, onCommand: function(event) { switch(Services.prefs.getIntPref(pref)) { case 0: var data = 1; break; case 1: var data = 2; break; case 2: var data = 0; break; default: var data = 0; } Services.prefs.setIntPref(pref, data); }, }); Services.prefs.addObserver(pref, () => { var instances = CustomizableUI.getWidget(id).instances, image = Services.prefs.getIntPref(pref); switch(image) { case 0: image = img; break; case 1: image = img1; break; case 2: image = img2; break; default: image = img; } instances?.forEach?.(instance => { instance?.node?.setAttribute?.("image", image); }); }); })( "btn-toggle-proxy", "Прокси", "Переключить прокси", null, "network.proxy.type", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALPSURBVHjahFNLSFVRFF3nnnvfz1+YHzCk0CDLAougkJCiGgRBkDRooDUQJKJZwwY1kAaNm0REEvQhgoKiwcOBFEloKPQR01K0D+Qze/r0vXd/p3XuvVkp0b5szuWcfdZee+19xD2JuuZGnDbjiANQEAhMRKtSiH7Cf+UBo+O40e5iuoth17llEqBj6yB6nBF4sCBFjCcWL0k6LygnWgv0JbjxNphyHyFHcKkqjHJNGUPCfgVke+FZtYBRSi8jUIpuMsSPgMjCnoSnXOg7KfxhZkDdCKhK/WkQuZ5A60IQTV/l6S73MmG5jPVXgwh9kJ8CnDkgVg1YNbxQwYNExESXYpPJDJDYGegl1jDR5iyydJ2xyCKzBEnSqQ+MSBO6kwlBV9sKiMdsPmUSdF9TzwUcgzJ8auIT3GaiKiuIWcNE6Sz5bLhhLXOTDAzrd5DnhMCKLFyW5OYRND4W8oSpD3TtFfVweaSMBHW2YOhsutVeLgQq2w3EmyC9eaBkEzrS79F3eBlpzooRMInvBRqewxQy6Ptflr1CoB9AaXuQTLgTUKklDmgKTx8/wMGjRfSbHyZwN3UIGwiQZO02YWXpLhyIt2CjPQ6VG4BIbmE57JzB1osSCLJxip9h1dfhwuVJ9Ms7HuZyk3jS+REPq6bwrPU4OlOtaJY1sArDwOJbCE4qzBJqsI3iDlGTWRj2V7JaQoW9gNsGa5JMVEfm5Sd24FzlRRyR9YgFc2JAFBeop+4QgfJ9FL6RF8rDLprJoEvC5APyCPRFa/N6FFenq/FIhaovJy3sqaxFL4fL875TbGris4tuhuOvYBayGHvpYQb/MNEVrvJFJdKfjkFlznMW0/CKQ/C/nYU/1gJ1y0A3ore6Yvppt5EFm6Ufs7GdLIfzGGiYRWMygc3SgFEYhMj0Yf7NO/Sc9HCNdxz8x34xSrDT+++bOHNT4BT3mqKkgf0UYABF1AvLPG1k5wAAAABJRU5ErkJggg==", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAANkSURBVHjafFNNbFRVFP7uz/uZ6Qzz+kOpU7QWqVqsmoZoYSMiSsCFOzYkTVy60Lhg48KQGAPRuDDxZ2OMhoU/W1YkkKoNVRBiMPgzbWlKcFralHZeO5037+++dz3zphhg4c275973cs53vvOd85iQJ8q7hg6+bhuGBQbN0FoMrH2B1pnNTk1G0X1u+uJXKj79DzBMXhUtCWD88u9HT1294SfCYMK2GKRob9UKijVipRFEGk0vUYf2FuSB56S+/tvp94AuQRmUtKS0L0838enEUtLXa6OQE9jWIVGwOQzGkRJQFKcAPXMLfhIQvm3IfJunmVmZWU4+AgI2RN4R6C5JOEUJk9gkCbEIUsTEqLghNW+XmOKeJalUJkiAm4sNrDQD9Pbk0NtpwSlI5EyeaeEHCaIoRXU5wL7dBVIM7D6Qu28NL4SfRBl1dzNC3pYwCESQf0psEgKprQXQ93HAPeXQCoMYPGUQnEOpFE0jBuMkbtQqpc3EWw8zwYXgW7mj/0B0TJwbGx4FaYTNCKQ2hORZmzXaQNr3KSbGwlIDfhjqLWF5BpIQvw7BUe7roUam2rIMRmVwSsYkAXnNGBZqeGGkCyODjqjVaujfH4/PzL854bufXaBZ4VIzpl98Mo8bH++VQjDxYL0ffP031sMOHDsyCBpINlttaC+Oyrkdr5w7+1HtUFz/dlLOz179/qUjTj8B5FScRsLgYvT57QdH9zgDM4uu/mX+GntiaBfubMTYXuLosCWrrYbx7VurRt8zj75bncKkjMKTsz+d/+4NGl/K+6pz4p1Pvtk/1tnbWTRxaW4dyyt/ktAM/d1FvHZgJyq3XCRcSaUisPzKKLcO7yRhhqmEoTIhbBt59u23Tr4/eHTgEdMsddL0mWD1+kXdCvCoexeuLOHxh4so5SxIQyNXMEl6j1F3KgkB3G51afqvHz7vc/44q7WiKTObRmFzrGesdIamJXHrDW7bjLlehDuul2idyvpCNJOGP1e35qSStUypD9eUwhraE6kDH3Oicnx8z9PqZcvg6dhTO3R30WJT+URsbtzE8rUvz7TiHuhG69ceoBLLdJbpdJLA/fHS6uJDj9ld+d3CkvzK9UU2cW7KnTk/eSqNql9QUMzw/ytjRNum2z5hYzhVaOoYv9K36btO/wowAFoafTv9jJ+AAAAAAElFTkSuQmCC", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAADvklEQVR42nWUf0xbVRTHz333vddf0BaKQHGKZUxZcTg1CA5NBF3CFomJmmU6x5qZmKl/GDNj5x/adtFlsERJGWWw8UsgZFmmCckY2eYWmBto5ogDJ+lQWJuVHwGk/Oh4ffe+5+3LNJPMk9x3817O+b7POfecix6yZ2SVlpW5DKJOhxCoCBAAWyixMVNV7cl2FRS2iKrApYsXmyfDd0KIGfuuoh273nK3tLUeHp+ZpBzGWOAxYA4Dx3FaEKUUqEJBJhQkaZU4s3P4D/e9721pOOHDPOYpoQRVuvZ4PvnS4z013B9Pt6Zgo2gAk04PBkEHPMJMSAHml4CB8NwMKcx+Qtd+5Gh14GidG/M8EyH3RL7yeE+O9NFMmw2nmiyQYkyGJL0ReEakKArE5bhGFJqZIvnpj/Ft1f7D9XWBz/4V2e3a43Uf8nkOXuqkyclGnGm2QVqSBcx6E+h4QauFxERkIkNkdpZszyvi26v8VYG6wIH7SbyfMpGPe45RXsTYxgSSDSYwinoQmQhmRU7QMGeYjS6Qdwu38x3VtQ8Wee/7GooFhK1GMxh1Ok0AIU4jiJM43JUJLCwtk28qPuA7jvira/1+938Ku5/V5LV2L0WcghNpsOMGAfPaMauMRJIpKKsLALJEfNv28t/VdlU1NTYfYCAiA4mjXZXveD6vOuR19zRLDBobBT0SBYHjOQ6xH8HSagwMqxPwwiNZ4MjIUZfuRtH1m4ORruO9ruDg3HnWKhx627X7i86Wb30sb8p6A8Ma674cgGU5DCVPvc7ozDA1f1sdi1xD47NDNHDw7MuhoZU+lL3e8fiOnTv3Y8wZiEziiW7LL3iydMOjG7LDc7+r1yOtaP26Z6HYWc4KboPlWBSuDvfII7cvC2PBiQtnA3e2as19r31BEEVrU2tzp3NT/ksmvdVw5bcOtS9Yj9ItTnixoAIK88pgeHwAJqZG1Rt/9KPQ1K25ga7Y5kQ8FkUxU5Kk5cq9ro8ajjf6pqcnKQI9/mGoEU4PetVc+xb0fH45WJJS4OG0XLgx9qP6c/AMmvlrfP5cU3Tz/SRqZpbdZkm1rmOzwiFFiBkzVoocpZE2R3oJ3ego4NKsdmS35cC1m30kGLnKj478OXD+WHQLggcbSkw0yxA/94apd9ubT7/iSCtWCvPK2Tikot5f6uHKr92ou25630IIGtCaSM3+eWUqFLCaW/RqSs3Wik3lzzhLuMWlRXSu/8z8hZPhr6dv0RrmvfJ/JGuJ9KIZiq122MjaJrY4CT8BgVHt6mHT/Tcp4LzcDpfj/QAAAABJRU5ErkJggg==" ); } catch(e) { }
В СВ-кнопке tooltiptext переключается в зависимости от состояния прокси:
// Подсказка для кнопки ..... this.onmouseover =()=> { if (cbu.getPrefs("network.proxy.type") == 1) { statusPrefs = "Ручная настройка прокси" + "\nIP: " + cbu.getPrefs("network.proxy.http") + "\nПорт: "+ cbu.getPrefs("network.proxy.http_port"); } else if (cbu.getPrefs("network.proxy.type") == 2) { statusPrefs = "Автонастройка прокси"; } else { statusPrefs = "Без прокси"; } this.tooltiptext = " Переключить прокси \n--------------------------------\nТекущее состояние:\n" + statusPrefs; }
P.S. Вопрос снимается, сам сделал.
Отредактировано unter_officer (27-12-2021 16:17:49)
«The Truth Is Out There»
Отсутствует
Выделить кодКод:
this.onmouseover =()=> { if (cbu.getPrefs("network.proxy.type") == 1) { statusPrefs = "Ручная настройка прокси" + "\nIP: " + cbu.getPrefs("network.proxy.http") + "\nПорт: "+ cbu.getPrefs("network.proxy.http_port"); } else if (cbu.getPrefs("network.proxy.type") == 2) { statusPrefs = "Автонастройка прокси"; } else { statusPrefs = "Без прокси"; } this.tooltiptext = " Переключить прокси \n--------------------------------\nТекущее состояние:\n" + statusPrefs; }
если пятачок
значит это свин
иначе если хобот
значит это слон
иначе
это барсук, мы гарантируем это!
Отсутствует
в jsm-скрипте AppMenuTbbSaveHTMLChild не работает получение версии Firefox - как исправить?
var version = Services.appinfo.platformVersion.replace(/\..*/g,''); // нижеследующий код также не работает if ( parseInt(Services.appinfo.version) < 89 ) btn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAACNJREFUCNdjYH/AgBX9/89Q/4/B/g+D/A8G/g8gEeYDDIwNAIB7EDCcKCcMAAAAAElFTkSuQmCC");
Отсутствует
Азат55555 пишетЗдравствуйте. Нужно время от времени выделять текст в адресной строке, пожалуйста подскажите код. Заранее благодарю!
А именно эмулировать нажатие alt + d.
Этот код работает в firefox 56.0.2 https://www.cyberforum.ru/post12284523.html или нет?
Отсутствует
Dumby
Если не сложно, переделайте кнопочку для UCF.
// Показывать количество открытых табов в адресной строке .......... (function() { var tabCounter = document.createXULElement("button"); tabCounter.setAttribute("id", "tabCounter"); tabCounter.setAttribute("tooltiptext", "Количество открытых вкладок"); var urlbarIcons = document.getElementById("urlbar-icons") || document.getElementById("page-action-buttons"); // FF57 urlbarIcons.insertBefore(tabCounter, urlbarIcons.lastChild); addDestructor(()=> tabCounter.remove()); // Css стиль для счётчика .... var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); var uri = makeURI('data:text/css,'+ encodeURIComponent('\ #tabCounter { -moz-appearance: none !important; min-width: 42px !important; min-height: 22px !important; max-height: 22px !important; text-align: center !important; color: #000000 !important; background-color: #DBEAF9 !important; border-left: #B5C2D0 1px solid !important; padding: 0px 0px 0px 0px !important; margin: 0px 0px 0px 0px !important; }\ ')); sss.loadAndRegisterSheet(uri, 0); addDestructor(()=> sss.unregisterSheet(uri, 0) ); // Считать и показывать количество вкладок .... function count() { try { window.clearTimeout(count.timeout) } catch(e) {}; count.timeout = window.setTimeout(()=> { tabCounter.label = gBrowser.tabs.length; }, 350); }; count(); // Отслеживать открытие и закрытие вкладок .... var tabs = gBrowser.tabContainer; addEventListener("TabOpen", count, false, tabs); addEventListener("TabClose", count, false, tabs); })();
Отредактировано unter_officer (29-12-2021 05:39:20)
«The Truth Is Out There»
Отсутствует
unter_officer
Здесь-то что могло не получиться
(async style => { await document.documentReadyForIdle; var tabCounter = document.createXULElement("button"); tabCounter.id = "tabCounter"; tabCounter.setAttribute("tooltiptext", "Количество открытых вкладок"); var urlbarIcons = document.getElementById("page-action-buttons"); urlbarIcons.insertBefore(tabCounter, urlbarIcons.lastChild); var flag = "--reg-flag-ex"; if (!windowUtils.getVisitedDependentComputedStyle(tabCounter, "", flag)) { var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); var uri = Services.io.newURI("data:text/css," + encodeURIComponent( `@-moz-document url(${location}) {${ style.replace("{", `{\n\t\t${flag}: 1;`).replace(/;$/gm, " !important;") }}` )); sss.loadAndRegisterSheet(uri, sss.USER_SHEET); } var tid, lab = () => { tid = null; tabCounter.label = gBrowser.tabs.length; } var count = () => { tid && clearTimeout(tid); tid = setTimeout(lab, 150); } lab(); var tc = gBrowser.tabContainer; tc.addEventListener("TabOpen", count); tc.addEventListener("TabClose", count); var ucf = ucf_custom_script_win, id = Symbol(); ucf.unloadlisteners.push(id); ucf[id] = {destructor() { tc.removeEventListener("TabOpen", count); tc.removeEventListener("TabClose", count); }}; })(` #tabCounter { appearance: none; min-width: 42px; min-height: 22px; max-height: 22px; text-align: center; color: #000000; background-color: #DBEAF9; border-left: #B5C2D0 1px solid; padding: 0; margin: 0; } `);
Отсутствует
unter_officer
Здесь-то что могло не получиться
Понимаете, я же не спец по СВ и UCF кнопкам. Я сам не могу с нуля написать кнопку.
Всё, что я могу, это взять похожую по алгоритму кнопку и переделать её в то, что мне требуется. И то не всегда такое удаётся.
Вот, Вы, мне помогли с крайней кнопочкой, за что огромное спасибо, и я на её примере уже сам переделал ещё одну свою кнопку.
Как-то так.
Отредактировано unter_officer (30-12-2021 01:37:03)
«The Truth Is Out There»
Отсутствует
Dumby - вопрос по старому скрипту CB drag and go:
не получается подключить в UCF скрипт CB drag and go — перетаскивание ссылки/выделенного текста.
Этот код работает, если подключить его как User.js, то есть запускается из скрипта дополнительных кликов кнопок ucf_hookClicks.js.
Подскажите, как правильно его подключить в UCF-custom_script.js ? Может для Firefox 90+ нужны какие-то доработки ?
Отсутствует
подключить в UCF-custom_script.js
Подключают в UCF то, что сделано под UCF.
Для иного, перед тем как подключать, обычно,
делаются правки различной степени вмешательства.
Не понял, почему именно в custom_script.js, а не в окно, но можно и туда.
(async win => ({ link: { U: { name: "Открыть ссылку в новой активной странице", cmd() { win.openUILinkIn(this.val, "tab", this.opts); } }, D: { name: "Открыть ссылку в новой фоновой странице", cmd() { win.openUILinkIn(this.val, "tabshifted", this.opts); } } }, text: { U: { name: "Поиск текста поисковиком по умолчанию в новой активной странице", cmd() { this.search("tab"); } }, D: { name: "Поиск текста поисковиком по умолчанию в новой фоновой странице", cmd() { this.search("tabshifted"); } } }, search(where) { var engine = Services.search[`default${this.opts.private ? "Private" : ""}Engine`]; var submission = engine.getSubmission(this.val, null, ""); win.openUILinkIn(submission.uri.spec, where, {postData: submission.postData, ...this.opts}); }, opts: { //relatedToCurrent: true, triggeringPrincipal: Cu.getObjectPrincipal(this), get userContextId() { return parseInt(win.gBrowser.selectedBrowser.getAttribute("usercontextid")); }, get private() { return win.PrivateBrowsingUtils.isWindowPrivate(win); } }, dragstart(e) { win = e.view.windowRoot.ownerGlobal; //if (!win.gBrowser.currentURI.spec.startsWith("http")) return; if (!e.dataTransfer.mozItemCount || !win.gBrowser.selectedBrowser.matches(":hover")) return; var dt = e.dataTransfer; this.type = this.link; this.dir = this.val = ""; var url = dt.getData("text/x-moz-url-data"); if (url) this.val = url; else { var txt = dt.getData("text/plain"); if (txt) { this.val = txt; if (!this.textLinkRe.test(txt)) this.type = this.text; } else return; } this.x = e.screenX; this.y = e.screenY; this.drag(true); }, drag(init) { var meth = `${init ? "add" : "remove"}EventListener`; for(var type of this.events) win[meth](type, this, true); init || win.StatusPanel.panel.setAttribute("inactive", true); }, events: ["dragover", "drop", "dragend"], dragover(e) { var {x, y} = this, cx = e.screenX, cy = e.screenY; var dx = cx - x, ax = Math.abs(dx), dy = cy - y, ay = Math.abs(dy); if (ax < 10 && ay < 10) return; this.x = cx; this.y = cy; var dir = ax > ay ? dx > 0 ? "R" : "L" : dy > 0 ? "D" : "U"; if (this.dir.endsWith(dir)) return; dir = this.dir += dir; var obj = this.type[dir]; var txt = `${ obj ? "Ж" : "Неизвестный ж" }ест мыши: ${dir + (obj ? " " + obj.name : "")}`; win.StatusPanel._labelElement.value = txt; win.StatusPanel.panel.removeAttribute("inactive"); }, dragend(e) { var dt = e.dataTransfer; this.drag(); var obj = this.type[this.dir]; if (!obj || dt.mozUserCancelled) return; var x = e.screenX, y = e.screenY; var wx = win.mozInnerScreenX, wy = win.mozInnerScreenY; x > wx && y > wy && x < wx + win.innerWidth && y < wy + win.innerHeight && obj.cmd.call(this); }, textLinkRe: /^([a-z]+:\/\/)?([a-z]([a-z0-9\-]*\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(:[0-9]{1,5})?(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?$|^custombutton:\/\/\S+$/, observe(w) { this.drop = () => this.drag(); this.handleEvent = e => this[e.type](e); var unload = e => { var w = e.target.ownerGlobal; w.gBrowser.tabpanels.removeEventListener("dragstart", this, true); if (w == win) win = null; } (this.observe = w => { //if (!w.toolbar.visible) return; w.gBrowser.tabpanels.addEventListener("dragstart", this, true); w.addEventListener("unload", unload, {once: true}); })(w); }, init(topic, self) { delete this.init; Services.obs.addObserver(self = this, topic); Services.obs.addObserver(function quit(s, t) { Services.obs.removeObserver(self, topic); Services.obs.removeObserver(quit, t); }, "quit-application-granted"); } }).init("browser-delayed-startup-finished"))();
Отсутствует
Dumby
Есть у меня вот такая СВ-кнопочка:
// Иконки сайтов на CB-кнопке .......... addEventListener("TabAttrModified", (e, tab = e.target)=> { if ( tab.selected ) { favIcon.src = tab.image || "chrome://global/skin/icons/defaultFavicon.svg"; } }, true, gBrowser.tabContainer); var favIcon = self.getElementsByClassName("toolbarbutton-icon")[0]; addDestructor(()=> favIcon.removeAttribute("src") );
Для FF91.
Отредактировано unter_officer (01-01-2022 23:40:18)
«The Truth Is Out There»
Отсутствует
А какой в ней смысл, зачем иконка на кнопке, есть же на вкладке?
У меня скрыт заголовок окна.
Заголовок страницы активной вкладки выводится с помощью стиля на нижнюю панель, а иконка сайта на кнопку.
Отредактировано unter_officer (02-01-2022 01:19:19)
«The Truth Is Out There»
Отсутствует