эту
Может extensions.user_chrome_files.custom_scripts_background
плюс такая правка, не уверен.
[spoiler][code]/*
ChromeUtils.importESModule("resource:///modules/CustomizableUI.sys.mjs").CustomizableUI.createWidget({
label: "Reload user{Chrome, Content}.css",
tooltiptext: "L: Reload userChrome.css\nR: Reload userContent.css",
id: "ucf-userContentReloader",
localized: false,
onCreated(btn) {
btn._handleClick = this.click;
btn.oncontextmenu = oncontextmenu;
btn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAIpwAACKcBMsYCAwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAMwSURBVEiJ5dbNb5RVFMfxz3mmrYgYE0IN4IaKb4n4UqOwMCYu2JCoQVDiwoUrQ4j0xao7ExITQxRoodEFK1cmRkSE8AeYYKpEFF0YY4SiUSMRQW0sLe0818U8nekwHe3U7vhtnnNOzj3f89znPvderjVFK8npaSWrPSjpElahQzhvyrF4y++t1GqbF7DHOvQLj6Ozrt2EDutYRHAasMK0vXgWWZO0SX/7DlJf6Skp3UWcFeVRV4zG235tCZx6rDPtKLqqAN4XPhROm3DJEiG3LA6aKkZ14jUSKaOd1G
к Thunderbird
Что-то не слишком подробно.
Я совсем не комплиментарен TB,
но, ладно, поставил 135.0b2 и подключил распоследний UCF.
В CustomStylesScripts.mjs, в UcfStylesScripts.scriptschrome.load
прописал имя файла кода, добавляющего кнопку на #tabs-toolbar
с таким, примерно, содержимым
[spoiler][code](async () => {
var btn = document.createXULElement("toolbarbutton");
var ai = "Attributes Inspector";
//btn.setAttribute("label", ai);
btn.setAttribute("tooltiptext", ai);
btn.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgP//QID//0CA//9AgP//QID//0CA//9AgP//QID//0CA//9AgP//QID//0CA//9AgP//QID//0CA//9AgP//QID//wDM//8AzP//AMz//wDM//8AzP//AMz//wDM//8AzP//AMz//wDM//8AzP//AMz//wDM//8AzP//QID//0CA//8AzP////////////8AzP//AMz//wDM/////////////wDM////////////////////////AMz//0CA//9AgP//AMz/////////////AMz//wDM//8AzP////////////8AzP///////////////////////wDM//9AgP//QID//wDM/
О, значит будет в конце body
Ещё, у меня вторая серия этой истории с верхним тулбаром.
Bug 1935035 - Infobar has incorrect styling when new sidebar panel is enabled (Firefox 136+)
То есть, решили использовать для notifications специальный тулбар,
а раз верхний UCF-тулбар добавляется после последнего тулбара
(который теперь для нотификаций), то ситуация повторяется,
инфобар появляется над дополнительным и разрезает монолит подряд идущих.
Можно посмотреть, запустив с консоли, например
gNotificationBox.appendNotification("", {label: "Test"}, [{label: "Close", callback: () => false}]);
Надо на что-то заменить селектор «:scope > toolbar:last-of-type»
То ли на «#PersonalToolbar»
то ли на «:scope > :nth-last-child(1 of toolbar:not(#notifications-toolbar))»
то ли ещё на что-то.
Немного подробностей.
Этот баг был «Approved for 135.0b5.»
А в баге выбросили #fullscreen-and-pointerlock-wrapper
Если не возвращаться к a11y-announcement и before() то лучше в строке
document.querySelector("#fullscreen-and-pointerlock-wrapper")?.after(bottombox);
дописать в селектор «,#pointerlock-warning» чтобы осталась совместимость.
А вообще, строки поиска и добавления bottombox'а
лучше поднять наверх блока try {} и не использовать оператор «?.»
Потому что если bottombox'а не будет на DOM-дереве, то остальной код блока бесполезен.
могу ли по такому же простому принципу сделать и для home?
Не совсем. Код не создаёт пункты меню,
но всего лишь оперирует уже существующими,
а пункта меню, который вызывал бы домашнюю страницу,
я нигде в браузере не нашёл.
Можно изменить, чтобы создавал.
Заменить цикл for(var id in data) {…} на такой
// for(var id in data) { var obj = data[id], elm = n(id); (obj.ctrl ? ctrlIds : ids).push("#" + id); if (elm) { remAttrs(elm); var br, obs = elm.getAttribute("observes"); if (obs) br = n(obs), br && remAttrs(br); } else (elm = document.createElement("menuitem")).id = id; if ("lab" in obj) br && br.removeAttribute("label"), elm.setAttribute("label", obj.lab); obj.oncommand && elm.setAttribute("oncommand", obj.oncommand); df.appendChild(elm); }
откуда вообще выяснять все эти menu_showAllHistory?, и тому
…
нужно, чтобы было как при нажатии на вчера упомянутoe ctrl+d
Почему тогда 'loadURI("about:blank");' а не "BrowserHome();"
как добавить в главное контекстное меню пункт "history"?
Может menu_showAllHistory: { lab: "history" },
В 134.b9 перестало работать расширение add toolbar buttons.2024.10.14.21.
Посмотри пожалуйста.
Развернул бету 134.0b10, поставил ATB 2024.10.14.21
Не вижу, чтобы расширение перестало работать.
Кнопки создаются, страница настроек на месте.
Может слетела настройка extensions.experiments.enabled
Или может отвалилась какая-то конкретная кнопка,
тогда говори какая именно, я же не буду проверять их все.
Как избавиться от пункта User Agent
В строке 115 удалить открывающую фигурную скобку {
И удалить строки со 116-ой по 167-ю (включительно).
Т.е., нет смысла дать автору NS ссылку на этот код.
Да, полагаю, что никакого смысла.
Даже если представить, что можно сделать только на одной рефокусировке,
(а у меня сходу в скипте не получается, всё равно иногда мелькает),
то, из WE, это же пойдёт запрос из дугого процесса,
что, наверно, будет недостаточно быстро.
А, как в скрипте, задвинуть окно за пределы экрана они не дадут.
В chrome://browser/content/parent/ext-windows.js
есть функция sanitizePositionParams()
и комментарий в ней
// boundary check: don't put window out of visible area
Dobrov
Можно использовать nsILoginManager, чтобы получить массив nsILoginInfo.
Они квериинтерфейснуты nsILoginMetaInfo, что добавляет в том числе и даты.
То есть, либо await Services.logins.searchLoginsAsync({…});
либо получаешь все: await Services.logins.getAllLogins(); и ищешь сам.
В 12.0.902
Что-то я не вижу каких-то изменений в коде,
по сравнению с 12.0.901, которые могли бы затрагивать
обсуждаемую проблему.
Изменился только объект tlds в .../nscl/common/tld.js
и в .../bg/LifeCycle.js в 268-ой строке изменился error()
«Can't run content script on tab»,
то есть всё это вообще не должно иметь отношения.
Как бы передать NoScript’у чтобы не горячился, не показывал процесс ресайза, я могу подождать
А толку-то? Это же WebExtensions,
у них нет возможности как-то на это повлиять.
Вот в фильме есть кадр, где видно, что html
уже прогрузился и отобразился, но скрипт ещё
не создал результирующий DOM.
Поэтому, здесь, хотя бы чисто гипотетически,
можно представить возможность какой-нибудь оптимизации,
чтобы это делалось побыстрее. А для всего остального — скорее нет.
Вот, попробовал uc-like скриптом
это дело прихорошить, и вроде, чуть получше.
Но, там используется счётчик, а это как-то ненадёжно.
Вобщем, не знаю как ещё, такая шля
без контента (быстро исчезает)
сверху нормальное
Хмм, убедительно. Но, в то же время, не совсем.
Дело в том, что NoScript заказывает ресайз этого окна,
типа подгонка под получившийся размер контента.
Поэтому, может сложиться впечатление,
что это уже другое окно (ресайз как исчезновение).
Вот если бы поймать на панели задач виндовс,
что окошек именно два, тогда было бы бесспорно.
Но, это если они существуют
в какой-то момент времени одновременно,
иначе, это вообще труднодоказуемо.
Молчали Бяка и Бука
А что, тебя бы порадовало какое-нибудь
бессодержательное высказывание от непричастных типа меня?
помимо окна выбора действий для webgl на долю секунды мелькает пустое окно
Развернул синтетическую страницу WebGL Demo с MDN.
Поставил NoScript 12.0.901, жму на ней NoScript'скую заглушку, и ...
никакого второго дополнительного мелькающего пустого окна не вижу.
Может быть, имеется в виду, что (так называемое)
«окно выбора действий для webgl» сначала пустое?
Так ничего удивительного, ты же понимаешь,
что это целое окно браузера с одной вкладкой
с адресом moz-extension://...../ui/prompt.html
Просто весь хром этого окна скрыт.
Вот когда ты открываешь ссылку в новом окне,
контентская область же не заполняется мгновенно, но сначала пустая.
исправить маленькие кнопки для 115.0.3
В первой, раз там используется 'current',
можно заменить openUILinkIn на openLinkIn
Во второй я никакого отвала не вижу.
Duche
Что-то особо проверять не хочется, но попробуй так
[spoiler][code](defImg => {
var bookmark = async node => {
var title = gBrowser.selectedTab.label.slice(0, 50);
var parentGuid = PlacesUtils.getConcreteItemGuid(node);
await PlacesTransactions.NewBookmark({
parentGuid, index: 0, title, url: gBrowser.currentURI.spec
}).transact();
notify(title, `Добавил в папку ${
PlacesUtils.bookmarks.getLocalizedTitle({guid: parentGuid, title: node.title})
}:`);
}
var notify = (...args) => {
var name = "alert-bkmrk-added";
var as = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
var close = as.closeAlert.bind(null, name);
(notify = (title, msg) => {
as.showAlertNotification(
gBrowser.selectedTab.image || defImg, msg, title, false, null, null, name
);
setTimeout(close, 2e3);
})(...args);
}
var isFolder = PlacesUtils.nodeIsFolder || PlacesUtils.nodeIsFolderOrShortcut;
addEventListener("dblclick", e => {
var node = e.tar
для одной кнопки атрибут title связан с подсказкой, а tooltiptext не пашет
для другой кнопки атрибут tooltiptext связан с подсказкой
Процитирую часть кода из TooltipTextProvider.sys.mjs
..... if (tipElement.namespaceURI == XUL_NS) { lookingForSVGTitle = false; titleText = tipElement.getAttribute("tooltiptext"); } else if (!defView.SVGElement.isInstance(tipElement)) { lookingForSVGTitle = false; titleText = tipElement.getAttribute("title"); }
Вот, демо-код для запуска с консоли.
Окошко с двумя кнопками.
У обоих кнопок присутствуют оба атрибута.
Какой будет показан в тултипе?
[spoiler][code](async (TITLE, TOOLTIP_TEXT) => {
var win = openDialog("about:blank", "", "chrome,centerscreen,width=340,height=220");
Services.scriptloader.loadSubScr
да и без файла подхватывает, а отображение в aHTMLTooltip не особо нужно
Это было просто информационное сообщение.
Оно может быть понятным, или не понятным,
интересным, или не интересным ...
Но, оно не для того, чтобы комментировать поперёк.
Разве что только если я не прав. Хорошо, давай проверим.
и без файла подхватывает
Испортим то, что делает файл. Запускаем с консоли браузера:
ChromeUtils.importESModule("resource://gre/modules/TooltipTextProvider.sys.mjs")
.TooltipTextProvider.prototype.getNodeText = (elm, out) => out.value = "???";
Затем, наводим указатель мыши на кнопку.
Что видно в тултипе?
отображение в aHTMLTooltip не особо нужно
Ладно, тогда долой. Запускаем aHTMLTooltip.remove();
Снова наводим. Как теперь видно?
версию сабжа отображать вместо дефолтного placeholder
можно стилями изменить название
Ну, не прямо «изменить».
Это некая CSS-мимикрия под это дело.
Довольно симпатичная, пока для псевдо
отрабатывает вот так
Да не сочиняй :)
После замены false на true
отрабатывает вот так
[spoiler][code]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUEAAADdCAIAAACqv1fqAAAaUElEQVR42u2dCXQUx52Haw7N6ECAA8YxEGA4bIFv5KwdEMFgDGRBYEjyEksoCwb7GXsXEXljwiZxJj5ik4NFZLPOxsJ4LYTjfW+NMTgP7BjxHMDJcgQMMTJI6EYGYUACSUjMsd3TPd3V3dUzI80wrRK/7/F4rZ7q6qqa+rqOkeZvCwaDJEwgEPD7/V1dXR0dHe+9994jj+QTAEAv4M03y+bMmZOWluZyuRwOh91uV16ywWEAej9wGAC+gcMA8A0cBoBv4DAAfAOHAeAbOAwA38BhAPgGDgPAN3AYAL6BwwDwDRwGgG/gMAB8kySHf7WuuFvp/3VlodUtAwAf9CKHp0ye9Oe9+6T/Izm8a/Xwgs2ho7zSxpemGRNUb5ifsz13z5ZlnvjaRrpR9rN73l06ij5OQLNHI0oVylcNW1wW/iHbu3vrjF2xVrnbFdHcK7+0ds1041vASsO4L1Her/JVIws2hQv/mEctGH0GxEbyHF5SkBdj4o2lm00dFjt35UqpK1RvKKleumx6hJyEvrV+XA9lFvslkbsjfZxkmFXocb16UBHDvRhvAZVG66p0Qcm8B7zj8/I3kdn6N0650HiQ/KbmFQscHjx4cOTEv/z39aYOC11k3djujCHxOKxca2HHSrjD3b3QcAnjLYilrYTz78/Wz5sEvYtI8ZZlZMP8QlIcylMYonfMsuRxySvWOOz6SZXyUtfzYzZu3Kj8uGTJkkgOh0aSCt10SxwZnjsoHilTO6EbrTiZE57gLXq9Yc00QzLCykGaCqqTw2zvy1neH4aPhfvWiJl7s7xe7cS
Надо отредактировать, чтобы было не вложенное меню
Эээ... Разве двадцать седьмая строка
const FlatMenu = false;
не специально для этого?
Придумал так
btn.setAttribute("title", "1\tFirst line\n2\tSecond line");
Не знаю, как по другому еще можно
Да чего там ещё от добра добра искать.
resource://gre/modules/TooltipTextProvider.sys.mjs
твой "title" подхватит, и в #aHTMLTooltip'е будет показан.
Можно ли как-то посмотреть прослушки на #main-window? В инспекторе есть кнопка event
Кнопка, это конечно хорошо, но,
раз такое дело, то почему бы не попрактиковать аскетику.
Запускаешь
Services.els.getListenerInfoFor(document.documentElement);
и смотришь.
Но, что-то там ничего особо интересного не видно.
Мне отдаёт массив всего из пяти экземпляров nsIEventListenerInfo
у каждого из которых, свойство listenerObject есть null
Впрочем, если задуматься, ничего удивительного, что так мало.
Кому бы понадобилось вешать листенер именно на html#main-window
Либо на что-то более конкретное дочернее,
либо, тогда уж, сразу на документ, окно, windowRoot окна
(вот там, числа уже вокруг сотни).
а как бы вы сделали?
Я? Ну, мне бы хотелось видеть нечто
чуть более информативное, то есть типа это альфа, бета, esr'ка...
Хотя, может быть таков и был твой замысел, обрезать именно
до трёх символов, чтобы занимало меньше места (отсюда же замысел не видно).
Всё нижепоследующее не имеет хоть сколько-нибудь
какого-то значения, но лишь чистая вкусовщина.
Мне не нравятся одинарные кавычки, предпочитаю двойные.
Впрочем, уместны, если нужен микс из обоих.
Название переменной elem, возможно, чтобы подчеркнуть,
что это не просто нода, а именно элемент.
Но я, скорее, склонен был бы её так и назвать — label
Вместо установки innerHTML предпочёл бы
использовать всё тот же append() и без промежуточной переменной,
покольку для этого нет никаких видимых причин.
Если есть возможность прицепить в обёртку нечто,
заведомо не могущее образовать ошибку (типа просто строка),
то, вроде, так чуть красивее смотриться, чем просто голые скобки ()
Вобщем, то же самое — вид сбоку
…Farby
Замудрый вопрос. Зависит от того, зачем нужно
«использовать в "DOMContentLoaded" gBrowser».
Да зачем вообще использовать "DOMContentLoaded".
Насколько я могу судить, это необходимо довольно редко,
для какого-то хитрого вмешательства,
когда потом уже будет поздно, или станет неоптимально.
Хорошо, допустим не совсем для этого, но хочется.
Тогда можно чуть подождать, например, в асинхронной обёртке
с-await-ить какой-нибудь window.delayedStartupPromise
да, думаю, хватит даже и document.documentReadyForIdle
Если нет, ладно, допустим, подавай gBrowser сразу.
Тогда можно попробовать сделать скрипт, который будет
пинать добавление gBrowser'а принудительно.
Скрипт, разумеется, должен будет исполняться в окне
раньше другх скриптов, которые используют gBrowser
Раз только «window.gBrowser = window._gBrowser», то,
надо полагать, gBrowser не инициализированый.
Тогда, судя по багу, такой вариант
[spoiler][code]gBrowser = new Tabbrowser();
for(let [prop, id] of Object.entries({
Ладно, пока буду сидеть на предыдущей версии UCF.
Полагаю, лучше пока попробовать сделать заплатку
для нынешней версии UCF отдельным скриптом.
(csw => { window[csw.replace("ts", window[csw] == this ? "t" : "t_all")] = this; this.unloadlisteners = {push: key => this.setUnloadMap(key, { apply: () => this[key].destructor() })}; })("ucf_custom_scripts_win");
помогите пожалуйста
Очень умно́. Нашёл кого спросить...
Я, всё ещё, считаю CSS для себя непостижимым.
Хорошо, подключил твой предоставленный павлиний код.
Вкладки, действительно, уехали куда-то вверх.
Добавил нечто, рождённое методом ненаучного тыка,
и вкладки, вроде, опустились.
#tabbrowser-tabs { min-height: 28px !important; } #TabsToolbar-customization-target { height: 28px !important; }
Northtech
Подождём коммита
Попытка запилить временный фикс-код для custom_script_win.js
Только не забудь удалить код, когда коммит нарисуется.
Если не работает, то удалить сразу.
(async url => { var bars = document.querySelectorAll( "#ucf-additional-vertical-bar, #ucf-additional-bottom-bar" ); if (!bars.length) return; var src = Cu.readUTF8URI(Services.io.newURI(url)); for(var info of Services.els.getListenerInfoFor(gNavToolbox)) { var listener = info.listenerObject; if (typeof listener == "function" && src.includes(String(listener))) for(var bar of bars) bar.addEventListener(info.type, listener, info.capturing); } })("chrome://browser/content/navigator-toolbox.js");
Кнопка Firefox View перестала работать на вертикальной панели
Вот, кстати, да. И не только она.
Я пользуюсь только верхним тулбаром,
поэтому как-то упустил этот момент.
Короче, видимо, эта песня (баг)
chrome://browser/content/navigator-toolbox.js
Вобщем, надо как-то пробросить это добро
для вертикального и нижнего.
Подождём коммита пару недель, затем,
если вдруг нет, — можно перезадать вопрос.