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

Будьте в курсе последних изменений в мире Mozilla, следя за нашим микроблогом в Twitter.

№180115-11-2024 10:08:56

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 570
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

Как вытащить отдельную кнопку Перезагрузка браузера из UCF или из расширения add_toolbar_buttons ?

Отсутствует

 

№180215-11-2024 10:30:56

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

Re: UCF - ваши кнопки, скрипты…

rubel
Это что ли?

ucf-appmenu-restart-button

Выделить код

Код:

// ==UserScript==
// @name      MENU`s Restart Items
// @author    Vitaliy V.
// @include   main
// @note      https://forum.mozilla-russia.org/viewtopic.php?pid=785107#p785107
// @shutdown  window.menusrestartitems.uninit();
// ==/UserScript==

location.href.startsWith("chrome://browser/content/browser.x") && (this.menusrestartitems = {
	init(that) {
		var btnClass = "ucf-appmenu-restart-button", muimID = "ucf_menu_FileRestartItem",
		rLocale = Services.locale.requestedLocale.startsWith("ru"), rLabel = rLocale ? "Перезапуск": "Restart",
		rToolTiptext = rLocale
			? "ЛКМ: Перезапустить приложение\nСКМ: Перезапустить без дополнений\nПКМ: Перезапустить и заново создать кэш быстрого запуска"
			: "L: Restart the application\nM: Restart without add-ons\nR: Restart and recreate the quick start cache.",
		ucf_script = (window.ucf_custom_script_win == that)
			? "ucf_custom_script_win"
			: (window.ucf_custom_script_all_win == that)
			? "ucf_custom_script_all_win"
			: "window";
		var abtns = document.querySelector("template#appMenu-viewCache")?.content.querySelectorAll("#appMenu-quit-button, #appMenu-quit-button2")
			|| document.querySelectorAll("#appMenu-quit-button");
		for (let abtn of abtns) {
			let frag = MozXULElement.parseXULToFragment(`<toolbarbutton/>`);
			let btn = frag.firstElementChild;
			btn.id = muimID + '1';
			btn.className = `${btnClass} subviewbutton${abtn.classList.contains("subviewbutton-iconic") ? "" : " subviewbutton-iconic"}`;
			btn.setAttribute("label", rLabel);
			btn.setAttribute("tooltiptext", rToolTiptext);
			btn.setAttribute("shortcut", "Ctrl+Alt+Q");
			btn.setAttribute("onclick", `${ucf_script}.menusrestartitems.restart_mozilla(event)`);
			abtn.before(frag);
		}
		var aftermuim = document.querySelector("#menu_FilePopup #menu_FileQuitItem");
		if (aftermuim) {
			let muim = document.createXULElement("menuitem");
			muim.id = muimID;
			muim.className = "menuitem-iconic";
			muim.setAttribute("label", rLabel);
			muim.setAttribute("tooltiptext", rToolTiptext);
			muim.setAttribute("acceltext", "Ctrl+Alt+Q");
			muim.setAttribute("context", "");
			muim.setAttribute("onclick", `${ucf_script}.menusrestartitems.restart_mozilla(event)`);
			aftermuim.before(muim);
		}
		var style = "data:text/css;charset=utf-8," + encodeURIComponent(`
			.${btnClass}.subviewbutton-iconic, #${muimID} {
					list-style-image: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16'><path style='fill:none;stroke:context-fill rgb(142, 142, 152);stroke-opacity:context-fill-opacity;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;' d='M11.4 5.6h4v-4M14.8 5C14.1 3.5 12 .6 8 .6S.6 4 .6 8 4 15.4 8 15.4s6.3-2.9 7-5'/></svg>") !important;
			}
			.${btnClass}.subviewbutton-iconic .toolbarbutton-icon,
			#${muimID} .menu-iconic-icon {
					-moz-context-properties: fill !important;
					fill: color-mix(in srgb, currentColor 20%, #f38525) !important;
			}
		`);
		try {
			windowUtils.loadSheetUsingURIString(style, windowUtils.USER_SHEET);
		} catch (e) {}
		window.addEventListener("keydown", this);
		that.unloadlisteners?.push("menusrestartitems");
	},
	restart_mozilla(e) {
		if (e.button == 0)
			this._restart_mozilla();
		else if (e.button == 1)
			e.view.safeModeRestart();
		else if (e.button == 2)
			this._restart_mozilla(true);
	},
	_restart_mozilla(nocache = false) {
		var cancelQuit = Cc["@mozilla.org/supports-PRBool;1"].createInstance(Ci.nsISupportsPRBool);
		Services.obs.notifyObservers(cancelQuit, "quit-application-requested", "restart");
		if (cancelQuit.data)
			return false;
		if (nocache)
			Services.appinfo.invalidateCachesOnRestart();
		var restart = Services.startup;
		restart.quit(restart.eAttemptQuit | restart.eRestart);
	},
	handleEvent(e) {
		if (e.code == "KeyQ" && e.ctrlKey && e.altKey)
			this._restart_mozilla();
	},
	destructor() {
		window.removeEventListener("keydown", this);
	},
	uninit() {
		var muimID = "ucf_menu_FileRestartItem";
		this.destructor();
		document.getElementById(muimID).remove();
		document.getElementById(muimID + "1").remove();
		delete menusrestartitems;
	}
}).init(this);


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

Отсутствует

 

№180315-11-2024 15:41:14

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 570
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

Farby
Спасибо. Задал вопрос по этой кнопке в  теме userChrome.js.

Отсутствует

 

№180416-11-2024 12:36:50

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

Re: UCF - ваши кнопки, скрипты…

doud пишет

Был такой скрипт для открытия Findbar двойным щелчком СКМ. На новых версиях уже не работает. Что надо исправить?

скрытый текст
addEventListener("click", async e => {
    if (e.button != 1 || e.detail != 2) return;

    var findbar = gFindBar;
    if (findbar) {
        if (!findbar.hidden) return //findbar.close();
    } else {
        findbar = await gFindBarPromise;
        await new Promise(resolve => setTimeout(resolve, 0));
    }
    findbar.onFindCommand();

}, false, gBrowser.tabpanels || 1);

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


Тогда можно попробовать заменить click на mousedown.
Ну и вынести асинхрон в отдельную функцию,
чтобы не плодить лишние промисы.


Код не для CB (а то приведённый выглядит именно так).

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

Выделить код

Код:

(async () => {
	var dblmmd = async () => {
		var findbar = gFindBar;
		if (findbar) {
			if (!findbar.hidden) return //findbar.close();
		} else {
			findbar = await gFindBarPromise;
			//await new Promise(setTimeout);
		}
		findbar.onFindCommand();
	}
	gBrowser.tabpanels.addEventListener(
		"mousedown", e => e.button == 1 && e.detail == 2 && dblmmd()
	);
})();

Отредактировано Dumby (16-11-2024 12:54:34)

Отсутствует

 

№180516-11-2024 16:06:35

doud
Участник
 
Группа: Members
Откуда: Германия
Зарегистрирован: 03-02-2012
Сообщений: 93
UA: Firefox 102.0

Re: UCF - ваши кнопки, скрипты…

Dumby
Да, код был для СВ, но прекрасно работал в старом USF! Спасибо за исправления. Так же на Руборде предложили еще вариант

скрытый текст
addEventListener("popuphiding", async e => {
    if (e.target.id != "autoscroller") return;


    var findbar = gFindBar;
    if (findbar) {
        if (!findbar.hidden) return //findbar.close();
    } else {
        findbar = await gFindBarPromise;
        await new Promise(resolve => setTimeout(resolve, 0));
    }
    findbar.onFindCommand();

Отсутствует

 

№180616-11-2024 20:00:06

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

Re: UCF - ваши кнопки, скрипты…

doud пишет

Да, код был для СВ, но прекрасно работал в старом USF!

Охотно верю. Но работал чуть иначе.


В CB такой код добавляет слушатель клика
для где-то в пределах области контента,


а в UCF он добавляет слушатель клика
в пределах всего окна браузера.

предложили еще вариант

Вариант немного странный.


Чтобы работало нужен включённый autoscroller,
и чтобы он нарисовался, то есть, чтобы было что скроллить.
Хорошо, это так и заявлено, сочтём за концепцию.


Но вот, допустим, начинаем обычную autoscroll-сессию, скроллим сколько надо,
и завершаем autoscroll-сессию, кнопкой мыши или нажав клавишу Esc.
И тут — выскакивает findbar, а это уже не то, что должно ожидаться.

Отсутствует

 

№180716-11-2024 21:17:44

doud
Участник
 
Группа: Members
Откуда: Германия
Зарегистрирован: 03-02-2012
Сообщений: 93
UA: Firefox 102.0

Re: UCF - ваши кнопки, скрипты…

Dumby
А можно ли приспособить старый USF от 2021-6-5 работать с FF128 и новее?

Dumby пишет

это уже не то, что должно ожидаться

Согласен

Отсутствует

 

№180817-11-2024 12:33:46

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

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

Тогда можно попробовать заменить click на mousedown

А если бы не получилось, в том числе и через mouseup, то какие есть альтернативы? Не факт, что нативную функцию preventClickEvent() ваяли только для авто скролла и с каким-то странным пояснением;
"The following mouse click/auxclick event on the autoscroller shouldn't be fired in web content for compatibility with Chrome".
Пробовал нивелировать через stopPropagation() - работает, но тогда и авто скролл не появляется, а как его самому запустить - не знаю

Отсутствует

 

№180917-11-2024 15:15:03

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 476
UA: Firefox 128.0

Re: UCF - ваши кнопки, скрипты…

Всем привет!
На загруженные файлы можно перейти, нажав кнопку “Показать в проводнике», пока список Загрузок не очищен.


Вопрос: как из JS-кода показать в проводнике последний загруженный файл ?
В идеале не только последний, но и по номеру - перейти в проводнике на последний, предпоследний и т.д. файл.
Ещё надо получить полный путь к последнему загруженному файлу (чтоб переименовывать по имени из буфера обмена).


Firefox-Save.png

Отсутствует

 

№181019-11-2024 12:45:31

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

Re: UCF - ваши кнопки, скрипты…

doud пишет

А можно ли приспособить старый USF от 2021-6-5 работать с FF128 и новее?

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


Надо полагать, что чем-то не устраивает "новый" UCF.
Тогда лучше попытаться «приспособить» неустройки используя его,
а не тащить старый.


Так что же не так с новым?
Может расскажи о проблеме, вдруг там решение несложное.


dinn пишет

А если бы ...

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

... не получилось, в том числе и через mouseup, то какие есть альтернативы?

Что значит «если бы не получилось»?
Если бы не получилось, то пробовать дальше,
пытаться разобраться что происходит, чесать репу...
То есть — смотреть по конкретной ситуации.


А если, и в итоге не получилось,
ну что ж, такое бывает, чаще чем хотелось бы.

Не факт, что нативную функцию preventClickEvent() ваяли только для авто скролла

Что значит «ваяли только»? Это типа
«мы запилим метод, но использовать будем только для автоскролла, и никогда иначе»?
Ну тогда да, звучит маловероятно, и получается, что «не факт».
Это вообще рассуждение о намерении, которое знать невозможно,
если только оно не указано явно.


А ваяли именно для автоскролла. Bug —>  part 2 —>  webidl diff.
Я помотрел в 134, и preventClickEvent() используется только в gre omni,
и только в двух местах, и оба связаны с автоскроллером.
Но да, «не факт», что в будущем, им не приспичит использовать где-то ещё.

как его самому запустить - не знаю

Что значит «запустить»? Запустить на чём?
Подлежащее скроллу добро находится в другом процессе
(ну, если только речь не о страницах в этом процессе, типа about:license).
И из этого процесса мы не знаем на чём там мышь приземлилась.


Так что, либо разворачивать что-то в контентских процессах,
либо ... даже не знаю что. Можно попробовать по координатам
подрядить nsIDOMWindowUtils.elementFromPoint()
но уверенности, конечно, никакой.


Вот, допустим, попробуем вызов автоскроллера по Alt+ЛКМ.
Ну, просто демо-набросок для консоли.

Выделить код

Код:

(() => {
	var callHandleEvent = (makeEvent, ids, x, y) => {
		for(var id of ids) {
			var actor = WindowGlobalChild
				.getByInnerWindowId(id).getActor("AutoScroll");

			var win = actor.document.ownerGlobal;
			if (win.windowRoot.ownerGlobal == win) { // ???
				var r = win.devicePixelRatio;
				x /= r; y /= r;
			}
			var trg = win.windowUtils.elementFromPoint(
				x - win.mozInnerScreenX,
				y - win.mozInnerScreenY,
				true, false
			);
			if (trg && !trg.matches("iframe,frame")) {
				actor.handleEvent(makeEvent(trg, x, y));
				break;
			}
		}
	}
	var makeEvent = (trg, x, y) => ({
			button: 1,
			screenX: x,
			screenY: y,
			isTrusted: true,
			type: "mousedown",
			originalTarget: trg,
			composedTarget: trg,
			view: trg.ownerGlobal,
			clickEventPrevented() {}
	});

	var prfx = "data:,(" + encodeURIComponent(
		callHandleEvent + ")(" + makeEvent + ", "
	);

	var loadScripts = (bbc, x, y) => {
		var map = new Map();
		for(var bc of bbc.getAllBrowsingContextsInSubtree()) {
			var cwg = bc.currentWindowGlobal;
			if (!cwg) continue;

			var id = cwg.innerWindowId;
			var pid = cwg.osPid, arr = map.get(pid);
			arr ? arr.push(id) : map.set(pid, [id]);
		}
		var {ppmm} = Services;
		for(var ind = 0, count = ppmm.childCount; ind < count; ind++) {
			var pmm = ppmm.getChildAt(ind);
			var ids = map.get(pmm.osPid);
			ids && pmm.loadProcessScript(prfx + `[${ids}], ${x}, ${y});`, false);
		}
	}

	gBrowser.tabpanels.addEventListener("click", e => {
		if (e.button || !e.altKey || e.ctrlKey || e.shiftKey) return;
		var br = gBrowser.selectedBrowser;
		if (!br.matches(":hover")) return;

		var x = e.screenX, y = e.screenY;

		if (br.isRemoteBrowser) {
			var r = window.devicePixelRatio;
			loadScripts(br.browsingContext, x *= r, y *= r);
		}
		else e.target.ownerGlobal
			.windowGlobalChild.getActor("AutoScroll")
			.handleEvent(makeEvent(e.originalTarget, x, y));
	});
})();

Dobrov пишет

На загруженные файлы можно перейти, нажав кнопку “Показать в проводнике», пока список Загрузок не очищен.


Вопрос: как из JS-кода показать в проводнике последний загруженный файл ?
В идеале не только последний, но и по номеру - перейти в проводнике на последний, предпоследний и т.д. файл.
Ещё надо получить полный путь к последнему загруженному файлу (чтоб переименовывать по имени из буфера обмена).

Список можно получить так (если вместе с приватными)
await (await Downloads.getList(Downloads.ALL)).getAll();


Объект Downloads есть в окне браузера.
А там, где нет — можно импортировать
resource://gre/modules/Downloads.sys.mjs


Выражение вернёт копию массива объектов Download
(упоминаются в resource://gre/modules/DownloadCore.sys.mjs).
Полный путь к файлу — будет download.target.path


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


Последний загруженный — наверно, у которого endTime
будет больше, чем у всех других успешно завершившихся.


Показать в проводнике файл — nsIFile.reveal()
неужели никогда файл в проводнике не открывал.

Отсутствует

 

№181119-11-2024 13:31:58

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 476
UA: Firefox 128.0

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

Список можно получить так (если вместе с приватными)
await (await Downloads.getList(Downloads.ALL)).getAll();

Спасибо!
А как назначить код на событие ???.succeeded: «Загрузка завершена» ?

Отсутствует

 

№181219-11-2024 17:02:07

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

Re: UCF - ваши кнопки, скрипты…

Dobrov
Ну вот этот лист, он имеет метод addView()
Попробуй с консоли, и что-нибудь скачай.
Но вообще, вещь глобальная (не оконная).

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

Выделить код

Код:

(async () => {
	var list = await Downloads.getList(Downloads.ALL);

	list.addView({
		onDownloadChanged(download) {
			if (!download.succeeded) return;

			console.log("download.succeeded", download);
			list.removeView(this);
			FileUtils.File(download.target.path).reveal();
		}
	});
})();

Отсутствует

 

№181319-11-2024 18:42:36

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 476
UA: Firefox 128.0

Re: UCF - ваши кнопки, скрипты…

Dumby
со строкой list.removeView(this); работает однократно, без неё нормально.
Было нужно для фото с VK.com, открываемых отдельно, и автопереименования сохранённой картинки по имени из clipboard.
Возможно, для этого есть какой-либо userscript, но не нашёл…

Отсутствует

 

№181425-11-2024 20:34:36

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 322
UA: Firefox 132.0

Re: UCF - ваши кнопки, скрипты…

Dobrov
Вы мне помогали в соседней теме по поводу  всплывающей боковой панели.
К сожалению безрезультатно. М. б. у вас есть UCF с работающим auto_hide_sidebar.

Отсутствует

 

№181526-11-2024 11:18:46

Northtech
Участник
 
Группа: Members
Зарегистрирован: 16-04-2011
Сообщений: 267
UA: Firefox 133.0

Re: UCF - ваши кнопки, скрипты…

Кнопка Firefox View перестала работать на вертикальной панели add_toolbar_buttons.2024.10.14.21 в firefox 133. Если её переместить например в навигационную панель, то работает.

Отсутствует

 

№181626-11-2024 12:18:21

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1750
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

Garalf пишет

у вас есть UCF с работающим auto_hide_sidebar.

У vassemm есть!


Win7

Отсутствует

 

№181726-11-2024 13:26:46

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 322
UA: Firefox 132.0

Re: UCF - ваши кнопки, скрипты…

kokoss
Спасибо, я видел этот пост.  Не работает, поэтому и попросил работающий auto_hide_sidebar.

Отсутствует

 

№181826-11-2024 16:19:08

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

Re: UCF - ваши кнопки, скрипты…

Northtech пишет

Кнопка Firefox View перестала работать на вертикальной панели

Вот, кстати, да. И не только она.


Я пользуюсь только верхним тулбаром,
поэтому как-то упустил этот момент.


Короче, видимо, эта песня (баг)
chrome://browser/content/navigator-toolbox.js


Вобщем, надо как-то пробросить это добро
для вертикального и нижнего.
Подождём коммита пару недель, затем,
если вдруг нет, — можно перезадать вопрос.

Отсутствует

 

№181926-11-2024 18:31:22

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1750
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

Garalf пишет

Не работает, поэтому и попросил работающий auto_hide_sidebar.

Какую версию UCF используйте ?


Win7

Отсутствует

 

№182027-11-2024 00:58:43

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

Re: UCF - ваши кнопки, скрипты…

Northtech

Dumby пишет

Подождём коммита

Попытка запилить временный фикс-код для 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");

Отсутствует

 

№182127-11-2024 06:41:35

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 322
UA: Firefox 132.0

Re: UCF - ваши кнопки, скрипты…

kokoss
version, date year-month-day: 2024-6-5

Отсутствует

 

№182227-11-2024 08:17:44

Northtech
Участник
 
Группа: Members
Зарегистрирован: 16-04-2011
Сообщений: 267
UA: Firefox 133.0

Re: UCF - ваши кнопки, скрипты…

Dumby
Ага, работает, спасибо большое.

Отсутствует

 

№182327-11-2024 08:44:16

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1750
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

Garalf пишет

version, date year-month-day: 2024-6-5

Обновите версию UCF до актуальной_2024-10-31, и так проверьте.


Win7

Отсутствует

 

№182428-11-2024 16:19:52

egorsemenov06
Участник
 
Группа: Members
Зарегистрирован: 23-07-2024
Сообщений: 13
UA: Firefox 133.0

Re: UCF - ваши кнопки, скрипты…

Обновил UCF до версии 2024-11-27 перестала работать кнопка  перезагрузки в appmenu

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

Выделить код

Код:

//Кнопка перезагрузки
(this.menusrestartitems = {
            init(that) {
                var btnClass = "ucf-appmenu-restart-button", muimID = "ucf_menu_FileRestartItem",
                ucf_script = (window.ucf_custom_script_win == that) ? "ucf_custom_script_win" : "ucf_custom_script_all_win";
                var abtns = document.querySelector("template#appMenu-viewCache")?.content.querySelectorAll("#appMenu-quit-button, #appMenu-quit-button2")
                    || document.querySelectorAll("#appMenu-quit-button");
                for (let abtn of abtns) {
                    let frag = MozXULElement.parseXULToFragment(`<toolbarbutton/>`);
                    let btn = frag.firstElementChild;
                    btn.id = btnClass;
                    btn.className = "subviewbutton subviewbutton-iconic";
                    btn.setAttribute("label", "Перезапуск");
                    btn.setAttribute("tooltiptext", "ЛКМ: Перезапустить приложение\nСКМ: Перезапустить без дополнений\nПКМ: Перезапустить и заново создать кэш быстрого запуска");
                    btn.setAttribute("shortcut", "Ctrl+Alt+Q");
                    btn.setAttribute("onclick", `${ucf_script}.menusrestartitems.restart_mozilla(event)`);
                    abtn.before(frag);
                }
                var aftermuim = document.querySelector("#menu_FilePopup #menu_FileQuitItem");
                if (aftermuim) {
                    let muim = document.createXULElement("menuitem");
                    muim.id = muimID;
                    muim.className = "menuitem-iconic";
                    muim.setAttribute("label", "Перезапуск");
                    muim.setAttribute("tooltiptext", "ЛКМ: Перезапустить приложение\nСКМ: Перезапустить без дополнений\nПКМ: Перезапустить и заново создать кэш быстрого запуска");
                    muim.setAttribute("acceltext", "Ctrl+Alt+Q");
                    muim.setAttribute("context", "");
                    muim.setAttribute("onclick", `${ucf_script}.menusrestartitems.restart_mozilla(event)`);
                    aftermuim.before(muim);
                }
                var style = "data:text/css;charset=utf-8," + encodeURIComponent(`
                    #${btnClass}.subviewbutton-iconic, #${muimID} {
                        list-style-image: url("chrome://global/skin/icons/reload.svg") !important;
                    }
                    #${btnClass}.subviewbutton-iconic .toolbarbutton-icon,
                    #${muimID} .menu-iconic-icon {
                        -moz-context-properties: fill !important;
                        fill: #e31b5d !important;
                    }
                `);
                try {
                    windowUtils.loadSheetUsingURIString(style, windowUtils.USER_SHEET);
                } catch (e) {}
                window.addEventListener("keydown", this);
                that.unloadlisteners.push("menusrestartitems");
            },
            restart_mozilla(e) {
                if (e.button == 0)
                    this._restart_mozilla();
                else if (e.button == 1)
                    e.view.safeModeRestart();
                else if (e.button == 2)
                    this._restart_mozilla(true);
            },
            _restart_mozilla(nocache = false) {
                var cancelQuit = Cc["@mozilla.org/supports-PRBool;1"].createInstance(Ci.nsISupportsPRBool);
                Services.obs.notifyObservers(cancelQuit, "quit-application-requested", "restart");
                if (cancelQuit.data)
                    return false;
                if (nocache)
                    Services.appinfo.invalidateCachesOnRestart();
                var restart = Services.startup;
                restart.quit(restart.eAttemptQuit | restart.eRestart);
            },
            handleEvent(e) {
                if (e.code == "KeyQ" && e.ctrlKey && e.altKey)
                    this._restart_mozilla();
            },
            destructor() {
                window.removeEventListener("keydown", this);
            }
        }).init(this);

и ucf_sidebar_tabs
скрытый текст

Выделить код

Код:

(async (
    id = "ucf_sidebar_tabs_button",
    label = "Sidebar Tabs",
    tooltiptext = "ЛКМ: Открыть / Закрыть\nControl + ЛКМ: Отключить / Включить\nСКМ: Отключить / Включить\nПКМ: Переключить AutoHide",
    img = "resource://ucf_sidebar_tabs",
    pref = "extensions.ucf.sidebar_tabs.auto_hide",

    sidebar_tabs = {
        get style() {
            delete this.style;
            return this.style = `data:text/css;charset=utf-8,${encodeURIComponent(`
            #browser > #st_toolbox {
                --v-sidebar-min-width: 10px;
                --v-sidebar-transition-delay-show: .3s;
                --v-sidebar-transition-delay-hide: 2s;
                --v-sidebar-transition-duration: .2s;
                /* ********************************************** */

                position: relative !important;
                z-index: 2 !important;
                min-width: var(--v-sidebar-tabs-width) !important;
                width: var(--v-sidebar-tabs-width) !important;
                max-width: var(--v-sidebar-tabs-width) !important;
                overflow: hidden !important;
                opacity: 0 !important;
                --v-sidebar-margin-max-width: calc(-1 * var(--v-sidebar-tabs-width));
                --v-sidebar-transform-locale-dir: -1;
                --v-sidebar-transform-locale-dir-visible: 1;
                margin-inline-start: 0 !important;
                margin-inline-end: var(--v-sidebar-margin-max-width) !important;
                transform: translateX(calc(var(--v-sidebar-transform-locale-dir) * (var(--v-sidebar-tabs-width) - var(--v-sidebar-min-width)))) !important;
                &[sidebar_tabs_auto_hide] {
                    transition-timing-function: linear, step-start, linear !important;
                    transition-delay: var(--v-sidebar-transition-delay-hide), calc(var(--v-sidebar-transition-delay-hide) + var(--v-sidebar-transition-duration)), 0s !important;
                    transition-duration: var(--v-sidebar-transition-duration), 0s, .2s !important;
                    transition-property: transform, opacity, margin-top !important;
                }
                &[sidebar_tabs_auto_hide][sidebar_tabs_visible="hidden"] {
                    transition-delay: 0s, var(--v-sidebar-transition-duration), 0s !important;
                }
                :root[sidebar_tabs_start="false"] & {
                    margin-inline-start: var(--v-sidebar-margin-max-width) !important;
                    margin-inline-end: 0 !important;
                }
                :root[sidebar_tabs_start="false"]:-moz-locale-dir(ltr) &,
                :root[sidebar_tabs_start="true"]:-moz-locale-dir(rtl) & {
                    --v-sidebar-transform-locale-dir: 1;
                    --v-sidebar-transform-locale-dir-visible: -1;
                }
                &[sidebar_tabs_auto_hide]:hover {
                    transform: translateX(0px) !important;
                    opacity: 1 !important;
                    transition-delay: var(--v-sidebar-transition-delay-show), var(--v-sidebar-transition-delay-show), 0s !important;
                }
                &[sidebar_tabs_auto_hide][sidebar_tabs_visible^="visible"] {
                    transform: translateX(0px) !important;
                    opacity: 1 !important;
                    transition-delay: 0s !important;
                }
                :root[v_vertical_bar_start="true"][sidebar_tabs_start="true"]:is([v_vertical_bar_visible="visible"],[v_vertical_bar_sidebar="true"]) &[sidebar_tabs_auto_hide],
                :root[v_vertical_bar_start="false"][sidebar_tabs_start="false"]:is([v_vertical_bar_visible="visible"],[v_vertical_bar_sidebar="true"]) &[sidebar_tabs_auto_hide] {
                    transform: translateX(calc(var(--v-sidebar-transform-locale-dir-visible) * var(--v-vertical-bar-width, 0px))) !important;
                    opacity: 1 !important;
                    transition-delay: 0s !important;
                }
                :root[v_vertical_bar_visible] & {
                    padding-inline: 0 !important;
                }
            }
            #browser > #st_splitter {
                display: none !important;
            }
        `)}`;
        },
        async loadstyle(win) {
            win.windowUtils.loadSheetUsingURIString(this.style, win.windowUtils.USER_SHEET);
            win.setTimeout(() => win.ucf_custom_script_win.ucf_sidebar_tabs.toolbox.setAttribute("sidebar_tabs_auto_hide", "true"), 0);
        },
        async removestyle(win) {
            win.windowUtils.removeSheetUsingURIString(this.style, win.windowUtils.USER_SHEET);
            win.ucf_custom_script_win.ucf_sidebar_tabs.toolbox.removeAttribute("sidebar_tabs_auto_hide");
        },
        showHide(win) {
            var st = win.ucf_custom_script_win.ucf_sidebar_tabs;
            if (!st.toolbox.hasAttribute("sidebar_tabs_auto_hide")) {
                st.toggle();
                return;
            }
            st.st_vbox_container ||= st.toolbox;
            if (!st._open && st._visible) {
                st.isPanel = false;
                st.hideToolbar(true);
            }
            st.showHide();
            if (!st._visible)
                win.setTimeout(() => st.toolbox.removeAttribute("sidebar_tabs_visible"), 0);
        },
    },
) => CustomizableUI.createWidget({
    id,
    label,
    tooltiptext,
    defaultArea: CustomizableUI.AREA_NAVBAR,
    localized: false,
    onBeforeCreated_(doc) {
        if (Services.prefs.getBoolPref(pref, true))
            sidebar_tabs.loadstyle(doc.defaultView);
    },
    onBeforeCreated(doc) {
        this.onBeforeCreated = this.onBeforeCreated_;
        this.onBeforeCreated_(doc);
        CustomizableUI.destroyWidget("ucf_sidebar_tabs");
    },
    onCreated(btn) {
        btn.style.setProperty("list-style-image", `url("${img}")`);
        btn.setAttribute("context", "");
        var st = btn.ownerGlobal.ucf_custom_script_win.ucf_sidebar_tabs;
        btn.checked = st._open;
        st.button = btn;
        var func = st.mouseup.toString();
        Services.scriptloader.loadSubScript(`data:charset=utf-8,${encodeURIComponent(`this.mouseup = ${func.replace(/^(async\s)?.*?\(/, '$1function mouseup(')
            .replace(/\}$/g, 'setTimeout(() => this.toolbox.removeAttribute("sidebar_tabs_visible"), 0);}')}`)}`, st);
    },
    onClick(e) {
        switch (e.button) {
            case 0:
                if (!e.getModifierState("Control"))
                    sidebar_tabs.showHide(e.view);
                else
                    e.view.ucf_custom_script_win.ucf_sidebar_tabs.toggle();
                break;
            case 1:
                e.view.ucf_custom_script_win.ucf_sidebar_tabs.toggle();
                break;
            case 2:
                let prf = Services.prefs.getBoolPref(pref, true),
                loadremove = !prf ? "loadstyle" : "removestyle";
                Services.prefs.setBoolPref(pref, !prf);
                for (let win of CustomizableUI.windows)
                    sidebar_tabs[loadremove](win);
                break;
        }
    },
}))();

а в этом скрипте автоматически не открываються меню у кнопок
скрытый текст

Выделить код

Код:

(async (
    id = Symbol("mouseover_openpopup"),
    delay = 300,
    hidedelay = 1000,
    btnSelectors = [
        "#PanelUI-menu-button",
        "#library-button",
        "#nav-bar-overflow-button",
        "#star-button-box",
        "#pageActionButton",
        "#translations-button",
        "#unified-extensions-button",
        "#downloads-button",
        "#alltabs-button",
    ],
    excludeBtnSelectors = [ //исключить кнопки
        "#tabs-newtab-button",
        "#new-tab-button",
        "#back-button",
        "#forward-button",
        "#panic-button",
        "#alltabs-button",
        "#ucf-cbbtn-OpenPageInOtherBrowser",
        "#ucf-cbbtn-ToggleRestartlessAddons",
        "#ucf-cbbtn-Save",
        "#fxa-toolbar-menu-button",
        "toolbarbutton[data-extensionid]",
    ],
    areaSelectors = [
        "toolbar",
    ],
    hideAreaSelectors = [
        "toolbar",
		"popupset",
        // "#PlacesToolbarItems",
    ],
    excludeHidePopupSelectors = [
        "#contentAreaContextMenu",
        "#contentAreaContextMenu :scope",
        "#PopupSearchAutoComplete",
        "#PopupAutoComplete",
    ],
) => (this[id] = {
    timer: null,
    hidetimer: null,
    hideArea: [],
    open_: false,
    get popups() {
        delete this.popups;
        return this.popups = new Set();
    },
    get btnSelectors() {
        delete this.btnSelectors;
        return this.btnSelectors = btnSelectors.join(",");
    },
    get ExtensionParent() {
        delete this.ExtensionParent;
        return this.ExtensionParent = ChromeUtils.importESModule("resource://gre/modules/ExtensionParent.sys.mjs").ExtensionParent;
    },
    get browserActionFor() {
        delete this.browserActionFor;
        return this.browserActionFor = this.ExtensionParent.apiManager.global.browserActionFor;
    },
    get exclude() {
        delete this.exclude;
        return this.exclude = excludeBtnSelectors.join(",");
    },
    get excludePopup() {
        delete this.excludePopup;
        return this.excludePopup = excludeHidePopupSelectors.join(",");
    },
    async init() {
        await delayedStartupPromise;
        for (let elm of (this.areasList = document.querySelectorAll(areaSelectors.join(",")))) {
            elm.addEventListener("mouseover", this);
            elm.addEventListener("mouseout", this);
            elm.addEventListener("mousedown", this);
        }
        for (let elm of (this.popupsList = document.querySelectorAll("toolbar, popupset")))
            elm.addEventListener("popupshown", this);
        setUnloadMap(id, this.destructor, this);
        if (!hideAreaSelectors.length) return;
        if (excludeHidePopupSelectors.length)
            this.popupShown = this.pShown;
        this.popupShown_ = this.popupShown.bind(this);
        this.popupHidden_ = this.popupHidden.bind(this);
        this.hidePopup = this.hPopup;
        for (let elm of (this.hideArea = document.querySelectorAll(hideAreaSelectors.join(","))))
            elm.addEventListener("popupshown", this.popupShown_);
    },
    destructor() {
        for (let elm of this.areasList) {
            elm.removeEventListener("mouseover", this);
            elm.removeEventListener("mouseout", this);
            elm.removeEventListener("mousedown", this);
        }
        for (let elm of this.popupsList)
            elm.removeEventListener("popupshown", this);
        for (let elm of this.hideArea)
            elm.removeEventListener("popupshown", this.popupShown_);
    },
    popupShown({target}) {
        if (target.localName === "tooltip") return;
        this.pShow(target);
    },
    pShown({target}) {
        if (target.localName === "tooltip" || target.matches(this.excludePopup)) return;
        this.pShow(target);
    },
    pShow(target) {
        target.addEventListener("mouseenter", this);
        target.addEventListener("popuphidden", this.popupHidden_, { once: true });
        if (this.open_) return;
        this.open_ = true;
        gBrowser.tabpanels.addEventListener("mouseenter", this);
    },
    popupHidden({target}) {
        target.removeEventListener("mouseenter", this);
    },
    handleEvent(e) {
        this[e.type](e);
    },
    mouseenter({currentTarget}) {
        clearTimeout(this.hidetimer);
        if (currentTarget != gBrowser.tabpanels) return;
        this.hidetimer = setTimeout(() => this.hidePopup(), hidedelay);
    },
    popuphidden({target}) {
        this.popups.delete(target);
    },
    popupshown({target}) {
        if (target.localName === "tooltip") return;
        this.popups.add(target);
        target.addEventListener("popuphidden", this, { once: true });
    },
    hidePopup() {
        this.popups.forEach(p => p.hidePopup?.());
        this.popups.clear();
    },
    hPopup() {
        this.popups.forEach(p => p.hidePopup?.());
        this.popups.clear();
        if (!this.open_) return;
        gBrowser.tabpanels.removeEventListener("mouseenter", this);
        this.open_ = false;
    },
    mousedown() {
        clearTimeout(this.timer);
    },
    mouseout() {
        clearTimeout(this.timer);
    },
    mouseover({target}) {
        clearTimeout(this.timer);
        this.timer = setTimeout(() => {
            if (target?.matches?.(`${this.exclude},:is(menupopup,panel) :scope`) ?? true) return;
            let extensionid, isbtn = target.matches(this.btnSelectors) || !!(target.parentElement.matches(this.btnSelectors) && (target = target.parentElement));
            if (!target.hasAttribute("open")
            && (isbtn
            || target.menupopup
            || target.getAttribute("widget-type") === "view"
            || target.classList.contains("toolbarbutton-combined-buttons-dropmarker")
            || ((extensionid = target.dataset?.extensionid) && this.browserActionFor(this.ExtensionParent.WebExtensionPolicy.getByID(extensionid).extension).action.tabContext.get(gBrowser.selectedTab).popup))) {
                this.hidePopup();
                let params = { bubbles: false, cancelable: true, };
                target.dispatchEvent(new MouseEvent("mousedown", params));
                target.dispatchEvent(new MouseEvent("click", params));
            }
        }, delay);
    },
}).init())();

если VitaliyV сюда заглядывает то поправте пожалуйста для [firefox] 133.0

Отредактировано egorsemenov06 (28-11-2024 18:12:58)

Отсутствует

 

№182528-11-2024 17:38:59

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

Re: UCF - ваши кнопки, скрипты…

egorsemenov06
Попробуйте по тексту скрипта найти ucf_custom_script_win и заменить на ucf_custom_scripts_win и ucf_custom_script_all_win на ucf_custom_scripts_all_win.
ЗЫ: Так на шару, авось повезёт...


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

Отсутствует

 

Board footer

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