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

Будьте в курсе последних изменений в мире Mozilla, следя за нашим микроблогом в Twitter.

№1542621-04-2021 22:56:20

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

Re: Custom Buttons

Ребят, если есть у кого рабочая кнопка
Добавить пункт подменю "Увеличить изображение".
Поделитесь пожалуйста. У меня на 88й не работает.

Отсутствует

 

№1542722-04-2021 18:16:14

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

Re: Custom Buttons

Dumby

font-size

Намекаешь, что надо через userChrome.css регулировать? Эт я  сделал, шрифт уменьшил, иконки приобрели нормальный вид. А в саму кнопку не можешь добавить регулировку шрифта, или сделать, чтоб она не влияла на другие иконки?

Dumby пишет

иконки от дополнений

???

Ну иконки от дополнений, которые их пихают в адресную строку. У меня это Scroll Up Folder и Save-To-Read

Отсутствует

 

№1542822-04-2021 20:33:29

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

Re: Custom Buttons

egorsemenov06
Предложеный вами вариант кнопки работает.
Очень выручили. Спасибо.

Отсутствует

 

№1542923-04-2021 09:50:39

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

Re: Custom Buttons

Stkvsky пишет

Ну вот например открывается в контенере несколько вкладок
Потом все вкладки закрываются а контейнер созданный остается существовать
Можно ли сделать чтобы после закрытия последней вкладки контейнера он удалялся?

Что-то я сомневаюсь, что смогу это записать.

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

Выделить код

Код:

(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);
		Services.obs.addObserver(function quit(s, t) {
			self.quit = true;
			Services.obs.removeObserver(self, topic);
			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";
		this.gens = new Set(
			Services.prefs.getStringPref(cpref, "").split(",").map(Number).filter(Boolean)
		);
		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});
	},
	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"
);

voqabuhe пишет

Ну иконки от дополнений, которые их пихают в адресную строку. У меня это Scroll Up Folder и Save-To-Read

Вот так у меня выглядит на нестилизированном профиле (сверху).
Но, если принудительно выкрутить font-size, то да, вытягивает (снизу).

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

Выделить код

Код:

data:image/png;base64,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

А в саму кнопку не можешь добавить регулировку шрифта, или сделать, чтоб она не влияла на другие иконки?

Ну, я же не владею какой-то высокой CSS-магией,
но, чтобы не влияла, вроде как работает min-height.

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

Выделить код

Код:

(async id => ({

	style: `@-moz-document url(chrome://browser/content/browser.xhtml) {
		#${id} {
			min-height: 0 !important;
		}
		#${id}-label {
			font-size: 22px !important;
		}
	}`,
	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>`
		);
		Cc["@mozilla.org/content/style-sheet-service;1"]
			.getService(Ci.nsIStyleSheetService)
			.loadAndRegisterSheet(Services.io.newURI(
				"data:text/css;charset=utf-8," + encodeURIComponent(this.style)
			), Ci.nsIStyleSheetService.USER_SHEET);
		delete this.style;

		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) {
				var lab = win.document.getElementById(id);
				if (lab) lab.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");

Отсутствует

 

№1543023-04-2021 11:55:22

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1700
UA: Firefox 78.0

Re: Custom Buttons

Dumby пишет

Что-то я сомневаюсь, что смогу это записать.

Так работает же, класс, спасибо, благодарю!


UPD
Блин, после перезагрузки браузера контейнеры удаляются даже те в которых открыты вкладки

Отредактировано Stkvsky (23-04-2021 15:31:20)

Отсутствует

 

№1543123-04-2021 14:08:17

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

Re: Custom Buttons

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


На данном сайте (https://mose.live) при клике по постеру открываются фото, которые нельзя сохранить.

Отредактировано Dobrov (23-04-2021 14:10:20)

Отсутствует

 

№1543223-04-2021 15:49:09

vending_machine
Участник
 
Группа: Members
Зарегистрирован: 10-01-2020
Сообщений: 549
UA: unknown 0.0

Re: Custom Buttons

Dobrov пишет

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


На данном сайте (https://mose.live) при клике по постеру открываются фото, которые нельзя сохранить.

Можно сделать скрин.

Отсутствует

 

№1543324-04-2021 06:49:55

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

Re: Custom Buttons

Dumby пишет

Ну, я же не владею какой-то высокой CSS-магией,
но, чтобы не влияла, вроде как работает min-height.

Спасибо. Теперь иконки пришли в норму.

Отсутствует

 

№1543424-04-2021 10:13:01

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

Re: Custom Buttons

Подскажите по кнопе AutoCopy. Может кто всё лишнее убрать из кода, нужна только функция автокопирования в буфер.

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

Выделить код

Код:

this.closest("toolbarpaletteitem") || (script => {
    var id = `CB${_id.slice(20)}:Autocopy`, pid = id + "Parent";
    var nsvoStr = `Components.utils.import("resource://gre/modules/Services.jsm", {})`;
    var nsvo = eval(nsvoStr), {Services} = nsvo, parent = nsvo[pid];
    if (!parent) {
        var cid = id + "Child", u = code => "data:," + encodeURIComponent(code);
        var pref = "CB.Autocopy.settings", topic = "quit-application-granted";
        var PREF_ENABLED = 1;

        (parent = nsvo[pid] = {
            init() {
                this.readSettings();
                if (!this[PREF_ENABLED]) return;
                this.initChild();
            },
            destroy(reason) {
                var ud = reason[5] == "e";
                if (ud || !this.obsAdded) this.saveSettings();
                delete nsvo[pid];
                if (reason == "delete") Services.prefs.clearUserPref(pref);
                if (!this[PREF_ENABLED]) return;
                this.destroyChild();
            },
            get processURL() {
                delete this.processURL;
                this.frameURL = u(`${nsvoStr}["${cid}"].init(this);`);
                return this.processURL = u(script.replace(/%ID%/g, cid)
                    .replace("%NSVO%", nsvoStr)
                );
            },
            get frameURLDestroy() {
                delete this.frameURLDestroy;
                this.processURLDestroy = u(`${nsvoStr}["${cid}"].forget();`);
                return this.frameURLDestroy = u(`${nsvoStr}["${cid}"].destroy(this);`);
            },
            initChild() {
                Services.ppmm.loadProcessScript(this.processURL, true);
                Services.mm.loadFrameScript(this.frameURL, true);
            },
            destroyChild() {
                Services.mm.removeDelayedFrameScript(this.frameURL);
                Services.mm.loadFrameScript(this.frameURLDestroy, false);
                Services.ppmm.removeDelayedProcessScript(this.processURL);
                Services.ppmm.loadProcessScript(this.processURLDestroy, false);
            },
            readSettings() {
                this.prefVal = Services.prefs.getIntPref(pref, 3);
                for(var setting of [PREF_ENABLED])
                    this[setting] = Boolean(this.prefVal & setting);
            },
            saveSettings() {
                var settings = 0;
                for(var setting of [PREF_ENABLED])
                    if (this[setting]) settings += setting;
                if (this.prefVal != settings)
                    Services.prefs.setIntPref(pref, settings);
            },
            obsAdded: false,
            setObserver(set) {this.obsAdded = set
                ? Services.obs.addObserver(this, topic, false)
                : Services.obs.removeObserver(this, topic);
            },
            observe() {
                Services.obs.removeObserver(this, topic);
                this[PREF_ENABLED] = false;
                this.saveSettings();
            }
        }).init();
    }
    parent.register(this);
    addDestructor(reason => parent.unregister(this, reason), parent);
})

(`(nsvo => (nsvo["%ID%"] = {
    x: -1, y: -1, d: false,
    handleEvent(e) {e.button || this[e.type](e);},
    mousedown(e) {this.x = e.screenX; this.y = e.screenY, this.down = true;},
    mouseup(e) {
        var {down} = this; this.down = false; if (!down) return;
        if (e.screenX == this.x && e.screenY == this.y && (e.detail == 1 || e.target.matches(
            "textarea[disabled],input[disabled],button,select,summary"
        )))
            return;
        var name = e.originalTarget.nodeName;
        if (/^(?:(?:xul:)?(?:slider|scrollbarbutton)|resizer)$/.test(name))
            return;
        this.x = this.y = -1;
        var win = this.getFocusedWin(e.target.ownerGlobal);
        var sel = win.getSelection();
        if (sel.toString()) {
            (win.docShell || win.document.docShell).doCommand("cmd_copy", null, win);
        }
    },
    get fm() {
        delete this.fm;
        return this.fm = Components.classes["@mozilla.org/focus-manager;1"]
            .getService(Components.interfaces.nsIFocusManager);
    },
    getFocusedWin(win) {
        var focusedWin = {};
        var elm = this.fm.getFocusedElementForWindow(win.top, true, focusedWin);
        return focusedWin.value;
    },
    count: 0,
    init(cfmm) {
        this.count += 1;
        cfmm.addEventListener("mousedown", this);
        cfmm.addEventListener("mouseup", this);
        if (this.count == 1)
            this.cpmm.addMessageListener("%ID%:FromParent", this);
    },
    destroy(cfmm) {
        this.count -= 1;
        cfmm.removeEventListener("mousedown", this);
        cfmm.removeEventListener("mouseup", this);
        if (!this.count)
            this.cpmm.removeMessageListener("%ID%:FromParent", this);
    },
}).cpmm = this)(%NSVO%);`)

Это я уже всё что мог лишнее убрал, но иконка кнопки стала мутной, значит что то не то.

Или может скрипт есть?

Отредактировано momo2000 (24-04-2021 10:29:53)

Отсутствует

 

№1543524-04-2021 12:05:50

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

Re: Custom Buttons

momo2000
https://forum.mozilla-russia.org/viewto … 93#p785193


Add, или такой вариант

Отредактировано kokoss (24-04-2021 16:36:45)


Win7

Отсутствует

 

№1543624-04-2021 16:45:00

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

Re: Custom Buttons

momo2000 пишет

Или может скрипт есть?

Можно попробовать создать JSM'ку
и импортировать её из custom_script.js

AutoCopyChild.jsm

Выделить код

Код:

var EXPORTED_SYMBOLS = ["AutoCopyChild"];

ChromeUtils.domProcessChild.childID || ChromeUtils.registerWindowActor("AutoCopy", {
	messageManagerGroups: ["browsers"], allFrames: true,
	child: {moduleURI: __URI__, events: {DOMDocElementInserted: {}}}
});
var re = /\S/;
var QueryInterface = ChromeUtils.generateQI(["nsISelectionListener"]);

var reasons = ["MOUSEUP", "KEYPRESS", "SELECTALL"]
	.map(reason => Ci.nsISelectionListener[reason + "_REASON"]);

class AutoCopyChild extends JSWindowActorChild {
	constructor() {
		super();
		this.listener = {
			QueryInterface,
			notifySelectionChanged: (d, sel, reason) =>
				reasons.includes(reason) && re.test(sel)
					&& this.docShell.doCommand("cmd_copy")
		};
	}
	async handleEvent() {
		await new Promise(ChromeUtils.idleDispatch);
		(this.sel = this.contentWindow.getSelection())
			.addSelectionListener(this.listener);		
	}
	didDestroy() {
		this.sel.removeSelectionListener(this.listener);
		this.sel = this.listener = null;
	}
}

Отредактировано Dumby (25-04-2021 22:12:52)

Отсутствует

 

№1543724-04-2021 17:36:05

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1700
UA: Firefox 78.0

Re: Custom Buttons

Dumby

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

Выделить код

Код:

(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);
		Services.obs.addObserver(function quit(s, t) {
			self.quit = true;
			Services.obs.removeObserver(self, topic);
			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";
		this.gens = new Set(
			Services.prefs.getStringPref(cpref, "").split(",").map(Number).filter(Boolean)
		);
		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});
	},
	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"
);


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

Отредактировано Stkvsky (24-04-2021 18:13:02)

Отсутствует

 

№1543824-04-2021 17:56:08

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

Re: Custom Buttons

Stkvsky
Я пробовал поперезапускать, и ничего не удаляется.
Наверно нужен какой-то хитрый STR, а взять негде.

Отсутствует

 

№1543924-04-2021 18:13:52

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1700
UA: Firefox 78.0

Re: Custom Buttons

Dumby
Блин, извиняюсь, не точно выразился, не при перезапуске, а при закрытии
Если закрыть браузер и запустить заново, контейнер удаляется

Отредактировано Stkvsky (24-04-2021 19:08:27)

Отсутствует

 

№1544024-04-2021 21:18:07

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

Отсутствует

 

№1544128-04-2021 05:37:46

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

Re: Custom Buttons

Dobrov пишет

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

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

Отсутствует

 

№1544229-04-2021 15:25:21

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
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)

Отсутствует

 

№1544329-04-2021 15:52:49

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

Re: Custom Buttons

Dobrov пишет

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

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

Отсутствует

 

№1544429-04-2021 17:37:12

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1647
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)

Отсутствует

 

№1544529-04-2021 21:38:12

Пострел
Участник
 
Группа: Members
Зарегистрирован: 08-04-2021
Сообщений: 51
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";
    }
}

Отсутствует

 

№1544630-04-2021 08:33:46

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

Отсутствует

 

№1544730-04-2021 22:29:44

Пострел
Участник
 
Группа: Members
Зарегистрирован: 08-04-2021
Сообщений: 51
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

Отсутствует

 

№1544830-04-2021 23:03:54

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

Re: Custom Buttons

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

Отсутствует

 

№1544901-05-2021 07:54:02

momo2000
Участник
 
Группа: Members
Зарегистрирован: 03-09-2015
Сообщений: 237
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()
   }
};

Отсутствует

 

№1545001-05-2021 19:15:20

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

Re: Custom Buttons

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

Отсутствует

 

Board footer

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