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

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

№912630-08-2020 00:58:45

sandro79
Участник
 
Группа: Members
Зарегистрирован: 15-11-2017
Сообщений: 1750
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

Xvost пишет

Теперь: нужно заменить текст у определённой папки на иконку. Я использую код:

Замените display на list-style-image
Если не поможет, то не знаю где ещё может быть ошибка, и вообще возможно ли такое. Может лучше иконку взять в .ico вместо .bmp

Отредактировано sandro79 (30-08-2020 01:09:19)

Отсутствует

 

№912730-08-2020 01:28:35

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

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.

А отдельным файлом можно подключить и Ctrl+ЛКМ: Просмотр источника где должно открываться?

Отсутствует

 

№912830-08-2020 11:34:23

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

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
Да, вы правы, другой стиль мешался.
   
Фрагмент стиля
                #${id}-popup .noOptions { color: gray; }
                #${id}-popup .disabled { color: gray; font-style: italic; }
у меня не работает, только с label.
   
Нельзя ли вернуть отображение :after всегда? Как это было у меня. Там был .restartless, который здесь не работает, нужен .enabled какой нибудь.
   
Ну и другие просьбы, если можно. uuid и ярлыки.

Отсутствует

 

№912930-08-2020 13:48:54

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2074
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

voqabuhe пишет

А отдельным файлом можно подключить и Ctrl+ЛКМ: Просмотр источника где должно открываться?

Зачем отдельным? Просмотр должен открыться в ассоциированной с .xpi файлом программе, в архиваторе например.
_zt
Проверяйте, вроде все сделал как просили, в тултипе отображается только доступные операции и инфа

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

Выделить код

Код:

try {(() => {
    var id = "ucf-eom-button",
    label = "Настройки расширений",
    tooltiptext = "Настройки расширений",
    img = "data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' height='16' width='16' viewBox='0 0 48 48'><g><rect x='0' y='0' width='48' height='48' rx='3' ry='3' style='fill:rgb(0, 120, 173);'/><path style='opacity:0.25;fill:black;' d='M 24,4.5 18,12 3,23.7 12,32.7 3.9,44.1 7.8,48 H 45 C 46.7,48 48,46.7 48,45 V 26.1 L 34.8,12.9 31.8,12.3 Z'/><path style='fill:white;' d='M 19.88,3 C 16.93,3 14.55,4.662 14.55,6.701 14.63,7.474 15.11,8.438 15.37,8.762 16.59,10.41 16.59,11.44 16.29,12.06 H 6.299 C 4.476,12.06 3,13.53 3,15.35 V 23.68 C 3.625,24 4.65,24 6.299,22.77 6.625,22.52 7.587,22.02 8.363,21.94 10.4,21.94 12.06,24.35 12.06,27.29 12.06,30.24 10.4,32.65 8.363,32.65 7.725,32.63 6.774,32.07 6.299,31.82 4.65,30.59 3.625,30.59 3,30.91 V 41.71 C 3,43.53 4.476,45 6.299,45 H 19.58 C 19.88,44.38 19.88,43.35 18.65,41.71 18.4,41.38 17.91,40.42 17.82,39.65 17.82,37.6 20.23,35.94 23.18,35.94 26.14,35.94 28.55,37.6 28.55,39.65 28.53,40.28 27.97,41.23 27.71,41.71 26.47,43.35 26.47,44.38 26.79,45 H 32.65 C 34.47,45 35.96,43.53 35.96,41.71 V 32.55 C 36.56,32.23 37.59,32.23 39.23,33.47 39.72,33.73 40.68,34.29 41.29,34.29 43.35,34.29 45,31.91 45,28.94 45,25.99 43.35,23.59 41.29,23.59 40.54,23.67 39.58,24.17 39.23,24.41 37.59,25.65 36.56,25.65 35.96,25.33 V 15.35 C 35.96,13.53 34.47,12.06 32.65,12.06 H 23.49 C 23.19,11.44 23.19,10.41 24.41,8.762 24.66,8.287 25.22,7.337 25.23,6.713 25.23,4.662 22.85,3 19.88,3' /></g></svg>",
    showVersion = true,
    userPermissions = true,
    showHidden = true,
    showDisabled = true,
    enabledFirst = true,
    blackListSet = new Set([

    ]);

    if (!("AddonManager" in this))
        ChromeUtils.defineModuleGetter(this, "AddonManager", "resource://gre/modules/AddonManager.jsm");
    if (!("GlobalManager" in this))
        XPCOMUtils.defineLazyGetter(this, "GlobalManager", () => {
            const { GlobalManager } = ChromeUtils.import("resource://gre/modules/Extension.jsm", null);
            return GlobalManager;
        });
    var extensionOptionsMenu = {
        populateMenu: async function(e) {
            var prevState,
            popup = e.target,
            doc = e.view.document;
            while (popup.hasChildNodes())
                popup.firstChild.remove();
            var addons = await AddonManager.getAddonsByTypes(["extension"]);
            addons.filter(a => !(a.iconURL || "").startsWith("resource://search-extensions/")).sort((a, b) => {
                var ka = (enabledFirst ? a.isActive ? "0" : "1" : "") + a.name.toLowerCase();
                var kb = (enabledFirst ? b.isActive ? "0" : "1" : "") + b.name.toLowerCase();
                return (ka < kb) ? -1 : 1;
            }).forEach(addon => {
                if (!blackListSet.has(addon.id) &&
                    (!addon.hidden || showHidden) &&
                    (!addon.userDisabled || showDisabled)) {
                    if (showDisabled && enabledFirst && prevState && addon.isActive != prevState)
                        popup.append(doc.createXULElement("menuseparator"));
                    prevState = addon.isActive;
                    let extension = GlobalManager.extensionMap.get(addon.id);
                    let mi = doc.createXULElement("menuitem"), permissions, uuid,
                    props = {
                        label: `${addon.name}${showVersion ? ` ${addon.version}` : ""}`,
                        class: "menuitem-iconic",
                        tooltiptext: `${addon.description ? `${addon.description}\n` : ""}ID: ${addon.id}${addon.isActive && (uuid = extension?.uuid) ? `\nUUID: ${uuid}` : ""}${(userPermissions && (permissions = addon.userPermissions?.permissions)?.length) ? `\nРазрешения: ${permissions.join(", ")}` : ""}\n${addon.optionsURL ? `\nЛКМ: Настройки` : ""}\nCtrl+ЛКМ: Копировать ID${uuid ? `\nShift+ЛКМ: Копировать UUID` : ""}${addon.creator?.url ? `\nCtrl+Shift+ЛКМ: Автор` : ""}${addon.homepageURL ? `\nСКМ: Домашняя страница` : ""}\nCtrl+СКМ: Просмотр источника\nShift+СКМ: Просмотр источника во вкладке\nПКМ: Включить/Отключить${(!addon.isSystem && !addon.isBuiltin) ? `\nCtrl+ПКМ: Удалить` : ""}`,
                        image: addon.iconURL || img,
                    };
                    for (let p in props)
                        mi.setAttribute(p, props[p]);
                    mi.addEventListener("click", (e) => {
                        extensionOptionsMenu.handleClick(e);
                    });
                    mi._Addon = addon;
                    mi._Extension = extension;
                    this.setDisable(mi, addon, 0);
                    popup.append(mi);
                }
            });
        },
        handleClick: function(e) {
            var win = e.view, mi = e.target;
            if (!("_Addon" in mi) || !("_Extension" in mi))
                return;
            var addon = mi._Addon, extension = mi._Extension;
            var hasMdf = e.ctrlKey || e.shiftKey || e.altKey || e.metaKey;
            switch (e.button) {
                case 0:
                    if (!hasMdf && addon.optionsURL)
                        this.openAddonOptions(addon, win);
                    else if (e.ctrlKey && e.shiftKey && addon.creator?.url)
                            win.gBrowser.selectedTab = this.addTab(win, addon.creator.url);
                    else if (e.ctrlKey)
                        Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(addon.id);
                    else if (e.shiftKey && extension?.uuid)
                        Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(extension.uuid);
                    win.closeMenus(mi);
                    break;
                case 1:
                    if (!hasMdf && addon.homepageURL)
                        win.gBrowser.selectedTab = this.addTab(win, addon.homepageURL);
                    else if (e.ctrlKey && !e.shiftKey)
                        this.browseDir(addon);
                    else if (e.shiftKey && !e.ctrlKey)
                        this.browseDir(addon, win);
                    win.closeMenus(mi);
                    break;
                case 2:
                    if (!hasMdf) {
                        let endis = addon.userDisabled ? "enable" : "disable";
                        if (addon.id == "screenshots@mozilla.org")
                            Services.prefs.setBoolPref("extensions.screenshots.disabled", !addon.userDisabled);
                        addon[endis]({ allowSystemAddons: true }).then(() => {
                            this.setDisable(mi, addon, 1);
                        }, err => {
                            console.error(err);
                        });
                    } else if (e.ctrlKey && !addon.isSystem && !addon.isBuiltin && Services.prompt.confirm(null, null, `Удалить ${addon.name}?`)) {
                        if (addon.pendingOperations & AddonManager.PENDING_UNINSTALL)
                            addon.cancelUninstall();
                        else {
                            addon.uninstall();
                            return;
                        }
                        let cls = mi.classList;
                        cls.remove("ucf-enabling");
                        cls.remove("ucf-disabling");
                        cls.add("ucf-uninstalling");
                        cls.add("ucf-disabled");
                    }
                break;
            }
        },
        setDisable: function(mi, addon, toggling) {
            var cls = mi.classList;
            if (toggling) {
                if (addon.isActive) {
                    if (addon.optionsURL)
                        cls.remove("ucf-notoptions");
                    cls.remove("ucf-disabled");
                    cls.remove("ucf-disabling");
                    cls.add("ucf-enabling");
                } else {
                    cls.remove("ucf-enabling");
                    cls.add("ucf-disabling");
                }
            }
            if (!addon.isActive)
                cls.add("ucf-disabled");
            if (!addon.optionsURL)
                cls.add("ucf-notoptions");
            if (addon.isSystem)
                cls.add("ucf-system");
        },
        openAddonOptions: function(addon, win) {
            if (!addon.isActive || !addon.optionsURL)
                return;
            switch (Number(addon.optionsType)) {
                case 5:
                    win.BrowserOpenAddonsMgr("addons://detail/" + encodeURIComponent(addon.id) + "/preferences");
                    break;
                case 3:
                    win.switchToTabHavingURI(addon.optionsURL, true);
                    break;
            }
        },
        browseDir: function(addon, win) {
            try {
                if (!win) {
                    let file = Services.io.getProtocolHandler("file")
                    .QueryInterface(Ci.nsIFileProtocolHandler)
                    .getFileFromURLSpec(addon.getResourceURI().QueryInterface(Ci.nsIJARURI).JARFile.spec);
                    if (file.exists())
                        file.launch();
                } else
                    win.gBrowser.selectedTab = this.addTab(win, addon.getResourceURI().spec);
            } catch (e) {}
        },
        addTab: function(win, url, params = {}) {
            params.triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
            params.relatedToCurrent = true;
            return win.gBrowser.addTab(url, params);
        },
    };
    CustomizableUI.createWidget({
        id: id,
        type: "custom",
        label: label,
        tooltiptext: tooltiptext,
        localized: false,
        defaultArea: CustomizableUI.AREA_NAVBAR,
        onBuild: function(doc) {
            var btn = doc.createXULElement("toolbarbutton"), win = doc.defaultView,
            props = {
                id: id,
                label: label,
                tooltiptext: tooltiptext,
                type: "menu",
                class: "toolbarbutton-1 chromeclass-toolbar-additional",
            };
            for (let p in props)
                btn.setAttribute(p, props[p]);
            btn.addEventListener("click", (e) => {
                if (e.button == 1)
                    win.BrowserOpenAddonsMgr("addons://list/extension");
            });
            var mp = doc.createXULElement("menupopup");
            mp.id = `${id}-popup`;
            mp.addEventListener("click", (e) => {
                e.preventDefault();
                e.stopPropagation();
            });
            mp.addEventListener("contextmenu", (e) => {
                e.preventDefault();
                e.stopPropagation();
            });
            mp.addEventListener("popupshowing", (e) => {
				extensionOptionsMenu.populateMenu(e);
			});
            btn.append(mp);
            var btnstyle = "data:text/css;charset=utf-8," + encodeURIComponent(`
                #${id} {
                    list-style-image: url("${img}") !important;
                }
                #${id}-popup menuitem::after {
                    display: -moz-box !important;
                    -moz-box-align: center !important;
                    -moz-box-pack: center !important;
                    font-style: normal !important;
                    height: 20px !important;
                    width: 20px !important;
                    line-height: 20px !important;
                    font-size: 20px !important;
                    overflow: hidden !important;
                }
                #${id}-popup menuitem:not(.ucf-disabled)::after,
                #${id}-popup menuitem.ucf-enabling::after {
                    content: "\\2611" !important;
                    color: #0074e8 !important;
                }
                #${id}-popup menuitem.ucf-disabled::after,
                #${id}-popup menuitem.ucf-disabling::after {
                    content: "\\2610" !important;
                    color: #cccccc !important;
                }
                #${id}-popup menuitem.ucf-enabling::after {
                    color: #cccccc !important;
                }
                #${id}-popup menuitem.ucf-uninstalling::after {
                    content: "\\0021" !important;
                }
                #${id}-popup menuitem.ucf-notoptions,
                #${id}-popup menuitem.ucf-notoptions > * {
                    color: gray !important;
                }
                #${id}-popup menuitem.ucf-disabled,
                #${id}-popup menuitem.ucf-disabled > * {
                    color: gray !important;
                    font-style: italic !important;
                }
                #${id}-popup menuitem.ucf-system > * {
                    text-decoration: underline !important;
                    text-decoration-style: dotted !important;
                }
            `);
            try {
                win.windowUtils.loadSheetUsingURIString(btnstyle, win.windowUtils.USER_SHEET);
            } catch (e) {}
            return btn;
        },
    });
})();} catch (e) {}

Отредактировано Vitaliy V. (31-08-2020 09:28:09)

Отсутствует

 

№913030-08-2020 17:27:54

sibirnik
Участник
 
Группа: Members
Зарегистрирован: 11-08-2016
Сообщений: 63
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

Как при запуске Firefox убрать белый цвет вкладки(или изменить цвет на серый)?
Первую вкладку убрал так:   

скрытый текст
browser {-moz-appearance: none !important;
    background: #DADADB !important;}

А потом следует запуск Speed Dial и на 1-2 секунды цвет вновь меняется на белый и только потом появляется вкладка Speed Dial.
Как убрать эту белую (1-2сек.) вкладку или закрасить?

R.S Дополнение - оказывается этот короткое появление белой вкладки везде при запуске любой вкладки(ссылки на сайт).

Отредактировано sibirnik (30-08-2020 17:53:20)

Отсутствует

 

№913130-08-2020 17:57:33

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

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
Да, это действительно то, что я просил и даже больше. Спасибо большое, шикарная кнопка получилась.
   
Последнее:
Как первую строку разрешений ограничить, например, 60 символов (без заголовка), далее перенос на вторую строку (по словам)?
И как blackListSet заполнять правильно?
   
Оставил себе так, немного стили поправил и описание убрал:

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

Выделить код

Код:

// ExtensionOptionsMenu ucf
try {(() => {
    var id = "ucf-eom-button",
    label = "Extension Options Menu",
    tooltiptext = "Меню расширений",
    img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABaUlEQVQ4y6WTW0sCQRiG/SEpVBDUVVfphbAEhWAlqYhrLWUlER2IIgrqYkEp6SBmudWiFf0SiSCwpAI7bJnprq6H/sTbGhJiEyt28fAN7zfz8DHDaABo/oPqBpovX7j4T1gOS6dNCcYiZbhOSrCHi2hugqNCwskVYNmXbxoSuPkCN3NWhCdahLLGKCfDcSBjOJiHeTeHPr8EyifCwGb9RMF0RIaHl+E+zoMJ5+AM5WALSBjaEWHayqLXm4GR/YB+Iw2iYIKTMB6WwIRE0EER9r0s+r1pGNZT6F55ReeigPb5F7TOPpMFTDCDkUAGA753GFYFdC08QedJEvkR2DbfzuntFBz+1K2ZFdCz9Ii2qQfo3Pck2MoZpVI/AqtXQAXjchIdk3fQMok/Ib6CaS0Z1c8pdlc8pqXjUOF7AqVSxDvQOq7RKERBi/UKdbDVnK3vkQWWS9Si1vstGIyxCqiBquZUXc429BfU+AL9Tqy8Q2Za8AAAAABJRU5ErkJggg==",
    showVersion = true,
    userPermissions = true,
    showHidden = true,
    showDisabled = true,
    enabledFirst = false,
    blackListSet = new Set([

    ]);

    if (!("AddonManager" in this))
        ChromeUtils.defineModuleGetter(this, "AddonManager", "resource://gre/modules/AddonManager.jsm");
    if (!("GlobalManager" in this))
        XPCOMUtils.defineLazyGetter(this, "GlobalManager", () => {
            const { GlobalManager } = ChromeUtils.import("resource://gre/modules/Extension.jsm", null);
            return GlobalManager;
        });
    var extensionOptionsMenu = {
        populateMenu: async function(e) {
            var prevState,
            popup = e.target,
            doc = e.view.document;
            while (popup.hasChildNodes())
                popup.firstChild.remove();
            var addons = await AddonManager.getAddonsByTypes(["extension"]);
            addons.filter(a => !(a.iconURL || "").startsWith("resource://search-extensions/")).sort((a, b) => {
                var ka = (enabledFirst ? a.isActive ? "0" : "1" : "") + a.name.toLowerCase();
                var kb = (enabledFirst ? b.isActive ? "0" : "1" : "") + b.name.toLowerCase();
                return (ka < kb) ? -1 : 1;
            }).forEach(addon => {
                if (!blackListSet.has(addon.id) &&
                    (!addon.hidden || showHidden) &&
                    (!addon.userDisabled || showDisabled)) {
                    if (showDisabled && enabledFirst && prevState && addon.isActive != prevState)
                        popup.append(doc.createXULElement("menuseparator"));
                    prevState = addon.isActive;
                    let extension = GlobalManager.extensionMap.get(addon.id);
                    let mi = doc.createXULElement("menuitem"), permissions, uuid,
                    props = {
                        label: `${addon.name}${showVersion ? ` ${addon.version}` : ""}`,
                        class: "menuitem-iconic",
                        tooltiptext: `ID			: ${addon.id}${addon.isActive && (uuid = extension?.uuid) ? `\nUUID		: ${uuid}` : ""}${(userPermissions && (permissions = addon.userPermissions?.permissions)?.length) ? `\n\n${permissions.join(", ")}` : ""}\n${addon.optionsURL ? `\nЛКМ			: Настройки` : ""}\nCtrl+ЛКМ		: Копировать ID${uuid ? `\nShift+ЛКМ		: Копировать UUID` : ""}${addon.creator?.url ? `\nCtrl+Shift+ЛКМ	: Автор, страница на AMO` : ""}\nПКМ			: Включить/Отключить${(!addon.isSystem && !addon.isBuiltin) ? `\nCtrl+ПКМ		: Удалить` : ""}${addon.homepageURL ? `\nСКМ			: Домашняя страница` : ""}\nCtrl+СКМ		: Просмотр источника\nShift+СКМ		: Просмотр источника во вкладке`,
                        image: addon.iconURL || img,
                    };
                    for (let p in props)
                        mi.setAttribute(p, props[p]);
                    mi.addEventListener("click", (e) => {
                        extensionOptionsMenu.handleClick(e);
                    });
                    mi._Addon = addon;
                    mi._Extension = extension;
                    this.setDisable(mi, addon, 0);
                    popup.append(mi);
                }
            });
        },
        handleClick: function(e) {
            var win = e.view, mi = e.target;
            if (!("_Addon" in mi) || !("_Extension" in mi))
                return;
            var addon = mi._Addon, extension = mi._Extension;
            var hasMdf = e.ctrlKey || e.shiftKey || e.altKey || e.metaKey;
            switch (e.button) {
                case 0:
                    if (!hasMdf && addon.optionsURL)
                        this.openAddonOptions(addon, win);
                    else if (e.ctrlKey && e.shiftKey && addon.creator?.url)
                            win.gBrowser.selectedTab = this.addTab(win, addon.creator.url);
                    else if (e.ctrlKey)
                        Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(addon.id);
                    else if (e.shiftKey && extension?.uuid)
                        Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(extension.uuid);
                    win.closeMenus(mi);
                    break;
                case 1:
                    if (!hasMdf && addon.homepageURL)
                        win.gBrowser.selectedTab = this.addTab(win, addon.homepageURL);
                    else if (e.ctrlKey && !e.shiftKey)
                        this.browseDir(addon);
                    else if (e.shiftKey && !e.ctrlKey)
                        this.browseDir(addon, win);
                    win.closeMenus(mi);
                    break;
                case 2:
                    if (!hasMdf) {
                        let endis = addon.userDisabled ? "enable" : "disable";
                        if (addon.id == "screenshots@mozilla.org")
                            Services.prefs.setBoolPref("extensions.screenshots.disabled", !addon.userDisabled);
                        addon[endis]({ allowSystemAddons: true }).then(() => {
                            this.setDisable(mi, addon, 1);
                        }, err => {
                            console.error(err);
                        });
                    } else if (e.ctrlKey && !addon.isSystem && !addon.isBuiltin && Services.prompt.confirm(null, null, `Удалить ${addon.name}?`)) {
                        if (addon.pendingOperations & AddonManager.PENDING_UNINSTALL)
                            addon.cancelUninstall();
                        else {
                            addon.uninstall();
                            return;
                        }
                        let cls = mi.classList;
                        cls.remove("ucf-enabling");
                        cls.remove("ucf-disabling");
                        cls.add("ucf-uninstalling");
                        cls.add("ucf-disabled");
                    }
                break;
            }
        },
        setDisable: function(mi, addon, toggling) {
            var cls = mi.classList;
            if (toggling) {
                if (addon.isActive) {
                    if (addon.optionsURL)
                        cls.remove("ucf-notoptions");
                    cls.remove("ucf-disabled");
                    cls.remove("ucf-disabling");
                    cls.add("ucf-enabling");
                } else {
                    cls.remove("ucf-enabling");
                    cls.add("ucf-disabling");
                }
            }
            if (!addon.isActive)
                cls.add("ucf-disabled");
            if (!addon.optionsURL)
                cls.add("ucf-notoptions");
        },
        openAddonOptions: function(addon, win) {
            if (!addon.isActive || !addon.optionsURL)
                return;
            switch (Number(addon.optionsType)) {
                case 5:
                    win.BrowserOpenAddonsMgr("addons://detail/" + encodeURIComponent(addon.id) + "/preferences");
                    break;
                case 3:
                    win.switchToTabHavingURI(addon.optionsURL, true);
                    break;
            }
        },
        browseDir: function(addon, win) {
            try {
                if (!win) {
                    let file = Services.io.getProtocolHandler("file")
                    .QueryInterface(Ci.nsIFileProtocolHandler)
                    .getFileFromURLSpec(addon.getResourceURI().QueryInterface(Ci.nsIJARURI).JARFile.spec);
                    if (file.exists())
                        file.launch();
                } else
                    win.gBrowser.selectedTab = this.addTab(win, addon.getResourceURI().spec);
            } catch (e) {}
        },
        addTab: function(win, url, params = {}) {
            params.triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
            params.relatedToCurrent = true;
            return win.gBrowser.addTab(url, params);
        },
    };
    CustomizableUI.createWidget({
        id: id,
        type: "custom",
        label: label,
        tooltiptext: tooltiptext,
        localized: false,
        defaultArea: CustomizableUI.AREA_NAVBAR,
        onBuild: function(doc) {
            var btn = doc.createXULElement("toolbarbutton"), win = doc.defaultView,
            props = {
                id: id,
                label: label,
                tooltiptext: tooltiptext,
                type: "menu",
                class: "toolbarbutton-1 chromeclass-toolbar-additional",
            };
            for (let p in props)
                btn.setAttribute(p, props[p]);
            btn.addEventListener("click", (e) => {
                if (e.button == 1)
                    win.BrowserOpenAddonsMgr("addons://list/extension");
            });
            var mp = doc.createXULElement("menupopup");
            mp.id = `${id}-popup`;
            mp.addEventListener("click", (e) => {
                e.preventDefault();
                e.stopPropagation();
            });
            mp.addEventListener("contextmenu", (e) => {
                e.preventDefault();
                e.stopPropagation();
            });
            mp.addEventListener("popupshowing", (e) => {
				extensionOptionsMenu.populateMenu(e);
			});
            btn.append(mp);
            var btnstyle = "data:text/css;charset=utf-8," + encodeURIComponent(`
                #${id} {
                    list-style-image: url("${img}") !important;
                }
                #${id}-popup menuitem::after {
                    display: -moz-box !important;
                    -moz-box-align: center !important;
                    -moz-box-pack: center !important;
                    font-style: normal !important;
                    height: 18px !important;
                    width: 18px !important;
                    line-height: 18px !important;
                    font-size: 18px !important;
                    overflow: hidden !important;
                    margin: 0 6px 0 0 !important;
                }
                #${id}-popup menuitem:not(.ucf-disabled)::after,
                #${id}-popup menuitem.ucf-enabling::after {
                    content: "\\2611" !important;
                    color: #6CBE6C !important;
                }
                #${id}-popup menuitem.ucf-disabled::after,
                #${id}-popup menuitem.ucf-disabling::after {
                    content: "\\2610" !important;
                    color: orange !important;
                }
                #${id}-popup menuitem.ucf-enabling::after {
                    color: #cccccc !important;
                }
                #${id}-popup menuitem.ucf-uninstalling::after {
                    content: "\\0021" !important;
                }
                #${id}-popup menuitem.ucf-notoptions,
                #${id}-popup menuitem.ucf-notoptions label {
                    color: gray !important;
                }
                #${id}-popup menuitem.ucf-disabled,
                #${id}-popup menuitem.ucf-disabled label {
                    color: orange !important;
                    font-style: italic !important;
                }
            `);
            try {
                win.windowUtils.loadSheetUsingURIString(btnstyle, win.windowUtils.USER_SHEET);
            } catch (e) {}
            return btn;
        },
    });
})();} catch (e) {}


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

Отсутствует

 

№913230-08-2020 18:02:46

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

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V. пишет

Зачем отдельным?

Это у меня там два разных вопроса, очевидно я их не очень удачно задал.:) Я имел ввиду, можно ваш скрипт поместить в отдельный файл, а не в общий  custom_script.js? На мой взгляд так удобнее их искать, отключать, подключать...

Отсутствует

 

№913330-08-2020 18:37:47

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

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
Поддерживаю voqabuhe, тоже хотелось бы вынести крупные скрипты из custom_script.js в отдельные файлы. Как импорт сделать по аналогии с импортом custom_script_all_win.js и custom_script_win.js? А то уже 65кб, неудобно искать/управлять ими.

Отредактировано _zt (30-08-2020 18:39:52)

Отсутствует

 

№913430-08-2020 19:31:18

sandro79
Участник
 
Группа: Members
Зарегистрирован: 15-11-2017
Сообщений: 1750
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

sibirnik пишет

R.S Дополнение - оказывается этот короткое появление белой вкладки везде при запуске любой вкладки(ссылки на сайт)

Попробуйте код отсюда. Я использую такие коды:

скрытый текст
userChrome.css

Выделить код

Код:

/* цвет при загрузке страницы */ 
@-moz-document url-prefix("chrome://browser/content/browser.x") {
#tabbrowser-tabpanels, tabbrowser#content,
:-moz-any(#tabbrowser-tabpanels, tabbrowser#content) .browserStack > browser {
    -moz-appearance: none !important;
    background:  #2A2A2E !important;
}

}

userContent.css

Выделить код

Код:

/* цвет пустой страницы */
@-moz-document url("about:blank") {

:root {
    background:  #2A2A2E !important;
}

}


До кучи, создать число и логическое: ui.systemUsesDarkTheme — 1, browser.in-content.dark-mode — true

Отсутствует

 

№913530-08-2020 20:06:55

sibirnik
Участник
 
Группа: Members
Зарегистрирован: 11-08-2016
Сообщений: 63
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

sandro79
Спасибо за примеры - они работают, но не решили , что я просил:

короткое появление белой вкладки на секунду при запуске любой вкладки(ссылки на сайт)

и особенно заметно при первом запуске браузера: вначале тёмный фон, затем на секунду светлый и только потом Speed Dial.
Вот этот секундный светлый фон и хотелось бы убрать, если можно???

Отсутствует

 

№913630-08-2020 21:15:12

sandro79
Участник
 
Группа: Members
Зарегистрирован: 15-11-2017
Сообщений: 1750
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

sibirnik

короткое появление белой вкладки на секунду при запуске любой вкладки(ссылки на сайт)

У меня первый код убирает белый фон при открытии из журнала, закладок, ссылок, топа сайтов, так же при запуске браузера.

вначале тёмный фон, затем на секунду светлый и только потом Speed Dial

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

скрытый текст
2c96bde25752.jpg


Вообще, этих Speed Dial-ов аж четыре поиск на АМО выдает.

Отредактировано sandro79 (30-08-2020 22:29:33)

Отсутствует

 

№913731-08-2020 01:31:07

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

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.

А можете ещё выделить названия системных расширений каким-нибудь другим цветом, чтоб их сразу было видно?

Отсутствует

 

№913831-08-2020 03:18:57

sibirnik
Участник
 
Группа: Members
Зарегистрирован: 11-08-2016
Сообщений: 63
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

sandro79

sandro79 пишет

этих Speed Dial-ов аж четыре

Больше с добавкой слов. Мало того, я их ранее почти все попробовал и у всех такая проблема. Вообще у меня тема не чёрная(не выдерживают глаза и чёрный и белый -))). )

sandro79 пишет

Разработчику лучше может написать.

Попробую. Вам спасибо.

Отсутствует

 

№913931-08-2020 09:47:29

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2074
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

_zt пишет

ограничить, например, 60 символов (без заголовка), далее перенос на вторую строку (по словам)?
В общем то, описание можно вернуть, если бы длину строк ограничить.

Похоже вам другую версию не для всех добавлю, собственно длина тултипа и так ограничена css

скрытый текст
tooltip {
    appearance: auto;
    -moz-default-appearance: tooltip;
    margin-top: 21px;
    max-width: 40em;
    color: InfoText;
    font: message-box;
}

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

Выделить код

Код:

try {(() => {
    var id = "ucf-eom-button",
    label = "Настройки расширений",
    tooltiptext = "Настройки расширений",
    img = "data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' height='16' width='16' viewBox='0 0 48 48'><g><rect x='0' y='0' width='48' height='48' rx='3' ry='3' style='fill:rgb(0, 120, 173);'/><path style='opacity:0.25;fill:black;' d='M 24,4.5 18,12 3,23.7 12,32.7 3.9,44.1 7.8,48 H 45 C 46.7,48 48,46.7 48,45 V 26.1 L 34.8,12.9 31.8,12.3 Z'/><path style='fill:white;' d='M 19.88,3 C 16.93,3 14.55,4.662 14.55,6.701 14.63,7.474 15.11,8.438 15.37,8.762 16.59,10.41 16.59,11.44 16.29,12.06 H 6.299 C 4.476,12.06 3,13.53 3,15.35 V 23.68 C 3.625,24 4.65,24 6.299,22.77 6.625,22.52 7.587,22.02 8.363,21.94 10.4,21.94 12.06,24.35 12.06,27.29 12.06,30.24 10.4,32.65 8.363,32.65 7.725,32.63 6.774,32.07 6.299,31.82 4.65,30.59 3.625,30.59 3,30.91 V 41.71 C 3,43.53 4.476,45 6.299,45 H 19.58 C 19.88,44.38 19.88,43.35 18.65,41.71 18.4,41.38 17.91,40.42 17.82,39.65 17.82,37.6 20.23,35.94 23.18,35.94 26.14,35.94 28.55,37.6 28.55,39.65 28.53,40.28 27.97,41.23 27.71,41.71 26.47,43.35 26.47,44.38 26.79,45 H 32.65 C 34.47,45 35.96,43.53 35.96,41.71 V 32.55 C 36.56,32.23 37.59,32.23 39.23,33.47 39.72,33.73 40.68,34.29 41.29,34.29 43.35,34.29 45,31.91 45,28.94 45,25.99 43.35,23.59 41.29,23.59 40.54,23.67 39.58,24.17 39.23,24.41 37.59,25.65 36.56,25.65 35.96,25.33 V 15.35 C 35.96,13.53 34.47,12.06 32.65,12.06 H 23.49 C 23.19,11.44 23.19,10.41 24.41,8.762 24.66,8.287 25.22,7.337 25.23,6.713 25.23,4.662 22.85,3 19.88,3' /></g></svg>",
    showVersion = true,
    userPermissions = true,
    showHidden = true,
    showDisabled = true,
    enabledFirst = true,
    maxChars = 42,
    blackListSet = new Set([

    ]);

    if (!("AddonManager" in this))
        ChromeUtils.defineModuleGetter(this, "AddonManager", "resource://gre/modules/AddonManager.jsm");
    if (!("GlobalManager" in this))
        XPCOMUtils.defineLazyGetter(this, "GlobalManager", () => {
            const { GlobalManager } = ChromeUtils.import("resource://gre/modules/Extension.jsm", null);
            return GlobalManager;
        });
    var extensionOptionsMenu = {
        regExp: function(w, s = "") {
            return new RegExp(String.raw`(?![^\n]{1,${w}}$)([^\n]{1,${w}})${s}\s`, "g");
        },
        populateMenu: async function(e) {
            var prevState,
            popup = e.target,
            doc = e.view.document;
            while (popup.hasChildNodes())
                popup.firstChild.remove();
            var addons = await AddonManager.getAddonsByTypes(["extension"]);
            var regDesc = this.regExp(maxChars), regPerm = this.regExp(maxChars, ",");
            addons.filter(a => !(a.iconURL || "").startsWith("resource://search-extensions/")).sort((a, b) => {
                var ka = (enabledFirst ? a.isActive ? "0" : "1" : "") + a.name.toLowerCase();
                var kb = (enabledFirst ? b.isActive ? "0" : "1" : "") + b.name.toLowerCase();
                return (ka < kb) ? -1 : 1;
            }).forEach(addon => {
                if (!blackListSet.has(addon.id) &&
                    (!addon.hidden || showHidden) &&
                    (!addon.userDisabled || showDisabled)) {
                    if (showDisabled && enabledFirst && prevState && addon.isActive != prevState)
                        popup.append(doc.createXULElement("menuseparator"));
                    prevState = addon.isActive;
                    let extension = GlobalManager.extensionMap.get(addon.id);
                    let mi = doc.createXULElement("menuitem"), permissions, uuid,
                    props = {
                        label: `${addon.name}${showVersion ? ` ${addon.version}` : ""}`,
                        class: "menuitem-iconic",
                        tooltiptext: `${addon.description ? `${addon.description.replace(regDesc, "$1\n")}\n` : ""}ID: ${addon.id}${addon.isActive && (uuid = extension?.uuid) ? `\nUUID: ${uuid}` : ""}${(userPermissions && (permissions = addon.userPermissions?.permissions)?.length) ? `\n\n${permissions.join(", ").replace(regPerm, "$1,\n")}` : ""}\n${addon.optionsURL ? `\nЛКМ: Настройки` : ""}\nCtrl+ЛКМ: Копировать ID${uuid ? `\nShift+ЛКМ: Копировать UUID` : ""}${addon.creator?.url ? `\nCtrl+Shift+ЛКМ: Автор` : ""}${addon.homepageURL ? `\nСКМ: Домашняя страница` : ""}\nCtrl+СКМ: Просмотр источника\nShift+СКМ: Просмотр источника во вкладке\nПКМ: Включить/Отключить${(!addon.isSystem && !addon.isBuiltin) ? `\nCtrl+ПКМ: Удалить` : ""}`,
                        image: addon.iconURL || img,
                    };
                    for (let p in props)
                        mi.setAttribute(p, props[p]);
                    mi.addEventListener("click", (e) => {
                        extensionOptionsMenu.handleClick(e);
                    });
                    mi._Addon = addon;
                    mi._Extension = extension;
                    this.setDisable(mi, addon, 0);
                    popup.append(mi);
                }
            });
        },
        handleClick: function(e) {
            var win = e.view, mi = e.target;
            if (!("_Addon" in mi) || !("_Extension" in mi))
                return;
            var addon = mi._Addon, extension = mi._Extension;
            var hasMdf = e.ctrlKey || e.shiftKey || e.altKey || e.metaKey;
            switch (e.button) {
                case 0:
                    if (!hasMdf && addon.optionsURL)
                        this.openAddonOptions(addon, win);
                    else if (e.ctrlKey && e.shiftKey && addon.creator?.url)
                            win.gBrowser.selectedTab = this.addTab(win, addon.creator.url);
                    else if (e.ctrlKey)
                        Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(addon.id);
                    else if (e.shiftKey && extension?.uuid)
                        Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(extension.uuid);
                    win.closeMenus(mi);
                    break;
                case 1:
                    if (!hasMdf && addon.homepageURL)
                        win.gBrowser.selectedTab = this.addTab(win, addon.homepageURL);
                    else if (e.ctrlKey && !e.shiftKey)
                        this.browseDir(addon);
                    else if (e.shiftKey && !e.ctrlKey)
                        this.browseDir(addon, win);
                    win.closeMenus(mi);
                    break;
                case 2:
                    if (!hasMdf) {
                        let endis = addon.userDisabled ? "enable" : "disable";
                        if (addon.id == "screenshots@mozilla.org")
                            Services.prefs.setBoolPref("extensions.screenshots.disabled", !addon.userDisabled);
                        addon[endis]({ allowSystemAddons: true }).then(() => {
                            this.setDisable(mi, addon, 1);
                        }, err => {
                            console.error(err);
                        });
                    } else if (e.ctrlKey && !addon.isSystem && !addon.isBuiltin && Services.prompt.confirm(null, null, `Удалить ${addon.name}?`)) {
                        if (addon.pendingOperations & AddonManager.PENDING_UNINSTALL)
                            addon.cancelUninstall();
                        else {
                            addon.uninstall();
                            return;
                        }
                        let cls = mi.classList;
                        cls.remove("ucf-enabling");
                        cls.remove("ucf-disabling");
                        cls.add("ucf-uninstalling");
                        cls.add("ucf-disabled");
                    }
                break;
            }
        },
        setDisable: function(mi, addon, toggling) {
            var cls = mi.classList;
            if (toggling) {
                if (addon.isActive) {
                    if (addon.optionsURL)
                        cls.remove("ucf-notoptions");
                    cls.remove("ucf-disabled");
                    cls.remove("ucf-disabling");
                    cls.add("ucf-enabling");
                } else {
                    cls.remove("ucf-enabling");
                    cls.add("ucf-disabling");
                }
            }
            if (!addon.isActive)
                cls.add("ucf-disabled");
            if (!addon.optionsURL)
                cls.add("ucf-notoptions");
            if (addon.isSystem)
                cls.add("ucf-system");
        },
        openAddonOptions: function(addon, win) {
            if (!addon.isActive || !addon.optionsURL)
                return;
            switch (Number(addon.optionsType)) {
                case 5:
                    win.BrowserOpenAddonsMgr("addons://detail/" + encodeURIComponent(addon.id) + "/preferences");
                    break;
                case 3:
                    win.switchToTabHavingURI(addon.optionsURL, true);
                    break;
            }
        },
        browseDir: function(addon, win) {
            try {
                if (!win) {
                    let file = Services.io.getProtocolHandler("file")
                    .QueryInterface(Ci.nsIFileProtocolHandler)
                    .getFileFromURLSpec(addon.getResourceURI().QueryInterface(Ci.nsIJARURI).JARFile.spec);
                    if (file.exists())
                        file.launch();
                } else
                    win.gBrowser.selectedTab = this.addTab(win, addon.getResourceURI().spec);
            } catch (e) {}
        },
        addTab: function(win, url, params = {}) {
            params.triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
            params.relatedToCurrent = true;
            return win.gBrowser.addTab(url, params);
        },
    };
    CustomizableUI.createWidget({
        id: id,
        type: "custom",
        label: label,
        tooltiptext: tooltiptext,
        localized: false,
        defaultArea: CustomizableUI.AREA_NAVBAR,
        onBuild: function(doc) {
            var btn = doc.createXULElement("toolbarbutton"), win = doc.defaultView,
            props = {
                id: id,
                label: label,
                tooltiptext: tooltiptext,
                type: "menu",
                class: "toolbarbutton-1 chromeclass-toolbar-additional",
            };
            for (let p in props)
                btn.setAttribute(p, props[p]);
            btn.addEventListener("click", (e) => {
                if (e.button == 1)
                    win.BrowserOpenAddonsMgr("addons://list/extension");
            });
            var mp = doc.createXULElement("menupopup");
            mp.id = `${id}-popup`;
            mp.addEventListener("click", (e) => {
                e.preventDefault();
                e.stopPropagation();
            });
            mp.addEventListener("contextmenu", (e) => {
                e.preventDefault();
                e.stopPropagation();
            });
            mp.addEventListener("popupshowing", (e) => {
				extensionOptionsMenu.populateMenu(e);
			});
            btn.append(mp);
            var btnstyle = "data:text/css;charset=utf-8," + encodeURIComponent(`
                #${id} {
                    list-style-image: url("${img}") !important;
                }
                #${id}-popup menuitem::after {
                    display: -moz-box !important;
                    -moz-box-align: center !important;
                    -moz-box-pack: center !important;
                    font-style: normal !important;
                    height: 20px !important;
                    width: 20px !important;
                    line-height: 20px !important;
                    font-size: 20px !important;
                    overflow: hidden !important;
                }
                #${id}-popup menuitem:not(.ucf-disabled)::after,
                #${id}-popup menuitem.ucf-enabling::after {
                    content: "\\2611" !important;
                    color: #0074e8 !important;
                }
                #${id}-popup menuitem.ucf-disabled::after,
                #${id}-popup menuitem.ucf-disabling::after {
                    content: "\\2610" !important;
                    color: #cccccc !important;
                }
                #${id}-popup menuitem.ucf-enabling::after {
                    color: #cccccc !important;
                }
                #${id}-popup menuitem.ucf-uninstalling::after {
                    content: "\\0021" !important;
                }
                #${id}-popup menuitem.ucf-notoptions,
                #${id}-popup menuitem.ucf-notoptions > * {
                    color: gray !important;
                }
                #${id}-popup menuitem.ucf-disabled,
                #${id}-popup menuitem.ucf-disabled > * {
                    color: gray !important;
                    font-style: italic !important;
                }
                #${id}-popup menuitem.ucf-system > * {
                    text-decoration: underline !important;
                    text-decoration-style: dotted !important;
                }
            `);
            try {
                win.windowUtils.loadSheetUsingURIString(btnstyle, win.windowUtils.USER_SHEET);
            } catch (e) {}
            return btn;
        },
    });
})();} catch (e) {}

_zt пишет

И как blackListSet заполнять правильно?

Как и раньше массив строк, но они преобразуются в коллекцию Set
blackListSet = new Set([
    "строка1", "строка2"
    ]);

voqabuhe пишет

можно ваш скрипт поместить в отдельный файл, а не в общий  custom_script.js? На мой взгляд так удобнее их искать, отключать, подключать...

ну да

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

Выделить код

Код:

(() => {
    var loadscript = name => {
        try {
            Services.scriptloader.loadSubScript(`chrome://user_chrome_files/content/custom_scripts/${name}`, globalThis, "UTF-8");
        } catch(e) {}
    };
    loadscript("my_script.js");
    // и т. д.
})();

voqabuhe пишет

А можете ещё выделить названия системных расширений каким-нибудь другим цветом, чтоб их сразу было видно?

может подчеркивание, впрочем измените как будет угодно, добавил класс .ucf-system

Отредактировано Vitaliy V. (31-08-2020 09:48:58)

Отсутствует

 

№914031-08-2020 15:31:07

Xvost
Участник
 
Группа: Members
Откуда: Краматорск, Дружковка, Украина
Зарегистрирован: 03-11-2007
Сообщений: 138
UA: Firefox 81.0
Веб-сайт

Re: Настройка внешнего вида Firefox в userChrome.css

sandro79 пишет
Xvost пишет

Теперь: нужно заменить текст у определённой папки на иконку. Я использую код:

Замените display на list-style-image
Если не поможет, то не знаю где ещё может быть ошибка, и вообще возможно ли такое. Может лучше иконку взять в .ico вместо .bmp

Благодарствую, но не работает. Или в корне не то, или же заменить текст в названии папки на панели закладок на картинку нельзя в принципе.

Или можно? Народ, кто в курсе?

Отсутствует

 

№914131-08-2020 16:50:32

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

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
Спасибо. Все ОК.
   
Xvost
К чему такие сложности, может просто поменять иконки?
Тогда вдумчиво разбираем ( оригинал от Vitaliy V. ищите выше) и берем только нужное.

Отсутствует

 

№914231-08-2020 19:14:21

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

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V. пишет

ну да

Спасибо!

Vitaliy V. пишет

может подчеркивание, впрочем измените как будет угодно, добавил класс .ucf-system

Про подчёркивание не подумал, согласен, на мой взгляд так тоже лучше. Спасибо.

Отсутствует

 

№914301-09-2020 01:22:58

usalex
Участник
 
Группа: Members
Зарегистрирован: 17-05-2016
Сообщений: 82
UA: Firefox 82.0

Re: Настройка внешнего вида Firefox в userChrome.css

opaopalalala пишет

После последнего обновления Firefox в контекстном меню табов пункты "Закрыть вкладки справа" и т.п. объединились в группу "Закрыть несколько вкладок". Может быть кто подскажет как избавиться от этой вложенности и вернуть как было раньше. Или хотя бы как перенести один пункт "Закрыть вкладки справа" на уровень выше (как скрыть всю группу я разобрался).

Тоже интересуюсь этим вопросом.
Можно ли для этих двух пунктов избавиться от вложенности (перенести их в "корень" рядом с остальными пунктами)?

Отсутствует

 

№914401-09-2020 03:33:35

razoo
Участник
 
Группа: Members
Зарегистрирован: 23-07-2009
Сообщений: 48
UA: Firefox 60.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
Еще раз благодарю за стиль "порядок панелей: закладки-вкладки-навигация".
Из неожиданного: панель меню появилось в окнах расширений, где её раньше не было. Полагаю, это незапланировано, но лично для меня плюс: позволило запустить браузерный инспектор там, где штатно не получалось.
меня всё устраивает, сообщаю на случай, если вдруг для кого стиль будет нужен, а панель меню повсюду - нет.

Но есть вопрос:
Как, не меняя ориентации тулбара, поместить на эту панель кнопку, чтобы она липла к правой стороне?
++
А еще чуть покосился стиль панели поиска на странице. Но это точно не после нового стиля, а последствия перехода на 78.

Был такой код:

Выделить код

Код:

/* FindBar */
findbar {
-moz-box-ordinal-group: 0 !important;
}
findbar .findbar-container {
direction: rtl !important;
}
findbar .found-matches {
direction: ltr !important;
}
findbar .findbar-textbox {
direction: rtl !important;
min-width: 400px !important;
}
:-moz-any(.browserContainer,#viewSource) :-moz-any(findbar,#FindToolbar)
{
margin-top: -1px !important;
box-shadow: unset !important;
border: 1px solid #e1e1e2 !important;
border-top: 0px solid transparent !important;
border-radius: 0 0 3px 3px;
transition-property: margin-top, opacity, visibility !important;
background-image: unset !important;
background-color: rgb(249,249,250) !important;
background-image: none !important;
}

Теперь проблема с текстовым блоком: не даёт поменять ориентацию и не выставляется минимальная ширина. Если убрать "there.is.only.xul" всё совсем съежает.

Отредактировано razoo (01-09-2020 08:22:47)

Отсутствует

 

№914501-09-2020 14:31:15

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2074
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

razoo пишет

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

Да это не проверял, исправил, а насчет инспектора в нём есть кнопка выбрать iframe в качестве текущего целевого документа...

razoo пишет

Как, не меняя ориентации тулбара, поместить на эту панель кнопку, чтобы она липла к правой стороне?

Ну собственно и без стиля её просто так не сделать.
попробуйте как-то так, добавить в конце стиля перед последней скобкой }

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

Выделить код

Код:

*|*:root:not([inFullscreen]) #toolbar-menubar > :is(spacer[style*="-moz-box-ordinal-group: 1000;"],.toolbarbutton-1) {
    order: 100 !important;
}

.toolbarbutton-1 можно заменить на селекторы кнопок через запятую


razoo пишет

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

может такой попробуйте https://forum.mozilla-russia.org/viewto … 86#p782586

Отсутствует

 

№914601-09-2020 16:20:59

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

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
Обнаружил проблемы на youtube в скрипте для тултипов, сейчас обновил его, частично решилось, но не полностью.
До обновления: при первом наведении на заголовок миниатюры - ничего не показывал, второе наведение - ссылка, третье наведение - ссылка и заголовок.
После обновления: при первом наведении на заголовок миниатюры показывает только ссылку, при втором - ссылку и заголовок.

gif - 1мб
111-anim6.1598966275.gif

Можно исключение как то добавить? Мне вообще на youtube именно в заголовке миниатюр ссылки не нужны, одного татла достаточно. Может как то по #video-title для www.youtube.com. И что бы сразу title подхватывал.

Отсутствует

 

№914701-09-2020 17:46:31

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2074
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

_zt
Это на главной youtube? У меня сразу отображается ссылка + текст. Может у вас  Imagus опять мешает, не?

Отсутствует

 

№914801-09-2020 18:30:26

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

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
Да, опять Imagus, рубордовский фильтр O_youtube-link-thumb.
Я как то не обратил внимание на рамку. Вопрос снимается.
   
На toolbarbutton#undoclosedtabs_button-browser-action (это кнопка расширения) можно действие по пкм повесить - "Восстановить последнюю закрытую вкладку"?
Что б от последнего uc скрипта избавится и от лишней кнопки заодно.

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

Выделить код

Код:

// Undo Close Tab button script for Firefox 60+ by Aris
//

(function() {

try {
  Components.utils.import("resource:///modules/CustomizableUI.jsm");
  var {Services} = Components.utils.import("resource://gre/modules/Services.jsm", {});
  var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
  var appversion = parseInt(Services.appinfo.version);
  
  var button_label = "Восстановить вкладку";
 
  CustomizableUI.createWidget({
	id: "uc_undo_closetab_button", // button id
	defaultArea: CustomizableUI.AREA_NAVBAR,
	removable: true,
	label: button_label, // button title
	tooltiptext: button_label, // tooltip title
	onClick: function(event) {
	  
	  if(event.button=='0') {
		undoCloseTab();
	  }
	},
	onCreated: function(button) {
	  return button;
	}
		
  });
  
  var undoicon = "";
  if(appversion <= 62) {
	  undoicon = '\
	  #uc_undo_closetab_button .toolbarbutton-icon {\
		list-style-image: url("chrome://browser/skin/reload.svg"); /* icon / path to icon */ \
		transform: scaleX(-1); /* icon mirroring */\
	  }\
	  ';
  }
  
  // style button icon
  var uri = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent('\
	\
	  #uc_undo_closetab_button .toolbarbutton-icon {\
		list-style-image: url("chrome://browser/skin/undo.svg"); /* icon / path to icon */ \
		fill: gray; /* icon color name/code */\
	  }\
	  :-moz-any(#customization-palette,#widget-overflow-fixed-list) #uc_undo_closetab_button .toolbarbutton-icon {\
		width: 16px !important; \
		height: 16px !important; \
	  }\
	  '+undoicon+' \
	\
  '), null, null);
  
  sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
  
} catch (e) {
	Components.utils.reportError(e);
};

})();

Отредактировано _zt (01-09-2020 18:48:23)

Отсутствует

 

№914901-09-2020 19:08:56

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2074
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

_zt
зачем мне скрипт, на расширение ссылку давайте, мне наобум что-ли делать ну да селектор есть но мало ли ещё чего

Отсутствует

 

№915001-09-2020 19:32:17

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

Re: Настройка внешнего вида Firefox в userChrome.css

Отсутствует

 

Board footer

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