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

Общайтесь со знакомыми и друзьями в нашем сообществе в Facebook.

№1535108-04-2021 11:02:45

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

Re: Custom Buttons

Dumby
ваша кнопка: Консоль в сайдбаре хорошая, но как открыть обычную консоль браузера, которая в меню «Web-разработка» ?


Пробовал напрямую, но эта команда не работает: e.openBrowserConsole();
может имитировать клик по пункту меню, наподобии клика по urlbar?
document.getAnonymousElementByAttribute(document.getElementById('urlbar'),"class","textbox-input-box urlbar-input-box").click();


Вторая просьба: добавить дополнительный клик на стандартную кнопку «Загрузки» (для user_chrome_files), чтобы по Right или Middle-click запускался код сохранения страницы SaveHTML:
для старого FF я делал так:

Выделить код

Код:

addEventListener("click", function(event) {
			e.view.alert("downloads-button");
		}
	event.preventDefault(); event.stopPropagation();
	}
}, false, document.getElementById("downloads-button") );

Отредактировано Dobrov (08-04-2021 11:18:15)

Отсутствует

 

№1535208-04-2021 16:32:48

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

Re: Custom Buttons

del

Отредактировано ВВП (08-04-2021 22:31:29)

Отсутствует

 

№1535308-04-2021 22:53:54

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

Re: Custom Buttons

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

Здравствуйте. Можно ли адаптировать кнопку
"При повторном открытии боковой панели закладок, все открытые папки автоматически сворачиваются"
для 87 версии Fierfox?

То, что кавычках, не совсем точно.
Этот код просто отключал запоминание состояния развёрнутости.
Поэтому, перед установкой, следует открыть боковую панель закладок,
и свернуть все папки вручную (ну, или, может, оставить, если какие нужно).

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

Выделить код

Код:

(sb => {
	var gv = () => sb.contentDocument
		?.getElementById("bookmarks-view")?.view;
	var func = function(row) {
		var node = this._rows[row];
		node.containerOpen = !node.containerOpen;
	}
	var set = () => {
		var view = gv();
		if (view) view.toggleOpenState = func;
	}
	set();
	addEventListener("pageshow", set, false, sb);
	addDestructor(() => {
		var view = gv();
		if (view) delete view.toggleOpenState;
	});
})(document.getElementById("sidebar"));

Stkvsky пишет

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

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

Выделить код

Код:

(async (sel, self) => ({

	icon: "circle",
	color: "turquoise",

	init(topic) {
		Services.obs.addObserver(self = this, topic);
		Services.obs.addObserver(function quit(s, t) {
			Services.obs.removeObserver(mm, topic);
			Services.obs.removeObserver(quit, t);
		}, "quit-application-granted");
	},
	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);
	},
	async render() {
		this.rnd();
		await new Promise(this.ownerGlobal.requestAnimationFrame);
		this.hidden || (this.hidden = this.list.every(self.every));
	},
	every(node) {
		return 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) {
		var gbw = Cu.import("resource:///modules/PlacesUIUtils.jsm", {}).getBrowserWindow;
		var w = gbw(win);
		this.pu = w.PlacesUIUtils;
		this.fs = w.PlacesUtils.favicons;
		this.cis = w.ContextualIdentityService;
		this.sysp = w.E10SUtils.SERIALIZED_SYSTEMPRINCIPAL;
		this.pad = {pad: false};
		(this.open = (win, node) => this.openURLs(
			gbw(win), win.PlacesUtils.getURLsForContainerNode(node)
		))(w, node);
	},
	async openURLs(win, urls) {
		var {userContextId} = this.cis.create(
			`[ ${this.cis._lastUserContextId + 1} ]`, this.icon, this.color
		);
		var pos = win.gBrowser.selectedTab._tPos;
		var mark = !win.PrivateBrowsingUtils.isWindowPrivate(win);
		for(var {uri, title, isBookmark} of urls) try {
			if (mark) isBookmark
				? this.pu.markPageAsFollowedBookmark(uri)
				: this.pu.markPageAsTyped(uri);

			var state = {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 = win.gBrowser.addTrustedTab(null, {index: ++pos, userContextId});
			win.SessionStore.setTabState(tab, state);
		} catch {};
	}
}).init("chrome-document-loaded"))(
	"#placesContext_openBookmarkContainer\\:tabs,#placesContext_openContainer\\:tabs"
);

Garalf пишет

В 88 по-моему опять не работает кнопка по правому клику
https://forum.mozilla-russia.org/viewtopic.php?pid=789677#p789677
Посмотрите, пожалуйста.

На 89.0a1 не вижу. Синтетический STR в студию.


Dobrov пишет

но как открыть обычную консоль браузера, которая в меню «Web-разработка» ?

Пробовал напрямую, но эта команда не работает: e.openBrowserConsole();
может имитировать клик по пункту меню, наподобии клика по urlbar?
document.getAnonymousElementByAttribute(document.getElementById('urlbar'),"class","textbox-input-box urlbar-input-box").click();

Клик не подойдёт, потому что пункта меню может ещё не быть,
больше подходит <key> — document.getElementById("key_browserConsole").doCommand();


Dobrov пишет

для старого FF я делал так

Ну так в чём проблема, если кнопка вытащена, конечно.

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

Выделить код

Код:

(async id => {
	await window.delayedStartupPromise;
	var btn = document.getElementById("downloads-button");
	if (!btn) return;

	var listener = e => {
		if (e.button == 1) {

			alert("Middle-click");

		} else if (e.button == 2) {
			if (e.metaKey || e.ctrlKey || e.shiftKey) return;
			e.preventDefault();

			alert("Right-click");
		}
	}
	btn.addEventListener("click", listener);
	var ucf = window.ucf_custom_script_win || window.ucf_custom_script_all_win;
	ucf[id] = {destructor: () => btn.removeEventListener("click", listener)};
	ucf.unloadlisteners.push(id);
})("downloads-button-click-listener");

Отредактировано Dumby (08-04-2021 22:58:27)

Отсутствует

 

№1535409-04-2021 00:39:39

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

Re: Custom Buttons

Dumby

Спасибо за обновленный код, не ожидал, что придется его полностью переписывать.
Еще раз, большое спасибо за вашу отзывчивость.

Отсутствует

 

№1535509-04-2021 01:26:37

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

Re: Custom Buttons

Dumby
Это фантастика, спасибо)
Только вот блин все контейнеры в одном цвете открываются
Можно ли указать чтобы разных цветов были?

Отсутствует

 

№1535609-04-2021 01:30:54

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

Re: Custom Buttons

Dumby пишет

как открыть обычную консоль браузера, которая в меню «Web-разработка» ?
document.getElementById("key_browserConsole").doCommand();

Dumby - да, работает на МакОС в браузере Basilisk, (он называется Serpent), но ничего не происходит в Firefox 84.0.2

Uncaught ReferenceError: window is not defined
    command chrome://user_chrome_files/content/custom_scripts/QuickToggle.js:465
    oncommand chrome://browser/content/browser.xhtml:1

Отсутствует

 

№1535709-04-2021 22:12:51

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

Re: Custom Buttons

Stkvsky пишет

Можно ли указать чтобы разных цветов были?

Допустим в коде, в массиве colors: [...], перебор по кругу.

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

Выделить код

Код:

(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;
		}
	},
	init(topic) {
		Services.obs.addObserver(self = this, topic);
		Services.obs.addObserver(function quit(s, t) {
			Services.obs.removeObserver(self, topic);
			Services.obs.removeObserver(quit, t);
		}, "quit-application-granted");
		this.initColors();
	},
	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);
	},
	async render() {
		this.rnd();
		await new Promise(this.ownerGlobal.requestAnimationFrame);
		this.hidden || (this.hidden = this.list.every(self.every));
	},
	every(node) {
		return 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) {
		var gbw = Cu.import("resource:///modules/PlacesUIUtils.jsm", {}).getBrowserWindow;
		var w = gbw(win);
		this.pu = w.PlacesUIUtils;
		this.fs = w.PlacesUtils.favicons;
		this.cis = w.ContextualIdentityService;
		this.sysp = w.E10SUtils.SERIALIZED_SYSTEMPRINCIPAL;
		(this.open = (win, node) => this.openURLs(
			gbw(win), win.PlacesUtils.getURLsForContainerNode(node)
		))(w, node);
	},
	async openURLs(win, urls) {
		var {userContextId} = this.cis.create(
			`[ ${this.cis._lastUserContextId + 1} ]`, this.icon, this.nextColor()
		);
		var pos = win.gBrowser.selectedTab._tPos;
		var mark = !win.PrivateBrowsingUtils.isWindowPrivate(win);
		for(var {uri, title, isBookmark} of urls) try {
			if (mark) isBookmark
				? this.pu.markPageAsFollowedBookmark(uri)
				: this.pu.markPageAsTyped(uri);

			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 = win.gBrowser.addTrustedTab(null, {index: ++pos, userContextId});
			win.SessionStore.setTabState(tab, state);
		} catch {};
	}
}).init("chrome-document-loaded"))(
	"#placesContext_openBookmarkContainer\\:tabs,#placesContext_openContainer\\:tabs"
);

Dobrov пишет

Uncaught ReferenceError: window is not defined
    command chrome://user_chrome_files/content/custom_scripts/QuickToggle.js:465

Откуда в QuickToggle.js в command() взялось window?
Хорошо бы на весь код command(e) {...} посмотреть.

Отсутствует

 

№1535809-04-2021 23:52:43

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

Re: Custom Buttons

Dumby пишет

Допустим в коде, в массиве colors: [...], перебор по кругу.

Понял, супер, спасибо

Отредактировано Stkvsky (10-04-2021 15:34:11)

Отсутствует

 

№1535910-04-2021 00:52:11

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

Re: Custom Buttons

Dumby пишет

Откуда в QuickToggle.js в command() взялось window?
Хорошо бы на весь код command(e) {...} посмотреть.

код всей кнопки для UCF я давал чуть раньше

command(e)

Выделить код

Код:

command(e) { // LMB
	var trg = e.target;
	if (trg.btn) {
		if(e.shiftKey) { // +Shift
			e.view.PlacesCommandHook.showPlacesOrganizer("History"); // Переключить боковую панель
		} else if (e.altKey) { // Control
			// e.openBrowserConsole(); // не работает
			// document.getElementById('menu_eyedropper').doCommand(); // Линза
			e.view.alert("Press " + trg.btn);
		} else {
			var win = e.target.ownerDocument.defaultView;
			var bar = e.target.ownerDocument.querySelector("#add-additional-vertical-bar");
			// if (bar)
				win.setToolbarVisibility(bar, bar.collapsed);
			bar.collapsed ? win.SidebarUI.hide('viewHistorySidebar') : win.SidebarUI.show('viewHistorySidebar');
			return;
		}
	}
	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);
},


Второй вопрос: greasyfork скрипт mhtml-reader не открывает mht-файл.
в меню Violentmonkey есть пункт: "Open MHTML file", но при его выборе ничего не происходит, а должен быть диалог открытия файла…

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

Отсутствует

 

№1536010-04-2021 12:26:42

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

Re: Custom Buttons

Dumby
Сразу при переходе в подробности , кнопка "опции"  такая ,а просто белая?  aboutaddons.js - рихтовать?
ia4jcm4i.png
Ну, да пришлось это убрать  this.optionsButton = this.card.querySelector(".more-options-button");

Отредактировано ВВП (10-04-2021 12:44:27)

Отсутствует

 

№1536110-04-2021 15:36:47

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

Re: Custom Buttons

Dumby пишет

Допустим в коде, в массиве colors: [...], перебор по кругу.

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

Отредактировано Stkvsky (10-04-2021 21:10:50)

Отсутствует

 

№1536210-04-2021 21:20:03

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

Re: Custom Buttons

Dobrov пишет

command(e)

Ну и нет никакого «window is not defined».


SidebarUI.hide() — не зачищен, return — не на своём месте,
и что, разве на Mac #menu_eyedropper есть,
пока субменю «Веб-разработка» не откроешь?


Кстати, когда-то спрашивали про пипетку,
код сохранился, вот — вписал, на всякий случай.

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

Выделить код

Код:

...
		eyedropper(trg) {
			var obj = ChromeUtils.import("resource://devtools/shared/Loader.jsm")
				.require("devtools/client/menus").menuitems
				.find(menuitem => menuitem.id == "menu_eyedropper");
			(this.eyedropper = target => obj.oncommand({target}))(trg);
		},
		command(e) {
			var trg = e.target;
			if (trg.btn) {
				if (e.shiftKey) e.altKey
					? this.eyedropper(trg) // Shift+Alt — Пипетка
					: e.view.PlacesCommandHook.showPlacesOrganizer("History"); // Shift — Библиотека (журнал)

				else if (e.altKey)
					trg.ownerDocument.getElementById("key_browserConsole").doCommand(); // Alt — Консоль браузера
				else {
					var bar = trg.ownerDocument.getElementById("add-additional-vertical-bar");
					if (!bar) return; // включите вертикальную панель user_chrome_files

					var bc = bar.collapsed, win = e.view, su = win.SidebarUI;
					win.setToolbarVisibility(bar, bc);
					bc ? su.show("viewHistorySidebar") : su.hide();
				}
				return;
			}
			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);
		},

Dobrov пишет

в меню Violentmonkey есть пункт: "Open MHTML file", но при его выборе ничего не происходит, а должен быть диалог открытия файла…

Наверно всплывающие окна не разрешены. Букмарклет должен работать.


Stkvsky пишет

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

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

Выделить код

Код:

/*
		(this.open = (win, node) => this.openURLs(
			gbw(win), win.PlacesUtils.getURLsForContainerNode(node)
		))(w, node);
*/
		(this.open = (win, node) => {
			this.openURLs(gbw(win), win.PlacesUtils.getURLsForContainerNode(node));
			node.bookmarkGuid && this.pu.doCommand(win, "placesCmd_delete");
		})(win, node);

Отсутствует

 

№1536310-04-2021 22:08:04

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

Re: Custom Buttons

Dumby
Класс, работает как часы, спасибо большое

Отсутствует

 

№1536411-04-2021 02:50:55

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

Re: Custom Buttons

Dumby - спасибо за помощь! Ещё просьба – нужна функция, которая открывает вкладку с url
(если его нет) и закрывает вкладку, если такая уже открыта в браузере. То есть, переключатель вкладки - открыть/закрыть.
Не могу исправить ошибку - код напрямую в кнопке работает, а обёрнутый в функцию нет!

Выделить код

Код:

switchToTab(url, e){
	var e = e || this; // аргумент функции не указан
	e.view.switchToTabHavingURI(url, true, {
	    relatedToCurrent: true,
	    triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
	});
};
Выделить код

Код:

command(e) { // нажатия мыши
	switchToTab('about:config', e);  // так вкладка не открывается
e.view.switchToTabHavingURI(url, true, { // а так открывается
	    relatedToCurrent: true,
	    triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()…

Отсутствует

 

№1536511-04-2021 06:49:31

rubel
Участник
 
Группа: Members
Откуда: г.Самара
Зарегистрирован: 10-05-2005
Сообщений: 570
UA: Firefox 86.0

Re: Custom Buttons

Dobrov

Dobrov пишет

Второй вопрос: greasyfork скрипт mhtml-reader не открывает mht-файл.
в меню Violentmonkey есть пункт: "Open MHTML file", но при его выборе ничего не происходит, а должен быть диалог открытия файла…

Объясни как должен работать этот скрипт. У меня ни скрипт ни Букмарклет не работает при попытке открыть локальный MHTML file.

Отсутствует

 

№1536611-04-2021 09:31:46

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

Re: Custom Buttons

Dumby
Не могу пункт добавить(копировать url кнопки) .Вернее, пункт сделал, но не работает.  это прикрутить - никак oncommand="custombuttons.copyURI();"
Buferobmena-1.1618122629.png
Пункт то я убрал, а то он и в panel-item аддонов появлялся...

Отредактировано ВВП (11-04-2021 14:35:10)

Отсутствует

 

№1536711-04-2021 11:30:52

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

Re: Custom Buttons

rubel пишет

Объясни как должен работать этот скрипт. У меня ни скрипт ни Букмарклет не работает при попытке открыть локальный MHTML file.

Проверял на Линуксе - диалог открытия файла вообще не появляется.
Greasyfork скрипт mhtml-reader - читает MHT-файл. При проверке Tampermonkey выдал 17 ошибок скрипта!
Ну, как-то должен работать, если код исправить!

Отсутствует

 

№1536811-04-2021 12:42:21

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1224
UA: Firefox 87.0

Re: Custom Buttons

del

Отредактировано xrun1 (11-04-2021 12:45:50)

Отсутствует

 

№1536911-04-2021 18:13:56

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

Re: Custom Buttons

Подскажите как поставить Custom Buttons на 78 [firefox]

Отсутствует

 

№1537011-04-2021 21:37:55

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

Re: Custom Buttons

ВВП посмотри может поможет

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

Выделить код

Код:

//Дополнительные пункты контекстного меню на странице about:addons для аддонов, плагинов, тем, CB.....................................................................................
((id, g, iconizer) => addDestructor(r => r[5] == "e" && id in g && g[id].destroy()) + addEventListener("shown", {
	//------------------------------------------------------------------
	"Копировать имя_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4jY2TTUhUURiGn5tD0Sp00iAwXM1iFu4kWkUZg/9MoZQhdoUCV7ooItq4atFORRGkuLMwoc0kNBGKDLSwFpEIQgspqGUUNsjI3HvPX4s7I3Nn7oW+1fn5vvd8z3vOsYiIgXuPneFMr21ZVmh9+m7GisoPxcTsM2d46on5c1gy9bHgvDVR+afqJzNzy870xIgNUJGGkqf4XVEAuJ4XeWCiNpibX3MGr/XYPd0pADxlOK0MQgf7Xw++sfJq0zRiJQAWcgWndHRkr28UWcrlAfCVwa8KrK4XOPxbYqz/MsnWcyfFi7lCIPD9x0/70YNRykKz+eELQkny74sIJbnQmqQ71UVhe+cES2hoP9uC63mBgO/7dF7s4NexZPRmBqlBaMPHnc+kL7UTh1VxqwKuGxjkaUP+zRZCSVqwKJeP2dvdj8SqGZuod9hXhr6hGwgNL5ZfEoc1PnaL2sFNAlvvthFKxmJJbfCUqXbghhHSyTOkJwcBmHr4vAnLVwKhJEPZbLgDXwh678yG7rfjfLIJS2qD0IEP9R6kiq8XrzS+sOz9p5+asKodXB0YCQkcNBbHYUXlxP6u67dnIj9PY8QJpIC2/6iX/wDxeTOAfNDrywAAAABJRU5ErkJggg==",
	"Копировать имя"(addon, hideOn) {
		if (hideOn) return false;

		gClipboard.write(addon.name);
	},
	//------------------------------------------------------------------
	"Копировать ID_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4jY2TTUhUURiGn5tD0Sp00iAwXM1iFu4kWkUZg/9MoZQhdoUCV7ooItq4atFORRGkuLMwoc0kNBGKDLSwFpEIQgspqGUUNsjI3HvPX4s7I3Nn7oW+1fn5vvd8z3vOsYiIgXuPneFMr21ZVmh9+m7GisoPxcTsM2d46on5c1gy9bHgvDVR+afqJzNzy870xIgNUJGGkqf4XVEAuJ4XeWCiNpibX3MGr/XYPd0pADxlOK0MQgf7Xw++sfJq0zRiJQAWcgWndHRkr28UWcrlAfCVwa8KrK4XOPxbYqz/MsnWcyfFi7lCIPD9x0/70YNRykKz+eELQkny74sIJbnQmqQ71UVhe+cES2hoP9uC63mBgO/7dF7s4NexZPRmBqlBaMPHnc+kL7UTh1VxqwKuGxjkaUP+zRZCSVqwKJeP2dvdj8SqGZuod9hXhr6hGwgNL5ZfEoc1PnaL2sFNAlvvthFKxmJJbfCUqXbghhHSyTOkJwcBmHr4vAnLVwKhJEPZbLgDXwh678yG7rfjfLIJS2qD0IEP9R6kiq8XrzS+sOz9p5+asKodXB0YCQkcNBbHYUXlxP6u67dnIj9PY8QJpIC2/6iX/wDxeTOAfNDrywAAAABJRU5ErkJggg==",
	"Копировать ID"(addon, hideOn) {
		if (hideOn) return false;

		gClipboard.write(addon.id);
	},
	//------------------------------------------------------------------
	"Копировать версию_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4jY2TTUhUURiGn5tD0Sp00iAwXM1iFu4kWkUZg/9MoZQhdoUCV7ooItq4atFORRGkuLMwoc0kNBGKDLSwFpEIQgspqGUUNsjI3HvPX4s7I3Nn7oW+1fn5vvd8z3vOsYiIgXuPneFMr21ZVmh9+m7GisoPxcTsM2d46on5c1gy9bHgvDVR+afqJzNzy870xIgNUJGGkqf4XVEAuJ4XeWCiNpibX3MGr/XYPd0pADxlOK0MQgf7Xw++sfJq0zRiJQAWcgWndHRkr28UWcrlAfCVwa8KrK4XOPxbYqz/MsnWcyfFi7lCIPD9x0/70YNRykKz+eELQkny74sIJbnQmqQ71UVhe+cES2hoP9uC63mBgO/7dF7s4NexZPRmBqlBaMPHnc+kL7UTh1VxqwKuGxjkaUP+zRZCSVqwKJeP2dvdj8SqGZuod9hXhr6hGwgNL5ZfEoc1PnaL2sFNAlvvthFKxmJJbfCUqXbghhHSyTOkJwcBmHr4vAnLVwKhJEPZbLgDXwh678yG7rfjfLIJS2qD0IEP9R6kiq8XrzS+sOz9p5+asKodXB0YCQkcNBbHYUXlxP6u67dnIj9PY8QJpIC2/6iX/wDxeTOAfNDrywAAAABJRU5ErkJggg==",
	"Копировать версию"(addon, hideOn) {
		if (hideOn) return ["custombuttons"];

		gClipboard.write(addon.version);
	},
	//------------------------------------------------------------------
	"Копировать имя и версию_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4jY2TTUhUURiGn5tD0Sp00iAwXM1iFu4kWkUZg/9MoZQhdoUCV7ooItq4atFORRGkuLMwoc0kNBGKDLSwFpEIQgspqGUUNsjI3HvPX4s7I3Nn7oW+1fn5vvd8z3vOsYiIgXuPneFMr21ZVmh9+m7GisoPxcTsM2d46on5c1gy9bHgvDVR+afqJzNzy870xIgNUJGGkqf4XVEAuJ4XeWCiNpibX3MGr/XYPd0pADxlOK0MQgf7Xw++sfJq0zRiJQAWcgWndHRkr28UWcrlAfCVwa8KrK4XOPxbYqz/MsnWcyfFi7lCIPD9x0/70YNRykKz+eELQkny74sIJbnQmqQ71UVhe+cES2hoP9uC63mBgO/7dF7s4NexZPRmBqlBaMPHnc+kL7UTh1VxqwKuGxjkaUP+zRZCSVqwKJeP2dvdj8SqGZuod9hXhr6hGwgNL5ZfEoc1PnaL2sFNAlvvthFKxmJJbfCUqXbghhHSyTOkJwcBmHr4vAnLVwKhJEPZbLgDXwh678yG7rfjfLIJS2qD0IEP9R6kiq8XrzS+sOz9p5+asKodXB0YCQkcNBbHYUXlxP6u67dnIj9PY8QJpIC2/6iX/wDxeTOAfNDrywAAAABJRU5ErkJggg==",
	"Копировать имя и версию"(addon, hideOn) {
		if (hideOn) return ["custombuttons"];

		gClipboard.write(addon.name + " " + addon.version);
	},
	//------------------------------------------------------------------
	"Домашняя страница_i": "data:image/png;base64,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",
	"Домашняя страница"(addon, hideOn) {
		if (hideOn) return !addon.homepageURL && !addon.reviewURL;
		
		openURL(addon.homepageURL || addon.reviewURL.replace(/\/reviews\/.*$/, "/"));
	},
	//------------------------------------------------------------------
	"Поиск на АМО_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJGSURBVDjLjdJLSNRBHMDx78yqLZaKS75DPdgDDaFDbdJmde5QlhCJGxgpRJfqEEKnIsJLB7skQYQKZaSmdLaopPCgEvSCShCMzR5a7oq7/3l12RVtjfzBMA/4fWZ+MyOccwBM3g8HEbIdfCEhfAFnLVapOa28Uevpjrqz/WOsERJgsu9Uq5CZQzgqrJfo9BajNd5irEYn4p3OUiFExtCLmw2tawFi4l5zUMjMIau9u7K+qxeoAcoAA0wDb2OPwmfA16LiiaOHLj1edRLpkO3WmIis7+oBDgJbgQ2AH6gC6jY19N62RkcctKeVIJAhp9QgUA3kJXdONZVcq9JxPSgQoXRAyIDRth8oAXQyKdWnoCKrTD9CBv4GMqx1WGNZkeRWJKbG2hiD1Cb9FbTnzWFdY/LCdLKlgNQ84gyNKqHm0gDjqVHnxDHgA/B9RQkpaB6YklkZl62np9KBhOqwjpKFgeY2YAz4BESBWHI8Hhs6PVVSvc3v98ye4fP7T676B845nt040ip98qpWJmI9PWiU6bfWgXGN2YHcKwU7tsuc4kpUPMbU0+f8+vKt+Pitl7PLAMDI9cNBoB0hQwICzjqUp6MZvsy8yvp95BRuQUjJ75mPvH4wYo1NlJ64Mza7DPwrhi8cCOeXl/aUB4P4c/NJxKLMvpngycCrzxVFG2v/CwAMnguF80oLe8p27cQh+fnpPV/fTc95S6piXQDAw7a9YbWkezZXFbAwMx/xPFXb1D3+Y90AQF/L7kAsri9mZ4lrTd0TcYA/Kakr+x2JSPUAAAAASUVORK5CYII=",
	"Поиск на АМО"(addon, hideOn) {
		if (hideOn) return ["custombuttons", "theme", "plugin"];

		openURL(addon.homepageURL || (
			"https://addons.mozilla.org/search/?q=" + encodeURIComponent(addon.name)
		));
	},
	//------------------------------------------------------------------
	"Папка установки_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABAklEQVR42mNkoBAwAjEXEAcCMTsW+U9AvB6I/+I0gJ2Noe3QJoZKASEgjwkq+h+C795lYPCKZMgC8mZg0fsfbICIIMOcF6cZkrGZ/v8fA0PndIa/7z8BXfAPqgVKv//A8GPeZoYERmE+hjmP1+AwAOgiTjOIP7HZLyjLMJNRmB/ogjMMyYzsUC8wIhQwsgCFWHAHoKAy0AARIYY5r69idwEhIKgBMgAYBq8vkGmALsyAU2QaYAwz4CiZBliADBAAGnCATANsYQbsJtMAJ5ABwGh8uZE8A4R9gAYwMzHkT8hl6Bfgxp5ecIH3Xxj+F05hyIdpUmXAnpnwge9AfJckW7EBAC/gSzisxsnmAAAAAElFTkSuQmCC",
	"Папка установки"(addon, hideOn) {
		if (hideOn) return ["custombuttons", "theme", "plugin"];

		this.getFile(addon).reveal();
	},
	//------------------------------------------------------------------
	"Файл установки_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA51AAAOdQG5Y1EyAAAAhklEQVQ4y6WT0QnAIAxE78Bt2v1cod3PznP9kVLTRKUGBD+Sd5eQUBJWggCWCAkAJPGXOqlUPyVKkrSPQIoCQJGE6AF4HFyGuBmrR3cGQX8Wmp2cL8Cqv5JPD5Zm1D0nFZjTjHpQ7DuI1L3iBjBS9/pvhtjr21OukVkXiX/ug6SWj4mr53wDMz1vldHlLJkAAAAASUVORK5CYII=",
	"Файл установки"(addon, hideOn) {
		if (hideOn) return ["custombuttons", "theme", "plugin"];

		this.getFile(addon).launch();
	},
	//------------------------------------------------------------------
	getFile(addon) {
		var file, uri = addon.getResourceURI();
		if (uri instanceof Ci.nsIJARURI) uri = uri.JARFile;
		if (uri instanceof Ci.nsIFileURL) file = uri.file;
		return file;
	},
	url: "about:addons",
	handleEvent(e) {
		if (e.target.baseURI != this.url) return;
		var item = this.getItem(e.target.ownerDocument);
		var addon = item.addon = e.target.closest("addon-card").addon;
		
		for(var child of item.children) {
			var res = this[child.textContent](addon, true);
			child.hidden = Array.isArray(res)
				? res.includes(addon.type) : res;
		}
		e.target.contains(item)
			|| requestAnimationFrame(() => e.target.prepend(item));
	},
	click(e) {
		e.stopPropagation();
		iconizer.item.parentNode.hide();
		this[e.target.textContent](iconizer.item.addon);
	},
	getItem(doc) {
		if (iconizer.item) {
			if (iconizer.item.ownerDocument == doc) return iconizer.item;
			iconizer.handleEvent();
		}
		var item = doc.createElement("div");
		item.id = id;
		for(var lab of this.labels)
			item.appendChild(doc.createElement("panel-item")).append(lab);
		
		item.onclick = this.click;
		doc.ownerGlobal.addEventListener("unload", iconizer);
		return iconizer.item = item;
	},
	get labels() {
		delete this.labels;
		this.click = this.click.bind(this);
		if (id in g) return this.labels = (iconizer = g[id]).labs;

		g[id] = iconizer;
		var css = "", ind = 0, arr = [];
		var push = (ind, icon) => {
			var chromeImg = `chrome://custombuttons/content/${id + ind}`;
			arr.push(["override", chromeImg, icon]);
			return chromeImg;
		}
		var labs = iconizer.labs = Object.keys(this).filter(key => {
			var res = String(this[key]).startsWith('"');
			if (!res) return false;
			ind++;
			var icon = this[key + "_i"];
			if (icon) css += `\n\t#${
				id
			} > panel-item:nth-child(${ind}) {\n\t\t--icon: url(${
				push(ind, icon)
			}) !important;\n\t}`;
			return true;
		});
		var ams = Cc["@mozilla.org/addons/addon-manager-startup;1"].getService(Ci.amIAddonManagerStartup);
		var mUri = Services.io.getProtocolHandler("resource").getSubstitution("custombuttons-modules");

		var md = `@-moz-document url(${this.url}) {`;
		var uri = Services.io.newURI(`chrome://custombuttons/content/${id}.css`);
		arr.push(["override", uri.spec, "data:text/css;charset=utf-8," + encodeURIComponent(md + css + "\n}")]);
		iconizer.iconHelper = ams.registerChrome(mUri, arr);

		var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
		sss.loadAndRegisterSheet(uri, sss.USER_SHEET);

		iconizer.handleEvent = function() {
			if (!this.item) return;
			this.item.ownerGlobal.removeEventListener("unload", this);
			this.item.remove();
			this.item = null;
		}
		iconizer.destroy = function() {
			delete g[id];
			this.handleEvent();
			sss.unregisterSheet(uri, sss.USER_SHEET);
			this.iconHelper.destruct();
		}
		return this.labels = labs;
	}
}, true, gBrowser.tabpanels || 1))("CBAddonsMenuExt", Cu.import("resource://gre/modules/AddonManager.jsm", {}), {});

Отсутствует

 

№1537111-04-2021 22:18:27

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

Re: Custom Buttons

Andrey_Krropotkin
Как поможет? нет там "копировать url кнопки в буфер"...

Отредактировано ВВП (11-04-2021 23:07:10)

Отсутствует

 

№1537212-04-2021 00:58:11

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

Re: Custom Buttons

Stkvsky пишет

Подскажите как поставить Custom Buttons на 78

1) В папку, куда установлен Firefox, скопируй одноимённую папку из данного архива. (Костыли для FF)
2) ставь обычным способом расширение custom_buttons-0.0.7.0.0.17-fx-bootstrap.xpi

Отсутствует

 

№1537312-04-2021 02:33:32

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

Re: Custom Buttons

Dobrov
Благодарю

Отсутствует

 

№1537412-04-2021 08:32:55

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

Re: Custom Buttons

Dobrov пишет

Не могу исправить ошибку - код напрямую в кнопке работает, а обёрнутый в функцию нет!

По тем кускам непонятно, может this.switchToTab('about:config', e);


ВВП пишет

Не могу пункт добавить(копировать url кнопки)

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

Выделить код

Код:

((id, g, iconizer) => addDestructor(r => r[5] == "e" && id in g && g[id].destroy()) + addEventListener("showing", {
	//------------------------------------------------------------------
	"Копировать имя_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4jY2TTUhUURiGn5tD0Sp00iAwXM1iFu4kWkUZg/9MoZQhdoUCV7ooItq4atFORRGkuLMwoc0kNBGKDLSwFpEIQgspqGUUNsjI3HvPX4s7I3Nn7oW+1fn5vvd8z3vOsYiIgXuPneFMr21ZVmh9+m7GisoPxcTsM2d46on5c1gy9bHgvDVR+afqJzNzy870xIgNUJGGkqf4XVEAuJ4XeWCiNpibX3MGr/XYPd0pADxlOK0MQgf7Xw++sfJq0zRiJQAWcgWndHRkr28UWcrlAfCVwa8KrK4XOPxbYqz/MsnWcyfFi7lCIPD9x0/70YNRykKz+eELQkny74sIJbnQmqQ71UVhe+cES2hoP9uC63mBgO/7dF7s4NexZPRmBqlBaMPHnc+kL7UTh1VxqwKuGxjkaUP+zRZCSVqwKJeP2dvdj8SqGZuod9hXhr6hGwgNL5ZfEoc1PnaL2sFNAlvvthFKxmJJbfCUqXbghhHSyTOkJwcBmHr4vAnLVwKhJEPZbLgDXwh678yG7rfjfLIJS2qD0IEP9R6kiq8XrzS+sOz9p5+asKodXB0YCQkcNBbHYUXlxP6u67dnIj9PY8QJpIC2/6iX/wDxeTOAfNDrywAAAABJRU5ErkJggg==",
	"Копировать имя"(addon, hideOn) {
		if (hideOn) return false;

		gClipboard.write(addon.name);
	},
	//------------------------------------------------------------------
	"Копировать ID_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4jY2TTUhUURiGn5tD0Sp00iAwXM1iFu4kWkUZg/9MoZQhdoUCV7ooItq4atFORRGkuLMwoc0kNBGKDLSwFpEIQgspqGUUNsjI3HvPX4s7I3Nn7oW+1fn5vvd8z3vOsYiIgXuPneFMr21ZVmh9+m7GisoPxcTsM2d46on5c1gy9bHgvDVR+afqJzNzy870xIgNUJGGkqf4XVEAuJ4XeWCiNpibX3MGr/XYPd0pADxlOK0MQgf7Xw++sfJq0zRiJQAWcgWndHRkr28UWcrlAfCVwa8KrK4XOPxbYqz/MsnWcyfFi7lCIPD9x0/70YNRykKz+eELQkny74sIJbnQmqQ71UVhe+cES2hoP9uC63mBgO/7dF7s4NexZPRmBqlBaMPHnc+kL7UTh1VxqwKuGxjkaUP+zRZCSVqwKJeP2dvdj8SqGZuod9hXhr6hGwgNL5ZfEoc1PnaL2sFNAlvvthFKxmJJbfCUqXbghhHSyTOkJwcBmHr4vAnLVwKhJEPZbLgDXwh678yG7rfjfLIJS2qD0IEP9R6kiq8XrzS+sOz9p5+asKodXB0YCQkcNBbHYUXlxP6u67dnIj9PY8QJpIC2/6iX/wDxeTOAfNDrywAAAABJRU5ErkJggg==",
	"Копировать ID"(addon, hideOn) {
		if (hideOn) return false;

		gClipboard.write(addon.id);
	},
	//------------------------------------------------------------------
	"Копировать версию_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4jY2TTUhUURiGn5tD0Sp00iAwXM1iFu4kWkUZg/9MoZQhdoUCV7ooItq4atFORRGkuLMwoc0kNBGKDLSwFpEIQgspqGUUNsjI3HvPX4s7I3Nn7oW+1fn5vvd8z3vOsYiIgXuPneFMr21ZVmh9+m7GisoPxcTsM2d46on5c1gy9bHgvDVR+afqJzNzy870xIgNUJGGkqf4XVEAuJ4XeWCiNpibX3MGr/XYPd0pADxlOK0MQgf7Xw++sfJq0zRiJQAWcgWndHRkr28UWcrlAfCVwa8KrK4XOPxbYqz/MsnWcyfFi7lCIPD9x0/70YNRykKz+eELQkny74sIJbnQmqQ71UVhe+cES2hoP9uC63mBgO/7dF7s4NexZPRmBqlBaMPHnc+kL7UTh1VxqwKuGxjkaUP+zRZCSVqwKJeP2dvdj8SqGZuod9hXhr6hGwgNL5ZfEoc1PnaL2sFNAlvvthFKxmJJbfCUqXbghhHSyTOkJwcBmHr4vAnLVwKhJEPZbLgDXwh678yG7rfjfLIJS2qD0IEP9R6kiq8XrzS+sOz9p5+asKodXB0YCQkcNBbHYUXlxP6u67dnIj9PY8QJpIC2/6iX/wDxeTOAfNDrywAAAABJRU5ErkJggg==",
	"Копировать версию"(addon, hideOn) {
		if (hideOn) return ["custombuttons"];

		gClipboard.write(addon.version);
	},
	//------------------------------------------------------------------
	"Копировать имя и версию_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4jY2TTUhUURiGn5tD0Sp00iAwXM1iFu4kWkUZg/9MoZQhdoUCV7ooItq4atFORRGkuLMwoc0kNBGKDLSwFpEIQgspqGUUNsjI3HvPX4s7I3Nn7oW+1fn5vvd8z3vOsYiIgXuPneFMr21ZVmh9+m7GisoPxcTsM2d46on5c1gy9bHgvDVR+afqJzNzy870xIgNUJGGkqf4XVEAuJ4XeWCiNpibX3MGr/XYPd0pADxlOK0MQgf7Xw++sfJq0zRiJQAWcgWndHRkr28UWcrlAfCVwa8KrK4XOPxbYqz/MsnWcyfFi7lCIPD9x0/70YNRykKz+eELQkny74sIJbnQmqQ71UVhe+cES2hoP9uC63mBgO/7dF7s4NexZPRmBqlBaMPHnc+kL7UTh1VxqwKuGxjkaUP+zRZCSVqwKJeP2dvdj8SqGZuod9hXhr6hGwgNL5ZfEoc1PnaL2sFNAlvvthFKxmJJbfCUqXbghhHSyTOkJwcBmHr4vAnLVwKhJEPZbLgDXwh678yG7rfjfLIJS2qD0IEP9R6kiq8XrzS+sOz9p5+asKodXB0YCQkcNBbHYUXlxP6u67dnIj9PY8QJpIC2/6iX/wDxeTOAfNDrywAAAABJRU5ErkJggg==",
	"Копировать имя и версию"(addon, hideOn) {
		if (hideOn) return ["custombuttons"];

		gClipboard.write(addon.name + " " + addon.version);
	},
	//------------------------------------------------------------------
	"Копировать URL кнопки_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4jY2TTUhUURiGn5tD0Sp00iAwXM1iFu4kWkUZg/9MoZQhdoUCV7ooItq4atFORRGkuLMwoc0kNBGKDLSwFpEIQgspqGUUNsjI3HvPX4s7I3Nn7oW+1fn5vvd8z3vOsYiIgXuPneFMr21ZVmh9+m7GisoPxcTsM2d46on5c1gy9bHgvDVR+afqJzNzy870xIgNUJGGkqf4XVEAuJ4XeWCiNpibX3MGr/XYPd0pADxlOK0MQgf7Xw++sfJq0zRiJQAWcgWndHRkr28UWcrlAfCVwa8KrK4XOPxbYqz/MsnWcyfFi7lCIPD9x0/70YNRykKz+eELQkny74sIJbnQmqQ71UVhe+cES2hoP9uC63mBgO/7dF7s4NexZPRmBqlBaMPHnc+kL7UTh1VxqwKuGxjkaUP+zRZCSVqwKJeP2dvdj8SqGZuod9hXhr6hGwgNL5ZfEoc1PnaL2sFNAlvvthFKxmJJbfCUqXbghhHSyTOkJwcBmHr4vAnLVwKhJEPZbLgDXwh678yG7rfjfLIJS2qD0IEP9R6kiq8XrzS+sOz9p5+asKodXB0YCQkcNBbHYUXlxP6u67dnIj9PY8QJpIC2/6iX/wDxeTOAfNDrywAAAABJRU5ErkJggg==",
	ncb: (arr => (arr.includes = arg => arg != "custombuttons") && arr)([]),
	"Копировать URL кнопки"(addon, hideOn) {
		if (hideOn) return this.ncb;

		var btn = Object.assign({
			parameters: {},
			get initcode() {return this.initCode;},
			setText(doc, name, t, cds) {
				custombutton.buttonSetText(doc, name, this[name], cds);
			}
		}, custombuttons.cbService.getButtonParameters(addon.buttonLink));
		gClipboard.write(custombutton.buttonGetURI(btn));
	},
	//------------------------------------------------------------------
	"Домашняя страница_i": "data:image/png;base64,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",
	"Домашняя страница"(addon, hideOn) {
		if (hideOn) return !addon.homepageURL && !addon.reviewURL;
		
		openURL(addon.homepageURL || addon.reviewURL.replace(/\/reviews\/.*$/, "/"));
	},
	//------------------------------------------------------------------
	"Поиск на АМО_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJGSURBVDjLjdJLSNRBHMDx78yqLZaKS75DPdgDDaFDbdJmde5QlhCJGxgpRJfqEEKnIsJLB7skQYQKZaSmdLaopPCgEvSCShCMzR5a7oq7/3l12RVtjfzBMA/4fWZ+MyOccwBM3g8HEbIdfCEhfAFnLVapOa28Uevpjrqz/WOsERJgsu9Uq5CZQzgqrJfo9BajNd5irEYn4p3OUiFExtCLmw2tawFi4l5zUMjMIau9u7K+qxeoAcoAA0wDb2OPwmfA16LiiaOHLj1edRLpkO3WmIis7+oBDgJbgQ2AH6gC6jY19N62RkcctKeVIJAhp9QgUA3kJXdONZVcq9JxPSgQoXRAyIDRth8oAXQyKdWnoCKrTD9CBv4GMqx1WGNZkeRWJKbG2hiD1Cb9FbTnzWFdY/LCdLKlgNQ84gyNKqHm0gDjqVHnxDHgA/B9RQkpaB6YklkZl62np9KBhOqwjpKFgeY2YAz4BESBWHI8Hhs6PVVSvc3v98ye4fP7T676B845nt040ip98qpWJmI9PWiU6bfWgXGN2YHcKwU7tsuc4kpUPMbU0+f8+vKt+Pitl7PLAMDI9cNBoB0hQwICzjqUp6MZvsy8yvp95BRuQUjJ75mPvH4wYo1NlJ64Mza7DPwrhi8cCOeXl/aUB4P4c/NJxKLMvpngycCrzxVFG2v/CwAMnguF80oLe8p27cQh+fnpPV/fTc95S6piXQDAw7a9YbWkezZXFbAwMx/xPFXb1D3+Y90AQF/L7kAsri9mZ4lrTd0TcYA/Kakr+x2JSPUAAAAASUVORK5CYII=",
	"Поиск на АМО"(addon, hideOn) {
		if (hideOn) return ["custombuttons", "theme", "plugin"];

		openURL(addon.homepageURL || (
			"https://addons.mozilla.org/search/?q=" + encodeURIComponent(addon.name)
		));
	},
	//------------------------------------------------------------------
	"Папка установки_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABAklEQVR42mNkoBAwAjEXEAcCMTsW+U9AvB6I/+I0gJ2Noe3QJoZKASEgjwkq+h+C795lYPCKZMgC8mZg0fsfbICIIMOcF6cZkrGZ/v8fA0PndIa/7z8BXfAPqgVKv//A8GPeZoYERmE+hjmP1+AwAOgiTjOIP7HZLyjLMJNRmB/ogjMMyYzsUC8wIhQwsgCFWHAHoKAy0AARIYY5r69idwEhIKgBMgAYBq8vkGmALsyAU2QaYAwz4CiZBliADBAAGnCATANsYQbsJtMAJ5ABwGh8uZE8A4R9gAYwMzHkT8hl6Bfgxp5ecIH3Xxj+F05hyIdpUmXAnpnwge9AfJckW7EBAC/gSzisxsnmAAAAAElFTkSuQmCC",
	"Папка установки"(addon, hideOn) {
		if (hideOn) return ["custombuttons", "theme", "plugin"];

		this.getFile(addon).reveal();
	},
	//------------------------------------------------------------------
	"Файл установки_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA51AAAOdQG5Y1EyAAAAhklEQVQ4y6WT0QnAIAxE78Bt2v1cod3PznP9kVLTRKUGBD+Sd5eQUBJWggCWCAkAJPGXOqlUPyVKkrSPQIoCQJGE6AF4HFyGuBmrR3cGQX8Wmp2cL8Cqv5JPD5Zm1D0nFZjTjHpQ7DuI1L3iBjBS9/pvhtjr21OukVkXiX/ug6SWj4mr53wDMz1vldHlLJkAAAAASUVORK5CYII=",
	"Файл установки"(addon, hideOn) {
		if (hideOn) return ["custombuttons", "theme", "plugin"];

		this.getFile(addon).launch();
	},
	//------------------------------------------------------------------
	getFile(addon) {
		var file, uri = addon.getResourceURI();
		if (uri instanceof Ci.nsIJARURI) uri = uri.JARFile;
		if (uri instanceof Ci.nsIFileURL) file = uri.file;
		return file;
	},
	url: "about:addons",
	handleEvent(e) {
		if (e.target.baseURI != this.url) return;
		var card = e.target.closest("addon-card");
		if (!card) return;
		var item = this.getItem(e.target.ownerDocument);
		var addon = item.addon = card.addon;
		
		for(var child of item.children) {
			var res = this[child.textContent](addon, true);
			child.hidden = Array.isArray(res)
				? res.includes(addon.type) : res;
		}
		e.target.contains(item)
			|| requestAnimationFrame(() => e.target.prepend(item));
	},
	click(e) {
		e.stopPropagation();
		iconizer.item.parentNode.hide();
		this[e.target.textContent](iconizer.item.addon);
	},
	getItem(doc) {
		if (iconizer.item) {
			if (iconizer.item.ownerDocument == doc) return iconizer.item;
			iconizer.handleEvent();
		}
		var item = doc.createElement("div");
		item.id = id;
		for(var lab of this.labels)
			item.appendChild(doc.createElement("panel-item")).append(lab);
		
		item.onclick = this.click;
		doc.ownerGlobal.addEventListener("unload", iconizer);
		return iconizer.item = item;
	},
	get labels() {
		delete this.labels;
		this.click = this.click.bind(this);
		if (id in g) return this.labels = (iconizer = g[id]).labs;

		g[id] = iconizer;
		var css = "", ind = 0, arr = [];
		var push = (ind, icon) => {
			var chromeImg = `chrome://custombuttons/content/${id + ind}`;
			arr.push(["override", chromeImg, icon]);
			return chromeImg;
		}
		var labs = iconizer.labs = Object.keys(this).filter(key => {
			var res = String(this[key]).startsWith('"');
			if (!res) return false;
			ind++;
			var icon = this[key + "_i"];
			if (icon) css += `\n\t#${
				id
			} > panel-item:nth-child(${ind}) {\n\t\t--icon: url(${
				push(ind, icon)
			}) !important;\n\t}`;
			return true;
		});
		var ams = Cc["@mozilla.org/addons/addon-manager-startup;1"].getService(Ci.amIAddonManagerStartup);
		var mUri = Services.io.getProtocolHandler("resource").getSubstitution("custombuttons-modules");

		var md = `@-moz-document url(${this.url}) {`;
		var uri = Services.io.newURI(`chrome://custombuttons/content/${id}.css`);
		arr.push(["override", uri.spec, "data:text/css;charset=utf-8," + encodeURIComponent(md + css + "\n}")]);
		iconizer.iconHelper = ams.registerChrome(mUri, arr);

		var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
		sss.loadAndRegisterSheet(uri, sss.USER_SHEET);

		iconizer.handleEvent = function() {
			if (!this.item) return;
			this.item.ownerGlobal.removeEventListener("unload", this);
			this.item.remove();
			this.item = null;
		}
		iconizer.destroy = function() {
			delete g[id];
			this.handleEvent();
			sss.unregisterSheet(uri, sss.USER_SHEET);
			this.iconHelper.destruct();
		}
		return this.labels = labs;
	}
}, true, gBrowser.tabpanels || 1))("CBAddonsMenuExt", Cu.import("resource://gre/modules/AddonManager.jsm", {}), {});

Отредактировано Dumby (12-04-2021 08:33:21)

Отсутствует

 

№1537512-04-2021 09:56:48

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

Re: Custom Buttons

Dumby пишет

По тем кускам непонятно, может this.switchToTab('about:config', e);

Конкретный код - это твоя (с небольшими правками) кнопка QuickToggleAbout
Насколько я понимаю, здесь «e» это один и тот же объект, который передаётся в функцию: switchToTab(url, e)
e.view.switchToTabHavingURI - почему же в функции нет открытия таба, а в втором коде command(e) вкладка открывается?

Выделить код

Код:

switchToTab(url, e){ // в функции не работает
	e.view.switchToTabHavingURI(url, true, { ============== конец функции
command(e) { // нажатия мыши >>>>
    e.view.switchToTabHavingURI(url, true, { // так открывается
…………
    switchToTab(url, e); // а так не работает

Отредактировано Dobrov (12-04-2021 09:59:27)

Отсутствует

 

Board footer

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