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

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

№1707630-03-2024 23:16:44

b0ttle
Участник
 
Группа: Members
Зарегистрирован: 22-10-2020
Сообщений: 182
UA: Firefox 124.0

Re: Custom Buttons

VORON
Есть еще такое. Тема UserChromeFiles.


upd: Похоже, файл удален. (Можете восстановить - "Load diff". Там можно увидеть и запись в файл).
Если так трудно, можно было папку профиля скопировать и запустить. А там разобраться уже легко, главное настроить config.js, config-prefs.js. Пути файлов видны по ссылке. Дальше, копируем chrome в папку профиля, или же сам профиль. Запускаем, разбираемся.
Если уже есть UCF, добавить запись в CustomStylesScripts.mjs. Почитайте "встроенная Справка" - Полный список▼.


В контекстном меню, есть функцию вызова "менеджера паролей". Когда добавили не знаю, может он там всегда был. Не пользуюсь. Ну в общем, при вызове, он сразу подстраивает под домен с которого вызван. По идее, надобность в ucf_cooks-pass.js не имеет смысла. Потому наверно и был удален, за ненадобностью. Сам не пользовался, так как у меня сторонний менеджер. Куки же, можно настроить в настройках и нужен редко, нет нужды в постоянном его вызове.


momo2000, ucf_aom-button.js

Отредактировано b0ttle (31-03-2024 23:26:13)

Отсутствует

 

№1707731-03-2024 10:03:18

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

Re: Custom Buttons

VORON
А [CB]Toggle Restartless Add-ons рабочая есть?

Отредактировано momo2000 (31-03-2024 10:04:22)

Отсутствует

 

№1707831-03-2024 10:23:22

VORON
Участник
 
Группа: Members
Зарегистрирован: 03-04-2013
Сообщений: 158
UA: Firefox 124.0

Re: Custom Buttons

momo2000
Давно не попадалась. Спроси у Dumby, может есть возможность починить.

Добавлено 31-03-2024 10:30:39
b0ttle
С этим вообще  не понял.
Скачал,закинул в папку   custom_scripts, перезапустил,с созданием нового кеша и ничего не появилось/не происходит.
Как это работает?

Отредактировано VORON (31-03-2024 10:30:39)

Отсутствует

 

№1707931-03-2024 16:07:03

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

Re: Custom Buttons

VORON - надо прописать скрипты в CustomStylesScripts.mjs.
В демо-профиле всё уже сделано, читайте шапку темы.

Отсутствует

 

№1708031-03-2024 16:22:14

Alex_one
Участник
 
Группа: Members
Зарегистрирован: 27-09-2015
Сообщений: 151
UA: Firefox 115.0

Re: Custom Buttons

Dumby
Добрый день.
Можно Вас попросить подправить кнопку для 115.9.1esr

Показать пароль на странице

Выделить код

Код:

((script, ID, NSVO) => {
    var nsvo = eval(NSVO), u = code => "data:," + encodeURIComponent(code);
    if (!(ID in nsvo)) {
        var processURL = u(script.replace(/%ID%/g, ID).replace("%NSVO%", NSVO));
        Services.ppmm.loadProcessScript(processURL, true);
        nsvo[ID].processURL = processURL;
        Services.mm.loadFrameScript(nsvo[ID].frameURL = u(`${NSVO}["${ID}"].init(this);`), true);
    }
    addDestructor(reason => {
        if (reason[5] != "e" || !(ID in nsvo)) return;
        Services.mm.removeDelayedFrameScript(nsvo[ID].frameURL);
        Services.mm.loadFrameScript(u(`${NSVO}["${ID}"].destroy(this);`), false);
        Services.ppmm.removeDelayedProcessScript(nsvo[ID].processURL);
        Services.ppmm.loadProcessScript(u(`${NSVO}["${ID}"].forget();`), false);
    });
})(`\
    (nsvo => nsvo["%ID%"] = {
        dblclick({target}) {
            if (target.hasAttribute("typechanged")) {
                target.type = "password";
                target.removeAttribute("typechanged");
            } else if (
                target.hasAttribute("type") &&
                target.getAttribute("type").toLowerCase() == "password"
            ) {
                target.type = "text";
                target.setAttribute("typechanged", true);
            }
        },
        init(cpmm) {
            cpmm.addEventListener("dblclick", this);
            cpmm.addEventListener("unload", this);
        },
        destroy(cpmm) {
            cpmm.removeEventListener("dblclick", this);
            cpmm.removeEventListener("unload", this);
        },
        handleEvent(e) {this[e.type](e);},
        unload(e) {this.destroy(e.target);},
        forget() {delete nsvo["%ID%"];}

    })(%NSVO%);`,
    `CB${_id.slice(20)}:PasswordTypeToggler`,
    `Components.utils.import("resource://gre/modules/Services.jsm", {})`
);

Отсутствует

 

№1708131-03-2024 20:58:39

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

Re: Custom Buttons

Alex_one пишет

Можно Вас попросить

Попросить-то можно, ...

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

Выделить код

Код:

(frag => {
	var g = Cu.getGlobalForObject(Cu);
	var ID = `CB${_id.slice(20)}:PasswordTypeToggler`;
	var u = code => "data:," + encodeURIComponent(code);
	if (!(ID in g)) {
		var processURL = u(`(id => globalThis[id] = ${frag})("${ID}");`);
		Services.ppmm.loadProcessScript(processURL, true);
		g[ID].processURL = processURL;
		Services.mm.loadFrameScript(g[ID].frameURL = u(`globalThis["${ID}"].init(this);`), true);
	}
	addDestructor(reason => {
		if (reason[5] != "e" || !(ID in g)) return;
		Services.mm.removeDelayedFrameScript(g[ID].frameURL);
		Services.mm.loadFrameScript(u(`globalThis["${ID}"].destroy(this);`), false);
		Services.ppmm.removeDelayedProcessScript(g[ID].processURL);
		Services.ppmm.loadProcessScript(u(`globalThis["${ID}"].forget();`), false);
	});
})(`\
{
	dblclick(e) {
		var trg = e.target, ed = trg.editor;
		if (ed instanceof Ci.nsIEditor && ed.flags & ed.eEditorPasswordMask)
			trg.revealPassword = !trg.revealPassword;
	},
	init(cfmm) {
		cfmm.addEventListener("dblclick", this);
		cfmm.addEventListener("unload", this);
	},
	destroy(cfmm) {
		cfmm.removeEventListener("dblclick", this);
		cfmm.removeEventListener("unload", this);
	},
	handleEvent(e) {this[e.type](e);},
	unload(e) {this.destroy(e.target);},
	forget: () => delete globalThis[id]
}`);

Отредактировано Dumby (31-03-2024 23:37:24)

Отсутствует

 

№1708231-03-2024 23:04:04

b0ttle
Участник
 
Группа: Members
Зарегистрирован: 22-10-2020
Сообщений: 182
UA: Firefox 124.0

Re: Custom Buttons

Alex_one
Для чего код? Показать пароль под звездочками в контекстном меню? Вроде такая функция встроена в контекстном меню.
Похоже в какой-то версий добавили. В esr наверно еще нет. Пробовал проверить код, так и не понял что делает.

Отредактировано b0ttle (31-03-2024 23:12:27)

Отсутствует

 

№1708331-03-2024 23:38:04

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

Re: Custom Buttons

b0ttle пишет

Для чего код? Показать пароль под звездочками в контекстном меню? Вроде такая функция встроена в контекстном меню.

Ну, видимо, есть непреодолимое желание,
чтобы именно по двойному клику.


Но, кстати да, с пунктом контекстного меню,
получается, не гармонирует, переделал как в нём.

Отсутствует

 

№1708401-04-2024 02:14:45

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

Re: Custom Buttons

Dumby придумай исчезающий диалог !
Идея такая: при опасных действиях (перезапуск браузера и т.п.) открываем диалог с текстом предупреждения или панель или подсказку.
Диалог или панель должны исчезнуть через пару секунд, не выполняя опасную команду.
Если юзер кликнул по кнопке «Да» или по форме/панели/предупреждению с текстом, то выполняем опасное действие.

Отсутствует

 

№1708501-04-2024 12:39:18

Alex_one
Участник
 
Группа: Members
Зарегистрирован: 27-09-2015
Сообщений: 151
UA: Firefox 115.0

Re: Custom Buttons

Dumby,
Спасибо большое, код заработал.
thank-you.gif


b0ttle
Как сказал Dumby,

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

А так да, в контекстном меню есть эта фишка на 115.9.1esr.

Отсутствует

 

№1708602-04-2024 07:32:00

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

Re: Custom Buttons

Dobrov пишет

Dumby придумай исчезающий диалог !
Идея такая: при опасных действиях (перезапуск браузера и т.п.) открываем диалог с текстом предупреждения или панель

Нашёл кого спросить. Ну, допустим, <panel>'ь

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

Выделить код

Код:

var ask = (...args) => {
	var popup = document.createXULElement("panel");
	var popupset = document.getElementById("mainPopupSet");

	popup.setAttribute("onpopupshown", "move();");
	popup.setAttribute("onpopuphidden", "this.remove()");
	
	var box = popup.appendChild(document.createXULElement("box"));
	box.style.cssText = "font-size: 32px; margin: 1em 2em 1.3em 2em; font-weight: bold; max-width: 680px;";
	var tn = box.appendChild(new Text());
	var hide = () => {
		popup.hidePopup();
		popup.onclick = null;
	}
	var {style} = popup;
	popup.move = () => {
		var sc = window.screen;
		var pr = popup.getOuterScreenRect();
		popup.moveTo((sc.width - pr.width) / 2, (sc.height - pr.height) / 2.7);
		style.opacity = "1";
	}

	(ask = (text, onclick, timeout = 2e3) => {
		tn.data = text;
		style.opacity = "0";
		popupset.append(popup);
		popup.onclick = onclick;
		popup.openPopup();
		setTimeout(hide, timeout);
	})(...args);
}

ask(
	"Кликните здесь, чтобы стереть диск Цэ.",
	() => alert("Диск Цэ стёрт!")
);

Отсутствует

 

№1708702-04-2024 16:00:08

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

Re: Custom Buttons

Dumby спасибо! Но перенос строки не пашет!
И желательно добавить ниже мелким шрифтом текст пояснения, например: выполнение команды «format C:»


нашёл только такой способ:

Выделить код

Код:

// var tn = box.appendChild(new Text());
const div = document.createElement("div");
var tn = box.appendChild(div);
div.insertAdjacentHTML("afterbegin", '<p>afterbegin -  В начало элемента</p>');
div.insertAdjacentHTML("beforeend", '<p>beforeend - В конец элемента</p>');

Отредактировано Dobrov (02-04-2024 16:22:45)

Отсутствует

 

№1708803-04-2024 07:47:23

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

Re: Custom Buttons

Dobrov пишет

перенос строки не пашет

white-space: pre-wrap; или типа того.

createElement("div")

Можно и div

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

Выделить код

Код:

var ask = (...args) => {
	var popup = document.createXULElement("panel");
	var popupset = document.getElementById("mainPopupSet");

	popup.setAttribute("onpopupshown", "move();");
	popup.setAttribute("onpopuphidden", "this.remove()");
	
	var div = popup.appendChild(document.createElement("div"));
	div.style.cssText = "font-size: 32px; margin: 1em 2em 1.3em 2em; font-weight: bold; max-width: 680px; white-space: pre-wrap;";

	var header = div.appendChild(document.createElement("div")).appendChild(new Text());

	var footer = div.appendChild(header.parentNode.cloneNode(true));
	footer.style.cssText = "font-size: 16px; font-style: italic; margin-top: 1em;";
	footer = footer.firstChild;

	var hide = () => {
		popup.hidePopup();
		popup.onclick = null;
	}
	var {style} = popup;
	popup.move = () => {
		var sc = window.screen;
		var pr = popup.getOuterScreenRect();
		popup.moveTo((sc.width - pr.width) / 2, (sc.height - pr.height) / 2.7);
		style.opacity = "1";
	}

	(ask = (text, explainer, onclick, timeout = 2e3) => {
		header.data = text;
		footer.data = explainer;

		style.opacity = "0";
		popupset.append(popup);
		popup.onclick = onclick;
		popup.openPopup();
		setTimeout(hide, timeout);
	})(...args);
}

ask(
	"Кликните здесь,\nчтобы стереть диск Цэ.",
	"выполнение команды «format C:»\n(не рекомендуется)",
	() => alert("Диск Цэ стёрт!")
);


Но, ты же понимаешь, что писать uй это совсем не моё.

Отсутствует

 

№1708905-04-2024 13:13:44

Alex_one
Участник
 
Группа: Members
Зарегистрирован: 27-09-2015
Сообщений: 151
UA: Firefox 115.0

Re: Custom Buttons

Всем привет!
Даже не знаю в какой теме правильно будет задать этот вопрос.
Ну попробую здесь, может подскажите или совет какой дадите.


Использую кнопку для Custom Buttons

Рестарт

Выделить код

Код:

Services.startup.quit(Services.startup.eAttemptQuit | Services.startup.eRestart)

и установлено расширение Group Speed Dial, и вот после перезагрузки (если не открыты какие-либо вкладки)
то само расширение не загружается, а открывается просто белое окно.
Тогда приходится в ручную закрывать эту вкладку и только тогда загружается само расширение.
А если просто закрыть браузер и открыть то такой проблемы нет.


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

Отсутствует

 

№1709005-04-2024 17:37:04

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1650
UA: Firefox 115.0

Re: Custom Buttons

Alex_one
У меня так же при рестарте, только расширение другое и кнопка скриптовая, а не CB.

Отсутствует

 

№1709105-04-2024 18:48:12

Alex_one
Участник
 
Группа: Members
Зарегистрирован: 27-09-2015
Сообщений: 151
UA: Firefox 115.0

Re: Custom Buttons

_zt
Спасибо за ответ!
Понятно, значит это дело никак не победить :(

Отсутствует

 

№1709205-04-2024 23:27:20

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

Re: Custom Buttons

Alex_one
Тоже иногда бывает. И даже не при рестарте, а просто при запуске браузера. У меня это происходит, обычно, после бэкапа профиля. Когда чищу профиль, частично куки и удаляю кэш. Приложение Group Speed Dial. Давно писал об этой проблеме автору, он поправил, но проблема вернулась.

Alex_one пишет

значит это дело никак не победить

:angry:

Отсутствует

 

№1709316-04-2024 16:21:39

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

Re: Custom Buttons

Dumby подскажи где ошибка

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

Выделить код

Код:

//Вызвать окно поиска по текущему сайту по правому клику на search-go-button.................................................................................................... 
(bar => {
 
   if (!bar) return;
 
   var searchbar = window.document.getElementById("searchbar");
	      if (!searchbar)
	        return;
        var btn = searchbar.querySelector(".search-go-button") ||
			        window.document.getAnonymousElementByAttribute(searchbar, "class", "search-go-button");
		        
		btn.setAttribute("hidden", "false");	        

var UpdateExt = function(event) {

 var Sel="javascript: var getSel=function(w){ var s,d=w.document; if(d.selection){ var r=d.selection.createRange(); s=r?r.text:''} else {s=d.getSelection().toString(); if(!s){var e,t=d.getElementsByTagName('textarea'),u=d.getElementsByTagName('input'),i=t.length; while(e=(i>0)?t[--i]:u[-i--]) try{ if(e.offsetHeight>0&&(s=e.value.substring(e.selectionStart,e.selectionEnd)))break}catch(x){}}}; if(!s)for(var j=0,f;f=w.frames[j];j++){try{if(s=getSel(f))break}catch(x){}}; return s}; var w=content,s=w.prompt('Поиск на этом сайте с помощью Google',getSel(w)); if(s){open('http://www.google.com/search?as_q='+encodeURIComponent(s)+'&as_sitesearch='+w.location.hostname) } void(0);";

    if (event.button != 2)
            return;
        //отключать реакцию по умолчанию
        event.preventDefault();
        event.stopPropagation();
 gBrowser.fixupAndLoadURIString(Sel, {
    triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
});
       };
// добавляем обработчик для кнопки поиска..........
    btn.addEventListener("click", UpdateExt, false);

    })(BrowserSearch.searchBar);

Отредактировано Andrey_Krropotkin (17-04-2024 01:14:30)

Отсутствует

 

№1709417-04-2024 01:08:19

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

Re: Custom Buttons

Подскажите последнюю рабочую версию кнопки - вставка спец. символов

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

Выделить код

Код:

(this.type != "menu" && (this.type = "menu") && !this.hasAttribute("is")) || (popup => {
    var columns = [
        ' \u0027 " ‘ ’ ‚ ; “ ” „ “ ” ` // ',
        ' /* */ ( ) { } [ ] « » ‹ › ¦ ',
        ' … ≈ ≠ × ± — № => → # • ° ¤ ',
        ' Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ    ',
        ' \uD83E\uDD8A \uD83D\uDE0E § & \u0027 \u002Fn \u002Fb \u002F @ ✓ ✗ ¬  '
    ];
    var css = //0&&
    `
        #${_id} menuitem > .menu-text {
            font-size: 18px;
            font-family: Consolas, Rockwell, Verdana;
            text-align: center;
            -moz-appearance: none;
            margin: 0;
            padding: 0 14px;
        }
        #${_id} menuitem > :not(.menu-text) {
            display: none;
        }
        #${_id} menugroup,
        #${_id} > menupopup > arrowscrollbox {
            background-color: menu;
        }
    `.replace(/;/g, " !important;");

    var inserter = {
        get docShell() {
            delete this.docShell;
            return this.docShell = "docShell" in document
                && document.docShell instanceof Ci.nsIDocShell
                ? document.docShell : window.docShell;
        },
        get insertText() {
            delete this.insertText;
            return this.insertText = text => {
                if (!this.docShell.isCommandEnabled("cmd_insertText")) return;
                var params = "createCommandParams" in Components.utils
                    ? Cu.createCommandParams()
                    : Components.classes["@mozilla.org/embedcomp/command-params;1"]
                        .createInstance(Components.interfaces.nsICommandParams);
                params.setStringValue("state_data", text);
                this.docShell.doCommandWithParams("cmd_insertText", params);
            }
        },
        insert(text) {
            var br = document.activeElement;
            !br || br.localName != "browser" || !br.isRemoteBrowser
            ? this.insertText(text) : br.messageManager.loadFrameScript(
                `data:,(${this.insertText})${encodeURIComponent(text.toSource())}`
            , false, true);
        }
    };
    this.onclick = function(e) { 
    if (e.button == 1) {
        var profileDir1 = Components.classes["@mozilla.org/file/directory_service;1"]
            .getService(Components.interfaces.nsIProperties)
            .get("SysD", Components.interfaces.nsIFile)
           .path;
        var tracepath = profileDir1 + "\\..\\system32\\charmap.exe";
        Components.Constructor("@mozilla.org/file/local;1", "nsIFile", "initWithPath")(tracepath).launch();
        }
    };
    addEventListener("popupshowing", function ps() {
        removeEventListener("popupshowing", ps, true, popup);
        if (css) {
            var dwu = "windowUtils" in window && windowUtils instanceof Ci.nsIDOMWindowUtils
                ? windowUtils : window.QueryInterface(Ci.nsIInterfaceRequestor)
                    .getInterface(Ci.nsIDOMWindowUtils);
            var type = dwu.AGENT_SHEET;
            var url = "data:text/css," + encodeURIComponent(css);
            dwu.loadSheetUsingURIString(url, type);
            addDestructor(() => dwu.removeSheetUsingURIString(url, type));
        }
        var df = document.createDocumentFragment();
        for(var symbols of columns) {
            var menugroup = popup.appendChild(document.createElementNS(xulns, "menugroup"));
            menugroup.setAttribute("orient", "vertical");
            for(var sym of symbols.split(" ")) menugroup.appendChild(
                document.createElementNS(xulns, "menuitem")
            ).setAttribute("label", sym);
        }
        popup.append(df);
        var parent = "boxObject" in menugroup
            ? menugroup.boxObject.parentBox
            : menugroup.flattenedTreeParentNode;
        if (parent.localName == "slot") parent = parent.parentNode;
        parent.setAttribute("orient", "horizontal");
        if (parent.localName == "scrollbox")
            parent.style.setProperty("-moz-box-orient", "horizontal", "important");
        popup.setAttribute("context", "");
        popup.inserter = inserter;
        popup.setAttribute("oncommand", "inserter.insert(event.target.label);");
        popup.onauxclick = e => {
            var sym = e.target.label;
            sym && inserter.insert(sym);
        }
    }, true, popup);
    this.prepend(popup);
})(document.createElementNS(xulns, "menupopup"));
this.tooltipText="Вставка символов.\n\nЛКМ - Вставить симвлоы\nСКМ - Таблица символов Windows\nПКМ - Меню кнопки";

Отсутствует

 

№1709517-04-2024 07:29:39

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

Re: Custom Buttons

Andrey_Krropotkin пишет

подскажи где ошибка

Консоль подскажет.
Может content заменить на window

вставка спец. символов

raf, вроде, помогает, если ты об этом

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

Выделить код

Код:

/*
    addEventListener("popupshowing", function ps() {
*/
    addEventListener("popupshowing", async function ps() {


/*
        popup.append(df);
*/
        popup.append(df);
        await new Promise(requestAnimationFrame);

Отсутствует

 

№1709617-04-2024 12:08:38

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

Re: Custom Buttons

Dumby большое спасибо

Отредактировано Andrey_Krropotkin (17-04-2024 12:09:47)

Отсутствует

 

№1709728-04-2024 16:23:47

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

Re: Custom Buttons

Здравствуйте, уважаемые кнопкоделы!
¿ Не могли бы вы посмотреть кнопку Открыть страницу в другом браузере( Firefox ) от 20.05.2019., и как-нибудь её адаптировать к актуальным версиям. В ней уже сразу не работает ЛКМ => Открыть меню с браузерами.
Заранее спасибо.
Или может у кого есть уже готовая похожая кнопка ?

Отсутствует

 

№1709828-04-2024 17:16:19

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 130
UA: Firefox 125.0

Re: Custom Buttons

vending_machine пишет

Или может у кого есть уже готовая похожая кнопка ?

Есть в виде скрипта, добавляет пунктики в конт. меню.

Отсутствует

 

№1709928-04-2024 21:03:57

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

Re: Custom Buttons

fuchsfan пишет

Есть в виде скрипта, добавляет пунктики в конт. меню.

Да пригодился бы. Поставил Вивальди, хочу посмотреть, чем оно лучше Edge в споре за второе место.

Отсутствует

 

№1710029-04-2024 08:27:17

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 130
UA: Firefox 125.0

Re: Custom Buttons

vending_machine

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

Выделить код

Код:

// ==UserScript==
// @name            OpenWith.uc.js
// @description     Пункты в конт. меню для открытия текущей страницы или ссылки в другом браузере
// @version         1.2.1a  63+
// @author          y2k
// @include         main
// @charset         UTF-8
// @namespace       http://tabunfirefox.web.fc2.com/
// @note            Показывает значок приложения
// @note            Переписан как сценарий .uc.js
// ==UserScript==
(function() {
"use strict";
/*
    Перед использованием измените пути к собственным браузерам (\ заменяется на \\)
    Для передачи аргументов выполните следующие действия:
    C:\\Program Files\\Internet Explorer\\iexplore.exe<>$1 Argument Argument
    ※ $1 преобразуется в URL
*/
const BrowserPath = {
//    "Nightly  ":      "D:\\Nightly 64\\NightlyMultiLoader.exe",
//   "Nightly Neu ":    "D:\\Nightly Neu\\MultipleFirefoxLoader.exe",
//    "Beta":           "D:\\Beta 64\\BetaMultiLoader.exe",
//    "Neu":            "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe",
//    "Test":           "D:\\Test\\MultiLoader.exe",
    "IE":               "C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe",
//    "ESR 91":         "D:\\ESR 91\\MultiLoader.exe",    
//    "ESR 78":         "D:\\ESR 78\\MultiLoader.exe",
//    "ESR 68":         "D:\\ESR 68\\MultiLoader.exe",
//    "ESR 60":         "D:\\ESR 60\\MultiLoader.exe",
//    "ESR 52":         "D:\\ESR 52\\MultipleFirefoxLoader.exe",
    "Chrome":           "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
//    "Edge":           "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
};

const FlatMenu = false;

const OpenWith = {
    start: function() {
        const cm = document.getElementById("contentAreaContextMenu");
        cm.addEventListener("popupshowing", function(e) {
            if (e.target == this) { OpenWith.onpopup(e); }
        }, false);
    },

    createMenu: function() {
        if (this.pageItem || this.linkItem) {
            return;
        }

        const contextMenu = document.getElementById("contentAreaContextMenu");
        const pageMenu = this.$C("menu", { id: "context-open-with-page", label: "Открыть страницу в браузере:", class: "menu-iconic",
 image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADLElEQVQ4jW2T20+bdQCGv79lcxx6HN9HYZhl2cyuNEQTvTBZTIyHWxe9MYveaGKi0RtJyDY2FGo/l8G2MkCElhZaoO2go6OTcuhaWoRCSw+jLS0dX3+PN5vJCM/1+1697yNJx7iUtCtt4RG1Nfh3SvG7hTzjFWb3o5RpLKS2TySV4/nXsMTudrfHhmmLuVFCDuQ5Fy2eaSyeEHpXBONoFNke7z6x3L5p87ZrLuT1Bxgf38McGEGem8Q0NU2nb4nvI1voR9bQuSro72x6Xyu3bvd0fVCf59fcMudWhsWHUQ9frIcweCdocXtoGp3hp7UtIsUjYRmKIU9VMNh2uiRJkqTLZZtRzvXxaXEKhBDJahkhBN/Gn2KecyB7PBjG/TTaH5GoHIIQ4jN/njN9eZSBmlHqyPb2t5at2CvPGNqPYXyicjW+gBCCOzvb6CcnMTn9nL4X4KPZONTr9K09540/Shh+K/RLbZkbqfN7NnZrFS7F7JjDf/KklGO1VKJl1olpysVZZwDDaJC3nKsIrY66XuTUrTS6nnxKsuxdF2+nB0nUnmNcsfLldoCVUhGdb4gm9yh61ySGCR+64QXG/s0jtCOC+SqKmqKhpyAkJXNdvL93n2fVAsaVPq5sTIMm+CGxgprewpnNYnb4OT3oYzazD9oR1OvIaoozN/NCsmRupi7nBkjXyrRFB5HDAyAEQtP4cSPKlaUlGoY9nHc9pVI7Ak3jQazEqd4Mut58SurI9vZbyirLhxmu7QTQPb7N1Y1FModVvlr9h/cWgny3miBXfcHtaJZDrcbn3jSN6gH6W/l+6ULZZlRyfXz8csaLa6M0+610hmcYye4yXygytLvHRXcEWzwHQohvFos09Ocx/l4zSpIkSW/uWrtatYf8XAiDEOLrRIiWhb9onh5DPzmN7JznWjgJQohflnM0jVXRWV8e6RUdSatXeTHOJztzRA4KZA5rxCtlogcVdg9qeLL7vDu3SaOjis527MqvOJe4221ev8/ZqIMLYQ+doQDvLARp8y7S7IrQ9HAVkz12skz/S5W0K0poSDX7RlJGn0MYpjzCMO5LmcaCqnyCzv8BRmmCMzO3S40AAAAASUVORK5CYII=" });
        contextMenu.insertBefore(pageMenu, contextMenu.querySelector(":scope > #context-bookmarkpage, :scope > #context-savepage"));

        const linkMenu = this.$C("menu", { id: "context-open-with-link", label: "Открыть ссылку в браузере:", class: "menu-iconic",
 image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADLElEQVQ4jW2T20+bdQCGv79lcxx6HN9HYZhl2cyuNEQTvTBZTIyHWxe9MYveaGKi0RtJyDY2FGo/l8G2MkCElhZaoO2go6OTcuhaWoRCSw+jLS0dX3+PN5vJCM/1+1697yNJx7iUtCtt4RG1Nfh3SvG7hTzjFWb3o5RpLKS2TySV4/nXsMTudrfHhmmLuVFCDuQ5Fy2eaSyeEHpXBONoFNke7z6x3L5p87ZrLuT1Bxgf38McGEGem8Q0NU2nb4nvI1voR9bQuSro72x6Xyu3bvd0fVCf59fcMudWhsWHUQ9frIcweCdocXtoGp3hp7UtIsUjYRmKIU9VMNh2uiRJkqTLZZtRzvXxaXEKhBDJahkhBN/Gn2KecyB7PBjG/TTaH5GoHIIQ4jN/njN9eZSBmlHqyPb2t5at2CvPGNqPYXyicjW+gBCCOzvb6CcnMTn9nL4X4KPZONTr9K09540/Shh+K/RLbZkbqfN7NnZrFS7F7JjDf/KklGO1VKJl1olpysVZZwDDaJC3nKsIrY66XuTUrTS6nnxKsuxdF2+nB0nUnmNcsfLldoCVUhGdb4gm9yh61ySGCR+64QXG/s0jtCOC+SqKmqKhpyAkJXNdvL93n2fVAsaVPq5sTIMm+CGxgprewpnNYnb4OT3oYzazD9oR1OvIaoozN/NCsmRupi7nBkjXyrRFB5HDAyAEQtP4cSPKlaUlGoY9nHc9pVI7Ak3jQazEqd4Mut58SurI9vZbyirLhxmu7QTQPb7N1Y1FModVvlr9h/cWgny3miBXfcHtaJZDrcbn3jSN6gH6W/l+6ULZZlRyfXz8csaLa6M0+610hmcYye4yXygytLvHRXcEWzwHQohvFos09Ocx/l4zSpIkSW/uWrtatYf8XAiDEOLrRIiWhb9onh5DPzmN7JznWjgJQohflnM0jVXRWV8e6RUdSatXeTHOJztzRA4KZA5rxCtlogcVdg9qeLL7vDu3SaOjis527MqvOJe4221ev8/ZqIMLYQ+doQDvLARp8y7S7IrQ9HAVkz12skz/S5W0K0poSDX7RlJGn0MYpjzCMO5LmcaCqnyCzv8BRmmCMzO3S40AAAAASUVORK5CYII=" });
        contextMenu.insertBefore(linkMenu, contextMenu.querySelector(":scope > #context-sep-open"));

        this.pageItem = this.createMenuItem(pageMenu, "openPage", FlatMenu? "Открыть страницу в $1 ":"  $1");
        this.linkItem = this.createMenuItem(linkMenu, "openLink", FlatMenu? "Открыть ссылку в $1 ":"  $1");
    },
    
    createMenuItem: function(menu, method, format) {
        const frag = document.createDocumentFragment();
        
        let menuitem = [];
        for (let i of Object.keys(BrowserPath)) {
            const item = this.$C("menuitem", {
                label:    format.replace("$1", i),
                class:    "menuitem-iconic",
                image:    "moz-icon:file:///" + BrowserPath[i].split("<>")[0] + "?size=16",
                value:    JSON.stringify([ method, i ]),
            });
            item.addEventListener("command", this, false);

            frag.appendChild(item);
            menuitem[menuitem.length] = item;
        }
        
        if (!FlatMenu) {
            const menupopup = this.$C("menupopup");
            menupopup.appendChild(frag);
            menu.appendChild(menupopup);
            menuitem = [ menu ];
        }
        else {
            const parent = menu.parentNode;
            parent.insertBefore(frag, menu);
            parent.removeChild(menu);
        }
        
        return menuitem;
    },

    $C: function(tag, attrs) {
        const elem = document.createXULElement(tag);
        if (attrs) {
            for (let key of Object.keys(attrs))
                elem.setAttribute(key, attrs[key]);
        }
        return elem;
    },

    onpopup: function(e) {
        this.createMenu();
        
        const isHtml = /^(https?|file):/.test(gBrowser.currentURI.spec);
        const pageItemHidden = !isHtml || gContextMenu.onLink || gContextMenu.onTextInput;
        const linkItemHidden = !isHtml || !gContextMenu.onLink || gContextMenu.onTextInput;
        
        const pageItem = this.pageItem;
        for (let i = 0, l = pageItem.length; i < l; i++) {
            pageItem[i].hidden = pageItemHidden;
        }
        const linkItem = this.linkItem;
        for (let i = 0, l = linkItem.length; i < l; i++) {
            linkItem[i].hidden = linkItemHidden;
        }
    },

    handleEvent: function(event) {
        if (event.type === "command") {
            const [ method, key ] = JSON.parse(event.originalTarget.getAttribute("value"));
            const url = method === "openPage"? gBrowser.currentURI.spec: gContextMenu.linkURL;
            this.launch(BrowserPath[key], url);
        }
    },
    
    launch: function(browserPath, openURL) {
        let [ path, args ] = browserPath.split("<>");
        if (args) {
            args = args.split("^^").map(a => a.replace("$1", openURL));
        } else {
            args = [ openURL ];
        }
        
        const file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
        file.initWithPath(path);
        
        const process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
        process.init(file);
        process.run(false, args, args.length, {});
    },
};

OpenWith.start();

})();

Отсутствует

 

Board footer

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