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

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№927620-11-2020 19:00:58

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

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

Vitaliy V. пишет

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

скрытый текст
Понятно. Не мой путь. :)
Ещё вопрос по стилям.
Раньше был такой аддон "faviconize tab", позволял уменьшать размер вкладки до иконки, причем можно было задать правила по контенту. Пытался наколхозить имитацию
для pdf-файлов

Выделить код

Код:

.tabbrowser-tab[label$=".pdf"]
{
min-width: 40px !important;
max-width: 40px !important;
transition-duration: 0.5s !important;
transition-property: min-width, max-width, transform, opacity !important;
transition-timing-function: linear !important;
}
.tabbrowser-tab[label$=".pdf"] .tab-label,
.tabbrowser-tab[label$=".pdf"] .tab-close-button,
.tabbrowser-tab[label$=".pdf"] .tab-close-button:not([selected="true"])
{
display: none !important;
}

Вкладки с pdf файлами уменьшает, но при закрытии дабл-кликом - площадь занимаемая вкладкой остаётся, а при перезагрузке браузера вкладка появляется снова. Если же закрыть из внутреннего апплета - закрывается, как положено. Но дело не в pdf-вьювере. Пробовал с разным контентом - везде одно и то же.
Понимаю, что стиль дубовый - с чего начать?

Отсутствует

 

№927720-11-2020 19:52:01

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

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

razoo пишет

площадь занимаемая вкладкой остаётся

ну добавьте [fadein] как то так

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

Выделить код

Код:

.tabbrowser-tab:not([pinned])[fadein][label$=".pdf"] {
    min-width: 40px !important;
    max-width: 40px !important;
}

.tabbrowser-tab:not([pinned])[label$=".pdf"] .tab-content > :is(.tab-label-container,.tab-close-button:not([selected="true"])) {
    display: none !important;
}


но все равно ничего хорошего из этого не выйдет

Отсутствует

 

№927820-11-2020 20:25:38

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

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

Vitaliy V. пишет

но все равно ничего хорошего из этого не выйдет

Можно узнать, почему?
Добавил [fadein] - вроде работает, за исключением мелких косметических косяков (фавикон чуть смещен влево, блинкует newtab, пока подгружается контент). Это, наверное, можно зашлифовать. Но если говорите "не выйдет", значит, там что-то существенней? Есть ли смысл допиливать, или подход в принципе тупиковый?

Отредактировано razoo (20-11-2020 20:28:01)

Отсутствует

 

№927920-11-2020 20:54:43

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

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

razoo пишет

Есть ли смысл допиливать, или подход в принципе тупиковый?

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

Отсутствует

 

№928020-11-2020 21:35:57

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

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

Vitaliy V. пишет

определять по названию содержимое вкладки это не точно, может оказаться обычной страницей

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

Vitaliy V. пишет

и ещё такой косяк - изменение размера вкладки при перезагрузке, похоже не исправить

А это не понял. Возможно, у меня не воспроизводится. Для проверки по тому же принципу задал стили для png, jpg, jpeg и gif, хотя пользоваться не буду, но для теста - самое то: 30 вкладок вперемешку - всё корректно. Переход по истории таба туда-сюда - размер меняется, выглядит идеально. Вставка другой ссылки в адрес вкладки - тоже порядок. При перезагрузке - всё гладко. Пока проблем, кроме названных мелочей не встретил.

скрытый текст
Совсем забыл, у меня в "другом углу" userchrome еще:

Выделить код

Код:

.tab-icon-image:not([src]):not([pinned]):not([busy])
{
display: flex !important;
}
.tab-icon-pending:not([src]):not([pinned]):not([busy])
{
display: none !important;
}

А все пустые иконки not([src]) подменяются на кастомные.

Возможно, упустил что-то важное, из-за того что не получилось воспроизвести косяк.
И очередное Спасибо Vitaliy V.

Отредактировано razoo (20-11-2020 21:50:41)

Отсутствует

 

№928121-11-2020 03:11:29

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

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

Vitaliy V.
Можете посмотреть кнопку, перестала в 83-й работать. Правильнее сказать срабатывает ПКМ + 2 раза ЛКМ на иконке а адресной строке.

Отредактировано xrun1 (21-11-2020 03:19:08)

Отсутствует

 

№928221-11-2020 13:38:18

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

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

xrun1
сделано

Отсутствует

 

№928321-11-2020 15:42:19

linlin
Участник
 
Группа: Members
Зарегистрирован: 30-09-2020
Сообщений: 127
UA: Firefox 83.0

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

Моя тема покрасила два меню:
выпадающее меню закладок кнопки-звёздочки - полупрозрачное
и меню "трёх полосок" - непрозрачное.

Остальные меню окрашены этим стилем:
https://forum.mozilla-russia.org/viewto … 65#p764365,
который подхватил прозрачность первого меню. Мне бы хотелось, чтобы меню были непрозрачные. Как это сделать?

Отсутствует

 

№928421-11-2020 17:41:50

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

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

linlin
что касается стиля, можно только если указать свои цвета.
Или тему изменить в manifest.json
"theme": {
        "colors": {
             ...
            "popup": rgba заменить на rgb и т.д.

Отсутствует

 

№928521-11-2020 17:53:02

dezhnev
Участник
 
Группа: Members
Зарегистрирован: 21-04-2016
Сообщений: 72
UA: Firefox 82.0

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

Vitaliy

можно ли поправить ваше расширение spooftimezone, чтобы оно во фрейме работало тоже
понимаю, что проще через ком строку поменять, но лень матушка :rolleyes:

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

в окне
browserleakscomJavaScript-window.1605970158.png

во фрейме

browserleakscomJavaScript-iframe.1605970193.png

Отсутствует

 

№928621-11-2020 19:03:11

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

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

dezhnev
проверьте на этом сайте https://webbrowsertools.com/timezone/
вероятно https://browserleaks.com/ использует "агрессивный" метод поэтому может показывать реальный часовой пояс.
С [normal] iframe.contentWindow работает как положено.

Отредактировано Vitaliy V. (21-11-2020 19:07:08)

Отсутствует

 

№928722-11-2020 11:35:08

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

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

Vitaliy V.
Работает, спасибо.

Отсутствует

 

№928823-11-2020 14:36:27

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 83.0

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

Vitaliy V.
Имею код . Hover на иконки в nav-bar. С иконки "скриншот"  не исчезает, пока в popop сидишь...:not([open="true"]) - не помогает...

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

Выделить код

Код:

#PanelUI-menu-button:hover, #nav-bar-customization-target > .toolbarbutton-1:not(#custombuttons-button13):not([open="true"]):hover{
  background-image: url( chrome://browser/skin/tabbrowser/tab-bg-active.png);
  background-repeat: repeat-x !important;
  border: none !important;
  background-position: left center !important;
  border-radius: 3px !important; 
  background-color: #333 !important; 
}


feubcrsj.jpg

Отсутствует

 

№928923-11-2020 16:28:52

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

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

solombala пишет

:not([open="true"]) - не помогает...

ну у тебя ж кнопка не стандартная
попробуй заменить в Save.js
self._handleClick =()=> menuPopup.openPopup(this, "after_start");
на
self.setAttribute("type", "menu");

не знаю сработает ли для CB, проверял на этой кнопке https://forum.mozilla-russia.org/viewto … 58#p781458

Отредактировано Vitaliy V. (23-11-2020 16:29:27)

Отсутствует

 

№929023-11-2020 16:44:52

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 83.0

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

Vitaliy V.

Vitaliy V. пишет

self._handleClick =()=> menuPopup.openPopup(this, "after_start");
на
self.setAttribute("type", "menu");

Высший класс!

Отсутствует

 

№929124-11-2020 17:33:33

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

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

Никак не соображу, как к этой кнопке прикрутить тултип (чтобы название "Save" при наведении на иконку показывало).
Vitaliy V.
Стоит tabs_focus.2020.9.15.xpi, [firefox] 83. Если на странице кликнуть, например, ПКМ, а потом увести мышку на другой таб, меню остаётся (может, так и раньше было, а я не замечал...).

Отсутствует

 

№929224-11-2020 20:39:41

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

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

xrun1
Как в других, по аналогии. Например:

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

Выделить код

Код:

try {CustomizableUI.createWidget({
	id: "ucf-cbbtn-Save",
	tooltiptext: "Сохранить страницу\n/ часть / выделенное",
	localized: false,

Отсутствует

 

№929325-11-2020 00:09:22

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

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

_zt
Затупил что-то.:/ Спасибо.

Отсутствует

 

№929425-11-2020 03:26:24

FirefoxCPU
Участник
 
Группа: Members
Зарегистрирован: 09-12-2017
Сообщений: 9
UA: Firefox 83.0

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

Здравствуйте. Подскажите пожалуйста как убрать ореол вокруг стрелок Назад-Вперед? Раньше не было, с последними обновами вроде добавили, напрягает и темами не убирается

скрытый текст
a890898595c3fbbce1b6811e8d3120b1-full.png

Отредактировано FirefoxCPU (25-11-2020 03:30:26)

Отсутствует

 

№929525-11-2020 08:55:21

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

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

Vitaliy V.
Заглянул в Tabs Focus 2020.9.15, и, мне кажется,
все вот эти перестановки .onMouse{In, Out, Clicked} не работают

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

Выделить код

Код:

var tabs_focus = {
    ...
    observe: function(subject, topic, pref) {
        var func_by_prefs = {
            ...
            "extensions.tabs_focus.previewmode": () => {
                var onMouseIn, onMouseOut, onMouseClicked;
                if (this.previewmode = this.Prefs.getBoolPref("previewmode")) {
                    onMouseIn = "__onMouseIn";
                    onMouseOut = "__onMouseOut";
                    onMouseClicked = "__onMouseClicked";
                } else {
                    onMouseIn = "_onMouseIn";
                    onMouseOut = "_onMouseOut";
                    onMouseClicked = "_onMouseClicked";
                }
                for (let [winInfo, obj] of objectMap) {
                    obj.onMouseIn = obj[onMouseIn];
                    obj.onMouseOut = obj[onMouseOut];
                    obj.onMouseClicked = obj[onMouseClicked];
                }
            },
            ...
        };
        ...
    },
    ...
};

Tabsfocus.prototype = {
    ...
    onMouseIn(e) {
        if (!tabs_focus.previewmode)
            this.onMouseIn = this._onMouseIn;
        else
            this.onMouseIn = this.__onMouseIn;
        this.onMouseIn(e);
    },
    ...
    onMouseOut() {
        if (!tabs_focus.previewmode)
            this.onMouseOut = this._onMouseOut;
        else
            this.onMouseOut = this.__onMouseOut;
        this.onMouseOut();
    },
    ...
    onMouseClicked(e) {
        if (!tabs_focus.previewmode)
            this.onMouseClicked = this._onMouseClicked;
        else
            this.onMouseClicked = this.__onMouseClicked;
        this.onMouseClicked(e);
    },
    ...
};


Вернее работают, но вхолостую, совершенно бесполезно.


Дело в том, что в Tabsfocus.prototype.load()
добавляет обработчики как функции, являющиеся
bind-производными от соответствующих методов прототипа.


А приведённые фрагменты кода просто переставляют
методы в Tabsfocus-экземплярах, что не оказывает никакого
воздействия на сами (уже) добавленные листенеры.


Более того, в таком виде, никакого воздействия
не было бы, даже если менять методы в самом прототипе.


Если так, вот попробовал, как вариант,
перерисовать чуть ближе к усмотренной концепции
(я не в смысле нахлобучки, а просто мысли вслух).

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

Выделить код

Код:

var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
var PREF_BRANCH = "extensions.tabs_focus.", objectMap = new Map(), contExt;
var tabs_focus = {
    delay: 150,
    returndelay: 50,
    previewmode: false,
    clickreloadtab: false,
    Prefs: null,
    init: function() {
        var branch = Services.prefs.getDefaultBranch(PREF_BRANCH);
        branch.setIntPref("delay", 150);
        branch.setBoolPref("previewmode", false);
        branch.setIntPref("returndelay", 50);
        branch.setBoolPref("clickreloadtab", false);
        var Prefs = this.Prefs = Services.prefs.getBranch(PREF_BRANCH);
        var delay = Prefs.getIntPref("delay");
        if (delay < 1)
            Prefs.setIntPref("delay", (delay = 150));
        this.delay = delay;
        var returndelay = Prefs.getIntPref("returndelay");
        if (returndelay < 1)
            Prefs.setIntPref("returndelay", (returndelay = 50));
        this.returndelay = returndelay;

        // ■■■■■■■■■■■■■■■■
        //this.previewmode = Prefs.getBoolPref("previewmode");
        this.observe(null, null, PREF_BRANCH + "previewmode");

        this.clickreloadtab = Prefs.getBoolPref("clickreloadtab");
        for (let win of contExt.windowManager.getAll())
            this.loadIntoWindow(win.window, win.id);
        Services.prefs.addObserver(PREF_BRANCH, this);
    },
    loadIntoWindow: function(win, winInfo) {
        var obj = new Tabsfocus();
        obj.load(win);
        objectMap.set(winInfo, obj);
    },
    unloadFromWindow: function(winInfo) {
        objectMap.get(winInfo).unload();
        objectMap.delete(winInfo);
    },
    // ■■■■■■■■■■■■■■■■
    mouseFunctions: {
        // functions for Tabsfocus.prototype if extensions.tabs_focus.previewmode = false
        false: {
            mouseover(e) {
                var tab = e.target.closest("tab.tabbrowser-tab:not([selected='true'])");
                if (!tab) return;
                this.callback.setTarget(tab);
                this.tid.initWithCallback(this.callback, tabs_focus.delay, this.tid.TYPE_ONE_SHOT);
            },
            mouseout() {
                this.tid.cancel();
                this.callback.setTarget(null);
            },
            click(e) {
                if (tabs_focus.clickreloadtab && e.detail == 1 && e.button == 0 && !this.callback.target && (e.composedTarget || e.originalTarget || e.target).matches("tab.tabbrowser-tab :not(toolbarbutton):not(image):scope, tab.tabbrowser-tab image.tab-icon-image:scope")) {
                    if (e.shiftKey)
                        this.win.BrowserReloadSkipCache();
                    else
                        this.win.BrowserReload();
                }
                this.tid.cancel();
                this.callback.setTarget(null);
            }
        },
        // functions for Tabsfocus.prototype if extensions.tabs_focus.previewmode = true
        true: {
            mouseover(e) {
                this.previewReturnTid.cancel();
                var tab = e.target.closest("tab.tabbrowser-tab:not([selected='true'])");
                if (!tab) return;
                this.callback.setTarget(tab);
                this.tid.initWithCallback(this.callback, tabs_focus.delay, this.tid.TYPE_ONE_SHOT);
            },
            mouseout() {
                this.tid.cancel();
                this.callback.setTarget(null);
                if (!this.previewBaseTab) return;
                this.previewReturnTid.cancel();
                this.previewCallback.setTarget(this.previewBaseTab);
                this.previewReturnTid.initWithCallback(this.previewCallback, tabs_focus.returndelay, this.previewReturnTid.TYPE_ONE_SHOT);
            },
            click(e) {
                this.previewReturnTid.cancel();
                this.previewCallback.setTarget(null);
                var tab = this.win.gBrowser.selectedTab;
                if (tabs_focus.clickreloadtab && e.detail == 1 && e.button == 0 && !this.callback.target && this.previewBaseTab == tab && (e.composedTarget || e.originalTarget || e.target).matches("tab.tabbrowser-tab :not(toolbarbutton):not(image):scope, tab.tabbrowser-tab image.tab-icon-image:scope")) {
                    if (e.shiftKey)
                        this.win.BrowserReloadSkipCache();
                    else
                        this.win.BrowserReload();
                }
                this.tid.cancel();
                this.callback.setTarget(null);
                this.previewBaseTab = tab;
            }
        }
    },
    observe: function(subject, topic, pref) {
        var func_by_prefs = {
            "extensions.tabs_focus.delay": () => {
                var delay = this.Prefs.getIntPref("delay");
                if (delay < 1)
                    //this.Prefs.setIntPref("delay", (delay = 150));
                    this.Prefs.setIntPref("delay", delay = 150);
                this.delay = delay;
            },
            "extensions.tabs_focus.returndelay": () => {
                var returndelay = this.Prefs.getIntPref("returndelay");
                if (returndelay < 1)
                    //this.Prefs.setIntPref("returndelay", (returndelay = 50));
                    this.Prefs.setIntPref("returndelay", returndelay = 50);
                this.returndelay = returndelay;
            },
            // ■■■■■■■■■■■■■■■■
            /*
            "extensions.tabs_focus.previewmode": () => {
                var onMouseIn, onMouseOut, onMouseClicked;
                if (this.previewmode = this.Prefs.getBoolPref("previewmode")) {
                    onMouseIn = "__onMouseIn";
                    onMouseOut = "__onMouseOut";
                    onMouseClicked = "__onMouseClicked";
                } else {
                    onMouseIn = "_onMouseIn";
                    onMouseOut = "_onMouseOut";
                    onMouseClicked = "_onMouseClicked";
                }
                for (let [winInfo, obj] of objectMap) {
                    obj.onMouseIn = obj[onMouseIn];
                    obj.onMouseOut = obj[onMouseOut];
                    obj.onMouseClicked = obj[onMouseClicked];
                }
            },
            */
            "extensions.tabs_focus.previewmode": () => Object.assign(
                Tabsfocus.prototype,
                this.mouseFunctions[this.Prefs.getBoolPref("previewmode", false)]
            ),

            "extensions.tabs_focus.clickreloadtab": () => {
                this.clickreloadtab = this.Prefs.getBoolPref("clickreloadtab");
            }
        };
        func_by_prefs[pref]?.();
    },
    GetPref: function(name) {
        var type = Services.prefs.getPrefType(name);
        switch (type) {
            case Services.prefs.PREF_BOOL:
                return Services.prefs.getBoolPref(name);
            case Services.prefs.PREF_INT:
                return Services.prefs.getIntPref(name);
            case Services.prefs.PREF_STRING:
                return Services.prefs.getStringPref(name);
        }
    },
    SetPref: function(name, value) {
        var type = Services.prefs.getPrefType(name);
        switch (type) {
            case Services.prefs.PREF_BOOL:
                Services.prefs.setBoolPref(name, value);
                break;
            case Services.prefs.PREF_INT:
                Services.prefs.setIntPref(name, value);
                break;
            case Services.prefs.PREF_STRING:
                Services.prefs.setStringPref(name, value);
                break;
        }
    },
    uninit: function() {
        Services.prefs.removeObserver(PREF_BRANCH, this);
        for (let win of contExt.windowManager.getAll())
            this.unloadFromWindow(win.id);
    }
};

function TabfocusCallback() {
    this.win = null;
    this.target = null;
}
TabfocusCallback.prototype = {
    setTarget(target) {
        this.target = target;
    },
    setWindow(win) {
        this.win = win;
    },
    notify() {
        var target = this.target;
        if (target != null) {
            this.win.gBrowser.selectedTab = target;
            this.target = null;
        }
    },
};

function Tabsfocus() {
    this.win = null;
    this.tid = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
    this.callback = new TabfocusCallback();
    this.previewBaseTab = null;
    this.previewCallback = new TabfocusCallback();
    this.previewReturnTid = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
}

// ■■■■■■■■■■■■■■■■
/*
Tabsfocus.prototype = {
    load(win) {
        this.win = win;
        this.callback.setWindow(win);
        this.previewCallback.setWindow(win);
        var gBrowser = win.gBrowser;
        this.previewBaseTab = gBrowser.selectedTab;
        this.onMouseIn_ = this.onMouseIn.bind(this);
        var slot = this.slot = gBrowser.tabs[0].flattenedTreeParentNode;
        slot.addEventListener("mouseover", this.onMouseIn_);
        this.onMouseOut_ = this.onMouseOut.bind(this);
        slot.addEventListener("mouseout", this.onMouseOut_);
        this.onMouseClicked_ = this.onMouseClicked.bind(this);
        slot.addEventListener("click", this.onMouseClicked_);
    },
    unload() {
        var slot = this.slot;
        slot.removeEventListener("mouseover", this.onMouseIn_);
        slot.removeEventListener("mouseout", this.onMouseOut_);
        slot.removeEventListener("click", this.onMouseClicked_);
    },
    onMouseIn(e) {
        Cu.reportError("onMouseIn_ORIGINAL\n" + this.onMouseIn);
        if (!tabs_focus.previewmode)
            this.onMouseIn = this._onMouseIn;
        else
            this.onMouseIn = this.__onMouseIn;
        this.onMouseIn(e);
    },
    _onMouseIn(e) {
        var tab = e.target.closest("tab.tabbrowser-tab:not([selected='true'])");
        if (!tab) return;
        this.callback.setTarget(tab);
        this.tid.initWithCallback(this.callback, tabs_focus.delay, this.tid.TYPE_ONE_SHOT);
    },
    __onMouseIn(e) {
        this.previewReturnTid.cancel();
        var tab = e.target.closest("tab.tabbrowser-tab:not([selected='true'])");
        if (!tab) return;
        this.callback.setTarget(tab);
        this.tid.initWithCallback(this.callback, tabs_focus.delay, this.tid.TYPE_ONE_SHOT);
    },
    onMouseOut() {
        if (!tabs_focus.previewmode)
            this.onMouseOut = this._onMouseOut;
        else
            this.onMouseOut = this.__onMouseOut;
        this.onMouseOut();
    },
    _onMouseOut() {
        this.tid.cancel();
        this.callback.setTarget(null);
    },
    __onMouseOut() {
        this.tid.cancel();
        this.callback.setTarget(null);
        if (!this.previewBaseTab) return;
        this.previewReturnTid.cancel();
        this.previewCallback.setTarget(this.previewBaseTab);
        this.previewReturnTid.initWithCallback(this.previewCallback, tabs_focus.returndelay, this.previewReturnTid.TYPE_ONE_SHOT);
    },
    onMouseClicked(e) {
        if (!tabs_focus.previewmode)
            this.onMouseClicked = this._onMouseClicked;
        else
            this.onMouseClicked = this.__onMouseClicked;
        this.onMouseClicked(e);
    },
    _onMouseClicked(e) {
        if (tabs_focus.clickreloadtab && e.detail == 1 && e.button == 0 && !this.callback.target && (e.composedTarget || e.originalTarget || e.target).matches("tab.tabbrowser-tab :not(toolbarbutton):not(image):scope, tab.tabbrowser-tab image.tab-icon-image:scope")) {
            if (!e.shiftKey)
                this.win.BrowserReload();
            else
                this.win.BrowserReloadSkipCache();
        }
        this.tid.cancel();
        this.callback.setTarget(null);
    },
    __onMouseClicked(e) {
        this.previewReturnTid.cancel();
        this.previewCallback.setTarget(null);
        var tab = this.win.gBrowser.selectedTab;
        if (tabs_focus.clickreloadtab && e.detail == 1 && e.button == 0 && !this.callback.target && this.previewBaseTab == tab && (e.composedTarget || e.originalTarget || e.target).matches("tab.tabbrowser-tab :not(toolbarbutton):not(image):scope, tab.tabbrowser-tab image.tab-icon-image:scope")) {
            if (!e.shiftKey)
                this.win.BrowserReload();
            else
                this.win.BrowserReloadSkipCache();
        }
        this.tid.cancel();
        this.callback.setTarget(null);
        this.previewBaseTab = tab;
    },
};
*/
Tabsfocus.prototype = {
    events: ["mouseover", "mouseout", "click"],
    load(win) {
        this.callback.setWindow(this.win = win);
        this.previewCallback.setWindow(win);
        this.previewBaseTab = win.gBrowser.selectedTab;
        var slot = this.slot = win.gBrowser.tabs[0].flattenedTreeParentNode;

        for(var type of this.events)
            slot.addEventListener(type, this);
    },
    unload() {
        for(var type of this.events)
            this.slot.removeEventListener(type, this);
    },
    handleEvent(e) {
        this[e.type](e);
    }
};

this.TabsFocus = class extends ExtensionAPI {
    onShutdown(reason) {
        if (reason != "APP_SHUTDOWN")
            tabs_focus.uninit();
    }
    getAPI(context) {
        contExt = context.extension;
        return {
            TabsFocus: {
                initExt() {
                    tabs_focus.init();
                },
                loadWin(winInfo) {
                    tabs_focus.loadIntoWindow(contExt.windowManager.get(winInfo).window, winInfo);
                },
                unloadWin(winInfo) {
                    tabs_focus.unloadFromWindow(winInfo);
                },
                getPref(arr) {
                    return arr.map(name => [name, tabs_focus.GetPref(name)]);
                },
                setPref(arr) {
                    arr.forEach(nv => {
                        tabs_focus.SetPref(nv[0], nv[1]);
                    });
                }
            }
        };
    }
};

Отредактировано Dumby (25-11-2020 08:58:45)

Отсутствует

 

№929625-11-2020 14:26:44

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 83.0

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

Vitaliy V.
Такое дело. Есть hbox (красным) и не могу его привязать к #BMB_unsortedBookmarksPopup
3yahqg3o.jpg
Заделал так hbox[part="innerbox"]  {margin-left: .......) Не косяк ли это?

Отсутствует

 

№929725-11-2020 15:37:52

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

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

xrun1 пишет

Если на странице кликнуть, например, ПКМ, а потом увести мышку на другой таб, меню остаётся (может, так и раньше было, а я не замечал...).

Да так было и раньше, но так же и с сочетанием клавиш Ctrl + PageDown|PageUp. А это чем то мешает или считаете неправильным?

Dumby пишет

все вот эти перестановки .onMouse{In, Out, Clicked} не работают

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

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

Выделить код

Код:

var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
var PREF_BRANCH = "extensions.tabs_focus.", objectMap = new Map(), contExt;
var tabs_focus = {
    delay: 150,
    returndelay: 50,
    previewmode: false,
    clickreloadtab: false,
    Prefs: null,
    init: function() {
        var branch = Services.prefs.getDefaultBranch(PREF_BRANCH);
        branch.setIntPref("delay", 150);
        branch.setBoolPref("previewmode", false);
        branch.setIntPref("returndelay", 50);
        branch.setBoolPref("clickreloadtab", false);
        var Prefs = this.Prefs = Services.prefs.getBranch(PREF_BRANCH);
        var delay = Prefs.getIntPref("delay");
        if (delay < 1)
            Prefs.setIntPref("delay", (delay = 150));
        this.delay = delay;
        var returndelay = Prefs.getIntPref("returndelay");
        if (returndelay < 1)
            Prefs.setIntPref("returndelay", (returndelay = 50));
        this.returndelay = returndelay;
        this.previewmode = Prefs.getBoolPref("previewmode");
        this.clickreloadtab = Prefs.getBoolPref("clickreloadtab");
        for (let win of contExt.windowManager.getAll())
            this.loadIntoWindow(win.window, win.id);
        Services.prefs.addObserver(PREF_BRANCH, this);
    },
    loadIntoWindow: function(win, winInfo) {
        var obj = new Tabsfocus();
        obj.load(win);
        objectMap.set(winInfo, obj);
    },
    unloadFromWindow: function(winInfo) {
        objectMap.get(winInfo).unload();
        objectMap.delete(winInfo);
    },
    observe: function(subject, topic, pref) {
        ({
            "extensions.tabs_focus.delay": () => {
                var delay = this.Prefs.getIntPref("delay");
                if (delay < 1)
                    this.Prefs.setIntPref("delay", (delay = 150));
                this.delay = delay;
            },
            "extensions.tabs_focus.returndelay": () => {
                var returndelay = this.Prefs.getIntPref("returndelay");
                if (returndelay < 1)
                    this.Prefs.setIntPref("returndelay", (returndelay = 50));
                this.returndelay = returndelay;
            },
            "extensions.tabs_focus.previewmode": () => {
                var onMouseIn, onMouseOut, onMouseClicked;
                if (this.previewmode = this.Prefs.getBoolPref("previewmode")) {
                    onMouseIn = "__onMouseIn";
                    onMouseOut = "__onMouseOut";
                    onMouseClicked = "__onMouseClicked";
                } else {
                    onMouseIn = "_onMouseIn";
                    onMouseOut = "_onMouseOut";
                    onMouseClicked = "_onMouseClicked";
                }
                for (let [winInfo, obj] of objectMap) {
                    obj.unload();
                    obj.onMouseIn = obj[onMouseIn];
                    obj.onMouseOut = obj[onMouseOut];
                    obj.onMouseClicked = obj[onMouseClicked];
                    obj.loadListeners();
                }
            },
            "extensions.tabs_focus.clickreloadtab": () => {
                this.clickreloadtab = this.Prefs.getBoolPref("clickreloadtab");
            }
        })[pref]?.();
    },
    GetPref: function(name) {
        var type = Services.prefs.getPrefType(name);
        switch (type) {
            case Services.prefs.PREF_BOOL:
                return Services.prefs.getBoolPref(name);
            case Services.prefs.PREF_INT:
                return Services.prefs.getIntPref(name);
            case Services.prefs.PREF_STRING:
                return Services.prefs.getStringPref(name);
        }
    },
    SetPref: function(name, value) {
        var type = Services.prefs.getPrefType(name);
        switch (type) {
            case Services.prefs.PREF_BOOL:
                Services.prefs.setBoolPref(name, value);
                break;
            case Services.prefs.PREF_INT:
                Services.prefs.setIntPref(name, value);
                break;
            case Services.prefs.PREF_STRING:
                Services.prefs.setStringPref(name, value);
                break;
        }
    },
    uninit: function() {
        Services.prefs.removeObserver(PREF_BRANCH, this);
        for (let win of contExt.windowManager.getAll())
            this.unloadFromWindow(win.id);
    }
};

function TabfocusCallback() {
    this.win = null;
    this.target = null;
}
TabfocusCallback.prototype = {
    setTarget(target) {
        this.target = target;
    },
    setWindow(win) {
        this.win = win;
    },
    notify() {
        var target = this.target;
        if (target != null) {
            this.win.gBrowser.selectedTab = target;
            this.target = null;
        }
    },
};

function Tabsfocus() {
    this.win = null;
    this.tid = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
    this.callback = new TabfocusCallback();
    this.previewBaseTab = null;
    this.previewCallback = new TabfocusCallback();
    this.previewReturnTid = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
}
Tabsfocus.prototype = {
    load(win) {
        this.win = win;
        this.callback.setWindow(win);
        this.previewCallback.setWindow(win);
        var gBrowser = win.gBrowser;
        this.previewBaseTab = gBrowser.selectedTab;
        if (!tabs_focus.previewmode) {
            this.onMouseIn = this._onMouseIn;
            this.onMouseOut = this._onMouseOut;
            this.onMouseClicked = this._onMouseClicked;
        } else {
            this.onMouseIn = this.__onMouseIn;
            this.onMouseOut = this.__onMouseOut;
            this.onMouseClicked = this.__onMouseClicked;
        }
        this.slot = gBrowser.tabs[0].flattenedTreeParentNode;
        this.loadListeners();
    },
    loadListeners() {
        var slot = this.slot;
        this.onMouseIn_ = this.onMouseIn.bind(this);
        slot.addEventListener("mouseover", this.onMouseIn_);
        this.onMouseOut_ = this.onMouseOut.bind(this);
        slot.addEventListener("mouseout", this.onMouseOut_);
        this.onMouseClicked_ = this.onMouseClicked.bind(this);
        slot.addEventListener("click", this.onMouseClicked_);
    },
    unload() {
        var slot = this.slot;
        slot.removeEventListener("mouseover", this.onMouseIn_);
        slot.removeEventListener("mouseout", this.onMouseOut_);
        slot.removeEventListener("click", this.onMouseClicked_);
    },
    _onMouseIn(e) {console.log("_onMouseIn\n" + this.onMouseIn);
        var tab = e.target.closest("tab.tabbrowser-tab:not([selected='true'])");
        if (!tab) return;
        this.callback.setTarget(tab);
        this.tid.initWithCallback(this.callback, tabs_focus.delay, this.tid.TYPE_ONE_SHOT);
    },
    __onMouseIn(e) {console.log("__onMouseIn\n" + this.onMouseIn);
        this.previewReturnTid.cancel();
        var tab = e.target.closest("tab.tabbrowser-tab:not([selected='true'])");
        if (!tab) return;
        this.callback.setTarget(tab);
        this.tid.initWithCallback(this.callback, tabs_focus.delay, this.tid.TYPE_ONE_SHOT);
    },
    _onMouseOut() {console.log("_onMouseOut\n" + this.onMouseOut);
        this.tid.cancel();
        this.callback.setTarget(null);
    },
    __onMouseOut() {console.log("__onMouseOut\n" + this.onMouseOut);
        this.tid.cancel();
        this.callback.setTarget(null);
        if (!this.previewBaseTab) return;
        this.previewReturnTid.cancel();
        this.previewCallback.setTarget(this.previewBaseTab);
        this.previewReturnTid.initWithCallback(this.previewCallback, tabs_focus.returndelay, this.previewReturnTid.TYPE_ONE_SHOT);
    },
    _onMouseClicked(e) {console.log("_onMouseClicked\n" + this.onMouseClicked);
        if (tabs_focus.clickreloadtab && e.detail == 1 && e.button == 0 && !this.callback.target && (e.composedTarget || e.originalTarget || e.target).matches("tab.tabbrowser-tab :not(toolbarbutton):not(image):scope, tab.tabbrowser-tab image.tab-icon-image:scope")) {
            if (!e.shiftKey)
                this.win.BrowserReload();
            else
                this.win.BrowserReloadSkipCache();
        }
        this.tid.cancel();
        this.callback.setTarget(null);
    },
    __onMouseClicked(e) {console.log("__onMouseClicked\n" + this.onMouseClicked);
        this.previewReturnTid.cancel();
        this.previewCallback.setTarget(null);
        var tab = this.win.gBrowser.selectedTab;
        if (tabs_focus.clickreloadtab && e.detail == 1 && e.button == 0 && !this.callback.target && this.previewBaseTab == tab && (e.composedTarget || e.originalTarget || e.target).matches("tab.tabbrowser-tab :not(toolbarbutton):not(image):scope, tab.tabbrowser-tab image.tab-icon-image:scope")) {
            if (!e.shiftKey)
                this.win.BrowserReload();
            else
                this.win.BrowserReloadSkipCache();
        }
        this.tid.cancel();
        this.callback.setTarget(null);
        this.previewBaseTab = tab;
    },
};

this.TabsFocus = class extends ExtensionAPI {
    onShutdown(reason) {
        if (reason != "APP_SHUTDOWN")
            tabs_focus.uninit();
    }
    getAPI(context) {
        contExt = context.extension;
        return {
            TabsFocus: {
                initExt() {
                    tabs_focus.init();
                },
                loadWin(winInfo) {
                    tabs_focus.loadIntoWindow(contExt.windowManager.get(winInfo).window, winInfo);
                },
                unloadWin(winInfo) {
                    tabs_focus.unloadFromWindow(winInfo);
                },
                getPref(arr) {
                    return arr.map(name => [name, tabs_focus.GetPref(name)]);
                },
                setPref(arr) {
                    arr.forEach(nv => {
                        tabs_focus.SetPref(nv[0], nv[1]);
                    });
                }
            }
        };
    }
};

solombala пишет

не могу его привязать к #BMB_unsortedBookmarksPopup

зачем именно к #BMB_unsortedBookmarksPopup привязывать если хочешь сдвинуть вправо то это должно же сработать и для других menu
или нет?
для [windows] например так

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

Выделить код

Код:

#BMB_bookmarksPopup menupopup[placespopup="true"] {
    padding-inline-start: 6px !important;
}

Отсутствует

 

№929825-11-2020 16:05:16

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

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

Vitaliy V. пишет

А это чем то мешает или считаете неправильным?

Не мешает. Просто раньше не замечал.:)

Отсутствует

 

№929925-11-2020 20:17:59

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

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

Vitaliy V. пишет

Что скажешь насчет этого, пока расширение не обновлял

Да, в этой концепции, теперь выглядит стройно.


Кстати, когда меняется настройка extensions.tabs_focus.previewmode
там же идёт перебор экземпляров, так вот, стоит ли, заодно, устанавливать previewBaseTab?
Как бы типа
obj.previewBaseTab = this.previewmode && obj.win.gBrowser.selectedTab;

Отсутствует

 

№930025-11-2020 20:52:30

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

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

Dumby пишет

стоит ли, заодно, устанавливать previewBaseTab?

Да не помешает, спасибо что глянул Tabs Focus

Хотел сказать ещё когда эту кнопку смотрел https://forum.mozilla-russia.org/viewto … 58#p781458
заметил что там опять [firefox] 84+ saveURI изменился поэтому сохранение в png не работает, надо бы добавить ещё один null аргумент

Отсутствует

 

Board footer

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