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

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

№82622-04-2023 18:35:51

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 97
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby пишет

Может так

Почти идеально, единственное в "Журнале" в левой колонке (поле) количество url-ов не показывается, а в правом поле их число отображается:
Places-4.1682176815.png  Places-3.1682176955.png
Порядок изменил на папки/закладки.
Если это муторно и времени отнимает много, то можно и оставить как есть.
За сделанное - огромное спасибо!

Отсутствует

 

№82723-04-2023 00:25:57

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1467
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby пишет

уже в 102 должно было перестать работать.

Ну да, не работает. Не приходилось пользоваться, видимо. Другие варианты компактнее и удобнее, если печать не нужна, а она редко нужна. На 112 просто системно перепроверяю все.

Отредактировано _zt (23-04-2023 00:26:49)

Отсутствует

 

№82823-04-2023 13:45:45

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 97
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

_zt пишет

Ну да, не работает. Не приходилось пользоваться, видимо

С правкой Dumby заработал, но у меня сохраняет без запроса и на рабочий стол. Как директорию для сохранения pdf-ок поменять не знаете..?

Отсутствует

 

№82923-04-2023 14:19:38

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1467
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

LGS
Я говорю, что проверил в 102 и там не работал код без правки. С правкой, понятное дело, работает.
   

Выделить код

Код:

var file = Services.prefs.getComplexValue("browser.download.dir", Ci.nsIFile);

Т.е browser.download.dir должен быть назначен, иначе (по умолчанию) его нет, а следовательно и сохранять будет, наверное, в зависимости от параметра browser.download.folderList - 0=desktop, 1=downloads (default), 2=last used.

Отредактировано _zt (23-04-2023 14:22:49)

Отсутствует

 

№83023-04-2023 14:22:19

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

LGS пишет

в "Журнале" в левой колонке (поле) количество url-ов не показывается

В левой колонке вообще нигде количество url-ов не показывается.
Это потому, что там дерево чисто "папочное". Нужно пересчитывать.


А ещё, наткнулся на такой феномен: если навести мышь
на название закрытого контейнера, то начинается жор процессора и памяти.


Видимо, из-за открытия контейнера, образуется некая инвалидация,
и getCellText() вызывается снова, где опять открывает контейнер, и так далее, то есть петля.
Почему только при наведении мышью — непонятно.


Вобщем, такой вариант

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

Выделить код

Код:

(async (CRN, QRN) => {
	var addFolderStats = node => {
		var title = PlacesUIUtils.getBestTitle(node, true);

		if (PlacesUtils.nodeIsContainer(node)) {
			node.QueryInterface(CRN).QueryInterface(QRN);

			if (node.queryOptions.excludeItems) {
				var opts = node.queryOptions.clone();
				opts.excludeItems = false;
			}
			if (opts || !node.containerOpen) {
				node = PlacesUtils.history
					.executeQuery(node.query, opts || node.queryOptions).root;
				node.containerOpen = true;
			}
			var urls = 0, containers = 0;
			for(var ind = 0, max = node.childCount; ind < max; ind++) {
				var child = node.getChild(ind);
				if (PlacesUtils.nodeIsURI(child)) urls++;
				else if (PlacesUtils.nodeIsContainer(child)) containers++;
			}
			title += ` (${containers}/${urls})`;
		}
		return title;
	}
	var proto = PlacesTreeView.prototype;
	Object.assign(proto, eval(`({getCellText: ${proto.getCellText}})`.replace(
		"PlacesUIUtils.getBestTitle(node, true)", "addFolderStats(node)"
	)));
})(Ci.nsINavHistoryContainerResultNode, Ci.nsINavHistoryQueryResultNode);

Отсутствует

 

№83123-04-2023 16:23:52

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 97
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby пишет

А ещё, наткнулся на такой феномен: если навести мышь
на название закрытого контейнера, то начинается жор процессора и памяти.

У себя такого эффекта не наблюдаю, проверил для чистоты эксперимента на версиях 112, 102, 91 и 78. Везде ровно, без признаков отжора. Наверное, от железа и настроек каких-нибудь зависит, я в about:config редко лазаю, и user.js не пользуюсь, если что и наворочено, то по-минимуму.

_zt пишет

и сохранять будет, наверное, в зависимости от параметра browser.download.folderList - 0=desktop, 1=downloads (default), 2=last used

Не реагирует ни на какие значения, как кидал на рабочий стол, так и кидает.

_zt пишет

browser.download.dir должен быть назначен, иначе (по умолчанию) его нет

А какой синтаксис будет правильный: browser.download.dir=, или как?

Отсутствует

 

№83223-04-2023 17:38:24

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1467
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

LGS
browser.download.dir это параметр about:config, так же как и browser.download.folderList
Синтаксис там обычный. ) Т.е., если вы здесь ничего не трогали
2023.1682261559.jpgто параметр отсутствует и соответственно скрипт его считать не может.
   

У себя такого эффекта не наблюдаю

А я наблюдаю по CPU, у меня виджет на панель задач выведен, а вот по памяти было ровно. Теперь все нормально, если не считать того, что в библиотеку не подключается, но там уже работает пара скриптов, так что скорее всего конфликт.

Отредактировано _zt (23-04-2023 17:57:03)

Отсутствует

 

№83323-04-2023 17:55:57

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 97
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

_zt

_zt пишет

browser.download.dir это параметр about:config, так же как и browser.download.folderList

Вообщем, как ни крути - все равно результата нет, решил пока встроенной сохранялкой в PDF пользоваться, которая через "Печать" вызывается, Могу ошибаться, но по-моему вы как раз и обсуждали с Dumby этот вариант:

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

Выделить код

Код:

if (typeof window.saveImageURL != "function") var saveImageURL = internalSave.length == 15
    ? (url, name, a3, a4, a5, a6, a7, type, a9, priv, prin) =>
        internalSave(url, null, name, a9, type, a4, a3, null, a6, null, a7, a5, null, priv, prin)
    : (url, name, a3, a4, a5, a6, a7, type, a9, priv, prin) =>
        internalSave(url, null, name, a9, type, a4, a3, null, a6, a7, a5, null, priv, prin);

плюс значок и пункт меню в "Save":
     
скрытый текст

Выделить код

Код:

{ label: "Печать / печать в PDF", func: document.getElementById(document.getElementById("appMenu-viewCache").content.querySelector("[key=printKb]").getAttribute("command")).getAttribute("oncommand"), image: "chrome://global/skin/icons/print.svg"},
   { label: "Сохранить страницу / выбор как HTML", func: "savePageToHTML()", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACzElEQVQ4jV2STW8bZRDHf/Psrr11nZhgVKcKaSmUiArRKBRVIMgH4BKJ7xAp5MSFiA+Rc28ckBAoipC4koJQLyAaVFChIlQllDRWmjRev8Qvu14/+wwHx6ZlpNFcZn7zn79GVJW1tbXc6urqijHGqKoAPF3TgcVaq8owXJbphx99fOOnWzcHoqqsr68/t7y83BARVBXnHHraXo3a3HoUU8gFAHRTS2Bg/7C2Zx7vXPIBwjA0p3BU9Zns9i3vvVrhr6MWzlpee+EsRqAbHc3+/Pee7wPkcrkx4P+g0IMvb/5Iv5/iXEaWZQS+By578MaVy9YH8H3fE5FnANZajqMmgcAnH7yN73mICMYMd21sbLy7srKiPkA+n3/qBLhzv8p+EuOfTUjShPbODvOVWa5fnRsvKBaLAcAIMFbw+bc/EBVn8At7SPcQ60LSiVm++P0fGu0e7y++yalvHoABCILAiAj7hzU+vfcVT6zPVGmR3x4/xJoLSH6BVu4cN777nnQwQETI5XL/AYwxRkS4ff8BEk6Q2pBfq3dxUuHMmWt0kgFGStTDY/7YrTLybQwYPU2cpgzsCd1OgmSzWHeOR7VjWicxaT9lxn+HfjoYmWnGHgAiIsydf5HKnUXiThehQDG4Tr3e5KR7hN8XilnGKxfOoyrDgZECwIgIb125xIxxTGVdgjRG4pR2+zbG/sIkD7l2cYJyaYLMOZxzjBV4nueLCI1GnaWFab65t4OXt4gUuFqYJ8gGuPYBCxdLHNciys9PkaapjAHGGM8YQ7lcZv71OaYmC/xZPaJHTN4cUgpDXrr8MtOVaUqTRXzfY3t7u7O0tDR82a2trfkkSTSOY+31etrpdLTZbGoURRpFkdbrTY3qTW00mhrHse7u7t4tl8uhqg4VxHHcPDg4+ExVHeBU1YmIU1WnisucZtamLszn01ar9WRzc/PrWq2WAPwLJ7l2ULfXOAMAAAAASUVORK5CYII="},


Там и диалог сохранения имеется, и качество на выходе неплохое...

Отсутствует

 

№83423-04-2023 17:59:10

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1467
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

LGS
Я изменил свое сообщение, проверьте параметр.
Да, когда то обсуждали эти два пункта.

Отсутствует

 

№83523-04-2023 19:20:52

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 97
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

_zt пишет

Я изменил свое сообщение, проверьте параметр

Оказывается, дело было в том, что у меня папка "Загрузки" находится не на С: , а перенесена на другой диск-помойку. Если выбрать любую другую папку, то пожалуйста - сохраняет в указанную.
А в "Загрузки" не на системном разделе - не хочет. Скрин помог, спасибо, разобрались.

Отсутствует

 

№83623-04-2023 19:50:55

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 97
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Вернул, ради проверки, путь для сохранения "Загрузки" (у меня там путь: "F:\Windows 7\Documents\Downloads") - скрипт начал отрабатывать как положено, грузить в "Загрузки".
Downloads.1682268324.png

Отсутствует

 

№83723-04-2023 22:28:49

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1467
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

LGS
Возможно с правами напутано на целевом диске или в целевой папке. У меня сохраняет куда укажу в настройках, на любой диск и по любым путям (и с пробелами и с кириллицей).
   
Второй параметр browser.download.folderList если равен = 2, должен по идее вообще запретить рабочий стол использовать.

Отредактировано _zt (23-04-2023 22:32:38)

Отсутствует

 

№83828-04-2023 08:24:50

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 97
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby, посмотрите, пожалуйста, эту кнопку, последняя функция внизу "Общее количество закладок". Не работает в 112, консоль пишет:
Uncaught TypeError: Cc['@mozilla.org/embedcomp/prompt-service;1'] is undefined.

Отсутствует

 

№83928-04-2023 09:27:47

Farby
Участник
 
Группа: Members
Зарегистрирован: 21-11-2012
Сообщений: 249
UA: Google 2.1

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

LGS пишет

Uncaught TypeError: Cc['@mozilla.org/embedcomp/prompt-service;1'] is undefined.

Dumby про это писал здесь


Жизнь иногда такое выкидывает, что хочется подобрать...

Отсутствует

 

№84028-04-2023 12:19:09

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 541
UA: Firefox 113.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

LGS
Я у себя заменил:

Выделить код

Код:

var prompts = Cc["@mozilla.org/embedcomp/prompt-service;1"].getService(Ci.nsIPromptService);

На:

Выделить код

Код:

var prompts = Cc["@mozilla.org/prompter;1"].getService(Ci.nsIPromptService);

Пока работает.


«The Truth Is Out There»

Отсутствует

 

№84128-04-2023 12:37:01

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 97
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

unter_officer пишет

var prompts = Cc["@mozilla.org/prompter;1"].getService(Ci.nsIPromptService);

Спасибо, работает.

Отсутствует

 

№84205-05-2023 18:38:16

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 97
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby, можно придумать скрипт, чтобы показывал версию отключенных расширений на странице about:addons..? Стиль от Aris. Посмотрел скрипты ("Дополнения", extensionOptionsMenu) - они у себя версию у отключенных дополнений отображают. Может, для about:addons что-то получится сделать..?

Отсутствует

 

№84305-05-2023 18:59:48

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1165
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

LGS
Кнопка показывает https://forum.mozilla-russia.org/viewto … 24#p785024. Если не обязательно на about:addons...

Отсутствует

 

№84405-05-2023 19:18:21

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 97
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

xrun1 пишет

Кнопка показывает https://forum.mozilla-russia.org/viewto … 24#p785024. Если не обязательно на about:addons

Я про кнопки упоминал в посте в скобках... Хотелка именно именно для about:addons.

Отсутствует

 

№84505-05-2023 23:04:41

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

LGS пишет

показывал версию отключенных расширений на странице about:addons

Скорее интереснее, куда она девается.
Я посмотрел на 112, и что-то не вижу, чтобы это было сделано специально.
Похоже, что её просто document.l10n.setAttributes() куда-то выбрасывает.

можно придумать скрипт

Ой, сейчас немного неохота, и некогда.
Может у тебя есть какие-нибудь скрипты, которые уже что-то делают на about:addons ?
Я в том смысле, что тогда можно было бы попробовать дописать туда ещё кусок кода.

Отсутствует

 

№84606-05-2023 15:21:05

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 97
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby пишет

Может у тебя есть какие-нибудь скрипты, которые уже что-то делают на about:addons ?
Я в том смысле, что тогда можно было бы попробовать дописать туда ещё кусок кода.

Только этот:

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

Выделить код

Код:

(async (css, self) => ({

	//===[ Buttons ]===================================================================

	vertical: true,
	btnActions: ["preferences", "toggle-disabled", "remove", "install-update"],

	cn: "ucf-cloned-button",
	update(e) {
		var trg = e.target;
		trg.nodeName == "ADDON-CARD" && trg.addon.type != "theme" && this.onCard(trg);
	},
	onCard(card, again) {
		var btnsParent = card.querySelector("addon-options");
		if (!btnsParent) return again || card.ownerGlobal
			.requestAnimationFrame(() => this.onCard(card, true));

		var doc = card.ownerDocument;
		var [span] = card.getElementsByClassName(this.ccn);
		if (span) span.textContent = "";
		else
			card.querySelector("button.more-options-button")
				.before(span = doc.createElement("span")),
			span.className = this.ccn;

		var item, num = 0;
		for(var sel of this.btnActions) {
			if (num++ == this.tInd) {
				if (!card.querySelector(this.ts)) continue;
				item = this.createPanelItem(doc);
				item.setAttribute("action", "toggle-disabled");
				doc.l10n.setAttributes(item, `${
					btnsParent.parentNode.getAttribute("active") == "true" ? "dis" : "en"
				}able-addon-button`);
			} else {
				item = btnsParent.querySelector(sel);
				if (!item) continue;
				item = this.clone(item);
			}
			span.append(item);
			item.shadowRoot.querySelector("button").classList.add(this.cn);
		}
	},

	//===[ Popup ]=====================================================================

	items: {
		"Копировать имя": [
			addon => self.copy(addon.name),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4jY2TTUhUURiGn5tD0Sp00iAwXM1iFu4kWkUZg/9MoZQhdoUCV7ooItq4atFORRGkuLMwoc0kNBGKDLSwFpEIQgspqGUUNsjI3HvPX4s7I3Nn7oW+1fn5vvd8z3vOsYiIgXuPneFMr21ZVmh9+m7GisoPxcTsM2d46on5c1gy9bHgvDVR+afqJzNzy870xIgNUJGGkqf4XVEAuJ4XeWCiNpibX3MGr/XYPd0pADxlOK0MQgf7Xw++sfJq0zRiJQAWcgWndHRkr28UWcrlAfCVwa8KrK4XOPxbYqz/MsnWcyfFi7lCIPD9x0/70YNRykKz+eELQkny74sIJbnQmqQ71UVhe+cES2hoP9uC63mBgO/7dF7s4NexZPRmBqlBaMPHnc+kL7UTh1VxqwKuGxjkaUP+zRZCSVqwKJeP2dvdj8SqGZuod9hXhr6hGwgNL5ZfEoc1PnaL2sFNAlvvthFKxmJJbfCUqXbghhHSyTOkJwcBmHr4vAnLVwKhJEPZbLgDXwh678yG7rfjfLIJS2qD0IEP9R6kiq8XrzS+sOz9p5+asKodXB0YCQkcNBbHYUXlxP6u67dnIj9PY8QJpIC2/6iX/wDxeTOAfNDrywAAAABJRU5ErkJggg==",
		],
		"Копировать ID": [
			addon => self.copy(addon.id),
			"Копировать имя"
		],
		"Копировать версию": [
			addon => self.copy(addon.version),
			"Копировать имя",
			addon => !addon.version
		],
		"Копировать имя и версию": [
			addon => self.copy(addon.name + " " + addon.version),
			"Копировать имя",
			addon => !addon.version
		],
		"Копировать URL кнопки": [
			(addon, win) => {
				var btn = Object.assign({
					parameters: {},
					get initcode() {return this.initCode;},
					setText(doc, name, t, cds) {
						win.custombutton.buttonSetText(doc, name, this[name], cds);
					}
				}, win.custombuttons.cbService.getButtonParameters(addon.buttonLink));
				self.copy(win.custombutton.buttonGetURI(btn));
			},
			"Копировать имя",
			addon => addon.type != "custombuttons"
		],
		"Домашняя страница": [
			(addon, win) => win.openURL(addon.homepageURL || addon.reviewURL.replace(/\/reviews\/.*$/, "/")),
			"data:image/png;base64,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",
			addon => !addon.homepageURL && !addon.reviewURL
		],
		"Поиск на АМО": [
			(addon, win) => win.openURL(
				addon.homepageURL || ("https://addons.mozilla.org/search/?q=" + encodeURIComponent(addon.name))
			),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJGSURBVDjLjdJLSNRBHMDx78yqLZaKS75DPdgDDaFDbdJmde5QlhCJGxgpRJfqEEKnIsJLB7skQYQKZaSmdLaopPCgEvSCShCMzR5a7oq7/3l12RVtjfzBMA/4fWZ+MyOccwBM3g8HEbIdfCEhfAFnLVapOa28Uevpjrqz/WOsERJgsu9Uq5CZQzgqrJfo9BajNd5irEYn4p3OUiFExtCLmw2tawFi4l5zUMjMIau9u7K+qxeoAcoAA0wDb2OPwmfA16LiiaOHLj1edRLpkO3WmIis7+oBDgJbgQ2AH6gC6jY19N62RkcctKeVIJAhp9QgUA3kJXdONZVcq9JxPSgQoXRAyIDRth8oAXQyKdWnoCKrTD9CBv4GMqx1WGNZkeRWJKbG2hiD1Cb9FbTnzWFdY/LCdLKlgNQ84gyNKqHm0gDjqVHnxDHgA/B9RQkpaB6YklkZl62np9KBhOqwjpKFgeY2YAz4BESBWHI8Hhs6PVVSvc3v98ye4fP7T676B845nt040ip98qpWJmI9PWiU6bfWgXGN2YHcKwU7tsuc4kpUPMbU0+f8+vKt+Pitl7PLAMDI9cNBoB0hQwICzjqUp6MZvsy8yvp95BRuQUjJ75mPvH4wYo1NlJ64Mza7DPwrhi8cCOeXl/aUB4P4c/NJxKLMvpngycCrzxVFG2v/CwAMnguF80oLe8p27cQh+fnpPV/fTc95S6piXQDAw7a9YbWkezZXFbAwMx/xPFXb1D3+Y90AQF/L7kAsri9mZ4lrTd0TcYA/Kakr+x2JSPUAAAAASUVORK5CYII=",
			["custombuttons", "theme", "plugin"]
		],
		"Папка установки": [
			addon => self.getFile(addon).reveal(),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABAklEQVR42mNkoBAwAjEXEAcCMTsW+U9AvB6I/+I0gJ2Noe3QJoZKASEgjwkq+h+C795lYPCKZMgC8mZg0fsfbICIIMOcF6cZkrGZ/v8fA0PndIa/7z8BXfAPqgVKv//A8GPeZoYERmE+hjmP1+AwAOgiTjOIP7HZLyjLMJNRmB/ogjMMyYzsUC8wIhQwsgCFWHAHoKAy0AARIYY5r69idwEhIKgBMgAYBq8vkGmALsyAU2QaYAwz4CiZBliADBAAGnCATANsYQbsJtMAJ5ABwGh8uZE8A4R9gAYwMzHkT8hl6Bfgxp5ecIH3Xxj+F05hyIdpUmXAnpnwge9AfJckW7EBAC/gSzisxsnmAAAAAElFTkSuQmCC",
			["custombuttons", "theme", "plugin"]
		],
		"Файл установки": [
			addon => self.getFile(addon).launch(),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA51AAAOdQG5Y1EyAAAAhklEQVQ4y6WT0QnAIAxE78Bt2v1cod3PznP9kVLTRKUGBD+Sd5eQUBJWggCWCAkAJPGXOqlUPyVKkrSPQIoCQJGE6AF4HFyGuBmrR3cGQX8Wmp2cL8Cqv5JPD5Zm1D0nFZjTjHpQ7DuI1L3iBjBS9/pvhtjr21OukVkXiX/ug6SWj4mr53wDMz1vldHlLJkAAAAASUVORK5CYII=",
			["custombuttons", "theme", "plugin"]
		],
		"Проверить обновления": [
			Cr.NS_ERROR_NET_TIMEOUT_EXTERNAL // Fx 87+
				? (addon, win) => win.content.checkForUpdate(addon)
				: (addon, win) => win.content.frames[0].checkForUpdate(addon),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAACVUlEQVQ4jXWT30vTYRTGP3Mb+ZbiXmm6DGUO0pkQGQR2URBdKZWWIHRlFHYhXnQRdVUEBUn/gBddFZERaalUoAUhYUglVIjO5TKbjMDtq2vDQ9t8u0jnr3Xgvfuch/M87zk2rTX/K+u05QROUMBVlrmkn+lvWxlHzsbjVj4uzlHFFec15/7UYCrFU6xcrF0ptbn5jNVADS9o47yvxed24yZRnchLz6dbpUSUlMhHNavSa3zeNskMIZzYOQChPyGmolNIXGz+Tn/lvu59d6jhtdVkZX1vm0AFVFSKpZfPNHKQ3SSBPsxCfMEWi8Rwtbkq5L3UqnH1OCtgNVleqRaf+MUjXrH0Sx2TUuklQAt+XPRykyAzFHNIfgkUUyV58k4FVOifhVLe0sUnGhknnyoAPaAjzHGUbkYxjOlHup0R7iPATqCI9vUMHHhwAR7SGCJrdnS/DjPOMd2nhwD4zS2CZEgCBRxZF8gQJgrkYwcqNmaiJ3QGMADMMMsyMeyAE/e6QII3TEP54XIbhXSufqfXarEebEwcH7swFBIDUqSyIYpPFrFzIV4ZhwLqBDGskOE6XUxwUsqkRwWVyF6xscw0P3lOgodqSgXRWqO1tnGZVwxiiGAYw3CbpWbTbDpMh+EGH2jDvcpuetk9EK8ME6UBQwkOoJUdc445RodHqb9YXxaeDJ8StwyogIrnXGUVUEkplx7mKWKJWn7gTH1PwQqEv4bBQRHzLKlJNbJRwJbrGq2zlps9fKEOD5MIEZ6Q5K7u1xNb2ZzXiEFYxDBEF8I9PaBDOTngLwkg8PzzO00cAAAAAElFTkSuQmCC",
			addon => !addon.applyBackgroundUpdates || addon.isBuiltin
		],
	},
	listContainerId: "ucf-aa-extra-items-container",
	showing(e) {
		var card = e.target.closest("addon-card");
		if (!card) return;

		this.labs = [];
		var imgs = new Map();
		var set = (key, val) => imgs.set(key, imgs.has(key) ? imgs.get(key).concat(val) : [val]);
		var entries = Object.entries(this.items);

		entries.forEach(([lab, [func, img, hideOn]], ind) => {
			this.labs.push(lab);
			(this[lab] = func).hideOn = hideOn;
			img && set(this.items[img]?.[1] ? entries.findIndex(a => a[0] == img): ind, ind);
		});
		if (imgs.size) {
			var cspRe = /^(?:chrome|file|jar|resource|moz-extension|https?):/;
			var [s, p, o] = this.vers >= 110
				? ["::part(button)", "background-image", "AUTHO"] : ["", "--icon", "USE"];

			var reg = [], push = (ind, icon) => {
				var chromeImg = "chrome://user_chrome_files/content/aaepiimg_" + ind;
				reg.push(["override", chromeImg, icon]);
				return chromeImg;
			}
			var rules = [];
			for(var [ind, nums] of imgs) {
				var sel = [], img = entries[ind][1][1];
				for(var num of nums) sel.push(
					`\t#${this.listContainerId} > panel-item:nth-child(${num + 1})${s}`
				);
				rules.push(`${sel.join(",\t\n")} {\n\t\t${p}: url(${
					cspRe.test(img) ? img : push(ind, img)
				}) !important;\n\t}`);
			}
			if (reg.length) {
				var ams = Cc["@mozilla.org/addons/addon-manager-startup;1"]
					.getService(Ci.amIAddonManagerStartup);
				var mUri = Services.io.newFileURI(Services.dirsvc.get("ProfD", Ci.nsIFile));
				this.chromeReg = ams.registerChrome(mUri, reg);
			}
			this.regSheet(`\n${rules.join("\n")}\n}`, o + "R_SHEET");
		}
		delete this.items;

		self = this;
		this.sym = Symbol.for(this.listContainerId);
		(this.showing = e => {
			var card = e.target.closest("addon-card");
			card && this.onListShowind(card.addon, e.target);
		})(e);
		this.onListShowind(card.addon, e.target);
	},
	async onListShowind(addon, list) {
		var doc = list.ownerDocument, win = doc.ownerGlobal;
		var container = doc[this.sym];
		if (!container) {
			container = doc[this.sym] = doc.createElement("div");
			container.onclick = this.cclick;
			container.id = this.listContainerId;
			for(var lab of this.labs)
				container.appendChild(this.createPanelItem(doc)).append(lab);

			var mo = new win.MutationObserver(this.mut);
			(container.mo = mo).container = container;
		}
		for(var item of container.children) {
			var h = this[item.textContent].hideOn;
			item.hidden = h && (h.call ? h(addon) : h.includes(addon.type));
		}
		var {mo} = container;
		mo.disconnect();
		list.contains(container) || list.prepend(container);
		mo.count = 0;
		mo.ts = Date.now();
		mo.observe(list, {childList: true});
	},
	mut(muts, mo) {
		if (++mo.count > 10 || Date.now() - mo.ts > 100)
			return mo.disconnect();
		var list = muts[0].target, {container} = mo;
		if (list.firstElementChild != container)
			mo.disconnect(),
			list.prepend(container),
			mo.observe(list, {childList: true});
	},
	cclick(e) {
		e.stopImmediatePropagation();
		this.parentNode.hide();
		self[e.target.textContent](
			e.target.closest("addon-card").addon,
			e.view.windowRoot.ownerGlobal
		);
	},
	copy: str => (self.copy =
		Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString
	)(str),
	getFile(addon) {
		var file, uri = addon.getResourceURI();
		if (uri instanceof Ci.nsIJARURI) uri = uri.JARFile;
		if (uri instanceof Ci.nsIFileURL) file = uri.file;
		return file;
	},

	//================================================================================

	init(topic, quit) {
		Services.obs.addObserver(this, topic);
		Services.obs.addObserver(quit = (s, t) => {
			Services.obs.removeObserver(quit, t);
			Services.obs.removeObserver(this, topic);
		}, "quit-application-granted");
	},
	isTargetDoc: doc => doc.ownerGlobal.docShell
		.currentDocumentChannel.name.endsWith("/aboutaddons.html"),
	observe(doc) {
		if (!this.isTargetDoc(doc)) return;

		var vers = this.vers = parseInt(Services.appinfo.platformVersion);
		this.ts = `${vers >= 111 ? "moz-toggle" : "input"}[action="toggle-disabled"]`;

		css = css.replace("%TS%", this.ts)
			.replace(/%CN%/g, this.cn)
			.replace(/;$/gm, " !important;")
			.replace("%FD%", this.vertical ? "column" : "row");

		this.regSheet(css, "USER_SHEET");

		var unload = e => {
			e.target.removeEventListener("update", this, true);
			e.target.removeEventListener("showing", this, true);
		}
		var load = doc => {
			doc.addEventListener("update", this, true);
			doc.addEventListener("showing", this, true);
			doc.ownerGlobal.addEventListener("unload", unload, {once: true});
		}
		this.handleEvent = e => this[e.type](e);
		this.observe = doc => this.isTargetDoc(doc) && load(doc);

		this.ccn = this.cn + "s-container";
		this.tInd = this.btnActions.findIndex(s => s == "toggle-disabled");

		this.btnActions = this.btnActions.map(
			action => `panel-list > panel-item[action="${action}"]`
		);
		this.createPanelItem = vers == 110
			? doc => new (doc.ownerGlobal.customElements.get("panel-item"))
			: doc => doc.createElement("panel-item");

		if (vers >= 89) this.clone = item => item.cloneNode(true);
		else {
			var cf = function(e) {
				var win = e.view;
				win.InspectorUtils.removeContentState(this, 4, true);
				Services.focus.clearFocus(win);
			}
			this.clone = item => {
				var clone = item.cloneNode(true);
				clone.onclick = cf;
				return clone;
			}
		}
		load(doc);
	},
	regSheet(...args) {
		var prfx = "data:text/css;charset=utf8,@-moz-document url(about:addons),%0A"
			+ "url(chrome://mozapps/content/extensions/aboutaddons.html) {";
		var sss = Cc["@mozilla.org/content/style-sheet-service;1"]
			.getService(Ci.nsIStyleSheetService);
		(this.regSheet = (code, origin) => sss.loadAndRegisterSheet(
			Services.io.newURI(prfx + encodeURIComponent(code)), sss[origin]
		))(...args);
	}
}).init("chrome-document-loaded"))(`\

	span.%CN%s-container {
		display: flex;
		flex-direction: %FD%;
		row-gap: 1px;
	}
	addon-card[expanded] span.%CN%s-container {
		flex-direction: row;
	}
	button.%CN% {
		-moz-appearance: none;

		margin: 0 1px;
		padding: 1px 6px 3px 6px;
		background-image: none;
		background-color: rgba(174, 236, 235, 0.9);

		border-radius: 0;
		border: 1px solid #bbb;

		font-size: 13px;
		white-space: nowrap;
		font-family: Segoe UI;
	}
	button.%CN%:hover {
		background-color: gold;
	}
	button.%CN%:after, %TS% {
		display: none;
	}
}`);

Addons.1683375076.png

В основном стилями обходился.

Dumby пишет

Ой, сейчас немного неохота, и некогда.

Не вопрос, конечно. Только, если можно, в мусорку просьбу мою не выкидывать... когда желание и время появятся - посмотреть, что можно сделать.

Отсутствует

 

№84706-05-2023 20:40:00

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

LGS пишет

Только этот

OK. Возвращаю модифицированный.
Вписал результат неких экспериментов на предмет просьбы,
которые, в 113, чисто с веб-консоли проводились.

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

Выделить код

Код:

(async (css, self) => ({

	//===[ Buttons ]===================================================================

	vertical: true,
	btnActions: ["preferences", "toggle-disabled", "remove", "install-update"],

	cn: "ucf-cloned-button",
	update(e) {
		var trg = e.target;
		trg.nodeName == "ADDON-CARD" && trg.addon.type != "theme" && this.onCard(trg);
	},
	onCard(card, again) {
		var btnsParent = card.querySelector("addon-options");
		if (!btnsParent) return again || card.ownerGlobal
			.requestAnimationFrame(() => this.onCard(card, true));

		var doc = card.ownerDocument;
		var [span] = card.getElementsByClassName(this.ccn);
		if (span) span.textContent = "";
		else
			card.querySelector("button.more-options-button")
				.before(span = doc.createElement("span")),
			span.className = this.ccn;

		var item, num = 0;
		for(var sel of this.btnActions) {
			if (num++ == this.tInd) {
				if (!card.querySelector(this.ts)) continue;
				item = this.createPanelItem(doc);
				item.setAttribute("action", "toggle-disabled");
				doc.l10n.setAttributes(item, `${
					btnsParent.parentNode.getAttribute("active") == "true" ? "dis" : "en"
				}able-addon-button`);
			} else {
				item = btnsParent.querySelector(sel);
				if (!item) continue;
				item = this.clone(item);
			}
			span.append(item);
			item.shadowRoot.querySelector("button").classList.add(this.cn);
		}
	},

	//===[ Popup ]=====================================================================

	items: {
		"Копировать имя": [
			addon => self.copy(addon.name),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4jY2TTUhUURiGn5tD0Sp00iAwXM1iFu4kWkUZg/9MoZQhdoUCV7ooItq4atFORRGkuLMwoc0kNBGKDLSwFpEIQgspqGUUNsjI3HvPX4s7I3Nn7oW+1fn5vvd8z3vOsYiIgXuPneFMr21ZVmh9+m7GisoPxcTsM2d46on5c1gy9bHgvDVR+afqJzNzy870xIgNUJGGkqf4XVEAuJ4XeWCiNpibX3MGr/XYPd0pADxlOK0MQgf7Xw++sfJq0zRiJQAWcgWndHRkr28UWcrlAfCVwa8KrK4XOPxbYqz/MsnWcyfFi7lCIPD9x0/70YNRykKz+eELQkny74sIJbnQmqQ71UVhe+cES2hoP9uC63mBgO/7dF7s4NexZPRmBqlBaMPHnc+kL7UTh1VxqwKuGxjkaUP+zRZCSVqwKJeP2dvdj8SqGZuod9hXhr6hGwgNL5ZfEoc1PnaL2sFNAlvvthFKxmJJbfCUqXbghhHSyTOkJwcBmHr4vAnLVwKhJEPZbLgDXwh678yG7rfjfLIJS2qD0IEP9R6kiq8XrzS+sOz9p5+asKodXB0YCQkcNBbHYUXlxP6u67dnIj9PY8QJpIC2/6iX/wDxeTOAfNDrywAAAABJRU5ErkJggg==",
		],
		"Копировать ID": [
			addon => self.copy(addon.id),
			"Копировать имя"
		],
		"Копировать версию": [
			addon => self.copy(addon.version),
			"Копировать имя",
			addon => !addon.version
		],
		"Копировать имя и версию": [
			addon => self.copy(addon.name + " " + addon.version),
			"Копировать имя",
			addon => !addon.version
		],
		"Копировать URL кнопки": [
			(addon, win) => {
				var btn = Object.assign({
					parameters: {},
					get initcode() {return this.initCode;},
					setText(doc, name, t, cds) {
						win.custombutton.buttonSetText(doc, name, this[name], cds);
					}
				}, win.custombuttons.cbService.getButtonParameters(addon.buttonLink));
				self.copy(win.custombutton.buttonGetURI(btn));
			},
			"Копировать имя",
			addon => addon.type != "custombuttons"
		],
		"Домашняя страница": [
			(addon, win) => win.openURL(addon.homepageURL || addon.reviewURL.replace(/\/reviews\/.*$/, "/")),
			"data:image/png;base64,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",
			addon => !addon.homepageURL && !addon.reviewURL
		],
		"Поиск на АМО": [
			(addon, win) => win.openURL(
				addon.homepageURL || ("https://addons.mozilla.org/search/?q=" + encodeURIComponent(addon.name))
			),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJGSURBVDjLjdJLSNRBHMDx78yqLZaKS75DPdgDDaFDbdJmde5QlhCJGxgpRJfqEEKnIsJLB7skQYQKZaSmdLaopPCgEvSCShCMzR5a7oq7/3l12RVtjfzBMA/4fWZ+MyOccwBM3g8HEbIdfCEhfAFnLVapOa28Uevpjrqz/WOsERJgsu9Uq5CZQzgqrJfo9BajNd5irEYn4p3OUiFExtCLmw2tawFi4l5zUMjMIau9u7K+qxeoAcoAA0wDb2OPwmfA16LiiaOHLj1edRLpkO3WmIis7+oBDgJbgQ2AH6gC6jY19N62RkcctKeVIJAhp9QgUA3kJXdONZVcq9JxPSgQoXRAyIDRth8oAXQyKdWnoCKrTD9CBv4GMqx1WGNZkeRWJKbG2hiD1Cb9FbTnzWFdY/LCdLKlgNQ84gyNKqHm0gDjqVHnxDHgA/B9RQkpaB6YklkZl62np9KBhOqwjpKFgeY2YAz4BESBWHI8Hhs6PVVSvc3v98ye4fP7T676B845nt040ip98qpWJmI9PWiU6bfWgXGN2YHcKwU7tsuc4kpUPMbU0+f8+vKt+Pitl7PLAMDI9cNBoB0hQwICzjqUp6MZvsy8yvp95BRuQUjJ75mPvH4wYo1NlJ64Mza7DPwrhi8cCOeXl/aUB4P4c/NJxKLMvpngycCrzxVFG2v/CwAMnguF80oLe8p27cQh+fnpPV/fTc95S6piXQDAw7a9YbWkezZXFbAwMx/xPFXb1D3+Y90AQF/L7kAsri9mZ4lrTd0TcYA/Kakr+x2JSPUAAAAASUVORK5CYII=",
			["custombuttons", "theme", "plugin"]
		],
		"Папка установки": [
			addon => self.getFile(addon).reveal(),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABAklEQVR42mNkoBAwAjEXEAcCMTsW+U9AvB6I/+I0gJ2Noe3QJoZKASEgjwkq+h+C795lYPCKZMgC8mZg0fsfbICIIMOcF6cZkrGZ/v8fA0PndIa/7z8BXfAPqgVKv//A8GPeZoYERmE+hjmP1+AwAOgiTjOIP7HZLyjLMJNRmB/ogjMMyYzsUC8wIhQwsgCFWHAHoKAy0AARIYY5r69idwEhIKgBMgAYBq8vkGmALsyAU2QaYAwz4CiZBliADBAAGnCATANsYQbsJtMAJ5ABwGh8uZE8A4R9gAYwMzHkT8hl6Bfgxp5ecIH3Xxj+F05hyIdpUmXAnpnwge9AfJckW7EBAC/gSzisxsnmAAAAAElFTkSuQmCC",
			["custombuttons", "theme", "plugin"]
		],
		"Файл установки": [
			addon => self.getFile(addon).launch(),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA51AAAOdQG5Y1EyAAAAhklEQVQ4y6WT0QnAIAxE78Bt2v1cod3PznP9kVLTRKUGBD+Sd5eQUBJWggCWCAkAJPGXOqlUPyVKkrSPQIoCQJGE6AF4HFyGuBmrR3cGQX8Wmp2cL8Cqv5JPD5Zm1D0nFZjTjHpQ7DuI1L3iBjBS9/pvhtjr21OukVkXiX/ug6SWj4mr53wDMz1vldHlLJkAAAAASUVORK5CYII=",
			["custombuttons", "theme", "plugin"]
		],
		"Проверить обновления": [
			Cr.NS_ERROR_NET_TIMEOUT_EXTERNAL // Fx 87+
				? (addon, win) => win.content.checkForUpdate(addon)
				: (addon, win) => win.content.frames[0].checkForUpdate(addon),
			"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAACVUlEQVQ4jXWT30vTYRTGP3Mb+ZbiXmm6DGUO0pkQGQR2URBdKZWWIHRlFHYhXnQRdVUEBUn/gBddFZERaalUoAUhYUglVIjO5TKbjMDtq2vDQ9t8u0jnr3Xgvfuch/M87zk2rTX/K+u05QROUMBVlrmkn+lvWxlHzsbjVj4uzlHFFec15/7UYCrFU6xcrF0ptbn5jNVADS9o47yvxed24yZRnchLz6dbpUSUlMhHNavSa3zeNskMIZzYOQChPyGmolNIXGz+Tn/lvu59d6jhtdVkZX1vm0AFVFSKpZfPNHKQ3SSBPsxCfMEWi8Rwtbkq5L3UqnH1OCtgNVleqRaf+MUjXrH0Sx2TUuklQAt+XPRykyAzFHNIfgkUUyV58k4FVOifhVLe0sUnGhknnyoAPaAjzHGUbkYxjOlHup0R7iPATqCI9vUMHHhwAR7SGCJrdnS/DjPOMd2nhwD4zS2CZEgCBRxZF8gQJgrkYwcqNmaiJ3QGMADMMMsyMeyAE/e6QII3TEP54XIbhXSufqfXarEebEwcH7swFBIDUqSyIYpPFrFzIV4ZhwLqBDGskOE6XUxwUsqkRwWVyF6xscw0P3lOgodqSgXRWqO1tnGZVwxiiGAYw3CbpWbTbDpMh+EGH2jDvcpuetk9EK8ME6UBQwkOoJUdc445RodHqb9YXxaeDJ8StwyogIrnXGUVUEkplx7mKWKJWn7gTH1PwQqEv4bBQRHzLKlJNbJRwJbrGq2zlps9fKEOD5MIEZ6Q5K7u1xNb2ZzXiEFYxDBEF8I9PaBDOTngLwkg8PzzO00cAAAAAElFTkSuQmCC",
			addon => !addon.applyBackgroundUpdates || addon.isBuiltin
		],
	},
	listContainerId: "ucf-aa-extra-items-container",
	showing(e) {
		var card = e.target.closest("addon-card");
		if (!card) return;

		this.labs = [];
		var imgs = new Map();
		var set = (key, val) => imgs.set(key, imgs.has(key) ? imgs.get(key).concat(val) : [val]);
		var entries = Object.entries(this.items);

		entries.forEach(([lab, [func, img, hideOn]], ind) => {
			this.labs.push(lab);
			(this[lab] = func).hideOn = hideOn;
			img && set(this.items[img]?.[1] ? entries.findIndex(a => a[0] == img): ind, ind);
		});
		if (imgs.size) {
			var cspRe = /^(?:chrome|file|jar|resource|moz-extension|https?):/;
			var [s, p, o] = this.vers >= 110
				? ["::part(button)", "background-image", "AUTHO"] : ["", "--icon", "USE"];

			var reg = [], push = (ind, icon) => {
				var chromeImg = "chrome://user_chrome_files/content/aaepiimg_" + ind;
				reg.push(["override", chromeImg, icon]);
				return chromeImg;
			}
			var rules = [];
			for(var [ind, nums] of imgs) {
				var sel = [], img = entries[ind][1][1];
				for(var num of nums) sel.push(
					`\t#${this.listContainerId} > panel-item:nth-child(${num + 1})${s}`
				);
				rules.push(`${sel.join(",\t\n")} {\n\t\t${p}: url(${
					cspRe.test(img) ? img : push(ind, img)
				}) !important;\n\t}`);
			}
			if (reg.length) {
				var ams = Cc["@mozilla.org/addons/addon-manager-startup;1"]
					.getService(Ci.amIAddonManagerStartup);
				var mUri = Services.io.newFileURI(Services.dirsvc.get("ProfD", Ci.nsIFile));
				this.chromeReg = ams.registerChrome(mUri, reg);
			}
			this.regSheet(`\n${rules.join("\n")}\n}`, o + "R_SHEET");
		}
		delete this.items;

		self = this;
		this.sym = Symbol.for(this.listContainerId);
		(this.showing = e => {
			var card = e.target.closest("addon-card");
			card && this.onListShowind(card.addon, e.target);
		})(e);
		this.onListShowind(card.addon, e.target);
	},
	async onListShowind(addon, list) {
		var doc = list.ownerDocument, win = doc.ownerGlobal;
		var container = doc[this.sym];
		if (!container) {
			container = doc[this.sym] = doc.createElement("div");
			container.onclick = this.cclick;
			container.id = this.listContainerId;
			for(var lab of this.labs)
				container.appendChild(this.createPanelItem(doc)).append(lab);

			var mo = new win.MutationObserver(this.mut);
			(container.mo = mo).container = container;
		}
		for(var item of container.children) {
			var h = this[item.textContent].hideOn;
			item.hidden = h && (h.call ? h(addon) : h.includes(addon.type));
		}
		var {mo} = container;
		mo.disconnect();
		list.contains(container) || list.prepend(container);
		mo.count = 0;
		mo.ts = Date.now();
		mo.observe(list, {childList: true});
	},
	mut(muts, mo) {
		if (++mo.count > 10 || Date.now() - mo.ts > 100)
			return mo.disconnect();
		var list = muts[0].target, {container} = mo;
		if (list.firstElementChild != container)
			mo.disconnect(),
			list.prepend(container),
			mo.observe(list, {childList: true});
	},
	cclick(e) {
		e.stopImmediatePropagation();
		this.parentNode.hide();
		self[e.target.textContent](
			e.target.closest("addon-card").addon,
			e.view.windowRoot.ownerGlobal
		);
	},
	copy: str => (self.copy =
		Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString
	)(str),
	getFile(addon) {
		var file, uri = addon.getResourceURI();
		if (uri instanceof Ci.nsIJARURI) uri = uri.JARFile;
		if (uri instanceof Ci.nsIFileURL) file = uri.file;
		return file;
	},

	//================================================================================

	init(topic, quit) {
		Services.obs.addObserver(this, topic);
		Services.obs.addObserver(quit = (s, t) => {
			Services.obs.removeObserver(quit, t);
			Services.obs.removeObserver(this, topic);
		}, "quit-application-granted");
	},
	isTargetDoc: doc => doc.ownerGlobal.docShell
		.currentDocumentChannel.name.endsWith("/aboutaddons.html"),
	observe(doc) {
		if (!this.isTargetDoc(doc)) return;

		var vers = this.vers = parseInt(Services.appinfo.platformVersion);
		this.ts = `${vers >= 111 ? "moz-toggle" : "input"}[action="toggle-disabled"]`;

		css = css.replace("%TS%", this.ts)
			.replace(/%CN%/g, this.cn)
			.replace(/;$/gm, " !important;")
			.replace("%FD%", this.vertical ? "column" : "row");

		this.regSheet(css, "USER_SHEET");

		var unload = e => {
			e.target.removeEventListener("update", this, true);
			e.target.removeEventListener("showing", this, true);
		}
		var load = doc => {
			doc.addEventListener("update", this, true);
			doc.addEventListener("showing", this, true);
			var win = doc.ownerGlobal;
			win.addEventListener("unload", unload, {once: true});
			this.inactiveAddonsVersion(win);
		}
		this.handleEvent = e => this[e.type](e);
		this.observe = doc => this.isTargetDoc(doc) && load(doc);

		this.ccn = this.cn + "s-container";
		this.tInd = this.btnActions.findIndex(s => s == "toggle-disabled");

		this.btnActions = this.btnActions.map(
			action => `panel-list > panel-item[action="${action}"]`
		);
		this.createPanelItem = vers == 110
			? doc => new (doc.ownerGlobal.customElements.get("panel-item"))
			: doc => doc.createElement("panel-item");

		if (vers >= 89) this.clone = item => item.cloneNode(true);
		else {
			var cf = function(e) {
				var win = e.view;
				win.InspectorUtils.removeContentState(this, 4, true);
				Services.focus.clearFocus(win);
			}
			this.clone = item => {
				var clone = item.cloneNode(true);
				clone.onclick = cf;
				return clone;
			}
		}
		load(doc);
	},
	inactiveAddonsVersion(win) {
		var desc = win.Object.getOwnPropertyDescriptor(win.HTMLElement.prototype, "title");
		var {set} = desc, cfg = {attributes: true, attributeFilter: ["title"]};

		var handleMuts = function(m, {trg, val}) {
			this.disconnect();
			var txt = trg.firstChild;
			if (txt) txt.data = txt.data.replace(trg.closest("addon-card").addon.name, val);
		}
		desc.set = function(val) {
			set.call(this, val);
			if (this.getAttribute("data-l10n-id") != "addon-name-disabled") return;

			var mo = new win.MutationObserver(handleMuts);
			mo.val = val;
			mo.observe(mo.trg = this, cfg);
		}
		for(var Elm of [win.HTMLAnchorElement, win.HTMLHeadingElement])
			win.Object.defineProperty(Elm.prototype, "title", desc);
	},
	regSheet(...args) {
		var prfx = "data:text/css;charset=utf8,@-moz-document url(about:addons),%0A"
			+ "url(chrome://mozapps/content/extensions/aboutaddons.html) {";
		var sss = Cc["@mozilla.org/content/style-sheet-service;1"]
			.getService(Ci.nsIStyleSheetService);
		(this.regSheet = (code, origin) => sss.loadAndRegisterSheet(
			Services.io.newURI(prfx + encodeURIComponent(code)), sss[origin]
		))(...args);
	}
}).init("chrome-document-loaded"))(`\

	span.%CN%s-container {
		display: flex;
		flex-direction: %FD%;
		row-gap: 1px;
	}
	addon-card[expanded] span.%CN%s-container {
		flex-direction: row;
	}
	button.%CN% {
		-moz-appearance: none;

		margin: 0 1px;
		padding: 1px 6px 3px 6px;
		background-image: none;
		background-color: rgba(174, 236, 235, 0.9);

		border-radius: 0;
		border: 1px solid #bbb;

		font-size: 13px;
		white-space: nowrap;
		font-family: Segoe UI;
	}
	button.%CN%:hover {
		background-color: gold;
	}
	button.%CN%:after, %TS% {
		display: none;
	}
}`);

Отсутствует

 

№84806-05-2023 21:25:02

LGS
Участник
 
Группа: Members
Зарегистрирован: 17-09-2022
Сообщений: 97
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby пишет

Возвращаю модифицированный.

Шедеврально! Большое спасибо!
Addons-1.1683397339.png
Работает также в 78, 91, 102.

Отсутствует

 

№84907-05-2023 19:09:40

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1467
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby
Вы копирование uuid можете добавить? Иногда надо в расширении что то подправить и приходится в отладку идти, и там искать, выделять, копировать.

Отсутствует

 

№85007-05-2023 22:03:26

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1467
UA: Firefox 112.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Попытался скрестить этот стиль со скриптом и максимум что у меня получилось:
   
ae46ed52c168278c12a7105a9795536d.jpeg  68311a36b936a3ddb129f4e4a52aec4b.jpeg 
Не знаю как flex-ы разделить, что бы меню скрипта оставалось как меню, а не встраивалось в таблицу, если это вообще возможно.

Отредактировано _zt (07-05-2023 22:04:54)

Отсутствует

 

Board footer

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