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

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№1722608-02-2025 15:17:48

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

Re: Custom Buttons

Garalf пишет

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

А чего это там код
два раза два раза
повторяется?


Исправь, если у тебя так.


А правка, может такую попробуй

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

Выделить код

Код:

/*
mp.setAttribute("onpopupshowing", "this.updateMenu();");
mp.setAttribute("oncommand", "if(!event.button) this.handleEvent(event);"); // Ignore middle-click in Firefox 89+
mp.setAttribute("onmousedown", "if(event.button == 0) this.handleEvent(event);");
mp.setAttribute("onclick", "if(event.button > 0) this.handleEvent(event);");
mp.setAttribute("oncontextmenu", "return false;");
mp.setAttribute("onpopuphidden", "this.destroyMenu();");
*/
addEventListener("popupshowing", () => mp.updateMenu(), false, mp);
addEventListener("command", mp.onmousedown = mp.onclick = e => {
	if (!e.button || e.type.endsWith("k")) mp.handleEvent(e);
}, false, mp);
mp.toggleAttribute("context");
addEventListener("popuphidden", () => mp.destroyMenu(), false, mp);

Отсутствует

 

№1722708-02-2025 21:22:48

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

Re: Custom Buttons

Dumby
Спасибо! Кнопка заработала.
Огромная просьба. Посмотри еще раз код
Дополнительные пункты в контекстном меню кнопки из моего
предыдущего поста. Очень полезная кнопка. Твоя правка к сожалению не сработала.
Ни один пункт меню не работает.

Отредактировано Garalf (08-02-2025 23:31:32)

Отсутствует

 

№1722809-02-2025 21:47:01

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

Re: Custom Buttons

Garalf пишет

Огромная просьба. Посмотри еще раз код
Дополнительные пункты в контекстном меню кнопки

Посмотрел.
На сей раз на 137.0a1 (2025-02-09).


Создал кнопку с предоставленным кодом инициализации.
Сделал предложенные правки. Рестарт.


Пункты «Показать Id кнопки» и «Переместить кнопку...» точно работают.
Остальные не проверял, поскольку, таким образом, утверждение
«Ни один пункт меню не работает» уже не подтвердилось.

Отсутствует

 

№1722909-02-2025 23:58:26

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

Re: Custom Buttons

Dumby
Да, все верно. Перегрузил лису и кнолка зареботала.

Dumby пишет

Остальные не проверял

Проверь пожалуйста пункт меню Редактирование кнопки.
У меня не работает.

Отсутствует

 

№1723010-02-2025 09:59:59

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

Re: Custom Buttons

Garalf пишет

Проверь пожалуйста пункт меню Редактирование кнопки.

Это не представляется возможным,
поскольку меня такого пункта вообще нет.


Есть пункт «Редактировать…».
#custombuttons-contextpopup-edit,
ну тот, который самый первый сверху.


Но этот пункт не из добавляемых кодом, а пункт самого расширения.


Если имееется в виду именно он, и если не работает именно он,
то, может, обновление встало криво,
или startupCache при этом, после рестарта не очистился,
или, даже не знаю что ещё.

Отсутствует

 

№1723111-02-2025 10:18:29

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

Re: Custom Buttons

Dumby
Раз теме тишина попрошу полечить еще одну кнопку.
UserCSSLoader

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

Выделить код

Код:

(obj => {
    this.onclick = obj.click.bind(obj);
    this.oncontextmenu = obj.contextmenu.bind(obj);
    this.tooltipText = "L: Reload userChrome.css\nM: CB Menu\nR: Reload userContent.css";
})({
    async click(e) {
        if (e.button == 1) return gShowPopup(self);
        if (e.button || !this.chromeSheet) return;
        await this.reload(this.chromeSheet);
        this.restyle(0);
    },
    async contextmenu(e) {
        if (e.ctrlKey || e.shiftKey || e.detail != 1 || !this.contentSheetURL) return;
        e.preventDefault();

        var count = Services.ppmm.childCount, one = count == 1;
        var data = await this.reloadTab("chrome://extensions/content/dummy.xul", one ? false : {});
        if (one) this.reloadTab();
        else if (data) {
            var url = "data:," + encodeURIComponent(
                self.Help + this.contentSheetURL + '", ' + JSON.stringify(data) + ");"
            );
            var types = ["web", "file", "extension"];
            for(var ind = 0; ind < count; ind++) {
                var child = Services.ppmm.getChildAt(ind);
                types.includes(child.remoteType) && child.loadProcessScript(url, false);
            }
        }
        this.restyle(250);
    },
    async reload(sheet, obj) {
        try {var style = await (await fetch(sheet.href)).text();}
        catch (ex) {return obj;}
        InspectorUtils.parseStyleSheet(sheet, style);
        if (obj) obj[sheet.href] = style;
        for(var ind = 0, len = sheet.cssRules.length; ind < len; ind++) {
            var rule = sheet.cssRules.item(ind);

            rule.type == rule.IMPORT_RULE
            && rule.styleSheet.href.startsWith("file:///")
            && await this.reload(rule.styleSheet, obj);
        }
        return obj;
    },
    reloadTab(url, obj) {
        var tab = gBrowser.addTab(url, {skipAnimation: true});
        tab.style.setProperty("display", "none", "important");
        return new Promise(resolve => {
            var result, stop, destroy = () => {
                if (!stop) resolve(result), gBrowser.removeTab(tab), stop = true;
            }
            setTimeout(destroy, 500);
            try {
                tab.linkedBrowser.addEventListener("DOMContentLoaded", async e => {
                    var sheet = this.getSheet(e.target, this.contentSheetURL);
                    if (sheet) result = await this.reload(sheet, obj);
                    destroy();
                }, {once: true});
            } catch(ex) {
                destroy();
            }
        });
    },
    getSheet(doc, href) {
        var sheets = InspectorUtils.getAllStyleSheets(doc);
        return sheets.find(sheet => sheet.href == href);
    },
    get contentSheetURL() {
        var file = Services.dirsvc.get("UChrm", Ci.nsIFile);
        file.append("userContent.css");
        if (!file.exists()) return null;
        delete this.contentSheetURL;
        return this.contentSheetURL = Services.io.newFileURI(file).spec;
    },
    get restyle() {
        var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
        var uri = Services.io.newURI("data:text/css,:root{}"), type = sss.USER_SHEET;
        delete this.restyle; return this.restyle = delay => setTimeout(() => {
            sss.loadAndRegisterSheet(uri, type);
            sss.unregisterSheet(uri, type);
        }, delay);
    },
    get chromeSheet() {
        var file = Services.dirsvc.get("UChrm", Ci.nsIFile);
        file.append("userChrome.css");
        if (!file.exists()) return null;

        var href = Services.io.newFileURI(file).spec;
        var sheet = this.getSheet(document, href);
        if (!sheet) return null;

        delete this.chromeSheet; return this.chromeSheet = sheet;
    }
});

Напомню - это 136.b3  Кстати, пункт меню Edit в контекстном меню кнопки
неожиданно заработал.

Отредактировано Garalf (11-02-2025 10:19:25)

Отсутствует

 

№1723211-02-2025 14:47:20

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

Re: Custom Buttons

Garalf пишет

еще одну кнопку

Содержимое вкладки «Справка» предлагается угадать?

Отсутствует

 

№1723311-02-2025 16:27:54

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

Re: Custom Buttons

Dumby
Справка

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

Выделить код

Код:

((href, data) => {
	var en = Services.ww.getWindowEnumerator(null);
	if (!en.hasMoreElements()) return;
	var doc = en.getNext().document;

	var du = Components.classes["@mozilla.org/inspector/dom-utils;1"]
		.getService(Components.interfaces.inIDOMUtils);
	var reload = sheet => {
		var style = data[sheet.href]; if (!style) return;

		du.parseStyleSheet(sheet, style);
		for(var ind = 0, len = sheet.cssRules.length; ind < len; ind++) {
			var rule = sheet.cssRules.item(ind);

			rule.type == rule.IMPORT_RULE
			&& rule.styleSheet.href.startsWith("file:///")
			&& reload(rule.styleSheet);
		}
	}
	var sheet = du.getAllStyleSheets(doc).find(sheet => sheet.href == href);
	if (sheet) reload(sheet);
})("

Отсутствует

 

№1723412-02-2025 11:36:42

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

Re: Custom Buttons

Garalf пишет

Справка

Другое дело.

Напомню - это 136.b3

Что-то я не вижу в кнопке
ни использования «on…» атрибутов, ни импорта модулей.


Но многовато чего-то совсем древнего,
поэтому попробую чуть переделать.
Код со Справки перенёс в Инициализацию.

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

Выделить код

Код:

(code => {
	this._handleClick = () => {
		var href = getHref("hrome");
		if (!href) return;
		var sheet = getSheet(document, href);
		sheet && (this._handleClick = () => reload(sheet).then(restyle))();
	}
	this.onauxclick = e => e.button > 1 || gShowPopup(this);
	this.oncontextmenu = e => {
		if (e.ctrlKey || e.shiftKey || e.detail != 1) return;
		e.preventDefault();
		reloadContentSheet();
	}
	this.tooltipText = "L: Reload userChrome.css\nM: CB Menu\nR: Reload userContent.css";

	var getHref = str => {
		var file = Services.dirsvc.get("UChrm", Ci.nsIFile);
		file.append(`userC${str}.css`);
		if (file.exists()) return Services.io.newFileURI(file).spec;
	}
	var getSheet = (doc, href) =>
		InspectorUtils.getAllStyleSheets(doc).find(sheet => sheet.href == href);

	var reload = async (sheet, obj) => {
		try {var style = await (await fetch(sheet.href)).text();}
		catch {return obj;}

		InspectorUtils.parseStyleSheet(sheet, style);
		if (obj) obj[sheet.href] = style;
		for(var ind = 0, len = sheet.cssRules.length; ind < len; ind++) {
			var rule = sheet.cssRules.item(ind);

			rule.type == rule.IMPORT_RULE
			&& rule.styleSheet.href.startsWith("file:///")
			&& await reload(rule.styleSheet, obj);
		}
		return obj;
	}
	var restyle = delay => {
		var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
		var uri = Services.io.newURI("data:text/css,:root{}"), type = sss.USER_SHEET;
		var regUnreg = () => {
			sss.loadAndRegisterSheet(uri, type);
			sss.unregisterSheet(uri, type);
		};
		(restyle = delay => setTimeout(regUnreg, delay))(delay);
	}
	var reloadContentSheet = async () => {
		var href = getHref("ontent");
		if (!href) return;

		var {br} = this;
		if (!br) {
			br = this.br = document.createXULElement("browser");
			br.setAttribute("type", "content");
			this.append(br);
			await new Promise(resolve => br.addEventListener("pageshow", resolve, {once: true}));
		}
		var sheet = getSheet(br.contentDocument, href);
		if (!sheet) return;

		br.remove();
		delete this.br;
		var {ppmm} = Services;
		var re = /^(?:web|file|extension|privileged)/;
		var prfx = "data:," + encodeURIComponent(code.trim() + sheet.href + '", ');

		(reloadContentSheet = async () => {
			var data = await reload(sheet, Object.create(null));
			var url = prfx + encodeURIComponent(JSON.stringify(data)) + ");"
			for(var ind = 0, count = ppmm.childCount; ind < count; ind++) {
				var child = ppmm.getChildAt(ind);
				re.test(child.remoteType) && child.loadProcessScript(url, false);
			}
			restyle(350);
		})();
	}
})(`

((href, data) => {
	var en = Services.ww.getWindowEnumerator(null);
	if (!en.hasMoreElements()) return;

	var doc = en.getNext().document;

	var reload = sheet => {
		var style = data[sheet.href];
		if (!style) return;

		InspectorUtils.parseStyleSheet(sheet, style);
		for(var ind = 0, len = sheet.cssRules.length; ind < len; ind++) {
			var rule = sheet.cssRules.item(ind);

			rule.type == rule.IMPORT_RULE
			&& rule.styleSheet.href.startsWith("file:///")
			&& reload(rule.styleSheet);
		}
	}
	var sheet = InspectorUtils.getAllStyleSheets(doc).find(sheet => sheet.href == href);
	sheet && reload(sheet);
})("
`);

Отсутствует

 

Board footer

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