Полезная информация

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№20106-12-2024 16:28:15

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2265
UA: Firefox 78.0

Re: userChrome.js

dinn пишет

а как бы вы сделали?

Я? Ну, мне бы хотелось видеть нечто
чуть более информативное, то есть типа это альфа, бета, esr'ка...


Хотя, может быть таков и был твой замысел, обрезать именно
до трёх символов, чтобы занимало меньше места (отсюда же замысел не видно).


Всё нижепоследующее не имеет хоть сколько-нибудь
какого-то значения, но лишь чистая вкусовщина.


Мне не нравятся одинарные кавычки, предпочитаю двойные.
Впрочем, уместны, если нужен микс из обоих.


Название переменной elem, возможно, чтобы подчеркнуть,
что это не просто нода, а именно элемент.
Но я, скорее, склонен был бы её так и назвать — label


Вместо установки innerHTML предпочёл бы
использовать всё тот же append() и без промежуточной переменной,
покольку для этого нет никаких видимых причин.


Если есть возможность прицепить в обёртку нечто,
заведомо не могущее образовать ошибку (типа просто строка),
то, вроде, так чуть красивее смотриться, чем просто голые скобки ()


Вобщем, то же самое — вид сбоку

скрытый текст

Выделить код

Код:

(async css => {
	var label = document.createElement("label");
	label.append(AppConstants.MOZ_APP_VERSION_DISPLAY);   
	label.style.cssText = css;
	gURLBar._inputContainer.append(label);
})(`
	padding-block: 1px;
	font-size: 13px;
	color: gray;
`);

Отсутствует

 

№20209-12-2024 13:11:46

dinn
Участник
 
Группа: Members
Зарегистрирован: 28-09-2024
Сообщений: 37
UA: Firefox 133.0

Re: userChrome.js

Dumby, спасибо, подправил у себя + проверка на окно, чтобы консоль не пищала на AppConstants.


Возвращаясь к этому, не хватает подсказки при наведении мыши на кнопку - многострочную. Придумал так
btn.setAttribute("title", "1\tFirst line\n2\tSecond line");
Не знаю, как по другому еще можно и нужно ли


Не в тему, но отсутствие ответа на вопрос не дает мне норм спать по ночам. Можно ли как-то посмотреть прослушки на #main-window? В инспекторе есть кнопка event, но при ее нажатии ошибка в консоли
Error while calling actor 'domnode's method 'getEventListenerInfo' passing non-debuggable global to addDebuggee

Отсутствует

 

№20309-12-2024 20:52:00

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2265
UA: Firefox 78.0

Re: userChrome.js

dinn пишет

Придумал так
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 окна
(вот там, числа уже вокруг сотни).

Отсутствует

 

№20415-12-2024 14:13:43

dinn
Участник
 
Группа: Members
Зарегистрирован: 28-09-2024
Сообщений: 37
UA: Firefox 133.0

Re: userChrome.js

Dumby пишет

resource://gre/modules/TooltipTextProvider.sys.mjs
твой "title" подхватит, и в #aHTMLTooltip'е будет показан.

да и без файла подхватывает, а отображение в aHTMLTooltip не особо нужно

Кому бы понадобилось вешать листенер именно на html#main-window

Да часто лопушусь из-за названия main-window и считаю, что в нем прослушки на window


Я вот тута подумал, а можно ведь версию сабжа отображать вместо дефолтного placeholder с никому не нужной "Search or enter address".
Но реализация у меня костыльная. Здеся можно стилями изменить название, а если замутить


content: attr(ffversion);


а затем через обсервер в config.js


  let str = Services.appinfo.name + " " + Services.appinfo.platformVersion + " " + Services.appinfo.defaultUpdateChannel;
  doc.getElementById("urlbar-input").parentNode?.setAttribute("ffversion", str);


то получим то, что хотели

Отсутствует

 

№20516-12-2024 21:26:42

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2265
UA: Firefox 78.0

Re: userChrome.js

dinn пишет

да и без файла подхватывает, а отображение в aHTMLTooltip не особо нужно

Это было просто информационное сообщение.
Оно может быть понятным, или не понятным,
интересным, или не интересным ...


Но, оно не для того, чтобы комментировать поперёк.
Разве что только если я не прав. Хорошо, давай проверим.

и без файла подхватывает

Испортим то, что делает файл. Запускаем с консоли браузера:


ChromeUtils.importESModule("resource://gre/modules/TooltipTextProvider.sys.mjs")
    .TooltipTextProvider.prototype.getNodeText = (elm, out) => out.value = "???";


Затем, наводим указатель мыши на кнопку.
Что видно в тултипе?

отображение в aHTMLTooltip не особо нужно

Ладно, тогда долой. Запускаем aHTMLTooltip.remove();
Снова наводим. Как теперь видно?

версию сабжа отображать вместо дефолтного placeholder
можно стилями изменить название

Ну, не прямо «изменить».
Это некая CSS-мимикрия под это дело.
Довольно симпатичная, пока для псевдоэлемента
хватает горизонтального места.


А, если именно «изменить»,
то, скорее, наверно, типа как-то так.


Увы, изменить мало, надо ещё как-то предотвратить
обратную перестановку со стороны браузера.
Вариант с MutationObserver'ом

скрытый текст

Выделить код

Код:

(async (attr, rem) => {
	var input = document.getElementById("urlbar-input");
	(rem = () => input.removeAttribute(attr))();
	new MutationObserver(rem).observe(input, {
		attributes: true, attributeFilter: [attr]
	});

	input.setAttribute("placeholder", "Version Info");

})("data-l10n-id");


и без него
скрытый текст

Выделить код

Код:

(async keys => {
	var input = document.getElementById("urlbar-input");
	input.removeAttribute("data-l10n-id");

	input.setAttribute("placeholder", "Version Info");

	var p = Promise.resolve(), noop = () => p;
	for(var key of keys) BrowserSearch[key] = noop;

	Object.getOwnPropertyDescriptor(window, "gURLBar").get
		&& await document.documentReadyForIdle;

	var code = `{${gURLBar.view.input._updateSearchModeUI}}`.replace(
		/this\.document\.l10n\.setAttributes\([^)]+?this\.inputField.+?\);/gs,
		"// placeholder setup was here"
	);
	var url = `data:,Object.assign(gURLBar.view.input, ${encodeURIComponent(code)});`;
	(await ChromeUtils.compileScript(url)).executeInGlobal(window);
})([
	"initPlaceHolder",
	"_setURLBarPlaceholder",
	"_updateURLBarPlaceholder",
	"_updateURLBarPlaceholderFromDefaultEngine"
]);

Отсутствует

 

№20617-12-2024 13:11:05

dinn
Участник
 
Группа: Members
Зарегистрирован: 28-09-2024
Сообщений: 37
UA: Firefox 133.0

Re: userChrome.js

Dumby пишет

Это было просто информационное сообщение.
Оно может быть понятным, или не понятным

Мне не понятно, почему один и тот же атрибут на элементе button ведет себя по разному.
для одной кнопки атрибут title связан с подсказкой, а tooltiptext не пашет
для другой кнопки атрибут tooltiptext связан с подсказкой, а title - с названием
Может зависит от типа родительского элемента?


Dumby пишет

Испортим то, что делает файл

Да, теперь вижу зависимость от файла. "Хорошо" сломало тултипы с пониженными правами


Про placeholder, благодарю за оба варианта. Потестирую и если что не так - отпишусь.

Отсутствует

 

№20717-12-2024 20:04:41

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2265
UA: Firefox 78.0

Re: userChrome.js

dinn пишет

для одной кнопки атрибут 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");
      }


То есть, если это XUL элемент, то берётся атрибут "tooltiptext".
Иначе, если это не SVG элемент, то берётся атрибут "title".


Вот, демо-код для запуска с консоли.
Окошко с двумя кнопками.
У обоих кнопок присутствуют оба атрибута.
Какой будет показан в тултипе?

скрытый текст

Выделить код

Код:

(async (TITLE, TOOLTIP_TEXT) => {

	var win = openDialog("about:blank", "", "chrome,centerscreen,width=340,height=220");
	Services.scriptloader.loadSubScript("chrome://global/content/customElements.js", win);
	await new Promise(resolve => win.addEventListener("DOMContentLoaded", resolve, {once: true}));

	win.windowUtils.loadSheetUsingURIString("data:text/css," + encodeURIComponent(`
		:root, body {
			height: 100vh;
			display: flex;
			align-items: center;
			flex-direction: column;
			justify-content: space-around;
		}
		button {
			color: gray;
			font: 42px monospace, auto;
		}
	`), win.windowUtils.USER_SHEET);

	var doc = win.document;
	doc.title = "Test";


	var htmlButton = doc.createElement("button");
	
	htmlButton.setAttribute("title", `\n   HTML Button ${TITLE} Attribute   \n `);
	htmlButton.setAttribute("tooltiptext", `\n   HTML Button ${TOOLTIP_TEXT} Attribute   \n `);

	htmlButton.append("HTML Button");
	doc.body.append(htmlButton);


	var xulButton = doc.createXULElement("button");

	xulButton.setAttribute("title", `\n   XUL Button ${TITLE} Attribute   \n `);
	xulButton.setAttribute("tooltiptext", `\n   XUL Button ${TOOLTIP_TEXT} Attribute   \n `);

	xulButton.setAttribute("label", "XUL Button");
	doc.body.append(xulButton);
})(
	"\u{1d413}\u{1d408}\u{1d413}\u{1d40b}\u{1d404}",
	"\u{1d413}\u{1d40e}\u{1d40e}\u{1d40b}\u{1d413}\u{1d408}\u{1d40f} \u{1d413}\u{1d404}\u{1d417}\u{1d413}"
);

Отсутствует

 

№20818-12-2024 20:37:19

dinn
Участник
 
Группа: Members
Зарегистрирован: 28-09-2024
Сообщений: 37
UA: Firefox 133.0

Re: userChrome.js

Dumby пишет

То есть, если это XUL элемент, то берётся атрибут "tooltiptext".
Иначе, если это не SVG элемент, то берётся атрибут "title".

Ок, теперь ясно



Возвращаясь к скрытым вкладкам, обнаружил траблу.
Для короткоживущих (например, при открытии исх кода в новом окне) код работает как мне надо, т.е. не выводит алерт, однако это происходит за счет ошибки в консоли
"record.target.linkedBrowser is null"
Для исправления немного переделал код и вроде теперь все ок

original

Выделить код

Код:

var notify = records => alert('"true" hidden attribute on tab(s) detected.\n\n' + records.map(info).join("\n\n"));

mod

Выделить код

Код:

var notify = records => {
	for (let mutation of records) {
		if (mutation.target.collapsed) return;
	}
	alert('"true" hidden attribute on tab(s) detected.\n\n' + records.map(info).join("\n\n"));
}

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]