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

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

№1582609-09-2021 23:44:27

vitalii201
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 678
UA: Firefox 92.0

Re: Custom Buttons

Senflex пишет

в CB

Mea culpa – не обратил внимание, что ветка "Custom Buttons". На скрине настройки FlagFox.

Отсутствует

 

№1582710-09-2021 11:55:15

Senflex
Участник
 
Группа: Members
Зарегистрирован: 18-07-2021
Сообщений: 29
UA: Chrome 93.0

Re: Custom Buttons

vitalii201 пишет
Senflex пишет

в CB

Mea culpa – не обратил внимание, что ветка "Custom Buttons". На скрине настройки FlagFox.

Благодарю! Посмотрю... Ещё руки не дошли(

Отсутствует

 

№1582811-09-2021 15:07:56

vv07
Участник
 
Группа: Members
Зарегистрирован: 07-11-2007
Сообщений: 689
UA: unknown 0.0

Re: Custom Buttons

Уважаемые гуру! Не смогли бы вы, отредактировать кнопку User-agent change, так что бы
изменения сохранялись постоянно, пока сам не вернешь обратно. А то не очень удобно, когда
после перезагрузки, изменение отключается.

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

Выделить код

Код:

var ps = Components. classes ["@mozilla.org/preferences-service;1"]. getService (Components. interfaces. nsIPrefService). getBranch ("general.");
    ps. setCharPref ("useragent.override", "reset");

this.PS = Components.classes['@mozilla.org/preferences-service;1'] .getService(Components.interfaces.nsIPrefBranch);
this.PS.clearUserPref("general.useragent.override");
this.image=
'data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD///8A////AJkyAACZMwAAmTIAAJcwAACUKQBAqVIh1J48CX6YMAAAmTMAAJkzAACZMwAAmDEAAP///wD///8A////AP///wCZMgAAmTMAAJQqABadNwiRz45Y+fTUo/+fPgyKlSoAAJcvAACZMgAAmTMAAJgxAAD///8A////AP///wD///8Aly8AAZUvAV65Xyji8LBn///XiP/6xoD/r1wq56hRIcmkSxm7ljEBcZcwAAeZMQAA////AP///wD///8A////AKFCEcfhkkn//7VY//+vUP//qEn//7BY//+5Yv//uF7//LVd/92NQ/+fPAq4li8AC////wD///8A////AP///wCdOQiLyGYe8vieP///rkz//6ZE//6nS//vkTj/7Ywz//qcPf//tFD/4og3/5gwAIb///8A////AP///wD///8AmDEAAJMrACikQQ2w2o9J///RgP/8xHn/oD4LyZYvAYmjPwzH8bNn///Zh/+0WiDn////AP///wD///8A////AJkyAACZMgAAli4AAJQrAFa3ZjDb5rp9/6JCDoqXLgAAkykALbhoMf/Wpmr/sVsl/////wD///8A////AP///wCZMwAAmTMAAJkzAACZMgAAlCsAEZo3BIiaNAFPmTMAAJo0AAeWLgBGkykASpcwAEX///8A////AP///wD///8AmDEAU5QqAFmWLgBXmjQADJkzAACaNQJJnj0Km5QqAB+ZMQAAmTMAAJkzAACZMwAA////AP///wD///8A////ALBZI//dr3H/wHU9/5IpAECWLgAAnjsIeem9gP/Bdz7qli8BbZUtAAOZMgAAmTIAAP///wD///8A////AP///wCtUBff/858//e6a/+qSRLYmTIEmaA9CMr3um///9J//+ObUf+rShPFkysAPJcwAAD///8A////AP///wD///8AlS4Acth8L///tE///6E///OSNv/0lTn//qVJ//+jQP//q0j//aNB/9JyJf2fPQug////AP///wD///8A////AJcvAAObNgaf1II9//eyXv/+tmD//rdj//+zXf//q0z//7JU//+1Wf/fkUn/okMSv////wD///8A////AP///wCYMAAAmDEAAJUuAFugQxKqpEoauqhRINz2xID//9qM/+6vZ/+2XCXelC4AWZcwAAD///8A////AP///wD///8AmDAAAJkzAACZMwAAlzAAAJYsAACcOAZ47sub/8yLVvWbNQaKlCsAEpkyAACZMwAA////AP///wD///8A////AJgwAACZMwAAmTMAAJkzAACYMQAAnDkGbqZMG9STKQA8ly8AAJkzAACZMgAAmTMAAP///wD///8A/H8AAPB/AADABwAAwAMAAMADAADgAwAA+EMAAPxDAADCPwAAwg8AAMAHAADAAwAAwAMAAPAHAAD+DwAA/j8AAA==';


var меню =
'<menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"\n\
       oncommand="this.parentNode.сменитьЮзерагент(event)">\n\
          <menuitem type="radio" value="reset" label="Default User-Agent"/>\n\
          <menuseparator/>\n\
    <menuitem type="radio" value="Mozilla/5.0 (X11; Linux i686 on x86_64; rv:10.0) Gecko/20100101 Firefox/40.0 " label="Firefox 40.0"/>\n\
    <menuitem type="radio" value="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0 " label="Firefox 78.0"/>\n\
    <menuitem type="radio" value="Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko" label="Win8.1 x64 IE-11.0"/>\n\
    <menuitem type="radio" value="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0 Safari/537.36" label="Chrome 43.0"/>\n\
    <menuitem type="radio" value="Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16" label="Opera 12.16 / Linux"/>\n\
    <menuitem type="radio" value="Mozilla/5.0 (Android 4.2; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/38.0 Fennec/38.0" label="Android 4.2 / Fennec 38.0"/>\n\
    <menuitem type="radio" value="AppEngine-Google; (+http://code.google.com/appengine; appid: unblock4myspace)" label="AppEngine-Google"/>\n\
    <menuitem type="radio" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.15 YB/3.5.1" label="FF 3.6.15+yandexbar"/>\n\
    <menuitem type="radio" value="iCab/3.0.2 (Macintosh; U; PPC Mac OS)" label="iCab/Mac"/>\n\
    <menuitem type="radio" value="Mozilla/5.0 (X11; Linux x86_64; rv:2.0b6pre) Gecko/20100401 Firefox/38.0.1" label="Firefox-38.0.1 / Linux"/>\n\
    <menuitem type="radio" value="AmigaVoyager/3.2 (AmigaOS/MC680x0)" label="AmigaVoyager"/>\n\
    <menuitem type="radio" value="Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090914 Slackware/13.0_stable Firefox/3.5.3" label="Slackware"/>\n\
    <menuitem type="radio" value="Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; ru; rv:1.9.2.3) Gecko/20100401 Firefox/38.0.1" label="Firefox-38.0.1 Mac OS"/>\n\
    <menuitem type="radio" value="NCSA Mosaic/1.0 (X11;SunOS 4.1.4 sun4m)" label="NCSA Mosaic-1.0 / SunOS 4.1.4"/>\n\
    <menuitem type="radio" value="NetSurf/2.0 (RISC OS; armv5l; NetSurf/2.0)" label="NetSurf-2.0 RISC OS"/>\n\
    <menuitem type="radio" value="Mozilla/5.0 (BeOS; U; Haiku BePC; en-US; rv:38.0.1.1) Gecko/20080112" label="Mozilla-38.0.1 / BeOS"/>\n\
    <menuitem type="radio" value="Mozilla/5.0 (OS/2; U; Warp 4.5; en-US; rv:1.8.1.3pre) Gecko/20070307" label="Mozilla/5.0 OS/2"/>\n\
    <menuitem type="radio" value="Mozilla/5.0 (PLAYSTATION 3; 2.00)" label="Mozilla/5.0 (PLAYSTATION 3; 2.00)"/>\n\
    <menuitem type="radio" value="Links (6.9; Unix 6.9-astral sparc; 80x25)" label="Links / Unix"/>\n\
</menupopup>';


меню = e4xConv_parseXULFromString (меню);
меню. childNodes [0]. setAttribute ("checked", "true");
this. orient = "horizontal";
this. type = "menu";
this. appendChild (меню);
this. сменитьЮзерагент = function (событие)
{
    var юзерагент = событие. target. getAttribute ("value");
       var ps = Components. classes ["@mozilla.org/preferences-service;1"]. getService (Components. interfaces. nsIPrefService). getBranch ("general.");
    ps. setCharPref ("useragent.override", юзерагент);
this.PS = Components.classes['@mozilla.org/preferences-service;1'] .getService(Components.interfaces.nsIPrefBranch);
this.pref='general.useragent.override';
var state=this.PS.getCharPref(this.pref);
if (state=="reset") { 
this.PS = Components.classes['@mozilla.org/preferences-service;1'] .getService(Components.interfaces.nsIPrefBranch);
this.pref='general.useragent.override';
var state=this.PS.getCharPref(this.pref);
this.PS = Components.classes['@mozilla.org/preferences-service;1'] .getService(Components.interfaces.nsIPrefBranch);
this.PS.clearUserPref("general.useragent.override"); 
this.image=
'data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD///8A////AJkyAACZMwAAmTIAAJcwAACUKQBAqVIh1J48CX6YMAAAmTMAAJkzAACZMwAAmDEAAP///wD///8A////AP///wCZMgAAmTMAAJQqABadNwiRz45Y+fTUo/+fPgyKlSoAAJcvAACZMgAAmTMAAJgxAAD///8A////AP///wD///8Aly8AAZUvAV65Xyji8LBn///XiP/6xoD/r1wq56hRIcmkSxm7ljEBcZcwAAeZMQAA////AP///wD///8A////AKFCEcfhkkn//7VY//+vUP//qEn//7BY//+5Yv//uF7//LVd/92NQ/+fPAq4li8AC////wD///8A////AP///wCdOQiLyGYe8vieP///rkz//6ZE//6nS//vkTj/7Ywz//qcPf//tFD/4og3/5gwAIb///8A////AP///wD///8AmDEAAJMrACikQQ2w2o9J///RgP/8xHn/oD4LyZYvAYmjPwzH8bNn///Zh/+0WiDn////AP///wD///8A////AJkyAACZMgAAli4AAJQrAFa3ZjDb5rp9/6JCDoqXLgAAkykALbhoMf/Wpmr/sVsl/////wD///8A////AP///wCZMwAAmTMAAJkzAACZMgAAlCsAEZo3BIiaNAFPmTMAAJo0AAeWLgBGkykASpcwAEX///8A////AP///wD///8AmDEAU5QqAFmWLgBXmjQADJkzAACaNQJJnj0Km5QqAB+ZMQAAmTMAAJkzAACZMwAA////AP///wD///8A////ALBZI//dr3H/wHU9/5IpAECWLgAAnjsIeem9gP/Bdz7qli8BbZUtAAOZMgAAmTIAAP///wD///8A////AP///wCtUBff/858//e6a/+qSRLYmTIEmaA9CMr3um///9J//+ObUf+rShPFkysAPJcwAAD///8A////AP///wD///8AlS4Acth8L///tE///6E///OSNv/0lTn//qVJ//+jQP//q0j//aNB/9JyJf2fPQug////AP///wD///8A////AJcvAAObNgaf1II9//eyXv/+tmD//rdj//+zXf//q0z//7JU//+1Wf/fkUn/okMSv////wD///8A////AP///wCYMAAAmDEAAJUuAFugQxKqpEoauqhRINz2xID//9qM/+6vZ/+2XCXelC4AWZcwAAD///8A////AP///wD///8AmDAAAJkzAACZMwAAlzAAAJYsAACcOAZ47sub/8yLVvWbNQaKlCsAEpkyAACZMwAA////AP///wD///8A////AJgwAACZMwAAmTMAAJkzAACYMQAAnDkGbqZMG9STKQA8ly8AAJkzAACZMgAAmTMAAP///wD///8A/H8AAPB/AADABwAAwAMAAMADAADgAwAA+EMAAPxDAADCPwAAwg8AAMAHAADAAwAAwAMAAPAHAAD+DwAA/j8AAA==';

 }
 else { this.image=
'data:image/x-icon;base64,AAABAAEAEBAAAAEAIADkAgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAAFzUkdCAK7OHOkAAAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGHRFWHRTb2Z0d2FyZQBwYWludC5uZXQgNC4wLjOM5pdQAAACVUlEQVQ4T3WTMWhTURSG2zSaNqRRqU0N1MbUUGnStNDGtMagoqFFaR2qCELpoBUUFaQ4SV2kOKmDODrJm+Th9CYJDhK3ThLFIThlKpkkSCuvuX5/zJM3aODjvHty/v/ed867XW7LDXTxU4QkxCDo/myGKi9fLdnpCVP7WLno/nJz5KchA1MwBjEJuzsGQTiAMOH+aAYQDFWebho3EDRuOGLK6w9Nc7uxQP4KdddgAdIS9oJ270EY33pjGWd1Zds+X3Lt0dQfgw7OaGqX//eovQpZaWWgY2vHPnt1pVXzCf6HdaZoqL+PbkYGURb9lRfPZrd8RXVo+NYeZeCE59CdhLwMDmEwYo0M170ii8Y5N9bM63zONDu5dr5QVEMn0VyCSXRhGaRkYgWCvEjQ6BS19+XnNDNZfrL5Rblq7LBhIp8QLFN7llgixuGWDBLQXX1rT8AUTZpVMzUZjAo6SeNr9SY1MYQ5yMIR1v1w0DPQFAbhKMQp6GVkw86jDYPpEjmNd6z6zh7HdABC5IbguAzSUEAUgRNwD5Epd0bI/Hf1bdQ/VzNOIPit3QtAsw5ZGYTbJhyLo363Ly/u+BunRuojUgO9nE1P0DyGjAx6IEnRAzsa+VvkoVFqpN5az7yaNtQrTMtgv3a32Mkv/Bcys+ZLhibfRqNxRmUQYtFHzDCBoqPj+URaO5jzaRs+tg36MUPtsQ77ZDCgB8hjNEf3l/XOnkH7ueWu8d8i8TRRF+ku8Q4xIQONUBdKp1A/xiFW+1BOcJV3uJHXKT5FTrdvvhMvwJzbcgd/A3Q4lrpREVkLAAAAAElFTkSuQmCC';

 };
}
  

function e4xConv_parseXULFromString(xul) {
	xul = xul.replace(/>\s+</g, "><");
	return new DOMParser().parseFromString(xul, "application/xml").documentElement;
}

Отсутствует

 

№1582911-09-2021 20:01:25

Senflex
Участник
 
Группа: Members
Зарегистрирован: 18-07-2021
Сообщений: 29
UA: Chrome 93.0

Re: Custom Buttons

Приветствую всех!  Возник вопрос. Нужно вывести в alert число файлов в папке, к примеру путь C:\\FOTO

Отсутствует

 

№1583017-09-2021 22:58:41

thrower
Участник
 
Группа: Members
Зарегистрирован: 28-11-2013
Сообщений: 207
UA: Firefox 91.0

Re: Custom Buttons

Подскажите код, с помощь которого выполняется Removing cookies and site data:

e4831681d3b0d4d63083e6475eb53cad.png


//

Выделить код

Код:

SiteDataManager.remove(gBrowser.contentPrincipal.baseDomain);

Спасибо Dumby.
№15897

Отредактировано thrower (18-09-2021 20:16:45)

Отсутствует

 

№1583117-09-2021 23:35:53

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 596
UA: Firefox 52.0

Re: Custom Buttons

thrower пишет

Подскажите код, с помощь которого выполняется Removing cookies and site data:

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

Выделить код

Код:

/*Initialization Code*/

// Автор: Dumby (https://forum.mozilla-russia.org/viewtopic.php?pid=775136#p775136) .....
(obj => {
    this.setAttribute("context", "");
    this.onclick = e => obj[e.button < 2](e);
})({
    true(e) {
        var domain = this.domain();
        if (!domain) return;

        this.cookies(domain);
        this.webappstore(domain);
        this.macromedia();

        if (e.button) for(var br of gBrowser.browsers) try {
            this.domain(br) == domain && br.reload();
        } catch(ex) {}
    },
    false(e) {
        e.ctrlKey || e.shiftKey ? gShowPopup(self) : this.window();
    },
    domain(br = gBrowser.selectedBrowser, res) {
        try {
            res = new URL(br.currentURI.spec).hostname;
            res = res.includes(".")
                ? Services.eTLD.getBaseDomainFromHost(res)
                : undefined;
        } finally {return res;}
    },
    remove(...args) {
        (this.remove = Services.cookies.remove.length == 4
            ? Services.cookies.remove
            : (h, n, p, a) => Services.cookies.remove(h, n, p, false, a)
        )(...args);
    },
    cookies(domain, has) {
        for(var {host, name, path, originAttributes, rawHost} of (
            Services.cookies.enumerator || Services.cookies.cookies
        )) Services.eTLD.hasRootDomain(rawHost, domain)
            && this.remove(host, name, path, originAttributes);
    },
    webappstore(domain) {
        var db = FileUtils.getFile("ProfD", ["webappsstore.sqlite"]);
        var conn = Services.storage.openDatabase(db);
        conn.executeSimpleSQL(`DELETE FROM webappsstore2 WHERE scope LIKE "%${
            domain.split("").reverse().join("") + "."
        }%"`);
        conn.close();
    },
    macromedia() {
        var dir = Services.dirsvc.get("AppData", Ci.nsIFile);
        dir.append("Macromedia");
        dir.exists() && dir.isDirectory() && dir.remove(true);
        dir.create(dir.DIRECTORY_TYPE, 0o755);
    },
    get sdm() {
        this.url = "chrome://browser/content/preferences/dialogs/siteDataSettings.x" +
            (parseInt(Services.appinfo.platformVersion) <= 71 ? "ul" : "html");
        delete this.sdm;
        return this.sdm = ChromeUtils.import(
            "resource:///modules/SiteDataManager.jsm"
        ).SiteDataManager;
    },
    async window() {
        var domain = this.domain();
        var win = Services.wm.getMostRecentWindow("Browser:SiteDataSettings");
        win && win.close();

        await this.sdm.updateSites();
        win = openDialog(this.url, "_blank", "");
        if (!domain) return;

        await new Promise(resolve => 
            win.addEventListener("DOMContentLoaded", resolve, {once: true})
        );
        var list = win.document.getElementById("sitesList");
        list.clearSelection = () => {
            delete list.clearSelection;
            list.selectedIndex = 0;
            list.focus();
        }
        win.document.getElementById("searchBox").inputField.editor
            .insertText(domain);
    }
});

this.tooltipText = "Л: Удалить куки текущего сайта\
                  \nП: Управление куками для текущего сайта\
                  \nCtrl+П: CB Меню";

Отредактировано unter_officer (17-09-2021 23:37:55)


«The Truth Is Out There»

Отсутствует

 

№1583218-09-2021 02:47:22

thrower
Участник
 
Группа: Members
Зарегистрирован: 28-11-2013
Сообщений: 207
UA: Firefox 91.0

Re: Custom Buttons

unter_officer
Спасибо, но мне нужна не кнопка, а команда, равнозначная нажатию "Remove".

Отсутствует

 

№1583318-09-2021 11:40:53

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

Re: Custom Buttons

thrower
SiteDataManager.remove("litres.ru");

Отсутствует

 

№1583418-09-2021 14:06:39

thrower
Участник
 
Группа: Members
Зарегистрирован: 28-11-2013
Сообщений: 207
UA: Firefox 91.0

Re: Custom Buttons

Dumby
А как это сделать для произвольного текущего домена (активный таб)?

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

А еще вытащил код из background.js небольшого расширения, но тоже не получается его прицепить:

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

Выделить код

Код:

// Init
let browserName = "NonFirefox"; // Default value

// browser.runtime.getBrowserInfo() is not available
// https://github.com/mozilla/webextension-polyfill/issues/116

async function init(){
	// Get the browserName (likely will only work in case it's Firefox)
	if(browser.runtime.getBrowserInfo !== undefined){
		let info = await browser.runtime.getBrowserInfo();
		browserName = info.name;
	}
	
	// Events
	browser.browserAction.onClicked.addListener(async (tab) => {
		await deleteCookies(tab);
		await browser.tabs.reload();
		// Page was reloaded
	});
}

init();

// Functionality
async function deleteCookies(tab){	
	let cookies = await browser.cookies.getAll(
		getCookieQueryAll(tab)
	);

	let promises = cookies.map(cookie =>
		browser.cookies.remove(getCookieRemoveQuery(cookie))
	);

	return Promise.all(promises);
}

// Helper functions
function getCookieQueryAll(tab){
	let cookieQueryAll = {
		url: tab.url,
		storeId: tab.cookieStoreId
	};
	
	console.log("browserName is", browserName);
	if(browserName === "Firefox"){
		cookieQueryAll.firstPartyDomain = null;
	}
	
	console.log("cookieQueryAll", cookieQueryAll);
	
	return cookieQueryAll;
}

function getCookieRemoveQuery(cookie){
	let cookieRemoveQuery = {
		url: getCookieUrl(cookie),
		name: cookie.name,
		storeId: cookie.storeId
	};

	console.log("browserName is", browserName);
	if(browserName === "Firefox"){
		cookieRemoveQuery.firstPartyDomain = cookie.firstPartyDomain;
	}

	return cookieRemoveQuery;
}

function getCookieUrl(cookie) {
    let cookieProtocol = (cookie.secure) ? 'https://' : 'http://';
    return cookieProtocol + cookie.domain + cookie.path;
}

Отредактировано thrower (18-09-2021 14:08:42)

Отсутствует

 

№1583518-09-2021 18:17:43

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

Re: Custom Buttons

thrower пишет

А как это сделать для произвольного текущего домена (активный таб)?

Ну, для каких-то стандартных ситуаций, возможно, сойдёт и так:
SiteDataManager.remove(gBrowser.contentPrincipal.baseDomain);

Отсутствует

 

№1583618-09-2021 20:14:30

thrower
Участник
 
Группа: Members
Зарегистрирован: 28-11-2013
Сообщений: 207
UA: Firefox 91.0

Re: Custom Buttons

Dumby
Спасибо! Оно! Работает. То, что нужно.

Отсутствует

 

№1583722-09-2021 13:05:29

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

Re: Custom Buttons

egorsemenov06
Не понял.
Этот код и создаёт «отдельные две кнопки».

Отсутствует

 

№1583822-09-2021 15:21:08

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

Re: Custom Buttons

egorsemenov06
А, теперь понял, код разделить.
Хорошо, попробую. Ну так, чисто формально.

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

Выделить код

Код:

(async id => CustomizableUI.createWidget({
	label: "Открыть страницу в другом браузере",
	image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAAsSAAALEgHS3X78AAAEgUlEQVQ4jU2TW2yTZQCG3+/7v/79266HraN1G8cNVoERNhk42BBmghiQBF3IMJnghYcbxUPEREiYF0bgihBREyNRQ4wENCwkBjlsyIA5WclWOe3ANrq2W1u6reu5/f//+7xQI8/tmzx5bx4yMjKCgYEByLIMAYBTirymEUYpbIrimkslzKXOpwLrV3NNceTAhZERNVfFC1mnNifGjO6i8NB4grCOjg7s378foBSVNju+3b6D+NUC/d43oGeK7dXLFlfu9BhKr244XObntvuvkPDURszNGiSjkhKTaYAtPO7tT15iQggAAASHVZJIs8sFlDqx69l1O4Lh+EeVddXPidrZN2XeZcDvswrGqnhBXXXowK2rRxtXGF0vy4XWzvOhG4wQ8o+IUCIAkYcoYrr+pXlqdo+nwQXR6BUk1WP13qhE5pRZX2cDMRRpn9U/LK870/egrfkZ66WCqir/P4IQakGHIad/LUaDbWrLIs2w+TbFyB16J75PDNg3I9V8XbKdO4GaEiffXWpqmZ8tN01Oq20ffLwuTv+1SOACvM7S+hcLtknbyzR56z0p2T9If3nYjmtTtSQV9BF51RqML1yOlP8hiQUfqU00va33RGD3a69fEZRQQgDoJmaAceu8t+/tWwxsDxK9o5OcOduICxE3ykvSSBUvhR66D1W/heyyGDG/GJLwxgSWb4q8NXh3xkgBEABQi6WqxvUr6neVzwHXbtJQO8dgQEWJG4gqZfDM3URZVzuml21DyRYdhk0JwutzWN0CT2OttJY6HApxWICG5uqad6qZVRry8s8j88j9YAJJi4JR5kZvnxfV1w+id8EupBreA1m5CNSVJZxRYTYT04JyuoTt2bNGb939KQjXthUNX8DJqAU/Oi1IbnFiY0UFgots2Onx4BQ/iC6sRX0sCclTBuR8EIQAnEAiRGYyM4MZ3PV06trz/Y81nM4UwZXOYLhlIbKPFdTHIzjh8+G3+FLkC1nU1uiQ2AMUIAlGOclnZR6OIcI4MTGiJzfoY4OlP0zbM1mJmx2KhHSxBe6KOKKBIdyOOFBpIHjaY8SOJV8AGT9ALKCEIDDBogODWj8DrBpJB+smxjPdV84Xeua3LjjCZUmzaBbmjffAVNGPl6pWIJGVYNW9KFE7IJgZah6abDYbfvq18HNsjocoVD8QuOWyrWzqyT1Qj4b/CPsU2cSy+bSWt+YwU4ihO9mJ7vhlNCndsBiMSGaYbmFWg7fX4D92OnEEACjJ+iEyYatTqI9qXBJ8x3yt492ROxQyQ07S5QLTcxmb/oKS0TebVS2dtOpWUSz19Rn9be2xV2eTPEQJqHTow70Q8T/X0vjjpuaaeRdnptPR/gujPekEXyOZjfN1JhOH0Ogn9gi15BTyKKDQ785lR949Htk7EVV7KAHlApyok5ehDn9lZdnJ9yU9l6Ys03X4ZMR/4GzCqtjleqnCXu1xs+IGU56MRrX43bHcWGimcJsQhADkhYAOAESdvIj80Dcw5vMYGQ7i4KlBdN4tIJEVIBD4L+knoRSAAPgT49/cEBl9hsIr+QAAAABJRU5ErkJggg==",
	tooltiptext: [
		"Л: Открыть меню с браузерами",
		"С: Добавить в меню новый браузер",
		"\nФункции кликов мыши для меню:",
			"\tЛ: Открыть страницу",
			"\tС: Добавить разделитель",
			"\tП: Удалить пункт меню или разделитель",
			"\tCtrl+П: Изменить название пункта меню",
		"Перетаскиванием можно передвигать пункты меню или разделители"
	].join("\n"),

	id,
	localized: false,
	onCreated(btn) {
		btn.owner = this;
		btn.type = "menu";
		btn.setAttribute("image", this.image);
		btn.openPopup = btn.openMenu;
		btn.openMenu = this.openMenu;

		var popup = btn.appendChild(btn.ownerDocument.createXULElement("menupopup"));
		popup.setAttribute("context", "");
		popup.setAttribute("oncommand", "owner.command(event)");

		btn.onauxclick = this.auxclick;
		popup.setAttribute("onpopupshowing", "this.shouldRebuild && owner.rebuild(this)");
		popup.ondragstart = this.dragstart;
		popup.shouldRebuild = true;

		var {openDelay, closeDelay} = this;
		this.autoOpenCloseFeature(btn.ownerGlobal, btn, openDelay, closeDelay);
	},
	file: Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile),
	openMenu(...args) {
		if (this.parentNode != this.domParent) {
			this.domParent = this.parentNode;
			this.owner.setPopupPosition(this);
		}
		this.openPopup(...args);
	},
	setPopupPosition(node) {
		if (node.matches(".widget-overflow-list > :scope"))
			var pos = "after_start";
		else var win = node.ownerGlobal, {width, height, top, bottom, left, right} =
			node.closest("toolbar").getBoundingClientRect(), pos = width > height
				? `${win.innerHeight - bottom > top ? "after" : "before"}_start`
				: `${win.innerWidth - right > left ? "end" : "start"}_before`;
		node.firstChild.setAttribute("position", pos);
	},
	// https://github.com/Infocatcher/Custom_Buttons/blob/master/code_snippets/autoOpenCloseMenu.js
	// Automatically open menu on mouse over (and hide it on mouse out)
	autoOpenCloseFeature(win, btn, openDelay = 200, closeDelay = 350) {
		var _openTimer = 0;
		var _closeTimer = 0;
		btn.onmouseover = function(e) {
			win.clearTimeout(_closeTimer);
			if(e.target == btn && closeOtherMenus()) {
				btn.open = true;
				return;
			}
			_openTimer = win.setTimeout(function() {
				btn.open = true;
			}, openDelay);
		};
		btn.onmouseout = function(e) {
			win.clearTimeout(_openTimer);
			_closeTimer = win.setTimeout(function() {
				if(!isContextOpened())
					btn.open = false;
			}, closeDelay);
		};
		function closeOtherMenus() {
			return win.Array.prototype.some.call(
				btn.parentNode.getElementsByTagName("*"),
				function(node) {
					if(
						node != btn
						&& win.XULElement.isInstance(node)
						// See https://github.com/Infocatcher/Custom_Buttons/issues/28
						//&& node.boxObject
						//&& node.boxObject instanceof Components.interfaces.nsIMenuBoxObject
						&& "open" in node
						&& node.open
						&& node.getElementsByTagName("menupopup").length
					) {
						node.open = false;
						return true;
					}
					return false;
				}
			);
		}
		function isContextOpened() {
			return inBtn(win.document.popupNode);
		}
		function inBtn(node) {
			for(; node; node = node.parentNode)
				if(node == btn)
					return true;
			return false;
		}
	},
	get markup() {
		try {var data = Cu.readUTF8URI(Services.io.newURI(
			`chrome://user_chrome_files/content/custom_scripts/${id}-data.txt`
		)).split("\n").filter(line => /\S/.test(line));}
		catch {var data = [
			"D:\\Програмное обеспечение\\Флешка загрузочная\\Windows 7 SP1\\Программы\\ChromePortable\\ChromePortable.exe>Chrome",
			"D:\\Програмное обеспечение\\Флешка загрузочная\\Windows 7 SP1\\Программы\\Opera_1217\\Opera\\launcher.exe>Opera",
			"C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe",
			"D:\\Програмное обеспечение\\Флешка загрузочная\\Windows 7 SP1\\Программы\\Microsoft Edge\\ProgramFiles\\msedge.exe",
		];}
		delete this.markup;
		return this.markup = this.dataToMarkup(data);
	},
	setMarkup(popup) {
		this.markup = popup.innerHTML;
		for(var {node} of CustomizableUI.getWidget(id).instances)
			if (node.firstChild != popup) node.firstChild.shouldRebuild = true;
		this.write(Array.from(popup.children,
			node => node.hasAttribute("value")
				? node.tooltipText + (node.value == "true" ? ">" + node.label : "")
				: "separator"
		).join("\n"));
	},
	dataToMarkup(data) {
		var markup = "";
		for(var str of data) markup += str == "separator"
			? "<menuseparator/>" : this.strToMenuitem(str);
		return markup;
	},
	repl: [/^./, c => c.toUpperCase()],
	strToMenuitem(str, ind = str.lastIndexOf(">")) {
		var name, val, path = str;
		if ((val = ind != -1))
			path = str.slice(0, ind),
			name = str.slice(ind + 1);
		else
			this.file.initWithPath(path),
			name = this.file.leafName.split(".")
				.shift().replace(...this.repl);

		return `<menuitem label="${name}" tooltiptext="${path}" value="${val}"`
			+ ` class="menuitem-iconic" image="moz-icon://file://${path}"/>`;
	},
	append(popup, xul = this.markup) {
		popup.append(popup.ownerGlobal.MozXULElement.parseXULToFragment(xul));
	},
	rebuild(popup) {
		popup.textContent = "";
		this.append(popup);
		delete popup.shouldRebuild;
	},
	auxclick(e) {
		var trg = e.target, popup = this.firstChild;
		if (trg == this && e.button == 1)
			return this.owner.addMenuitem(popup);

		else if (trg.parentNode != popup) return;

		if (e.button == 1) {
			var up = e.screenY < trg.screenY + trg.clientHeight/2;
			up = up ? trg.previousSibling : !trg.nextSibling;
			trg[up ? "before" : "after"](
				trg.ownerDocument.createXULElement("menuseparator")
			);
		} else {
			if (e.ctrlKey) {
				if (trg.nodeName.endsWith("r")) return;

				var name = this.owner.prompt(
					"Введите другое название пункта",
					trg.label, trg.ownerGlobal
				);
				if (name && name != trg.label)
					trg.label = name,
					trg.value = true;
			}
			else trg.remove();
		}
		this.owner.changeMarkup(popup);
	},
	prompt(msg, value, domWin) {
		var res = {value};
		return Services.prompt.wrappedJSObject.pickPrompter({
			domWin, modalType: Ci.nsIPrompt.MODAL_TYPE_WINDOW
		}).nsIPrompt_prompt(this.label, msg, res, null, {})
			? res.value : null;
	},
	addMenuitem(popup) {
		var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
		fp.appendFilters(fp.filterApps);
		fp.init(popup.ownerGlobal, "Укажите путь к программе", fp.modeOpen);
		fp.open(res => {
			if (res == fp.returnOK)
				this.append(popup, this.strToMenuitem(fp.file.path, -1)),
				this.setMarkup(popup);
		});
	},
	changeMarkup(popup) {
		popup.state == "open"
			? popup.addEventListener("popuphidden", this, {once: true})
			: this.setMarkup(popup);
	},
	handleEvent(e) {
		this[e.type](e);
	},
	popuphidden(e) {
		this.setMarkup(e.target);
	},
	dragstart(e) {
		var trg = e.target;
		if (trg.parentNode.nodeName != "menupopup") return;

		var {owner} = this.parentNode;
		var pn = trg.flattenedTreeParentNode;
		owner.dragData = {trg, pn, ns: trg.nextSibling};

		trg.style.cssText = "font-weight: bold; color: red;"
			+ "outline: 2px solid red; outline-offset: -2px;"
				.replace(/;/g, " !important;");
		var win = trg.ownerGlobal;
		win.setCursor("grabbing");
		pn.addEventListener("mousemove", owner);
		win.addEventListener("mouseup", owner, {once: true});
	},
	mousemove(e) {
		var trg = e.target, dtrg = this.dragData.trg;
		if (trg == dtrg) return;

		e.movementY > 0
			? trg.nextSibling != dtrg && trg.after(dtrg)
			: trg.previousSibling != dtrg && trg.before(dtrg);
	},
	mouseup(e) {
		e.preventDefault();
		var {trg, pn, ns} = this.dragData;
		delete this.dragData;
		trg.removeAttribute("style");
		trg.ownerGlobal.setCursor("auto");
		pn.removeEventListener("mousemove", this);
		trg.nextSibling != ns && this.changeMarkup(trg.parentNode);
	},

	command(e) {
		if (e.button) return;
		this.file.initWithPath(e.target.tooltipText);
		if (this.file.exists()) {
			var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
			process.init(this.file);
			return process.run(false, [e.view.gBrowser.currentURI.spec], 1);
		}
		Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
			.showAlertNotification(this.image, this.label, "Файл не существует");
	},
	write(txt) {
		var file = Services.dirsvc.get("UChrm", Ci.nsIFile), CC = Components.Constructor;
		["user_chrome_files", "custom_scripts", id + "-data.txt"].forEach(file.append);
		var te = new (Cu.getGlobalForObject(Cu).TextEncoder)();
		var fos = CC("@mozilla.org/network/file-output-stream;1", "nsIFileOutputStream", "init")
			// MODE_{WRONLY, CREATE, TRUNCATE}, PERMS_FILE
			.bind(null, file, 0x02 | 0x08 | 0x20, 0o644, 0);
		var bos = CC("@mozilla.org/binaryoutputstream;1", "nsIBinaryOutputStream", "setOutputStream");

		(this.write = txt => {
			var stream = new fos();
			try {new bos(stream).writeByteArray(te.encode(txt));}
			catch(ex) {Cu.reportError(ex);}
			finally {stream.close();}
		})(txt);
	}
}))("ucf-cbbtn-OpenPageInOtherBrowser");


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

Выделить код

Код:

(async () => CustomizableUI.createWidget({
	label: "Открыть внешнее win приложение",
	image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAMAAwQAKCImDyo4IWkYaBzFQ6xI8FG/V/VCq0jcGGQbkwAQACQAAAAAAAIAAwAAAAAAAAAAAAAAAAEAAAIAAgIAQy4iYp9YOuZUah3/QMJQ/nfxgP97+Yb/f/+L/m/7ev87v0L1BzwIawAAAAAAAgADAAAAAAEAAAIAAAAAQR4Ki7pwNP//tG79aXQg/CGwM/tL3lP+SeJU/krmVf5I5lT8ROZQ/SjIMf8DQgWFAAAAAAACAAMAAAAAMRoKX5hKHP/qoVT69JtU/WVsGP8RmyP/LMAz/ynHM/4ozTP8Jc4w+x/KK/sbxyn7Daoa/wAlA1QAAAEAAgAAA2o5G9GhVyT/z305/N54Nv9eWxTyAnMR6Qp+DvsIig//CpQR/wucE/8KnQ//CpkG/QedAf8FZADWAwIACigYIklrMln7h0VB/6dcJPvBaCz/XC8RlgABAAACDgAlABUANAAfAUsAKABeAz8RlAhfUvkDZnP/CFtw+gcXKklSLEeVlUiB/6VamPykYGD7o1wl/2A4H5YAAAAAAgEBBAAAAAAAAQMEAAAAAAUoVmcHcfT/AIL5+QCK//8BOZ2rXjJRsJtOhf/SgLr9zoK++5hbW/9AKhaGAAAAAAICAQYAAQACAAMDBwAAAAABLlprD4///wqh9/oJsf//Al7M1FsxT6ucUYf/1Iq//Oyd1vzYkMf/X0FVhQAAAAADAgMEAAAAAAACBAQBAAAAAC1aYRSQ//8lpPr6Irj//wtt1t5GJT2DmlCF/82Juvz2reH/8Kbb/eej1P9jR1t+AAAAAAMCAwQBAwUGAAAAAAYkV2wjkv//PLP7+jzE//8VaMXMHhAaP5FLff+4d6b++rno//iz5P/3suP88rLg/2hPYn8AAAAAAQAAAAgPYW1bXeD/PJL0/1DB/fxSy///EkiRlwAAAABqOFzBp16S/+ev2Pz/we///b7s//u86vr7wev/dFxfcgAJYmhxeP//lJH+/juS+/5q0f/+V7n4/AASODwAAAAAHA4YP5NMgP+6fKj9/Mzw/f3H8/7/y/X/7LvU811Ywd54gPv8r6z//puZ/P1Akff5g+L//y5hmZ8AAAAAAgECAwAAAAA1Gy5vmlGG/8iOuP3/1vX/8sfe811YxNZ6g/f5ubb9/a6u+/uvrfz8TZPt/1GFvMcAAQwNAQAAAAAAAAACAQEDAAAAACoVJVh/QW3umWuP7V5fzeSMk/j9zcn//7+//v7Av///o6Pz+yU2XH0AAwYKAQAAAAAAAQEAAAAAAAAAAAEBAQMAAAAADwkHFAcCKUsJGb3VO0vn9lRf5/RdZMzXRkmTmw4OKTUAAAAAAgIDAwABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
	data: [
		["QTranslate", "C:\\Users\\Роман\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\8sr9ujrx.default-release\\_QTranslate\\QTranslate.exe"],
		["Explorer", "C:\\windows\\explorer.exe"],
		null,
		["Cmd Prompt", "C:\\windows\\system32\\cmd.exe"],
		["Media Player", "C:\\Program Files\\Windows Media Player\\wmplayer.exe"],
		["Task Manager", "C:\\windows\\system32\\taskmgr.exe"],
		["Control Panel", "C:\\windows\\system32\\control.exe"],
		null,
		["Notepad", "C:\\windows\\notepad.exe"],
		["Calculator", "C:\\windows\\system32\\calc.exe"],
		["Virtual Keyboard", "C:\\windows\\system32\\OSK.exe"],
		["Character table", "C:\\windows\\system32\\charmap.exe"]
	],
	id: "ucf-cbbtn-openExternalWinApplication",
	localized: false,
	onCreated(btn) {
		btn.owner = this;
		btn.type = "menu";
		btn.setAttribute("image", this.image);
		btn.openPopup = btn.openMenu;
		btn.openMenu = this.openMenu;

		var popup = btn.appendChild(btn.ownerDocument.createXULElement("menupopup"));
		popup.setAttribute("context", "");
		popup.setAttribute("oncommand", "owner.command(event)");

		btn.tooltipText = btn.label;
		btn.ownerGlobal.Object.defineProperty(btn, "domParent", this);

		var {openDelay, closeDelay} = this;
		this.autoOpenCloseFeature(btn.ownerGlobal, btn, openDelay, closeDelay);
	},
	file: Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile),
	openMenu(...args) {
		if (this.parentNode != this.domParent) {
			this.domParent = this.parentNode;
			this.owner.setPopupPosition(this);
		}
		this.openPopup(...args);
	},
	setPopupPosition(node) {
		if (node.matches(".widget-overflow-list > :scope"))
			var pos = "after_start";
		else var win = node.ownerGlobal, {width, height, top, bottom, left, right} =
			node.closest("toolbar").getBoundingClientRect(), pos = width > height
				? `${win.innerHeight - bottom > top ? "after" : "before"}_start`
				: `${win.innerWidth - right > left ? "end" : "start"}_before`;
		node.firstChild.setAttribute("position", pos);
	},
	// https://github.com/Infocatcher/Custom_Buttons/blob/master/code_snippets/autoOpenCloseMenu.js
	// Automatically open menu on mouse over (and hide it on mouse out)
	autoOpenCloseFeature(win, btn, openDelay = 200, closeDelay = 350) {
		var _openTimer = 0;
		var _closeTimer = 0;
		btn.onmouseover = function(e) {
			win.clearTimeout(_closeTimer);
			if(e.target == btn && closeOtherMenus()) {
				btn.open = true;
				return;
			}
			_openTimer = win.setTimeout(function() {
				btn.open = true;
			}, openDelay);
		};
		btn.onmouseout = function(e) {
			win.clearTimeout(_openTimer);
			_closeTimer = win.setTimeout(function() {
				if(!isContextOpened())
					btn.open = false;
			}, closeDelay);
		};
		function closeOtherMenus() {
			return win.Array.prototype.some.call(
				btn.parentNode.getElementsByTagName("*"),
				function(node) {
					if(
						node != btn
						&& win.XULElement.isInstance(node)
						// See https://github.com/Infocatcher/Custom_Buttons/issues/28
						//&& node.boxObject
						//&& node.boxObject instanceof Components.interfaces.nsIMenuBoxObject
						&& "open" in node
						&& node.open
						&& node.getElementsByTagName("menupopup").length
					) {
						node.open = false;
						return true;
					}
					return false;
				}
			);
		}
		function isContextOpened() {
			return inBtn(win.document.popupNode);
		}
		function inBtn(node) {
			for(; node; node = node.parentNode)
				if(node == btn)
					return true;
			return false;
		}
	},
	configurable: true,
	get() {
		delete this.domParent;
		var doc = this.ownerDocument, df = doc.createDocumentFragment();
		for(var arr of this.owner.data) {
			if (!arr) {
				df.append(doc.createXULElement("menuseparator"));
				continue;
			}
			var menuitem = df.appendChild(doc.createXULElement("menuitem"));
			menuitem.className = "menuitem-iconic";
			menuitem.setAttribute("label", arr[0]);
			menuitem.setAttribute("image", "moz-icon://file://" + arr[1]);
		}
		this.firstChild.append(df);
	},
	command(e) {
		this.file.initWithPath(e.target.getAttribute("image").slice(18));
		this.file.launch();
	}
}))();

Отредактировано Dumby (22-09-2021 15:32:19)

Отсутствует

 

№1583922-09-2021 17:44:23

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

Re: Custom Buttons

egorsemenov06
Подскажите, как удалить эту кнопку. А то там нет такого пункта меню
f7ae67a06493b394421b84ab95dd2116.png

или отредактировать

Отредактировано vending_machine (22-09-2021 18:06:26)

Отсутствует

 

№1584022-09-2021 18:19:39

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

Re: Custom Buttons

egorsemenov06 пишет
vending_machine пишет

egorsemenov06
Подскажите, как удалить эту кнопку. А то там нет такого пункта меню

или отредактировать

Если Вы об этом "Л: Открыть меню с браузерами",откройте в Notepad++ и удалите эту строку.

Кнопку как удалить, через какие клавиши? Вторая удаляется, эта — нет.

Отредактировано vending_machine (22-09-2021 18:19:52)

Отсутствует

 

№1584122-09-2021 18:40:27

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

Re: Custom Buttons

egorsemenov06 пишет
vending_machine пишет

Кнопку как удалить, через какие клавиши? Вторая удаляется, эта — нет.

я не пойму какую кнопку удалить?

Из этой кнопки, кнопку открытия в другом браузере.
bae2c0d2476f158195fcdf7f1702cec7.png

Отредактировано vending_machine (22-09-2021 18:41:40)

Отсутствует

 

№1584222-09-2021 18:50:42

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

Re: Custom Buttons

egorsemenov06
У кнопки обычно, даже всегда, есть пункт удалить кнопку. И вот, как же всё-таки удалить кнопку открывающую страницу в другом браузере. Вторая из двух удаляется благополучно, оставляя эту.
А у этой нет такого пункта в меню.

f7ae67a06493b394421b84ab95dd2116.png


Dumby ее же разделил

У меня разделённые не работают

Отсутствует

 

№1584323-09-2021 12:22:21

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 596
UA: Firefox 52.0

Re: Custom Buttons

Dumby
Возможно ли как-то отключить обновление иконок всех закладок при импорте закладок из файла?


Дело в том, что при импорте закладок из файла (в моём случае из html-файла), Firefox начинает ломиться в инет и обновлять иконки всех закладок.
А если учесть, что у меня более 5400 закладок, то Firefox начинает создавать тысячи запросов на разные IP.
Как бы отключить такое поведение Firefox?


Метод отключения не важен - с помощью СВ, UCF или через config.js (лучше бы через config.js).


P.S. Для Firefox 91 ESR.


«The Truth Is Out There»

Отсутствует

 

№1584423-09-2021 16:04:42

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

Re: Custom Buttons

unter_officer пишет

лучше бы через config.js

Неужели это такое частое действие?
Не лучше ли: перевёл лису в оффлайн и импортируй.


А код, даже не знаю, наверно так попробовать
(закомментированое можно расскомментировать,
если insertFaviconForNode() может использоваться сторонним кодом).

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

Выделить код

Код:

(async url => {
	var nsvo = Cu.import(url, {}), key = "insertFaviconForNode", func = nsvo[key];
	nsvo[key] = node => {
		if (
			node.iconUri?.startsWith("http")
			//&& Components.stack.caller.filename == url
		)
			node.iconUri = null;
		func(node);
	}
})("resource://gre/modules/BookmarkHTMLUtils.jsm");

Отсутствует

 

№1584523-09-2021 19:01:46

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 596
UA: Firefox 52.0

Re: Custom Buttons

Dumby пишет

Неужели это такое частое действие?

Да. Очень много приходится работать с закладками и потом переносить на другой комп.
Пару раз синхронизация убила мне все закладки (хорошо, что бэкап был сделан), поэтому от синхронизации пришлось отказаться от слова совсем, и использовать экспорт/импорт.


Dumby пишет

Не лучше ли: перевёл лису в оффлайн и импортируй.

Так и делал, но жутко надоело.


Dumby пишет

наверно так попробовать

Код работает, но при импорте из файла в консоль сыплется большое количество одинаковых ошибок:

Выделить код

Код:

Failed to import favicon data:[Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIFaviconService.replaceFaviconDataFromDataURL]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: resource://gre/modules/BookmarkHTMLUtils.jsm :: insertFaviconForNode :: line 1066"  data: no]          BookmarkHTMLUtils.jsm:1081

Хотя, как по мне, то лучше пусть ошибки в консоли, чем тысячи запросов в минуту в инет.


Большое спасибо.

Отредактировано unter_officer (23-09-2021 19:27:59)


«The Truth Is Out There»

Отсутствует

 

№1584623-09-2021 22:08:45

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

Re: Custom Buttons

unter_officer пишет

Код работает, но в консоль сыплется большое количество одинаковых ошибок

Да, такие ошибки я видел, но у меня их ровно столько же
и без всякого кода, так что, думаю, это не связанные вещи.


Можно попробовать вырезать репортинг.
Вот, переписал так, импортирую и ... тишина.

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

Выделить код

Код:

(async url => {
	var nsvo = Cu.import(url, {});
	var code = `eval(\`${nsvo.insertFaviconForNode}\`);`
		.replace(
			".iconUri",
			'$& || node.iconUri.startsWith("http")'
				//+ `\n    && Components.stack.caller.filename == "${url}"\n  `
		)
		.replace(/(catch \(ex\) {).+?}/s, "$1}");

	var subst = "bookmarks-html-import-meds-tmp-script";
	var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
	var rph = ios.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
	rph.setSubstitution(subst, ios.newURI("data:," + encodeURIComponent(code)));
	Cc["@mozilla.org/moz/jssubscript-loader;1"]
		.getService(Ci.mozIJSSubScriptLoader).loadSubScript("resource://" + subst, nsvo);
	rph.setSubstitution(subst, null);
	
})("resource://gre/modules/BookmarkHTMLUtils.jsm");

Отсутствует

 

№1584723-09-2021 22:16:08

Senflex
Участник
 
Группа: Members
Зарегистрирован: 18-07-2021
Сообщений: 29
UA: Chrome 93.0

Re: Custom Buttons

Уважаемые форумчане! Как запустить cmd с командой, к примеру pause?
Можно ли это сделать?
Нужно запустить через CB.

384528d7375c.png

Отредактировано Senflex (23-09-2021 22:17:05)

Отсутствует

 

№1584823-09-2021 22:38:33

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 596
UA: Firefox 52.0

Re: Custom Buttons

Dumby пишет

Вот, переписал так, импортирую и ... тишина.

То, что надо. Огромное спасибо!


«The Truth Is Out There»

Отсутствует

 

№1584924-09-2021 11:18:12

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

Re: Custom Buttons

Почему это не работает ? goDoCommand("cmd_closeWindow");

Добавлено 24-09-2021 11:25:03
Senflex
Команда пауза в батнике

скрытый текст
ping -n 1 -w 1000 192.168.254.254 >nul
Где 1000 -миллесекунды
Код для СВ . Батник - в профиле !
скрытый текст

Выделить код

Код:

var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
         file.initWithPath(file.path + "\\твой.cmd");
file.launch();

Отредактировано ВВП (24-09-2021 11:25:03)

Отсутствует

 

№1585024-09-2021 12:02:18

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

Re: Custom Buttons

ВВП пишет

Почему это не работает ? goDoCommand("cmd_closeWindow");

Потому, что для этой команды нет контроллера.
Можно запускать её код напрямую:
BrowserTryToCloseWindow();


ВВП пишет

Батник - в профиле !

Хмм, а мне показалось, что спрашивалось запускать
не «твой.cmd», а непосредственно сам cmd.exe, ну типа так

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

Выделить код

Код:

var cmd = Services.dirsvc.get("SysD", Ci.nsIFile);
cmd.append("cmd.exe");

var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
process.init(cmd);

var args = ["/k", "echo Как видно?", "&&", "pause"];
process.runwAsync(args, args.length);

Отсутствует

 

Board footer

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