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

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№1595131-10-2021 20:09:13

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

Re: Custom Buttons

ВВП
var bc = gBrowser.selectedBrowser.browsingContext;
bc.allowJavascript = !bc.allowJavascript;

Отсутствует

 

№1595231-10-2021 22:40:11

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 93.0

Re: Custom Buttons

Dumby
Класс !

Отсутствует

 

№1595301-11-2021 15:00:45

Mishania
Забанен
 
Группа: Members
Откуда: Usa
Зарегистрирован: 22-10-2011
Сообщений: 357
UA: Firefox 86.0

Re: Custom Buttons

Dumby пишет

Не, 0.0.7.0.0.21 на 91 ставить не следует, там есть косяк несовместимости.

А нет никакого списка кнопок работающих на новых версиях? Переползать помаленьку нужно, только кнопки и держут. Их не так много, но без них не комфортно.

Отсутствует

 

№1595402-11-2021 00:41:36

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 93.0

Re: Custom Buttons

Dumby
В 93 не срабатывает этот код ... Ставлю в ini. В 92 - работает...

скрытый текст
var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
         file.initWithPath(file.path + "\\memory\\der.vbs");
file.launch();

Подставил в батник паузу,вроде, норм...
ping -n 1 -w 4000 192.168.254.254 >nul
Reg.exe delete "HKCU\SOFTWARE\Mozilla\Firefox" /f
Хоть и патченый  фокс , а при открытии адреса снова летит в реестр HKCU\SOFTWARE\Mozilla\Firefox\Launcher , хотя и без значений

Отредактировано ВВП (02-11-2021 10:51:08)

Отсутствует

 

№1595503-11-2021 20:40:59

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

Re: Custom Buttons

Mishania пишет

А нет никакого списка кнопок работающих на новых версиях?

Не знаю. Я о таком не слышал.

Отсутствует

 

№1595605-11-2021 21:24:28

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 93.0

Re: Custom Buttons

Dumby
В 94 скрипт памяти заманался рихтовать . Вроде все показывает, но моя фишка чистит память, а индикатор не реагирует..

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

Выделить код

Код:

(async id => ({

	delay: 2e3,

	get limit() {
		var mb = 950 * 950;
		delete this.limit;
		return this.limit = this.notMulti
			? 900 * mb // not multiprocess, 900MB
			: 1.1 * 950 * mb; // multiprocess, 1.1GB
	},
	xul: `
		<hbox
			id="${id}"
			value="ram"
			tooltiptext="ЛКМ: Очистить Память"
		>
			<label id="${id += "-label"}"/>
		</hbox>
	`,
	css: `
		min-height: 26px !important;
		height: 26px !important;
		border-radius: 3px !important;
		padding: 0px 5px 0px !important;
		color: #00ffff !important;
                font-size: 15px !important;
		margin: 0px  1px  1px 3px !important;
		
                font-weight: 400 !important;
                font-family: segoe ui !important;
		
		background: linear-gradient(rgb(72, 85, 108),rgb(20, 25, 34)) !important;
	`,
	launch() {
		var file = Services.dirsvc.get("ProfD", Ci.nsIFile);
		["memory", "start.vbs"].forEach(file.append);
		(this.launch = file.launch)();
	},
	val: "",
	init(topic, mm) {
		Services.obs.addObserver(mm = this, topic);
		Services.obs.addObserver(function quit(s, t) {
			this.timer?.cancel();
			Services.obs.removeObserver(mm, topic);
			Services.obs.removeObserver(quit, t);
		}, "quit-application-granted");
	},
	observe(win) {
		var df = win.MozXULElement.parseXULToFragment(this.xul);
		this.click = e => e.button || this.launch();
		this.notMulti = !Services.appinfo.browserTabsRemoteAutostart;
		this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);

		(this.observe = async win => {
			this.timer.cancel();
			await new Promise(win.requestAnimationFrame);
			var clone = win.document.importNode(df, true);
			var hbox = clone.firstChild;
			win.document.getElementById("page-action-buttons").append(clone);
			hbox.onclick = this.click;
			hbox.style.cssText = this.css;
			hbox.firstChild.style.setProperty("margin", "0", "important");
			this.notify();
		})(win);
	},
	async notify() {
		var info = await ChromeUtils.requestProcInfo();
		var bytes = info.memory;
		for(var child of info.children) bytes += child.memory;
		this.timer.initWithCallback(this, this.delay, this.timer.TYPE_ONE_SHOT);

		var prev = this.val;
		if ((this.val = this.mgb(bytes)) != prev)
			for(var win of CustomizableUI.windows) {
				var lab = win.document.getElementById(id);
				if (lab) lab.value = this.val;
			}
	},
	mgb: bytes => bytes < 1073741824
		? String(Math.round(bytes / 1048576))
		: (bytes / 1073741824).toFixed(2)
}).init("browser-delayed-startup-finished"))("ucf-mem-indicator");

Кстати, а никак старую кнопку к мультирежиму прикрутить ? Она как раз работает , ну и стили из справки по уму (перенести в INI)

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3Eram%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/jpeg%3Bbase64%2C%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0A%0A//%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A//%20Memory%20Monitor%20................................%0A//%20https%3A//forum.mozilla-russia.org/viewtopic.php%3Fid%3D52237%0A//%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0Avar%20idbut%3Dthis.id%3B%0Avar%20urlbar%20%3D%20document.getElementById%28%22page-action-buttons%22%29%3B%0Avar%20button%20%3D%20document.getElementById%28idbut%29%3B%0Aurlbar.insertBefore%28button%2C%20urlbar.Child%29%3B%0A%0Avar%20style%20%3D%20custombutton.buttonGetHelp%28self%29.replace%28/id/g%2C%20_id%29%3B%0Avar%20uri%20%3D%20makeURI%28%27data%3Atext/css%2C%27+%20encodeURIComponent%28style%29%29%3B%0Avar%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0Asss.loadAndRegisterSheet%28uri%2C%200%29%3B%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u043A%u043D%u043E%u043F%u043A%u0438%20................................%0Athis.tooltipText%20%3D%20%22%u041B%3A%20%u041F%u0440%u0438%u043D%u0443%u0434%u0438%u0442%u0435%u043B%u044C%u043D%u0430%u044F%20%u043E%u0447%u0438%u0441%u0442%u043A%u0430%20%u043F%u0430%u043C%u044F%u0442%u0438%22%3B%20%20%20%20%20%20%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20................................%0Athis.onclick%20%3D%20this.oncontextmenu%20%3D%20function%28event%29%20%7B%0A%20%20%20%20%0A%20%20%20%20%20%0A%20%20%20%20%20%20if%20%28event.button%20%3D%3D%200%29%20%7B%20%0A%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20var%20file%20%3D%20Services.dirsvc.get%28%27ProfD%27%2C%20Ci.nsIFile%29%3B%0A%20%20%20%20%20%20%20%20%20file.initWithPath%28file.path%20+%20%22%5C%5Cmemory%5C%5Cstart.vbs%22%29%3B%20%0A%20%20%20%20%20%20%20%20%20file.launch%28%29%3B%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%0A%7D%3B%0Athis.oncontextmenu%20%3De%3D%3E%20%7B%20e.button%20%26%26%20%21e.ctrlKey%20%26%26%20e.preventDefault%28%29%20%7D%3B%0A%20%20%20%20%20%20%20%20%0A//%20%u041F%u043E%u043A%u0430%u0437%u044B%u0432%u0430%u0442%u044C%20%u043F%u043E%u0442%u0440%u0435%u0431%u043B%u0435%u043D%u0438%u0435%20%u043F%u0430%u043C%u044F%u0442%u0438%20%u043D%u0430%20%u0442%u0435%u043A%u0443%u0449%u0435%u0439%20%u043A%u043D%u043E%u043F%u043A%u0435%0A%28function%20%28%29%20%7B%20%0Aself.timer%20%3D%20setInterval%28function%28%29%20%7B%0A%20%20%20%20%20%20var%20memory%20%3D%20getMemory%28%29%3B%0A%20%20%20%20%20%20self.label%20%3D%20getMemory%28%29%0A%20%20%20%20%20%20if%20%28%20memory%20%3E%20140%20%29%20%7B%0A%20%20%20%20%20%20%20%20var%20file%20%3D%20Services.dirsvc.get%28%27ProfD%27%2C%20Ci.nsIFile%29%3B%0A%20%20%20%20%20%20%20%20%20file.initWithPath%28file.path%20+%20%22%5C%5Cmemory%5C%5Cstart.vbs%22%29%3B%20%0A%20%20%20%20%20%20%20%20%20file.launch%28%29%3B%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%7D%2C%202000%20%29%3B%20%20%20%20%20%0A%20%0A//%20%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u0432%u0441%u044E%20%u0437%u0430%u043D%u0438%u043C%u0430%u0435%u043C%u0443%u044E%20%u043E%u043F%u0435%u0440%u0430%u0442%u0438%u0432%u043D%u0443%u044E%20%u043F%u0430%u043C%u044F%u0442%u044C%20%u0432%20MB%20....%0A%20%20%20function%20getMemory%28%29%20%7B%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20var%20reporterManager%20%3D%20Cc%5B%22@mozilla.org/memory-reporter-manager%3B1%22%5D.getService%28Ci.nsIMemoryReporterManager%29%3B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20e%20%3D%20reporterManager.enumerateReporters%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20while%20%28%20e.hasMoreElements%28%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20mr%20%3D%20e.getNext%28%29.QueryInterface%28Ci.nsIMemoryReporter%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self%5Bmr.path%5D%20%3D%20mr%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20var%20memory%20%3D%20self%5B%22resident%22%5D.amount%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20catch%28e%29%20%7B%20var%20memory%20%3D%20reporterManager.resident%3B%20%7D%20//%20FF26%20-%20Nightly%0A%20%20%20%20%20%0A%20%20%20%20%20%20return%20%28%20Math.round%28%20memory/1048576%20%29%20%29%3B%0A%20%20%20%7D%3B%20%20%20%20%20%0A%0A//%20%u0421%u0442%u0438%u043B%u044C%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0435%u0442%20%u0442%u0435%u043A%u0441%u0442%20%u043D%u0430%20%u043A%u043D%u043E%u043F%u043A%u0443%20....%0A%20%20%20var%20uri%20%3D%20makeURI%28%27data%3Atext/css%2C%27+%20encodeURIComponent%28%27%5C%0A%20%20%20%25button%25%20.toolbarbutton-icon%20%7B%5C%0A%20%20%20%20%20display%3A%20none%20%21important%3B%5C%0A%20%20%20%7D%5C%0A%20%20%20%25button%25%20.toolbarbutton-text%20%7B%5C%0A%20%20%20%20%20display%3A%20-moz-box%20%21important%3B%5C%0A%20%20%20%7D%5C%0A%20%20%20%25button%25%20%7B%5C%0A%20%20%20%20%20-moz-box-orient%3A%20horizontal%20%21important%3B%5C%0A%20%20%20%7D%5C%0A%20%20%20%27.replace%28/%25button%25/g%2C%20%22%23%22%20+%20_id%29%20%29%29%3B%0A%20%20%20const%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0A%20%20%20sss.loadAndRegisterSheet%28uri%2C%20sss.AGENT_SHEET%29%3B%0A%20%20%20%0A//%20%u0423%u0434%u0430%u043B%u044F%u0442%u044C%20%u0441%u0447%u0451%u0442%u0447%u0438%u043A%20%u043F%u0430%u043C%u044F%u0442%u0438%20%u0438%20%u0434%u0440%u0443%u0433%u0438%u0435%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%20....%0A%20%20addDestructor%28function%28%29%20%7B%0A%20%20%20%20%20%20try%20%7B%20window.clearTimeout%28%20self.timer%20%29%20%7D%20catch%28e%29%20%7B%7D%3B%0A%20%20%20%7D%29%3B%0A%7D%29%28%29%3B%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%23id%20.toolbarbutton-text%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min-height%3A%2026px%20%21important%3B%0A%09%09height%3A%2026px%20%21important%3B%0A%09%09border-radius%3A%203px%20%21important%3B%0A%09%09padding%3A%200px%205px%200px%20%21important%3B%0A%09%09font-family%3A%20segoe%20ui%20%21important%3B%0A%09%09color%3A%20%2300ffff%20%21important%3B%0A%09%09font-size%3A%2015px%20%21important%3B%0A%09%09margin-bottom%3A%202px%20%21important%3B%0A%09%09margin-right%3A%201px%20%21important%3B%0A%09%09margin-left%3A%203px%20%21important%3B%0A%09%09background%3A%20linear-gradient%28rgb%2872%2C%2085%2C%20108%29%2Crgb%2820%2C%2025%2C%2034%29%29%20%21important%3B%0A%20%20%20%20%20%0A%7D%0A%0A%23id%20.toolbarbutton-icon%20%7B%0A%20%20display%3A%20none%20%21important%3B%0A%7D%20%0A%0A%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отредактировано ВВП (06-11-2021 13:35:55)

Отсутствует

 

№1595707-11-2021 07:28:15

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

Re: Custom Buttons

Есть ли способ открывать определённый ключ about:config ? Например: about:config#network.proxy.autoconfig_url ? Если нет, то
как из JS-кода отправить в строку ввода "Искать параметр по имени" название нужного параметра ?

Выделить код

Код:

Services.wm.getMostRecentWindow("navigator:browser").switchToTabHavingURI("about:config", true, {relatedToCurrent: true, triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()});

Отредактировано Dobrov (07-11-2021 07:38:44)

Отсутствует

 

№1595807-11-2021 10:59:11

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

Re: Custom Buttons

Dobrov
Warning, надеюсь, отключён

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

Выделить код

Код:

var filter = "network.proxy.autoconfig_url";

var win = Services.wm.getMostRecentWindow("navigator:browser");
var found = win.switchToTabHavingURI("about:config", true, {
	relatedToCurrent: true,
	triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
});
var setFilter = (e, win) => {
	var input = (e?.target || win.content.document)
		.getElementById("about-config-search");
	if (e || input.value != filter) input.setUserInput(filter);
}
win = Services.wm.getMostRecentWindow("navigator:browser");
if (found) setFilter(null, win);
else win.gBrowser.selectedBrowser.addEventListener("pageshow", setFilter, {once: true});

Отсутствует

 

№1595907-11-2021 11:11:26

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 94.0

Re: Custom Buttons

Dumby
Вынужден повторить даже ваш индикатор памяти не реагирует после очистки !

Отсутствует

 

№1596007-11-2021 14:39:27

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

Re: Custom Buttons

ВВП пишет

индикатор памяти не реагирует после очистки

А значения на странице about:processes реагируют?

Отсутствует

 

№1596107-11-2021 15:56:59

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 94.0

Re: Custom Buttons

Dumby
Нет...А раз так , выходит все , кранты...Накосорезали разрабы. В альфа-версиях еще все норм. было...

Отредактировано ВВП (07-11-2021 16:41:30)

Отсутствует

 

№1596207-11-2021 17:45:49

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

Re: Custom Buttons

del

Отредактировано Garalf (07-11-2021 17:49:49)

Отсутствует

 

№1596307-11-2021 21:45:54

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 484
UA: Firefox 94.0

Re: Custom Buttons

Dumby 1. подскажи пожалуста уже этот код не работает

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

Выделить код

Код:

(async () => {
    var url = `${
        AppConstants.SOURCE_REVISION_URL.replace("rev", "raw-file")
    }/dom/events/${
        {win: "win", linux: "unix", macosx: "mac"}[AppConstants.platform] || "unix"
    }/ShortcutKeyDefinitions.cpp`;

    var text = await (await fetch(url)).text();
    var commands = text.match(/cmd_[^"]+/g);

   // alert(commands.join("\n"));
   
    var text = commands.join("\n"); 
   var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
   file.append("TextToEditor.txt");
   custombuttonsUtils.writeFile(file.path, text);
   file.launch();
})();


2. Дополнительные кнопки на странице about:addons для аддонов, плагинов, тем, CB
скрытый текст

Выделить код

Код:

((id, g, css) => {
	addDestructor(r => r[5] == "e" && g[id]?.destroy(true));
	if (g[id]) return;
	var btnActions = ["preferences", "toggle-disabled", "remove", "install-update"];

	var {Array, Set} = Cu.getGlobalForObject(g);
	var {obs, focus, wm} = Services, cn = "cb-cloned-buttons-container";
	var topics = ["chrome-document-loaded", "quit-application-granted"];
	(g[id] = {
		init() {
			for(var topic of topics) obs.addObserver(this, topic);
			this.wins();
		},
		destroy(wins) {
			delete g[id];
			for(var topic of topics) obs.removeObserver(this, topic);
			wins && this.wins("destroyDoc");
		},
		isTarget: doc => doc.documentURI == "about:addons",
		wins(method = "initDoc") {
			for(var {document: doc} of new Set(Array.from(
				g.AddonManagerInternal.addonListeners, Cu.getGlobalForObject
			))) doc && this.isTarget(doc) && this[method](doc);
		},
		initDoc(doc) {
			this.btnActions = btnActions.map(action => `panel-list > panel-item[action="${action}"]`);
			var url = "cb" + (this.url =
				"data:text/css;charset=utf-8," + encodeURIComponent(css.replace(/;/g, " !important;"))
			);
			this.type = doc.ownerGlobal.windowUtils.USER_SHEET;

			(this.initDoc = doc => {
				doc.addEventListener("unload", this);
				doc.addEventListener("update", this, true);
				doc.ownerGlobal.windowUtils.loadSheetUsingURIString(url, this.type);
				for(var card of doc.getElementsByTagName("addon-card")) this.onCard(card);
			})(doc);
		},
		destroyDoc(doc) {
			for(var span of Array.from(doc.getElementsByClassName(cn))) span.remove();
			doc.ownerGlobal.windowUtils.removeSheetUsingURIString(this.url, this.type);
			this.unload(doc);
		},
		observe(doc, topic) {
			topic[0] == "q" ? this.destroy() : this.isTarget(doc) && this.initDoc(doc);
		},
		handleEvent(e) {
			this[e.type](e.target);
		},
		unload(doc) {
			doc.removeEventListener("update", this, true);
			doc.removeEventListener("unload", this);
		},
		update(card) {
			card.nodeName == "ADDON-CARD" && this.onCard(card);
		},
		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(cn);
			if (span) span.textContent = "";
			else {
				card.querySelector("button.more-options-button")
					.before(span = doc.createElement("span"));
				span.className = cn;
			}
			for(var item of this.btnActions.map(this.btns, btnsParent)) if (item)
				span.append(item),
				item.shadowRoot.querySelector("button")
					.classList.add("cb-cloned-button");
		},
		btns(sel) {
			var item, doc = this.ownerDocument, card = this.parentNode;
			if (
				sel.includes("toggle-disabled") &&
				card.querySelector('input[action="toggle-disabled"]')
			) {
				var item = doc.createElement("panel-item");
				item.setAttribute("action", "toggle-disabled");
				doc.l10n.setAttributes(item, `${
					card.getAttribute("active") == "true" ? "dis" : "en"
				}able-addon-button`);
			} else
				item = this.querySelector(sel);
			return item?.cloneNode(true);
		}
	}).init();
})("CBAboutAddonsHTMLButtonizer", Cu.import("resource://gre/modules/AddonManager.jsm", {}), `

	span.cb-cloned-buttons-container {
		display: flex;
	}
	button.cb-cloned-button {
		appearance: none;
		padding: 1px 6px 3px 6px;
		margin: 0 1px;
		background-image: none;

		border: 1px solid var(--in-content-box-border-color);
		border-radius: 0px;

		font-size: 13px;
		font-family: Segoe UI;
	}
	button.cb-cloned-button:hover {
		background-color: gold;
	}
	button.cb-cloned-button:after,
	input[action="toggle-disabled"] {
		display: none;
	}
`);

Отсутствует

 

№1596407-11-2021 23:12:32

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

Re: Custom Buttons

Andrey_Krropotkin пишет

2. Дополнительные кнопки на странице about:addons для аддонов, плагинов, тем, CB
скрытый текст

https://forum.mozilla-russia.org/viewto … 47#p789547


Win7

Отсутствует

 

№1596508-11-2021 09:10:44

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 484
UA: Firefox 94.0

Re: Custom Buttons

kokoss спасибо

Отсутствует

 

№1596608-11-2021 15:41:12

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

Re: Custom Buttons

ВВП пишет

выходит все , кранты

Ну да, теперь отдаётся нечто другое.
Пишут: «On Windows this will return the Commit Size.».
По значениям выглядит похожим на строки «... MB ── private» на странице about:memory
и на значения в колонке «Private Bytes» в программе Process Explorer.
А "очистка", видимо, на эти показатели не влияет.

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

Нет, ну если очень надо, то можно попробовать для родительского процесса
и дочерних DOM-процессов заменить в подсчёте значения на возвращаемые
nsIMemoryReporterManager'ом. А оставшиеся процессы либо не учитывать вообще,
либо оставить как есть, непонятно что хуже.


Допустим, оставить. Код на замену

Выделить код

Код:

(async id => ({

	delay: 2e3,

	xul: `
		<hbox
			id="${id}"
			value="ram"
			tooltiptext="ЛКМ: Очистить Память"
		>
			<label id="${id += "-label"}"/>
		</hbox>
	`,
	css: `
		min-height: 26px !important;
		height: 26px !important;
		border-radius: 3px !important;
		padding: 0px 5px 0px !important;
		color: #00ffff !important;
		font-size: 15px !important;
		margin: 0px  1px  1px 3px !important;

		font-weight: 400 !important;
		font-family: segoe ui !important;

		background: linear-gradient(rgb(72, 85, 108),rgb(20, 25, 34)) !important;
	`,
	launch() {
		var file = Services.dirsvc.get("ProfD", Ci.nsIFile);
		["memory", "start.vbs"].forEach(file.append);
		(this.launch = file.launch)();
	},
	val: "",
	name: "UCFMemIndReporter",
	init(topic, mm) {
		Services.obs.addObserver(mm = this, topic);
		Services.obs.addObserver(function quit(s, t) {
			this.timer?.cancel();
			Services.obs.removeObserver(mm, topic);
			Services.obs.removeObserver(quit, t);
		}, "quit-application-granted");
	},
	observe(win) {
		var df = win.MozXULElement.parseXULToFragment(this.xul);
		this.click = e => e.button || this.launch();
		this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
		ChromeUtils.registerProcessActor(this.name, {
			includeParent: true,
			child: {moduleURI: "chrome://user_chrome_files/content/custom_scripts/memreporter.jsm"}
		});
		(this.observe = async win => {
			this.timer.cancel();
			await new Promise(win.requestAnimationFrame);
			var clone = win.document.importNode(df, true);
			var hbox = clone.firstChild;
			win.document.getElementById("page-action-buttons").append(clone);
			hbox.onclick = this.click;
			hbox.style.cssText = this.css;
			hbox.firstChild.style.setProperty("margin", "0", "important");
			this.notify();
		})(win);
	},
	async notify() {
		var bytes = 0, pids = [];
		for(var dp of ChromeUtils.getAllDOMProcesses()) try {
			let [pid, mem] = await dp.getActor(this.name).sendQuery("");
			pids.push(pid);
			bytes += mem;
		} catch {}

		var {children} = await ChromeUtils.requestProcInfo();
		for(var child of children)
			if (!pids.includes(child.pid)) bytes += child.memory;

		this.timer.initWithCallback(this, this.delay, this.timer.TYPE_ONE_SHOT);

		var prev = this.val;
		if ((this.val = this.mgb(bytes)) != prev)
			for(var win of CustomizableUI.windows) {
				var lab = win.document.getElementById(id);
				if (lab) lab.value = this.val;
			}
	},
	mgb: bytes => bytes < 1073741824
		? String(Math.round(bytes / 1048576))
		: (bytes / 1073741824).toFixed(2)
}).init("browser-delayed-startup-finished"))("ucf-mem-mix-indicator");

и рядом создать файл memreporter.jsm

Выделить код

Код:

var EXPORTED_SYMBOLS = ["UCFMemIndReporterChild"];
var ai = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime);
var prop = ai.processType == ai.PROCESS_TYPE_DEFAULT ? "resident" : "residentUnique";
var pid = ai.processID;
var mrm = Cc["@mozilla.org/memory-reporter-manager;1"].getService(Ci.nsIMemoryReporterManager);
class UCFMemIndReporterChild extends JSProcessActorChild {receiveMessage() {return [pid, mrm[prop]];}}

Подсчёт такой:
родительский процесс — nsIMemoryReporterManager.resident
дочерние DOM-процессы — nsIMemoryReporterManager.residentUnique
остальные процессы — ChildProcInfoDictionary.memory


Тогда на memreduct реагирует, и даже слишком,
какая-то другая крайность, совсем нереалистично.

Andrey_Krropotkin пишет

уже этот код не работает

Ага. Собрали всё в один файл, зацени.
То есть нужно убрать из адеса субчасть операционной системы. Вариант:

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

Выделить код

Код:

(async () => {
	var url = `${
		AppConstants.SOURCE_REVISION_URL.replace("rev", "raw-file")
	}/dom/events/ShortcutKeyDefinitions.cpp`;

	var text = await (await fetch(url)).text();

	var platform = {win: "Win", linux: "Linux", macosx: "macOS"}[AppConstants.platform];
	var re = new RegExp(
		'(?:u"keypress", +)' +
		'(?:u")?(.+?)(?:")?, +'.repeat(3) +
		`(?:u")(cmd_.+)(?="},.+${platform}(.+)?$)`,
		"gm"
	);
	var pad = function(arr) {
		return `${arr[0].padEnd(this, " ")}  ${arr[1]}`;
	}
	var result = [];
	var blocks = text.split("ShortcutKeyData ShortcutKeys::s").slice(1);

	for(var block of blocks) {
		var res, max = 0, arr = [];

		while((res = re.exec(block))) {
			var [, vk, key, mod, cmd] = res;
			if (key == " ") key = "<Space>";
			max = Math.max(max, cmd.length);

			if (mod != "nullptr") {
				var mods = [];
				if (mod.includes("control")) mods.push("Ctrl");
				if (mod.includes("accel")) mods.push("Accel");
				if (mod.includes("shift")) mods.push("Shift");
				if (mod.includes("alt")) mods.push("Alt");
				mod = mods.join("+") + "+";
			} else
				mod = "";

			arr.push([cmd, mod + (vk != "nullptr" ? vk : key)]);
		}
		arr = arr.map(pad, max);
		arr.unshift(block.slice(0, block.indexOf("[")) + ":\n");
		result.push(arr.join("\n"));
	}
	text = result.join("\n\n\n");

	var file = Services.dirsvc.get("ProfD", Ci.nsIFile);
	file.append("TextToEditor.txt");
	cbu.writeFile(file.path, text);
	file.launch();
})();

Отредактировано Dumby (08-11-2021 15:42:27)

Отсутствует

 

№1596708-11-2021 16:12:58

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 94.0

Re: Custom Buttons

Dumby
Ладно, about:processes - не изменяются значения, а автоочистку прикрутить тоже никак?
"Andrey_Krropotkin пишет

    уже этот код не работает"
И что это за код? Для чего?

Отредактировано ВВП (08-11-2021 17:58:23)

Отсутствует

 

№1596808-11-2021 18:29:33

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

Re: Custom Buttons

ВВП пишет

автоочистку прикрутить

В конец метода notify() добавить
bytes > число && this.launch();

Отсутствует

 

№1596908-11-2021 18:51:22

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 94.0

Re: Custom Buttons

Нормальный ход ... Task системный четко реагирует . И черт с ним с about:processes.
Благодарю !

Отредактировано ВВП (08-11-2021 19:44:14)

Отсутствует

 

№1597008-11-2021 20:15:39

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 94.0

Re: Custom Buttons

Dumby пишет

Допустим, оставить. Код на замену

Нефига не понял, как его подключить?

Отсутствует

 

№1597108-11-2021 21:19:57

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 94.0

Re: Custom Buttons

voqabuhe
Рядом с custom_script.js надо иметь файл memreporter.jsm . Такого содержания:

скрытый текст
var EXPORTED_SYMBOLS = ["UCFMemIndReporterChild"];
var ai = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime);
var prop = ai.processType == ai.PROCESS_TYPE_DEFAULT ? "resident" : "residentUnique";
var pid = ai.processID;
var mrm = Cc["@mozilla.org/memory-reporter-manager;1"].getService(Ci.nsIMemoryReporterManager);
class UCFMemIndReporterChild extends JSProcessActorChild {receiveMessage() {return [pid, mrm[prop]];}}

Сам код в custom_script.js
скрытый текст

Выделить код

Код:

(async id => ({

	delay: 2e3,

	xul: `
		<hbox
			id="${id}"
			value="ram"
			tooltiptext="ЛКМ: Очистить Память"
		>
			<label id="${id += "-label"}"/>
		</hbox>
	`,
	css: `
		min-height: 26px !important;
		height: 26px !important;
		border-radius: 3px !important;
		padding: 0px 4px 0px !important;
		color: #00ffff !important;
		font-size: 15px !important;
		margin: 0px  1px  1px 5px !important;
		font-weight: 400 !important;
		font-family: segoe ui !important;

		background: linear-gradient(rgb(72, 85, 108),rgb(20, 25, 34)) !important;
	`,
	launch() {
		var file = Services.dirsvc.get("ProfD", Ci.nsIFile);
		["memory", "start.vbs"].forEach(file.append);
		(this.launch = file.launch)();
	},
	val: "",
	name: "UCFMemIndReporter",
	init(topic, mm) {
		Services.obs.addObserver(mm = this, topic);
		Services.obs.addObserver(function quit(s, t) {
			this.timer?.cancel();
			Services.obs.removeObserver(mm, topic);
			Services.obs.removeObserver(quit, t);
		}, "quit-application-granted");
	},
	observe(win) {
		var df = win.MozXULElement.parseXULToFragment(this.xul);
		this.click = e => e.button || this.launch();
		this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
		ChromeUtils.registerProcessActor(this.name, {
			includeParent: true,
			child: {moduleURI: "chrome://user_chrome_files/content/custom_scripts/memreporter.jsm"}
		});
		(this.observe = async win => {
			this.timer.cancel();
			await new Promise(win.requestAnimationFrame);
			var clone = win.document.importNode(df, true);
			var hbox = clone.firstChild;
			win.document.getElementById("page-action-buttons").append(clone);
			hbox.onclick = this.click;
			hbox.style.cssText = this.css;
			hbox.firstChild.style.setProperty("margin", "0", "important");
			this.notify();
                        
		})(win);
	},
	async notify() {
		var bytes = 0, pids = [];
		for(var dp of ChromeUtils.getAllDOMProcesses()) try {
			let [pid, mem] = await dp.getActor(this.name).sendQuery("");
			pids.push(pid);
			bytes += mem;
                        
		} catch {}

		var {children} = await ChromeUtils.requestProcInfo();
		for(var child of children)
			if (!pids.includes(child.pid)) bytes += child.memory;

		this.timer.initWithCallback(this, this.delay, this.timer.TYPE_ONE_SHOT);

		var prev = this.val;
		if ((this.val = this.mgb(bytes)) != prev)
			for(var win of CustomizableUI.windows) {
				var lab = win.document.getElementById(id);
				if (lab) lab.value = this.val;
			}
          bytes > 950000000 && this.launch();
          
	},
        
	mgb: bytes => bytes < 1073741824
		? String(Math.round(bytes / 1048576))
		: (bytes / 1073741824).toFixed(2)
}).init("browser-delayed-startup-finished"))("ucf-mem-mix-indicator");

И в профиле иметь эту папку https://www.upload.ee/files/13618312/memory.rar.html
Вида х64 !

Отредактировано ВВП (08-11-2021 21:39:30)

Отсутствует

 

№1597208-11-2021 21:50:01

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 94.0

Re: Custom Buttons

ВВП
Спасибо. А по сравнению с соответствующей кнопкой на about:memory есть преимущество в плане очистки, в смысле больше освобождается памяти, или нет?

Отредактировано voqabuhe (08-11-2021 22:33:37)

Отсутствует

 

№1597309-11-2021 12:20:41

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 94.0

Re: Custom Buttons

voqabuhe
Так нажми на кнопки и сравни.
Для тех кто не продвинулся, типа, скрипты не подключаются ,кнопка...ДА, и профиль надо чистить поле рихтовки. startupCache - убрать !

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0412%u043B%u043B/%u0412%u044B%u043A%u043B%20CustomScripts%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACq0lEQVR42n2TW0hUQRjH/zPnshd3dU3OpruaQdJFQirQsMWISAjqISiMVHopiSgEoR6CXqKIeggSeygqHwozHzT0LUgI8vIQFkWhJKaQbd42V3fbc/bcprNnY3Vja+CcGb75vt/85883BP8YksBvLCW0hICS76Y2P68b4Vx55O/AYbfnyBVfSVuNw1Pt5Gk+mImkosXfJWMfbscWOvoVuScnQCBwtEulHefLKloQjwIrP7PxzjzA7UHn7EzPxdjSOdlkK1mAh1Lw6dmtlc2Y/AwwIx3s60vPDacATbGyBSAQRPfXLy8bY9Gj1o5uA0Iu58GhiqpBhKcB01g7dXjYnlgotCaZcwBeD+q/TTe90vVnNqDLH3jRWFhwjM3/yCSaNC2O6DoYz2fiVDVA/H70zs2OnEgodcRJiHciEJwqhy7punU6R62PB9/UDJxpsYu06l2gVMhAONGBsJJIbo+ubiMBntvyqbRk3KupQko8ISkLTBBNgzg6lgFkhtttwSgSmoqdS8shUmwBPgal8QLCbADMdB6TE3CPvM8CGF637Ttn/X/pGqoWlvcR63aet5ukyUqBL1YJswHENMFcLngGBu3CxKHaP9qtUpOBtxRMK7K8Zy66w3bqlt/7/JLkOxnXdJCUfDAwUUT+wGu7Lla/F+DXPMizTL2/GHlzISIfsAHlIq0ZKi8cLRCd1EgZaQHyb94DrdptF6hdnZC7H6flEwrF1FA3Ezk+oZp9mUZq8YntdzdLrRoj0JMKeMZltbhhXY8XBIjW+mo40nsnojSkHFvfrHyjT7hxLei7HHA6qaaZMFQts+nKc2BRVnA9vNL5KKq2WaHVnI+pTCD7T0vu1jqvo3aDrhVRjpAo46LDcXXsSSTxYEpl/f99jetGkYeiONV8cROL1jyXK+k3s3kAMT5aaccAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0Athis._handleClick%20%3D%28%29%3D%3E%20%7B%0A%20%20%20cbu.setPrefs%28s%2C%20cbu.getPrefs%28s%29%20%3D%3D%20true%20%3F%20false%20%3A%20true%29%3B%0A%7D%3B%0Avar%20s%20%3D%20%22extensions.user_chrome_files.custom_script%22%3B%0A%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20var%20val%20%3D%20cbu.getPrefs%28s%29%3B%0A%20%20%20var%20%7Bicon%7D%20%3D%20self%3B%0A%20%20%20icon.src%20%3D%20cbu.getPrefs%28s%29%20%3D%3D%20false%0A%20%20%20%3F%20self.image%0A%20%20%20%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAqNJREFUeNp8k09IFFEcx3/vzZudUVd3VsVsNUEhBOmUbBSh/blo1CEirGjzZh2kDaluHYSEbpFIghR18FBCHqJDFERIddMiqKBDkImr667urKszzsx7b3pv0TFraeDH+/f7fd73N7/fQ77vQ6lPC9fuChn1uwEh5JqLaaeQSZXyQ38DatqOnWw60T+gN8fjVDWquI8AOebaxuynz6nXoyMrX15NlAQgHNJaewZH6ruTfVlLB75eAAzbcE+rhCqNQvbt6MSvyVtXmGfn5T7Zcmg9P/SwrvtGIr1gAmY2ILH3IFFdPOubyANZy0HBJhA9OnDOR7ohMjslLqdYOhjN8eN1Ry4nMnPLgFwXfMaKFi3DReMbTnGNXQdscwUi8d6uipaOnkBBrKP3qmWJKbUD0cjncOZ+CqjYIGg7Z8o9CKk6RPZf6hcqnmJF1SsrGuOHvXULVGCgIQblCofEwUp4kYzBy2sxoC4LAKoAg2NBuKm9HYXCezApM+qARAzwXEBSOuXgOhTG35k7qiMh0lTggCgFNRTWFC3SQEAQmesBIoIs6UKuIgJcj/9T8zIsgqUYmScrTnzsWbm0Zy4sy78pFWypiGrbJdRF3tIwF1DGxSgUrWZsZuVSmDNvzfw+NaUgUgyWDnJkfyjwKQNFqtu8AAvf1R/vp31mzxXLmJ4Zv7uRnedYtM6WisELDQEg0Sn6gW4Gixy9fBaWZx7fE33Ag06s3ndxuKXrdlIcg+N4oGhkR/5SBVFVAKzB7Js7k9mPYz07AKKmJLL39FBTx/WbuhHD3PfEpTQAhNRycApLMPdh+FHu65MBEbda8jGp4YbO2razyarGA4coidZgQcYsbxbmp2ey356Nufmfz//7GoMDhGoQqagXU+zT9YzwWyzl91uAAQDUCFTmpTZ8qAAAAABJRU5ErkJggg%3D%3D%22%3B%20%0A%20%20%20self.tooltipText%20%3D%20val%20%3F%20%27%u0414%u0430%20CustomScripts%27%20%3A%20%27%u041D%u0435%u0442%20CustomScripts%27%3B%20%0A%20%20%20cbu.setPrefs%28%22extensions.user_chrome_files.custom_script_win%22%2C%20val%20%3F%20true%20%3A%20false%29%3B%0A%7D%3B%0Athis.oncontextmenu%20%3De%3D%3E%20%7B%20e.button%20%26%26%20%21e.ctrlKey%20%26%26%20e.preventDefault%28%29%20%7D%3B%0AtoggleImage%28%29%3B%0AServices.prefs.addObserver%28%20s%2C%20toggleImage%2C%20false%20%29%3B%0AaddDestructor%28function%28%29%20%7B%20gPrefService.removeObserver%28%20s%2C%20toggleImage%2C%20false%20%29%20%7D%29%3B%20%20%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отредактировано ВВП (09-11-2021 12:26:19)

Отсутствует

 

№1597409-11-2021 13:56:55

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 94.0

Re: Custom Buttons

Dumby
Я извиняюсь, нельзя еще в кодом memory поработать ? Task - чуть не ноль показывает на пустой вкладке, а на индикаторе 140-160 мгб , в 93 - 60мгб. Кажись графич.редактор не трогает очистка...Это расхождение в цифрах парит немного...

Отсутствует

 

№1597509-11-2021 17:53:52

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

Re: Custom Buttons

Dumby
Возможно ли сюда добавить кнопку: "отключения" 023ec6beebfet.jpg
P,S, как это реализовано у расширений: de90c91caa14t.jpg

Отредактировано kokoss (09-11-2021 20:47:13)


Win7

Отсутствует

 

Board footer

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