Обрезка текста, скроллинг + скроллинг по непонятному принципу
Да, воспроизводится, я вижу это.
Скроллинг, правда, редко, а вот обрезка текста,
кроп текста самого длинного пункта, и общая сдвинутость
пунктов влево вверх — всегда.
В menu_background.css есть блок arrowscrollbox.menupopup-arrowscrollbox {…}
в нём, в конце, есть margin: 0 !important;
Попробуй заменить margin на --panel-shadow-margin
скрипт, который убирает фокус из строки поиска на страницах about:config и about:cfg..?
Хмм, убирает когда?
Если при загрузке, то, может быть, создать blur.js
location.pathname == "config" ? document.getElementById("about-config-search").blur() : textbox.addEventListener("focus", e => e.target.blur(), {once: true});
Ну, и убедиться, что в настройках UCF стоит галка
[✔] Включить стили и скрипты для контента [about:, chrome:, moz-extension:]
есть стиль для иконок в контекстном меню
Гонишь! :)
сначала контекстное меню все как надо, но после второго клика - меню сдвигается
…
то же самое сдвиг
Вот скриншоты с чистого профиля.
Здесь — слева первый ПКМ, справа второй ПКМ.
[spoiler][code]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqQAAAHuCAIAAADGD4lpAABDs0lEQVR42u3de5xU5Z3n8YerXMyKmkx3goo3MM6sdAsrkzHMRpxAe0E0u5OJit0Sb4mai8PSGCc3opNRaJaoGZNMogYbNU5mZxTvDW50ZtBkNCiNMwmCqCjE7sELbJSL0LDPqeepqlNVp5rueur0Ob96Pu8/eFVXnzp1uu3v7/vUqdPtoPpHb+/au0sB8Mb+c67+6GN3EHzAH4N02a879c8TPIL9+/ebf80NIEGDMsyNpI8lRocccogue4IPGD4EP8myNyHfl7U/K+nvCXw0KGtwlqrd5Cdb9gQf6eFP8JMsexP1np6evRn6hkm+yo4DYADkVvQ650OGDBmaoW/oD3Pr/RqTbNkTfKSBb8FPsux1zvfs2fNBxu7du03yWeZjgOWW9ibtBx100PCMYcOG6eTXXuZV0mVP8JEGvgU/ybLXOd+1a9fOnTv1N/pjH/vYyJEjk/5uwHf6p/F3v/ud7h790zhixAj9k2mW+UkfV5UlW/YEH2njQ/CTLPv33ntPf4v1N/S4445L+vsA5G3cuFG/xNSx14t9Hfsay7xKuuwJPtKptoOfZNlv377997///bHHHsvSHqmiq+iVV1750Ic+pNf4w4YNM9fs1JJky57gI51qO/hJlv0777yjY
Что-то не так с этим
кодомВыделить кодКод:
` var txt = dt.getData("text/plain"); var url = dt.getData("text/x-moz-url-data"); if (url) this.val = url, this.txt = dt.getData("text/x-moz-url").split("\n")[1]; else if (!txt) return; try { this.val = new URL(txt.trim()); } catch { this.val = txt; if (!this.textLinkRe.test(txt)) this.type = this.text;
Там используется экземпляр URL как таковой,
но, по дороге, прицепили на него вызов строкового метода includes()
поэтому следует привести его к строке, например, new URL(txt.trim()).href
на сайте vk.com
Но я-то сайт обрести не могу.
Вот если бы его файлом, чтобы тоже воспроизводилось,
но, даже не знаю, возможно ли такое.
у тебя на эту версию есть рабочий вариант?
У меня такой.
…А как jsm в mjs переделывать?
Ооо, следуй за ними.
Например скрипт сохранения страницы SingleSaveHTML.jsm ?
export class SingleHTMLChild extends JSWindowActorChild { //класс = name + Child receiveMessage() { return htmlAndName(this.contentWindow);} } ChromeUtils.domProcessChild.childID || ({ init(topic) { ChromeUtils.registerWindowActor(name, { allFrames: true, child: {esModuleURI: Components.stack.filename},
Чём модуль ES mjs и скрипт jsm отличаются? Нашёл только эту справку.
Ну, ES типа вебский модуль, только без top-level await'а.
Скрипт mjs в FireFox 97 будет работать?
Конечно нет. Даже рядом не ст
…bootstrap
bootstrap-loader.js не зачищен от Services.jsm
Но он и не слишком-то дружественнен к правке по своей природе.
Лучше разворачивать что-то гитхабское.
Или вот, на пробу (замену), shitty-simple
[spoiler=bootstrap-loader-mini.js][code]// bootstrap-loader-mini.js
Cu.evalInSandbox(
'(async () => {\n\tvar {console, DOMParser} = Cu.getGlobalForObject(Cu);\n\n\tvar imp = sub => {\n\t\tvar url = `resource://gre/modules/${sub}.`;\n\t\ttry {return ChromeUtils.importESModule(url + "sys.mjs");}\n\t\tcatch {return ChromeUtils.import(url + "jsm");}\n\t}\n\tvar {AddonManager} = imp("AddonManager");\n\tvar {XPIProvider} = imp("addons/XPIProvider");\n\tvar {XPIDatabase, AddonInternal} = imp("addons/XPIDatabase");\n\n\tXPIDatabase.isDisabledLegacy = () => false;\n\n\tvar OPTIONS_TYPE_DIALOG = 1; // AddonManager.OPTIONS_TYPE_DIALOG\n\tvar aboutaddons = "chrome://mozapps/content/extensions/aboutaddons.js";\n\n\tvar optionsTypeDescriptor = {\n\t\tenumerable: true,\n\t\t
не получилось
Я тут пробовал сконвертировать jsm в mjs,
возможность импорта jsm'ок ведь выпилят, рано или поздно.
Вот, может это у тебя заведётся.
Там без файла favicon (наверняка уже свой стоит),
и без папки locale (а то на форум не влезет, использовать имеющуюся).
Регистрация about:cfg — соответственно
{ func: 'ChromeUtils.importESModule("chrome://user_chrome_files/content/aboutconfig/UCFAboutConfigFluent.mjs");' },
Текстовая ссылка на страницу загрузки
[spoiler][code]data:text/html;charset=utf-8,<!DOCTYPE html>%0A<html>%0A%09<head>%0A%09%09<title>aboutconfig-mjs</title>%0A%09%09<meta http-equiv="Content-Type" content="text/html; charset=utf-8">%0A%09</head>%0A%09<body> %0A%09%09<center style="font-family: Verdana; margin-top: 25vh;"><h1><a%0A%09%09%09download="aboutconfig-mjs.zip"%0A%09%09%09href="data:application/x-zip-compressed;base64,UEsDBBQAAAAIAEjtLwBzS6f93AEAALgDAAAKAAAAY29uZmlnLmNzc5VTwYrbMBA9N5B/GDaXbFrbyZItxb1toVDYwtLNZY+yPLbVyBojjdfJlv57x06cps1C
Вот только кнопка about:config при нажатии ЛКМ не срабатывает
Можно заменить в parent.js
br.loadURI(url
на
br.fixupAndLoadURIString(url
или на
br.loadURI(Services.io.newURI(url)
не пойму чем заменить в этой кнопке "global"
Чем-нибудь глобальным, в смысле независимым от окон,
куда можно добавить ссылку на storage и она там останется, пока сам не удалишь.
Например, js-объект рождённый в модуле, только нормальный,
а не какой-нибудь неподходящий, типа замороженный как AppConstants или ещё что.
Ну или, собственно, сам SystemGlobal. Вот там же две строки с var global = …
Можно первую раскомментировать, а вторую закомментировать,
если конечно window.Services у тебя не «overwritten».
add_toolbar_buttons я вернул, но его дополнительных кнопок почему-то нигде нет.
А зачистка Services.jsm в нём проведена?
Упс, не туда.
посмотрите пожалуйста вот этот скрипт на 117.0 перестал работать
Да, это Bug 713713 - Clean up OpenBrowserWindow
Может так сойдёт? Код в custom_script.js, не в окно.
(async (bwt, lazy) => { var TelemetryStopwatch = lazy = Object.create(null); lazy.start = lazy.finish = () => {}; ChromeUtils.defineLazyGetter(lazy, "BrowserHandler", () => Cc["@mozilla.org/browser/clh;1"].getService(Ci.nsIBrowserHandler) ); ChromeUtils.defineESModuleGetters(lazy, { HomePage: "resource:///modules/HomePage.sys.mjs", PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs" }); var bwt = ChromeUtils.importESModule(bwt).BrowserWindowTracker; Object.assign(bwt, eval(`({${bwt.openWindow}})`.replace(/\n +if \(!args &.+?}/s, ""))); })("resource:///modules/BrowserWindowTracker.sys.mjs");
[visuallyselected=true]
не работает после удаления в ней Components.utils.import("resource://gre/modules/Services.jsm");
Оно там под условием if(!("Services" in window))
которое в предыдущей строке, так что надо удалить ещё и её.
Иначе это условие перейдёт на код,
следующий за удалённой импорт-строкой, и всё встанет враскоряку.
рабочий вариант кода для установки
Да нынешний вроде должен работать.
не подписанных расширений
Неподписанное расширение — это "масляное масло".
Подписанным или неподписанным может быть WebExtensions, но не расширение.
Расширения сто лет как не подписывают,
а которые были подписаны ещё тогда, уже давно отвалились.
для FF 102.9 esr
Для ESR 102 код не требуется, достаточно настроек
xpinstall.signatures.required
extensions.experiments.enabled
[spoiler][code]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyEAAAIgCAIAAAAdp/G1AACrz0lEQVR42uzdCVwU9f8/8M9yKiioeBEgh0B+ycwj9atUWmki9i37fhM0TawUPLA0BU2xLBELNDVPsENNU7B+Wf8CS9OytMzyitA4PVC8MLxIVOA/n53d2bl22YVdZnd5Pb+/h7/Zz37mM+9dtp0XnxlmVA8++CABAAAAALNSMRnr4MGDSpcBAAAAYD969+6tyVgf5BxTuhgAAAAAe/DS0G66jJWRjYwFAAAAYAbjIrqF90XGAgAAADArQcZal/OH0vUAAAAA2IORg7s+1q+PJmN9+M2fStcDAAAAYA+efCxsWH9kLAAAAACzEmSs9TvzlK4HAAAAwB4MfLjLiIf7ajLWxl0nlK4HAAAAwB706hcybuC/NRlr0558pesBAAAAsAoX/jx2NGvjueN6z6S651/3PRA1tsN93WSfDe0VNOXxfshYAAAAAAKfThwzZWZs/3499HXY//PhVYsznl27SfZZQcba8n2hpMMPHzy66p5NWUN9DLTwnF3/xiIyeeW4DtyC0m8QAAAAQD18MGLIZzkbb+Qe0tehRdee/xs69qVt38g+2+GBgFlPaDNW5t5iSYfv3x+wyueTbbxEJW0RuPDpiFdW0GoGpRaN76v02wMAAABQL+v+N/jTrz66dvTgZ39d3FdawbSE+7biFv53b3uPB3o/++QLEz7bKbt6szDf5KHh5sxYAAAAAHaAyVhZ29ddPfRzwk+nP81MZ1qejY7jFtIe6uTZs1/U8AlGZaxt+0okHb7PeGil79ZPI31lWo6kBqV8qW576sOsxIH8p85nPfvye2Tc1iUk+dH1udy6o+b8NPhXcR/+4AAAAABWIX34oNUp8SWZH+5rEZTn2pFNV0QdsMKqzoffKA6MfnHynJVx23fJrn4n+J6lTz6kyVif7T8l6bAnPfwFSTz
…твой стиль
Какой ещё стиль?
Разве множественные значения для свойства transition-property
не должны следовать через запятую?
Если должны, то никакого стиля и нет, а всего лишь ин-валидная писанина.
Просьба адаптировать его, чтобы он работал в среде Aris-t2.
Почему у тебя в sandbox'е не работает я без понятия.
А в окно можно попробовать, например, так
(async (flag, url) => { if (location != url) return; await delayedStartupPromise; if (Downloads[flag]) return; Downloads[flag] = true; var bwt = BrowserWindowTracker; var show = function(download) { download.newDownloadNotified || bwt.getTopWindow(this)?.DownloadsPanel.showPanel(); }; ["PUBLIC", "PRIVATE"].forEach(async (type, ind) => { var view = Object.create(null); view.private = Boolean(ind); view.onDownloadChanged = show; (await Downloads.getList(Downloads[type])).addView(view); }); })("806555", "chrome://browser/content/browser.xhtml");
казявка
Уж не знаю что за Цент,
а для лисы как-то так, наверно
(async (id, url) => { if (location != url) return; var menuitem = document.createXULElement("menuitem"); document.getElementById(id).after(menuitem); var hidden = () => !nsContextMenu.contentData.context.linkTextStr; menuitem.hidden = true; menuitem.render = () => { if (hidden()) return; menuitem.hidden = false; menuitem.id = id + "text"; menuitem.label = "Скопировать текст ссылки"; menuitem.setAttribute("oncommand", "navigator.clipboard.writeText(gContextMenu.linkTextStr);"); delete menuitem.render; menuitem.render(); menuitem.render = () => menuitem.hidden = hidden(); } })("context-copylink", "chrome://browser/content/browser.xhtml");
А можешь что-то конкретное решение предложить ?
Нет, не могу.
Я просто не понимаю конечный смысл.
А перевести на JS то, что процитировано, могу попробовать
Вот, например, изменил метод filter()
/* filter(sel) { return this.closest(sel); }, */ filter(sel) { var node = this; do { if (node.id == sel || node.className == sel) return true; } while(node = node.parentNode /*node.flattenedTreeParentNode*/); },
Надо решётку убрать из всех ключей, а не дописывать!
Тогда, наверно, вместо closest() надо будет использовать
что-нибудь самописное, которое так и будет проверять от trg вверх
безрешёточный id, затем бесточечное класс-добро, затем имя тэга.
когда выполняется функция find(sel) ?
this.selectors — это массив всех прописанных селекторов.
Через его метод filter() из него создаётся новый массив sels,
в котором остаются только те селекторы, под которые подпадает
сам trg или какой-либо из его родительских элементов.
Если таких селекторов в массиве sels получится больше одного,
тогда и выполняется функция find(sel)
Подскажи, как вызвать find(sel)
Как-то так: this.find.call(myThis, myArg);
только на пустой области #tabbrowser-tabs
Ну правильно,
trg.closest((trg.id && "#" || trg.className && "." || "") + sel)
это именно точное соответствие trg и псевдо-селектора sel,
а не поиск от trg вверх.
Не говоря уже о том, что просто при
…чтобы не писать кучу повторных строк с # решёткой, а юзать переменные: [variable]: свойство
Ну, если это прям так принципиально, то решётку можно и дописать,
типа завести функцию, которая будет возвращать
trg.id && "#" + trg.id || trg.className && "." + [...trg.classList].join(".") || trg.tagName
и вызывать её внутри блока if (e.type == "mouseenter") {…}
Кстати, заканчиваться код блока должен инструкцией return;
ведь исполнять дальнейший код по "mouseenter" не нужно.
fuchsfan
Скрипт не отвечает за то, где и как видны «промежутки».
Только за их наличие там, откуда их можно на тулбар вытаскивать.
Чтобы «промежутки» было видно на этом вертикальном аддонбаре,
это надо куда-нибудь в стили пристроить что-то типа
toolbar#addonbar_v > toolbarspacer {
width: auto !important;
height: 15px !important;
}
@Dumby
Большая просьба исправить скрипт разделителей special_widgets.js, чтобы загружался вне ucf старым методом от Aris-t2 или Endor8.
Что значит «исправить»?
Исправить можно баг или поломку,
а «чтобы загружался …» — это не называется «исправить».
Вобщем, меняем первую и последнюю (не пустую) строку на такие
(async url => location != url || await delayedStartupPromise || ({
}).init("customizationready"))("chrome://browser/content/browser.xhtml");
И, вместо методов init() и destructor() один только init(), такой:
// init(type) { window.addEventListener(type, this); window.addEventListener("unload", () => window.removeEventListener(type, this) , {once: true}); },
Правда пришлось перейти на новый загрузчик
работал CustomButtons
из-за отвалившегося
был удобные менеджер
Не понял. Что значит «пришлось» ?
UCF либо развёрнут, либо нет.
Если развёрнут, значит и загрузчик есть, на него не надо «переходить».
Ты либо используешь его, либо нет.
Остальное, иные uc-экосистемы, или CB, могут и должны
работать независимо и параллельно, и, если есть положительный опыт взаимодействия с ними,
то, без особой необходимости, и уверености в том, что «я могу перейти», ничего с ними делать не следует.
extensions.user_chrome_files.debug
Другое дело.