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

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

№1525110-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)

Отсутствует

 

№1525210-03-2021 19:24:18

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

Re: Custom Buttons

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

Отсутствует

 

№1525311-03-2021 16:47:02

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

Re: Custom Buttons

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

Отсутствует

 

№1525411-03-2021 21:05:46

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2253
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);

Отсутствует

 

№1525511-03-2021 21:14:00

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

Re: Custom Buttons

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

Отсутствует

 

№1525611-03-2021 22:33:42

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

Re: Custom Buttons

Dumby, спасибо.

Отсутствует

 

№1525712-03-2021 03:19:40

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

Re: Custom Buttons

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

Отсутствует

 

№1525812-03-2021 10:23:10

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 322
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)

Отсутствует

 

№1525912-03-2021 11:05:09

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 322
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)

Отсутствует

 

№1526012-03-2021 11:58:25

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2253
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\./, "")
			: "";

Отсутствует

 

№1526112-03-2021 13:10:49

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

Re: Custom Buttons

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

Отсутствует

 

№1526213-03-2021 00:07:01

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1647
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("имя папки со скриптами/имя файла скрипта с расширением");
   
Ну и, как выше вам сказали, у вас лишняя строка в коде.

Отсутствует

 

№1526313-03-2021 00:37:44

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

Re: Custom Buttons

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

Отсутствует

 

№1526413-03-2021 10:10:42

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2253
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;
	}
}
`);

Отсутствует

 

№1526513-03-2021 19:57:46

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

Re: Custom Buttons

Dumby

Dumby пишет

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

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

Отсутствует

 

№1526615-03-2021 19:09:44

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

Re: Custom Buttons

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

Отсутствует

 

№1526716-03-2021 10:27:06

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

Re: Custom Buttons

voqabuhe

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

Выделить код

Код:

(async (id, sel) => {
	var g = Cu.getGlobalForObject(Cu), stt = g[id];
	if (!stt) {
		var {obs, prefs} = Services, {bookmarks: bm, observers: pobs} = PlacesUtils;
		stt = g[id] = {
			bm,
			pref: `ucf.${id}Guid`,
			async init() {
				bm.addObserver(this);
				pobs.addListener(["bookmark-added"], this.added = events => {
					for(var e of events) this.record(e.itemType, e.source, e.parentGuid);
				});
				obs.addObserver(this, "quit-application-granted");
				this.args = [b => this.bguids.add(b.parentGuid), {concurrent: true}];
				var guid = prefs.getStringPref(this.pref, "");
				if (!guid) try {var [guid] = await PlacesUtils.metadata.get(
					PlacesUIUtils.LAST_USED_FOLDERS_META_KEY, []
				)} catch {}
				this.guids.push(guid || await PlacesUIUtils.defaultParentGuid || bm.unfiledGuid);
			},
			observe() {
				bm.removeObserver(this);
				pobs.removeListener(["bookmark-added"], this.added);
				obs.removeObserver(this, "quit-application-granted");
				prefs.setStringPref(this.pref, this.guids[0]);
			},
			skipTags: true,
			bguids: new g.Set(),
			guids: new g.Array(),
			QueryInterface: g.ChromeUtils.generateQI([Ci.nsINavBookmarkObserver]),
			record(type, src, guid) {
				if (type == bm.TYPE_BOOKMARK && src == bm.SOURCES.DEFAULT) this.guids[0] = guid;
			},
			onItemMoved(a, b, c, d, e, itemType, f, oldParentGuid, newParentGuid, source) {
				newParentGuid != oldParentGuid && this.record(itemType, source, newParentGuid);
			},
			fetch(win) {
				this.bguids.clear();
				return bm.fetch({url: win.gBrowser.currentURI.spec}, ...this.args);
			},
			tt(win) {
				var list = win.InspectorUtils
					.getChildrenForNode(win.document.documentElement, true);
				return list.item(list.length - 1);
			}
		};
		var ps = ["onBeginUpdateBatch", "onEndUpdateBatch", "onItemChanged", "onItemVisited"];
		var noop = () => {}; for(var p of ps) stt[p] = noop; stt.init();

		var func = id => this[id].handleEvent = async function(e) {
			var win = e.view;
			var star = e.target;
			star.tooltipText = "\u3164";
			var starred = star.hasAttribute("starred");
			starred && await this.fetch(win);
			var result = [];
			for(var guid of (starred ? this.bguids : this.guids)) {
				var arr = [], num = 50;
				while(--num) {
					if (!star.matches(":hover")) return;
					var res = await this.bm.fetch(guid);
					if (!res) break;
					if ((guid = res.parentGuid) == this.bm.rootGuid) {
						arr.unshift(this.bm.getLocalizedTitle(res));
						break;
					}
					arr.unshift(res.title || "[Безымянная папка]");
				}
				arr.length && result.push(arr.join("\\"));
			}
			if (!star.matches(":hover")) return;
			if (!result.length) return win.document.l10n.translateElements([star]);
			var text = result.join("\n");
			if (starred) {
				var m = result.length > 1;
				text = `Адрес${m ? "а" : ""} заклад${m ? "ок" : "ки"}:\n${text}`;
			}
			win.document.tooltipNode == star
				? this.tt(win).label = text : star.tooltipText = text;
		}
		var url = "data:;charset=utf-8," + encodeURIComponent(`(${func})("${id}")`);
		g.ChromeUtils.compileScript(url).then(ps => ps.executeInGlobal(g));
	}
	await delayedStartupPromise;
	var stars = Array.from(document.querySelectorAll(sel));
	for(var star of stars) star.addEventListener("mouseenter", stt);
	var destructor = () => {
		for(var star of stars) star.removeEventListener("mouseenter", stt);
	}
	var ucf = window.ucf_custom_script_win || window.ucf_custom_script_all_win;
	if (ucf)
		ucf[id] = {destructor},
		ucf.unloadlisteners.push(id);
	else
		window.addEventListener("unload", destructor, {once: true});
})("ucfBookmarksStarFTooltipHelper", "#star-button, #context-bookmarkpage");

Отсутствует

 

№1526816-03-2021 18:59:13

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

Re: Custom Buttons

Dumby, классно, всё работает идеально. Спасибо.

Отсутствует

 

№1526919-03-2021 12:05:01

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

Re: Custom Buttons

Dumby
Не могу этот красный hbox привязать к #BMB_unsortedBookmarksPopup , только отдельно...stylesheet ? custom_style_user.css - не помогает...Приходиться так:
hbox[part="innerbox"] {margin-left: 1px !important; border-left: none !important;  margin-top: -3px !important; margin-bottom: 0px !important;} Вроде как фуфлыжно...
hko2wh4b.jpg
Это здесь:
bpbhg9tn.jpg

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

Отсутствует

 

№1527019-03-2021 14:51:47

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

Re: Custom Buttons

ВВП пишет

Не могу этот красный hbox привязать к #BMB_unsortedBookmarksPopup
custom_style_user.css - не помогает

У меня в custom_style_author.css работает.
(Не забудь галку в ucf-настройках для author проставить).

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

Выделить код

Код:

@-moz-document url(chrome://browser/content/browser.xhtml) {
	#BMB_unsortedBookmarksPopup::part(innerbox) {
		background-color: yellow !important;
		outline: 7px solid blue !important;
		outline-offset: -7px !important;
	}
}

Отредактировано Dumby (19-03-2021 14:52:49)

Отсутствует

 

№1527119-03-2021 16:10:32

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

Re: Custom Buttons

Dumby
От же,....в шаге был от разгадки. ::part(innerbox) - в этом вся фишка. Благодарю.

Отсутствует

 

№1527219-03-2021 17:42:18

hartumov
Участник
 
Группа: Members
Зарегистрирован: 17-11-2013
Сообщений: 136
UA: Firefox 85.0

Re: Custom Buttons

Подскажите пожалуйста. Вот есть где то в интернетах файл abcd.js. Он большой, а мне нужен оттуда маленький кусочек. Я делаю:

Выделить код

Код:

fetch (http://abcd.js )
  .then(resp => resp.text())
  .then(scr => { 
        let my_scr = scr.match(regexp)[0] // получаю нужный фрагмент из файла abcd.js, полностью он мне не нужен
    } )

Теперь есть у меня нужный фрагмент my_scr в виде строки. А как сделать, чтоб этот код начал выполняться в кнопке?

Отсутствует

 

№1527319-03-2021 23:06:35

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

Re: Custom Buttons

hartumov пишет

есть у меня нужный фрагмент my_scr в виде строки. А как сделать, чтоб этот код начал выполняться

eval? Не, никогда не слышал.

Отсутствует

 

№1527420-03-2021 01:46:09

hartumov
Участник
 
Группа: Members
Зарегистрирован: 17-11-2013
Сообщений: 136
UA: Firefox 85.0

Re: Custom Buttons

Dumby пишет
hartumov пишет

есть у меня нужный фрагмент my_scr в виде строки. А как сделать, чтоб этот код начал выполняться

eval? Не, никогда не слышал.

Пробовал. У меня этот eval блокируется. В консоли две ошибки:

Выделить код

Код:

eval() и eval-подобное использование других методов не разрешено
в Родительском процессе или в Системных контекстах (Использование заблокировано в
«chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button3@init»)

и

Выделить код

Код:

Uncaught (in promise) EvalError: call to eval() blocked by CSP

И если это важно, добавлю, что у меня отключен мультипроцессорный режим.

Отредактировано hartumov (20-03-2021 01:52:13)

Отсутствует

 

№1527520-03-2021 06:30:33

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

Re: Custom Buttons

hartumov пишет

В консоли две ошибки

Ого! Не думал что такое (пока) встречается "в дикой природе".
Значит CB установлен на релиз или бету вылеченную не через config.js,
либо на билд изначально не нуждающийся в лечении (DE, Unbraindead, ...)
и без config.js как такового.


То есть, по своей природе eval-like расширение работает через Debugger.
Для indirect eval замен много, а вот direct eval практически незаменим.
Если MDN-страница eval недостаточно запугала, то можно переключить
настройку security.allow_eval_with_system_principal

Отсутствует

 

Board footer

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