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

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

№1435123-02-2020 16:26:26

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 75.0

Re: Custom Buttons

Dumby
Круто же терь, +3 функций еще оказывается на ПКМ можно добавить) ато так кнопка была скучной.
Только не понял что значит стилизовать? анимация? у меня она отключена при обновлений только 2 иконки "обновление"+"крестик".

Отредактировано func4ptch4 (23-02-2020 16:26:53)

Отсутствует

 

№1435223-02-2020 21:42:13

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

Re: Custom Buttons

Dumby подскажи диалог "сохранить" - chrome://mozapps/content/downloads/unknownContentType.xhtml, как добавить кнопку, что не очень получается

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

Выделить код

Код:

(function() {

    if (!window.FileUtils) Cu.import('resource://gre/modules/FileUtils.jsm');
    if (!window.Services) Cu.import('resource://gre/modules/Services.jsm');
   var getPrefDirPath = function (str) {
        Components.utils.import("resource://gre/modules/Services.jsm");
        var prefDir = Services.dirsvc.get(str, Ci.nsIFile).path;
        return prefDir;
    };
 var ns = {
init: function(){
            switch(location.href){
                case "chrome://mozapps/content/downloads/unknownContentType.xhtml":
                    ns.saveTo();          
                    break;
            }
        },

    


   saveTo: function () {
        var dirArray = [
            ['C:\\Users\\vieva\\Desktop', 'Рабочий стол'],
            ["" + getPrefDirPath('UChrm') + "", "chrome"],
            ["" + getPrefDirPath('UChrm') + "\\" + 'CSS' + "", "chrome\\CSS"],
            ["C:\\", "C:"],
            ["E:\\", "E:"],
            ["F:\\", "F:"],
            ["G:\\", "G:"]
            ];
        
        var button = document.getElementById("unknownContentType").getButton("cancel");
        var saveTo = button.parentNode.insertBefore(document.createXULElement("button"), button);
        var saveToMenu = saveTo.appendChild(document.createXULElement("menupopup"));
        saveTo.classList.toggle("dialog-button");
        saveTo.label = "Сохранить в";
        saveTo.type = "menu";
        dirArray.forEach(function(dir) {
            var [name, dir] = [dir[1], dir[0]];
            var mi = document.createXULElement("menuitem");
            var item = saveToMenu.appendChild(mi);
            item.setAttribute("label", (name || (dir.match(/[^\\/]+$/) || [dir])[0]));
            item.setAttribute("image", "moz-icon:file:///" + dir + "\\");
            item.setAttribute("class", "menuitem-iconic");
            item.addEventListener("command", function() {
                var file = new FileUtils.File(dir.replace(/\\/g, '\\\\') + '\\\\' + (document.getElementById('locationtext') ? document.getElementById('locationtext').value : document.getElementById('location').value));
                dialog.mLauncher.saveToDisk(file, 1);
                dialog.onCancel = function() {};
                close();
            });
        });

Отсутствует

 

№1435324-02-2020 00:27:00

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

Re: Custom Buttons

Dumby
Нет ли возможности избавиться от шрифтов аэро?  то ли стилем то ли кодом? В ручную на каждую тему заманаешься...

Отсутствует

 

№1435424-02-2020 18:48:48

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

Re: Custom Buttons

bunda1
https://forum.mozilla-russia.org/viewtopic.php?pid=778384#p778384

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

Отредактировано firepox (24-02-2020 18:49:03)

Отсутствует

 

№1435524-02-2020 19:20:29

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

Re: Custom Buttons

Andrey_Krropotkin пишет

добавить кнопку, что не очень получается

Код местами странный, но вполне рабочий (кнопку добавляет).
Я так понимаю он у тебя грузится в окно диалога.
Если да, то как именно и каким инструментом?

solombala пишет

Нет ли возможности избавиться от шрифтов аэро?

Я без понятия что такое «шрифты аэро».
Давай пояснительный скриншот и сборку, может попробую посмотреть.

Отсутствует

 

№1435624-02-2020 20:16:51

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

Re: Custom Buttons

Dumby
Да , просто тему аэро ставишь в системе. И все ...Там у каждой темы свои  типы шрифтов ..."настройки окна"...Ничего не получиться кодом.
n9q8o398.png

Отсутствует

 

№1435725-02-2020 05:08:33

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 75.0

Re: Custom Buttons

А есть что-то для транлитераций? вроде видел какую-то кнопку.
Вопрос такой можно ли сделать, нажал открывается окружение "типа блокнот", можно в отдельное окно или попап все равно.
И вводишь с английской раскладкой, а там сразу идет транслитерация текста на руский с латиницы.

Пример: translit.cc, translit.ru, google.co.in/inputtools/try, в переводчике гугла тоже есть что-то такое, но там как бы отдельно идет.
В VSCode нашел такое SerTranslit, но блин надо всегда кликать для транлитераций, мне надо сразу вводишь и видишь руский текст.
Если знайте что-то такое тоже интересно, не хочу все время заходить на разные сайты а чтобы всегда было доступно под рукой.
Мм вот как-то так.

Отсутствует

 

№1435825-02-2020 12:14:45

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

Re: Custom Buttons

Dumby вот я и не пойму каким кодом загрузить эту кнопку в окно диалога или повесить этот код на скрытую кнопку Extra1. Можешь дать хотя бы какой нибудь пример?

Отсутствует

 

№1435925-02-2020 14:52:41

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

Re: Custom Buttons

Где тут лажа? "Выкл панель закладок при выходе"

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

Выделить код

Код:

/*Initialization Code*/
var observer = {
   observe:(subject, topic, data)=> {
      if ( data == "shutdown" )
      
        CustomizableUI.setToolbarVisibility("PersonalToolbar", document.querySelector("#PersonalToolbar").collapsed);
              
           
    }
};
Services.obs.addObserver(observer, "quit-application", false);

Отсутствует

 

№1436025-02-2020 16:05:25

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

Re: Custom Buttons

solombala пишет

Где тут лажа? "Выкл панель закладок при выходе"

Может так?

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

Выделить код

Код:

/*Initialization Code*/

var observer = {
  observe:(subject, topic, data)=> {
    if ( data == "shutdown" )

      var bar = document.getElementById("PersonalToolbar");
      setToolbarVisibility(bar, bar.collapsed);
     
    }
};
Services.obs.addObserver(observer, "quit-application", false);

Отредактировано unter_officer (25-02-2020 16:06:58)

Отсутствует

 

№1436125-02-2020 16:19:18

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

Re: Custom Buttons

unter_officer

unter_officer пишет

Может так?

Не может, а именно так! Хвала, брате!
Рано обрадовался , при запуске( через раз) снова включается панель...

Отредактировано solombala (25-02-2020 23:59:54)

Отсутствует

 

№1436225-02-2020 16:59:28

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

Re: Custom Buttons

solombala пишет

"Выкл панель закладок при выходе"

А зачем её выключать, чтоб враги не увидели? :)

Отредактировано voqabuhe (25-02-2020 17:00:16)

Отсутствует

 

№1436325-02-2020 18:13:14

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

Re: Custom Buttons

voqabuhe
С дешевым базаром  - вали на Ru-Board . Тут люди работают.

Отсутствует

 

№1436425-02-2020 22:54:50

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

Re: Custom Buttons

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

Отредактировано voqabuhe (25-02-2020 22:55:36)

Отсутствует

 

№1436526-02-2020 09:11:15

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

Re: Custom Buttons

solombala пишет

просто тему аэро ставишь в системе. И все ...Там у каждой темы свои  типы шрифтов

Да, теперь вижу, спасибо.
Увы, я не знаю как отгородить Firefox от пользовательской Windows-темы,
видимо нужен специальный стиль, чтобы приколотить всё вручную.

solombala пишет

Рано обрадовался , при запуске( через раз) снова включается панель...

Я бы так сделал, наверно

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

Выделить код

Код:

((id, g) => {
    addDestructor(r => r[5] == "e" && id in g && g[id].destroy());
    if (g[id]) return;
    var {obs, xulStore} = Services;
    var topic = "quit-application", doc = document.documentURI;
    obs.addObserver(g[id] = {
        observe(s, t, data) {
            this.destroy();
            data == "shutdown" && xulStore.setValue(
                doc, "PersonalToolbar", "collapsed", "true"
            );
        },
        destroy() {
            delete g[id];
            obs.removeObserver(this, topic);
        }
    }, topic, false);
})(
    "CBQuitApplicationPersonalToolbarCollapser", Cu.getGlobalForObject(Cu)
);

Andrey_Krropotkin пишет

вот я и не пойму каким кодом загрузить эту кнопку в окно диалога

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

Ну как, я проверял следующим образом:
дофантозировал непредоставленную концовку, чуток подформатировал,
и добавил в custom_script_all_win.js
Там намёкнуто где располагать, но, исходя из неопределённости,
просто дописал в конец.

Таким образом, вижу, что по DOMContentLoaded слегка рановато
для такого дела, поэтому тормознул листенером на событие shadowrootattached

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

Выделить код

Код:

(function() {
    if (!window.FileUtils) Cu.import('resource://gre/modules/FileUtils.jsm');
    if (!window.Services) Cu.import('resource://gre/modules/Services.jsm');
    var getPrefDirPath = function (str) {
        Components.utils.import("resource://gre/modules/Services.jsm");
        var prefDir = Services.dirsvc.get(str, Ci.nsIFile).path;
        return prefDir;
    }
    var ns = {
        init: function(){
            switch(location.href) {
                case "chrome://mozapps/content/downloads/unknownContentType.xhtml":
                    //ns.saveTo();
                    addEventListener("shadowrootattached", ns.saveTo, {once: true});
            }
        },
        saveTo: function () {
            var dirArray = [
                ['C:\\Users\\vieva\\Desktop', 'Рабочий стол'],
                ["" + getPrefDirPath('UChrm') + "", "chrome"],
                ["" + getPrefDirPath('UChrm') + "\\" + 'CSS' + "", "chrome\\CSS"],
                ["C:\\", "C:"],
                ["E:\\", "E:"],
                ["F:\\", "F:"],
                ["G:\\", "G:"]
            ];
            var button = document.getElementById("unknownContentType").getButton("cancel");
            var saveTo = button.parentNode.insertBefore(document.createXULElement("button"), button);
            var saveToMenu = saveTo.appendChild(document.createXULElement("menupopup"));
            saveTo.classList.toggle("dialog-button");
            saveTo.label = "Сохранить в";
            saveTo.type = "menu";
            dirArray.forEach(function(dir) {
                var [name, dir] = [dir[1], dir[0]];
                var mi = document.createXULElement("menuitem");
                var item = saveToMenu.appendChild(mi);
                item.setAttribute("label", (name || (dir.match(/[^\\/]+$/) || [dir])[0]));
                item.setAttribute("image", "moz-icon:file:///" + dir + "\\");
                item.setAttribute("class", "menuitem-iconic");
                item.addEventListener("command", function() {
                    var file = new FileUtils.File(dir.replace(/\\/g, '\\\\') + '\\\\' + (
                        document.getElementById('locationtext')
                            ? document.getElementById('locationtext').value
                            : document.getElementById('location').value
                    ));
                    dialog.mLauncher.saveToDisk(file, 1);
                    dialog.onCancel = function() {};
                    close();
                });
            });
        }
    };
    ns.init();
})();


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

Отсутствует

 

№1436626-02-2020 09:38:37

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

Re: Custom Buttons

Dumby я не пользуюсь custom_script_all_win.js, я хотел сделать из CB. Да в скрипте он идет (и в моем варианте шел, так что это был не огрызок кода), а из СВ не идет. Мне бы пример как добавить кнопку в диалог  из СВ. Извини если запутал

Отсутствует

 

№1436726-02-2020 11:18:13

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

Re: Custom Buttons

Dumby

Dumby пишет

Я бы так сделал, наверно

Тонкий ход...А зауниверсалить можно? Типа, из abot:config параметр ? media.autoplay.default , или типа этого...Короче , на выходе обратно встало, как по умолчанию...

скрытый текст
var s = "extensions.long_left_click.timeContent";

    this._handleClick = () => ps.setIntPref(s, ps.getIntPref(s, 350) ? 0 : 350);

Отсутствует

 

№1436826-02-2020 14:16:39

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

Re: Custom Buttons

solombala пишет

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

Да, стиль чуть меняешь , главное шрифт  в "доп. настройках окна" и все дела...
z6gzou4x.png

Отсутствует

 

№1436927-02-2020 00:06:16

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

Re: Custom Buttons

Infocatcher, Dumby можно эти два кода сшить в один?
1.
/* Code*/

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

Выделить код

Код:

if(!event.target) // Button's hotkey pressed
    this.open = true;


/*Initialization Code*/
скрытый текст

Выделить код

Код:

// 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: 1,
    // 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", "this.handleEvent(event);");
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
            ? "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;
    }
    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("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);
}

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

//== Check for Addons Updates end
}              

this.tooltipText = "Переключатель джетпаков" 
                   + "\n\nУправление:\nЛКМ – открыть меню" 
                   + "\nПКМ – меню кнопки"
                   + "\nСКМ – открыть страницу дополнений"
                   + "\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;
}


2./* Code*/
скрытый текст

Выделить код

Код:

// 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-2020
// version 0.1.6pre - 2020-01-24

// 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 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.addEventListener("load", processAddonsTab, true);
        if(isPending) {
            if(parseFloat(Services.appinfo.platformVersion) >= 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;
    }

    progressIcon.loading();

    var origAttr = "_cb_checkForAddonsUpdates_origImage";
    if(!tab.hasAttribute(origAttr))
        tab.setAttribute(origAttr, tab.image);
    tab.image = image;

    var updEnabledPref = "extensions.update.enabled";
    var updEnabled = Services.prefs.getBoolPref(updEnabledPref);
    if(!updEnabled)
        Services.prefs.setBoolPref(updEnabledPref, true);

    var fu = $("cmd_findAllUpdates");
    if(!fu) { // Firefox 72+
        var win = doc.defaultView;
        var vb = doc.getElementById("html-view-browser");
        if(!vb) {
            win.setTimeout(processAddonsTab, 20, win);
            return;
        }
        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"; },
        set hidden(h) {}
    };
    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*/);
            else {
                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)
                        : SessionStore; // Firefox 61+ https://bugzilla.mozilla.org/show_bug.cgi?id=1450559
                    if(!("forgetClosedTab" in ss))
                        return;
                    var closedTabs = JSON.parse(ss.getClosedTabData(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(!updEnabled)
            Services.prefs.setBoolPref(updEnabledPref, false);

        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(vb && cats.selectedItem == upds) // Only for Firefox 72+
            cats.selectedItem = $("category-extension"); // Trick to force update
        cats.selectedItem = upds;
        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(
                Services.appinfo.name == "Firefox" && parseFloat(Services.appinfo.version) >= 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) {
    if(!(btn instanceof XULElement)) {
        this.loading = this.restore = function() {};
        return;
    }
    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";
    }
    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);


обновление дополнений повесить на ПКМ
а меню кнопки на Shift+ПКМ

Отредактировано egorsemenov06 (27-02-2020 00:30:21)

Отсутствует

 

№1437027-02-2020 08:53:43

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

Re: Custom Buttons

egorsemenov06
Там же написано
// 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"

т.е. надо вставить весь код checkForAddonsUpdates.js в код toggleRestartlessAddons.js (почти в самом конце) между
function checkForAddonsUpdates() {
//== Check for Addons Updates begin

//== Check for Addons Updates end
}

Отсутствует

 

№1437127-02-2020 11:31:13

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

Re: Custom Buttons

momo2000 пишет

egorsemenov06
Там же написано
// 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"

т.е. надо вставить весь код checkForAddonsUpdates.js в код toggleRestartlessAddons.js (почти в самом конце) между
function checkForAddonsUpdates() {
//== Check for Addons Updates begin

//== Check for Addons Updates end
}

Спасибо!!!

Отсутствует

 

№1437227-02-2020 17:34:44

leex
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 272
UA: Firefox 73.0

Re: Custom Buttons

Друзья, не подскажете ли, есть ли  у нас код с  кнопкой гугловского виджета?
Для перевода страниц я хотел бы включать Виджет, не используя приложения переводчики.
2020-02-27_21-22-14.1582813414.jpg

Есть вот такой код для вызова Виджета из закладки

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

Выделить код

Код:

javascript:{var d, b, o, v, p; b = (d = document).body; o = d.createElement('script'); o.setAttribute('src', 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'); o.setAttribute('type', 'text/javascript'); b.appendChild(o); v = b.insertBefore(d.createElement('div'), b.firstChild); v.id = 'google_translate_element'; v.style.display = 'none'; p = d.createElement('script'); p.text = 'function googleTranslateElementInit(){new google.translate.TranslateElement({pageLanguage:""},"google_translate_element");}'; p.setAttribute('type', 'text/javascript'); b.appendChild(p)};void(0);


Если этот код вставить в адресную строку любой закладки, то при клике по ней будет вызываться Виджет. По сути закладка работает как кнопка.
Я хотел бы подружить этот код с CB, ведь это javascript.
Но поместив этот код в "инициализацию" или в "код" кнопка не работает

Отредактировано leex (27-02-2020 18:08:14)

Отсутствует

 

№1437327-02-2020 19:20:34

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

Re: Custom Buttons

Andrey_Krropotkin
Перестала у меня работать кнопка Google русский-английский. Это у меня личное или можешь поправить?

Отсутствует

 

№1437427-02-2020 20:17:17

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

Re: Custom Buttons

leex в секцию код

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

Выделить код

Код:

var vert = ` javascript:{var d, b, o, v, p; b = (d = document).body; o = d.createElement('script'); o.setAttribute('src', 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'); o.setAttribute('type', 'text/javascript'); b.appendChild(o); v = b.insertBefore(d.createElement('div'), b.firstChild); v.id = 'google_translate_element'; v.style.display = 'none'; p = d.createElement('script'); p.text = 'function googleTranslateElementInit(){new google.translate.TranslateElement({pageLanguage:""},"google_translate_element");}'; p.setAttribute('type', 'text/javascript'); b.appendChild(p)};void(0);` ;
gBrowser. loadURI(vert, { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() });


xrun1 после этого ее много раз исправляли, поищи поиском последнюю, я ей не пользуюсь, или спроси у solombala, у него кажется последняя исправленная версия

Отсутствует

 

№1437527-02-2020 20:35:14

leex
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 272
UA: Firefox 73.0

Re: Custom Buttons

Andrey_Krropotkin
Большое спасибо!

Отсутствует

 

Board footer

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