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

В мире Mozilla происходит много интересных событий. Но вам не нужно постоянно посещать новостные сайты, чтобы быть в курсе всех изменений. Зайдите на ленту новостей Mozilla Россия.

№1722608-02-2025 15:17:48

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

Re: Custom Buttons

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

Dumby пишет

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

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

Отсутствует

 

№1723010-02-2025 09:59:59

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

Re: Custom Buttons

Garalf пишет

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

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


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


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


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

Отсутствует

 

№1723111-02-2025 10:18:29

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

Re: Custom Buttons

Garalf пишет

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

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

Отсутствует

 

№1723311-02-2025 16:27:54

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

Отсутствует

 

№17235Вчера 18:00:22

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

Re: Custom Buttons

Dumby
Нашел еще две удобные неработающие кнопки
1. "Два в одном"

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

Выделить код

Код:

//Настройка функций кликов мыши для кнопки ....................
this.onclick =e=> {if(e.button==0)BrowserOpenAddonsMgr();//ЛКМ
                   if(e.button==1)gShowPopup(this);      //СКМ
                   if(e.button==2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){//ПКМ
                   setTimeout(function(){document.getElementById("custombuttons-contextpopup").hidePopup();},0);openPreferences();}};
                   this.tooltipText="Л: Addons\nС: CBMenu\nП: Preferences";
//data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAMJSURBVDiNdVPNa1N5FD2/30uMeX1IPjFmE3BKERdhRKqgwyBqibsuZqGYRRf2H3Ax0J28je22XcRCwwhNKh0ki24GSn20iE3TNMKjONKkHyYUokmbMR++F/Oa966baUkVL9zNvfdc7jmHy4gIP4uFhcUFABgejgz/dIiITjKZTF3JZtXKzEziPgC+tbV3tLW1dwSAz8wk7mezaiWZTF3pxZxaEI2O3mk2NSoWy918/kO73e5Qu92hQuFDu1gsd5tNjaLR0Tu9GEZEiMdf/Orz+Ry6rndu3rz21u/3ciLCp08VAEAgcB6MMRwc1KzV1exVURQdh4eHndHRhyoDwBYXX38Mhy+f17S26fW6hHR6HUtLKzBNEwAgCAKGhm7hxo3rqNXqZl+fU9jcfF+JRH6/wImIEolZeX+/bElSn5DLqUins0TUKXBuRDk3okSdQjqdpVxOhST1Cfv7ZSuRmJXpRAiAK0pGL5UqNDUVt2T5ab6XJxFBlp/mp6biVqlUIUVZ0wFwIgKfnIwnl5fXW8FgwKlpOiRJZB6PW/7eLY/HLUuSyDRNRzB4wbm8vN6anIwnbaq6yTWtaw+FfoHLJcHn8+PsWdsPdnu9XkiSG3t7H1Gvf0GptGvf3n7PTyiMj0+35uaWqFAoWoqy8gMFRVnJFwpFa35eofHx6dYxBRsAxGKz94jsgig6oOsGGxi41K+qm3nLIhkAOGdPBgYu9TcaGjt3ToTH4xZisdl7AP7hjDFWLldjLpfHqesNq15v4etXg4dCF/sDgeBcIBCcC4Uu9h8ddXmzqUHXm5bf73dWq7UYY4zZiIgikeEHq6uvXA6Hvf748Z9vOh2XcHBQ46LoAGMMnz/XuWmaMIwv5vPnz34zDMNltzvqRESs95mmp/+6Ojh4faPR+K9rWQaFw+EzjDG8e/evYbefYW63z5bJpAcfPRp5e4zhvUpnMmlbLpepplJ/jwwN3XXu7u5oOzvb2u3bt5wvX86PbGysVTOZtVMWnboAABhjjP4vTkxMpABgbGzsj+97x/ENhTvQG3f/6bsAAAAASUVORK5CYII=
//forum.mozilla-russia.org/viewtopic.php?pid=704725#p704725
//openWebPanel("Downloads","about:downloads");


Страница настроек - вызывается, расширения - нет.


2. Поиск по изображению

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

Выделить код

Код:

/*Initialization Code*/
// Добавить подменю "Поиск изображения в" в контекстном меню изображений, от 31.05.2019. .............
(()=> {
   var copyimage = document.getElementById("context-copyimage-contents");
   var contextMenu = copyimage.parentNode;

    var array = [
      ['Google', 'https://www.google.lv/favicon.ico', 'http://www.google.com/searchbyimage?image_url='],
      ['Яндекс', 'http://yastatic.net/morda-logo/i/favicon_islands.ico', 'https://yandex.com/images/search?rpt=imageview&img_url='],
      ['Bing', 'https://www.bing.com/s/a/bing_p.ico', 'https://www.bing.com/images/searchbyimage?FORM=IRSBIQ&cbir=sbi&imgurl='],
      ['Tineye', 'http://tineye.com/favicon.ico', 'http://tineye.com/search?pluginver=bookmark_1.0&url='],
      ['SauceNao', 'https://saucenao.com/favicon.ico', 'https://saucenao.com/search.php?url='],
      ['IQDB', 'https://iqdb.org/favicon.ico', 'https://iqdb.org/?url='],
   ];
   var menu = contextMenu.insertBefore(document.createXULElement("menu"), copyimage); 
   menu.setAttribute("label", "Поиск изображения в ...");
   menu.setAttribute("class", "menu-iconic");
   
   
   menu.onclick =e=> { e.target.nodeName == 'menu' && search(array[0][2]); setTimeout(()=> contextMenu.hidePopup(), 20) };
   addEventListener("popupshowing", ()=> menu.hidden = copyimage.hidden, true, contextMenu);
    addDestructor(() => menu.remove());
   var menuPopup = menu.appendChild(document.createXULElement("menupopup"));              
   array.forEach(m=> {
      var mItem = menuPopup.appendChild(document.createXULElement("menuitem"));
      mItem.setAttribute("label", m[0]);       
      mItem.setAttribute("image", m[1]);
      mItem.setAttribute("class", "menuitem-iconic");
      mItem.onclick =()=> search(m[2]);
   });
  function search(finder) { gBrowser.selectedTab = gBrowser.addTrustedTab(finder + encodeURIComponent(gContextMenu.imageURL)) };
  
   var mItem = menuPopup.appendChild(document.createXULElement("menuitem"));
   mItem.setAttribute("label", 'Искать во всех поисковиках');
     mItem.setAttribute("class","menuitem-iconic");
        mItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADZElEQVR42oXSe0xbVRwH8N8597a35e7SAmUFukGhY66AMiNzw4GvTCQLCssc4pQsmTOa+ERMlrktW1zigpnEuWn8x2eMmiVGMBDCFjS+cJHEDIk8RoSNV1+3tLWX3t72nnO8sETJFrfvP7/k5Pw+Ob9fDoLrYi8ow9GFUbq+5aRLrGraqQcX6hlF2wkFEWn6EDIJAyQy9+3VT58cWb6PrmvmjGZS/FSHlxbXtbtLobGqJlPKMhNepWb0V8hKpi8FNd/gzCCogbdmvtg/8C9gz9+Eor5x5nn2tDOZ98Dx2i3C/uYai9mOGCxiDQIIg1/PgUCEhyvDMox9PXYBkPzaaoAzAFL0yle7ShtqO/eWJ9w1vJ1oGsVzYhTNATMQG4Q1G40ldDw6PB339fs7VgMmA0jnHfioo6F9Z3tDYYJzKSZKMYcDvAILiICfZUNYEYFixMKpKBk8MfTTasBsACnngU/6Wg4+VL/VFSOmBHAYY1BAhzAvgmyMEIkh0EUOBD1Eu49eStwA5D3z4TcPv9TYdHvxEhXSGgaEIMkJkKAS+ONmSKYolOVqMBlRSd8bv8v/AQXlJoiHUE5rZ1tFa/Nhj1uVrCaNMoQxYSaIqDxAGqAuQ2XZ1iS8HUTpkZMXe1eATOdtiCcJblGe1a3PnWp0uEvfv3tbeX5RhSet/q3wxh6xgAncZUmw2hxEryQx9/LHE7I2RV5HNudGFAtcZsuQd919u/kiz56JOwobcjd6xerqKnB4HIB4RvMzCM1DGj8X0GD64pL2Xdf850z+4djKC8wl24XUpj1P75sdfe/+sSHoq3uQnSuwa+s2Vy5uubd2jQWUTAYchJK8HpyIzvv7p/rMkV/OzPeeGEWi+x6LufiR573h8VO7Zr4n9fEZNeiqXHOofFvPsKPkS1fKsX5JU6uNZQh8Wh/hRcuvOC3/fLXrcGj52yOo7zzU9udvbzbN9uglggK2MhsnvfiE0tY9tfed7vM98D+x53tx1DdG0Z2b97Ejf3SRSiGGCysyENvdoipZa4+/8NmPp8+N+Ei2ZEVpQhG71rdcqFFozD+xcoQugFUvlDS8wWsl8Uebk5C79ujjHwyc6R/309ysDBRauEzhJkG9ErAdG0xEe6yVkwqcr+549/zZgcmQ7pAEkH2TDG6RfwCoJI0uEWJP5QAAAABJRU5ErkJggg==");   
   mItem.onclick =()=> { array.forEach(m=> {  gBrowser.selectedTab = gBrowser.addTrustedTab(m[2] + encodeURIComponent(gContextMenu.imageURL)) }) };
  
})();

var style = custombutton.buttonGetHelp(self).replace(/id/g, _id);
var uri = makeURI('data:text/css,'+ encodeURIComponent(style));
var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
sss.loadAndRegisterSheet(uri, 0);

Отредактировано Garalf (Вчера 18:45:49)

Отсутствует

 

№17236Вчера 18:55:55

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

Re: Custom Buttons

Garalf пишет

Страница настроек - вызывается, расширения - нет.

BrowserOpenAddonsMgr
BrowserAddonUI.openAddonsMgr

2. Поиск по изображению

Может (в двух местах)
imageURL
imageInfo.currentSrc

Отсутствует

 

№17237Вчера 21:08:16

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

Re: Custom Buttons

Dumby
Спасибо! Все работает.

Отсутствует

 

Board footer

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