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

Общайтесь со знакомыми и друзьями в нашей группе в Контакте.

№1027625-05-2021 00:29:51

classic81
Участник
 
Группа: Members
Зарегистрирован: 09-03-2021
Сообщений: 3
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

sandro79 пишет

Так можно

Восторг! В 78 ESR работает! Спасибо!
а вот такие вертикальные черточки-разделители (как в 68-м) между кнопками в рамках userChrome.css уже нереализуемо?

Отредактировано classic81 (25-05-2021 00:30:50)

Отсутствует

 

№1027725-05-2021 00:34:22

sandro79
Участник
 
Группа: Members
Откуда: Ставрополье
Зарегистрирован: 15-11-2017
Сообщений: 1457
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

Dobrov
Я не спрашивал "Как вернуть этот серый фон под кнопками поисковых систем?"
Мне это не нужно, я использую прозрачный фон выпадающего списка адресной и поисковой строк авторства Vitaliy V. в связке с его стилем V2 для [firefox] 71+

скрытый текст
baa449adc4a2.png
скрытый текст

Выделить код

Код:

#urlbar > .urlbarView, #urlbar-results,  panel[type="autocomplete-richlistbox"], #PopupSearchAutoComplete {
    --arrowpanel-dimmed: rgba(255,255,255,0.1) !important;
    --arrowpanel-dimmed-further: Highlight !important;
    --arrowpanel-dimmed-even-further: transparent !important;
    --panel-separator-color: rgba(250,250,255,0.3) !important;
    --chrome-content-separator-color: rgba(250,250,255,0.3) !important;
    --arrowpanel-border-color: rgba(250,250,255,0.3) !important;
    --arrowpanel-background: rgba(10,10,15,0.8) !important;
    --autocomplete-popup-background: rgba(10,10,15,0.8) !important;
    --autocomplete-popup-color: rgb(240,240,245) !important;
    --arrowpanel-color: rgb(240,240,245) !important;
    --panel-disabled-color: rgb(190,190,195) !important;
    --urlbar-popup-url-color: LightSkyBlue !important;
    --urlbar-popup-action-color: Aquamarine !important;
    /* border: 1px solid var(--chrome-content-separator-color) !important; */
}
#urlbar.megabar {
    background-color: rgba(10,10,15,0.8) !important;
    color: rgb(240,240,245) !important;
}

panel[type="autocomplete-richlistbox"] {
    background: var(--autocomplete-popup-background) !important;
    color: var(--autocomplete-popup-color) !important;
    border-color: var(--arrowpanel-border-color) !important;
}

panel[type="autocomplete-richlistbox"] > richlistbox {
    background: transparent !important;
    color: inherit !important;
    margin: 0 !important;
}

panel#PopupAutoComplete > richlistbox > richlistitem[originaltype="loginsFooter"] {
    color: var(--autocomplete-popup-color) !important;
    border-top-color: var(--chrome-content-separator-color) !important;
    background-color: var(--arrowpanel-dimmed) !important;
}

panel#PopupAutoComplete > richlistbox > richlistitem[originaltype="loginsFooter"]:hover,
panel#PopupAutoComplete > richlistbox > richlistitem[originaltype="loginsFooter"][selected] {
    background-color: Highlight !important;
    color: HighlightText !important;
}

Dobrov пишет

На Firefox 87 не работает

А в 90-ой проверял?

скрытый текст
c7ff97d4508ct.jpg

classic81 пишет

а вот такие вертикальные черточки-разделители (как в 68-м) между кнопками в рамках userChrome.css уже нереализуемо?

Скорее всего реализуемо, но не с моими навыками.

Отсутствует

 

№1027825-05-2021 00:37:22

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 1992
UA: Firefox 89.0

Re: Настройка внешнего вида Firefox в userChrome.css

_zt пишет

А как скрыть пункты контекстного меню

https://forum.mozilla-russia.org/viewto … 08#p790608

_zt пишет

Также есть еще несоответствия контекста, например при выделенном тексте и ПКМ по ссылке:

Как было так и должно быть, то что два сепаратора, у вас же многие пункты скрыты возможно из-за этого, или из-за добавленных пунктов я писал уже об этом

_zt пишет

как в ContextMenuOpenWith скрыть пункты/подменю меню страницы в полях ввода?

//arr[0].hidden = link;
arr[0].hidden = link || gContextMenu.onTextInput;


//this.menupage.hidden = link;
this.menupage.hidden = link || gContextMenu.onTextInput;

classic81 пишет

а вот такие вертикальные черточки-разделители (как в 68-м) между кнопками

почти так можно

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

Выделить код

Код:

.searchbar-engine-one-off-item:not(#urlbar-anon-search-settings-compact) {
    background: linear-gradient(transparent 15%, var(--panel-separator-color) 15%, var(--panel-separator-color) 85%, transparent 85%);
    background-size: 1px auto;
    background-repeat: no-repeat;
    background-position: right center;
    background-clip: padding-box;
    color: var(--panel-disabled-color);
}
.searchbar-engine-one-off-item:not(#urlbar-anon-search-settings-compact),
.search-panel-one-offs-header {
    border-bottom: 1px solid var(--panel-separator-color);
}
.search-panel-one-offs {
    height: auto !important;
}
.search-one-offs .searchbar-separator {
    display: none;
}
#PopupSearchAutoComplete {
    padding-bottom: 0 !important;
}
.search-setting-button {
    border-top: none !important;
}
#urlbar .searchbar-engine-one-off-item {
    margin-inline-end: 0 !important;
}
#urlbar .search-one-offs {
    padding-bottom: 0 !important;
}
#urlbar .search-panel-header {
    display: none !important;
}
#urlbar .search-one-offs {
    padding-block: 0 !important;
}

Отредактировано Vitaliy V. (25-05-2021 01:00:32)

Отсутствует

 

№1027925-05-2021 01:34:38

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

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V. пишет

https://forum.mozilla-russia.org/viewto … 08#p790608

Это я видел, но это не то. Я подумал, что через скрипт можно было бы переназначить контексты пунктам.

Vitaliy V. пишет

так и должно быть

Так не было бы, если бы контекст выделенного не накладывался на другие контексты. И мне не понятен смысл такого наложения.

Vitaliy V. пишет

|| gContextMenu.onTextInput;

Спасибо, -1 еще один лишний пункт.


Fx 91 esr

Отсутствует

 

№1028025-05-2021 01:35:48

classic81
Участник
 
Группа: Members
Зарегистрирован: 09-03-2021
Сообщений: 3
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V. пишет

почти так можно

да отлично же! блок вновь стал eye-friendly. Огромное Вам спасибо!
но вот смотрю я на эту кучу кода ради такой мелочи и офигиваю от костыльности. вроде гибкая система и здесь хотя бы есть возможность подстроить под себя, но освоить это простому юзеру...

Отсутствует

 

№1028125-05-2021 04:06:12

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

Re: Настройка внешнего вида Firefox в userChrome.css

_zt
Двойной сепаратор, попробуй убрать #context-sep-ctp.

Отсутствует

 

№1028225-05-2021 09:10:12

darex
Участник
 
Группа: Members
Зарегистрирован: 05-07-2020
Сообщений: 25
UA: Firefox 88.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
После вчерашней правки ContextMenuOpenWith:
Если var submenu = true; - подменю появляется.
Если var submenu = false; - пункты меню не отображаются. Помогает

Выделить код

Код:

if (!submenu) {
                        // if (prelabpage)
                            _prelabpage = "Открыть страницу в ";
                        // if (prelablink)
                            _prelablink = "Открыть ссылку в ";
                    }

Спасибо.

Отсутствует

 

№1028325-05-2021 11:40:12

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 1992
UA: Firefox 89.0

Re: Настройка внешнего вида Firefox в userChrome.css

_zt пишет

переназначить контексты пунктам.

Чего переназначить, чтобы как раньше был ещё один пункт "Открыть фоновое изображение"?
или совсем скрыть для контекста "страница", только понятия не имею что это.
Раньше пункты #context-viewimage, #context-copyimage отображались только для тега <img>
Короче считаю это делать не стоит.

classic81 пишет

кучу кода ради такой мелочи

Там много лишнего для [firefox] 78, кроме того этот код ещё и для панели адреса.

darex пишет

После вчерашней правки...Если var submenu = false; - пункты меню не отображаются. Помогает

Что, какой правки моей? Я там только исправил, где затесались две одинаковые строки
Пункты отображаются, смотрите есть ли вначале эти, и другие параметры, небось со старого кода их заменили не глядя
var prelabpage = true; // Добавить вначале "Открыть страницу в ";
var prelablink = true; // Добавить вначале "Открыть ссылку в ";

Отредактировано Vitaliy V. (25-05-2021 11:41:06)

Отсутствует

 

№1028425-05-2021 12:01:30

darex
Участник
 
Группа: Members
Зарегистрирован: 05-07-2020
Сообщений: 25
UA: Firefox 88.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.

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

Да, моя невнимательность. Sorry!

Отсутствует

 

№1028525-05-2021 12:04:08

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

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V. пишет

Чего переназначить, чтобы как раньше был ещё один пункт "Открыть фоновое изображение"?

От этого стандартный пункт никуда не денется.

Vitaliy V. пишет

или совсем скрыть для контекста "страница"

Да. Я об этом выше писал.

Vitaliy V. пишет

только понятия не имею что это

...

Vitaliy V. пишет

Раньше пункты #context-viewimage, #context-copyimage отображались только для тега <img>

Вот и сейчас надо что бы так было. Иначе, в начале контекстного меню страницы, вместо нужных пунктов, никем не используемый мусор.
   
xrun1
Причем тут он? Там зачем то #frame-sep был, который даже на фреймах не нужен, так как на фреймах зачем то #spell-separator есть.


Fx 91 esr

Отсутствует

 

№1028625-05-2021 12:45:08

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 1992
UA: Firefox 89.0

Re: Настройка внешнего вида Firefox в userChrome.css

_zt
ну так перенесите вниз или скройте раз это мусор для вас

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

Выделить код

Код:

#context-navigation:not([hidden]) ~ :is(#context-viewimage,#context-sep-setbackground),
#context-saveimage[hidden] ~ :is(#context-copyimage-contents,#context-copyimage,#context-sendimage) {
    display: none !important;
}

Отсутствует

 

№1028725-05-2021 13:54:48

Пандёнок
Участник
 
Группа: Extensions
Откуда: about:newtab
Зарегистрирован: 04-11-2008
Сообщений: 5127
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

_zt пишет

Раньше пункты #context-viewimage, #context-copyimage отображались только для тега <img>

Вот и сейчас надо что бы так было.

Не надо. Потому что существует "400 относительно честных способов" вставить картинку на страницу сайта, и тег <img> — только один из этих способов. Почему вы считаете, что картинки, которые по воле вебмастера вставлены, например, как background, никому не интересны? Не надо давать сайтам способ защиты от копирования картинок пользователем!


Мой рецепт счастья почти в любом браузере на ПК: раз, два, три — реклама, умри! В FF для Android: раз! И моя маленькая подписка против гороскопов.
Proton OFF.

Отсутствует

 

№1028825-05-2021 14:11:46

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

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
Спасибо! Так об этом я изначально и просил, а вы -"понятия не имею что это". :)
   
Пандёнок
Пожалуйста, оставляйте свое "ценное мнение" при себе, кроме случаев когда можете реально помочь. Я вас не заставляю пользоваться тем о чем прошу для себя и не у вас. Кроме раздражения такие "комментарии" ничего не вызывают. Я вас чем то зацепил, что вы решили спорить со мной в не касающемся вас разговоре? Если вдруг это из-за моих комментариев в создаваемых вами темах, так я там всегда предлагаю более простое альтернативное решение, а не просто воду лью. Надеюсь вы меня поняли.

Отредактировано _zt (25-05-2021 14:17:19)


Fx 91 esr

Отсутствует

 

№1028925-05-2021 16:12:59

momo2000
Участник
 
Группа: Members
Зарегистрирован: 03-09-2015
Сообщений: 151
UA: Firefox 88.0

Re: Настройка внешнего вида Firefox в userChrome.css

Как переименовать Другие закладки на панели закладок?

Выделить код

Код:

[label="Другие закладки"] > label
[id="OtherBookmarks"] > label 
[data-l10n-id="other-bookmarks-folder"] > label

никакой не работает!

Отредактировано momo2000 (25-05-2021 16:13:20)

Отсутствует

 

№1029025-05-2021 17:18:41

sandro79
Участник
 
Группа: Members
Откуда: Ставрополье
Зарегистрирован: 15-11-2017
Сообщений: 1457
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

Отсутствует

 

№1029125-05-2021 18:13:56

Viatcheslav
Участник
 
Группа: Members
Откуда: г. Бобруйск, Беларусь
Зарегистрирован: 23-11-2016
Сообщений: 260
UA: Firefox 88.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V., опишите, пожалуйста, по-подробнее, как, пользуясь комплектом user_chrome_files, подключить скрипт, например, favicon_in_urlbar. Спасибо :)

Отсутствует

 

№1029225-05-2021 20:22:35

momo2000
Участник
 
Группа: Members
Зарегистрирован: 03-09-2015
Сообщений: 151
UA: Firefox 88.0

Re: Настройка внешнего вида Firefox в userChrome.css

sandro79:beer:

Выделить код

Код:

#OtherBookmarks > label {
    display: none !important;
}

этот вариант вроде тоже пробовал, но результата не было.

Viatcheslav

скрипты ещё можно подключать через подобие GUI
https://github.com/xiaoxiaoflood/firefox-scripts
rebuild_userChrome.uc.js  - это userChromeJS Manager (the blue ones are restartless)

Отредактировано momo2000 (25-05-2021 20:23:28)

Отсутствует

 

№1029325-05-2021 21:53:44

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 1992
UA: Firefox 89.0

Re: Настройка внешнего вида Firefox в userChrome.css

Viatcheslav
В конце поста вроде достаточно подробно описано и код загрузчика для custom_script_win.js
https://forum.mozilla-russia.org/viewto … 01#p788301

Viatcheslav пишет

например, favicon_in_urlbar

стрёмный он,
если что есть скрипт faviconinurlbar https://forum.mozilla-russia.org/viewto … 69#p789469

Отсутствует

 

№1029426-05-2021 06:18:49

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

Re: Настройка внешнего вида Firefox в userChrome.css

Сделал из кнопки меню комбайн - PanelUI-menu управление окном браузера, заменил значок. Тестируйте!

ucf_hookClicks.js - downloads-button, PanelUI-menu — custom_script_win.js

Выделить код

Код:

(async (id, func) => { // дополнительные клики на downloads-button, PanelUI-menu для custom_script_win.js
	await window.delayedStartupPromise;
	var btn = document.getElementById("downloads-button"), pui = document.getElementById("PanelUI-menu-button");
	if (!btn) return; btn.tooltipText = GetDynamicShortcutTooltipText(btn.id) +`

ПКМ:	Сохранить как единый html
	всё | выделенное на странице
…Shift	Обзор папки [Загрузки]\n
Ролик:	Сохранить как файл .txt
…Shift	Сайт: графика Вкл/Выкл\n
Колёсико на рисунке: ➜ Сохранить
Двойной клик: найти Похожие фото`,
																PanelUI_help =
`Браузер Firefox, версия ${Services.appinfo.platformVersion}\n
Колёсико:	Развернуть | окно
…Alt		Полный экран
Правый клик	⇲ Свернуть
…Shift		Закрыть ✕
…Alt		Персонализация`;

	var addDestructor = nextDestructor => {
		var {destructor} = ucf[id];
		ucf[id].destructor = () => {
			try {destructor();} catch(ex) {Cu.reportError(ex);}
			nextDestructor();
		}
	},
	showInStatusPanel = (info, time = 5000) => {
		var win = Services.wm.getMostRecentWindow("navigator:browser"); StatusPanel = win.StatusPanel;
		if (StatusPanel.update.tid)
			clearTimeout(StatusPanel.update.tid)
		else {
			var {update} = StatusPanel;
			StatusPanel.update = () => {};
			StatusPanel.update.ret = () => {
				StatusPanel.update = update;
				StatusPanel.update();
			}
		}
		StatusPanel.update.tid = setTimeout(StatusPanel.update.ret, time);
		StatusPanel._label = info;
	},
	saveSelectionToTxt = async () => { // сохранить страницу или выделенный текст как файл .txt
		var splice = saveURL.length == 10;
		var msgName = id + ":Save:GetSelection";
		var receiver = msg => {
			var title = document.title || gBrowser.selectedTab.label;
			var args = [
				"data:text/plain," + encodeURIComponent(gBrowser.currentURI.spec + "\n\n" + msg.data),
				title.replace(/[:\\\/<>?*|"]+/g,'_').replace(/\s+/g,' ').slice(0, 100).trim() + '_' + new Date().toLocaleString('ru').replace(', ','-').replace(/:/g, '։') + '.txt',
				null, false, true, null, window.document
			];
			splice && args.splice(5, 0, null);
			saveURL(...args) && showInStatusPanel("√ текст сохранён: " + title.slice(0, 60));
		}
		messageManager.addMessageListener(msgName, receiver);
		addDestructor(() => messageManager.removeMessageListener(msgName, receiver));
		var func = fm => {
			var res, fed, win = {}, fe = fm.getFocusedElementForWindow(content, true, win);
			var sel = (win = win.value).getSelection();
			if (sel.isCollapsed) {
				var ed = fe && fe.editor;
				if (ed && ed instanceof Ci.nsIEditor)
					sel = ed.selection, fed = fe;
			}
			if (sel.isCollapsed)
				fed && fed.blur(), docShell.doCommand("cmd_selectAll"),
				res = win.getSelection().toString(), docShell.doCommand("cmd_selectNone"),
				fed && fed.focus();
			res = res || sel.toString();
			/\S/.test(res) && sendAsyncMessage("saveSelectionToTxt", res);
		}
		var url = "data:;charset=utf-8," + encodeURIComponent(`(${func})`.replace("saveSelectionToTxt", msgName)) + '(Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager));';
		(saveSelectionToTxt = () => gBrowser.selectedBrowser.messageManager.loadFrameScript(url, false))();
	}, // end

	save = async () => { // автор: Лекс, правка: Dumby, Dobrov
		var msgName = id + "ucfDwnldsBtnSaveSnapshotToHTML";
		if (typeof IOUtils != "object") { // Firefox 78 ESR
			var {OS} = ChromeUtils.import("resource://gre/modules/osfile.jsm");
			var PathUtils = {join: (...args) => OS.Path.join(...args)};
			var IOUtils = {writeUTF8: (path, txt) => OS.File.writeAtomic(path, new TextEncoder().encode(txt))};
		}
		var write = IOUtils.writeUTF8 ? "writeUTF8" : "writeAtomicUTF8";

		var Title = (type) => { // получить заголовок (без обрезки, если type не указан) или домен (type <0)
			var title = (document.title || gBrowser.selectedTab.label);
			if ( !type ) return title; // заголовок
			if ( type > 0 ) return title.slice(0, type).replace(/ \| Форум Mozilla Россия$| — Mozilla Firefox|[\\\/?*\"'`]+/g,'').replace(/\s+/g,' ').replace(/[|<>]+/g,'_').replace(/:/g,'։').trim(); // ограничить длину имени
			var host = (/^file:\/\//.test(gURLBar.value)) ? '' : gURLBar.value.replace(/^.*url=|https?:\/\/|www\.|\/.*/g,'');
			return host.replace(/^ru\.|^m\.|forum\./,'').replace(/^club\.dns/,'dns');
		}
		var msgListener = async msg => {
			var [fileContent, fileName] = msg.data, dir;
			try {dir = prefs.getComplexValue("browser.download.dir", Ci.nsIFile);} catch {dir = dirsvc.get("DfltDwnld", Ci.nsIFile);}
			var arr = prefs.getStringPref("ucf_save.dirs", "_Web||_Images|0").split('|').slice(0, 2); // [Загрузки]/папки ucf_save/файл
			arr[1] = (arr[1] == "0") ? Title(100) : (arr[1] == "1") ? Title(-1) : ""; // имя вкладки или домен
			arr.forEach(dir.append); // ucf_save.dirs: путь для html|имя или домен|папка графики|имя вкладки
			dir.exists() && dir.isDirectory() || dir.create(dir.DIRECTORY_TYPE, 0o777); // создать папку, если не существует…
			var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
			file.initWithPath(dir.path);
			dir.append(fileName);
			await IOUtils[write](dir.path, fileContent) && showInStatusPanel("√ страница записана: " + fileName.slice(0, 60));
			var d = await Downloads.createDownload({ source: "about:blank", target: FileUtils.File(dir.path)}); // Fake download
			(await Downloads.getList(Downloads.ALL)).add(d);
			d.refresh(d.succeeded = true); // кнопка Загрузки мигает
		}
		messageManager.addMessageListener(msgName, msgListener);
		addDestructor(() => messageManager.removeMessageListener(msgName, msgListener));

		var svc = 'globalThis.Services || ChromeUtils.import("resource://gre/modules/Services.jsm").Services';
		var url = "data:;charset=utf8," + encodeURIComponent(`(${func})(${svc});`.replace("%MSG_NAME%", msgName));
		(save = () => gBrowser.selectedBrowser.messageManager.loadFrameScript(url, false))();
	}, // end save

	listener = e => { var trg = e.target; // Downloads Clicks
		if (e.button == 1) {
			if (e.shiftKey) { // СКМ + Shift
				if ( prefs.getIntPref("permissions.default.image", 1) == 1)
					prefs.setIntPref("permissions.default.image", 2), trg.style.filter = "hue-rotate(180deg) brightness(95%)"
				else
					prefs.setIntPref("permissions.default.image", 1), trg.style.filter = "";
				BrowserReload();
			} else	// СКМ Click
				saveSelectionToTxt(); // сохранить .txt
		} else if (e.button == 2) {
			if (e.shiftKey)
				Downloads.getSystemDownloadsDirectory().then(path => FileUtils.File(path).launch(), Cu.reportError) // Обзор папки «Загрузки»
			else	// ПКМ Click
				save(); // Single HTML
		}
	},
	listener_puie = e => { // PanelUI-menu mouseenter
		if (/Закрыть/.test(pui.tooltipText)) return;
		pui.tooltipText = PanelUI_help;
	},
	listener_pui = e => { // PanelUI-menu Clicks
		if (e.button == 1) { 
			if (e.altKey)
				window.BrowserFullScreen()
			else
			if( window.windowState != window.STATE_MAXIMIZED )
				window.maximize()
			else
				window.restore();
		} else
			if (e.button == 2) if (e.altKey) return
		else {
			e.stopPropagation();
			(e.shiftKey) ? window.close() : window.minimize();
		}
	}, // end Clicks

	keydown_win = e => { // нажатие клавиш
		if (!(e.keyCode == 83 && e.shiftKey && e.altKey)) return;
		var singlesave = document.getElementById(save_ex); // SingleSave
		singlesave ? singlesave.click() : save(); // имитировать клик по кнопке, используя её ID
	},
	{prefs, dirsvc} = Services, tmax = btn.tooltipText.split("\n")[0].length, save_ex = "_531906d3-e22f-4a6c-a102-8057b88a1a63_-browser-action";
	btn.setAttribute("context", "event.stopPropagation()");
	prefs.setBoolPref("browser.download.autohideButton", false); // не скрывать кнопку Загрузки

	(async () => { // SingleSave - дополнить подсказку
		setTimeout((but = document.getElementById(save_ex))=> {
			if (but)
				btn.tooltipText = btn.tooltipText + '\n\nAlt⇧S	нажатие SingleSave';
		}, 9000); // после запуска ждать от 3 сек
	})();

	btn.addEventListener("click", listener), pui.addEventListener("click", listener_pui), pui.addEventListener("mouseenter", listener_puie);
		window.addEventListener("keydown", keydown_win);
	var ucf = window.ucf_custom_script_win || window.ucf_custom_script_all_win;
	ucf[id] = {destructor() {
		btn.removeEventListener("click", listener), pui.removeEventListener("click", listener_pui), pui.removeEventListener("mouseenter", listener_puie);
		window.removeEventListener("keydown", keydown_win);
	}};
	ucf.unloadlisteners.push(id);

})("downloads-button-click-listener", ({io, focus}) => {

	var resolveURL = function (url, base) {
		try { return io.newURI(url, null, io.newURI(base)).spec;
		} catch {}
	},
	getSelWin = function (w) {
		if (w.getSelection().toString()) return w;
		for (var i = 0, f, r; f = w.frames[i]; i++) {
			try { if (r = getSelWin(f)) return r;
			} catch(e) {}
		}
	},
	encodeImg = function (src, obj) {
		var canvas, img, ret = src;
		if (/^https?:\/\//.test(src)) {
			canvas = doc.createElement('canvas');
			if (!obj || obj.nodeName.toLowerCase() != 'img') {
				img = doc.createElement('img');
				img.src = src;
			} else
				img = obj;
			if (img.complete) try{
				canvas.width = img.width;
				canvas.height = img.height;
				canvas.getContext('2d').drawImage(img, 0, 0);
				ret = canvas.toDataURL((/\.jpe?g/i.test(src) ? 'image/jpeg' : 'image/png'));
			} catch (e) {};
			if (img != obj) img.src = 'about:blank';
		};
		return ret;
	},
	toSrc = function (obj) {
		var strToSrc = function (str) {
			var chr, ret = '', i = 0, meta = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '\x22' : '\\\x22', '\\': '\\\\'};
			while (chr = str.charAt(i++)) {
				ret += meta[chr] || chr;
			};
			return '\x22' + ret + '\x22';
		},
		arrToSrc = function (arr) {
			var ret = [];
			for (var i = 0; i < arr.length; i++) {
				ret[i] = toSrc(arr[i]) || 'null';
			};
			return '[' + ret.join(',') + ']';
		},
		objToSrc = function (obj) {
			var val, ret = [];
			for (var prop in obj) {
				if (obj.hasOwnProperty(prop) && (val = toSrc(obj[prop]))) ret.push(strToSrc(prop) + ': ' + val);
			};
			return '{' + ret.join(',') + '}';
		};
		switch (Object.prototype.toString.call(obj).slice(8, -1)) {
			case 'Array': return arrToSrc(obj);
			case 'Boolean':
			case 'Function':
			case 'RegExp': return obj.toString();
			case 'Date': return 'new Date(' + obj.getTime() + ')';
			case 'Math': return 'Math';
			case 'Number': return isFinite(obj) ? String(obj) : 'null';
			case 'Object': return objToSrc(obj);
			case 'String': return strToSrc(obj);
			default: return obj ? (obj.nodeType == 1 && obj.id ? 'document.getElementById(' + strToSrc(obj.id) + ')' : '{}') : 'null';
		}
	},
	mainWin = {};
	focus.getFocusedElementForWindow(content, true, mainWin);
	mainWin = mainWin.value;

	var selWin = getSelWin(mainWin), win = selWin || mainWin, doc = win.document, loc = win.location;
	var ele, pEle, clone, reUrl = /(url\(\x22)(.+?)(\x22\))/g;

	if (selWin) {
		var rng = win.getSelection().getRangeAt(0);
		pEle = rng.commonAncestorContainer;
		ele = rng.cloneContents();
	} else {
		pEle = doc.documentElement;
		ele = (doc.body || doc.getElementsByTagName('body')[0]).cloneNode(true);
	};
	while (pEle) {
		if (pEle.nodeType == 1) {
			clone = pEle.cloneNode(false);
			clone.appendChild(ele);
			ele = clone;
		};
		pEle = pEle.parentNode
	};
	var sel = doc.createElement('div');
	sel.appendChild(ele);

	for (var el, all = sel.getElementsByTagName('*'), i = all.length; i--;) {
		el = all[i];
		if (el.style && el.style.backgroundImage) el.style.backgroundImage = el.style.backgroundImage.replace(reUrl, function (a, prev, url, next) {
			if (!/^[a-z]+:/.test(url)) url = resolveURL(url, loc.href);
			return prev + encodeImg(url) + next;
		});
		switch (el.nodeName.toLowerCase()) {
			case 'link':
			case 'style':
			case 'script': el.parentNode.removeChild(el); break;
			case 'a':
			case 'area': if (el.hasAttribute('href') && el.getAttribute('href').charAt(0) != '#') el.href = el.href; break;
			case 'img':
			case 'input': if (el.hasAttribute('src')) el.src = encodeImg(el.src, el); break;
			case 'audio':
			case 'video':
			case 'embed':
			case 'frame':
			case 'iframe': if (el.hasAttribute('src')) el.src = el.src; break;
			case 'object': if (el.hasAttribute('data')) el.data = el.data; break;
			case 'form': if (el.hasAttribute('action')) el.action = el.action; break;
		}
	};
	var head = ele.insertBefore(doc.createElement('head'), ele.firstChild), meta = doc.createElement('meta'), sheets = doc.styleSheets, title = doc.getElementsByTagName('title')[0];
	meta.httpEquiv = 'content-type';
	meta.content = 'text/html; charset=utf-8';
	head.appendChild(meta);
	if (title) head.appendChild(title.cloneNode(true));

	head.copyScript = function (unsafeWin) {
		if ('$' in unsafeWin) return;
		var f = doc.createElement('iframe');
		f.src = 'about:blank';
		f.setAttribute('style', 'position:fixed;left:0;top:0;visibility:hidden;width:0;height:0;');
		doc.documentElement.appendChild(f);
		var str, script = doc.createElement('script');
		script.type = 'text/javascript';
		for (var name in unsafeWin) {
			if (name in f.contentWindow || !/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name)) continue;
			try {
				str = toSrc(unsafeWin[name]);
				if (!/\{\s*\[native code\]\s*\}/.test(str)) {
					script.appendChild(doc.createTextNode('var ' + name + ' = ' + str.replace(/<\/(script>)/ig, '<\\/$1') + ';\n'));
				}
			} catch (e) {};
		};
		f.parentNode.removeChild(f);
		if (script.childNodes.length) this.nextSibling.appendChild(script);
	};
	head.copyScript(win.wrappedJSObject || win);

	head.copyStyle = function (s) {
		if (!s) return;
		var style = doc.createElement('style');
		style.type = 'text/css';
		if (s.media && s.media.mediaText) style.media = s.media.mediaText;
		try {
			for (var i = 0, rule; rule = s.cssRules[i]; i++) {
				if (rule.type != 3) {
					if((!rule.selectorText || rule.selectorText.indexOf(':') != -1) || (!sel.querySelector || sel.querySelector(rule.selectorText))) {
						var css = !rule.cssText ? '' : rule.cssText.replace(reUrl, function (a, prev, url, next) {
							if (!/^[a-z]+:/.test(url)) url = resolveURL(url, s.href || loc.href);
							if(rule.type == 1 && rule.style && rule.style.backgroundImage) url = encodeImg(url);
							return prev + url + next;
						});
						style.appendChild(doc.createTextNode(css + '\n'));
					}
				} else {
					this.copyStyle(rule.styleSheet);
				}
			}
		} catch(e) {
			if (s.ownerNode) style = s.ownerNode.cloneNode(false);
		};
		this.appendChild(style);
	};
	for (var j = 0; j < sheets.length; j++) head.copyStyle(sheets[j]);
	head.appendChild(doc.createTextNode('\n'));

	var doctype = '', dt = doc.doctype;
	if (dt && dt.name) {
		doctype += '<!DOCTYPE ' + dt.name;
		if (dt.publicId) doctype += ' PUBLIC \x22' + dt.publicId + '\x22';
		if (dt.systemId) doctype += ' \x22' + dt.systemId + '\x22';
		doctype += '>\n';
	};

	var fileName = selWin ? win.getSelection().toString() : (title && title.text ? title.text : loc.pathname.split('/').pop());
	fileName = fileName.replace(/[:\\\/<>?*|"]+/g, '_').replace(/\s+/g, ' ').slice(0, 100).trim();
	fileName += "_" + new Date().toLocaleDateString('ru', {day: 'numeric', month: 'numeric', year: '2-digit'}) +'-'+ new Date().toLocaleTimeString().replace(/:/g, "։");
	if (!/\.html?$/.test(fileName)) fileName += '.html';

	sendAsyncMessage("%MSG_NAME%", [doctype + sel.innerHTML +'\n<a href='+ (loc.protocol != 'data:' ? loc.href : 'data:uri') +'><small><blockquote>источник: '+ new Date().toLocaleString("ru") +'</blockquote></small></a>', fileName]);

}); // END hookClicks

Необходимо прописать стиль в custom_style_user.css

Выделить код

Код:

/* кнопка меню: комбо-значок «Закрыть/⇲/Мин…» */
#PanelUI-menu-button:not(:hover) { -moz-image-region: auto !important;
	list-style-image: url("data:image/svg+xml;charset=utf-8,<svg width='32' height='32' version='1.1' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'><rect transform='matrix(2,0,0,2,-26,8.5)' x='13' y='-4.26' width='16' height='16' fill='hsl(0, 44%, 89%)'/><g fill='none' stroke='black'><path d='m18.825 4.427h12' stroke-width='2.6'/><g transform='translate(.39 .29)' opacity='.7' stroke-miterlimit='0'><path d='m29 14-15 15' stroke-width='3.43'/><path d='m14 13.86 15 15' stroke-width='3.44'/></g><g transform='matrix(1 0 0 .87 -6.64 -5)' stroke-width='2'><rect x='9' y='12.34' width='8' height='8' stroke-linecap='square' stroke-miterlimit='8' stroke-width='1.69'/><g transform='translate(.84 -.88)'><path d='m9.6 9.13h10.8' stroke-width='2.23'/><path d='m19.9 8v10.35' stroke-width='1.4'/></g></g><g transform='matrix(1.1 0 0 .75 5.56 -11.9)'><path d='m-2.29 46.6 3.57 7' stroke-width='1.7'/><path d='m1.28 53.6 3.57-7' stroke-width='1.7'/><path d='m1.28 53.6v-15' stroke-width='1.88'/></g></g></svg>") !important;
}
#PanelUI-menu-button .toolbarbutton-badge-stack {padding: 0px !important;}
#PanelUI-button .toolbarbutton-icon {margin: 0px !important;
	min-width: calc(var(--classic_squared_tabs_tab_height) + 8px) !important; min-height: calc(var(--classic_squared_tabs_tab_height) + 8px) !important;
}

custom_style_agent.css

Выделить код

Код:

#window-controls { display: none !important;} /* скрыть кнопки управления окном :root[inFullscreen="true"] */


PanelUI.png

Отредактировано Dobrov (26-05-2021 12:37:37)

Отсутствует

 

№1029526-05-2021 10:48:40

Viatcheslav
Участник
 
Группа: Members
Откуда: г. Бобруйск, Беларусь
Зарегистрирован: 23-11-2016
Сообщений: 260
UA: Firefox 88.0

Re: Настройка внешнего вида Firefox в userChrome.css

Конфигурация файла config.js, входящего в состав комплекта user_chrome_files, "ломает" защиту от проверки цифровых подписей расширений. По этой причине браузер отключает расширение Custom Buttons. Vitaliy V., это можно как-нибудь подправить, или пользоваться одновременно тем и другим не судьба? Спасибо ;)

Отсутствует

 

№1029626-05-2021 11:22:45

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

Re: Настройка внешнего вида Firefox в userChrome.css

Viatcheslav пишет

"ломает"

Нет такого. Файлы config.js нужно объединять, а не заменять.

Отредактировано _zt (26-05-2021 11:24:30)


Fx 91 esr

Отсутствует

 

№1029726-05-2021 11:55:08

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 1992
UA: Firefox 89.0

Re: Настройка внешнего вида Firefox в userChrome.css

Dobrov пишет

Как скрыть в полном экране контейнер кнопок #window-controls?

так и скрой их совсем
#window-controls {
    display: none !important;
}
зачем тебе именно в полном экране :root[inFullscreen="true"]
Viatcheslav
их нужно объединить и код конфига (первая часть) должна быть вначале любых других кодов

Отсутствует

 

№1029826-05-2021 13:17:23

Viatcheslav
Участник
 
Группа: Members
Откуда: г. Бобруйск, Беларусь
Зарегистрирован: 23-11-2016
Сообщений: 260
UA: Firefox 88.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V. пишет

их нужно объединить

Теперь понятно - благодарствую :beer:

Отсутствует

 

№1029926-05-2021 17:51:17

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

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V. пишет

так и скрой их совсем
#window-controls { display: none !important;}

Спасибо. Когда делал так для браузера под Windows, то почему-то контейнер кнопок управления окном не скрывался…


Vitaliy V. - вопрос по отладке скриптов для user_chrome_files. Чтобы "увидеть" изменения в UCF-скриптах, нужно перезапустить FF с очисткой кэша.
Есть ли способ на лету "перезагрузить" код всех UCF-скриптов? (после выполнения каких-либо правок в коде)

Отсутствует

 

№1030026-05-2021 20:19:59

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 1992
UA: Firefox 89.0

Re: Настройка внешнего вида Firefox в userChrome.css

Dobrov пишет

Есть ли способ на лету "перезагрузить" код всех UCF-скриптов? (после выполнения каких-либо правок в коде)

скрытый текст
Основная проблема сами скрипты, их все нужно делать так чтобы при вызове destructor() удалялись все следы их деятельности, включая добавленные элементы.
Плюс ещё сторонние скрипты которые вообще не имеют destructor() и загружаются загрузчиком который тоже придется переделывать. Так что нет, я не собираюсь делать менеджер скриптов и парсить файлы на наличие метаданных например
// @startup
// @shutdown
ненужны эти тормоза.
Но вот чисто теоретически если все скрипты умеют самоудалятся и без всяких загрузчиков, то как-то так для custom_script_win.js:
Если запустить в консоле браузера, это вызовет destructor() у всех скриптов

Выделить код

Код:

ucf_custom_script_win.unload();
ucf_custom_script_win = null;

Ну и теперь загрузить custom_script_win.js в обход кеша

Выделить код

Код:

Services.scriptloader.loadSubScriptWithOptions("chrome://user_chrome_files/content/custom_scripts/custom_script_win.js", {
    target: window,
    ignoreCache: true,
    charset: "UTF-8",
    async: true, // асинхронно
});

Отредактировано Vitaliy V. (26-05-2021 21:18:38)

Отсутствует

 

Board footer

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