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

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

№1550124-04-2021 21:18:07

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

Re: Custom Buttons

Stkvsky пишет

Если закрыть браузер и запустить заново удаляется

А, наверно имеется ввиду не закрыть браузер как приложение (Выход, Ctrl+Shift+Q),
а когда последнее/единственное браузерное окно закрывается.
Хорошо, попробую.

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

Выделить код

Код:

(async (sel, self) => ({

	icon: "circle",
	colors: [
		"mediumseagreen",
		"silver",
		"crimson",
		"blue",
		"peru",
	],

	initColors() {
		var colorName = "ucf-gen";
		var css = "@-moz-document url(about:preferences#containers),"
			+ " url-prefix(chrome://browser/content/browser.x) {\n";
		this.colors.forEach((color, ind) => {
			var [ic, tc] = color.split(/\s*\|\s*/);
			css += `\t.identity-color-${colorName}${ind} {\n`
				+ `\t\t--identity-tab-color: ${tc || ic};\n`
				+ `\t\t--identity-icon-color: ${ic};\n\t}\n`
		});
		var url = "data:text/css;charset=utf-8," + encodeURIComponent(css + "}");
		var sss = Cc["@mozilla.org/content/style-sheet-service;1"]
			.getService(Ci.nsIStyleSheetService);
		sss.loadAndRegisterSheet(Services.io.newURI(url), sss.USER_SHEET);

		var len = this.colors.length;
		var pref = "ucf.openInGeneratedContainer.lastColor";
		var ind = Math.min(Services.prefs.getIntPref(pref, -1), len - 1);
		this.nextColor = () => {
			var next = ind + 1;
			Services.prefs.setIntPref(pref, ind = next == len ? 0 : next);
			return colorName + ind;
		}
	},
	quit: false,
	init(topic) {
		Services.obs.addObserver(self = this, topic);

		var lt = "browser-lastwindow-close-granted";
		var lw = () => this.quit = true;
		Services.obs.addObserver(lw, lt);

		Services.obs.addObserver(function quit(s, t) {
			self.quit = true;
			Services.obs.removeObserver(self, topic);
			Services.obs.removeObserver(lw, lt);
			Services.obs.removeObserver(quit, t);
		}, "quit-application-granted");
		this.initColors();
		this.newUsercontext = name => {
			var id = this.cis.create(
				name || `[ ${this.cis._lastUserContextId + 1} ]`, this.icon, this.nextColor()
			).userContextId;
			this.saveGens(this.gens.add(id));
			return id;
		}
		var cpref = "ucf.openInGeneratedContainer.containers";
		var arr = Services.prefs.getStringPref(cpref, "").split(",").map(Number).filter(Boolean);
		if (arr.length) {
			var ids = this.cis.getPublicIdentities().map(i => i.userContextId);
			arr = arr.filter(id => ids.includes(id));
		}
		this.gens = new Set(arr);
		(this.saveGens = () => Services.prefs.setStringPref(cpref, Array.from(this.gens).join(",")))();
	},
	observe(doc) {
		var list = doc.querySelectorAll(sel);
		if (!list.length) return;

		var menuitem = doc.createXULElement("menuitem");
		for(var args of Object.entries({
			selectiontype: "single",
			oncommand: "cmd(window)",
			nodetype: "folder|query",
			selection: "folder|query",
			label: "Открыть всё в контейнере",
			id: "placesContext_openContainer:tabs:newUsercontext"
		}))
			menuitem.setAttribute(...args);
		menuitem.cmd = this.cmd;
		menuitem.rnd = menuitem.constructor.prototype.render;
		menuitem.render = this.render;
		var [m1, m2] = menuitem.list = Array.from(list);
		(m2 || m1).after(menuitem);

		if (doc.documentElement.getAttribute("windowtype") != "navigator:browser") return;

		for(var btn of [
			doc.getElementById("tabs-newtab-button"),
			doc.getElementById("new-tab-button") ||
				doc.ownerGlobal.gNavToolbox.palette.querySelector("#new-tab-button")
		])
			if (btn) btn.checkForMiddleClick = this.click;

		var win = doc.ownerGlobal;
		this.redefDoSearch(win, win.customElements.get("searchbar").prototype);

		win.gBrowser.tabContainer.addEventListener("TabClose", this.tabClose);
		win.addEventListener("unload", this.winUnload, {once: true});
		this.quit = false;
	},
	winUnload(e) {
		var win = e.target.ownerGlobal;
		win.removeEventListener("TabClose", self.tabClose);
		if (self.quit) return;
		var gb = win.gBrowser;
		if (gb) for(var tab of gb.tabs) self.tabClose(null, tab);
	},
	closed: new Set(),
	cis: ChromeUtils.import("resource://gre/modules/ContextualIdentityService.jsm")
		.ContextualIdentityService,
	tabClose(e, tab = e.target) {
		var id = +tab.getAttribute("usercontextid");
		id && self.gens.has(id) && self.closed.add(id);
		self.closed.size == 1 && ChromeUtils.idleDispatch(self.meaybeRemove);
	},
	meaybeRemove() {
		var ids = Array.from(self.closed);
		self.closed.clear();
		for(var id of ids) self.meaybeRemoveById(id);
	},
	meaybeRemoveById(id) {
		for(var win of CustomizableUI.windows)
			if (win.document.querySelector(`tab.tabbrowser-tab[usercontextid="${id}"]`))
				return;
		this.saveGens(this.gens.delete(id));
		this.cis.remove(id);
	},
	redefDoSearch(win, proto) {
		var code = `(openTrustedLinkIn => [
			{${proto.doSearch}}, openTrustedLinkIn
		])(
			function otl(url, where, params) {
				if (where != "current")
					params.userContextId = otl.newUsercontext(
						document.getElementById("searchbar").value
					);
				openTrustedLinkIn(url, where, params);
			}
		);`;
		(this.redefDoSearch = (win, proto) => {
			var [obj, func] = win.eval(code);
			Object.assign(proto, obj);
			func.newUsercontext = this.newUsercontext;
		})(win, proto);
	},
	click(btn, e) {
		if (!(e.button != 2 || e.ctrlKey || e.shiftKey)) {
			var txt = e.view.readFromClipboard();
			if (txt) {
				var urls = txt.split("\n").map(self.map).filter(Boolean);
				if (urls.length) return e.preventDefault(),
					self.openFromClipboard(e.view, urls);
			}
		}
		e.view.checkForMiddleClick(btn, e);
	},
	eo: Object.create(null),
	map(str) {
		str = str.trim();
		try {
			var scheme = Services.io.extractScheme(str);
			var ph = Services.io.getProtocolHandler(scheme);
			if (ph.scheme == scheme)
				return Services.io.newURI(str) && {uri: str};
		} catch {}
	},
	openFromClipboard(win, urls) {
		if (win.OpenInTabsUtils.confirmOpenInTabs(urls.length, win))
			urls.load = true,
			this.open(win, this.eo, urls);
	},
	async render() {
		this.rnd();
		await new Promise(this.ownerGlobal.requestAnimationFrame);
		this.hidden || (this.hidden = this.list.every(self.every));
	},
	every: node => node.disabled || node.hidden,
	cmd(win) {
		var view = this.parentNode._view;
		var node = win.document.popupNode;
		node = node._placesView && node._placesView.result.root;
		self.open(win, node || view.selectedNode || view.result.root);
	},
	open(win, node, list) {
		var gbw = Cu.import("resource:///modules/PlacesUIUtils.jsm", {}).getBrowserWindow;
		var w = gbw(win);
		this.pu = w.PlacesUIUtils;
		this.fs = w.PlacesUtils.favicons;
		this.sysp = w.E10SUtils.SERIALIZED_SYSTEMPRINCIPAL;

		(this.open = (win, node, list) => {
			this.openURLs(gbw(win), list || win.PlacesUtils.getURLsForContainerNode(node));
			node.bookmarkGuid && this.pu.doCommand(win, "placesCmd_delete");
		})(win, node, list);
	},
	async openURLs(win, urls) {
		var userContextId = this.newUsercontext();
		var mark = !win.PrivateBrowsingUtils.isWindowPrivate(win);
		var {load} = urls, gb = win.gBrowser, pos = gb.selectedTab._tPos;

		for(var {uri, title, isBookmark} of urls) try {
			if (mark) isBookmark
				? this.pu.markPageAsFollowedBookmark(uri)
				: this.pu.markPageAsTyped(uri);

			if (load) {
				gb.addTrustedTab(uri, {index: ++pos, userContextId});
				continue;
			}
			var state = {userContextId, entries: [{
				url: uri,
				title: title || uri,
				triggeringPrincipal_base64: this.sysp
			}]};
			var [,, data, mime] = await new Promise(
				resolve => this.fs.getFaviconDataForPage(
					Services.io.newURI(uri), (...args) => resolve(args), 16
				)
			);
			if (data.length) state.image = `data:${
				mime || "image/x-icon"
			};base64,${
				btoa(String.fromCharCode(...data))
			}`;
			var tab = gb.addTrustedTab(null, {index: ++pos, userContextId});
			win.SessionStore.setTabState(tab, state);
		} catch {};
	}
}).init("chrome-document-loaded"))(
	"#placesContext_openBookmarkContainer\\:tabs,#placesContext_openContainer\\:tabs"
);

Отсутствует

 

№1550228-04-2021 05:37:46

kazarin
Участник
 
Группа: Members
Зарегистрирован: 23-11-2016
Сообщений: 24
UA: unknown 0.0

Re: Custom Buttons

Dobrov пишет

Посоветуйте, каким расширением или user-скриптом сохранять такие картинки или убрать перекрывающий элемент страницы?

Image Picka и Text Linky Tool, извлекают изображения со страницы.
Для перекрывающих элементов пользуюсь Remove HTML Elements.

Отсутствует

 

№1550329-04-2021 15:25:21

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

Re: Custom Buttons

kazarin - спасибо!


Подскажите, как найти ID пункта контекстного меню через DOM Inspector?
расширение SingleFile создаёт в контекстном меню строку: «Сохранить выделенное», нужен ID этой строки.


Три решения. 1) Инструкция от Viatcheslav
2) Инструменты браузера > Отключить автоскрытие всплывающих окон.
3) Кнопка Extensions Developer Tools > Инспектор атрибутов, открываем контекстное меню браузера. При этом отображается подсказка о выбранном пункте меню.

Отредактировано Dobrov (01-05-2021 04:44:43)

Отсутствует

 

№1550429-04-2021 15:52:49

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

Re: Custom Buttons

Dobrov пишет

найти ID пункта контекстного меню

Возьми Attributes Inspector в руки.

Отсутствует

 

№1550529-04-2021 17:37:12

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

Re: Custom Buttons

Dobrov
https://forum.mozilla-russia.org/viewto … 83#p788883
   
или
   
Кнопка ucf для Attributes_Inspector от Dumby
https://forum.mozilla-russia.org/viewto … 07#p789007
Путь к attrsInspector.js прописать свой.
Сам attrsInspector.js
https://github.com/Infocatcher/Custom_B … _Inspector
   
Комбинации клавиш прописаны в начале attrsInspector.js

Отредактировано _zt (29-04-2021 17:39:12)


Fx 91 esr

Отсутствует

 

№1550629-04-2021 21:38:12

Пострел
Участник
 
Группа: Members
Зарегистрирован: 08-04-2021
Сообщений: 33
UA: Firefox 88.0

Re: Custom Buttons

Dumby, здравствуйте.
Посмотрите пожалуйста кнопку "Включить / отключить куки".
Можно ли ее починить?
Иконка " включить" не запоминает состояние переключения, если куки разрешены,
и после перезагрузки браузера, иконка показывает, что куки выключены.

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

Выделить код

Код:

var prefService = Components.classes["@mozilla.org/preferences-service;1"]
    .getService(Components.interfaces.nsIPrefService);
var prefDomain = "network.cookie.cookieBehavior";

function pref() {
    var p = prefService.getIntPref(prefDomain);
    return p;
}

this.toggleCookieBehavior = function() {
    if(pref() == 2) {
        prefService.setIntPref(prefDomain, 4);
        this.image = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIj48cGF0aCBkPSJNMTI5OSA4MTNsLTQyMiA0MjJxLTE5IDE5LTQ1IDE5dC00NS0xOWwtMjk0LTI5NHEtMTktMTktMTktNDV0MTktNDVsMTAyLTEwMnExOS0xOSA0NS0xOXQ0NSAxOWwxNDcgMTQ3IDI3NS0yNzVxMTktMTkgNDUtMTl0NDUgMTlsMTAyIDEwMnExOSAxOSAxOSA0NXQtMTkgNDV6bTE0MSA4M3EwLTE0OC03My0yNzN0LTE5OC0xOTgtMjczLTczLTI3MyA3My0xOTggMTk4LTczIDI3MyA3MyAyNzMgMTk4IDE5OCAyNzMgNzMgMjczLTczIDE5OC0xOTggNzMtMjczem0yMjQgMHEwIDIwOS0xMDMgMzg1LjV0LTI3OS41IDI3OS41LTM4NS41IDEwMy0zODUuNS0xMDMtMjc5LjUtMjc5LjUtMTAzLTM4NS41IDEwMy0zODUuNSAyNzkuNS0yNzkuNSAzODUuNS0xMDMgMzg1LjUgMTAzIDI3OS41IDI3OS41IDEwMyAzODUuNXoiLz4KCQoJPG1ldGFkYXRhPgoJCTxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgeG1sbnM6cmRmcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KCQkJPHJkZjpEZXNjcmlwdGlvbiBhYm91dD0iaHR0cHM6Ly9pY29uc2NvdXQuY29tL2xlZ2FsI2xpY2Vuc2VzIiBkYzp0aXRsZT0iQ2hlY2ssIFJpZ2h0LCBBY2NwZXQsIFZlcmlmeSwgUGVyZmVjdCwgQXBwcm92ZSwgQnV0dG9uLCBDaXJjbGUiIGRjOmRlc2NyaXB0aW9uPSJDaGVjaywgUmlnaHQsIEFjY3BldCwgVmVyaWZ5LCBQZXJmZWN0LCBBcHByb3ZlLCBCdXR0b24sIENpcmNsZSIgZGM6cHVibGlzaGVyPSJJY29uc2NvdXQiIGRjOmRhdGU9IjIwMTYtMTItMTQiIGRjOmZvcm1hdD0iaW1hZ2Uvc3ZnK3htbCIgZGM6bGFuZ3VhZ2U9ImVuIj4KCQkJCTxkYzpjcmVhdG9yPgoJCQkJCTxyZGY6QmFnPgoJCQkJCQk8cmRmOmxpPkZvbnQgQXdlc29tZTwvcmRmOmxpPgoJCQkJCTwvcmRmOkJhZz4KCQkJCTwvZGM6Y3JlYXRvcj4KCQkJPC9yZGY6RGVzY3JpcHRpb24+CgkJPC9yZGY6UkRGPgogICAgPC9tZXRhZGF0YT48L3N2Zz4K";
    }
    else
    {
    prefService.setIntPref(prefDomain, 2);

    this.image = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIj48cGF0aCBkPSJNMTE1MiA4OTZxMCAxMDYtNzUgMTgxdC0xODEgNzUtMTgxLTc1LTc1LTE4MSA3NS0xODEgMTgxLTc1IDE4MSA3NSA3NSAxODF6bS0yNTYtNTQ0cS0xNDggMC0yNzMgNzN0LTE5OCAxOTgtNzMgMjczIDczIDI3MyAxOTggMTk4IDI3MyA3MyAyNzMtNzMgMTk4LTE5OCA3My0yNzMtNzMtMjczLTE5OC0xOTgtMjczLTczem03NjggNTQ0cTAgMjA5LTEwMyAzODUuNXQtMjc5LjUgMjc5LjUtMzg1LjUgMTAzLTM4NS41LTEwMy0yNzkuNS0yNzkuNS0xMDMtMzg1LjUgMTAzLTM4NS41IDI3OS41LTI3OS41IDM4NS41LTEwMyAzODUuNSAxMDMgMjc5LjUgMjc5LjUgMTAzIDM4NS41eiIvPgoJCgk8bWV0YWRhdGE+CgkJPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxuczpyZGZzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgoJCQk8cmRmOkRlc2NyaXB0aW9uIGFib3V0PSJodHRwczovL2ljb25zY291dC5jb20vbGVnYWwjbGljZW5zZXMiIGRjOnRpdGxlPSJEb3QsIENpcmNsZSwgUm91bmQsIEJsYWNrLCBIb2xlIiBkYzpkZXNjcmlwdGlvbj0iRG90LCBDaXJjbGUsIFJvdW5kLCBCbGFjaywgSG9sZSIgZGM6cHVibGlzaGVyPSJJY29uc2NvdXQiIGRjOmRhdGU9IjIwMTYtMTItMTQiIGRjOmZvcm1hdD0iaW1hZ2Uvc3ZnK3htbCIgZGM6bGFuZ3VhZ2U9ImVuIj4KCQkJCTxkYzpjcmVhdG9yPgoJCQkJCTxyZGY6QmFnPgoJCQkJCQk8cmRmOmxpPkZvbnQgQXdlc29tZTwvcmRmOmxpPgoJCQkJCTwvcmRmOkJhZz4KCQkJCTwvZGM6Y3JlYXRvcj4KCQkJPC9yZGY6RGVzY3JpcHRpb24+CgkJPC9yZGY6UkRGPgogICAgPC9tZXRhZGF0YT48L3N2Zz4K";
    }
}

Отсутствует

 

№1550730-04-2021 08:33:46

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

Re: Custom Buttons

Пострел пишет

Можно ли ее починить?

Нет. Нельзя починить то, что не было сломано.

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

Выделить код

Код:

(pref => {
	var {BEHAVIOR_REJECT, BEHAVIOR_REJECT_TRACKER} = Ci.nsICookieService;
	var icons = {
		[BEHAVIOR_REJECT]: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIj48cGF0aCBkPSJNMTE1MiA4OTZxMCAxMDYtNzUgMTgxdC0xODEgNzUtMTgxLTc1LTc1LTE4MSA3NS0xODEgMTgxLTc1IDE4MSA3NSA3NSAxODF6bS0yNTYtNTQ0cS0xNDggMC0yNzMgNzN0LTE5OCAxOTgtNzMgMjczIDczIDI3MyAxOTggMTk4IDI3MyA3MyAyNzMtNzMgMTk4LTE5OCA3My0yNzMtNzMtMjczLTE5OC0xOTgtMjczLTczem03NjggNTQ0cTAgMjA5LTEwMyAzODUuNXQtMjc5LjUgMjc5LjUtMzg1LjUgMTAzLTM4NS41LTEwMy0yNzkuNS0yNzkuNS0xMDMtMzg1LjUgMTAzLTM4NS41IDI3OS41LTI3OS41IDM4NS41LTEwMyAzODUuNSAxMDMgMjc5LjUgMjc5LjUgMTAzIDM4NS41eiIvPgoJCgk8bWV0YWRhdGE+CgkJPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxuczpyZGZzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgoJCQk8cmRmOkRlc2NyaXB0aW9uIGFib3V0PSJodHRwczovL2ljb25zY291dC5jb20vbGVnYWwjbGljZW5zZXMiIGRjOnRpdGxlPSJEb3QsIENpcmNsZSwgUm91bmQsIEJsYWNrLCBIb2xlIiBkYzpkZXNjcmlwdGlvbj0iRG90LCBDaXJjbGUsIFJvdW5kLCBCbGFjaywgSG9sZSIgZGM6cHVibGlzaGVyPSJJY29uc2NvdXQiIGRjOmRhdGU9IjIwMTYtMTItMTQiIGRjOmZvcm1hdD0iaW1hZ2Uvc3ZnK3htbCIgZGM6bGFuZ3VhZ2U9ImVuIj4KCQkJCTxkYzpjcmVhdG9yPgoJCQkJCTxyZGY6QmFnPgoJCQkJCQk8cmRmOmxpPkZvbnQgQXdlc29tZTwvcmRmOmxpPgoJCQkJCTwvcmRmOkJhZz4KCQkJCTwvZGM6Y3JlYXRvcj4KCQkJPC9yZGY6RGVzY3JpcHRpb24+CgkJPC9yZGY6UkRGPgogICAgPC9tZXRhZGF0YT48L3N2Zz4K",
		[BEHAVIOR_REJECT_TRACKER]: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIj48cGF0aCBkPSJNMTI5OSA4MTNsLTQyMiA0MjJxLTE5IDE5LTQ1IDE5dC00NS0xOWwtMjk0LTI5NHEtMTktMTktMTktNDV0MTktNDVsMTAyLTEwMnExOS0xOSA0NS0xOXQ0NSAxOWwxNDcgMTQ3IDI3NS0yNzVxMTktMTkgNDUtMTl0NDUgMTlsMTAyIDEwMnExOSAxOSAxOSA0NXQtMTkgNDV6bTE0MSA4M3EwLTE0OC03My0yNzN0LTE5OC0xOTgtMjczLTczLTI3MyA3My0xOTggMTk4LTczIDI3MyA3MyAyNzMgMTk4IDE5OCAyNzMgNzMgMjczLTczIDE5OC0xOTggNzMtMjczem0yMjQgMHEwIDIwOS0xMDMgMzg1LjV0LTI3OS41IDI3OS41LTM4NS41IDEwMy0zODUuNS0xMDMtMjc5LjUtMjc5LjUtMTAzLTM4NS41IDEwMy0zODUuNSAyNzkuNS0yNzkuNSAzODUuNS0xMDMgMzg1LjUgMTAzIDI3OS41IDI3OS41IDEwMyAzODUuNXoiLz4KCQoJPG1ldGFkYXRhPgoJCTxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgeG1sbnM6cmRmcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KCQkJPHJkZjpEZXNjcmlwdGlvbiBhYm91dD0iaHR0cHM6Ly9pY29uc2NvdXQuY29tL2xlZ2FsI2xpY2Vuc2VzIiBkYzp0aXRsZT0iQ2hlY2ssIFJpZ2h0LCBBY2NwZXQsIFZlcmlmeSwgUGVyZmVjdCwgQXBwcm92ZSwgQnV0dG9uLCBDaXJjbGUiIGRjOmRlc2NyaXB0aW9uPSJDaGVjaywgUmlnaHQsIEFjY3BldCwgVmVyaWZ5LCBQZXJmZWN0LCBBcHByb3ZlLCBCdXR0b24sIENpcmNsZSIgZGM6cHVibGlzaGVyPSJJY29uc2NvdXQiIGRjOmRhdGU9IjIwMTYtMTItMTQiIGRjOmZvcm1hdD0iaW1hZ2Uvc3ZnK3htbCIgZGM6bGFuZ3VhZ2U9ImVuIj4KCQkJCTxkYzpjcmVhdG9yPgoJCQkJCTxyZGY6QmFnPgoJCQkJCQk8cmRmOmxpPkZvbnQgQXdlc29tZTwvcmRmOmxpPgoJCQkJCTwvcmRmOkJhZz4KCQkJCTwvZGM6Y3JlYXRvcj4KCQkJPC9yZGY6RGVzY3JpcHRpb24+CgkJPC9yZGY6UkRGPgogICAgPC9tZXRhZGF0YT48L3N2Zz4K"
	};
	var setIcon = () => this.icon.src =
		icons[Services.prefs.getIntPref(pref)] || "chrome://browser/content/robot.ico";
	setIcon();
	Services.prefs.addObserver(pref, setIcon);
	addDestructor(() => Services.prefs.removeObserver(pref, setIcon));

	this.toggleCookieBehavior = () => Services.prefs.setIntPref(
		pref, Services.prefs.getIntPref(pref) == BEHAVIOR_REJECT
			? BEHAVIOR_REJECT_TRACKER : BEHAVIOR_REJECT
	);
})("network.cookie.cookieBehavior");

Отсутствует

 

№1550830-04-2021 22:29:44

Пострел
Участник
 
Группа: Members
Зарегистрирован: 08-04-2021
Сообщений: 33
UA: Firefox 88.0

Re: Custom Buttons

Dumby,

Нельзя починить то, что не было сломано.

Да, да, сморозил.
Кнопка исправно работает. Большое вам спасибо.

Оставлю здесь, если кому-то нужно.
Кнопка отреставрированная Dumby.
"Включить / отключить куки"

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0412%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20/%20%u043E%u0442%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043A%u0443%u043A%u0438%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAArxJREFUeNqkU0tPE1EYPTNMIYUG+rIM71cRCNGKSCEtGNSgqZoQgi40caExrv0pLowxsjCi7jQmLiAmhiAtCgSNiSGEWN5SW4RSKM7QduaO906nqCsX3vTMTL57zun57nzDaZqG/1kCu4zcECDkcRB4gP7sHIcuWm6icBq8LYoF+l9TBIgr9KKo2m+DP5Y3z1x8RTzW43U0nmoqsNgcrJja39ne/jq7EP0SnCHy3gtamvkrgbG6TMWu2y2BO/2W0kpnvtkMXhAQCk3C19UpFjrKRFtdW+v86CO7ktikQTHFROwBNIwD+UXX3Odu9lvEKmd0axtpWYa0swNv+0n9mdXYHuMwLtMQzTBQVPQ63B1es93ljERjePr4GZbDS1AzGaSSSQQnQnqN7TEO4zKNSgyDNMGJkopmN4vtspZg4HIAZaVHoCqKjo42jw62xziMyzTpnEFG1ar4giIrx/NIHxygtqH2UByamNbv3ad9+l5w/APMVqeVaSiMBAryTSYTNzY6rpOl3d2s+N00gmPTWFlaP6z5e7wgqsoxDYVhoGJLSiaSvu52EEKwsriuk72dHgxeDaC8PNsOM5P395GIRZJMQ2G0QLTPy3OfYsl4HGvLG3g+9Aor4axJfWNNth1VxZnzfsh7e9hYmo8xjWlBA8dG+V6AF00F5qGeS9d7ba4yy7e1GCqrS5Eb88WHI5AWo+x1Q0mniRSPJ3mJrGoEU/og0fcZlWX5QejNS7vvwqCnrqG6KEUPLPR2Ft19HYiGv2PA35cbOJa6hOL4k+HhjJ6Ao8Nfb+Nwtk672Cya79a3eI7WuFscLrGikBpj8v5rJRaOIC3JKZIiMWSwa4zxx5wBS8Lm3um2Q/RVwV9jRauJR3n2jBBZTWDu/Tomw3Fs0tKPavqB3aId5QxYrEIDwj++YHr2+Ekhse5/CTAAXnxi0o4gTYMAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%28pref%20%3D%3E%20%7B%0A%09var%20%7BBEHAVIOR_REJECT%2C%20BEHAVIOR_REJECT_TRACKER%7D%20%3D%20Ci.nsICookieService%3B%0A%09var%20icons%20%3D%20%7B%0A%09%09%5BBEHAVIOR_REJECT%5D%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAArxJREFUeNqkU0tPE1EYPTNMIYUG+rIM71cRCNGKSCEtGNSgqZoQgi40caExrv0pLowxsjCi7jQmLiAmhiAtCgSNiSGEWN5SW4RSKM7QduaO906nqCsX3vTMTL57zun57nzDaZqG/1kCu4zcECDkcRB4gP7sHIcuWm6icBq8LYoF+l9TBIgr9KKo2m+DP5Y3z1x8RTzW43U0nmoqsNgcrJja39ne/jq7EP0SnCHy3gtamvkrgbG6TMWu2y2BO/2W0kpnvtkMXhAQCk3C19UpFjrKRFtdW+v86CO7ktikQTHFROwBNIwD+UXX3Odu9lvEKmd0axtpWYa0swNv+0n9mdXYHuMwLtMQzTBQVPQ63B1es93ljERjePr4GZbDS1AzGaSSSQQnQnqN7TEO4zKNSgyDNMGJkopmN4vtspZg4HIAZaVHoCqKjo42jw62xziMyzTpnEFG1ar4giIrx/NIHxygtqH2UByamNbv3ad9+l5w/APMVqeVaSiMBAryTSYTNzY6rpOl3d2s+N00gmPTWFlaP6z5e7wgqsoxDYVhoGJLSiaSvu52EEKwsriuk72dHgxeDaC8PNsOM5P395GIRZJMQ2G0QLTPy3OfYsl4HGvLG3g+9Aor4axJfWNNth1VxZnzfsh7e9hYmo8xjWlBA8dG+V6AF00F5qGeS9d7ba4yy7e1GCqrS5Eb88WHI5AWo+x1Q0mniRSPJ3mJrGoEU/og0fcZlWX5QejNS7vvwqCnrqG6KEUPLPR2Ft19HYiGv2PA35cbOJa6hOL4k+HhjJ6Ao8Nfb+Nwtk672Cya79a3eI7WuFscLrGikBpj8v5rJRaOIC3JKZIiMWSwa4zxx5wBS8Lm3um2Q/RVwV9jRauJR3n2jBBZTWDu/Tomw3Fs0tKPavqB3aId5QxYrEIDwj++YHr2+Ekhse5/CTAAXnxi0o4gTYMAAAAASUVORK5CYII%3D%22%2C%0A%09%09%5BBEHAVIOR_REJECT_TRACKER%5D%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAt5JREFUeNqkU0tPE1EU/qa0YAGhL9spUIFS5BUFrBRSwIDGByohJJpooglGQ8JKVhr3/gTjQhfGIBujMXEBkQUCrRFQFAuEEHlKxBZaoNa2dDoP750W1IUrb+bcmZzzfed+Z865jCRJ+J+lpFvfNSWUKQyUCoA8OoZBHXGXEDMkcX5ic+SsURHY5MnGC9LvBH8sR4o66yJ7uNGhLz5Wkpap1VNn7OdWIPDlw5x3yjUuRn88J67xvxQkV50qy3izrKWzLdOUZ0hVq6FQKuF2v4WzrpZN15tZbWF1xWz/Qx2/vU6EYpSS6AeIGD1SM67YTl5vy2QtBq8/AC4aRWRrCw77Ufmb+miMYiiWckQpmYAX0KS31TjUOqNhzetDz+OnWJpfhBCPIxYKwTXiln00RjEUSzmCmEzAiajKzi21UdlGTTbaL7TAbDoAgedlq6mulI3GKIZiKYfbTRAXJIsiLUPDKBTgdnZQUFSwR3aPjMnvhuNOOeYaege1xqChHGJJBTxSVSoVM9g/JIMjwWCCPDwG1+AYlhdX93z1jQ6IgsBQDrFEFzgB/khoO+RssGvoKSsLq7Dkm+GorYSZNSInJ1HOHe4NPMENFIVV8TOCPBvJEkRpcmnmoy+0uYmvS9/Q++glludXZZK1OD9RjiDAE/OhpvksPsV9MudVyb6EgriAvoXZyfYca3kuazJnXu5oRd5BE5WKCOnC3cgwpoUN0m8JQSGIcDgS627X3iIV1MoKSD+90Wj0gfv1C09g/Xu4sChPJrsGxkHvylTYC/2pcuhPV8DP+1FxqTm78XzTEcREO0MBDBl+q5bBiULpXCmr7raWVR7Kt5XpjWxuOkmM2+sD/OSODxEuGjN2VO2ffvZ5Qp5dBhO7CWgpdO4NNh1YpwX1+RpUqBTISfwjrK1sY6a3NeOq6UZB8dqTFQ96duzoSud3E9BS0pOm/Ofd7Uq9R+q1Q8W8x32uk1b/S4ABAB8mYiP34I0MAAAAAElFTkSuQmCC%22%0A%09%7D%3B%0A%09var%20setIcon%20%3D%20%28%29%20%3D%3E%20this.icon.src%20%3D%0A%09%09icons%5BServices.prefs.getIntPref%28pref%29%5D%20%7C%7C%20%22chrome%3A//browser/content/robot.ico%22%3B%0A%09setIcon%28%29%3B%0A%09Services.prefs.addObserver%28pref%2C%20setIcon%29%3B%0A%09addDestructor%28%28%29%20%3D%3E%20Services.prefs.removeObserver%28pref%2C%20setIcon%29%29%3B%0A%0A%09this.toggleCookieBehavior%20%3D%20%28%29%20%3D%3E%20Services.prefs.setIntPref%28%0A%09%09pref%2C%20Services.prefs.getIntPref%28pref%29%20%3D%3D%20BEHAVIOR_REJECT%0A%09%09%09%3F%20BEHAVIOR_REJECT_TRACKER%20%3A%20BEHAVIOR_REJECT%0A%09%29%3B%0A%7D%29%28%22network.cookie.cookieBehavior%22%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bthis.toggleCookieBehavior%28%29%3B%0ABrowserReload%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№1550930-04-2021 23:03:54

kazarin
Участник
 
Группа: Members
Зарегистрирован: 23-11-2016
Сообщений: 24
UA: unknown 0.0

Re: Custom Buttons

Уважаемые, подскажите, есть ли кнопка или скрипт, в который можно прописать адрес chrome://browser/content/places/places.xhtml?
И ещё вопрос такой, можно ли в одну кнопку прописать несколько папок, чтоб не делать отдельные на каждую?

Отсутствует

 

№1551001-05-2021 07:54:02

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

Re: Custom Buttons

kazarin

Выделить код

Код:

this.onclick = function(event) {
   if(event.button == 0) {
      gBrowser. selectedTab = gBrowser. addTrustedTab ("chrome://browser/content/places/places.xhtml")
   }
   else if(event.button == 1) {
      document.getElementById('menu_openDownloads').click()
   }
};

Отсутствует

 

№1551101-05-2021 19:15:20

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

Re: Custom Buttons

Актуальная Custom Buttons щас где находится?

Отсутствует

 

№1551201-05-2021 22:11:39

kazarin
Участник
 
Группа: Members
Зарегистрирован: 23-11-2016
Сообщений: 24
UA: unknown 0.0

Re: Custom Buttons

momo2000 спасибо большое!

voqabuhe
Тут

Отсутствует

 

№1551302-05-2021 03:09:21

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

Re: Custom Buttons

kazarin пишет

Тут

Сам то проверял ссылки? Поэтому и спросил, что эти после пожара накрылись. :)

Отсутствует

 

№1551402-05-2021 03:13:40

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

Re: Custom Buttons

kazarin - надо проверять ссылки, которые даёшь! Там файлы недоступны уже!


custom_buttons-0.0.7.0.0.17-fx-paxmod.xpi bootstrap
dom_inspector-7.0.9-fx-paxmod.xpi bootstrap

Отсутствует

 

№1551502-05-2021 22:25:35

kazarin
Участник
 
Группа: Members
Зарегистрирован: 23-11-2016
Сообщений: 24
UA: unknown 0.0

Re: Custom Buttons

voqabuhe, Dobrov, не проверил, извините!:/

Отредактировано kazarin (02-05-2021 22:26:47)

Отсутствует

 

№1551603-05-2021 10:46:02

Cytrus
Участник
 
Группа: Members
Зарегистрирован: 30-04-2021
Сообщений: 10
UA: Firefox 78.0

Re: Custom Buttons

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


Выделить код

Код:

var w = document.commandDispatcher.focusedWindow, d = w.document, q = w.getSelection().toString(); 
alert(q);

Отсутствует

 

№1551703-05-2021 18:12:01

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

Re: Custom Buttons

Cytrus пишет

почему я не могу получить выделенный текст?

Что значит «не могу»? Вместо alert'а что? Вообще ничего не происходит?
Или сразу краш? Или фига (кукиш) во весь экран? Или что-то ещё альтернативное?

Отсутствует

 

№1551803-05-2021 19:07:51

Cytrus
Участник
 
Группа: Members
Зарегистрирован: 30-04-2021
Сообщений: 10
UA: Firefox 78.0

Re: Custom Buttons

Путой алерт получается. Текст на странице выделен, клик по кнопке, а алерт пустой.

Отсутствует

 

№1551903-05-2021 22:02:42

Deriax
Участник
 
Группа: Members
Зарегистрирован: 27-03-2021
Сообщений: 25
UA: Chrome 90.0

Re: Custom Buttons

Необходимо получить куки, определённой вкладки, я новичок, помогите! Тут нашёл,

https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/Tab

Что нужно подключить, чтобы работало? Нужно получить все куки вкладки, включая HttpOnly.

Отредактировано Deriax (03-05-2021 22:08:23)

Отсутствует

 

№1552003-05-2021 23:44:59

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

Re: Custom Buttons

Cytrus пишет

Путой алерт получается.

Пустой алерт означает, что в окне «document.commandDispatcher.focusedWindow»
ничего не выделено (выделенное в текстовых полях не считается, и никогда не считалось).

Текст на странице выделен, клик по кнопке

Кнопка находится в одном, родительском, процессе,
а текст на странице, как и сама страница, скорее всего, в другом, контентском, процессе.
Можешь проверить на странице, которая заведомо откроется в основном процессе,
например about:support (там выделенное будет алертиться так, как, наверно, и ожидалось).


Deriax пишет

Тут нашёл,
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/Tab

Где, интересно, «тут» могли куки померещиться? :/

Отсутствует

 

№1552103-05-2021 23:58:36

Deriax
Участник
 
Группа: Members
Зарегистрирован: 27-03-2021
Сообщений: 25
UA: Chrome 90.0

Re: Custom Buttons

Dumby пишет
Cytrus пишет

Путой алерт получается.

Пустой алерт означает, что в окне «document.commandDispatcher.focusedWindow»
ничего не выделено (выделенное в текстовых полях не считается, и никогда не считалось).

Текст на странице выделен, клик по кнопке

Кнопка находится в одном, родительском, процессе,
а текст на странице, как и сама страница, скорее всего, в другом, контентском, процессе.
Можешь проверить на странице, которая заведомо откроется в основном процессе,
например about:support (там выделенное будет алертиться так, как, наверно, и ожидалось).


Deriax пишет

Тут нашёл,
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/Tab

Где, интересно, «тут» могли куки померещиться? :/

14f477a2ce81.png

Отсутствует

 

№1552204-05-2021 02:11:12

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

Re: Custom Buttons

Deriax пишет

14f477a2ce81.png

Фу, в переводе это выглядит ещё более непонятно, чем в оригинале.
На самом деле, cookieStoreId — это всего лишь id'шник контейнера,
то есть, всего лишь уточняющий параметр для cookies.get() (и компании), не более того.


Типа — кука, именуемая так-то, с урлом каким-то эдаким, ограниченная контейнером (cookieStoreId) таким-то.
Еще раз: никакого «Хранилища файлов cookie вкладки» (так, как это звучит!) не существует.

Отредактировано Dumby (04-05-2021 02:11:30)

Отсутствует

 

№1552304-05-2021 12:42:17

Cytrus
Участник
 
Группа: Members
Зарегистрирован: 30-04-2021
Сообщений: 10
UA: Firefox 78.0

Re: Custom Buttons

Подскажите, а как можно получить URL по клику на ссылке?



Выделить код

Код:

document.addEventListener('click',e => {
if (e.button!=0){return;}
  if (e.altKey){
        e.preventDefault();
//         console.log("IMG URL: "+e.target.src);
        console.log("IMG URL: "+e.target.href);
//         return;
//           }

//     let zzz = e.target.closest('href');
//         console.log("URL:    " + zzz.href);
//        return;
//
  }
});

Отсутствует

 

№1552406-05-2021 14:50:20

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

Re: Custom Buttons

Dumby
В кнопке ucf Quick Toggle Settings на 88 не работает функция перезапуска, которая назначается в пунктах (restart: true,).
Поправьте пожалуйста.
Вот моя кнопка, не помню публиковалась ли она целиком, со всеми вашими правками на тот момент. Никаких недавно обсуждаемых новшеств я в нее не добавлял.

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

Выделить код

Код:

// Quick Toggle от Damby - Быстрое переключение параметров about:config
// https://forum.mozilla-russia.org/viewtopic.php?pid=784165#p784165
// Ctrl+ЛКМ или ПКМ - сброс параметра по-умолчанию FF или удаление
(async (name, id, func) => {
	if (name == "Object") return CustomizableUI.createWidget(func());
	var win = name == "Window", g = Components.utils.import("resource://gre/modules/Services.jsm", {});
	if (g[id]) {if (win) return;} else g[id] = func();
	if (win) return CustomizableUI.createWidget(g[id]);
	addDestructor(r => r[5] == "e" && delete g[id]);
	g[id].onCreated(this);
})(this.constructor.name, "QuickToggleAboutConfigSettings", () => {

	var {prefs} = Services, db = prefs.getDefaultBranch("");
	var pv = parseInt(Services.appinfo.platformVersion);
	var xul_ns = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

//=============================================================================

	// refresh:
	//	false - перезагрука текущей вкладки
	//	true  - перезагрука текущей вкладки минуя кэш
	//
	// restart:
	//	false - перезапуск браузера
	//	true  - перезапуск браузера с подтверждением
	//
	// userChoice:
	//  ваше значение - иконка назначается в 372 строке
	//
	// userAlt:
	//  альтернативное значение - иконка назначается в 374 строке

	var primary = [{

			pref: ["network.proxy.type", "Настройки прокси"],
			userChoice: 5, userAlt: 2, refresh: true,
			values: [
				[0, "Не проксировать", "0"],
				[5, "Системные (IE)", "5"],
				[2, "Авто (pacfile)", "2"],
				[1, "Прописанные", "1"],
				[4, "Автоопределение", "4"]
	]},{
			pref: ["network.trr.uri", "DoH DNS провайдер"],
			userChoice: "https://firefox.dns.nextdns.io/",
			userAlt: "https://doh.dns.sb/dns-query",
			restart: true,
			values: [
				["https://firefox.dns.nextdns.io/", "NextDNS"],
				["https://mozilla.cloudflare-dns.com/dns-query", "Cloudflare"],
				["https://dns.comss.one/dns-query", "Comss DNS"],
				["https://dns.google/dns-query", "Google DNS"]
	]},{
			pref: ["network.trr.mode", "DoH DNS режим (trr)"],
			userChoice: 3, userAlt: 2, refresh: true,
			values: [
				[1, "Быстрейший"],
				[2, "DoH+St.as.reserve"],
				[3, "Строгий"]
	]},
			null,
	{
			pref: ["permissions.default.image", "Загружать web-графику"],
			userChoice: 1, userAlt: 2, refresh: true,
			values: [
				[1, "Да"],
				[3, "С сайта"],
				[2, "Нет"]
	]}
];

//=============================================================================

	var secondary = [{

			pref: ["ui.prefersReducedMotion", "Анимация chrome"],
			userChoice: 1, userAlt: 0, restart: true,
			values: [[1, "Отключена"], [0, "Включена"]]
	},{
			pref: ["gfx.webrender.enabled", "Web render"],
			userChoice: true, userAlt: false, restart: true,
			values: [[true, "Включен"], [false, "Отключен"]]
	},{
			pref: ["gfx.webrender.force-disabled", "Web render (force-disabled)"],
			userChoice: false, userAlt: true, restart: true,
			values: [[true, "Да"], [false, "Нет"]]
	}
	];

	return {
		id: "QuickToggleAboutConfigSettings",
		label: "Quick Toggle Settings",
		tooltiptext: "Quick Toggle Settings\n	ЛКМ	ПКМ",
		localized: false,
		image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAKdSURBVDhPjZNLTxNRFMenM9OWTulTEx4KkSg+0mCCujExNTyiLKiQAUofIcR+AOPOlStdGDd+AzdGDQvF+IhBBY0ro8aNUkAXxFhKERRaYOhjOuP/j0NidONNfj2Puef0nHvPFUzT/C9EQQiC5p/JoXeQJ8Ax2jZ+/HtJNpsDwqiapm7ZnmoqWchq2qNGRYl8yRdetPq83dLN20zyezEIiNwMsxZ4obuAm/aitvVQkeX9CBoIOp1N6bX8K/g92+W1u1x+ZAqwJDOVNAsj0TfQW+EPQbbk4uoD+qGfAz2gn/a02vtSsEuSj0Za7b2BD8f10eGKtfnMcmLgg6WfnlUjk7DnGLySGJydUXunoPeIhmG4C+XK2yP+2ovo870kybKuV8rQJ3bX1LRPZXO3UGrwkN/bmdsq5uAfXy4Ws4f9vg74FSERCJxCppNmKmYS6IldkhSlXh0d1mHH6LMYYiWQbIPthG0sk/+EbAIOKA5RBuu08W/PKLnwLQaxBTYAr457SuJOMLbzZye4ZLG9MptaGqIINIsVkAerwgGHI45SBnlYVgvdLI221YIKoqAPdH6N9j+B5O20gr02/HQ87+k639lYP4KM26ta1Us4TCf1hU1tunls/Craufs5X5g86PN2za9vTLR4as+iraOIF1YYjEH5CMcQgnVJsjk5ME8z2bE9biXERJ9W114HnY4m+Pu8dvu+ubXCFNwBVlCviGKdZhh+OPyZmHqlQXG1YWOyTpYrS7peTquRC7xG+HjIPCM7r5PTyAQcXR+zAb4BjjHLNwDfAg/WPjMQucwK6u7cu/Q9MXiNsxC6//i6iAfDjDzRBbBkyXnwDWQs3zJ7/1EsZ/4ZpD+eqwPIwAX4dInHshtAGwhz/iE5SLgdIfwLnaFD0PXeqXgAAAAASUVORK5CYII=",
		onCreated(btn) {
			btn.setAttribute("image", this.image);
			var doc = btn.ownerDocument;

			btn.btn = true;
			btn.domParent = null;
			btn.popups = new btn.ownerGlobal.Array();
			this.createPopup(doc, btn, "primary", primary);
			this.createPopup(doc, btn, "secondary", secondary);
			this.createCloseMenusOption(doc, btn);

			btn.linkedObject = this;
			for(var type of ["command", "contextmenu"])
				btn.setAttribute("on" + type, `linkedObject.${type}(event)`);
		},
		createPopup(doc, btn, name, data) {
			var popup = doc.createElementNS(xul_ns, "menupopup");
			var prop = name + "Popup";
			btn.popups.push(btn[prop] = popup);
			popup.id = this.id + "-" + prop;
			for (var type of ["popupshowing", "click"])
				popup.setAttribute("on" + type, `parentNode.linkedObject.${type}(event)`);
			for(var obj of data) popup.append(this.createElement(doc, obj));
			btn.append(popup);
		},
		map: {b: "Bool", n: "Int", s: "String"},
		createElement(doc, obj) {
			if (!obj) return doc.createElementNS(xul_ns, "menuseparator");
			var pref = doc.ownerGlobal.Object.create(null), node, img, bool;
			for(var [key, val] of Object.entries(obj)) {
				if (key == "pref") {
					var [apref, lab, akey, ttt] = val;
					pref.pref = apref; pref.lab = lab || apref;
					if (ttt) pref.ttt = ttt;
				}
				else if (key == "image") img = val, pref.img = true;
				else if (key != "values") pref[key] = val;
				else pref.hasVals = true;
			}
			var type = prefs.getPrefType(pref.pref);
			var str = this.map[type == prefs.PREF_INVALID
				? obj.values ? (typeof obj.values[0][0])[0] : "b"
				: type == prefs.PREF_BOOL ? "b" : type == prefs.PREF_INT ? "n" : "s"
			];
			pref.get = prefs[`get${str}Pref`];
			pref.set = prefs[`set${str}Pref`];

			node = doc.createElementNS(xul_ns, "menu");
			node.className = "menu-iconic";
			node.setAttribute("closemenu", "none");
			img && node.setAttribute("image", img);
			akey && node.setAttribute("accesskey", akey);
			(node.pref = pref).vals = doc.ownerGlobal.Object.create(null);
			this.createRadios(doc,
				str.startsWith("B") && !pref.hasVals ? [[true, "true"], [false, "false"]] : obj.values,
				node.appendChild(doc.createElementNS(xul_ns, "menupopup"))
			);
			if ("userChoice" in obj) pref.noAlt = !("userAlt" in obj);
			return node;
		},
		createCloseMenusOption(doc, btn) {
			var pn = this.closePref = "QuickToggleAboutConfigSettings.closeMenus";
			var data = [null, {
				pref: [pn, "Автозакрытие этого меню"], values: [[true, "Да"], [false, "Нет"]]
			}];
			var setCloseMenus = e => {
				e.stopPropagation();
				var trg = e.target, {pref, val} = trg, updPopup = true, clear;
				switch(e.type) {
					case "command": pref = (trg = trg.closest("menu")).pref; updPopup = false; break;
					case "click": if (e.button) return; break;
					case "contextmenu": e.preventDefault(); clear = pref;
				}
				if (!pref) return;
				if (clear) prefs.clearUserPref(pn);
				else if (!updPopup && val === pref.val) return;
				else pref.set(pn, val !== undefined ? val : !pref.val);
				this.upd(trg);
				updPopup && this.popupshowing(null, trg.querySelector("menupopup"));
			}
			(this.createCloseMenusOption = (doc, btn) => {
				for(var obj of data)
					btn.secondaryPopup.append(this.createElement(doc, obj));
				var m = btn.secondaryPopup.lastChild;
				m.style.cssText = "fill: lightblue !important; list-style-image: url(chrome://browser/skin/menu.svg) !important;";
				m.setAttribute("oncommand", "setCloseMenus(event)");
				m.onclick = m.oncontextmenu = m.setCloseMenus = setCloseMenus;
			})(doc, btn);
		},
		UserChoiceImg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHqSURBVDhPpVJBTxNBGH1LLakxVEJQQIkhlZCAJDYR/BGScNCDwZMcuEji2ZP+BD14MCGciDEaEw8e1At3QGLlwAUOFtm6tut2uwtb2t3p8GbZ0iXlVF/y5ttkv+/Nmzej5XI5/A+6otoxTh1ks9mwhniJHvRiBAHXLjRIEy7yeIqjqAPNuXYHS5jGVby7PTT27eHo7Or9zL3Va/19Xyj5FsuYjLpOcdbBG9xFGh+fZRaGJ5O3tB7tMrcXcGQZP+pb8tXuyjpdPcA89HYHynYazxdvzg5nkgOapFsPNleXP+uY6L6hzYxMT+EC5vCVa4SWAM880Ju4cyVxUXNkERUeuyJLIR1+O6wTqcEEUngEA5eiqZgAAxtMpfur0sIBLA7+hS2NkK5UGVpsqgEJjLMkT4biAkzbE27D5u7/ZAFWSB1l0iRtUokyEj+aCBEXMHcOA70Y/IElfsMUeyiJPIpBHiZZEvv4Vcsrge9Mi1ZO0BJQ98yw9w4tWT4yYNV1ki78AuyggHLNwLZjC1Txnpl60VRMQD2SBl5sGsHaT88XJd+DEzioCAd6rYpN1xf7Jj5T4BMe00eE9pf4GteZ8Ry6mbYKDDyzxAblP4TDT1BUbc2585+yumd1Vc201ZmV7djObQKdopVBRwCOAVyl9qcQtNEaAAAAAElFTkSuQmCC",
		notUserChoiceImg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHqSURBVDhPpVJNSxtRFD1PJ9GMMVpaKyWhRGwRFy7Utv+gVFyUgoWif8Ct+APMsvQX+BuUWhdBcOvSDwi1XVhK0WgmTr4mmphoJvPRe5NnxhLdpAcO9828d869794nXNfF/6BLxo7RqiAcDjciYx3oDwFRBxikT4ey5CtAcg64aZ4ANE1rxDaDLeB176Aae/zx/ZR/NDqEuu1UD39oxsZ2wnIRmwV+8rl7DeLAGzXg+/pidSWivBwVCPQDvH91AfPot/tn6fOedW3NzTT0TYNWD7hsVfWtjH1ZjCjPggImFV25AKpE+xr+6CMxsvzpVXePmE8AipR5Bnzn4bcT0yJoCZSyQDkPXOrEDDHXYG8k0B18/nSBdvukzDPghqlB/xOUi4BBgiIJDUleF0lmVaEo7ngd8EnZP2N0uiolBwXKmksDegrISubovvyPWauR3kPLgBb5q+O8hnMyOD8jJoknTaZPKZLRSQp2+eaA6q9JmWcwTHPWv2cT0E0XGcqos4lkhgz4X7Jql3O1NZNaK2WewSQ9EtqIHcWPd5FybWQNoECNNApkdgmcwv61k47TbDbf0VykrP0hfaPlADAfCmFBERiHQN2sY79UwTqLP1BX+NyDL5HBc+ZR3Xab78xl383cZtAp7o6xAwB/AT+Y7GFJS/NjAAAAAElFTkSuQmCC",
		UserAltImg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAH7SURBVDhPpVJLa1NBFP5mJolNcrWhtiq9Betjk0VFfNS1O7ciXbQguBDXxR9g3Lnown8g3SqCi24K/gCxVbqogiBaxdyY5nFrkt5H5j7GmZvxphDdxA8+Dgzn+86Zcw4RQuB/QHUcG2kHpmkmUWHtEo6DY55mUCIhYkHQOlXA97vv4esUWJaVxBGDp2Vcz54klakbN69kZ8wZRHHsVT9b7e2tHdFH5eEuPqi8vxqsLWDxmIGX5+8/mMufPkdA8zIBiMMuvNo3sbf+bCt2cWd1V+kHBukMVNuFE3h08d7SXHF6glC4oHFXGnTBmA9j1iBnb9+6xvJYfryIjJYdGaL889TlC1cLkyFhQQek3wThjYSUt8GCX9Iky/JniitGF0WtGhpQgdLEJJvO8AMpUgIbtK/JbflmI0cc2Y0oy/JZLRsaEIKYcCemXgvUlVXdOpj/c0Bnf0BXdhXxQEsSpAZqVU7NtkRPJh5aoAmrCYnzA9SpIbDr4G74Lsihr2VDA7Xn5kdvx2mGgnr7soNaSubXQb0GelUv8lt4Pj8rJ6yRGqgjERyVT68P3rarJIo6HojrJOS2h8Yejb6+OdyIe3i1tIlIy0YP6ckCTCOH5WIJKxmGsnwKeB/bbgcvlHj1Cxoq75+XqKD2rFb1Z9rqz6rto5VHDMZFOoPxAPwGQ077rbKVfhEAAAAASUVORK5CYII=",
		upd(node) {
			var {pref} = node, def = false, user = false, val;
			if (prefs.getPrefType(pref.pref) != prefs.PREF_INVALID) {
				var pn = pref.pref;
				try {val = pref.defVal = db[pref.get.name](pn); def = true}
				catch(ex) {def = false;}
				var user = prefs.prefHasUserValue(pn);
				if (user) try {val = pref.get(pn, undefined);} catch(ex) {}
			}
			if (val == pref.val && def == pref.def && user == pref.user) return;
			pref.val = val; pref.def = def; pref.user = user;
			var exists = def || user;

			var ttt = exists ? val : "Этот преф не существует";
			if (ttt === "") ttt = "[ empty_string ]";
			ttt += "\n" + pref.pref;
			if (pref.ttt) ttt += "\n" + pref.ttt;
			node.tooltipText = ttt;

			var img, alt = "userAlt" in pref && val == pref.userAlt;
			if (alt) img = this.UserAltImg;
			if ("userChoice" in pref)
				if (val == pref.userChoice)
					//node.style.removeProperty("color"),
					img = this.UserChoiceImg;
				else {
					//node.style.setProperty("color", "maroon", "important");
					if (!alt) img = this.notUserChoiceImg;
				}
			if (!pref.img) img
				? node.setAttribute("image", img)
				: node.removeAttribute("image");
			user
				? node.style.setProperty("font-style", "italic", "important")
				: node.style.removeProperty("font-style");

			var {lab} = pref;
			if (exists && pref.hasVals) {
				if (val in pref.vals) var sfx = pref.vals[val] || val;
				else var sfx = user ? "Другое" : "По умолчанию";
				lab += ` — "${sfx}"`;
			}
			node.setAttribute("label", lab);
		},
		createRadios(doc, vals, popup) {
			for(var arr of vals) {
				if (!arr) {
					popup.append(doc.createElementNS(xul_ns, "menuseparator"));
					continue;
				}
				var [val, lab, key, ttt] = arr;
				var menuitem = doc.createElementNS(xul_ns, "menuitem");
				menuitem.setAttribute("type", "radio");
				menuitem.setAttribute("closemenu", "none");
				menuitem.style.setProperty("font-style", "italic", "important"),
				menuitem.setAttribute("label", popup.parentNode.pref.vals[val] = lab);
				key && menuitem.setAttribute("accesskey", key);
				var tip = menuitem.val = val;
				if (ttt) tip += "\n" + ttt;
				menuitem.tooltipText = tip;
				popup.append(menuitem);
			}
		},
		openPopup(popup) {
			var btn = popup.parentNode;
			if (btn.domParent != btn.parentNode) {
				btn.domParent = btn.parentNode;
				var pos;
				if (btn.matches(".widget-overflow-list > :scope"))
					pos = "after_start";
				else var win = btn.ownerGlobal, {width, height, top, bottom, left, right} =
					btn.closest("toolbar").getBoundingClientRect(), pos = width > height
						? `${win.innerHeight - bottom > top ? "after" : "before"}_start`
						: `${win.innerWidth - right > left ? "end" : "start"}_before`;
				for(var p of btn.popups) p.setAttribute("position", pos);
			}
			popup.openPopup(btn);
		},
		maybeRestart(node, conf) {
			var msgRest = "Перезапустить браузер?", msgAbort = "Запрос на выход отменен.";
			if (pv >= 77) {
				var title = node.closest("toolbarbutton").label;
				var pp = domWin => Services.prompt.wrappedJSObject.pickPrompter({
					domWin, modalType: Ci.nsIPrompt.MODAL_TYPE_WINDOW
				});
				var confirm = win => pp(win).confirm(title, msgRest);
				var alert = win => pp(win).alert(title, msgAbort);
			} else {
				var confirm = win => win.confirm(msgRest);
				var alert = win => win.alert(msgAbort);
			}
			return (this.mayBeRestart = (node, conf) => {
				var win = node.ownerGlobal;
				if (conf && !confirm(win)) return;
				if (win.BrowserUtils.restartApplication() === false) alert(win);
				else return true;
			})(node, conf);
		},
		regexpRefresh: /^(?:view-source:)?(?:https?|ftp)/,
		maybeRe(node, fe) {
			var {pref} = node;
			if ("restart" in pref) {
				if (this.maybeRestart(node, pref.restart)) return;
			}
			else this.popupshowing(fe, node.parentNode);
			if ("refresh" in pref) {
				var win = node.ownerGlobal;
				if (this.regexpRefresh.test(win.gBrowser.currentURI.spec)) pref.refresh
					? win.BrowserReloadSkipCache() : win.BrowserReload();
			}
		},
		maybeClosePopup(e, trg) {
			!e.ctrlKey && prefs.getBoolPref(this.closePref, undefined)
				&& trg.parentNode.hidePopup();
		},
		command(e) {
			var trg = e.target;
			if (trg.btn) return this.openPopup(trg.primaryPopup);

			var menu = trg.closest("menu"), newVal = trg.val;
			this.maybeClosePopup(e, menu);
			if (newVal != menu.pref.val)
				menu.pref.set(menu.pref.pref, newVal),
				this.maybeRe(menu, true);
		},
		popupshowing(e, trg = e.target) {
			if (trg.state == "closed") return;
			if (trg.id) {
				for(var node of trg.children) {
					if (node.nodeName.endsWith("r")) continue;
					this.upd(node);
					!e && node.open && this.popupshowing(null, node.querySelector("menupopup"));
				}
				return;
			}
			var {pref} = trg.closest("menu"), findChecked = true;

			var findDef = "defVal" in pref;
			var checked = trg.querySelector("[checked]");
			if (checked) {
				if (checked.val == pref.val) {
					if (findDef) findChecked = false;
					else return;
				}
				else checked.removeAttribute("checked");
			}
			if (findDef) {
				var def = trg.querySelector("menuitem:not([style*=font-style]");
				if (def)
					if (def.val == pref.defVal) {
						if (findChecked) findDef = false;
						else return;
					}
					else def.style.setProperty("font-style", "italic", "important");
			}
			for(var node of trg.children) if ("val" in node) {
				if (findChecked && node.val == pref.val) {
					node.setAttribute("checked", true);
					if (findDef) findChecked = false;
					else break;
				}
				if (findDef && node.val == pref.defVal) {
					node.style.removeProperty("font-style");
					if (findChecked) findDef = false;
					else break;
				}
			}
		},
		contextmenu(e) {
			var trg = e.target;
			if (trg.btn) {
				if (e.ctrlKey || e.shiftKey) return;
				if (e.detail == 2) return trg.secondaryPopup.hidePopup();
				this.openPopup(trg.secondaryPopup);
			}
			else if ("pref" in trg) {
				this.maybeClosePopup(e, trg);
				if (trg.pref.user)
					prefs.clearUserPref(trg.pref.pref),
					this.maybeRe(trg);
			}
			e.preventDefault();
		},
		click(e) {
			if (e.button) return;
			var trg = e.target, {pref} = trg;
			if (!pref) return;

			this.maybeClosePopup(e, trg);
			if (!("noAlt" in pref)) return;

			if (pref.val == pref.userChoice)
				if (pref.noAlt) return;
				else  pref.set(pref.pref, pref.userAlt);
			else
				pref.set(pref.pref, pref.userChoice);
			this.maybeRe(trg);
		}
	};
});


Fx 91 esr

Отсутствует

 

№1552506-05-2021 17:05:47

dezhnev
Участник
 
Группа: Members
Зарегистрирован: 21-04-2016
Сообщений: 71
UA: Firefox 88.0

Re: Custom Buttons

_zt пишет

Dumby
В кнопке ucf Quick Toggle Settings на 88 не работает функция перезапуска, которая назначается в пунктах (restart: true,).
Поправьте пожалуйста.
Вот моя кнопка, не помню публиковалась ли она целиком, со всеми вашими правками на тот момент. Никаких недавно обсуждаемых новшеств я в нее не добавлял.

строка 282
//if (win.BrowserUtils.restartApplication() === false) alert(win);
if (Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit) === false) alert(win);

Отсутствует

 

Board footer

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