Значит теперь на содержимое страницы воздействовать через СВ не получится? Ни убрать лишнее, ни добавить, ничего
Ну как, если была склонность использовать CB как Greasemonkey,
то да, такие удобства, определённо, уничтожены многопроцессностью.
Но, в принципе, пока ничего невозможного нет, просто стало сложнее,
или намного сложнее, зависит от задачи.
пункт из контекста не удаляется "кодировать изображение в текст файл base64"
Не вижу в контексте такого пункта.
Если имеется в виду «Запомнить изображение как base64»,
то можно заменить return !gContextMenu.onImage; на
return !(gContextMenu.onImage && Services.prefs.getBoolPref("Save.WebScreenShotOnImage", false));
Отсутствует
egorsemenov06
Я не уследил, может Вы уже здесь спрашивали. Случайно, не просили переделать (или адаптировать, не знаю, как правильно сказать) следующие кнопки для ucf?
https://github.com/Infocatcher/Custom_Buttons/blob/master/Session_Bookmarks/sessionBookmarks.js
https://github.com/Infocatcher/Custom_Buttons/blob/master/Undo_Close_Tabs/undoCloseTabs.js
Undo_Close_Tabs - эта мне симпатичнее, чем в расширении Виталия Add Toolba Bbuttons кнопка "Восстановить". Я не пользуюсь окнами и мне лучше, когда по ПКМ вижу сразу список закрытых вкладок + 2 пункта меню: "Очистить историю закрытых вкладок" и "Восстановить последнюю сессию".
Кстати, to ALL: Infocatcher обновил кнопку Cookies_Permissions, а Vitaliy V. user_chrome_files. Оба 20 часов назад.))
Отредактировано xrun1 (15-02-2021 15:00:17)
Отсутствует
переделать (или адаптировать, не знаю, как правильно сказать)
https://github.com/Infocatcher/Custom_Buttons/blob/master/Undo_Close_Tabs/undoCloseTabs.js
Никак правильно не сказать.
Кнопку такого масштаба и великолепия нереально переделать или адаптировать.
Можно только сбросить код кнопки на диск, а в custom_script.js добавить
какой-то код, как некий примитивный симулякр CB, заточенный конкретно под эту кнопку.
То есть, пишем набросок типа такого, затем тестируем на предмет чего симулякру не хватает.
try {CustomizableUI.createWidget({ label: "Undo Close Tab", id: "ucf-cbbtn-UndoCloseTab", localized: false, get initCode() { delete this.initCode; return this.initCode = Cu.readUTF8URI(Services.io.newURI( "chrome://user_chrome_files/content/custom_scripts/undoCloseTabs.js" )); }, onCreated(btn) { Object.defineProperty(btn, "icon", { configurable: true, get() { delete btn.icon; return {}; }}); var win = btn.ownerGlobal; new win.Function("xulns", this.initCode).call(btn, "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); win.addEventListener("unload", () => btn.onDestroy("destructor"), {once: true}); delete btn.undoCloseTabsList.cbMenu; btn.defaultContextId = "toolbar-context-menu"; } });} catch(ex) {Cu.reportError(ex);}
Отредактировано Dumby (16-02-2021 07:25:22)
Отсутствует
egorsemenov06
Я не уследил, может Вы уже здесь спрашивали. Случайно, не просили переделать (или адаптировать, не знаю, как правильно сказать) следующие кнопки для ucf?
https://github.com/Infocatcher/Custom_Buttons/blob/master/Session_Bookmarks/sessionBookmarks.js
https://github.com/Infocatcher/Custom_Buttons/blob/master/Undo_Close_Tabs/undoCloseTabs.js
Undo_Close_Tabs - эта мне симпатичнее, чем в расширении Виталия Add Toolba Bbuttons кнопка "Восстановить". Я не пользуюсь окнами и мне лучше, когда по ПКМ вижу сразу список закрытых вкладок + 2 пункта меню: "Очистить историю закрытых вкладок" и "Восстановить последнюю сессию".
Кстати, to ALL: Infocatcher обновил кнопку Cookies_Permissions, а Vitaliy V. user_chrome_files. Оба 20 часов назад.))
Вроде нет но я использую кнопку восстановить от Vitaliy V.
//Восстановить try {(() => { var id = "ucf-undo-tab", label = "Восстановить", tooltiptext = "ЛКМ: Восстановить вкладку\nПКМ: Восстановить окно", tooltiptextbtnmenu = "ЛКМ: Открыть меню\nПКМ: Показать весь журнал", img = "data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PGltYWdlIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQUJHZEJUVUVBQUxHUEMveGhCUUFBQUNCalNGSk4gQUFCNkpnQUFnSVFBQVBvQUFBQ0E2QUFBZFRBQUFPcGdBQUE2bUFBQUYzQ2N1bEU4QUFBQmFGQk1WRVgvLy8vLy8vL20vLytYeXVEZiA3LytiemVKY25Mc2JjcDZMakllTGpJZW1yNitUeGRzd2Y2Wk9oYUo4bEoyUmtZMlNrNCtabVpXaHBLS0x2TkZSazdROGhxZVBrSXZnIDROLzI5dmIxOXZiTTdQWmluNzR1ZnFiZzROL3U3dTdtOFBKdnJzdENqclBnNE4vdjcrL3Y3Ky9rOFBSb3FNYzVoNjB2Z0trOWlhL2YgNE43dzhQRHc4UERpNy9aZ3BNT0x0TW55OWZZbWVhSXFmYWZmNE43djcrL3Y3Ky9oOFBWd3FjVEIxTjNMM2VadHJNcUxqSWVPajRyZiAzOTd3OFBEdzhQQ010ODFocE1QTDdmbWJuSmVvcWFYcjYrdng4Zkg0Ky92RjJ0K2xxNnFLbEkraG9wMzgvUHo3Ky92MDlQVDUrZm45IC9mMjl2cnVMakllcXE2ZjcrL3Z3OFBENStmbkd4c1NMaklkNXJjZjQrL3hhbTd2TjZQZmc4dnpuOHZpZXh0b2FjcDZJeHV1WTEvK1UgMXYraDIvL0E1Ly9tOC9veWhhOTh3dXgrdys1aHJOZHZ0K0tSenZPNjJlb3ZncTA3akxjNGliTjh1ZDBaY1owNWlyY2JjcDRrZWFVYSBjWjMvLy8reURYUVZBQUFBV1hSU1RsTUFBUW8rRU1uN2NTWXdRdDNUY3crSDlPenUvUDVMdi9yNCtQMzhIdlRYNFA3VjhycTd5LzM2IC92bnhucCs1L2NITy92enZnb09tMEpISTBRN1A3bVpuenZrMHNPVHFTcUwxNGg2aWxsc3VSb0duSlVjMUVTWk1EODJ5YzZZQUFBQUIgWWt0SFJBQ0lCUjFJQUFBQUIzUkpUVVVINUFNV0Z6UW81Q1Z2WHdBQUFLMUpSRUZVR05OallJQURSZ1pVd01TTUtzTEN5c1lPWlhKdyBBZ0VYZDJRVUR5OGZpTTh2SUNnb0tDUWNIUk1iRnk4aUNoUVFFNWVRa0pSS1NFeEtUa2xOazVZQkNzakt5Y25KSzZSblpHWmw1K1FxIEFnV1VsSldWVlZUVjh2TFZOUW9LTllFQ1d0cEFvS09yVjZSdllGaHNCQlF3TmdFQlV6TnpDOHVTVWlzR2F4dGJPekN3dDdkektITjAgWW5CMmNYV0RBWGNQVHk4R2J4OWZQeGp3RHdnTVlnZ09DVVdBc1BBSUJvSUFBRkpzSjVSdFJ5S29BQUFBSlhSRldIUmtZWFJsT21OeSBaV0YwWlFBeU1ESXdMVEF6TFRJeVZESXpPalV5T2pRd0t6QXdPakF3VVJxUEdRQUFBQ1YwUlZoMFpHRjBaVHB0YjJScFpua0FNakF5IE1DMHdNeTB5TWxReU16bzFNam8wTUNzd01Eb3dNQ0JITjZVQUFBQUFTVVZPUks1Q1lJST0iLz48L3N2Zz4=", imgmenu = "data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' height='16' width='16' viewBox='0 0 48 48'><g><circle cy='24' cx='24' style='fill:rgb(0, 120, 173);' r='20'/><path style='opacity:0.25;fill:black;' d='M 33,41.8 22.3,31.1 36.7,17.9 44,25.2 C 43.5,30.6 41,37.7 33,41.8 Z'/><path style='fill:white;stroke:white;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;' d='M 35,19 H 13 L 24,30 35,19' /></g></svg>"; CustomizableUI.createWidget({ id: id, type: "custom", label: label, tooltiptext: tooltiptext, localized: false, defaultArea: CustomizableUI.AREA_NAVBAR, onBuild: function(document) { var win = document.defaultView, toolbaritem = document.createXULElement("toolbaritem"); toolbaritem.id = id; toolbaritem.className = "chromeclass-toolbar-additional"; toolbaritem.setAttribute("label", label); toolbaritem.setAttribute("type", "custom"); var toolbarbutton_0 = document.createXULElement("toolbarbutton"); toolbarbutton_0.id = `${id}-button`; toolbarbutton_0.className = "toolbarbutton-1"; toolbarbutton_0.setAttribute("label", label); toolbarbutton_0.setAttribute("tooltiptext", tooltiptext); toolbarbutton_0.setAttribute("context", "false"); toolbarbutton_0.addEventListener("click", function(event) { if (event.button == 0) win.undoCloseTab(); else if (event.button == 2) { event.preventDefault(); event.stopPropagation(); win.undoCloseWindow(); } }); toolbaritem.append(toolbarbutton_0); var toolbarbutton_1 = document.createXULElement("toolbarbutton"); toolbarbutton_1.id = `${id}-button-menu`; toolbarbutton_1.className = "toolbarbutton-1"; toolbarbutton_1.setAttribute("type", "menu"); toolbarbutton_1.setAttribute("label", ""); toolbarbutton_1.setAttribute("tooltiptext", tooltiptextbtnmenu); toolbarbutton_1.setAttribute("context", "false"); toolbarbutton_1.addEventListener("click", function(event) { if (event.button == 2) { event.preventDefault(); event.stopPropagation(); win.PlacesCommandHook.showPlacesOrganizer("History"); } }); var menupopup_0 = document.createXULElement("menupopup"); menupopup_0.id = `${id}-popup`; menupopup_0.setAttribute("tooltip", "bhTooltip"); menupopup_0.setAttribute("popupsinherittooltip", true); menupopup_0.addEventListener("click", function(event) { event.stopPropagation(); }); menupopup_0.addEventListener("command", function(event) { event.stopPropagation(); }); var menu_0 = document.createXULElement("menu"); menu_0.setAttribute("disabled", true); menu_0.setAttribute("label", "Недавно закрытые вкладки"); var menupopup_1 = document.createXULElement("menupopup"); menupopup_1.addEventListener("popupshowing", function(event) { while (menupopup_1.hasChildNodes()) menupopup_1.firstChild.remove(); if (win == Services.appShell.hiddenDOMWindow || win.SessionStore.getClosedTabCount(win) == 0) { menu_0.setAttribute("disabled", true); return; } var tabsFragment = win.RecentlyClosedTabsAndWindowsMenuUtils.getTabsFragment(win, "menuitem"); menupopup_1.append(tabsFragment); menu_0.removeAttribute("disabled"); }); menu_0.append(menupopup_1); menupopup_0.append(menu_0); var menu_1 = document.createXULElement("menu"); menu_1.setAttribute("disabled", true); menu_1.setAttribute("label", "Недавно закрытые окна"); var menupopup_2 = document.createXULElement("menupopup"); menupopup_2.addEventListener("popupshowing", function(event) { while (menupopup_2.hasChildNodes()) menupopup_2.firstChild.remove(); if (win.SessionStore.getClosedWindowCount() == 0) { menu_1.setAttribute("disabled", true); return; } var windowsFragment = win.RecentlyClosedTabsAndWindowsMenuUtils.getWindowsFragment(win, "menuitem"); menupopup_2.append(windowsFragment); menu_1.removeAttribute("disabled"); }); menu_1.append(menupopup_2); menupopup_0.append(menu_1); menupopup_0.addEventListener("popupshowing", function(event) { if (win == Services.appShell.hiddenDOMWindow || win.SessionStore.getClosedTabCount(win) == 0) menu_0.setAttribute("disabled", true); else menu_0.removeAttribute("disabled"); if (win.SessionStore.getClosedWindowCount() == 0) menu_1.setAttribute("disabled", true); else menu_1.removeAttribute("disabled"); }); var menuitem_0 = document.createXULElement("menuitem"); menuitem_0.id = `${id}-all-history`; menuitem_0.setAttribute("label", "Показать весь журнал"); menuitem_0.addEventListener("command", function(event) { event.stopPropagation(); win.PlacesCommandHook.showPlacesOrganizer("History"); }); menupopup_0.append(menuitem_0); var menuitem_1 = document.createXULElement("menuitem"); menuitem_1.setAttribute("label", "Удалить недавнюю историю…"); menuitem_1.addEventListener("command", function(event) { event.stopPropagation(); win.Sanitizer.showUI(win); }); menupopup_0.append(menuitem_1); toolbarbutton_1.append(menupopup_0); toolbaritem.append(toolbarbutton_1); var btnstyle = "data:text/css;charset=utf-8," + encodeURIComponent(` #${id}-button { list-style-image: url("${img}") !important; -moz-image-region: rect(0px, 16px, 16px, 0px) !important; margin-inline-end: 0 !important; } #${id}-button-menu { list-style-image: url("${imgmenu}") !important; -moz-image-region: rect(0px, 16px, 16px, 0px) !important; margin-inline-start: 0px !important; } toolbarpaletteitem[place="palette"] #${id}-button-menu, #${id}-button-menu dropmarker { display: none !important; } toolbarpaletteitem[place="palette"] #${id} { -moz-box-orient: vertical !important; } #${id}-button-menu > .toolbarbutton-icon { min-width: 0 !important; max-width: none !important; width: auto !important; padding-left: 0 !important; padding-right: 0 !important; } `); try { win.windowUtils.loadSheetUsingURIString(btnstyle, win.windowUtils.USER_SHEET); } catch (e) {} return toolbaritem; } }); })();} catch(e) {}
(() => { var loadscript = name => { try { Services.scriptloader.loadSubScript(`chrome://user_chrome_files/content/custom_scripts/${name}`, globalThis, "UTF-8"); } catch(e) {} }; loadscript("undo-tab.js"); // и т. д. })();
Отсутствует
Dumby
Откровенно говоря и не надеялся на положительный ответ. Слишком сложная и действительно великолепная кнопка. Но что интересно, работает в предложенном варианте. Только со строкой меню "Восстановить последнюю сессию" проблема - пропадает после очистки списка закрытых вкладок. И после очистки по ПКМ в кнопке классическое меню CB. В общем, раз "малой кровью" не получается, буду использовать вариант CB. Спасибо за предложенный вариант, взял на заметку.
egorsemenov06
Эта у меня тоже есть из поста https://forum.mozilla-russia.org/viewtopic.php?pid=784332#p784332
Отсутствует
Раньше в СВ были две удобные фичи. Первая: можно было открыть окно и запретить в нем загрузку нежелательного контента.
let win = open('','',param); docShell = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebNavigation).QueryInterface(Ci.nsIDocShell); docShell.allowImages = false; docShell.allowJavascript = false; docShell.allowPlugins = false;
И вторая, можно было открыть закладку по ее ключевому слову.
Есть сейчас замена этим двум фичам?
Отсутствует
Есть сейчас замена этим двум фичам?
Первая, как-то так, наверно.
Плюс, приглядывать за багами, типа такого.
OpenBrowserWindow().addEventListener("XULFrameLoaderCreated", { async handleEvent(e) { if (!e.target.matches("[id^=panel-].browserSidebarContainer :scope")) return; await Promise.resolve(); var func = type => { var restrict = () => { destroy(); docShell.allowImages = docShell.allowJavascript = docShell.allowPlugins = false; } var destroy = () => { removeEventListener(type, restrict); removeEventListener("unload", destroy); } addEventListener(type, restrict); addEventListener("unload", destroy); } var url = "data:charset=utf-8," + encodeURIComponent( `(${func})("DOMDocElementInserted");` ); var {type} = e, stack = e.target.parentNode; var unload = () => { stack.removeEventListener(type, this); tab.removeEventListener("TabClose", tabClose); } var win = e.target.ownerGlobal; win.addEventListener("unload", unload, {once: true}); var tabClose = () => { stack.removeEventListener(type, this); win.removeEventListener("unload", unload); } var tab = win.gBrowser.getTabForBrowser(e.target); tab.addEventListener("TabClose", tabClose, {once: true}); win.removeEventListener(type, this); (this.handleEvent = e => e.target.messageManager.loadFrameScript(url, false))(e); stack.addEventListener(type, this); } });
PlacesUtils.keywords.fetch("keyword").then(res => res && openLinkIn(res.url.href, "current", { postData: res.postData, triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() }));
Отредактировано Dumby (18-02-2021 00:52:22)
Отсутствует
hartumov пишетЕсть сейчас замена этим двум фичам?
Первая, как-то так, наверно.
Плюс, приглядывать за багами, типа такого.скрытый текстВыделить кодКод:
OpenBrowserWindow().addEventListener("XULFrameLoaderCreated", { async handleEvent(e) { if (!e.target.matches("[id^=panel-].browserSidebarContainer :scope")) return; await Promise.resolve(); var func = type => { var restrict = () => { destroy(); docShell.allowImages = docShell.allowJavascript = docShell.allowPlugins = false; } var destroy = () => { removeEventListener(type, restrict); removeEventListener("unload", destroy); } addEventListener(type, restrict); addEventListener("unload", destroy); } var url = "data:charset=utf-8," + encodeURIComponent( `(${func})("DOMDocElementInserted");` ); var {type} = e, stack = e.target.parentNode; var unload = () => { stack.removeEventListener(type, this); tab.removeEventListener("TabClose", tabClose); } var win = e.target.ownerGlobal; win.addEventListener("unload", unload, {once: true}); var tabClose = () => { stack.removeEventListener(type, this); win.removeEventListener("unload", unload); } var tab = win.gBrowser.getTabForBrowser(e.target); tab.addEventListener("TabClose", tabClose, {once: true}); win.removeEventListener(type, this); (this.handleEvent = e => e.target.messageManager.loadFrameScript(url, false))(e); stack.addEventListener(type, this); } });
Втораяскрытый текстВыделить кодКод:
PlacesUtils.keywords.fetch("keyword").then(res => res && openLinkIn(res.url, "current", { postData: res.postData, triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() }));
Dumby
Первый код открывает новое окно, у меня это настроено на домашнюю страницу. А как сделать, чтобы в этом окне сразу открылся нужный адрес?
А со вторым кодом ничего не получается. В эту строчку PlacesUtils.keywords.fetch("keyword") вместо keyword я вставляю краткое имя закладки или просто веб адрес. Не происходит ничего, только в консоли пишет Promise { <state>: "pending" }
Отсутствует
А как сделать, чтобы в этом окне сразу открылся нужный адрес?
Можно заменить первую строку на
openDialog( AppConstants.BROWSER_CHROME_URL, "_blank", "chrome,all,dialog=no", "нужный_адрес" ).addEventListener("XULFrameLoaderCreated", {
вместо keyword я вставляю краткое имя закладки или просто веб адрес. Не происходит ничего, только в консоли пишет Promise { <state>: "pending" }
Интересно, откуда может взяться запись в консоли?
Разве что запускать, собственно, с консоли.
И что значит «или просто веб адрес»? Написано было чётко:
И вторая, можно было открыть закладку по ее ключевому слову.
При чём тут «веб адрес»? Если приведённому тобой коду, на Firefox 56,
скормить вместо keyword «просто веб адрес», то он тоже ничего не откроет.
А по краткому имени — должен открывать. Может в keyword'е опечатка.
Отсутствует
hartumov пишетвместо keyword я вставляю краткое имя закладки или просто веб адрес. Не происходит ничего, только в консоли пишет Promise { <state>: "pending" }
Интересно, откуда может взяться запись в консоли?
Разве что запускать, собственно, с консоли.И что значит «или просто веб адрес»? Написано было чётко:
И вторая, можно было открыть закладку по ее ключевому слову.
При чём тут «веб адрес»? Если приведённому тобой коду, на Firefox 56,
скормить вместо keyword «просто веб адрес», то он тоже ничего не откроет.
А по краткому имени — должен открывать. Может в keyword'е опечатка.
С веб адресом это я просто оговорился.
У меня не получалось запустить этот код из кнопки, потому я попробовал с консоли.
А не получалось потому, что я вставлял краткое имя букмарклета. Букмарклет не вызывается, хотя старый код
прекрасно с этим справлялся.
А если закладка с обычным адресом - то да, новый код работает. А букмарклет загрузить никак нельзя?
И еще вопрос, вот в этой строчке
я меняю current на window - закладка открывается в новом окне. А если меняю на tab, не работает. Почему?
Отсутствует
А не получалось потому, что я вставлял краткое имя букмарклета.
Да, вижу, интересный кейс.
Порылся немного, вот так, вроде, работает.
PlacesUtils.keywords.fetch("keyword").then(res => { if (!res) return; var {url: {href}, postData} = res; var allowPopups = href.startsWith("javascript:"); openLinkIn(href, "current", { postData, allowPopups, allowInheritPrincipal: allowPopups, triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() }); });
А если меняю на tab, не работает. Почему?
Потому, что res.url это объект, инстанция URL.
Легко превращается в строку, поэтому так и оставил.
А когда res.url отправляется открываться как tab, то, в цепочке вызовов,
на нём вызывается метод replace(), которого нет. Ошибка останавливает дальнейшее исполнение.
Код был расчитан на "current", но да, надо было, всё таки, передать строку, то есть res.url.href
Отсутствует
Как показать список закрытых вкладок т. е. вот это menupop#historyUndoPopup
Чтобы не лазить через меню Журнал и т. д... а сразу и отдельно посередине экрана?
Отсутствует
Как показать список закрытых вкладок т. е. вот это menupop#historyUndoPopup
Чтобы не лазить через меню Журнал и т. д... а сразу и отдельно посередине экрана?
SessionStore.getClosedTabCount(window) && (this.hpopup || (this.hpopup = (() => { var popup = document.createXULElement("menupopup", {is: "places-popup"}); for(var args of Object.entries({ context: "", placespopup: true, tooltip: "bhTooltip", onpopupshowing: "fill()", id: _id + "-historyUndoPopup" })) popup.setAttribute(...args); popup.fill = () => { popup.textContent = ""; popup.append(RecentlyClosedTabsAndWindowsMenuUtils.getTabsFragment(window, "menuitem")); var {width, height} = popup.getBoundingClientRect(); popup.moveTo((screen.availWidth - width)/2, (screen.availHeight - height)/2); } return this.appendChild(popup); })())) .openPopupAtScreen();
Dumby
network
Может лучше пойди подрядить «агента Шифт»,
чтобы подвинуть урлбарский плейсхолдер,
вместо того, чтобы вопрошать про «network» не по адресу.
Отредактировано Dumby (20-02-2021 22:12:57)
Отсутствует
Не понял...Куда код вставлять? Явно не в userchrome.
Да, не userchrome.
Попробовал (по всякому) куда-то в omni.ja, и не получилось, видимо, руки кривые.
А вот в ucf custom_style_agent.css — работает. Ну и такие варианты, конечно, тоже.
(css => { var type = windowUtils.AGENT_SHEET; var url = "data:text/css;charset=utf-8," + encodeURIComponent(css); windowUtils.loadSheetUsingURIString(url, type); addDestructor(() => windowUtils.removeSheetUsingURIString(url, type)); })(` #urlbar #urlbar-input::placeholder { text-indent: 22px !important; } `);
(async css => Cc["@mozilla.org/content/style-sheet-service;1"] .getService(Ci.nsIStyleSheetService).loadAndRegisterSheet( Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService).newURI( "data:text/css;charset=utf-8," + encodeURIComponent(css) ), Ci.nsIStyleSheetService.AGENT_SHEET ) )(` @-moz-document url(chrome://browser/content/browser.xhtml) { #urlbar #urlbar-input::placeholder { text-indent: 22px !important; } } `);
Отсутствует
https://github.com/xiaoxiaoflood/firefox-scripts/issues/64
как-то все молчат, а уже "security engineering team", аккуратно назвав тему "Compatability with Future Versions of Firefox", интересуются использованием autoconfig
пока к конкретному случаю привязано (load scripts off-the-main thread), но известно ж как мацарелла похерить все может
неужели 1% юзеров тоже выкинут? кто ж останется..
Отсутствует
Dumby
Тонкий ход! Config.js не понадобился. Тоже omni.ja весь перелопатил...Ну, ты , мастер...
А нельзя это же в польз.скрипт это запихать? Не надо. Вставил в custom_style_agent.css
Отредактировано solombala (21-02-2021 13:32:29)
Отсутствует
Dumby
Список закрытых вкладок - класс, спасибо!!
Отсутствует