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

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

№107607-08-2023 18:04:46

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1734
UA: Firefox 115.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

stvol пишет

А где это надо менять?

https://forum.mozilla-russia.org/viewto … 67#p805867


Win7

Отсутствует

 

№107707-08-2023 19:56:28

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

fuchsfan пишет

@Dumby
Большая просьба исправить скрипт разделителей special_widgets.js, чтобы загружался вне ucf старым методом от Aris-t2 или Endor8.

Что значит «исправить»?
Исправить можно баг или поломку,
а «чтобы загружался …» — это не называется «исправить».


Вобщем, меняем первую и последнюю (не пустую) строку на такие
(async url => location != url || await delayedStartupPromise || ({
}).init("customizationready"))("chrome://browser/content/browser.xhtml");


И, вместо методов init() и destructor() один только init(), такой:

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

Выделить код

Код:

//
    init(type) {
        window.addEventListener(type, this);
        window.addEventListener("unload",
            () => window.removeEventListener(type, this)
        , {once: true});
    },


И про special_widget.css не забываем.

Отсутствует

 

№107807-08-2023 20:38:29

antialt
Участник
 
Группа: Members
Зарегистрирован: 18-01-2017
Сообщений: 9
UA: Firefox 116.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

antialt пишет

Подскажите, как вернуть к жизни Add Toolbar Buttons в FF 117 :)?

Спасибо за ответ Dumby в личке

Убираем из кода расширения строки,
где импортируется или определяется геттер модуля
(короче, где есть этот адрес)
"resource://gre/modules/Services.jsm"

фикс для ff 117+
https://www.upload.ee/files/15546719/add_toolbar_buttons_vitaliy.ru_Dumby_fix117_.xpi.html

Отсутствует

 

№107908-08-2023 09:59:51

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby пишет

Вобщем, меняем первую и последнюю (не пустую) строку на такие

В навбаре все нормально, а в вертикальном аддонбаре https://github.com/Aris-t2/CustomJSforF … ical.uc.js линии-разделители видны, а промежутки не видны.

Отсутствует

 

№108008-08-2023 11:58:33

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

fuchsfan
Скрипт не отвечает за то, где и как видны «промежутки».
Только за их наличие там, откуда их можно на тулбар вытаскивать.


Чтобы «промежутки» было видно на этом вертикальном аддонбаре,
это надо куда-нибудь в стили пристроить что-то типа


toolbar#addonbar_v > toolbarspacer {
    width: auto !important;
    height: 15px !important;
}

Отсутствует

 

№108108-08-2023 15:19:30

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby пишет

Чтобы «промежутки» было видно на этом вертикальном аддонбаре,
это надо куда-нибудь в стили пристроить что-то типа

Пристроил, наконец-то все пошло, благодарю.

Добавлено 08-08-2023 15:43:30
@Dumby
Если отцентрируете положение подписей под элементами, будет отлично, или обойдемся так, спасибо.
text.png

Отредактировано fuchsfan (08-08-2023 15:43:30)

Отсутствует

 

№108208-08-2023 16:44:38

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1734
UA: Firefox 115.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

fuchsfan пишет

Если отцентрируете положение подписей под элементами, будет отлично

https://forum.mozilla-russia.org/viewto … 66#p806366


Win7

Отсутствует

 

№108308-08-2023 18:42:35

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

kokoss пишет

https://forum.mozilla-russia.org/viewto … 66#p806366

Сработало, все как надо, благодарю за помощь. Вопрос закрыт.

Отсутствует

 

№108409-08-2023 16:00:14

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Обновил ucf_hookClicks.js - изменений много, вот некоторые:


1) проще редактировать свои сочетания клавиш, добавлены клики мыши на вкладках: Закрыть все слева/справа.
2) режим работы Простой/Эксперт не требует перезапуска браузера – подсказки кнопок и действия клавиш/мыши меняются в зависимости от режима, который переключается в диалоге настроек UCF или кликом колёсика на кнопке "Печать" или строке меню.

Отсутствует

 

№108524-08-2023 17:22:34

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Verevkin пишет

У меня нету таких вхождений в config.js, поделись, плиз, готовым файлом, я протестирую.

У меня он такой

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

Выделить код

Код:

//config.js для user_chrome_files (UCF) 
(async () => {
    var sandbox = Cu.Sandbox(Cc["@mozilla.org/systemprincipal;1"].createInstance(Ci.nsIPrincipal), {
        wantComponents: true,
        sandboxName: "UserChromeFiles",
        wantGlobalProperties: ["ChromeUtils"],
    });
    Cu.evalInSandbox(`
        var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
        var user_chrome_files_sandbox = {
            init() {
                Services.obs.addObserver(this, "domwindowopened");
                Services.obs.addObserver(this, "profile-after-change");
            },
            observe(aWindow, aTopic, aData) {
                Services.obs.removeObserver(this, "profile-after-change");
                this.observe = (window, topic, data) => {
                    if (!(window instanceof Ci.nsIDOMChromeWindow)) return;
                    var docElementInserted = e => {
                        var win = e.target.defaultView;
                        if (win instanceof Ci.nsIDOMChromeWindow)
                            user_chrome.initWindow(win);
                    };
                    window.windowRoot.addEventListener("DOMDocElementInserted", docElementInserted, true);
                    window.addEventListener("load", e => {
                        window.addEventListener("unload", e => {
                            window.windowRoot.removeEventListener("DOMDocElementInserted", docElementInserted, true);
                        }, { once: true });
                    }, { once: true });
                };
                var file = Services.dirsvc.get("UChrm", Ci.nsIFile);
                file.append("user_chrome_files");
                file.append("user_chrome.manifest");
                if (!file.exists() || !file.isFile()) {
                    this.removeObs();
                    return;
                }
                try {
                    Components.manager.QueryInterface(Ci.nsIComponentRegistrar)
                    .autoRegister(file);

                    Services.scriptloader.loadSubScript("chrome://user_chrome_files/content/user_chrome.js", globalThis, "UTF-8");
                } catch(ex) {
                    this.removeObs();
                    return;
                }
                if (aTopic === "domwindowopened")
                    this.observe(aWindow, aTopic, aData);
            },
            removeObs() {
                Services.obs.removeObserver(this, "domwindowopened");
            },
        };
        user_chrome_files_sandbox.init();
    `, sandbox);
})();

Отсутствует

 

№108624-08-2023 17:57:27

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

fuchsfan
Обсуждали уже, что такой файл в 116 и 117 не работает без правок.
https://forum.mozilla-russia.org/viewto … 66#p805866
https://forum.mozilla-russia.org/viewto … 24#p806324
У Verevkin, похоже, ещё старый UCF (до "версия, дата г-м-д: 2021-9-23").

Отредактировано xrun1 (24-08-2023 17:58:29)

Отсутствует

 

№108724-08-2023 18:52:39

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

xrun1 пишет

Обсуждали уже, что такой файл в 116 и 117 не работает без правок.

То был файл из v115. А вот этот из v116, с ним у меня работает ucf с панелью, а какой он свжести фиг его знает.

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

Выделить код

Код:

// config.js для user_chrome_files (UCF) (код уже исправлен для работы в v117 - ниже закомментирована строка #9 импорта модуля Services.jsm, ее можно всю удалить) 
(async () => {
    var sandbox = Cu.Sandbox(Cc["@mozilla.org/systemprincipal;1"].createInstance(Ci.nsIPrincipal), {
        wantComponents: true,
        sandboxName: "UserChromeFiles",
        wantGlobalProperties: ["ChromeUtils"],
    });
    Cu.evalInSandbox(`
//        var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
        var user_chrome_files_sandbox = {
            init() {
                Services.obs.addObserver(this, "domwindowopened");
                Services.obs.addObserver(this, "profile-after-change");
            },
            observe(aWindow, aTopic, aData) {
                Services.obs.removeObserver(this, "profile-after-change");
                this.observe = (window, topic, data) => {
                    if (!(window .isChromeWindow)) return;
                    var docElementInserted = e => {
                        var win = e.target.defaultView;
                        if (win .isChromeWindow)
                            user_chrome.initWindow(win);
                    };
                    window.windowRoot.addEventListener("DOMDocElementInserted", docElementInserted, true);
                    window.addEventListener("load", e => {
                        window.addEventListener("unload", e => {
                            window.windowRoot.removeEventListener("DOMDocElementInserted", docElementInserted, true);
                        }, { once: true });
                    }, { once: true });
                };
                var file = Services.dirsvc.get("UChrm", Ci.nsIFile);
                file.append("user_chrome_files");
                file.append("user_chrome.manifest");
                if (!file.exists() || !file.isFile()) {
                    this.removeObs();
                    return;
                }
                try {
                    Components.manager.QueryInterface(Ci.nsIComponentRegistrar)
                    .autoRegister(file);

                    Services.scriptloader.loadSubScript("chrome://user_chrome_files/content/user_chrome.js", globalThis, "UTF-8");
                } catch(ex) {
                    this.removeObs();
                    return;
                }
                if (aTopic === "domwindowopened")
                    this.observe(aWindow, aTopic, aData);
            },
            removeObs() {
                Services.obs.removeObserver(this, "domwindowopened");
            },
        };
        user_chrome_files_sandbox.init();
    `, sandbox);
})();

Отсутствует

 

№108824-08-2023 19:43:05

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1734
UA: Firefox 115.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

fuchsfan пишет

а какой он свжести фиг его знает.

Версию можно узнать в user_chrome_files/текстовый файл -> version


Win7

Отсутствует

 

№108925-08-2023 10:37:37

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

fuchsfan
Этот правильный. :)

Отсутствует

 

№109025-08-2023 12:20:50

Verevkin
Участник
 
Группа: Members
Откуда: Россия, Замкадье
Зарегистрирован: 01-02-2019
Сообщений: 21
UA: Firefox 116.0
Веб-сайт

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Спасибо, мужики. Буду пробовать, о результатах сообщу.
Взамен вот вам набор, который у меня проработал вплоть до 116.0.3 включительно. Вдруг кому интересно.
https://disk.yandex.ru/d/k6hlE4juVVCTiA


Хей-хей-хей! Только не ходите в мой сарай, лады?..

Отсутствует

 

№109125-08-2023 18:37:27

Verevkin
Участник
 
Группа: Members
Откуда: Россия, Замкадье
Зарегистрирован: 01-02-2019
Сообщений: 21
UA: Firefox 117.0
Веб-сайт

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

fuchsfan пишет

xrun1 пишетОбсуждали уже, что такой файл в 116 и 117 не работает без правок.То был файл из v115. А вот этот из v116, с ним у меня работает ucf с панелью, а какой он свжести фиг его знает.скрытый текстВыделить кодКод:// config.js для user_chrome_files (UCF) (код уже исправлен для работы в v117 - ниже закомментирована строка #9 импорта модуля Services.jsm, ее можно всю удалить)
(async () => {
    var sandbox = Cu.Sandbox(Cc["@mozilla.org/systemprincipal;1"].createInstance(Ci.nsIPrincipal), {
        wantComponents: true,
        sandboxName: "UserChromeFiles",
        wantGlobalProperties: ["ChromeUtils"],
    });
    Cu.evalInSandbox(`
//        var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
        var user_chrome_files_sandbox = {
            init() {
                Services.obs.addObserver(this, "domwindowopened");
                Services.obs.addObserver(this, "profile-after-change");
            },
            observe(aWindow, aTopic, aData) {
                Services.obs.removeObserver(this, "profile-after-change");
                this.observe = (window, topic, data) => {
                    if (!(window .isChromeWindow)) return;
                    var docElementInserted = e => {
                        var win = e.target.defaultView;
                        if (win .isChromeWindow)
                            user_chrome.initWindow(win);
                    };
                    window.windowRoot.addEventListener("DOMDocElementInserted", docElementInserted, true);
                    window.addEventListener("load", e => {
                        window.addEventListener("unload", e => {
                            window.windowRoot.removeEventListener("DOMDocElementInserted", docElementInserted, true);
                        }, { once: true });
                    }, { once: true });
                };
                var file = Services.dirsvc.get("UChrm", Ci.nsIFile);
                file.append("user_chrome_files");
                file.append("user_chrome.manifest");
                if (!file.exists() || !file.isFile()) {
                    this.removeObs();
                    return;
                }
                try {
                    Components.manager.QueryInterface(Ci.nsIComponentRegistrar)
                    .autoRegister(file);

                    Services.scriptloader.loadSubScript("chrome://user_chrome_files/content/user_chrome.js", globalThis, "UTF-8");
                } catch(ex) {
                    this.removeObs();
                    return;
                }
                if (aTopic === "domwindowopened")
                    this.observe(aWindow, aTopic, aData);
            },
            removeObs() {
                Services.obs.removeObserver(this, "domwindowopened");
            },
        };
        user_chrome_files_sandbox.init();
    `, sandbox);
})();

Спасибо, вроде работает.
Но есть 1 нюанс: панель СВЕРХУ. Как её переместить вниз?
002760.png


Хей-хей-хей! Только не ходите в мой сарай, лады?..

Отсутствует

 

№109225-08-2023 19:24:32

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1734
UA: Firefox 115.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Verevkin пишет

Но есть 1 нюанс: панель СВЕРХУ. Как её переместить вниз?

Зачем перемещать дополнительную панель вниз, если можно использовать нижнюю панель!
Add, и заверните цитируемый текст в тег -> Quote, а код под -> Spoiler

Отредактировано kokoss (25-08-2023 19:28:54)


Win7

Отсутствует

 

№109325-08-2023 19:47:15

Verevkin
Участник
 
Группа: Members
Откуда: Россия, Замкадье
Зарегистрирован: 01-02-2019
Сообщений: 21
UA: Firefox 116.0
Веб-сайт

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

kokoss пишет

Зачем перемещать дополнительную панель вниз, если можно использовать нижнюю панель!

А как её создать?

002762.png

Отредактировано Verevkin (25-08-2023 19:47:49)


Хей-хей-хей! Только не ходите в мой сарай, лады?..

Отсутствует

 

№109425-08-2023 21:40:04

Verevkin
Участник
 
Группа: Members
Откуда: Россия, Замкадье
Зарегистрирован: 01-02-2019
Сообщений: 21
UA: Firefox 117.0
Веб-сайт

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

kokoss пишет

Зачем перемещать дополнительную панель вниз, если можно использовать нижнюю панель!

Обнаружил кнопку вызова окна настройки, но рано обрадовался: чекбоксы включаются, но перезапуск не срабатывает.
ЧЯДНТ?

2023-08-25-21-35.png

Как вручную подправить конфиг, чтобы тупо появилась нижняя панель? Кроме неё мне ничего не надо.

Отредактировано Verevkin (25-08-2023 22:30:27)


Хей-хей-хей! Только не ходите в мой сарай, лады?..

Отсутствует

 

№109525-08-2023 22:44:34

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1734
UA: Firefox 115.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Verevkin пишет

А как её создать?

Её не надо создавать, её необходимо включить в настройках UCF + перезапустить браузер...

Обнаружил кнопку вызова окна настройки, но рано обрадовался: чекбоксы включаются, но перезапуск не срабатывает.
ЧЯДНТ?

Может потому что используйте актуальный код в старом комплекте UCF


Win7

Отсутствует

 

№109626-08-2023 01:17:20

vassemm
Участник
 
Группа: Members
Зарегистрирован: 11-02-2019
Сообщений: 23
UA: Firefox 116.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Господа!

Прошу помощи в возвращении к жизни UCF в 117 версии.

В 116 все работает норм.(после изменений которые были вот в этом посте https://forum.mozilla-russia.org/viewto … 69#p805869)

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

Пробовал комментировать
//        var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
как сказано выше, но результата не принесло.

==================================================
РЕШЕНО!
Путем удаления этих строк во всех файлах UCF

Отредактировано vassemm (26-08-2023 15:18:57)

Отсутствует

 

№109726-08-2023 09:09:14

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

vassemm пишет

В 117 окно настроек открывается с пустыми настройками, крыжики ставятся, но перезагрузка не работает и состояние не запоминает.

В настройках UCF внизу "Включить стили:", кажется, все птички должны стоять. Пробуйте закрыть браузер и руками удалить все из папки startupCache.

Добавлено 26-08-2023 09:11:57
UCF сильная вещь, но как уважаемый Dumby перестанет ее поддерживать, так и кранты?

Добавлено 26-08-2023 09:17:07

Verevkin пишет

Но есть 1 нюанс: панель СВЕРХУ. Как её переместить вниз?

Просто к сведению, у Aris-t2 есть горизонтальные панели, верхняя и нижняя, нижняя это https://github.com/Aris-t2/CustomJSforF … nbar.uc.js Подключается легко, работает.

Отредактировано fuchsfan (26-08-2023 09:32:52)

Отсутствует

 

№109826-08-2023 09:34:10

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

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

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

Выделить код

Код:

data:image/png;base64,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/W1QsGOW86RUrmPrwltvH93pe8JVTQk0VsXz5z/ba62efJLZeOqpdvrq4ouzdg5UNtBYOlga65577rE+3H777dBYNKlorPu+//2bb7rp3/79N6M/OnrI4EHDhg4ebomswYOKRfLG7t1nfvyMhx5++LavfMXf39dYturoaOxZP26J/zLxQM2wmsN/37j/wdcl3gdb3ng6zDfiWLet2K8oJmKVtTOkdcKl6xjkHHONWP9671umXpgeLsVQY02aNKlQKOzbt+/dd9/92Mc+9tZbb+3YsWP48OEXXHBBwfmBeldXV0hjOcqEFj8CjfXRZ257gDgSx1Y4r09hFJW7j62HhBrLOval8x11xFj29rCNOd9xR5Us3/PiBbf7Aspy4fyXJJ7sXlUqJrAQqpoSaKzKZt06cv315I9/ZDZed529AOuDH8zaOVDxmI4Pb7399on977XiX/va13yNNX369E9S81TJYl3RoLE8jbXxhU2nnnqKpa6GDxtiYYXG0lh7/3vviJNOeuTRR+fMnu3vH6zHCuefbJo6e6oX8ZrD0yjElyo6GiswIp+VZEoPZ9GcfFWV3GA4nUb45Ba3KagjvaW0YySWxrrsssus8G7ZssWSWVbnfuWVV/bv319VVTVy5EgvWCGNtXtV6xvnX/BiJyV9uByVl0+idc/rU24f3Rns46gYwhxlp5hGlbQXba2UjfIK4mQZkWTR7C+clNStlKusJ4GUKh0lqJoSaKxK5ehRcvfdxBrZqZWIZNgwe8H7rbdm7RzoI2B80OGrX/3qokWLrA933HEH1rzTpKKxfvL445/59Kffeff9IYMHjzjpw5bAGjx4sCUCDh48eOjQoffee+/Xv/nNF//6r/39qblCh3AWR5TXcURWJ5lSygb5qokWW/xcoZ7GovNJlk6jFR6XlOIMdjZ2TClltjjN5+58x7YqzklZuSZ5rMsvv9wK74EDB1566SXiKP2hQ4deeOGF7mcS1lhTXn/ojcktn/wPRuuEVY5QY6m3+EeF81s+SWksNtPmHSWsmhKMoRXJ739vP7393/+d2XjeeaSjg4wbl7VzoO+A8UGH5cuXX3HFFdaHH/7whzfffPOECROy9simz2os60q/97//+4LzL3ht164RI0764IknDho06OjRo5bAsq79z2/cOOKkk86nHgPIa6zwxJtQczgSipTSPa4cYiYNfTvh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

Отсутствует

 

№109926-08-2023 10:30:47

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1734
UA: Firefox 115.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

UCF для FF 115-116 с правками от Dumby


Win7

Отсутствует

 

№110026-08-2023 11:49:25

egorsemenov06
Участник
 
Группа: Members
Зарегистрирован: 12-06-2018
Сообщений: 410
UA: Firefox 116.0

Re: UCF - ваши кнопки, темы, дополнения, скрипты…

Dumby Посмотрите кнопку toggleRestartlessAddons она не работает после удаления в ней Components.utils.import("resource://gre/modules/Services.jsm");

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

Выделить код

Код:

// http://infocatcher.ucoz.net/js/cb/toggleRestartlessAddons.js
// https://forum.mozilla-russia.org/viewtopic.php?id=57948
// https://github.com/Infocatcher/Custom_Buttons/tree/master/Toggle_Restartless_Add-ons

// Toggle Restartless Add-ons button for Custom Buttons
// (code for "initialization" section)
// Also the code can be used from main window context (as Mouse Gestures code, for example)

// Also you can check for add-ons updates using right-click:
// copy all code from
// https://github.com/Infocatcher/Custom_Buttons/blob/master/Check_for_Addons_Updates/checkForAddonsUpdates.js
// after "//== Check for Addons Updates begin"

// See "var style = " to modify styles for specific add-ons

// (c) Infocatcher 2013-2019
// version 0.1.3pre4 - 2020-01-01

var options = {
	addonTypes: ["extension", "plugin"],
	// Possible values: "extension", "plugin"
	// From extensions: "userstyle" (Stylish), "greasemonkey-user-script" (Greasemonkey), "userscript" (Scriptish)
	// (swap to reorder in the menu)
	showVersions: 0,
	// 0 - don't show versions
	// 1 - show after name: "Addon Name 1.2"
	// 2 - show as "acceltext" (in place for hotkey text)
	showHidden: 0,
	// 0  - don't show hidden add-ons
	// -1 - show only enabled hidden add-ons (e.g. to track new items)
	// 1  - show all hidden add-ons
	sort: {
		enabled:     0,
		clickToPlay: 0,
		disabled:    1
		// Sort order:
		// 0, 0, 0 - sort add-ons of each type alphabetically
		// 0, 0, 1 - show enabled add-ons (of each type) first
		// 0, 1, 2 - enabled add-ons, then click-to-play and then disabled
	},
	closeMenu: false, // Close menu after left-click
	closeMenuClickToPlay: false // Close menu after left-click, for click to play plugins
	// Use Shift+click to invert closeMenu* behavior
};

var xulns = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

var mp = document.createElementNS(xulns, "menupopup");
mp.setAttribute("onpopupshowing", "this.updateMenu();");
mp.setAttribute("oncommand", "if(!event.button) this.handleEvent(event);"); // Ignore middle-click in Firefox 89+
mp.setAttribute("onmousedown", "if(event.button == 0) this.handleEvent(event);");
mp.setAttribute("onclick", "if(event.button > 0) this.handleEvent(event);");
mp.setAttribute("oncontextmenu", "return false;");
mp.setAttribute("onpopuphidden", "this.destroyMenu();");

var tb = this.parentNode;
if(tb && tb.getAttribute("orient") == "vertical") {
	// https://addons.mozilla.org/firefox/addon/vertical-toolbar/
	var isRight = tb.parentNode.getAttribute("placement") == "right";
	mp.setAttribute("position", isRight ? "start_before" : "end_before");
}

var cleanupTimer = 0;
mp.updateMenu = function() {
	clearTimeout(cleanupTimer);
	addStyle();
	getRestartlessAddons(options.addonTypes, function(addons) {
		var df = document.createDocumentFragment();
		var prevType;
		function sortPosition(addon) {
			if("STATE_ASK_TO_ACTIVATE" in AddonManager && addon.userDisabled == AddonManager.STATE_ASK_TO_ACTIVATE)
				return options.sort.clickToPlay;
			if(addon.isActive)
				return options.sort.enabled;
			return options.sort.disabled;
		}
		function key(addon) {
			return options.addonTypes.indexOf(addon.type)
				+ "\n" + sortPosition(addon)
				+ "\n" + addon.name.toLowerCase();
		}
		addons.sort(function(a, b) {
			var ka = key(a);
			var kb = key(b);
			return ka == kb ? 0 : ka < kb ? -1 : 1;
		}).forEach(function(addon) {
			var type = addon.type;
			if(prevType && type != prevType)
				df.appendChild(document.createElementNS(xulns, "menuseparator"));
			prevType = type;
			var icon = addon.iconURL || addon.icon64URL;
			var mi = document.createElementNS(xulns, "menuitem");
			mi.className = "menuitem-iconic";
			var label = addon.name;
			if(options.showVersions == 1)
				label += " " + addon.version;
			else if(options.showVersions == 2)
				mi.setAttribute("acceltext", addon.version);
			mi.setAttribute("label", label);
			mi.setAttribute("image", icon || mp.icons[type] || "");
			if(!icon && mp.icons.useSVG)
				mi.style.fill = "#15c";
			var tip = addon.description || "";
			var delay = "delayedStartupAddons" in Services
				&& Services.delayedStartupAddons[addon.id] || null;
			var isDelayed = delay !== null;
			mi.classList.toggle("toggleRestartlessAddons-isDelayed", isDelayed);
			if(isDelayed)
				tip = "[Delayed Startup: " + delay.toLocaleString() + "]" + (tip ? "\n" + tip : "");
			tip && mi.setAttribute("tooltiptext", tip);
			mi.classList.toggle("toggleRestartlessAddons-isHidden", addon.hidden || false);
			setDisabled(mi, addon.userDisabled);
			mi._cbAddon = addon;
			df.appendChild(mi);
		});
		mp.textContent = "";
		mp.appendChild(df);
	});
};
mp.handleEvent = function(e) {
	var mi = e.target;
	if(!("_cbAddon" in mi))
		return;
	var addon = mi._cbAddon;
	if(e.type == "mousedown") {
		var closeMenu = isAskToActivateAddon(addon)
			? options.closeMenuClickToPlay
			: options.closeMenu;
		if(e.shiftKey)
			closeMenu = !closeMenu;
		mi.setAttribute("closemenu", closeMenu ? "auto" : "none");
		return;
	}
	var hasMdf = hasModifier(e);
	if(e.type == "command" && (!hasMdf || e.shiftKey)) {
		let newDis = setNewDisabled(addon);
		setDisabled(mi, newDis);
	}
	else if(e.type == "command" && hasMdf || e.type == "click" && e.button == 1) {
		openAddonPage(addon);
		closeMenus(mi);
	}
	else if(e.type == "click" && e.button == 2) {
		if(openAddonOptions(addon))
			closeMenus(mi);
	}
};
mp.destroyMenu = function() {
	removeStyle();
	clearTimeout(cleanupTimer);
	cleanupTimer = setTimeout(function() {
		mp.textContent = "";
	}, 5000);
};
mp.icons = {
	get platformVersion() {
		delete this.platformVersion;
		return this.platformVersion = parseFloat(Services.appinfo.platformVersion);
	},
	get useSVG() {
		delete this.useSVG;
		return this.useSVG = Services.appinfo.name == "Firefox" && this.platformVersion >= 57;
	},
	get plugin() {
		delete this.plugin;
		return this.plugin = this.useSVG
			? this.platformVersion >= 65
				? "chrome://global/skin/plugins/pluginGeneric.svg"
				: "chrome://mozapps/skin/plugins/pluginGeneric.svg"
			: "chrome://mozapps/skin/plugins/pluginGeneric-16.png";
	},
	get extension() {
		delete this.extension;
		return this.extension = this.useSVG
			? this.platformVersion >= 76
				? "chrome://mozapps/skin/extensions/extensionGeneric.svg" // Or chrome://mozapps/skin/extensions/extension.svg
				: "chrome://mozapps/skin/extensions/extensionGeneric-16.svg"
			: "chrome://mozapps/skin/extensions/extensionGeneric-16.png";
	}
};
function isAskToActivateAddon(addon) {
	return addon.type == "plugin"
		&& "STATE_ASK_TO_ACTIVATE" in AddonManager
		&& Services.prefs.getBoolPref("plugins.click_to_play", true);
}
function setNewDisabled(addon) {
	var newDis = getNewDisabled(addon);
	var oldDis = addon.userDisabled;
	try {
		addon.userDisabled = newDis;
	}
	catch(e) { // Error: Cannot disable hidden add-on firefox@getpocket.com
		_log("Can't set addon.userDisabled to " + newDis + ", error:\n" + e);
		if(addon.hidden)
			setNewDisabledRaw(addon, newDis);
	}
	var realDis = addon.userDisabled;
	if(realDis != newDis && addon.type == "extension") { // Firefox 62+? Weird things happens
		setNewDisabledRaw(addon, newDis);
		realDis = addon.userDisabled;
	}
	if(realDis != newDis) { // We can't enable vulnerable plugins
		let err = "Can't set addon.userDisabled to " + newDis + ", real value: " + realDis;
		if(newDis) {
			_log(err + "\nSTATE_ASK_TO_ACTIVATE not supported?");
			newDis = false;
		}
		else {
			_log(err + "\nVulnerable plugin?");
			if(oldDis == AddonManager.STATE_ASK_TO_ACTIVATE)
				newDis = true;
			else
				newDis = AddonManager.STATE_ASK_TO_ACTIVATE;
		}
		addon.userDisabled = newDis;
	}
	ensureSpecialDisabled(addon, newDis);
	return addon.userDisabled;
}
function getNewDisabled(addon) {
	// disabled -> STATE_ASK_TO_ACTIVATE -> enabled -> ...
	var curDis = addon.userDisabled;
	var newDis;
	if("STATE_ASK_TO_ACTIVATE" in AddonManager && curDis == AddonManager.STATE_ASK_TO_ACTIVATE)
		newDis = false;
	else if(!curDis)
		newDis = true;
	else {
		if(isAskToActivateAddon(addon))
			newDis = AddonManager.STATE_ASK_TO_ACTIVATE;
		else
			newDis = false;
	}
	return newDis;
}
function setNewDisabledRaw(addon, newDis) {
	_log("Let's try set addon.userDisabled using raw hack");
	let g = Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm", {});
	if("lazy" in g) g = g.lazy;
	if("XPIDatabase" in g && "updateAddonDisabledState" in g.XPIDatabase) { // Firefox 61+
		let rawAddon = g.XPIDatabase.getAddons().find(function(rawAddon) {
			return rawAddon.id == addon.id;
		});
		g.XPIDatabase.updateAddonDisabledState(
			rawAddon,
			g.XPIDatabase.updateAddonDisabledState.length == 1 // Firefox 74+
				? { userDisabled: newDis }
				: newDis
		);
	}
	else if("eval" in g) { // See "set userDisabled(val)"
		let addonFor = g.eval("addonFor");
		let rawAddon = addonFor(addon);
		//rawAddon.userDisabled = newDis;
		g.XPIProvider.updateAddonDisabledState(rawAddon, newDis);
	}
	else { // Firefox 57+? See https://forum.mozilla-russia.org/viewtopic.php?pid=745272#p745272
		updateAddonDisabledState(addon, newDis);
	}
}
function updateAddonDisabledState(addon, newDis) {
	var nsvo = Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm", {});
	var key = "_cbToggleRestartlessAddonsData";
	var url = URL.createObjectURL(new Blob([
		"XPIProvider.updateAddonDisabledState(addonFor(this." + key + "[0]), this." + key + "[1]); delete this." + key + ";"
	]));
	addDestructor(function() {
		URL.revokeObjectURL(url);
	});
	(updateAddonDisabledState = function(addon, newDis) {
		nsvo[key] = [addon, newDis];
		Services.scriptloader.loadSubScript(url, nsvo);
	})(addon, newDis);
}
function setDisabled(mi, disabled) {
	var askToActivate = "STATE_ASK_TO_ACTIVATE" in AddonManager && disabled == AddonManager.STATE_ASK_TO_ACTIVATE;
	var cl = mi.classList;
	cl.toggle("toggleRestartlessAddons-askToActivate", askToActivate);
	cl.toggle("toggleRestartlessAddons-disabled", disabled && !askToActivate);
}
function ensureSpecialDisabled(addon, newDis) {
	if(addon.id == "screenshots@mozilla.org")
		Services.prefs.setBoolPref("extensions.screenshots.disabled", newDis);
}

if(
	this instanceof XULElement // Custom Buttons
	&& typeof event == "object"
	&& !("type" in event) && typeof _phase == "string" && _phase == "init" // Initialization
) {
	this.type = "menu";
	this.orient = "horizontal";
	this.appendChild(mp);

	this.onmouseover = function(e) {
		if(e.target != this)
			return;
		Array.prototype.some.call(
			this.parentNode.getElementsByTagName("*"),
			function(node) {
				if(
					node != this
					&& node.namespaceURI == xulns
					// See https://github.com/Infocatcher/Custom_Buttons/issues/28
					//&& node.boxObject
					//&& node.boxObject instanceof Components.interfaces.nsIMenuBoxObject
					&& "open" in node
					&& node.open
					&& node.getElementsByTagName("menupopup").length
				) {
					node.open = false;
					this.open = true;
					return true;
				}
				return false;
			},
			this
		);
	};
	this.onmousedown = function(e) {
		if(e.target == this && e.button == 0 && hasModifier(e))
			e.preventDefault();
	};
	this.oncontextmenu = function(e) {
		if(e.target == this && !hasModifier(e) && hasUpdater())
			e.preventDefault();
	};
	this.onclick = function(e) {
		if(e.target != this)
			return;
		if(e.button == 0 && hasModifier(e) || e.button == 1)
			openAddonsManager();
		else if(e.button == 2 && !hasModifier(e) && hasUpdater())
			checkForAddonsUpdates.call(this);
	};
}
else { // Mouse gestures or something other...
	let e;
	if(typeof event == "object" && event instanceof Event && "screenX" in event) // FireGestures
		e = event;
	else if(
		this instanceof Components.interfaces.nsIDOMChromeWindow
		&& "mgGestureState" in window && "endEvent" in mgGestureState // Mouse Gestures Redox
	)
		e = mgGestureState.endEvent;
	else {
		let anchor = this instanceof XULElement && this
			|| window.gBrowser && gBrowser.selectedBrowser
			|| document.documentElement;
		if("boxObject" in anchor) {
			let bo = anchor.boxObject;
			e = {
				screenX: bo.screenX,
				screenY: bo.screenY
			};
			if(this instanceof XULElement)
				e.screenY += bo.height;
		}
	}
	if(!e || !("screenX" in e))
		throw new Error("[Toggle Restartless Add-ons]: Can't get event object");
	document.documentElement.appendChild(mp);
	mp.addEventListener("popuphidden", function destroy(e) {
		mp.removeEventListener(e.type, destroy, false);
		setTimeout(function() {
			mp.destroyMenu();
			mp.parentNode.removeChild(mp);
		}, 0);
	}, false);
	mp.openPopupAtScreen(e.screenX, e.screenY);
}

function getRestartlessAddons(addonTypes, callback, context) {
	if(!("AddonManager" in window))
		Components.utils.import("resource://gre/modules/AddonManager.jsm");
	if(!("Services" in window))
	//	Components.utils.import("resource://gre/modules/Services.jsm");
	var then, promise = AddonManager.getAddonsByTypes(addonTypes, then = function(addons) {
		callback.call(context, addons.filter(function(addon) {
			var ops = addon.operationsRequiringRestart;
			return !addon.appDisabled
				&& !(ops & AddonManager.OP_NEEDS_RESTART_ENABLE || ops & AddonManager.OP_NEEDS_RESTART_DISABLE)
				&& (
					!addon.hidden
					|| options.showHidden > 0
					|| options.showHidden == -1 && !addon.userDisabled
				)
				&& (addon.iconURL || "").substr(0, 29) != "resource://search-extensions/";
		}));
	});
	promise && typeof promise.then == "function" && promise.then(then, Components.utils.reportError); // Firefox 61+
}
function openAddonOptions(addon) {
	// Based on code from chrome://mozapps/content/extensions/extensions.js
	// Firefox 21.0a1 (2013-01-27)
	var optionsURL = addon.optionsURL;
	if(!addon.isActive || !optionsURL)
		return false;
	if(addon.type == "plugin") // No options for now!
		return false;
	if(
		addon.optionsType == (AddonManager.OPTIONS_TYPE_INLINE || NaN)
		|| addon.optionsType == (AddonManager.OPTIONS_TYPE_INLINE_INFO || NaN)
		|| addon.optionsType == (AddonManager.OPTIONS_TYPE_INLINE_BROWSER || NaN)
	)
		openAddonPage(addon, true);
	else if(addon.optionsType == AddonManager.OPTIONS_TYPE_TAB && "switchToTabHavingURI" in window)
		switchToTabHavingURI(optionsURL, true);
	else {
		let windows = Services.wm.getEnumerator(null);
		while(windows.hasMoreElements()) {
			let win = windows.getNext();
			if(win.document.documentURI == optionsURL) {
				win.focus();
				return true;
			}
		}
		// Note: original code checks browser.preferences.instantApply and may open modal windows
		window.openDialog(optionsURL, "", "chrome,titlebar,toolbar,centerscreen,dialog=no");
	}
	return true;
}
function openAddonsManager(view) {
	var openAddonsMgr = window.BrowserOpenAddonsMgr // Firefox
		|| window.openAddonsMgr // Thunderbird
		|| window.toEM; // SeaMonkey
	openAddonsMgr(view);
}
function openAddonPage(addon, scrollToPreferences) {
	var platformVersion = parseFloat(
		Services.appinfo.name == "Pale Moon"
			? Services.appinfo.version
			: Services.appinfo.platformVersion
	);
	scrollToPreferences = scrollToPreferences && platformVersion >= 12
		? "/preferences"
		: "";
	openAddonsManager("addons://detail/" + encodeURIComponent(addon.id) + scrollToPreferences);
}

function hasModifier(e) {
	return e.ctrlKey || e.shiftKey || e.altKey || e.metaKey;
}

function addStyle() {
	if(addStyle.hasOwnProperty("_style"))
		return;
	var style = '\
		.toggleRestartlessAddons-isDelayed > .menu-iconic-text {\n\
			opacity: 0.75;\n\
			color: #070;\n\
		}\n\
		.toggleRestartlessAddons-isHidden > .menu-iconic-text {\n\
			color: #609;\n\
		}\n\
		.toggleRestartlessAddons-disabled > .menu-iconic-left {\n\
			opacity: 0.4;\n\
		}\n\
		.toggleRestartlessAddons-disabled > .menu-iconic-text,\n\
		.toggleRestartlessAddons-disabled > .menu-accel-container {\n\
			opacity: 0.5;\n\
		}\n\
		.toggleRestartlessAddons-askToActivate {\n\
			color: -moz-nativehyperlinktext;\n\
		}';
	addStyle._style = document.insertBefore(
		document.createProcessingInstruction(
			"xml-stylesheet",
			'href="' + "data:text/css,"
				+ encodeURIComponent(style) + '" type="text/css"'
		),
		document.documentElement
	);
}
function removeStyle() {
	if(!addStyle.hasOwnProperty("_style"))
		return;
	var s = addStyle._style;
	s.parentNode.removeChild(s);
	delete addStyle._style;
}
function closeMenus(node) {
	// Based on function closeMenus from chrome://browser/content/utilityOverlay.js
	for(; node && "tagName" in node; node = node.parentNode) {
		if(
			node.namespaceURI == "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
			&& (node.localName == "menupopup" || node.localName == "popup")
		)
			node.hidePopup();
	}
}
function _log(s) {
	if(typeof LOG == "function") // Custom Buttons
		LOG(s);
	else // Or something else
		Services.console.logStringMessage("Toggle Restartless Add-ons: " + s);
}

function hasUpdater() {
	var has = checkForAddonsUpdates.toString().indexOf("about:addons") != -1;
	hasUpdater = function() {
		return has;
	};
	return has;
}
function checkForAddonsUpdates() {
//== Check for Addons Updates begin
// http://infocatcher.ucoz.net/js/cb/checkForAddonsUpdates.js
// https://forum.mozilla-russia.org/viewtopic.php?id=57958
// https://github.com/Infocatcher/Custom_Buttons/tree/master/Check_for_Addons_Updates

// Check for Addons Updates button for Custom Buttons
// (code for "code" section)

// (c) Infocatcher 2012-2021
// version 0.1.6pre4 - 2021-03-28

// Button just open hidden tab with about:addons and trigger built-in "Check for Updates" function.
// And show tab, if found updates.

(function() {
var btn = this instanceof XULElement
	? this
	: { // Launched not from custom button
		image: "", // Base64-encoded icon (if empty, will be used "imgLoading")
		label: "Check for Addons Updates",
		tooltipText: ""
	};
if("_cb_disabled" in btn)
	return;
btn._cb_disabled = true;

if(!("Services" in window))
	//Components.utils.import("resource://gre/modules/Services.jsm");
var app = Services.appinfo.name;
var pv = parseFloat(Services.appinfo.platformVersion);

var ADDONS_URL = "about:addons";

var progressIcon = new ProgressIcon(btn);
var image = btn.image || progressIcon.imgLoading;
var tip = btn.tooltipText;
btn.tooltipText = "Open " + ADDONS_URL + "…";

var tab, browser, gBrowser;
var tbTabInfo, tbTab;

var trgWindow = Services.wm.getMostRecentWindow("navigator:browser")
	|| app == "Thunderbird" && Services.wm.getMostRecentWindow("mail:3pane")
	|| window;
var trgDocument = trgWindow.document;
var tabmail = trgDocument.getElementById("tabmail");

if(tabmail && app == "Thunderbird") { // Note: SeaMonkey doesn't support content tabs in mail window
	let addonsWin;
	let receivePong = function(subject, topic, data) {
		addonsWin = subject;
	};
	Services.obs.addObserver(receivePong, "EM-pong", false);
	Services.obs.notifyObservers(null, "EM-ping", "");
	Services.obs.removeObserver(receivePong, "EM-pong");
	if(addonsWin) {
		let rootWindow = addonsWin
			.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
			.getInterface(Components.interfaces.nsIWebNavigation)
			.QueryInterface(Components.interfaces.nsIDocShellTreeItem)
			.rootTreeItem
			.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
			.getInterface(Components.interfaces.nsIDOMWindow);
		tabmail = rootWindow.document.getElementById("tabmail");
		tbTabInfo = tabmail.getBrowserForDocument(addonsWin);
		tbTab = tab = tbTabInfo.tabNode;
		processAddonsTab(addonsWin);
	}
	else {
		Services.obs.addObserver(function observer(subject, topic, data) {
			Services.obs.removeObserver(observer, topic);
			if(subject.document.readyState == "complete")
				processAddonsTab(subject);
			else {
				subject.addEventListener("load", function onLoad(e) {
					subject.removeEventListener(e.type, onLoad, false);
					processAddonsTab(subject);
				}, false);
			}
		}, "EM-loaded", false);
		// See openAddonsMgr() -> openContentTab()
		tbTabInfo = tabmail.openTab("contentTab", {
			contentPage: ADDONS_URL,
			clickHandler: "specialTabs.siteClickHandler(event, /addons\.mozilla\.org/);",
			background: true
		});
		tbTab = tab = tbTabInfo.tabNode;
		tbTab.collapsed = true;
		// Note: dontSelectHiddenTab() not implemented
	}
}
else if("gBrowser" in trgWindow && trgWindow.gBrowser.tabs) {
	let isPending = false;
	let ws = Services.wm.getEnumerator("navigator:browser");
	windowsLoop:
	while(ws.hasMoreElements()) {
		let w = ws.getNext();
		let tabs = w.gBrowser.tabs;
		for(let i = 0, l = tabs.length; i < l; ++i) {
			let t = tabs[i];
			if(
				!t.closing
				&& t.linkedBrowser
				&& t.linkedBrowser.currentURI.spec == ADDONS_URL
			) {
				tab = t;
				break windowsLoop;
			}
		}
	}

	gBrowser = trgWindow.gBrowser;
	if(!tab) {
		tab = gBrowser.addTab(ADDONS_URL, {
			triggeringPrincipal: "Services" in window // Firefox 63+
				&& Services.scriptSecurityManager
				&& Services.scriptSecurityManager.getSystemPrincipal()
		});
		tab.collapsed = true;
		tab.closing = true; // See "visibleTabs" getter in chrome://browser/content/tabbrowser.xml
		trgWindow.addEventListener("TabSelect", dontSelectHiddenTab, false);
	}
	else if(
		tab.getAttribute("pending") == "true" // Gecko >= 9.0
		|| tab.linkedBrowser.contentDocument.readyState == "uninitialized"
		// || tab.linkedBrowser.__SS_restoreState == 1
	)
		isPending = true;

	browser = tab.linkedBrowser;
	if(
		isPending
		|| browser.webProgress.isLoadingDocument
		|| browser.currentURI.spec == "about:blank" // Firefox 79+
	) {
		browser.addEventListener("load", processAddonsTab, true);
		if(isPending) {
			if(pv >= 41) {
				// Workaround to correctly restore pending tab
				// See https://github.com/Infocatcher/Custom_Buttons/issues/39
				let selTab = gBrowser.selectedTab;
				gBrowser.selectedTab = tab;
				gBrowser.selectedTab = selTab;
			}
			else {
				browser.reload();
			}
		}
	}
	else {
		processAddonsTab();
	}
}
else {
	progressIcon.restore();
	btn.tooltipText = tip;
	delete btn._cb_disabled;
	Services.prompt.alert(window, btn.label, "Error: Can't find supported window!");
	return;
}

function processAddonsTab(e, again) {
	var doc;
	if(e && e instanceof Components.interfaces.nsIDOMWindow) {
		doc = e.document;
	}
	else if(e) {
		doc = e.target;
		if(doc.location != ADDONS_URL)
			return;
		browser.removeEventListener(e.type, processAddonsTab, true);
	}
	else {
		doc = browser.contentDocument;
	}

	btn.tooltipText = "Process " + ADDONS_URL + "…";
	progressIcon.loading();

	var origAttr = "_cb_checkForAddonsUpdates_origImage";
	if(!tab.hasAttribute(origAttr)) {
		var link = doc.querySelector('link[rel="shortcut icon"]'); // Not loaded yet?
		tab.setAttribute(origAttr, link && link.href || tab.image);
	}
	tab.image = image;

	var fu = $("cmd_findAllUpdates");
	if(!fu) { // Firefox 72+
		var win = doc.defaultView;
		var vb = doc.getElementById("html-view-browser");
		if(!vb) {
			if(!HTMLHtmlElement.isInstance(doc.documentElement)) { // Firefox 87+
				win.setTimeout(processAddonsTab, 20, win);
				return;
			}
			vb = browser;
		}
		if(!again) { // Strange errors happens
			// chrome://mozapps/content/extensions/aboutaddons.js
			// getTelemetryViewName() -> el.closest(...) is null
			win.setTimeout(processAddonsTab, 20, win, true);
			return;
		}
		var vbDoc = vb.contentDocument;
		fu = vbDoc.querySelector('[action="check-for-updates"]');
		var um = vbDoc.getElementById("updates-message");
	}

	var notFound = $("updates-noneFound") || {
		get hidden() { return um.getAttribute("state") != "none-found"; }
	};
	var updated = $("updates-installed") || {
		get hidden() { return um.getAttribute("state") != "installed"; }
	};
	// Avoid getting false results from the past update check (may not be required for "noneFound")
	if(um) { // Firefox 72+
		um.hidden = true;
		um.removeAttribute("state");
	}
	else {
		notFound.hidden = updated.hidden = true;
	}

	//fu.doCommand();
	fu.click();

	function localize(node, key, callback) {
		if(um) { // Firefox 72+
			doc.l10n.formatValue(key).then(function(s) {
				callback(s || key);
			}, Components.utils.reportError);
			return;
		}
		callback(node.getAttribute("value") || key);
	}

	var inProgress = $("updates-progress") || {
		get hidden() { return um.getAttribute("state") != "updating"; }
	};
	localize(inProgress, "addon-updates-updating", function(s) {
		btn.tooltipText = s;
	});

	var waitTimer = setInterval(function() {
		if(!doc.defaultView || doc.defaultView.closed) {
			stopWait();
			notify("Tab with add-ons manager was closed!");
			return;
		}
		if(!inProgress.hidden)
			return;
		var autoUpdate = $("utils-autoUpdateDefault")
			|| vbDoc.querySelector('[action="set-update-automatically"]');
		var autoUpdateChecked = autoUpdate.getAttribute("checked") == "true"
			|| autoUpdate.checked;

		var found = $("updates-manualUpdatesFound-btn") || {
			get hidden() { return um.getAttribute("state") != "manual-updates-found"; }
		};
		if(
			autoUpdateChecked
				? notFound.hidden && updated.hidden
				: notFound.hidden && found.hidden
		) // Too early?
			return;

		stopWait();
		if(!tbTab)
			tab.closing = false;
		function removeTab() {
			if(!tab.collapsed)
				return;
			if(tbTab) {
				tabmail.closeTab(tbTabInfo, true /*aNoUndo*/);
				return;
			}
			gBrowser.removeTab(tab);
			(function forgetClosedTab(isSecondTry) {
				var ss = "nsISessionStore" in Components.interfaces
					? (
						Components.classes["@mozilla.org/browser/sessionstore;1"]
						|| Components.classes["@mozilla.org/suite/sessionstore;1"]
					).getService(Components.interfaces.nsISessionStore)
					: trgWindow.SessionStore; // Firefox 61+ https://bugzilla.mozilla.org/show_bug.cgi?id=1450559
				if(!("forgetClosedTab" in ss))
					return;
				var closedTabs = (ss.getClosedTabDataForWindow(window));
				for(let i = 0, l = closedTabs.length; i < l; ++i) {
					let closedTab = closedTabs[i];
					let state = closedTab.state;
					if(state.entries[state.index - 1].url == ADDONS_URL) {
						ss.forgetClosedTab(window, i);
						return;
					}
				}
				if(!isSecondTry) // May be needed in SeaMonkey
					setTimeout(forgetClosedTab, 0, true);
			})();
		}

		if(!notFound.hidden) {
			removeTab();
			localize(notFound, "addon-updates-none-found", function(s) {
				notify(s);
			});
			return;
		}
		if(autoUpdateChecked) {
			removeTab();
			localize(updated, "addon-updates-installed", function(s) {
				notify(s);
			});
			return;
		}

		tab.collapsed = false;

		var cats = $("categories");
		var upds = $("category-availableUpdates");
		if(cats && upds) {
			if(vb && cats.selectedItem == upds) // Only for Firefox 72+
				cats.selectedItem = $("category-extension"); // Trick to force update
			cats.selectedItem = upds;
		}
		else { // Firefox 76+ ?
			vbDoc.querySelector('.category[name="available-updates"]').click();
		}

		var tabWin = tab.ownerDocument.defaultView;
		if(tbTab)
			tabmail.switchToTab(tbTabInfo);
		else
			tabWin.gBrowser.selectedTab = tab;
		setTimeout(function() {
			tabWin.focus();
			doc.defaultView.focus();
			var al = $("addon-list") || vb;
			al.focus();
		}, 0);
	}, 50);
	function $(id) {
		return doc.getElementById(id);
	}
	function stopWait() {
		clearInterval(waitTimer);
		progressIcon.restore();
		btn.tooltipText = tip;
		if(tab.image == image)
			tab.image = tab.getAttribute(origAttr);
		tab.removeAttribute(origAttr);
		trgWindow.removeEventListener("TabSelect", dontSelectHiddenTab, false);
		setTimeout(function() {
			delete btn._cb_disabled;
		}, 500);
	}
	function notify(msg) {
		Components.classes["@mozilla.org/alerts-service;1"]
			.getService(Components.interfaces.nsIAlertsService)
			.showAlertNotification(
				app == "Firefox" && pv >= 57
					? "chrome://mozapps/skin/extensions/extensionGeneric.svg"
					: "chrome://mozapps/skin/extensions/extensionGeneric.png",
				btn.label,
				msg, false, "", null
			);
	}
}
function dontSelectHiddenTab(e) {
	// <tab /><tab collapsed="true" />
	// Close first tab: collapsed tab becomes selected
	var trgTab = e.originalTarget || e.target;
	if(trgTab != tab)
		return;

	if(/\n(?:BrowserOpenAddonsMgr|toEM)@chrome:\/\//.test(new Error().stack)) {
		// User open Add-ons Manager, show tab
		trgWindow.removeEventListener("TabSelect", dontSelectHiddenTab, false);
		setTimeout(function() { // Hidden tab can't be selected, so select it manually...
			tab.collapsed = tab.closing = false;
			gBrowser.selectedTab = tab;
		}, 0);
	}

	function done(t) {
		if(!t.hidden && !t.closing) {
			e.preventDefault();
			e.stopPropagation();
			return gBrowser.selectedTab = t;
		}
		return false;
	}
	for(var t = tab.nextSibling; t; t = t.nextSibling)
		if(done(t))
			return;
	for(var t = tab.previousSibling; t; t = t.previousSibling)
		if(done(t))
			return;
}
function ProgressIcon(btn) {
	var app = Services.appinfo.name;
	var pv = parseFloat(Services.appinfo.platformVersion);
	if(app == "SeaMonkey")
		this.imgConnecting = this.imgLoading = "chrome://communicator/skin/icons/loading.gif";
	else if(app == "Thunderbird") {
		this.imgConnecting = "chrome://messenger/skin/icons/connecting.png";
		this.imgLoading = "chrome://messenger/skin/icons/loading.png";
	}
	else {
		this.imgConnecting = app == "Firefox" && pv >= 58
			? "chrome://browser/skin/tabbrowser/tab-connecting.png"
			: "chrome://browser/skin/tabbrowser/connecting.png";
		this.imgLoading = app == "Firefox" && pv >= 48
			? "chrome://global/skin/icons/loading.png"
			: "chrome://browser/skin/tabbrowser/loading.png";
	}
	if(!(btn instanceof XULElement)) {
		this.loading = this.restore = function() {};
		return;
	}
	var useAnimation = app == "Firefox" && pv >= 32 && pv < 48;
	var btnIcon = btn.icon
		|| btn.ownerDocument.getAnonymousElementByAttribute(btn, "class", "toolbarbutton-icon");
	var origIcon = btnIcon.src;
	btnIcon.src = this.imgConnecting;
	if(useAnimation) {
		let cs = btnIcon.ownerDocument.defaultView.getComputedStyle(btnIcon, null);
		let s = btnIcon.style;
		s.margin = [cs.marginTop, cs.marginRight, cs.marginBottom, cs.marginLeft].join(" ");
		s.padding = [cs.paddingTop, cs.paddingRight, cs.paddingBottom, cs.paddingLeft].join(" ");
		s.width = cs.width;
		s.height = cs.height;
		s.boxShadow = "none";
		s.borderColor = s.background = "transparent";
		btnIcon.setAttribute("fadein", "true");
		btnIcon.setAttribute("busy", "true");
		btnIcon.classList.add("tab-throbber");
		btnIcon._restore = function() {
			delete btnIcon._restore;
			btnIcon.removeAttribute("busy");
			btnIcon.removeAttribute("progress");
			setTimeout(function() {
				btnIcon.classList.remove("tab-throbber");
				btnIcon.removeAttribute("style");
				btnIcon.removeAttribute("fadein");
			}, 0);
		};
	}
	this.loading = function() {
		btnIcon.src = this.imgLoading;
		if(useAnimation)
			btnIcon.setAttribute("progress", "true");
	};
	this.restore = function() {
		btnIcon.src = origIcon;
		if(useAnimation)
			btnIcon._restore();
	};
}
}).call(this);
//== Check for Addons Updates end
}              

this.tooltipText = "Переключатель джетпаков" 
                   + "\nПКМ – проверить обновления"
                   + "\nСКМ – открыть страницу дополнений"
                   + "\nShift+ПКМ – меню кнопки"
                   + "\n\nВ меню: \nЛКМ – включить/выключить дополнение без закрытия меню"
                   + "\nShift+ЛКМ – включить/выключить дополнение"   
                   + "\nСКМ – открыть страницу дополнения в управлении дополнениями"                    
                   + "\nПКМ – открыть настройки дополнения (если есть)";     
// Autoopen/close feature
var openDelay = 200;
var closeDelay = 350;

var _openTimer = 0;
var _closeTimer = 0;
this.onmouseover = function(e) {
	clearTimeout(_closeTimer);
	if(e.target == this && closeOtherMenus()) {
		this.open = true;
		return;
	}
	_openTimer = setTimeout(function() {
		self.open = true;
	}, openDelay);
};
this.onmouseout = function(e) {
	clearTimeout(_openTimer);
	_closeTimer = setTimeout(function() {
		if(!isContextOpened())
			self.open = false;
	}, closeDelay);
};
function closeOtherMenus() {
	return Array.prototype.some.call(
		self.parentNode.getElementsByTagName("*"),
		function(node) {
			if(
				node != self
				&& node.namespaceURI == xulns
				// See https://github.com/Infocatcher/Custom_Buttons/issues/28
				//&& node.boxObject
				//&& node.boxObject instanceof Components.interfaces.nsIMenuBoxObject
				&& "open" in node
				&& node.open
				&& node.getElementsByTagName("menupopup").length
			) {
				node.open = false;
				return true;
			}
			return false;
		}
	);
}
function isContextOpened() {
	return inBtn(document.popupNode);
}
function inBtn(node) {
	for(; node; node = node.parentNode)
		if(node == self)
			return true;
	return false;
}

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

Выделить код

Код:

try {CustomizableUI.createWidget({
	label: "Дополнения",
	id: "ucf-cbbtn-ToggleRestartlessAddons",
	localized: false,
	get initCode() {
		this.event = Object.create(null);
		delete this.initCode;
		return this.initCode = Cu.readUTF8URI(Services.io.newURI(
			"chrome://user_chrome_files/content/custom_scripts/custom_script/toggleRestartlessAddons.js"
		));
	},
	onCreated(btn) {
		btn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAt0lEQVR42mP4//8/AzK269D+zxDPAMYgNro8OsYUsGf4L5IrAMYgNskGPHrzkAHmAhCbZAPAglFAA6II2w5WC/ZzGEQDDMO9gCQGUmNYr4dhKANPBgdcAyEMMgSrAWA/R0H8jdcALN5iQHYWLABJMgBbABJjACiKweFHigHwgIW6Eux1UryA1QD0QISzsQQqVi+gKEBLfeguwhqIBEM5ihQD4rEoQHaBLwEDQOGBHKggNiyl4sreAEpLK4gRQN5TAAAAAElFTkSuQmCC");
		new btn.ownerGlobal.Function("self,event,_phase", this.initCode)
			.call(btn, btn, this.event, "init");
	}
});} catch(ex) {Cu.reportError(ex);}

Отсутствует

 

Board footer

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