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

Пользователи не любят читать документацию. Станьте оригинальным, будьте не как все. Ознакомьтесь с нашей базой знаний.

№1530107-03-2021 20:41:45

beggrr
Участник
 
Группа: Members
Зарегистрирован: 04-02-2014
Сообщений: 118
UA: Firefox 85.0

Re: Custom Buttons

Как можно получить доступ к документу ифрейма, минуя кроссдоменные ограничения?
Раньше СВ делали это запросто. Но сейчас же они в контексте страницы не работают. Или есть какой способ?


Насчет прокси и Post Message я знаю, мне это не подходит, но может можно и через Custom Buttons?



И еще вопрос: как объявить функцию глобально, чтоб ее было видно из всех вкладок?
Раньше я делал эту функцию свойством кнопки. Она объявлялась один раз при инициализации кнопки и потом ее можно было вызывать в любой момент. А сейчас как?

Отредактировано beggrr (07-03-2021 21:01:35)

Отсутствует

 

№1530208-03-2021 04:56:16

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

Re: Custom Buttons

Dumby
Спасибо.

Отсутствует

 

№1530308-03-2021 21:20:18

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

Re: Custom Buttons

solombala пишет

Я столько перелопатил ,чтобы на мульти перейти. Теперь из-за этой кнопки все в топку... Если не вы, то кто?

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

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

Выделить код

Код:

(func => {
	var sysPlayerName = "GOM Player";
	var path = "D:\\gomplayer\\gom.exe";
	var videoMoved = "Видео перенесено в " + sysPlayerName;
	var noFound = "Не найдено видео на странице, доступное для переноса в " + sysPlayerName;

	this.image = "moz-icon://file://" + path;
	this.label = "Открыть видео в " + sysPlayerName;
	this.tooltipText = "Л: Видео в плеер\nП: Видео из Clipboard";

	this._handleClick = () => {
		var msgName = _id + ":Player";
		var listener = ({data}) => data ? play(data) : notify();
		messageManager.addMessageListener(msgName, listener);
		addDestructor(() => messageManager.removeMessageListener(msgName, listener));

		var url = "data:charset=utf-8," + encodeURIComponent(
			`(${func})()`.replace("MSG_NAME", msgName)
				.replace("VIDEO_MOVED", encodeURIComponent(videoMoved))
		);
		(this._handleClick = () => gBrowser.selectedBrowser.messageManager.loadFrameScript(url, false))();
	}
	this.onauxclick = e => e.button != 1 || gShowPopup(this);
	this.oncontextmenu = e => {
		if (e.ctrlKey || e.shiftKey || e.altKey) return;
		e.preventDefault();
		custombuttons.confirmBox(null, "Запустить плеер из буфера обмена ?", "Да", "Нет")
			&& run([gClipboard.read(), "/play"]);
	}
	var popup = document.getElementById("contentAreaContextMenu");
	addEventListener("popupshowing", {
		get hidden() {
			return !(gContextMenu.onLink || gContextMenu.onVideo || gContextMenu.onPlainTextLink);
		},
		handleEvent() {
			if (this.hidden) return;
			var menuitem = document.createXULElement("menuitem");
			for(var args of Object.entries({
				image: self.image,
				oncommand: "play()",
				class: "menuitem-iconic",
				label: "Открыть в " + sysPlayerName
			}))
				menuitem.setAttribute(...args);
			menuitem.play = () => play(gContextMenu.linkURL || gContextMenu.mediaURL);
			document.getElementById("context-savelink").before(menuitem);
			addDestructor(() => menuitem.remove());
			this.handleEvent = e => {
				if (e.target == popup) menuitem.hidden = this.hidden;
			}
		}
	}, false, popup || 1);

	var play = link => custombuttons.confirmBox(null, "Открыть  ссылку в плеере ?", "Да", "Отмена") && run([link]);
	var run = args => {
		var file = FileUtils.File(path);
		(run = args => {
			if (!file.exists()) return custombuttons.alertBox("File not exists!", path);
			var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
			process.init(file);
			process.runwAsync(args, args.length);
		})(args);
	}
	var notify = () => {
		var name = _id + "-noFound";
		var as = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
		(notify = () => setTimeout(as.closeAlert, 1150, name, as.showAlertNotification(
			"chrome://global/skin/icons/info.svg", "", noFound, false, "", null, name
		)))();
	}

})(() => {

	var sended, SEND = msg => sended = !sendAsyncMessage("MSG_NAME", msg);

	var videoMoved = decodeURIComponent("VIDEO_MOVED");

	var YoutubeID = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})(?:\W|$)/;

	var tmp = '',
	tmpp = '',
	innerA = '<div style="display:block!important;color:#00ff00!important;width:250px!important;font:bold 16px serif!important;z-index:999!important;opacity:1!important;visibility: visible!important;',
	innerB = 'left:5px!important;position:absolute!important;height:auto!important;box-sizing:border-box!important;padding:5px!important;margin:5px!important;',
	//stopPl = "javascript:(function(){v=document.getElementById('movie_player');if(v){v.stopVideo()}else{v=document.getElementsByTagName('video');if(v){v[0].src='';try{v[0].load()}catch(e){}};}})();",
	ytIMGouter = function (ytID) {
		return '<div width="100%"><br /><a target="_blank" href="https://www.youtube.com/watch?v=' + ytID + '"><img src="https://i.ytimg.com/vi/' + ytID + '/hqdefault.jpg"></a><br />' + innerA + 'background-color:black!important;position:relative!important;bottom:20px!important;">&nbsp;&nbsp;' + videoMoved + '</div><br /></div><br />'
	},
	handlWin = function (currentWin) {
		tmp = '';
		var elem = currentWin.document.getElementsByTagName('video'),
		currLoc = currentWin.location;
		if (elem.length > 0) {
			if (currLoc.hostname.indexOf('youtu') != -1 && (tmp = currLoc.toString().match(YoutubeID)) && tmp[1].length == 11) {

				SEND('https://www.youtube.com/watch?v=' + tmp[1]);

				videoMovedbox = currentWin.document.createElement('videoMoved');
				videoMovedbox.innerHTML = innerA + innerB + 'top:-15px!important;"><b>' + videoMoved + '</b></div>';

				//loadURI(stopPl);
				(function(d){var v=d.getElementById('movie_player');if(v){try{v.stopVideo()}catch{}}
					else{v=d.getElementsByTagName('video');if(v[0]){v[0].src='';try{v[0].load()}catch{}};}})(currentWin.document);

				currentWin.document.getElementById('eow-title').appendChild(videoMovedbox);
				return true;
			};
			for (i = 0; i < elem.length; i++) {
				if (((tmp = getSrc(elem[i].parentNode, currLoc)) && tmp.length > 2) || (i == 0 && currentWin.document.body.innerHTML.substring(0, 7) == '<video ' && (tmp = currLoc.toString()))) {
					videoMovedbox = currentWin.document.createElement('videoMoved');
					videoMovedbox.innerHTML = innerA + innerB + 'top:20px!important;background-color:black!important;">' + videoMoved + '</div>';

					SEND(tmp);

					if (currLoc.hostname == 'www.youtube.com') {
						elem[i].parentNode.parentNode.appendChild(videoMovedbox);
					} else {
						elem[i].parentNode.appendChild(videoMovedbox);
					};
					elem[i].src = '';
					try {
						elem[i].load()
					} catch (e) {};
					return true;
				}
			}
		};

		currentWin._elems = currentWin.document.getElementsByTagName('iframe');
		if (currentWin._elems.length > 0) {
			for (currentWin._iCounter = 0; currentWin._iCounter < currentWin._elems.length; currentWin._iCounter++) {
				if ((currentWin._elems[currentWin._iCounter].src.indexOf('youtube.com') > -1) && (tmp = currentWin._elems[currentWin._iCounter].src.match(YoutubeID)) && (tmp[1].length == 11)) {

				SEND('https://www.youtube.com/watch?v=' + tmp[1]);

				currentWin._elems[currentWin._iCounter].outerHTML = ytIMGouter(tmp[1]);
					return true;
				};
				if (currentWin._elems[currentWin._iCounter].clientWidth > 80 && currentWin._elems[currentWin._iCounter].clientHeight > 40 && handlWin(currentWin._elems[currentWin._iCounter].contentWindow))
					return true;
			}
		};

		elem = currentWin.document.getElementsByTagName('object');
		currLoc = currentWin.location;
		if (elem.length == 0) {
			elem = currentWin.document.getElementsByTagName('embed')
		};
		if (elem.length > 0) {
			for (i = 0; i < elem.length; i++) {
				if (elem[i].innerHTML.indexOf('youtu') != -1 && (tmp = elem[i].innerHTML.match(YoutubeID)) && tmp[1].length == 11) {

					SEND('https://www.youtube.com/watch?v=' + tmp[1]);

					elem[i].outerHTML = ytIMGouter(tmp[1]);
					return true;
				} else {
					if (elem[i].clientWidth > 80 && elem[i].clientHeight > 40) {
						if (((tmp = getSrc(elem[i].parentNode, currLoc)) || (tmp = getLink(elem[i], currLoc))) && tmp.length > 2) {

							SEND(tmp);

							elem[i].outerHTML = innerA + 'background-color:black!important;bottom:20px!important;">&nbsp;&nbsp;' + videoMoved + '</div>';
							return true;
						};
					};
				}
			};
		};
		return false;
	};

	function restProtHost(lnkR, curLoc) {
		if (lnkR.length == 0)
			return '';
		let tr = lnkR.replace(/^:\/\//, curLoc.protocol + "//");
		if (!tr.match(/^https?:\/\//i)) {
			lnkR = tr.replace(/^\/+/, '');
			if (lnkR.split('/')[0].split('?')[0].split('#')[0].toLowerCase().match(/^(?:[-a-z\d]+\.)+[a-z\d]{2,6}$/)) {
				tr = curLoc.protocol + '//' + lnkR;
			} else {
				tr = curLoc.protocol + '//' + curLoc.host + "/" + lnkR;
			}
		};
		return tr;
	};

	function getSrc(vobj, currentLoc) {
		var t = '',
		tt = '';
		if ((((t = vobj.innerHTML.match(/<video.*?\ssrc=(?:(?:'([^']*)')|(?:"([^"]*)")|([^\s]*))/i)) && (t) && (tt = t[1] || t[2] || t[3]) && tt.indexOf('blob:') == -1) || ((t = vobj.innerHTML.match(/<source.*?\ssrc=(?:(?:'([^']*)')|(?:"([^"]*)")|([^\s]*)).*?\stype=['"]?video\//i)) && (t) && (tt = t[1] || t[2] || t[3]))) && tt.length > 2 && tt.indexOf('blob:') == -1) {
			if (tt.indexOf(".mp4/?") == -1) {
				tt = tt.replace(/&amp;/g, "&")
			};
			t = restProtHost(tt, currentLoc);
			return t;
		};
		return '';
	};

	function getLink(obj, curLocation) {

		if (!obj || !obj.tagName)
			return '';
		q = obj.tagName.toLowerCase();

		var getParam = function (e, n) {
			var v = '',
			r = new RegExp('^(' + n + ')$', 'i'),
			param = e.getElementsByTagName('param');
			for (var igp = 0, p; p = param[igp]; igp++) {
				if (p.hasAttribute('name') && p.getAttribute('name').match(r)) {
					v = p.getAttribute('value');
					break
				};
			};
			return v;
		};

		var restPath = function (f, s) {
			return (f.substring(0, 4) == 'http') ? f : s.replace(/[#?].*$/, '').replace(/[^\/]*$/, f)
		};

		function videoLinkExtract(fl) {
			alert(fl);
			var linkArr = [],
			outLinks = [],
			jj = 0,
			lba = '',
			lbb = '',
			decodeURL = gBrowser.currentURI.spec; {
				try {
					return decodeURIComponent(s)
				} catch (e) {
					return unescape(s)
				}
			};

			for (var ij = 0; ij < 3; ij++) {
				lba = lba + String.fromCharCode(parseInt((Math.random() * 15 + 1) + '', 10));
				lbb = lbb + String.fromCharCode(parseInt((Math.random() * 15 + 16) + '', 10));
			};

			function pushWithMerit(lnk) {

				var merit = -11;
				if (lnk.match(/^https?:\/\//i))
					merit = merit + 40;
				if (outLinks.length == 0)
					merit = merit + 1;
				if (lnk.match(/^\//))
					merit = merit + 7;
				if (lnk.match(/^\/\//))
					merit = merit + 30;
				if (lnk.match(/240p([^a-z]|$)/i))
					merit = merit + 1;
				if (lnk.match(/[^a-z]240([^a-z0-9]|$)/i))
					merit = merit + 1;
				if (lnk.match(/360p([^a-z]|$)/i))
					merit = merit + 3;
				if (lnk.match(/[^a-z]360([^a-z0-9]|$)/i))
					merit = merit + 3;
				if (lnk.match(/480p([^a-z]|$)/i))
					merit = merit + 5;
				if (lnk.match(/[^a-z]480([^a-z0-9]|$)/i))
					merit = merit + 5;
				if (lnk.match(/720p([^a-z]|$)/i))
					merit = merit + 7;
				if (lnk.match(/[^a-z]720([^a-z0-9]|$)/i))
					merit = merit + 7;
				if (lnk.match(/\.mp4([^a-z]|$)/i))
					merit = merit + 8;
				if (lnk.match(/_hd([^a-z]|$)/i))
					merit = merit + 6;
				if (lnk.match(/\.(jpg|xml)([^a-z]|$)/i))
					merit = merit - 40;
				if (merit > 0)
					outLinks.push(merit + lba + lnk);
				Services.console.logStringMessage('merit:' + merit + ' lnk->' + lnk);
			};

			linkArr.push(fl);
			while (linkArr.length > jj && jj < 30) {

				var testPaths = [];
				testPaths = linkArr[jj].split(/(\.(?:flv|mp4|m3u8))/i);
				if (testPaths[testPaths.length - 1] == '')
					testPaths.pop();

				for (k = 1; k < testPaths.length; k = k + 2) {

					if (testPaths[k - 1].indexOf(lba) > -1) {
						pref = testPaths[k - 1];
					} else {
						var testAboutDom = testPaths[k - 1].toLowerCase().split(/(https?:\/\/)/);
						if (testAboutDom[testAboutDom.length - 1] == '')
							testAboutDom.pop();
						var pTest = testAboutDom[testAboutDom.length - 1].split(/(\?[^\?]*?&)/);
						if (pTest.length > 2) {
							pTest.pop();
							pTest.pop();
						};
						testAboutDom[testAboutDom.length - 1] = pTest.join('');
						pref = testPaths[k - 1].substring(testAboutDom.join('').lastIndexOf("&") + 1);
					};

					t2 = pref.lastIndexOf(lbb);
					if (t2 > -1) {
						pref = pref.substring(t2 + 3);
					} else {

						t2 = pref.lastIndexOf('{"');
						if (t2 > -1)
							pref = pref.substring(t2 + 2);
						t2 = pref.lastIndexOf('["');
						if (t2 > -1)
							pref = pref.substring(t2 + 2);
						t2 = pref.lastIndexOf(',"');
						if (t2 > -1)
							pref = pref.substring(t2 + 2);
						t2 = pref.toLowerCase().lastIndexOf('"http://');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf('"https://');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf(',http://');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf(',https://');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf(';http');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf('*https://');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf(' or ');
						if (t2 > -1)
							pref = pref.substring(t2 + 4);

						pref = pref.substring(pref.split('/')[0].toLowerCase().split('%2f')[0].lastIndexOf('=') + 1);

					}

					if (pref.length > 0) {

						if (pref.split('?')[0].toLowerCase().match(/%[2-3][0-9a-f]/)) {

							t2 = pref.indexOf('"')
								if (t2 > -1)
									pref = pref.substring(t2 + 1);
								suff = testPaths[k + 1] ? testPaths[k + 1].split('&')[0].split('"')[0].split(';')[0].split(/,http/i)[0] : '';
							if ((suff != testPaths[k + 1]) || (testPaths.length < k + 3)) {
								if (testPaths.length > k + 1) {
									testPaths[k + 1] = ((pref == testPaths[k - 1]) ? '' : '&') + testPaths[k + 1].substr(suff.length)
								};
								t2 = pref.lastIndexOf(lba);
								if (t2 > -1)
									pref = pref.substring(t2 + 3)
										linkArr.push(decodeURL(pref + testPaths[k] + suff));

							} else {
								testPaths[k + 1] = (pref == testPaths[k - 1] ? '' : lbb) + pref + testPaths[k] + suff
							}
						} else {
							suff = testPaths[k + 1] ? testPaths[k + 1].split(';')[0].split('"]')[0].split('"}')[0].split('",')[0].split(/,https?:\/\//i)[0].split('*https://')[0].split(' or ')[0] : '';
							t2 = suff.indexOf('&');
							if ((t2 > -1) && (pref != testPaths[k - 1])) {
								if (t2 == 0)
									suff = '';
								if (suff.charAt(0) != '?')
									suff = suff.split(/(&[^&]+=https?:\/\/)/i)[0];
							};
							if ((suff != testPaths[k + 1]) || (testPaths.length < k + 3)) {
								if (testPaths.length > k + 1) {
									testPaths[k + 1] = ((pref == testPaths[k - 1]) ? '' : '&') + testPaths[k + 1].substr(suff.length)
								};
								t2 = pref.lastIndexOf(lba);
								if (t2 > -1)
									pref = pref.substring(t2 + 3);
								pushWithMerit(pref + testPaths[k] + suff);

							} else {
								testPaths[k + 1] = lba + (pref == testPaths[k - 1] ? '' : lbb) + pref + testPaths[k] + suff
							}
						}
					}
				};
				jj = jj + 1;
			};

			if (outLinks.length == 0)
				return '';
			function srt(a, b) {
				a = parseInt(a.substr(0, a.indexOf(lba)), 10);
				b = parseInt(b.substr(0, b.indexOf(lba)), 10);
				if (a < b)
					return 1;
				if (a > b)
					return -1;
				return 0
			};
			outLinks.sort(srt);
			outLinks[0] = outLinks[0].substr(outLinks[0].indexOf(lba) + 3)
				if (outLinks[0].indexOf('_hq.mp4/?time=') > 0)
					outLinks[0] = outLinks[0].replace(/&/g, '&amp;');
				return outLinks[0];
		};

		if (!ol)
			return '';
		//ol = ol.replace(/^:?\/\//, curLocation.protocol + "//");
		//return restPath(ol, src);
		return restProtHost(ol, curLocation);
	};

	try {handlWin(content);} finally {sended || SEND();}
});

beggrr пишет

Как можно получить доступ к документу ифрейма, минуя кроссдоменные ограничения?
Раньше СВ делали это запросто. Но сейчас же они в контексте страницы не работают. Или есть какой способ?

Из frame script'а доступ есть. Но не в Fission.
Отправить frame script из CB вполне возможно.

И еще вопрос: как объявить функцию глобально, чтоб ее было видно из всех вкладок?
Раньше я делал эту функцию свойством кнопки. Она объявлялась один раз при инициализации кнопки и потом ее можно было вызывать в любой момент. А сейчас как?

Сейчас точно так же, ничего не изменилось.
Да набрать проверочный код проще и быстрее, чем этот вопрос.

Отсутствует

 

№1530408-03-2021 22:33:49

Dragoljub
Забанен
 
Группа: Members
Зарегистрирован: 08-03-2021
Сообщений: 2
UA: Firefox 86.0

Re: Custom Buttons

Dumby

Dumby пишет

А будет ли работать — без понятия.

Велико хвала! Ти je хероj .

Отсутствует

 

№1530509-03-2021 00:22:12

beggrr
Участник
 
Группа: Members
Зарегистрирован: 04-02-2014
Сообщений: 118
UA: Firefox 85.0

Re: Custom Buttons

Dumby пишет

И еще вопрос: как объявить функцию глобально, чтоб ее было видно из всех вкладок?
    Раньше я делал эту функцию свойством кнопки. Она объявлялась один раз при инициализации кнопки и потом ее можно было вызывать в любой момент. А сейчас как?

Сейчас точно так же, ничего не изменилось.
Да набрать проверочный код проще и быстрее, чем этот вопрос.

Хм... Назначить кнопке свойство в виде функции легко. Но как потом эту функцию вызывать из контента страницы?
Раньше это было действительно просто: document.getElementById(button.id).myFunction()

Но сейчас для обычного скрипта на странице document - это сам контент страницы. А как этот скрипт может обратиться к кнопке и ее свойствам?

Из frame script'а доступ есть. Но не в Fission.
Отправить frame script из CB вполне возможно.

Можно приблизительный набросок как это сделать?

Отредактировано beggrr (09-03-2021 00:22:46)

Отсутствует

 

№1530609-03-2021 10:43:50

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

Re: Custom Buttons

beggrr пишет

Хм... Назначить кнопке свойство в виде функции легко. Но как потом эту функцию вызывать из контента страницы?
Раньше это было действительно просто: document.getElementById(button.id).myFunction()
Но сейчас для обычного скрипта на странице document - это сам контент страницы.

Не могло такого быть.
Для «обычного скрипта на странице» document всегда был документом страницы.
Если бы у «обычного скрипта на странице» был доступ к документу окна браузера,
то он мог бы вытворять что угодно, типа "стереть диск Цэ" и всё такое.

А как этот скрипт может обратиться к кнопке и ее свойствам?

Если говорить о немногопроцессном Firefox, то что за странные идеи.
Залезть на страницу, чтобы потом смотреть оттуда "изнутри вверх".


Нет, ну можно создать функцию, зарегистрировать обсёрвер или листенер,
и запихивать её в контентские окна с помощью Cu.exportFunction(),
а затем вызывать «из контента страницы».


Не слишком то удобно, плюс, наверно, для «скрипта на странице»
будет бесполезным возвращаемое значение, разве что примитив.
Куда логичнее классический взгляд "снаружи вниз",
то есть просто делаешь с контентом что надо сразу из хромского кода.


А если говорить о многопроцессном Firefox, то нет и предмета разговора.
Веб-страница находится в другом процессе,
а обратиться (к чему-либо вообще) можно только в пределах процесса.

Можно приблизительный набросок как это сделать?

Можно. Запускай.
(затем можно код из переменной code запустить с веб консоли, чтобы полюбоваться на ошибку)

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

Выделить код

Код:

var code = `
	(win => {
		try {
			win.alert(win.frames[0].document.links);
			// [object HTMLCollection]
		}
		catch(ex) {
			win.alert(ex);
			// SecurityError: Permission denied to access property "document" on cross-origin object
		}
	})(this.window || content);
`;
var url = "data:," + encodeURIComponent(code);
gBrowser.selectedBrowser.messageManager.loadFrameScript(url, false);

Отсутствует

 

№1530709-03-2021 22:07:25

beggrr
Участник
 
Группа: Members
Зарегистрирован: 04-02-2014
Сообщений: 118
UA: Firefox 85.0

Re: Custom Buttons

Dumby
Спасибо за код для фреймов.


Dumby пишет

А если говорить о многопроцессном Firefox, то нет и предмета разговора.
Веб-страница находится в другом процессе,
а обратиться (к чему-либо вообще) можно только в пределах процесса.

Ну вот то то и оно...  Я думал, может можно как то это обойти. Получается никак нельзя.

А есть в многопроцессном  режиме вообще возможность сделать одну глобальную функцию для всех вкладок, чтобы ее можно было вызывать именно из страницы, не из кнопки? Объявляется она один раз скажем при запуске браузера, а дальше ее вызывают когда нужно и на любой странице.

Отсутствует

 

№1530810-03-2021 10:39:16

Dragoljub
Забанен
 
Группа: Members
Зарегистрирован: 08-03-2021
Сообщений: 2
UA: Firefox 86.0

Re: Custom Buttons

Dumby
Есть одна проблема. Начиная с 78 ,ютуб в текущей вкладке запускается сходу...media.autoplay.default - не помогает.Где поганка зарыта? Рихтовал BrowserGlue.jsm ,как в 77(там все норм)...
где-то в tab зарыто?
И еще, боюсь лезть в кнопку видео в плеер , но при отмене эта надпись остается , лучше бы она и не появлялась , вернее функция бы не срабатывала(видео перенесено в...), ну, пока плеер не запустился....
zf49akuu.jpg
Может при "отмена" пусть вкладка перезапустится ? Сделал reload , так себе фишка...

Отредактировано Dragoljub (10-03-2021 15:12:10)

Отсутствует

 

№1530910-03-2021 19:24:18

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

Re: Custom Buttons

Dumby
А как бы ещё Увеличить изображение подключить в UCF?

Отсутствует

 

№1531011-03-2021 16:47:02

fiask0
Участник
 
Группа: Members
Зарегистрирован: 11-03-2021
Сообщений: 4
UA: Chrome 89.0

Re: Custom Buttons

Всем привет,
у меня вопрос по самодельным кнопкам у которых есть действие по нажатию ПКМ.
Почему нет эффекта нажатия, как это происходит по ЛКМ?
Можно ли его получить и по нажатию ПКМ?

Отсутствует

 

№1531111-03-2021 21:05:46

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

Re: Custom Buttons

beggrr пишет

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

Нет, нельзя. Можно только максимум на процесс.

чтобы ее можно было вызывать именно из страницы, не из кнопки? Объявляется она один раз скажем при запуске браузера, а дальше ее вызывают когда нужно и на любой странице.

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


Dragoljub пишет

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

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

Выделить код

Код:

(func => {
	var sysPlayerName = "GOM Player";
	var path = "D:\\gomplayer\\gom.exe";
	var videoMoved = "Видео перенесено в " + sysPlayerName;
	var noFound = "Не найдено видео на странице, доступное для переноса в " + sysPlayerName;

	this.image = "moz-icon://file://" + path;
	this.label = "Открыть видео в " + sysPlayerName;
	this.tooltipText = "Л: Видео в плеер\nП: Видео из Clipboard";

	this._handleClick = () => {
		var msgName = _id + ":Player";
		var listener = ({data}) => data ? run([data]) : notify();
		messageManager.addMessageListener(msgName, listener);
		addDestructor(() => messageManager.removeMessageListener(msgName, listener));

		var url = "data:charset=utf-8," + encodeURIComponent(
			`(${func})()`.replace("MSG_NAME", msgName)
				.replace("VIDEO_MOVED", encodeURIComponent(videoMoved))
				.replace("CONFIRM", encodeURIComponent("Открыть ссылку в плеере ?"))
		);
		(this._handleClick = () => gBrowser.selectedBrowser.messageManager.loadFrameScript(url, false))();
	}
	this.onauxclick = e => e.button != 1 || gShowPopup(this);
	this.oncontextmenu = e => {
		if (e.ctrlKey || e.shiftKey || e.altKey) return;
		e.preventDefault();
		custombuttons.confirmBox(null, "Запустить плеер из буфера обмена ?", "Да", "Нет")
			&& run([gClipboard.read(), "/play"]);
	}
	var popup = document.getElementById("contentAreaContextMenu");
	addEventListener("popupshowing", {
		get hidden() {
			return !(gContextMenu.onLink || gContextMenu.onVideo || gContextMenu.onPlainTextLink);
		},
		handleEvent() {
			if (this.hidden) return;
			var menuitem = document.createXULElement("menuitem");
			for(var args of Object.entries({
				image: self.image,
				oncommand: "play()",
				class: "menuitem-iconic",
				label: "Открыть в " + sysPlayerName
			}))
				menuitem.setAttribute(...args);
			menuitem.play = () => play(gContextMenu.linkURL || gContextMenu.mediaURL);
			document.getElementById("context-savelink").before(menuitem);
			addDestructor(() => menuitem.remove());
			this.handleEvent = e => {
				if (e.target == popup) menuitem.hidden = this.hidden;
			}
		}
	}, false, popup || 1);

	var play = link => custombuttons.confirmBox(null, "Открыть ссылку в плеере ?", "Да", "Отмена") && run([link]);
	var run = args => {
		var file = FileUtils.File(path);
		(run = args => {
			if (!file.exists()) return custombuttons.alertBox("File not exists!", path);
			var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
			process.init(file);
			process.runwAsync(args, args.length);
		})(args);
	}
	var notify = () => {
		var name = _id + "-noFound";
		var as = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
		(notify = () => setTimeout(as.closeAlert, 1150, name, as.showAlertNotification(
			"chrome://global/skin/icons/info.svg", "", noFound, false, "", null, name
		)))();
	}

})(() => {

	var found, videoMoved, SEND = msg => {
		found = true;
		if (!msg || Cc["@mozilla.org/embedcomp/prompt-service;1"]
			.getService(Ci.nsIPromptService)
			.confirm(content, null, decodeURIComponent("CONFIRM"))
		) {
			if (msg) videoMoved = decodeURIComponent("VIDEO_MOVED");
			sendAsyncMessage("MSG_NAME", msg);
		}
		else return true;
	}

	var YoutubeID = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})(?:\W|$)/;

	var tmp = '',
	tmpp = '',
	innerA = '<div style="display:block!important;color:#00ff00!important;width:250px!important;font:bold 16px serif!important;z-index:999!important;opacity:1!important;visibility: visible!important;',
	innerB = 'left:5px!important;position:absolute!important;height:auto!important;box-sizing:border-box!important;padding:5px!important;margin:5px!important;',
	//stopPl = "javascript:(function(){v=document.getElementById('movie_player');if(v){v.stopVideo()}else{v=document.getElementsByTagName('video');if(v){v[0].src='';try{v[0].load()}catch(e){}};}})();",
	ytIMGouter = function (ytID) {
		return '<div width="100%"><br /><a target="_blank" href="https://www.youtube.com/watch?v=' + ytID + '"><img src="https://i.ytimg.com/vi/' + ytID + '/hqdefault.jpg"></a><br />' + innerA + 'background-color:black!important;position:relative!important;bottom:20px!important;">&nbsp;&nbsp;' + videoMoved + '</div><br /></div><br />'
	},
	handlWin = function (currentWin) {
		tmp = '';
		var elem = currentWin.document.getElementsByTagName('video'),
		currLoc = currentWin.location;
		if (elem.length > 0) {
			if (currLoc.hostname.indexOf('youtu') != -1 && (tmp = currLoc.toString().match(YoutubeID)) && tmp[1].length == 11) {

				if (SEND('https://www.youtube.com/watch?v=' + tmp[1])) return;

				videoMovedbox = currentWin.document.createElement('videoMoved');
				videoMovedbox.innerHTML = innerA + innerB + 'top:-15px!important;"><b>' + videoMoved + '</b></div>';

				//loadURI(stopPl);
				(function(d){var v=d.getElementById('movie_player');if(v){try{v.stopVideo()}catch{}}
					else{v=d.getElementsByTagName('video');if(v[0]){v[0].src='';try{v[0].load()}catch{}};}})(currentWin.document);

				currentWin.document.getElementById('eow-title').appendChild(videoMovedbox);
				return true;
			};
			for (i = 0; i < elem.length; i++) {
				if (((tmp = getSrc(elem[i].parentNode, currLoc)) && tmp.length > 2) || (i == 0 && currentWin.document.body.innerHTML.substring(0, 7) == '<video ' && (tmp = currLoc.toString()))) {

					if (SEND(tmp)) return;

					videoMovedbox = currentWin.document.createElement('videoMoved');
					videoMovedbox.innerHTML = innerA + innerB + 'top:20px!important;background-color:black!important;">' + videoMoved + '</div>';

					if (currLoc.hostname == 'www.youtube.com') {
						elem[i].parentNode.parentNode.appendChild(videoMovedbox);
					} else {
						elem[i].parentNode.appendChild(videoMovedbox);
					};
					elem[i].src = '';
					try {
						elem[i].load()
					} catch (e) {};
					return true;
				}
			}
		};

		currentWin._elems = currentWin.document.getElementsByTagName('iframe');
		if (currentWin._elems.length > 0) {
			for (currentWin._iCounter = 0; currentWin._iCounter < currentWin._elems.length; currentWin._iCounter++) {
				if ((currentWin._elems[currentWin._iCounter].src.indexOf('youtube.com') > -1) && (tmp = currentWin._elems[currentWin._iCounter].src.match(YoutubeID)) && (tmp[1].length == 11)) {

				if (SEND('https://www.youtube.com/watch?v=' + tmp[1])) return;

				currentWin._elems[currentWin._iCounter].outerHTML = ytIMGouter(tmp[1]);
					return true;
				};
				if (currentWin._elems[currentWin._iCounter].clientWidth > 80 && currentWin._elems[currentWin._iCounter].clientHeight > 40 && handlWin(currentWin._elems[currentWin._iCounter].contentWindow))
					return true;
			}
		};

		elem = currentWin.document.getElementsByTagName('object');
		currLoc = currentWin.location;
		if (elem.length == 0) {
			elem = currentWin.document.getElementsByTagName('embed')
		};
		if (elem.length > 0) {
			for (i = 0; i < elem.length; i++) {
				if (elem[i].innerHTML.indexOf('youtu') != -1 && (tmp = elem[i].innerHTML.match(YoutubeID)) && tmp[1].length == 11) {

					if (SEND('https://www.youtube.com/watch?v=' + tmp[1])) return;

					elem[i].outerHTML = ytIMGouter(tmp[1]);
					return true;
				} else {
					if (elem[i].clientWidth > 80 && elem[i].clientHeight > 40) {
						if (((tmp = getSrc(elem[i].parentNode, currLoc)) || (tmp = getLink(elem[i], currLoc))) && tmp.length > 2) {

							if (SEND(tmp)) return;

							elem[i].outerHTML = innerA + 'background-color:black!important;bottom:20px!important;">&nbsp;&nbsp;' + videoMoved + '</div>';
							return true;
						};
					};
				}
			};
		};
		return false;
	};

	function restProtHost(lnkR, curLoc) {
		if (lnkR.length == 0)
			return '';
		let tr = lnkR.replace(/^:\/\//, curLoc.protocol + "//");
		if (!tr.match(/^https?:\/\//i)) {
			lnkR = tr.replace(/^\/+/, '');
			if (lnkR.split('/')[0].split('?')[0].split('#')[0].toLowerCase().match(/^(?:[-a-z\d]+\.)+[a-z\d]{2,6}$/)) {
				tr = curLoc.protocol + '//' + lnkR;
			} else {
				tr = curLoc.protocol + '//' + curLoc.host + "/" + lnkR;
			}
		};
		return tr;
	};

	function getSrc(vobj, currentLoc) {
		var t = '',
		tt = '';
		if ((((t = vobj.innerHTML.match(/<video.*?\ssrc=(?:(?:'([^']*)')|(?:"([^"]*)")|([^\s]*))/i)) && (t) && (tt = t[1] || t[2] || t[3]) && tt.indexOf('blob:') == -1) || ((t = vobj.innerHTML.match(/<source.*?\ssrc=(?:(?:'([^']*)')|(?:"([^"]*)")|([^\s]*)).*?\stype=['"]?video\//i)) && (t) && (tt = t[1] || t[2] || t[3]))) && tt.length > 2 && tt.indexOf('blob:') == -1) {
			if (tt.indexOf(".mp4/?") == -1) {
				tt = tt.replace(/&amp;/g, "&")
			};
			t = restProtHost(tt, currentLoc);
			return t;
		};
		return '';
	};

	function getLink(obj, curLocation) {

		if (!obj || !obj.tagName)
			return '';
		q = obj.tagName.toLowerCase();

		var getParam = function (e, n) {
			var v = '',
			r = new RegExp('^(' + n + ')$', 'i'),
			param = e.getElementsByTagName('param');
			for (var igp = 0, p; p = param[igp]; igp++) {
				if (p.hasAttribute('name') && p.getAttribute('name').match(r)) {
					v = p.getAttribute('value');
					break
				};
			};
			return v;
		};

		var restPath = function (f, s) {
			return (f.substring(0, 4) == 'http') ? f : s.replace(/[#?].*$/, '').replace(/[^\/]*$/, f)
		};

		function videoLinkExtract(fl) {
			alert(fl);
			var linkArr = [],
			outLinks = [],
			jj = 0,
			lba = '',
			lbb = '',
			decodeURL = gBrowser.currentURI.spec; {
				try {
					return decodeURIComponent(s)
				} catch (e) {
					return unescape(s)
				}
			};

			for (var ij = 0; ij < 3; ij++) {
				lba = lba + String.fromCharCode(parseInt((Math.random() * 15 + 1) + '', 10));
				lbb = lbb + String.fromCharCode(parseInt((Math.random() * 15 + 16) + '', 10));
			};

			function pushWithMerit(lnk) {

				var merit = -11;
				if (lnk.match(/^https?:\/\//i))
					merit = merit + 40;
				if (outLinks.length == 0)
					merit = merit + 1;
				if (lnk.match(/^\//))
					merit = merit + 7;
				if (lnk.match(/^\/\//))
					merit = merit + 30;
				if (lnk.match(/240p([^a-z]|$)/i))
					merit = merit + 1;
				if (lnk.match(/[^a-z]240([^a-z0-9]|$)/i))
					merit = merit + 1;
				if (lnk.match(/360p([^a-z]|$)/i))
					merit = merit + 3;
				if (lnk.match(/[^a-z]360([^a-z0-9]|$)/i))
					merit = merit + 3;
				if (lnk.match(/480p([^a-z]|$)/i))
					merit = merit + 5;
				if (lnk.match(/[^a-z]480([^a-z0-9]|$)/i))
					merit = merit + 5;
				if (lnk.match(/720p([^a-z]|$)/i))
					merit = merit + 7;
				if (lnk.match(/[^a-z]720([^a-z0-9]|$)/i))
					merit = merit + 7;
				if (lnk.match(/\.mp4([^a-z]|$)/i))
					merit = merit + 8;
				if (lnk.match(/_hd([^a-z]|$)/i))
					merit = merit + 6;
				if (lnk.match(/\.(jpg|xml)([^a-z]|$)/i))
					merit = merit - 40;
				if (merit > 0)
					outLinks.push(merit + lba + lnk);
				Services.console.logStringMessage('merit:' + merit + ' lnk->' + lnk);
			};

			linkArr.push(fl);
			while (linkArr.length > jj && jj < 30) {

				var testPaths = [];
				testPaths = linkArr[jj].split(/(\.(?:flv|mp4|m3u8))/i);
				if (testPaths[testPaths.length - 1] == '')
					testPaths.pop();

				for (k = 1; k < testPaths.length; k = k + 2) {

					if (testPaths[k - 1].indexOf(lba) > -1) {
						pref = testPaths[k - 1];
					} else {
						var testAboutDom = testPaths[k - 1].toLowerCase().split(/(https?:\/\/)/);
						if (testAboutDom[testAboutDom.length - 1] == '')
							testAboutDom.pop();
						var pTest = testAboutDom[testAboutDom.length - 1].split(/(\?[^\?]*?&)/);
						if (pTest.length > 2) {
							pTest.pop();
							pTest.pop();
						};
						testAboutDom[testAboutDom.length - 1] = pTest.join('');
						pref = testPaths[k - 1].substring(testAboutDom.join('').lastIndexOf("&") + 1);
					};

					t2 = pref.lastIndexOf(lbb);
					if (t2 > -1) {
						pref = pref.substring(t2 + 3);
					} else {

						t2 = pref.lastIndexOf('{"');
						if (t2 > -1)
							pref = pref.substring(t2 + 2);
						t2 = pref.lastIndexOf('["');
						if (t2 > -1)
							pref = pref.substring(t2 + 2);
						t2 = pref.lastIndexOf(',"');
						if (t2 > -1)
							pref = pref.substring(t2 + 2);
						t2 = pref.toLowerCase().lastIndexOf('"http://');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf('"https://');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf(',http://');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf(',https://');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf(';http');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf('*https://');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf(' or ');
						if (t2 > -1)
							pref = pref.substring(t2 + 4);

						pref = pref.substring(pref.split('/')[0].toLowerCase().split('%2f')[0].lastIndexOf('=') + 1);

					}

					if (pref.length > 0) {

						if (pref.split('?')[0].toLowerCase().match(/%[2-3][0-9a-f]/)) {

							t2 = pref.indexOf('"')
								if (t2 > -1)
									pref = pref.substring(t2 + 1);
								suff = testPaths[k + 1] ? testPaths[k + 1].split('&')[0].split('"')[0].split(';')[0].split(/,http/i)[0] : '';
							if ((suff != testPaths[k + 1]) || (testPaths.length < k + 3)) {
								if (testPaths.length > k + 1) {
									testPaths[k + 1] = ((pref == testPaths[k - 1]) ? '' : '&') + testPaths[k + 1].substr(suff.length)
								};
								t2 = pref.lastIndexOf(lba);
								if (t2 > -1)
									pref = pref.substring(t2 + 3)
										linkArr.push(decodeURL(pref + testPaths[k] + suff));

							} else {
								testPaths[k + 1] = (pref == testPaths[k - 1] ? '' : lbb) + pref + testPaths[k] + suff
							}
						} else {
							suff = testPaths[k + 1] ? testPaths[k + 1].split(';')[0].split('"]')[0].split('"}')[0].split('",')[0].split(/,https?:\/\//i)[0].split('*https://')[0].split(' or ')[0] : '';
							t2 = suff.indexOf('&');
							if ((t2 > -1) && (pref != testPaths[k - 1])) {
								if (t2 == 0)
									suff = '';
								if (suff.charAt(0) != '?')
									suff = suff.split(/(&[^&]+=https?:\/\/)/i)[0];
							};
							if ((suff != testPaths[k + 1]) || (testPaths.length < k + 3)) {
								if (testPaths.length > k + 1) {
									testPaths[k + 1] = ((pref == testPaths[k - 1]) ? '' : '&') + testPaths[k + 1].substr(suff.length)
								};
								t2 = pref.lastIndexOf(lba);
								if (t2 > -1)
									pref = pref.substring(t2 + 3);
								pushWithMerit(pref + testPaths[k] + suff);

							} else {
								testPaths[k + 1] = lba + (pref == testPaths[k - 1] ? '' : lbb) + pref + testPaths[k] + suff
							}
						}
					}
				};
				jj = jj + 1;
			};

			if (outLinks.length == 0)
				return '';
			function srt(a, b) {
				a = parseInt(a.substr(0, a.indexOf(lba)), 10);
				b = parseInt(b.substr(0, b.indexOf(lba)), 10);
				if (a < b)
					return 1;
				if (a > b)
					return -1;
				return 0
			};
			outLinks.sort(srt);
			outLinks[0] = outLinks[0].substr(outLinks[0].indexOf(lba) + 3)
				if (outLinks[0].indexOf('_hq.mp4/?time=') > 0)
					outLinks[0] = outLinks[0].replace(/&/g, '&amp;');
				return outLinks[0];
		};

		if (!ol)
			return '';
		//ol = ol.replace(/^:?\/\//, curLocation.protocol + "//");
		//return restPath(ol, src);
		return restProtHost(ol, curLocation);
	};

	try {handlWin(content);} finally {found || SEND();}
});

voqabuhe пишет

А как бы ещё Увеличить изображение подключить в UCF?

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

Выделить код

Код:

;(async popup => {
	var listener = {
		imgZoom: 190,   // на сколько увеличить изображение из меню
		scrollZoom: 20, // на сколько увеличивать/уменьшать колесиком мыши
		scrollTop: 1,   // или -1, переключение направление прокрутки для увеличение колёсиком

		receiveMessage(msg) {
			var container = document.documentElement
				.appendChild(document.createElement("div"));
			var image = container.appendChild(document.createXULElement("image"));
			image.style.cssText = "width: 100% !important; height: 100% !important;";
			image.setAttribute("validate", "never");

			var st = container.style;
			var dz = this.scrollZoom/100 * this.scrollTop;
			var currScale = 1, x, y, initialZoom = this.imgZoom/100 - 1;

			var hide, props = ["width", "height", "left", "top"], p = n => n + "px";
			var set = (...args) => props.forEach((prop, ind) => st[prop] = p(args[ind]));

			(hide = () => {
				st.cssText = "position: fixed; display: none; z-index: 2147483647;";
				currScale = 1;
				image.src = null;
			})();
			container.onwheel = (e, ds = e.deltaY > 0 ? -dz : dz) => {
				if (currScale < .15 && ds < 0) return;
				st.transform = `scale(${currScale += ds})`;
				var {width, height, left, top, bottom, right} = container.getBoundingClientRect();

				if (height < innerHeight) {
					if (top < 0) st.top = p(y -= top);
					if (bottom > innerHeight) st.top = p(y -= bottom - innerHeight);
				}
				if (width < innerWidth) {
					if (left < 0) st.left = p(x -= left);
					if (right > innerWidth) st.left = p(x -= right - innerWidth);
				}
			}
			(this.receiveMessage = msg => {
				var [src, {width, height, left, top}] = msg.data;
				image.src = src;
				left -= mozInnerScreenX;
				top -= mozInnerScreenY;

				set(width, height, x = left, y = top);
				st.display = "block";
				container.onwheel(null, initialZoom);
				window.addEventListener("mousedown", hide, {once: true, capture: true});
			})(msg);
		},
		handleEvent(e) {
			if (!gContextMenu.onImage) return;
			var menuitem = document.createXULElement("menuitem");
			menuitem.setAttribute("label", "Увеличить размер");
			menuitem.className = "menuitem-iconic";
			menuitem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADZElEQVR42oXSe0xbVRwH8N8597a35e7SAmUFukGhY66AMiNzw4GvTCQLCssc4pQsmTOa+ERMlrktW1zigpnEuWn8x2eMmiVGMBDCFjS+cJHEDIk8RoSNV1+3tLWX3t72nnO8sETJFrfvP7/k5Pw+Ob9fDoLrYi8ow9GFUbq+5aRLrGraqQcX6hlF2wkFEWn6EDIJAyQy9+3VT58cWb6PrmvmjGZS/FSHlxbXtbtLobGqJlPKMhNepWb0V8hKpi8FNd/gzCCogbdmvtg/8C9gz9+Eor5x5nn2tDOZ98Dx2i3C/uYai9mOGCxiDQIIg1/PgUCEhyvDMox9PXYBkPzaaoAzAFL0yle7ShtqO/eWJ9w1vJ1oGsVzYhTNATMQG4Q1G40ldDw6PB339fs7VgMmA0jnHfioo6F9Z3tDYYJzKSZKMYcDvAILiICfZUNYEYFixMKpKBk8MfTTasBsACnngU/6Wg4+VL/VFSOmBHAYY1BAhzAvgmyMEIkh0EUOBD1Eu49eStwA5D3z4TcPv9TYdHvxEhXSGgaEIMkJkKAS+ONmSKYolOVqMBlRSd8bv8v/AQXlJoiHUE5rZ1tFa/Nhj1uVrCaNMoQxYSaIqDxAGqAuQ2XZ1iS8HUTpkZMXe1eATOdtiCcJblGe1a3PnWp0uEvfv3tbeX5RhSet/q3wxh6xgAncZUmw2hxEryQx9/LHE7I2RV5HNudGFAtcZsuQd919u/kiz56JOwobcjd6xerqKnB4HIB4RvMzCM1DGj8X0GD64pL2Xdf850z+4djKC8wl24XUpj1P75sdfe/+sSHoq3uQnSuwa+s2Vy5uubd2jQWUTAYchJK8HpyIzvv7p/rMkV/OzPeeGEWi+x6LufiR573h8VO7Zr4n9fEZNeiqXHOofFvPsKPkS1fKsX5JU6uNZQh8Wh/hRcuvOC3/fLXrcGj52yOo7zzU9udvbzbN9uglggK2MhsnvfiE0tY9tfed7vM98D+x53tx1DdG0Z2b97Ejf3SRSiGGCysyENvdoipZa4+/8NmPp8+N+Ei2ZEVpQhG71rdcqFFozD+xcoQugFUvlDS8wWsl8Uebk5C79ujjHwyc6R/309ysDBRauEzhJkG9ErAdG0xEe6yVkwqcr+549/zZgcmQ7pAEkH2TDG6RfwCoJI0uEWJP5QAAAABJRU5ErkJggg==");
			menuitem.setAttribute("oncommand", "handleCommand();");
			e.target.append(menuitem);
			menuitem.handleCommand = () => this.cmd();

			this.handleEvent = () => menuitem.hidden = !gContextMenu.onImage;
		},
		cmd() {
			var msg = this.msg = "ucf:CB:GetImageScreenRectForMosuseZoom";
			var bru = "restartApplication" in BrowserUtils, name = bru ? "Browser" : "Layout"; // Fx87+

			var code = `(targetIdentifier => {

				var image = ChromeUtils.import("resource://gre/modules/ContentDOMReference.jsm")
					.ContentDOMReference.resolve(targetIdentifier);

				var mm = image.ownerGlobal.docShell.messageManager;
				var bu = ${bru ? "mm.BrowserUtils || " : ""}ChromeUtils
					.import("resource://gre/modules/${name}Utils.jsm").${name}Utils;

				mm.sendAsyncMessage("${msg}", [
					image.currentSrc, bu.getElementBoundingScreenRect(image)
				]);
			})(`;
			messageManager.addMessageListener(msg, this);

			(this.cmd = () => {
				var {osPid} = gContextMenu.actor.manager.browsingContext.currentWindowGlobal;
				if (osPid == -1) osPid = Services.appinfo.processID;
				for(var ind = 0, len = Services.ppmm.childCount; ind < len; ind++) {
					var pmm = Services.ppmm.getChildAt(ind);
					if (pmm.osPid == osPid) break;
				}
				pmm.loadProcessScript("data:;charset=utf-8," + encodeURIComponent(
					code + JSON.stringify(gContextMenu.targetIdentifier) + ")"
				), false);
			})();
		}
	};
	popup.addEventListener("popupshowing", listener);
	var destructor = () => {
		popup.removeEventListener("popupshowing", listener);
		var {msg} = listener;
		msg && messageManager.removeMessageListener(msg, listener);
	}
	var ucf = window.ucf_custom_script_win || window.ucf_custom_script_all_win;
	if (ucf) {
		var id = "ucf-cbinit-context-img-zoomer";
		ucf[id] = {destructor};
		ucf.unloadlisteners.push(id);
	} else
		window.addEventListener("unload", destructor, {once: true});

})(document.getElementById("contentAreaContextMenu"));

fiask0 пишет

Можно ли его получить и по нажатию ПКМ?

InspectorUtils.{set, remove}ContentState(button, 1);

Отсутствует

 

№1531211-03-2021 21:14:00

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

Re: Custom Buttons

Dumby
Чета не получается вашу кнопку  Memory Monitor прикрутить к UCF.
Вроде и почитал все, походу что-то неправильно делаю.

Отсутствует

 

№1531311-03-2021 22:33:42

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

Re: Custom Buttons

Dumby, спасибо.

Отсутствует

 

№1531412-03-2021 03:19:40

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

Re: Custom Buttons

Garalf
Это типа - "помогите подключить", или о чем пост? Выложите коды, если хотите. Непонятно как вам помочь.

Отсутствует

 

№1531512-03-2021 10:23:10

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

Re: Custom Buttons

_zt
Да, если можно помогите подключить в custom_script.js

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

Выделить код

Код:

(async id => ({
	delay: 2e3,
	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(
			`<hbox id="${id}"><label id="${id += "-label"}"/></hbox>`
		);
		this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
		(this.observe = async win => {
			this.timer.cancel();
			await new Promise(ChromeUtils.idleDispatch);
			win.document.getElementById("star-button-box")
				.after(win.document.importNode(df, true));
			this.notify();
		})(win);
	},
	async notify() {
		var info = await ChromeUtils.requestProcInfo();
		var bytes = info.residentSetSize;
		for(var child of info.children) bytes += child.residentUniqueSize;
		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)
				win.document.getElementById(id).value = this.val;
	},
	mgb: bytes => bytes < 1073741824
		? Math.round(bytes / 1048576) + "MB"
		: (bytes / 1073741824).toFixed(2) + "GB"
}).init("browser-delayed-startup-finished"))("ucf-mem-indicator");
});

Отредактировано Garalf (12-03-2021 10:33:28)

Отсутствует

 

№1531612-03-2021 11:05:09

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

Re: Custom Buttons

Ravnogora
Dumby опубликовал.
https://forum.mozilla-russia.org/viewtopic.php?pid=789048#p789048

Отредактировано Garalf (12-03-2021 11:15:37)

Отсутствует

 

№1531712-03-2021 11:58:25

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

Re: Custom Buttons

Garalf пишет

Код:

(?) Каково происхождение последней строки «});»
Такого там быть не должно.
Если случайно вставил внутрь другого кода, а она как-бы осталась от него,
то вытащи код обратно и добавь уже как самостоятельный, отдельный.
А если (менее вероятно) это просто мусорная строка незвестно откуда, тогда удали её.


Ravnogora пишет

Просто пароли могу, но через host никак...

Нашёл кого спросить. Я этим не пользуюсь.
Если попроще, то, возможно(!), как-то так

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

Выделить код

Код:

var u = gBrowser.currentURI;
var host = u.asciiHost && u.displayHost;
host = host?.includes(".") ? host.replace(/^www\./, "") : "";


А если навернуть, то вообще без понятия, надо, не надо, избыточно, недостаточно.
Полагаю, такие вещи следует писать самому (под себя).
скрытый текст

Выделить код

Код:

var u = gBrowser.currentURI, host;
if (u.schemeIs("file")) host = "file://";
else
	host = u.asciiHost && u.displayHost,
	host = !host || host == "localhost" || u.schemeIs("moz-extension") // ???
		? host
		: host.includes(".")
			? host.replace(/^www\./, "")
			: "";

Отсутствует

 

№1531812-03-2021 13:10:49

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

Re: Custom Buttons

Ravnogora
Отлично работает кнопка! Спасибо.
А password menedger ты отрихтовал?

Отсутствует

 

№1531912-03-2021 23:47:32

egorsemenov06
Участник
 
Группа: Members
Зарегистрирован: 12-06-2018
Сообщений: 378
UA: Firefox 86.0

Re: Custom Buttons

Dumby Переделайте пожалуйста кнопку ночной режим для UCF

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

Выделить код

Код:

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%u041D%u043E%u0447%u043D%u043E%u0439%20%u0440%u0435%u0436%u0438%u043C%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDtAACsQX/+rEF//qxBf/6sQX/+rEF//qxBf/6sQX/+rEF//qxBf/6sQX/+rEF//qxBf/6sQX/+rEF//qxBAACsQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%28sss%20%3D%3E%20%7B%0A%20%20%20%20var%20pref%20%3D%20%60CB.%24%7B_id.slice%2820%29%7D.setStyleForPage%60%3B%0A%20%20%20%20var%20url%20%3D%20%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28this.Help%29%3B%0A%20%20%20%20var%20args%20%3D%20%5BServices.io.newURI%28url%29%2C%20sss.AGENT_SHEET%5D%3B%0A%20%20%20%20var%20reg%20%3D%20add%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20var%20has%20%3D%20sss.sheetRegistered%28...args%29%3B%0A%20%20%20%20%20%20%20%20if%20%28add%29%20has%20%7C%7C%20sss.loadAndRegisterSheet%28...args%29%3B%0A%20%20%20%20%20%20%20%20else%20has%20%26%26%20sss.unregisterSheet%28...args%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20var%20setState%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20var%20state%20%3D%20Services.prefs.getBoolPref%28pref%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20this.icon.style.backgroundColor%20%3D%20state%20%3F%20%22%23696969%22%20%3A%20%22%23CDBA96%22%3B%0A%20%20%20%20%20%20%20%20reg%28state%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20setState%28%29%3B%0A%20%20%20%20this._handleClick%20%3D%20%28%29%20%3D%3E%20Services.prefs.setBoolPref%28%0A%20%20%20%20%20%20%20%20pref%2C%20%21Services.prefs.getBoolPref%28pref%2C%20false%29%0A%20%20%20%20%29%3B%0A%20%20%20%20Services.prefs.addObserver%28pref%2C%20setState%2C%20false%29%3B%0A%20%20%20%20addDestructor%28reason%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20Services.prefs.removeObserver%28pref%2C%20setState%29%3B%0A%20%20%20%20%20%20%20%20reason%5B5%5D%20%3D%3D%20%22e%22%20%26%26%20reg%28%29%3B%0A%20%20%20%20%7D%29%3B%0A%7D%29%28%0A%20%20%20%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20.getService%28Ci.nsIStyleSheetService%29%0A%29%3B%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20..........%20%0Athis.tooltipText%20%3D%20self.label%20+%20%22%5Cn%u041B%3A%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0447%u0435%u0440%u043D%u044B%u0439%20%u0444%u043E%u043D%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%0A%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@-moz-document%20url-prefix%28http%3A//%29%2C%20url-prefix%28https%3A//%29%2C%20url-prefix%28ftp%3A//%29%2C%20url-prefix%28file%3A//%29%2C%20url%28about%3Ablank%29%2C%20url-prefix%28%22about%3Aneterror%22%29%7B%0A%0A/*%20Firefox%20Scrollbars%20*/%0Ascrollbar%20%7Bopacity%3A%20.75%20%21important%3B%7D%0A%0A/*%20Base%20*/%0A*%2C%20%3A%3Abefore%2C%20%3A%3Aafter%20%7B%0A%20%20color%3A%20%23CCC%20%21important%3B%20%0A%20%20border-color%3A%20%23444%20%21important%3B%0A%20%20outline-color%3A%20%23444%20%21important%3B%0A%20%20text-shadow%3A%20none%20%21important%3B%0A%20%20box-shadow%3A%20none%20%21important%3B%0A%20%20box-shadow%3A%20none%20%21important%3B%0A%20%20background-color%3A%20transparent%20%21important%3B%0A%7D%0A%0Ahtml%20*%20%7B%0A%20%20color%3A%20%23CCC%20%21important%3B%0A%7D%0A%0Ap%3A%3Afirst-letter%2C%0Ah1%3A%3Afirst-letter%2C%0Ah2%3A%3Afirst-letter%2C%0Ap%3A%3Afirst-line%20%7B%0A%20%20color%3A%20inherit%20%21important%3B%20%0A%20%20background%3A%20none%20%21important%3B%0A%7D%0A%0A/*%20%3A%3A%20Give%20solid%20BG%20%3A%3A%20*/%0A/*%20element%20*/%0Ahtml%2Cbody%2C%0Ali%20ul%2C%20ul%20li%2C%0Atable%2C%20header%2C%0Aarticle%2C%20section%2C%0Anav%2C%20menu%2C%0Aaside%2C%0A%0A/*%20common%20*/%0A%5Bclass*%3D%22nav%22%5D%2C%0A%5Bclass*%3D%22open%22%5D%2C%0A%5Bid*%3D%22ropdown%22%5D%2C%20/*dropdown*/%0A%5Bclass*%3D%22ropdown%22%5D%2C%20%0Adiv%5Bclass*%3D%22menu%22%5D%2C%0A%5Bclass*%3D%22tooltip%22%5D%2C%0Adiv%5Bclass*%3D%22popup%22%5D%2C%20%0Adiv%5Bid*%3D%22popup%22%5D%2C%0A%0A/*%20Notes%2C%20details%2C%20etc.%20%20Maybe%20useful%20*/%0Adiv%5Bclass*%3D%22note%22%5D%2C%20span%5Bclass*%3D%22note%22%5D%2C%0Adiv%5Bid*%3D%22detail%22%5D%2Cdiv%5Bclass*%3D%22detail%22%5D%2C%0Adiv%5Bclass*%3D%22description%22%5D%2C%0A%0A/*%20Also%20common%20*/%0Adiv%5Bclass*%3D%22content%22%5D%2C%20div%5Bclass*%3D%22container%22%5D%2C%0A%0A/*%20Popup%20divs%20that%20use%20visibility%3A%20hidden%20and%20display%3A%20none%20*/%0Adiv%5Bstyle*%3D%22display%3A%20block%22%5D%2C%20%0Adiv%5Bstyle*%3D%22visibility%3A%20visible%22%5D%20%7B%0A%20%20background-color%3A%20%23404040%20%21important%3B%0A%7D%0A%0A/*%3A%20No%20BG%20%3A*/%0A*%3Anot%28%3Aempty%29%3Anot%28span%29%3Anot%28%5Bclass%3D%22html5-volume-slider%20html5-draggable%22%5D%29%3Anot%28%5Bclass%3D%22html5-player-chrome%20html5-stop-propagation%22%5D%29%2C%20*%3A%3Abefore%2C%20*%3A%3Aafter%2C%0Atd%3Aempty%2C%20p%3Aempty%2C%20div%3Aempty%3Anot%28%5Brole%5D%29%3Anot%28%5Bstyle*%3D%22flashblock%22%5D%29%3Anot%28%5Bclass%5E%3D%22html5%22%5D%29%3Anot%28%5Bclass*%3D%22noscriptPlaceholder%22%5D%29%20%7B%0A%20%20background-image%3A%20none%20%21important%3B%0A%7D%0A%0A/*%3A%20Filter%20non-icons%20%3A*/%0Aspan%3Anot%28%3Aempty%29%3Anot%28%5Bclass*%3D%22icon%22%5D%29%3Anot%28%5Bid*%3D%22icon%22%5D%29%3Anot%28%5Bclass*%3D%22star%22%5D%29%3Anot%28%5Bid*%3D%22star%22%5D%29%3Anot%28%5Bid*%3D%22rating%22%5D%29%3Anot%28%5Bclass*%3D%22rating%22%5D%29%3Anot%28%5Bclass*%3D%22prite%22%5D%29%20%7B%0A%20%20background-image%3A%20none%20%21important%3B%0A%20%20text-indent%3A%200%20%21important%3B%0A%7D%0A%0A/*%3A%20Image%20opacity%20%3A*/%0Aimg%3Anot%28%5Bid%3D%22mpiv-preview%22%5D%29%2C%20svg%20%7B%20opacity%3A%20.75%20%21important%3B%20%7D%0Aimg%3Ahover%2C%20svg%3Ahover%20%7B%20opacity%3A%201%20%21important%3B%20%7D%0A%0A/*%20Highlight%20*/%0A%3A%3A-moz-selection%20%7B%0A%20%20background-color%3A%20%23626F61%20%21important%3B%0A%20%20color%3A%20%23F6F7B9%20%21important%3B%0A%7D%0A%0A/*%20%3A%3A%3A%20anchor/links%20%3A%3A%3A%20*/%0Aa%20%7B%0A%20%20color%3A%20%2371BAA5%20%21important%3B%20%0A%20%20background-color%3A%20%23696969%20%21important%3B%0A%20%20opacity%3A%201%20%21important%3B%20%0A%20%20text-indent%3A%200%20%21important%3B%0A%7D%0A%0Aa%3Alink%20%7B%20color%3A%20%23ACC7F6%20%21important%3B%20%7D%20/*%20hyperlink%20*/%0Aa%3Avisited%20%7B%20color%3A%20%23CDB4E7%20%21important%3B%20%7D%0Aa%3Ahover%20%7B%20color%3A%20%23FFE900%20%21important%3B%20background-color%3A%20%23363037%20%21important%3B%20%7D%0Aa%3Aactive%20%7B%20color%3A%20%23FFAE00%20%21important%3B%20%7D%0A%0A/*%20%22Top%20level%22%20div%20*/%0Abody%20%3E%20div%20%7B%20background-color%3A%20inherit%20%21important%3B%20%7D%0A%0A/*%20%3A%3A%3A%3A%3A%3A%20Text%20Presentation%20%3A%3A%3A%3A%3A%3A%20*/%0Asummary%2C%20details%20%7B%20background-color%3A%20inherit%20%21important%3B%20%7D%0Akbd%2C%20time%2C%20label%2C%20.date%20%7B%20color%3A%20%23B6D2AC%20%21important%3B%20%7D%0Aacronym%2C%20abbr%20%7B%20border-bottom%3A%201px%20dotted%20%21important%3B%20cursor%3A%20help%20%21important%3B%20%7D%0Amark%2Ccode%2Cpre%2Csamp%2Cblockquote%20%7B%20background-color%3A%20%23282826%20%21important%20%7D%0A%0A/*%20%3A%3A%3A%3A%3A%3A%20Headings%20%3A%3A%3A%3A%3A%3A%20*/%0Ah1%2Ch2%2Ch3%2Ch4%2Ch5%2Ch6%20%20%7B%20%0A%20%20background-image%3A%20none%20%21important%3B%0A%20%20border-radius%3A%205px%20%21important%3B%0A%20%20text-indent%3A%200%20%21important%3B%0A%7D%0A%0Ah1%2Ch2%20%7B%20background-color%3A%20%2328313E%20%21important%3B%20%7D%0Ah3%2Ch4%20%7B%20background-color%3A%20%232A3731%20%21important%3B%20%7D%0Ah5%2Ch6%20%7B%20background-color%3A%20%23372A2A%20%21important%3B%20%7D%0A%0A/*%20%3A%3A%3A%3A%3A%3A%20Tables%2C%20cells%20%3A%3A%3A%3A%3A%3A%20*/%0Atable%20table%20%7B%20background%3A%20%23212121%20%21important%3B%20%7D%0Ath%2C%20caption%20%7B%20background%3A%20%23404040%20%21important%3B%20%7D%0A%0A/*%20%3A%3A%3A%20Inputs%2C%20textareas%20%3A%3A%3A%20*/%0Ainput%2C%20textarea%2C%20button%2C%0Aselect%2C%20option%2C%20optgroup%20%7B%0A%20%20color%3A%20%23DDD%20%21important%3B%0A%20%20background%3A%20none%20%23404046%20%21important%3B%0A%20%20-moz-appearance%3A%20none%20%21important%3B%20%0A%7D%0A%0Ainput%2C%0Atextarea%2C%20%0Abutton%20%7B%0A%20%20border-color%3A%20%23000%20%21important%3B%20%0A%20%20border-width%3A%201px%20%21important%3B%0A%7D%0A%0A/*%20%3A%3A%3A%3A%3A%3A%20Button%20styling%20%3A%3A%3A%3A%3A%3A%20*/%0Ainput%5Btype%3D%22button%22%5D%2C%0Ainput%5Btype%3D%22submit%22%5D%2C%0Ainput%5Btype%3D%22reset%22%5D%2C%0Abutton%20%7B%0A%20%20background%3A%20%23343855%20%21important%3B%0A%7D%0A%0Ainput%5Btype%3D%22button%22%5D%3Ahover%2C%0Ainput%5Btype%3D%22submit%22%5D%3Ahover%2C%0Ainput%5Btype%3D%22reset%22%5D%3Ahover%2C%0Abutton%3Ahover%20%7B%0A%20%20color%3A%20%23FFF%20%21important%3B%0A%20%20background%3A%20%23435B6B%20%21important%3B%0A%7D%0A%0Ainput%5Btype%3D%22image%22%5D%20%7B%20opacity%3A%20.85%20%21important%3B%20%7D%0Ainput%5Btype%3D%22image%22%5D%3Ahover%20%7B%20opacity%3A%20.95%20%21important%3B%20%7D%0A%0A/*%20Lightbox%20fix%20*/%0Ahtml%20%5Bid*%3D%22lightbox%22%5D%20*%20%7B%20background-color%3A%20transparent%20%21important%3B%20%7D%0Ahtml%20%5Bid*%3D%22lightbox%22%5D%20img%20%7B%20opacity%3A%201%20%21important%3B%20%7D%0A%0A/*%20Youtube%20Annotation%20*/%0A%23movie_player-html5%20.annotation%20%7B%20background%3A%20%23333%20%21important%3B%20%7D%0A%0A/*%20Mozilla%20addons%20shrink/expand%20sections%20*/%0A.expando%20a%20%7B%20background%3A%20none%20transparent%20%21important%3B%20%7D%0A%7D%0A%0A@-moz-document%20url%28about%3Anewtab%29%20%7B%0Awindow%20%7B%0A%20%20background%3A%20%23696969%20%21important%3B%0A%7D%0A%0A%23newtab-scrollbox%20%7B%0A%20%20background%3A%20transparent%20none%20%21important%3B%0A%7D%0A%0A.newtab-title%20%7B%0A%20%20background-color%3A%20rgba%280%2C0%2C0%2C.75%29%20%21important%3B%20%0A%20%20color%3A%20%23eee%20%21important%3B%0A%7D%0A%7D%0A%0A@-moz-document%20url%28chrome%3A//browser/content/browser.xhtml%29%20%7B%0A/*%20Browser%20Background%20*/%0Abrowser%5Btype%3D%22content-primary%22%5D%20%7B%0A%20%20background-color%3A%20%231a1a1a%20%21important%3B%0A%7D%20%0A%7D%0A%0A%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№1532013-03-2021 00:07:01

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

Re: Custom Buttons

Garalf
В начале custom_script.js, со второй или третьей строки, добавляете такую конструкцию

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

Выделить код

Код:

(() => {
    var loadscript = name => {
        try {
            Services.scriptloader.loadSubScript(`chrome://user_chrome_files/content/custom_scripts/${name}`, globalThis, "UTF-8");
        } catch(e) {}
    };
    loadscript("custom_js/BBCode_Multi_ucf.js");
    loadscript("custom_js/Attributes_Inspector_ucf.js");
    loadscript("custom_js/Mem_Indicator_78_ucf.js");
    // и т. д.
})();


Перечисляете в ней свои скрипты которые у вас есть отдельными файлами, один скрипт на строку, точно как в примере. Например у меня они лежат в папке "custom_js" которая лежит рядом с "custom_script.js". Соответственно, loadscript("имя папки со скриптами/имя файла скрипта с расширением");
   
Ну и, как выше вам сказали, у вас лишняя строка в коде.

Отсутствует

 

№1532113-03-2021 00:37:44

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

Re: Custom Buttons

_zt
Спасибо вам, что отклинулись. Все нормально. Разобрался.

Отсутствует

 

№1532213-03-2021 10:10:42

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

Re: Custom Buttons

egorsemenov06 пишет

Переделайте пожалуйста кнопку ночной режим для UCF

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

Выделить код

Код:

(async (css, on, bg, upd) => CustomizableUI.createWidget(({
	label: "Ночной режим",
	id: "ucf-cbbtn-contentDarkMode",
	pref: "ucf.sheetreg.contentDarkMode",
	localized: false,
	init() {
		var {pref} = this;
		Services.prefs.addObserver(pref, this);
		Services.obs.addObserver(function quit(s, topic) {
			Services.prefs.removeObserver(pref, this);
			Services.obs.removeObserver(quit, topic);
		}, "quit-application-granted");

		//upd = btn => btn.icon.style.backgroundColor = bg;
		upd = btn => btn.icon.style.cssText =
			`background-image: linear-gradient(${bg}, ${bg}); background-origin: content-box; background-repeat: no-repeat;`;

		this.click = () => Services.prefs.setBoolPref(pref, on = !on);
		this.tooltiptext = this.label + "\nЛ: Переключить черный фон страниц";
		this.on && this.reg();
		return delete this.init && this;
	},
	onCreated(btn) {
		btn.render = this.render;
		btn._handleClick = this.click;
		btn.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDtAACsQX/+rEF//qxBf/6sQX/+rEF//qxBf/6sQX/+rEF//qxBf/6sQX/+rEF//qxBf/6sQX/+rEF//qxBAACsQQ==");
	},
	render() {
		this.constructor.prototype.render.call(this);
		upd(this);
	},
	get on() {
		on = Services.prefs.getBoolPref(this.pref, false);
		bg = on ? "#696969" : "#CDBA96";
		return on;
	},
	observe() {
		this.on ? this.reg() : this.unreg();
		for(var {node} of CustomizableUI.getWidget(this.id).instances) upd(node);
	},
	reg() {
		var sss = this.sss = Cc["@mozilla.org/content/style-sheet-service;1"]
			.getService(Ci.nsIStyleSheetService);
		var type = sss.AGENT_SHEET, uri = Services.io.newURI(
			"data:text/css;charset=utf-8," + encodeURIComponent(css)
		);
		this.unreg = () => sss.unregisterSheet(uri, type);
		(this.reg = () => sss.loadAndRegisterSheet(uri, type))();
	}
}).init()))(`\
@-moz-document url-prefix(http://), url-prefix(https://),
	url-prefix(ftp://), url-prefix(file://), url(about:blank), url-prefix("about:neterror") {

	/* Firefox Scrollbars */
	scrollbar {
		opacity: .75 !important;
	}

	/* Base */
	*, ::before, ::after {
		color: #CCC !important; 
		border-color: #444 !important;
		outline-color: #444 !important;
		text-shadow: none !important;
		box-shadow: none !important;
		box-shadow: none !important;
		background-color: transparent !important;
	}

	html * {
		color: #CCC !important;
	}

	p::first-letter,
	h1::first-letter,
	h2::first-letter,
	p::first-line {
		color: inherit !important; 
		background: none !important;
	}

	/* :: Give solid BG :: */
	/* element */
	html, body,
	li ul, ul li,
	table, header,
	article, section,
	nav, menu,
	aside,

	/* common */
	[class*="nav"],
	[class*="open"],
	[id*="ropdown"], /*dropdown*/
	[class*="ropdown"], 
	div[class*="menu"],
	[class*="tooltip"],
	div[class*="popup"], 
	div[id*="popup"],

	/* Notes, details, etc.  Maybe useful */
	div[class*="note"], span[class*="note"],
	div[id*="detail"],div[class*="detail"],
	div[class*="description"],

	/* Also common */
	div[class*="content"], div[class*="container"],

	/* Popup divs that use visibility: hidden and display: none */
	div[style*="display: block"], 
	div[style*="visibility: visible"] {
		background-color: #404040 !important;
	}

	/*: No BG :*/
	*:not(:empty):not(span):not([class="html5-volume-slider html5-draggable"]):not([class="html5-player-chrome html5-stop-propagation"]), *::before, *::after,
	td:empty, p:empty, div:empty:not([role]):not([style*="flashblock"]):not([class^="html5"]):not([class*="noscriptPlaceholder"]) {
		background-image: none !important;
	}

	/*: Filter non-icons :*/
	span:not(:empty):not([class*="icon"]):not([id*="icon"]):not([class*="star"]):not([id*="star"]):not([id*="rating"]):not([class*="rating"]):not([class*="prite"]) {
		background-image: none !important;
		text-indent: 0 !important;
	}

	/*: Image opacity :*/
	img:not([id="mpiv-preview"]), svg {
		opacity: .75 !important;
	}
	img:hover, svg:hover {
		opacity: 1 !important;
	}

	/* Highlight */
	::-moz-selection {
		background-color: #626F61 !important;
		color: #F6F7B9 !important;
	}

	/* ::: anchor/links ::: */
	a {
		color: #71BAA5 !important; 
		background-color: #696969 !important;
		opacity: 1 !important; 
		text-indent: 0 !important;
	}

	a:link { /* hyperlink */
		color: #ACC7F6 !important;
	}
	a:visited {
		color: #CDB4E7 !important;
	}
	a:hover {
		color: #FFE900 !important;
		background-color: #363037 !important;
	}
	a:active {
		color: #FFAE00 !important;
	}

	/* "Top level" div */
	body > div {
		background-color: inherit !important;
	}

	/* :::::: Text Presentation :::::: */
	summary, details {
		background-color: inherit !important;
	}
	kbd, time, label, .date {
		color: #B6D2AC !important;
	}
	acronym, abbr {
		border-bottom: 1px dotted !important;
		cursor: help !important;
	}
	mark, code, pre, samp, blockquote {
		background-color: #282826 !important;
	}

	/* :::::: Headings :::::: */
	h1, h2, h3, h4, h5, h6  { 
		background-image: none !important;
		border-radius: 5px !important;
		text-indent: 0 !important;
	}

	h1, h2 {
		background-color: #28313E !important;
	}
	h3, h4 {
		background-color: #2A3731 !important;
	}
	h5, h6 {
		background-color: #372A2A !important;
	}

	/* :::::: Tables, cells :::::: */
	table table {
		background: #212121 !important;
	}
	th, caption {
		background: #404040 !important;
	}

	/* ::: Inputs, textareas ::: */
	input, textarea, button,
	select, option, optgroup {
		color: #DDD !important;
		background: none #404046 !important;
		-moz-appearance: none !important; 
	}

	input, textarea, button {
		border-color: #000 !important; 
		border-width: 1px !important;
	}

	/* :::::: Button styling :::::: */
	input[type="button"],
	input[type="submit"],
	input[type="reset"],
	button {
		background: #343855 !important;
	}

	input[type="button"]:hover,
	input[type="submit"]:hover,
	input[type="reset"]:hover,
	button:hover {
		color: #FFF !important;
		background: #435B6B !important;
	}

	input[type="image"] {
		opacity: .85 !important;
	}
	input[type="image"]:hover {
		opacity: .95 !important;
	}

	/* Lightbox fix */
	html [id*="lightbox"] * {
		background-color: transparent !important;
	}
	html [id*="lightbox"] img {
		opacity: 1 !important;
	}

	/* Youtube Annotation */
	#movie_player-html5 .annotation {
		background: #333 !important;
	}

	/* Mozilla addons shrink/expand sections */
	.expando a {
		background: none transparent !important;
	}
}

@-moz-document url(about:newtab) {
	window {
		background: #696969 !important;
	}

	#newtab-scrollbox {
		background: transparent none !important;
	}

	.newtab-title {
		background-color: rgba(0,0,0,.75) !important; 
		color: #eee !important;
	}
}

@-moz-document url(chrome://browser/content/browser.xhtml) {
	/* Browser Background */
	browser[type="content-primary"] {
		background-color: #1a1a1a !important;
	}
}
`);

Отсутствует

 

№1532313-03-2021 11:50:21

egorsemenov06
Участник
 
Группа: Members
Зарегистрирован: 12-06-2018
Сообщений: 378
UA: Firefox 86.0

Re: Custom Buttons

Dumby пишет
egorsemenov06 пишет

Переделайте пожалуйста кнопку ночной режим для UCF

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

Выделить код

Код:

(async (css, on, bg, upd) => CustomizableUI.createWidget(({
	label: "Ночной режим",
	id: "ucf-cbbtn-contentDarkMode",
	pref: "ucf.sheetreg.contentDarkMode",
	localized: false,
	init() {
		var {pref} = this;
		Services.prefs.addObserver(pref, this);
		Services.obs.addObserver(function quit(s, topic) {
			Services.prefs.removeObserver(pref, this);
			Services.obs.removeObserver(quit, topic);
		}, "quit-application-granted");

		//upd = btn => btn.icon.style.backgroundColor = bg;
		upd = btn => btn.icon.style.cssText =
			`background-image: linear-gradient(${bg}, ${bg}); background-origin: content-box; background-repeat: no-repeat;`;

		this.click = () => Services.prefs.setBoolPref(pref, on = !on);
		this.tooltiptext = this.label + "\nЛ: Переключить черный фон страниц";
		this.on && this.reg();
		return delete this.init && this;
	},
	onCreated(btn) {
		btn.render = this.render;
		btn._handleClick = this.click;
		btn.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTXgDt014A7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA014A7dNeAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDt014A7dNeAO3TXgDtAACsQX/+rEF//qxBf/6sQX/+rEF//qxBf/6sQX/+rEF//qxBf/6sQX/+rEF//qxBf/6sQX/+rEF//qxBAACsQQ==");
	},
	render() {
		this.constructor.prototype.render.call(this);
		upd(this);
	},
	get on() {
		on = Services.prefs.getBoolPref(this.pref, false);
		bg = on ? "#696969" : "#CDBA96";
		return on;
	},
	observe() {
		this.on ? this.reg() : this.unreg();
		for(var {node} of CustomizableUI.getWidget(this.id).instances) upd(node);
	},
	reg() {
		var sss = this.sss = Cc["@mozilla.org/content/style-sheet-service;1"]
			.getService(Ci.nsIStyleSheetService);
		var type = sss.AGENT_SHEET, uri = Services.io.newURI(
			"data:text/css;charset=utf-8," + encodeURIComponent(css)
		);
		this.unreg = () => sss.unregisterSheet(uri, type);
		(this.reg = () => sss.loadAndRegisterSheet(uri, type))();
	}
}).init()))(`\
@-moz-document url-prefix(http://), url-prefix(https://),
	url-prefix(ftp://), url-prefix(file://), url(about:blank), url-prefix("about:neterror") {

	/* Firefox Scrollbars */
	scrollbar {
		opacity: .75 !important;
	}

	/* Base */
	*, ::before, ::after {
		color: #CCC !important; 
		border-color: #444 !important;
		outline-color: #444 !important;
		text-shadow: none !important;
		box-shadow: none !important;
		box-shadow: none !important;
		background-color: transparent !important;
	}

	html * {
		color: #CCC !important;
	}

	p::first-letter,
	h1::first-letter,
	h2::first-letter,
	p::first-line {
		color: inherit !important; 
		background: none !important;
	}

	/* :: Give solid BG :: */
	/* element */
	html, body,
	li ul, ul li,
	table, header,
	article, section,
	nav, menu,
	aside,

	/* common */
	[class*="nav"],
	[class*="open"],
	[id*="ropdown"], /*dropdown*/
	[class*="ropdown"], 
	div[class*="menu"],
	[class*="tooltip"],
	div[class*="popup"], 
	div[id*="popup"],

	/* Notes, details, etc.  Maybe useful */
	div[class*="note"], span[class*="note"],
	div[id*="detail"],div[class*="detail"],
	div[class*="description"],

	/* Also common */
	div[class*="content"], div[class*="container"],

	/* Popup divs that use visibility: hidden and display: none */
	div[style*="display: block"], 
	div[style*="visibility: visible"] {
		background-color: #404040 !important;
	}

	/*: No BG :*/
	*:not(:empty):not(span):not([class="html5-volume-slider html5-draggable"]):not([class="html5-player-chrome html5-stop-propagation"]), *::before, *::after,
	td:empty, p:empty, div:empty:not([role]):not([style*="flashblock"]):not([class^="html5"]):not([class*="noscriptPlaceholder"]) {
		background-image: none !important;
	}

	/*: Filter non-icons :*/
	span:not(:empty):not([class*="icon"]):not([id*="icon"]):not([class*="star"]):not([id*="star"]):not([id*="rating"]):not([class*="rating"]):not([class*="prite"]) {
		background-image: none !important;
		text-indent: 0 !important;
	}

	/*: Image opacity :*/
	img:not([id="mpiv-preview"]), svg {
		opacity: .75 !important;
	}
	img:hover, svg:hover {
		opacity: 1 !important;
	}

	/* Highlight */
	::-moz-selection {
		background-color: #626F61 !important;
		color: #F6F7B9 !important;
	}

	/* ::: anchor/links ::: */
	a {
		color: #71BAA5 !important; 
		background-color: #696969 !important;
		opacity: 1 !important; 
		text-indent: 0 !important;
	}

	a:link { /* hyperlink */
		color: #ACC7F6 !important;
	}
	a:visited {
		color: #CDB4E7 !important;
	}
	a:hover {
		color: #FFE900 !important;
		background-color: #363037 !important;
	}
	a:active {
		color: #FFAE00 !important;
	}

	/* "Top level" div */
	body > div {
		background-color: inherit !important;
	}

	/* :::::: Text Presentation :::::: */
	summary, details {
		background-color: inherit !important;
	}
	kbd, time, label, .date {
		color: #B6D2AC !important;
	}
	acronym, abbr {
		border-bottom: 1px dotted !important;
		cursor: help !important;
	}
	mark, code, pre, samp, blockquote {
		background-color: #282826 !important;
	}

	/* :::::: Headings :::::: */
	h1, h2, h3, h4, h5, h6  { 
		background-image: none !important;
		border-radius: 5px !important;
		text-indent: 0 !important;
	}

	h1, h2 {
		background-color: #28313E !important;
	}
	h3, h4 {
		background-color: #2A3731 !important;
	}
	h5, h6 {
		background-color: #372A2A !important;
	}

	/* :::::: Tables, cells :::::: */
	table table {
		background: #212121 !important;
	}
	th, caption {
		background: #404040 !important;
	}

	/* ::: Inputs, textareas ::: */
	input, textarea, button,
	select, option, optgroup {
		color: #DDD !important;
		background: none #404046 !important;
		-moz-appearance: none !important; 
	}

	input, textarea, button {
		border-color: #000 !important; 
		border-width: 1px !important;
	}

	/* :::::: Button styling :::::: */
	input[type="button"],
	input[type="submit"],
	input[type="reset"],
	button {
		background: #343855 !important;
	}

	input[type="button"]:hover,
	input[type="submit"]:hover,
	input[type="reset"]:hover,
	button:hover {
		color: #FFF !important;
		background: #435B6B !important;
	}

	input[type="image"] {
		opacity: .85 !important;
	}
	input[type="image"]:hover {
		opacity: .95 !important;
	}

	/* Lightbox fix */
	html [id*="lightbox"] * {
		background-color: transparent !important;
	}
	html [id*="lightbox"] img {
		opacity: 1 !important;
	}

	/* Youtube Annotation */
	#movie_player-html5 .annotation {
		background: #333 !important;
	}

	/* Mozilla addons shrink/expand sections */
	.expando a {
		background: none transparent !important;
	}
}

@-moz-document url(about:newtab) {
	window {
		background: #696969 !important;
	}

	#newtab-scrollbox {
		background: transparent none !important;
	}

	.newtab-title {
		background-color: rgba(0,0,0,.75) !important; 
		color: #eee !important;
	}
}

@-moz-document url(chrome://browser/content/browser.xhtml) {
	/* Browser Background */
	browser[type="content-primary"] {
		background-color: #1a1a1a !important;
	}
}
`);

Огромное Вам спасибо!!!

Отсутствует

 

№1532413-03-2021 19:57:46

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

Re: Custom Buttons

Dumby

Dumby пишет

Переделайте пожалуйста кнопку ночной режим для UCF

Volume slider на ютубе не видно...

Отсутствует

 

№1532515-03-2021 19:09:44

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

Re: Custom Buttons

Dumby, а можешь сделать чтоб кнопка №14483 работала ещё бы на звёздочке из контекстного меню на странице, ну и попутно перевести её в UCF?
ПС Только плиз с учётом моего сообщения ниже №14484

Отсутствует

 

Board footer

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