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

Пользователи не любят читать документацию. Станьте оригинальным, будьте не как все. Ознакомьтесь с нашей базой знаний.

№1597615-10-2021 18:53:09

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

Re: Custom Buttons

ВВП пишет

popup появляется , но пункт "удалить с панели..." не работает. При ctrl + ПКМ - работает ....Это как код поменяли

Да, действительно, вижу.
Это всё этот мерзкий баг, сколько же всего повылезало.
Вот, ещё больше сумбура, но, надеюсь, будет работать.


Custom Buttons 0.0.7.0.0.21
paxmod и bootstrap в zip-папке.

Отсутствует

 

№1597715-10-2021 19:49:28

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

Re: Custom Buttons

Dumby
бЛАГОДАРЮ, тут другое  BrowserUtils.jsm такого понавертели , что кн. "увел. изображение " лопнула... Команда   handleCommand(); не работает. Заманался рихтовать сам BrowserUtils.jsm ....Что делать?  Снят вопрос , люди скрипт подсказали , но можно и кнопкой

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

Выделить код

Код:

/*Initialization Code*/
addEventListener("popupshowing", {
    imgZoom: 190,   // на сколько увеличить изображение из меню
    scrollZoom: 20, // на сколько увеличивать/уменьшать колесиком мыши
    scrollTop: 1,   // или -1, переключение направление прокрутки для увеличение колёсиком

    receiveMessage(msg) {
        var container = document.documentElement
            .appendChild(document.createElement("div"));
        addDestructor(() => container.remove());
        var image = container.appendChild(document.createXULElement("image"));
        image.style.cssText = "width: 100% !important; height: 100% !important;";
        image.setAttribute("validate", "never");

        var st = container.style;
        var dz = this.scrollZoom/100 * this.scrollTop;
        var currScale = 1, x, y, initialZoom = this.imgZoom/100 - 1;

        var hide, props = ["width", "height", "left", "top"], p = n => n + "px";
        var set = (...args) => props.forEach((prop, ind) => st[prop] = p(args[ind]));

        (hide = () => {
            st.cssText = "position: fixed; display: none; z-index: 2147483647;";
            currScale = 1;
            image.src = null;
        })();
        container.onwheel = (e, ds = e.deltaY > 0 ? -dz : dz) => {
            if (currScale < .15 && ds < 0) return;
            st.transform = `scale(${currScale += ds})`;
            var {width, height, left, top, bottom, right} = container.getBoundingClientRect();

            if (height < innerHeight) {
                if (top < 0) st.top = p(y -= top);
                if (bottom > innerHeight) st.top = p(y -= bottom - innerHeight);
            }
            if (width < innerWidth) {
                if (left < 0) st.left = p(x -= left);
                if (right > innerWidth) st.left = p(x -= right - innerWidth);
            }
        }
        (this.receiveMessage = msg => {
            var {src, width, height, left, top} = msg.data;
            image.src = src;
            left -= mozInnerScreenX;
            top -= mozInnerScreenY;

            set(width, height, x = left, y = top);
            st.display = "block";
            container.onwheel(null, initialZoom);
            window.addEventListener("mousedown", hide, {once: true, capture: true});
        })(msg);
    },
    handleEvent(e) {
        if (!gContextMenu.onImage) return;
        var menuitem = document.createXULElement("menuitem");
        menuitem.setAttribute("label", "Увеличить размер");
        menuitem.className = "menuitem-iconic";
        menuitem.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==");
        menuitem.setAttribute("oncommand", "handleCommand();");
        e.target.append(menuitem);
        addDestructor(() => menuitem.remove());
        menuitem.handleCommand = () => this.cmd();

        this.handleEvent = () => menuitem.hidden = !gContextMenu.onImage;
    },
    cmd() {
                var msg = this.msg = "UCF:GetImageScreenRectForMosuseZoom";
                var code = `(targetIdentifier => {
                    var image = ChromeUtils.import("resource://gre/modules/ContentDOMReference.jsm")
                        .ContentDOMReference.resolve(targetIdentifier);
                    var mm = image.ownerGlobal.docShell.messageManager;
                    var rect = image.getBoundingClientRect();
                    var win = image.ownerGlobal;
                    var x = rect.left, y = rect.top;
                    var parentFrame = win.frameElement;
                    while (parentFrame) {
                      win = parentFrame.ownerGlobal;
                      let cstyle = win.getComputedStyle(parentFrame);
                      let framerect = parentFrame.getBoundingClientRect();
                      x +=
                        framerect.left +
                        parseFloat(cstyle.borderLeftWidth) +
                        parseFloat(cstyle.paddingLeft);
                      y +=
                        framerect.top +
                        parseFloat(cstyle.borderTopWidth) +
                        parseFloat(cstyle.paddingTop);
                      parentFrame = win.frameElement;
                    }
                      x += win.mozInnerScreenX;
                      y += win.mozInnerScreenY;
                    var fullZoom = win.windowUtils.fullZoom;
                    mm.sendAsyncMessage("${msg}",
                        {
                            src: image.currentSrc,
                            left: x * fullZoom,
                            top: y * fullZoom,
                            width: rect.width * fullZoom,
                            height: rect.height * fullZoom,
                        }
                    );
                })(`;
                messageManager.addMessageListener(msg, this);
        (this.cmd = () => {
            var {osPid} = gContextMenu.actor.manager.browsingContext.currentWindowGlobal;
            if (osPid == -1) osPid = Services.appinfo.processID;
            for(var ind = 0, len = Services.ppmm.childCount; ind < len; ind++) {
                var pmm = Services.ppmm.getChildAt(ind);
                if (pmm.osPid == osPid) break;
            }
            pmm.loadProcessScript("data:;charset=utf-8," + encodeURIComponent(
                code + JSON.stringify(gContextMenu.targetIdentifier) + ")"
            ), false);
        })();
    }
}, false, document.getElementById("contentAreaContextMenu") || 1);

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

Отсутствует

 

№1597816-10-2021 05:45:55

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

Re: Custom Buttons

Приветствую всех! Как прочитать CSS (текстовый файл) в переменную? Данный код не работает:

Выделить код

Код:

var reader = new FileReader();
reader.readAsText('chrome://user_chrome_files/content/custom_scripts/ucf_Reader.css');
var green = reader.result;

Второй вопрос: перестал работать CSS, переключающий стиль на любой странице на более подходящий для чтения. Остаётся только зелёный фон, а должен меняться и фон и текст.

Выделить код

Код:

/*AGENT_SHEET*/

@-moz-document url-prefix("http"), url-prefix("https"), url-prefix("ftp"), url-prefix("file") {
html *, html {
background: #ccd1d1 !important; text-shadow: none !important;
color: #000000 !important;
-moz-border-top-colors: #8FBC8F !important; -moz-border-bottom-colors: #8FBC8F!important; -moz-border-left-colors: #8FBC8F !important; -moz-border-right-colors: #8FBC8F !important;
}
code, pre, input, samp, kbd, var, dfn,.postright {
-moz-appearance: none !important;
background-color: #BADBAD !important;
}
input, select, textarea, button {
-moz-appearance: none !important;
border: 1px solid #BADBAD !important;
background-color: #BADBAD !important;
}
.codebox, BLOCKQUOTE, TEXTAREA, .spoiler { -moz-border-top-colors: #444  !important; -moz-border-bottom-colors: #444 !important;
-moz-border-left-colors: #444 !important; -moz-border-right-colors: #444 !important; }
}

UCF - Кнопка переключения стиля страниц

Выделить код

Код:

try {	CustomizableUI.createWidget({ tooltiptext: `ЛКМ:	Reader`,
		type: "custom", id: "ucf_Reader", label: "Reader", localized: false,
		onBuild(doc) {
			var trbn = doc.createXULElement("toolbarbutton");
			trbn.id = this.id; trbn.tooltipText = this.tooltiptext; trbn.label = this.label;
			trbn.className = "toolbarbutton-1 chromeclass-toolbar-additional";
			trbn.setAttribute("context", false);
			trbn.style.setProperty("list-style-image", 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACS0lEQVR4Xt1VIZCkMBBcGYlERiKRSCQSuTISiUQiVyJXIle8QCKRSOTJkyterDtU8t1cpipVl937f3mpmkuupnt6MjNhTz9v1XWdYi1Jkjit9YilXuGBGYDfySH3WwEAR2xODCLdi+BtiCX32+yVUg8cd5BvJPH/WGZVVRF790lM5ITYqGVZZkhAeVbnnOIOkivLMosIZPARu2ERu5DrY8QXQFNYFgTWsOoZviiKSsSlXBCan5VH84qwXUj/YuSAK2XSsYZJeZb/nUByfQWamHOmM8/z3hiTNU2T/q1A27YpOeTGysSGHeWRqZGrYuwm+J6Wiz5OkHDCGIwZn2eaUnJmNnfUN4/UPIfvPcahMeaX2qVa2/Y62mHdbD/NNitKK2OLF52gBAWNZ6yVPmKIJYdcxgh66buPRwKCI2janZ0eznEf3x9W57n1r3TjHp7pIybkUAjixH1Oo0xPZZoD+Ov37sRIaIbrIRAz+oi53T/x3MlBLEnKnND9leCW4IcIfBzGrIZlFYEd5TE0nmH0kQNsIIAYrU8Kk7id8Gf9zGZANqHAAXaXeQlrGvaMvi8C4a0ZmyU6E1zWZ1/LAyhgZy6D1H0QAX+m78AInlwKlOfzIcDYbLJ8Ilx/m+wcNOy6vXEqnH+ApQj4s6OPGGkyuYzBWPJl9RnpngSF7tdtZzuAzOUSjtwU+d2YvAixB4dcxvDZ9+FTVyDcggmxwUNbi6JIBRvcIqUvxoH42HWdiv0eNFB+4xWx32E9xJMX36CEGGI5++BvjHH6UesPIe4VKP0pWeUAAAAASUVORK5CYII=")', "important");
			trbn.addEventListener("click", function(e) {
				var win = e.view;
				if (e.button == 0) {

					var green = `
@-moz-document url-prefix("http"), url-prefix("https"), url-prefix("ftp"), url-prefix("file") {
html *, html {
background: #ccd1d1 !important; text-shadow: none !important;
color: #000000 !important;
-moz-border-top-colors: #8FBC8F !important; -moz-border-bottom-colors: #8FBC8F!important; -moz-border-left-colors: #8FBC8F !important; -moz-border-right-colors: #8FBC8F !important;
}
code, pre, input, samp, kbd, var, dfn,.postright {
-moz-appearance: none !important;
background-color: #BADBAD !important;
}
input, select, textarea, button {
-moz-appearance: none !important;
border: 1px solid #BADBAD !important;
background-color: #BADBAD !important;
}
.codebox, BLOCKQUOTE, TEXTAREA, .spoiler { -moz-border-top-colors: #444  !important; -moz-border-bottom-colors: #444 !important;
-moz-border-left-colors: #444 !important; -moz-border-right-colors: #444 !important; }
a:link { color: #300090 !important;
}
a:visited { color: #489412 !important; }
a:active { color: #d81e1e !important; }
a:hover { color: #d81e1e !important; }
}`;
					var sss = this.sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
					var uri = this.uri = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService).newURI("data:text/css,"+ encodeURIComponent(green),null,null);

					function setStyleForPages( reason ) {
						var style = sss.sheetRegistered(uri, sss.AGENT_SHEET);
					style
						? sss.unregisterSheet(uri, sss.AGENT_SHEET)
						: sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
					};
					setStyleForPages();
					return;
				}
			}, false);
			return trbn;
		},
	});
} catch(e) {}

Отсутствует

 

№1597916-10-2021 06:12:26

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 93.0

Re: Custom Buttons

ВВП пишет

кн. "увел. изображение " лопнула..

Вот же рабочая №8293

Отсутствует

 

№1598016-10-2021 10:06:00

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

Re: Custom Buttons

voqabuhe
Класс !

Отсутствует

 

№1598116-10-2021 12:18:39

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

Re: Custom Buttons

Приветствую всех! Есть папка по пути C:\ФАЙЛЫ нужно вывести true или false в зависимости от того есть ли файл(ы) в папке. Папки не в счёт. Заранее благодарю!

Отредактировано Senflex (16-10-2021 12:21:41)

Отсутствует

 

№1598216-10-2021 13:41:30

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

Re: Custom Buttons

Dobrov пишет

Как прочитать CSS (текстовый файл) в переменную? Данный код не работает

Интересно, зачем бы это могло понадобиться.
FileReader здесь совсем неудобен. Мало того, что ему
в качестве аргумента нужен Blob или File, так он ещё и читает асинхронно.
Можно так:
var green = Cu.readUTF8URI(Services.io.newURI("chrome://user_chrome_files/content/custom_scripts/ucf_Reader.css"));


Senflex пишет

Есть папка по пути C:\ФАЙЛЫ нужно вывести true или false в зависимости от того есть ли файл в папке.

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

Выделить код

Код:

var result = false, en = FileUtils.File("C:\\ФАЙЛЫ").directoryEntries;
while(en.hasMoreElements())
	if ((result = en.getNext().QueryInterface(Ci.nsIFile).isFile())) break;
alert(result);

Отсутствует

 

№1598316-10-2021 14:41:12

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

Re: Custom Buttons

Dumby
Как сюда Ваш код прилепить? this.onclick = e => e.button != 1 || gShowPopup(this);  ....Тут reload идет на СКМ ...Чет знает зачем.

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

Выделить код

Код:

/*Initialization Code*/
var src = "gBrowser.addTab = " + gBrowser.addTab.toString()
    .replace(/^(?!function )/, "function ");
this.oncontextmenu =e=> { e.button && !e.ctrlKey && e.preventDefault() };    
this.tooltipText = "Л: См. ПАРОЛИ\nП: См. КУКИ"; 
(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
            .QueryInterface(Ci.nsIPlaintextEditor).insertText(domain);
    }
});

Отсутствует

 

№1598416-10-2021 14:46:05

ALEX_45_ORP
Участник
 
Группа: Members
Зарегистрирован: 18-01-2018
Сообщений: 162
UA: Firefox 85.0

Re: Custom Buttons

.

Отредактировано ALEX_45_ORP (16-10-2021 14:46:30)


Win 10х64

Отсутствует

 

№1598516-10-2021 16:10:51

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

Re: Custom Buttons

ВВП пишет

Тут reload идет на СКМ ...Чет знает зачем

Что ещё за зачемки, эту просили перерисовать, вот и идёт.

прилепить

Ну, например, если много не менять, то удалить это:

if (e.button) for(var br of gBrowser.browsers) try {
            this.domain(br) == domain && br.reload();
        } catch(ex) {}

И после true(e) { добавить
        if (e.button) return gShowPopup(self);

Отсутствует

 

№1598616-10-2021 16:24:36

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

Re: Custom Buttons

Dumby

Dumby пишет

И после true(e) { добавить
        if (e.button) return gShowPopup(self);

Вроде так и делал , так да не так...Благодарю. Кстати, как культурно избавиться от trash в папке extensions ?  Рихтанул XPIProvider.jsm . Избавился от features в профиле, но эта шняга(trash) иногда вылазит. А в ней опять мутные аддоны...

Отредактировано ВВП (16-10-2021 18:19:50)

Отсутствует

 

№1598717-10-2021 10:12:55

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

Re: Custom Buttons

Dumby пишет

Интересно, зачем бы это могло понадобиться. «Как прочитать CSS (текстовый файл) в переменную?»

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

Отсутствует

 

№1598817-10-2021 14:58:39

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

Re: Custom Buttons

ВВП пишет

Избавился от features в профиле, но эта шняга(trash) иногда вылазит. А в ней опять мутные аддоны...

Не знаю, у меня нет в профиле features. А от «мутных аддонов»,
возможно, избавит DisableSystemAddonUpdate в policies.json


Dobrov пишет

Чтобы кнопка переключения стиля страницы подгружала внешний CSS, который можно было бы изменять.

Я не вижу здесь со стороны браузера какого-то отказа читать CSS самому.

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

Выделить код

Код:

(async () => CustomizableUI.createWidget({
	label: "Reader",
	tooltiptext: "ЛКМ:	Reader",
	id: "ucf_Reader",
	localized: false,
	onCreated(btn) {
		var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
		var args = [Services.io.newURI("chrome://user_chrome_files/content/custom_scripts/ucf_Reader.css"), sss.AGENT_SHEET];
		var reg = () => (this.flag = !this.flag) ? sss.loadAndRegisterSheet(...args) : sss.unregisterSheet(...args);

		(this.onCreated = btn => {
			btn._handleClick = reg;
			btn.style.setProperty("list-style-image", 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACS0lEQVR4Xt1VIZCkMBBcGYlERiKRSCQSuTISiUQiVyJXIle8QCKRSOTJkyterDtU8t1cpipVl937f3mpmkuupnt6MjNhTz9v1XWdYi1Jkjit9YilXuGBGYDfySH3WwEAR2xODCLdi+BtiCX32+yVUg8cd5BvJPH/WGZVVRF790lM5ITYqGVZZkhAeVbnnOIOkivLMosIZPARu2ERu5DrY8QXQFNYFgTWsOoZviiKSsSlXBCan5VH84qwXUj/YuSAK2XSsYZJeZb/nUByfQWamHOmM8/z3hiTNU2T/q1A27YpOeTGysSGHeWRqZGrYuwm+J6Wiz5OkHDCGIwZn2eaUnJmNnfUN4/UPIfvPcahMeaX2qVa2/Y62mHdbD/NNitKK2OLF52gBAWNZ6yVPmKIJYdcxgh66buPRwKCI2janZ0eznEf3x9W57n1r3TjHp7pIybkUAjixH1Oo0xPZZoD+Ov37sRIaIbrIRAz+oi53T/x3MlBLEnKnND9leCW4IcIfBzGrIZlFYEd5TE0nmH0kQNsIIAYrU8Kk7id8Gf9zGZANqHAAXaXeQlrGvaMvi8C4a0ZmyU6E1zWZ1/LAyhgZy6D1H0QAX+m78AInlwKlOfzIcDYbLJ8Ilx/m+wcNOy6vXEqnH+ApQj4s6OPGGkyuYzBWPJl9RnpngSF7tdtZzuAzOUSjtwU+d2YvAixB4dcxvDZ9+FTVyDcggmxwUNbi6JIBRvcIqUvxoH42HWdiv0eNFB+4xWx32E9xJMX36CEGGI5++BvjHH6UesPIe4VKP0pWeUAAAAASUVORK5CYII=")', "important");
		})(btn);
	}
}))();

Отсутствует

 

№1598917-10-2021 22:27:10

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

Re: Custom Buttons

Dumby

Dumby пишет

DisableSystemAddonUpdate в policies.json

Не понял...В schema.jsm есть это:
"DisableSystemAddonUpdate": {
      "type": "boolean"
    },

Отсутствует

 

№1599018-10-2021 05:08:16

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

Re: Custom Buttons


«The Truth Is Out There»

Отсутствует

 

№1599118-10-2021 09:57:20

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

Re: Custom Buttons

unter_officer
а на кой черт эта ссылка? Может какой-то закодированный смысл ?

Отсутствует

 

№1599219-10-2021 20:39:45

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

Re: Custom Buttons

Dumby,
Пожалуйста, если будет время и настроение, адаптируйте кнопку для Firefox 93.

Изменить уровень яркости экрана

Выделить код

Код:

const prefName = "Изменить уровень яркости экрана";

function getDarkLevel() {
	try {
		return cbu.ps.getIntPref(prefName);
	} catch (ex) {
		return 0;
	}
}

function getOpacity(aDarkLevel) {
	var opacity = 0;
	if (aDarkLevel === 50)
	opacity = aDarkLevel / 100;
	else
	opacity = (100 - aDarkLevel) / 100;
	return opacity;
}

function mouseWheel(aEvent) {
	var darkLevel = getDarkLevel();
	if (aEvent.detail > 0) {
		if (darkLevel < 100)
		darkLevel++;
		else
		aEvent.stopPropagation();
	}
	else {
		if (darkLevel > 0)
		darkLevel--;
		else
		aEvent.stopPropagation();     // else stop (min = 0)
	}
	gBrowser.style.opacity = getOpacity(darkLevel);
	cbu.ps.setIntPref(prefName, darkLevel);
}

this.onclick = function onclick(aEvent) {
	if (aEvent.button !== 1)
	return;
	gBrowser.style.opacity = "1";
	cbu.ps.setIntPref(prefName, 0);
}

this.addEventListener("DOMMouseScroll", mouseWheel);

var browser = document.getElementById("browser");
	browser.style.backgroundColor = "black";
	gBrowser.style.opacity = getOpacity(getDarkLevel());

this.tooltipText = this.name + "\n" + this.Help;

Отсутствует

 

№1599319-10-2021 23:33:44

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

Re: Custom Buttons

Dumby
Забыл как...Снова кнопку закачку поставил с YT.dl.exe ...Но закачка идет в каталог браузера, а надо там где сам D:\\Загрузки\\видео\\youtube-dl.exe

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

Выделить код

Код:

(func => {
	var sysPlayerName = "YTPlayer";
	var path = "D:\\Загрузки\\видео\\youtube-dl.exe";
	var videoMoved = "Видео перенесено в " + sysPlayerName;
	var noFound = "Не найдено видео на странице, доступное для переноса в " + sysPlayerName;

	this.image = "moz-icon://file://" + path;
	this.label = "Открыть видео в " + sysPlayerName;
	this.tooltipText = "Л: Видео в плеер\nП: Видео из Clipboard";

	this._handleClick = () => {
		var msgName = _id + ":Player";
		var listener = ({data}) => data ? run([data]) : notify();
                var listener = ({data}) => data ? run([data], true) : notify();
		messageManager.addMessageListener(msgName, listener);
		addDestructor(() => messageManager.removeMessageListener(msgName, listener));

		var url = "data:charset=utf-8," + encodeURIComponent(
			`(${func})()`.replace("MSG_NAME", msgName)
				.replace("VIDEO_MOVED", encodeURIComponent(videoMoved))
				.replace("CONFIRM", encodeURIComponent("Открыть ссылку в плеере ?"))
		);
		(this._handleClick = () => gBrowser.selectedBrowser.messageManager.loadFrameScript(url, false))();
                
	}
	this.onclick = e => e.button != 1 || gShowPopup(this); 
	this.oncontextmenu = e => {
		if (e.ctrlKey || e.shiftKey || e.altKey) return;
		e.preventDefault();
		custombuttons.confirmBox(null, "Запустить плеер из буфера обмена ?", "Да", "Нет")
                        && run([gClipboard.read(),]);
                      
			
	}
	var popup = document.getElementById("contentAreaContextMenu");
	addEventListener("popupshowing", {
		get hidden() {
			return !(gContextMenu.onLink || gContextMenu.onVideo || gContextMenu.onPlainTextLink);
		},
		handleEvent() {
			if (this.hidden) return;
			var menuitem = document.createXULElement("menuitem");
			for(var args of Object.entries({
				image: self.image,
				oncommand: "play()",
				class: "menuitem-iconic",
				label: "Открыть в " + sysPlayerName
			}))
				menuitem.setAttribute(...args);
			menuitem.play = () => play(gContextMenu.linkURL || gContextMenu.mediaURL);
			document.getElementById("context-savelink").before(menuitem);
			addDestructor(() => menuitem.remove());
			this.handleEvent = e => {
				if (e.target == popup) menuitem.hidden = this.hidden;
			}
		}
	}, false, popup || 1);

	var play = link => custombuttons.confirmBox(null, "Открыть ссылку в плеере ?", "Да", "Отмена") && run([link]);
	/*
	var run = args => {
		var file = FileUtils.File(path);
		(run = args => {
			if (!file.exists()) return custombuttons.alertBox("File not exists!", path);
			var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
			process.init(file);
			process.runwAsync(args, args.length);
		})(args);
	}
*/
	var run = (...a) => {
		var file = FileUtils.File(path);
		(run = (args, quit) => {
			if (!file.exists()) return custombuttons.alertBox("File not exists!", path);
			var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
			process.init(file);
			process.runwAsync(args, args.length);
			
		})(...a);
	}
	var notify = () => {
		var name = _id + "-noFound";
		var as = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
		(notify = () => setTimeout(as.closeAlert, 1150, name, as.showAlertNotification(
			"chrome://global/skin/icons/question-48.png", "", noFound, false, "", null, name
		)))();
	}

})(() => {

	var found, videoMoved, SEND = msg => {
		found = true;
		if (!msg || Cc["@mozilla.org/embedcomp/prompt-service;1"]
			.getService(Ci.nsIPromptService)
			.confirm(content, null, decodeURIComponent("CONFIRM"))
		) {
			if (msg) videoMoved = decodeURIComponent("VIDEO_MOVED");
			sendAsyncMessage("MSG_NAME", msg);
		}
		else return true;
	}

	var YoutubeID = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})(?:\W|$)/;

	var tmp = '',
	tmpp = '',
	innerA = '<div style="display:block!important;color:#00ff00!important;width:250px!important;font:bold 16px serif!important;z-index:999!important;opacity:1!important;visibility: visible!important;',
	innerB = 'left:5px!important;position:absolute!important;height:auto!important;box-sizing:border-box!important;padding:5px!important;margin:5px!important;',
	//stopPl = "javascript:(function(){v=document.getElementById('movie_player');if(v){v.stopVideo()}else{v=document.getElementsByTagName('video');if(v){v[0].src='';try{v[0].load()}catch(e){}};}})();",
	ytIMGouter = function (ytID) {
		return '<div width="100%"><br /><a target="_blank" href="https://www.youtube.com/watch?v=' + ytID + '"><img src="https://i.ytimg.com/vi/' + ytID + '/hqdefault.jpg"></a><br />' + innerA + 'background-color:black!important;position:relative!important;bottom:20px!important;">&nbsp;&nbsp;' + videoMoved + '</div><br /></div><br />'
	},
	handlWin = function (currentWin) {
		tmp = '';
		var elem = currentWin.document.getElementsByTagName('video'),
		currLoc = currentWin.location;
		if (elem.length > 0) {
			if (currLoc.hostname.indexOf('youtu') != -1 && (tmp = currLoc.toString().match(YoutubeID)) && tmp[1].length == 11) {

				if (SEND('https://www.youtube.com/watch?v=' + tmp[1])) return;

				videoMovedbox = currentWin.document.createElement('videoMoved');
				videoMovedbox.innerHTML = innerA + innerB + 'top:-15px!important;"><b>' + videoMoved + '</b></div>';

				//loadURI(stopPl);
				(function(d){var v=d.getElementById('movie_player');if(v){try{v.stopVideo()}catch{}}
					else{v=d.getElementsByTagName('video');if(v[0]){v[0].src='';try{v[0].load()}catch{}};}})(currentWin.document);

				currentWin.document.getElementById('eow-title').appendChild(videoMovedbox);
				return true;
			};
			for (i = 0; i < elem.length; i++) {
				if (((tmp = getSrc(elem[i].parentNode, currLoc)) && tmp.length > 2) || (i == 0 && currentWin.document.body.innerHTML.substring(0, 7) == '<video ' && (tmp = currLoc.toString()))) {

					if (SEND(tmp)) return;

					videoMovedbox = currentWin.document.createElement('videoMoved');
					videoMovedbox.innerHTML = innerA + innerB + 'top:20px!important;background-color:black!important;">' + videoMoved + '</div>';

					if (currLoc.hostname == 'www.youtube.com') {
						elem[i].parentNode.parentNode.appendChild(videoMovedbox);
					} else {
						elem[i].parentNode.appendChild(videoMovedbox);
					};
					elem[i].src = '';
					try {
						elem[i].load()
					} catch (e) {};
					return true;
				}
			}
		};

		currentWin._elems = currentWin.document.getElementsByTagName('iframe');
		if (currentWin._elems.length > 0) {
			for (currentWin._iCounter = 0; currentWin._iCounter < currentWin._elems.length; currentWin._iCounter++) {
				if ((currentWin._elems[currentWin._iCounter].src.indexOf('youtube.com') > -1) && (tmp = currentWin._elems[currentWin._iCounter].src.match(YoutubeID)) && (tmp[1].length == 11)) {

				if (SEND('https://www.youtube.com/watch?v=' + tmp[1])) return;

				currentWin._elems[currentWin._iCounter].outerHTML = ytIMGouter(tmp[1]);
					return true;
				};
				if (currentWin._elems[currentWin._iCounter].clientWidth > 80 && currentWin._elems[currentWin._iCounter].clientHeight > 40 && handlWin(currentWin._elems[currentWin._iCounter].contentWindow))
					return true;
			}
		};

		elem = currentWin.document.getElementsByTagName('object');
		currLoc = currentWin.location;
		if (elem.length == 0) {
			elem = currentWin.document.getElementsByTagName('embed')
		};
		if (elem.length > 0) {
			for (i = 0; i < elem.length; i++) {
				if (elem[i].innerHTML.indexOf('youtu') != -1 && (tmp = elem[i].innerHTML.match(YoutubeID)) && tmp[1].length == 11) {

					if (SEND('https://www.youtube.com/watch?v=' + tmp[1])) return;

					elem[i].outerHTML = ytIMGouter(tmp[1]);
					return true;
				} else {
					if (elem[i].clientWidth > 80 && elem[i].clientHeight > 40) {
						if (((tmp = getSrc(elem[i].parentNode, currLoc)) || (tmp = getLink(elem[i], currLoc))) && tmp.length > 2) {

							if (SEND(tmp)) return;

							elem[i].outerHTML = innerA + 'background-color:black!important;bottom:20px!important;">&nbsp;&nbsp;' + videoMoved + '</div>';
							return true;
						};
					};
				}
			};
		};
		return false;
	};

	function restProtHost(lnkR, curLoc) {
		if (lnkR.length == 0)
			return '';
		let tr = lnkR.replace(/^:\/\//, curLoc.protocol + "//");
		if (!tr.match(/^https?:\/\//i)) {
			lnkR = tr.replace(/^\/+/, '');
			if (lnkR.split('/')[0].split('?')[0].split('#')[0].toLowerCase().match(/^(?:[-a-z\d]+\.)+[a-z\d]{2,6}$/)) {
				tr = curLoc.protocol + '//' + lnkR;
			} else {
				tr = curLoc.protocol + '//' + curLoc.host + "/" + lnkR;
			}
		};
		return tr;
	};

	function getSrc(vobj, currentLoc) {
		var t = '',
		tt = '';
		if ((((t = vobj.innerHTML.match(/<video.*?\ssrc=(?:(?:'([^']*)')|(?:"([^"]*)")|([^\s]*))/i)) && (t) && (tt = t[1] || t[2] || t[3]) && tt.indexOf('blob:') == -1) || ((t = vobj.innerHTML.match(/<source.*?\ssrc=(?:(?:'([^']*)')|(?:"([^"]*)")|([^\s]*)).*?\stype=['"]?video\//i)) && (t) && (tt = t[1] || t[2] || t[3]))) && tt.length > 2 && tt.indexOf('blob:') == -1) {
			if (tt.indexOf(".mp4/?") == -1) {
				tt = tt.replace(/&amp;/g, "&")
			};
			t = restProtHost(tt, currentLoc);
			return t;
		};
		return '';
	};

	function getLink(obj, curLocation) {

		if (!obj || !obj.tagName)
			return '';
		q = obj.tagName.toLowerCase();

		var getParam = function (e, n) {
			var v = '',
			r = new RegExp('^(' + n + ')$', 'i'),
			param = e.getElementsByTagName('param');
			for (var igp = 0, p; p = param[igp]; igp++) {
				if (p.hasAttribute('name') && p.getAttribute('name').match(r)) {
					v = p.getAttribute('value');
					break
				};
			};
			return v;
		};

		var restPath = function (f, s) {
			return (f.substring(0, 4) == 'http') ? f : s.replace(/[#?].*$/, '').replace(/[^\/]*$/, f)
		};

		function videoLinkExtract(fl) {
			alert(fl);
			var linkArr = [],
			outLinks = [],
			jj = 0,
			lba = '',
			lbb = '',
			decodeURL = gBrowser.currentURI.spec; {
				try {
					return decodeURIComponent(s)
				} catch (e) {
					return unescape(s)
				}
			};

			for (var ij = 0; ij < 3; ij++) {
				lba = lba + String.fromCharCode(parseInt((Math.random() * 15 + 1) + '', 10));
				lbb = lbb + String.fromCharCode(parseInt((Math.random() * 15 + 16) + '', 10));
			};

			function pushWithMerit(lnk) {

				var merit = -11;
				if (lnk.match(/^https?:\/\//i))
					merit = merit + 40;
				if (outLinks.length == 0)
					merit = merit + 1;
				if (lnk.match(/^\//))
					merit = merit + 7;
				if (lnk.match(/^\/\//))
					merit = merit + 30;
				if (lnk.match(/240p([^a-z]|$)/i))
					merit = merit + 1;
				if (lnk.match(/[^a-z]240([^a-z0-9]|$)/i))
					merit = merit + 1;
				if (lnk.match(/360p([^a-z]|$)/i))
					merit = merit + 3;
				if (lnk.match(/[^a-z]360([^a-z0-9]|$)/i))
					merit = merit + 3;
				if (lnk.match(/480p([^a-z]|$)/i))
					merit = merit + 5;
				if (lnk.match(/[^a-z]480([^a-z0-9]|$)/i))
					merit = merit + 5;
				if (lnk.match(/720p([^a-z]|$)/i))
					merit = merit + 7;
				if (lnk.match(/[^a-z]720([^a-z0-9]|$)/i))
					merit = merit + 7;
				if (lnk.match(/\.mp4([^a-z]|$)/i))
					merit = merit + 8;
				if (lnk.match(/_hd([^a-z]|$)/i))
					merit = merit + 6;
				if (lnk.match(/\.(jpg|xml)([^a-z]|$)/i))
					merit = merit - 40;
				if (merit > 0)
					outLinks.push(merit + lba + lnk);
				Services.console.logStringMessage('merit:' + merit + ' lnk->' + lnk);
			};

			linkArr.push(fl);
			while (linkArr.length > jj && jj < 30) {

				var testPaths = [];
				testPaths = linkArr[jj].split(/(\.(?:flv|mp4|m3u8))/i);
				if (testPaths[testPaths.length - 1] == '')
					testPaths.pop();

				for (k = 1; k < testPaths.length; k = k + 2) {

					if (testPaths[k - 1].indexOf(lba) > -1) {
						pref = testPaths[k - 1];
					} else {
						var testAboutDom = testPaths[k - 1].toLowerCase().split(/(https?:\/\/)/);
						if (testAboutDom[testAboutDom.length - 1] == '')
							testAboutDom.pop();
						var pTest = testAboutDom[testAboutDom.length - 1].split(/(\?[^\?]*?&)/);
						if (pTest.length > 2) {
							pTest.pop();
							pTest.pop();
						};
						testAboutDom[testAboutDom.length - 1] = pTest.join('');
						pref = testPaths[k - 1].substring(testAboutDom.join('').lastIndexOf("&") + 1);
					};

					t2 = pref.lastIndexOf(lbb);
					if (t2 > -1) {
						pref = pref.substring(t2 + 3);
					} else {

						t2 = pref.lastIndexOf('{"');
						if (t2 > -1)
							pref = pref.substring(t2 + 2);
						t2 = pref.lastIndexOf('["');
						if (t2 > -1)
							pref = pref.substring(t2 + 2);
						t2 = pref.lastIndexOf(',"');
						if (t2 > -1)
							pref = pref.substring(t2 + 2);
						t2 = pref.toLowerCase().lastIndexOf('"http://');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf('"https://');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf(',http://');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf(',https://');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf(';http');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf('*https://');
						if (t2 > -1)
							pref = pref.substring(t2 + 1);
						t2 = pref.toLowerCase().lastIndexOf(' or ');
						if (t2 > -1)
							pref = pref.substring(t2 + 4);

						pref = pref.substring(pref.split('/')[0].toLowerCase().split('%2f')[0].lastIndexOf('=') + 1);

					}

					if (pref.length > 0) {

						if (pref.split('?')[0].toLowerCase().match(/%[2-3][0-9a-f]/)) {

							t2 = pref.indexOf('"')
								if (t2 > -1)
									pref = pref.substring(t2 + 1);
								suff = testPaths[k + 1] ? testPaths[k + 1].split('&')[0].split('"')[0].split(';')[0].split(/,http/i)[0] : '';
							if ((suff != testPaths[k + 1]) || (testPaths.length < k + 3)) {
								if (testPaths.length > k + 1) {
									testPaths[k + 1] = ((pref == testPaths[k - 1]) ? '' : '&') + testPaths[k + 1].substr(suff.length)
								};
								t2 = pref.lastIndexOf(lba);
								if (t2 > -1)
									pref = pref.substring(t2 + 3)
										linkArr.push(decodeURL(pref + testPaths[k] + suff));

							} else {
								testPaths[k + 1] = (pref == testPaths[k - 1] ? '' : lbb) + pref + testPaths[k] + suff
							}
						} else {
							suff = testPaths[k + 1] ? testPaths[k + 1].split(';')[0].split('"]')[0].split('"}')[0].split('",')[0].split(/,https?:\/\//i)[0].split('*https://')[0].split(' or ')[0] : '';
							t2 = suff.indexOf('&');
							if ((t2 > -1) && (pref != testPaths[k - 1])) {
								if (t2 == 0)
									suff = '';
								if (suff.charAt(0) != '?')
									suff = suff.split(/(&[^&]+=https?:\/\/)/i)[0];
							};
							if ((suff != testPaths[k + 1]) || (testPaths.length < k + 3)) {
								if (testPaths.length > k + 1) {
									testPaths[k + 1] = ((pref == testPaths[k - 1]) ? '' : '&') + testPaths[k + 1].substr(suff.length)
								};
								t2 = pref.lastIndexOf(lba);
								if (t2 > -1)
									pref = pref.substring(t2 + 3);
								pushWithMerit(pref + testPaths[k] + suff);

							} else {
								testPaths[k + 1] = lba + (pref == testPaths[k - 1] ? '' : lbb) + pref + testPaths[k] + suff
							}
						}
					}
				};
				jj = jj + 1;
			};

			if (outLinks.length == 0)
				return '';
			function srt(a, b) {
				a = parseInt(a.substr(0, a.indexOf(lba)), 10);
				b = parseInt(b.substr(0, b.indexOf(lba)), 10);
				if (a < b)
					return 1;
				if (a > b)
					return -1;
				return 0
			};
			outLinks.sort(srt);
			outLinks[0] = outLinks[0].substr(outLinks[0].indexOf(lba) + 3)
				if (outLinks[0].indexOf('_hq.mp4/?time=') > 0)
					outLinks[0] = outLinks[0].replace(/&/g, '&amp;');
				return outLinks[0];
		};

		if (!ol)
			return '';
		//ol = ol.replace(/^:?\/\//, curLocation.protocol + "//");
		//return restPath(ol, src);
		return restProtHost(ol, curLocation);
	};

	try {handlWin(content);} finally {found || SEND();}
});

 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);


А,по-наитию сменил на это, вроде заработало, не косяк?
process.init(FileUtils.File(String.raw`D:\Загрузки\видео\youtube-dl.exe`));
process.run(false, args, args.length);
Не, фуфло , пришлось так process.init(FileUtils.File(String.raw`D:\Загрузки\видео\youtube-dl.exe.lnk`));

Почему только через ярлык ?  D:\Загрузки\видео\youtube-dl.exe.lnk

Отредактировано ВВП (20-10-2021 16:04:31)

Отсутствует

 

№1599421-10-2021 15:33:30

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

Re: Custom Buttons

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

Пожалуйста, если будет время и настроение, адаптируйте кнопку для Firefox 93.

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

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

Выделить код

Код:

(gBrowser => {

	// Здесь этот код

})(document.getElementById("tabbrowser-tabpanels"));


Или вот вариант, но это не совсем то же самое
скрытый текст

Выделить код

Код:

((ovar, obs) => {
	this.appendChild(document.createElement("style")).append(
		"#tabbrowser-tabbox {background-color: black !important;}\n"
		+ `#tabbrowser-tabpanels {opacity: var(${ovar}) !important;}`
	);
	var pref = "CB.tabbrowser-tabpanels.opacity";
	var gp = () => Services.prefs.getIntPref(pref, 100);
	var sp = val => Services.prefs.setIntPref(pref, val);

	var st = document.documentElement.style;
	(obs = () => st.setProperty(ovar, gp() / 100, "important"))();
	Services.prefs.addObserver(pref, obs);

	this.onwheel = e => {
		var val = gp() + (e.deltaY < 0 ? 1 : -1);
		val < 0 || val > 100 || sp(val);
	}
	this.onauxclick = e => e.button != 1 || sp(100);

	addDestructor(reason => {
		st.removeProperty(ovar);
		Services.prefs.removeObserver(pref, obs);
		reason == "delete" && Services.prefs.clearUserPref(pref);
	});
})("--cb-tabbrowser-tabpanels-opacity");

ВВП пишет

Почему только через ярлык ?

Доку, видимо, стоит почитать.

For example for -o %(title)s-%(id)s.%(ext)s and an mp4 video with title youtube-dl test video and id BaW_jenozKcj,
this will result in a youtube-dl test video-BaW_jenozKcj.mp4 file created in the current directory.

Наверно можно и без ярлыка, если в коде (перед process.runwAsync) прописать

Выделить код

Код:

args.unshift("-o", "D:/Загрузки/видео/%(title)s-%(id)s.%(ext)s");

но это не то, что я могу проверить, сколько раз уже говорил.

Отредактировано Dumby (21-10-2021 15:35:16)

Отсутствует

 

№1599521-10-2021 16:01:12

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

Re: Custom Buttons

Dumby

Dumby пишет

args.unshift("-o", "D:/Загрузки/видео/%(title)s-%(id)s.%(ext)s");

Класс !

Отсутствует

 

№1599621-10-2021 22:18:09

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

Re: Custom Buttons

Dumby,

описание не предоставленно

Критику учел.
С первым кодом, обертывание не подлечило, кнопка не реагировала.
Ваш код работает безупречно.
Да пребудет с вами JS-сила, мастер. Спасибо.


Оставлю рабочий вариант кнопки. Автор Dumby.

Изменить уровень яркости экрана

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0418%u0437%u043C%u0435%u043D%u0438%u0442%u044C%20%u0443%u0440%u043E%u0432%u0435%u043D%u044C%20%u044F%u0440%u043A%u043E%u0441%u0442%u0438%20%u044D%u043A%u0440%u0430%u043D%u0430%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA7klEQVR4nKWTQW6EMAxFP2gugLgIC87AnmMjIXECLhL7213MxHIo6rQdS1aiyH7+cZwOgOMDe7zWLh8uywKSUFWQhJmBJLZti5h5nrHvuyMp8L/4NE0A4A8kO44jqqlquIiEGpJY1xUkmysAQByaGcwM7h57MwsIAIjIPcDdoxJJiEisvwLkaqUUkIy1OgCc5/kdoKpw96iaFVSIqt4+Y6NARBrp1fMVbgE16PoCpZRmJn4EVJkVlqFvAaoaDazzcPUroL/2oCbnRtZEd4f7c3CHYYi8f43yC9CMcvOhso3jGAq67hnW930kffSdvwAkRmw4ZXkwxgAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u0410%u0432%u0442%u043E%u0440%20%u043A%u043E%u0434%u0430%20%u0434%u043B%u044F%20%u044D%u0442%u043E%u0439%20%u043A%u043D%u043E%u043F%u043A%u0438%20-%20Dumby.%20%0A//%20%u0424%u043E%u0440%u0443%u043C.%20Mozilla%20%u0420%u043E%u0441%u0441%u0438%u044F.%20%0A//%20https%3A//forum.mozilla-russia.org/viewtopic.php%3Fpid%3D795613%23p795613%0A%0A%28%28ovar%2C%20obs%29%20%3D%3E%20%7B%0A%09this.appendChild%28document.createElement%28%22style%22%29%29.append%28%0A%09%09%22%23tabbrowser-tabbox%20%7Bbackground-color%3A%20black%20%21important%3B%7D%5Cn%22%0A%09%09+%20%60%23tabbrowser-tabpanels%20%7Bopacity%3A%20var%28%24%7Bovar%7D%29%20%21important%3B%7D%60%0A%09%29%3B%0A%09var%20pref%20%3D%20%22CB.tabbrowser-tabpanels.opacity%22%3B%0A%09var%20gp%20%3D%20%28%29%20%3D%3E%20Services.prefs.getIntPref%28pref%2C%20100%29%3B%0A%09var%20sp%20%3D%20val%20%3D%3E%20Services.prefs.setIntPref%28pref%2C%20val%29%3B%0A%0A%09var%20st%20%3D%20document.documentElement.style%3B%0A%09%28obs%20%3D%20%28%29%20%3D%3E%20st.setProperty%28ovar%2C%20gp%28%29%20/%20100%2C%20%22important%22%29%29%28%29%3B%0A%09Services.prefs.addObserver%28pref%2C%20obs%29%3B%0A%0A%09this.onwheel%20%3D%20e%20%3D%3E%20%7B%0A%09%09var%20val%20%3D%20gp%28%29%20+%20%28e.deltaY%20%3C%200%20%3F%201%20%3A%20-1%29%3B%0A%09%09val%20%3C%200%20%7C%7C%20val%20%3E%20100%20%7C%7C%20sp%28val%29%3B%0A%09%7D%0A%09this.onauxclick%20%3D%20e%20%3D%3E%20e.button%20%21%3D%201%20%7C%7C%20sp%28100%29%3B%0A%0A%09addDestructor%28reason%20%3D%3E%20%7B%0A%09%09st.removeProperty%28ovar%29%3B%0A%09%09Services.prefs.removeObserver%28pref%2C%20obs%29%3B%0A%09%09reason%20%3D%3D%20%22delete%22%20%26%26%20Services.prefs.clearUserPref%28pref%29%3B%0A%09%7D%29%3B%0A%7D%29%28%22--cb-tabbrowser-tabpanels-opacity%22%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bcustombuttons.alertBox%28this.name%2C%20this.Help%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%u041F%u0440%u0438%20%u043D%u0430%u0432%u0435%u0434%u0435%u043D%u0438%u0438%20%u043A%u0443%u0440%u0441%u043E%u0440%u0430%20%u043D%u0430%20%u0438%u043A%u043E%u043D%u043A%u0443%2C%20%u043F%u0440%u043E%u043A%u0440%u0443%u0442%u0438%u0442%u0435%20%u043A%u043E%u043B%u0435%u0441%u043E%20%u043C%u044B%u0448%u0438%20%u0432%u0432%u0435%u0440%u0445%20/%20%u0432%u043D%u0438%u0437%2C%20%u0434%u043B%u044F%20%u0440%u0435%u0433%u0443%u043B%u0438%u0440%u043E%u0432%u043A%u0438%20%u044F%u0440%u043A%u043E%u0441%u0442%u0438.%0AC%u0440%u0435%u0434%u043D%u0438%u0439%20%u043A%u043B%u0438%u043A%2C%20%u043F%u0440%u0438%20%u043D%u0430%u0432%u0435%u0434%u0435%u043D%u0438%u0438%20%u043A%u0443%u0440%u0441%u043E%u0440%u0430%20%u043D%u0430%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%2C%20%u0441%u0431%u0440%u043E%u0441%u0438%u0442%20%u044F%u0440%u043A%u043E%u0441%u0442%u044C%20%u043F%u043E-%u0443%u043C%u043E%u043B%u0447%u0430%u043D%u0438%u044E.%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№1599722-10-2021 05:59:18

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

Re: Custom Buttons

Dumby
Адаптируйте, пожалуйста, кнопку  Изменить уровень яркости экрана, которую выложил выше Пострел для UCF.

Отсутствует

 

№1599822-10-2021 10:03:51

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

Re: Custom Buttons

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

Изменить уровень яркости экрана

Уменьшить яркость , а не изменить.  Не фига не увеличивает больше чем по умолчанию !

Отсутствует

 

№1599922-10-2021 11:47:17

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 93.0

Re: Custom Buttons

ВВП пишет

Уменьшить яркость , а не изменить.

А в зад она её уже не увеличивает? :)

Отсутствует

 

№1600022-10-2021 21:51:49

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

Re: Custom Buttons

rubel пишет

Адаптируйте, пожалуйста, кнопку  Изменить уровень яркости экрана, которую выложил выше Пострел для UCF.

Какая-то шляпа получилась, надеюсь сойдёт.

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

Выделить код

Код:

(async pref => CustomizableUI.createWidget(({
	label: "Изменить уровень яркости экрана",
	tooltiptext: "Изменить уровень яркости экрана",
	id: "ucf-tabbrowser-tabpanels-opacity-changer",
	localized: false,
	get pref() {
		return Services.prefs.getIntPref(pref, 100);
	},
	onCreated(btn) {
		var txt = "При наведении курсора на иконку, прокрутите колесо мыши вверх / вниз, для регулировки яркости.\n"
			+ "Cредний клик, при наведении курсора на иконку кнопки, сбросит яркость по-умолчанию.";
		var click = () => Services.prompt.alert(null, this.label, txt);

		var setPref = (e, val = 100) => {
			Services.prefs.setIntPref(pref, val);
			e.target.toggleAttribute("rst");
		}
		var auxclick = e => e.button != 1 || setPref(e);
		var wheel = e => {
			var val = this.pref + (e.deltaY < 0 ? 1 : -1);
			val < 0 || val > 100 || setPref(e, val);
		}
		(this.onCreated = btn => {
			btn.onwheel = wheel;
			btn._handleClick = click;
			btn.onauxclick = auxclick;
			btn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA7klEQVR4nKWTQW6EMAxFP2gugLgIC87AnmMjIXECLhL7213MxHIo6rQdS1aiyH7+cZwOgOMDe7zWLh8uywKSUFWQhJmBJLZti5h5nrHvuyMp8L/4NE0A4A8kO44jqqlquIiEGpJY1xUkmysAQByaGcwM7h57MwsIAIjIPcDdoxJJiEisvwLkaqUUkIy1OgCc5/kdoKpw96iaFVSIqt4+Y6NARBrp1fMVbgE16PoCpZRmJn4EVJkVlqFvAaoaDazzcPUroL/2oCbnRtZEd4f7c3CHYYi8f43yC9CMcvOhso3jGAq67hnW930kffSdvwAkRmw4ZXkwxgAAAABJRU5ErkJggg==");
		})(btn);
	},
	init() {
		var css = [
			"@-moz-document url(chrome://browser/content/browser.xhtml) {",
			"\t#${this.id}[rst] {filter: grayscale(1%) !important;}",
			"\t:root:not([chromehidden*=toolbar]) #tabbrowser-tabbox {background-color: black !important;}",
			`\t:root:not([chromehidden*=toolbar]) #tabbrowser-tabpanels {opacity: ${this.pref / 100} !important;}`, "}"
		].join("\n");
		var url = `resource://${this.id}/`;
		Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler)
			.setSubstitution(this.id, Services.io.newURI("data:text/css," + encodeURIComponent(css)));
		var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
		sss.loadAndRegisterSheet(Services.io.newURI(url), sss.USER_SHEET);

		var st = InspectorUtils.getAllStyleSheets((
			Services.appShell.hiddenDOMWindow ||
			Services.wm.getEnumerator(null).getNext()
		).document).find(s => s.href == url).cssRules[0].cssRules[2].style;

		var obs = () => st.setProperty("opacity", this.pref / 100, "important");
		Services.prefs.addObserver(pref, obs);
		Services.obs.addObserver(function quit(s, topic) {
			Services.obs.removeObserver(quit, topic);
			Services.prefs.removeObserver(pref, obs);
		}, "quit-application-granted");
		return this;
	}
}).init()))("ucf.tabbrowser-tabpanels.opacity");

Отсутствует

 

Board footer

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