Объявление

В связи с наплывом спама и ботов на форуме, регистрация новых пользователей будет приостановлена. О восстановлении регистрации будет сообщено дополнительно

Administrator

№1730123-03-2025 18:07:35

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 47
UA: unknown 0.0

Re: Custom Buttons

Dumby
#window-modal-dialog::backdrop {
   
      background-color: inherit !important;
}
Не тухнет, но здесь не помогло. Стоит modal выпасть ,back кнопка тухнет, а после очистки опять горит, а, ссылок там уже нет. Надо или перезапуск делать или новую открывать...
1.png
Ясен пень, SanitizeDialog  старой FF выпадает окном ,а не modal и не бьет по кнопкам

Отредактировано green25 (23-03-2025 18:50:16)

Отсутствует

 

№1730223-03-2025 19:20:24

T0PMØ3iLLA
Участник
 
Группа: Members
Зарегистрирован: 18-09-2017
Сообщений: 29
UA: Firefox 91.0

Re: Custom Buttons

Так… значит мне ничего нового прописывать уже было не нужно — заработало только либо после очистки startupCache, либо всё-таки после полного удаления расширения и повторной установки (paxmod, ибо с bootstrap`ом мне ещё лет 6 назад пришлось возиться, так и не добившись результата), довелось завести хотя бы "ночной режим"… Сразу определить работоспособность хотя бы кнопки "Ночной режим" не получилось — после очисти startupCache на спех проверялось только в about:* страницах, где, оказалось, она не работает, но после повторного добавления, наконец заработала (несмотря на то, что «затемнена», как и надпись, если добавлять в специальное "»" подменю). А вот с переключалкой настроек проблемы остались — к тому моменту уже было опробован другой код из какого-то сообщения этой темы (то ли за 21-й то ли 23/24г), но над ним мне тогда пришлось полдня повозиться, чтоб предварительно убедиться в том, что убираемые процедуры и переменные из подозрительного кода не используются в остальных его местах — скорее всего где-то тут была "промашка"…

а тот старый, что был до замены…
Пролистывая код испорченнй кнопки в AkelPad`е, сверяю Ctrl+(Shift)+Tab`ом с сохранённой в 2020-м отдельным .txt версией — особых различий в нижней части кода толком не замечаю, и, думая, что в коде ничего не менялось, тупо беру какой-то "новый" попавшийся из этой темы (то ли за 21-й, то ли за 23/24 год), удаляю оттуда кучу ненужных мне пунктов меню, включая ещё какой-то подозрительный код, обращающийся к «файловой системе» (да блин, нужен же переключатель только каких-то заранее заданных параметров — их же легко править!), и заменяю кнопку… Ну… видимо что-то при такой правке кода было что-то "лишнее удалено", раз кнопка не работает…
Добавив CB 0.0.7.0.0.16 ещё раз и вставив тот скопированный URL обратно, замечаю, что заменённая мною кнопка-то действительно не пашет…
Пробую пропихнуть поверх старую версию CB (0.0.7.0.0.11) — о! на удивление, дополнение НЕ ОТКЛЮЧИЛОСЬ! Хах! Так вот как можно "обмануть систему" (т.е. тупо удалить расширение и поставить ещё раз)? Пробую поставить ещё раз ту "сломавшуюся кнопку" (что была сохранена отдельным .txt в 2020-м) — э! Всё равно кнопка "уехала" (сместив остальные панели инструментов вместе с панелью вкладок на "пару пунктов" вниз)… Пфф… значит всё-таки где-то какая-та буква была изменена в верхней части кода, между удалёнными кусками комментариев… Видимо, и тут "промашка"…
Пришлось копировать теперь "изуродованную" кнопку со старого профиля (где она хотя бы как-то работала, но она какая-то слишком навороченная, и, следовательно, глючная)… Видимо, ради того, чтоб продолжить пользоваться классическим вариантом этой кнопки, я в итоге решусь откатиться от 91esr до какой-нибудь 88 (не esr), заодно исправив проблему глючного интерфейса самой лисы, а может ещё и проблему с подтасовкой истории переходов вкладок (предыдущая/следующая страница) вкладок в приватном просмотре… главное не забыть --allow-downgrade
Ну хоть всё равно спасибо, что разъяснили… Не стоило мне беспокоить :/
Консоль по F12 | Ctrl+Shift+I была пустая, это уже потом дошло, что нужна была консоль по Ctrl+Shift+J — после вынужденного использования "инспектора" на многих проблемных страницах (приходилось слишком часто вручную убирать "снегопад" и пр. раздражающие элементы при посещении определённых сайтов) думалось, что там консоль та же, а оказалось нет…

Отсутствует

 

№1730324-03-2025 12:13:26

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 47
UA: unknown 0.0

Re: Custom Buttons

Удаляет Историю..А надо Сессии...
Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_HISTORY, () => {});

Отредактировано green25 (25-03-2025 10:16:30)

Отсутствует

 

№1730427-03-2025 10:00:36

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

Re: Custom Buttons

green25
В 115 есть отдельный флаг CLEAR_SESSION_HISTORY
А в нынешних версиях уже нет, свалили докучи в CLEAR_HISTORY


В любом случае, для удаления всего,
просто рассылается топик без третьего аргумента:
Services.obs.notifyObservers(null, "browser:purge-session-history");

Отсутствует

 

№1730527-03-2025 12:29:35

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 47
UA: unknown 0.0

Re: Custom Buttons

Dumby

Dumby пишет

Services.obs.notifyObservers(null, "browser:purge-session-history");

Класс, тонкий ход...

Отсутствует

 

№1730627-03-2025 21:29:11

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

Re: Custom Buttons

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

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

Выделить код

Код:

addEventListener('popupshowing', e=> {
      if (e.target != e.currentTarget) return;
      var sel = gContextMenu.isTextSelected;
      menu.hidden = !sel;
   }, false, contextMenu);

, для страницы вот такая обвертка на примере кода
скрытый текст

Выделить код

Код:

(this.contextviewpageinfo = {
    
    init(that) {
        var contextMenu = this.contextMenu = document.querySelector("#contentAreaContextMenu");
        if (!contextMenu) return;
        contextMenu.addEventListener("popupshowing", this);
     //   that.unloadlisteners.push("contextviewpageinfo");
    },
   
    handleEvent(e) {
        if (gContextMenu.isTextSelected || gContextMenu.onImage || gContextMenu.onLink || gContextMenu.webExtBrowserType === "popup") return;
        if ( document.getElementById("viewPageInf") ) return; 
        var menuitem = document.createXULElement("menuitem");
        menuitem.setAttribute("id", "viewPageInf")
        menuitem.setAttribute("label", "Информация о странице");
        menuitem.setAttribute("oncommand", "_viewPageInfo();");
        menuitem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACp0lEQVQ4jV2TPW9cVRCGn3fOuffu9Xo3TnCEkANYQotB2WJpUqWwJSqIUuQPRKKlsAUFpeUmEpXXEv+ACClFitQowmUIMmxASowIkjuQk9jr/fDd7F3fQ7HWdcxI04zmfc47RzPif9G4cXdR0iqy5flL9VYRAoe9rCNpG9nW7v1be2/2qxR+/v0c0vp7C/NrV5euMCkijoYTXucnEALDYcaLwx7DLGsjbTy7d7NbAk7FP12/ttSq1uZ48vyYLA/UZhwg+qMCZ5A6GGVDesODDtLK0x8+69rUh9avX1tqWVzn0dMhWR4A8eDOxzy48xEyEWQcB4O0Tlq73JK5dQBr3Li7+P7C/NpsbY4nf2dTTxKYyhnNG/KGeQfeEVXrRJXqWvP2w0UvafXq0rv8+vz4TCwhJz795s/p62ZlHQkJ4uoFTnqvVj2y5UnwZOP8XNPj75rlTze/3MV5YU4IoQCJS5Bzy3b5rXrraDgBQQEMRgUH/QmNL/4oAXHiiSueJPUkM554JmK2FlGppC1fBBjnBeNJ4HAwQWZEicN7KwFRxeHjaU1mSDCbBIZ9jx0cHXfyyQkvD3NCAHPCnOEid85BUvEkMxGV6jQvzkVk45OOSdp+dTDAOZDpFCCcK3cMnziiiidJp+JaPcZZgZzfNmRbR4MBl2aENE0zIXc2go8cUeKJU0+lGvPhlYh/9kfI3Jbt3r+1N85ftykyUkcJ6Ww2SsCPX7+Nc4aPHY2FiH5vzL8vx+2dzeaeP93Ejfykv+zMtwKzAHzy1V8kaVTOXavFfDAP3f0BP+8cdGS2AWAAz+7d7CKtSL22D11U5MQBqha4GAfeqQYuKOP33/Z59PhFmxBWfvm2cXZMb0bz9sNFma3K+eUkSVs+dozyoiPnt2Vua2ezee6c/wN/E94boB6vcgAAAABJRU5ErkJggg==");
        menuitem.className = "menuitem-iconic";
        menuitem._viewPageInfo = this.viewPageInfo.bind(this);

        addDestructor(function() { contextMenu.removeChild( menuitem ) });

        (this.contextMenu.querySelector("#context-viewsource") || this.contextMenu.lastElementChild).after(menuitem);
        this.handleEvent = () => menuitem.hidden = (gContextMenu.isTextSelected || gContextMenu.onImage || gContextMenu.onLink || gContextMenu.webExtBrowserType === "popup");
    },
    viewPageInfo() {
        BrowserCommands.pageInfo(
            gContextMenu.contentData.docLocation,
            "generalTab",
            gContextMenu.PageInfo,
            null,
            gContextMenu.browser
        );
    },
}).init(this);


Я считаю что в этом коде слишком перемудрено
 
И вот что заметил если использую кнопку Source Editor, которую недавно подправили, в ошибках при редактировании любой кнопки в ошибках показывает такое сообщение -TypeError: this.cssProperties is undefined, хотя оно не на что не влияет
.
Еще один момент. Есть код. Там ошибка, которая тоже не на что не влияет - Uncaught Error: Action with ID 'TranslateBufer1' already added, опять же при редактировании этой кнопки
скрытый текст

Выделить код

Код:

((id, g) => addDestructor(reason => id in g && g[id].destroy(reason)) || id in g || ({
    actions: [{
        title: "Перевод из буфера",
        tooltip: "Перевод из буфера",
        iconURL: gticon,
        id: "TranslateBufer1",
        _insertBeforeActionID: "copyURL",

        onCommand: (e, btn) => ujs_google_translat('auto|ru')
    }],
    init() {
        g[id] = this;
        this.actions = this.actions.map(action => {
            action.extensionID = "custombuttons@xsms.org";
            return g.PageActions.addAction(new g.PageActions.Action(action));
        });
    },
    destroy(reason) {
        if (reason[5] != "e") return;
        delete g[id];
        for(var action of this.actions) action.remove();
    }
}).init())(
    "CBPageActionsMaker", ChromeUtils.importESModule("resource:///modules/PageActions.sys.mjs", {})
);


И еще можно на примере показать как добавлять в новый сайдбар (боковую панель) элементы, на пример самое простое - загрузки

Отредактировано Andrey_Krropotkin (28-03-2025 07:39:48)

Отсутствует

 

№17307Вчера 10:49:11

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 47
UA: unknown 0.0

Re: Custom Buttons

Чья кнопка ? Перестала менять ,кроме строки адреса...Раньше в любом поиске меняла....

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

Выделить код

Код:

(keybUtils => {
    var btn = this;
    var listener = {
        handleEvent(e) {
            if(e.target != btn)
                return;
            e.preventDefault();
            e.stopPropagation();
            this.switch();
        },
        switch() {
            var br = document.activeElement;
            br && br.localName == "browser" && br.isRemoteBrowser
                ? br.messageManager.loadFrameScript(this.url, false)
                : this.keybUtils.switchSelKeybLayout();
        },
        get url() {
            delete this.url;
            return this.url = `data:;charset=utf-8,(${
                encodeURIComponent(keybUtils)
            }).switchSelKeybLayout()`;
        },
        get keybUtils() {
            delete this.keybUtils;
            var url = "data:;charset=utf-8,this.keybUtils = " + encodeURIComponent(keybUtils);
            Services.scriptloader.loadSubScript(url, this);
            this.keybUtils.button = btn;
            this.keybUtils.getFocusedElement = function(_subCall, _focusFixed) {
                if(
                    !_focusFixed
                    && "closeMenus" in window
                    && document.commandDispatcher.focusedElement == this.button
                ) {
                    closeMenus(this.button);
                    setTimeout(function(_this) {
                        _this.switchSelKeybLayout(_subCall, true);
                    }, 0, this);
                    return;
                }
                return document.commandDispatcher.focusedElement;
            }
            return this.keybUtils;
        }
    };
    if(btn instanceof XULElement && addEventListener.length > 3) {
        addEventListener("command", listener, true, this.parentNode);
    }
    listener.switch();
})(`{
    //== Options
    noSelBehavior: { // Shift+Home
        ctrlKey:  false,
        altKey:   false,
        shiftKey: true,
        metaKey:  false,
        keyCode:  KeyEvent.DOM_VK_HOME,
        charCode: 1
    },
    // 0 - do nothing
    // 1 - convert all text
    // Or use object like following to simulate "keypress" event:
    /*
    noSelBehavior: { // Ctrl+Shift+Left
        ctrlKey:  true,
        altKey:   false,
        shiftKey: true,
        metaKey:  false,
        keyCode:  KeyEvent.DOM_VK_LEFT,
        charCode: 0
    }
    */
    convTableForward: { // ru -> en
        "\\"": "@",
        ":": "^",
        ";": "$",
        "?": "&",
        ",": "?",
        "/": "|",
        ".": "/",
        "э": "'",
        "б": ",",
        "ю": ".",
        "Ж": ":",
        "ж": ";",
        "Б": "<",
        "Ю": ">",
        "Э": "\\"",
        "х": "[",
        "ъ": "]",
        "ё": "\`",
        "Х": "{",
        "Ъ": "}",
        "Ё": "~",
        "№": "#",
        "Ф": "A",
        "ф": "a",
        "И": "B",
        "и": "b",
        "С": "C",
        "с": "c",
        "В": "D",
        "в": "d",
        "У": "E",
        "у": "e",
        "А": "F",
        "а": "f",
        "П": "G",
        "п": "g",
        "Р": "H",
        "р": "h",
        "Ш": "I",
        "ш": "i",
        "О": "J",
        "о": "j",
        "Л": "K",
        "л": "k",
        "Д": "L",
        "д": "l",
        "Ь": "M",
        "ь": "m",
        "Т": "N",
        "т": "n",
        "Щ": "O",
        "щ": "o",
        "З": "P",
        "з": "p",
        "Й": "Q",
        "й": "q",
        "К": "R",
        "к": "r",
        "Ы": "S",
        "ы": "s",
        "Е": "T",
        "е": "t",
        "Г": "U",
        "г": "u",
        "М": "V",
        "м": "v",
        "Ц": "W",
        "ц": "w",
        "Ч": "X",
        "ч": "x",
        "Н": "Y",
        "н": "y",
        "Я": "Z",
        "я": "z",
        __proto__: null
    },
    //== End of options

    get convTableBackward() {
        var ctb = { __proto__: null };
        var ctf = this.convTableForward;
        for(var c in ctf)
            ctb[ctf[c]] = c;
        delete this.convTableBackward;
        return this.convTableBackward = ctb;
    },
    inPrimaryLayout: function(s) {
        for(var i = 0, l = s.length; i < l; ++i) {
            var c = s.charAt(i);
            if(c in this.convTableForward)
                return true;
            if(c in this.convTableBackward)
                return false;
        }
        return false;
    },
    switchKeybLayout: function(s, convTable) {
        var res = "";
        for(var i = 0, l = s.length; i < l; ++i) {
            var c = s.charAt(i);
            res += c in convTable ? convTable[c] : c;
        }
        return res;
    },
    getFocusedElement: function() {
        return Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager)
            .getFocusedElementForWindow(content, true, {});
    },
    switchSelKeybLayout: function(_subCall, _focusFixed) {
        var fe = this.getFocusedElement(_subCall, _focusFixed);
        if(!fe)
            return;
        if(fe instanceof HTMLInputElement || fe instanceof HTMLTextAreaElement) {
            var ta = fe;
            try {
                var val = ta.value;
                var sel = val.substring(ta.selectionStart, ta.selectionEnd);
            }
            catch(e) { // Non-text HTMLInputElement
                return;
            }
            if(!sel && val && this.noSelBehavior && !_subCall) {
                if(this.noSelBehavior == 1) {
                    ta.selectionStart = 0;
                    ta.selectionEnd = val.length;
                    sel = val;
                }
                else {
                    this.handleNoSel(ta);
                    return;
                }
            }
            if(!sel)
                return;
            var res = this.switchKeybLayout(
                sel,
                this.inPrimaryLayout(sel)
                    ? this.convTableForward
                    : this.convTableBackward
            );
            if(res != sel)
                this.insertText(ta, res);
        }
        else if(fe.contentEditable == "true") {
            var doc = fe.ownerDocument;

            var docURI = doc.documentURI;
            if(
                docURI.substr(0, 5) == "data:"
                && docURI.indexOf("chrome://browser/skin/devtools/") != -1
            ) {
                //~ todo: seems like we only can use paste from clipboard here...
                return;
            }

            var sel = doc.defaultView.getSelection();
            var rng = sel.rangeCount && sel.getRangeAt(0);
            var tmpNode;
            if(!rng || rng.collapsed) {
                if(!this.noSelBehavior || _subCall)
                    return;
                if(this.noSelBehavior == 1) {
                    var r = doc.createRange();
                    r.selectNodeContents(fe);
                    sel.removeAllRanges();
                    sel.addRange(r);
                    tmpNode = fe.cloneNode(true);
                }
                else {
                    this.handleNoSel(fe);
                    return;
                }
            }
            else {
                tmpNode = doc.createElementNS("http://www.w3.org/1999/xhtml", "div");
                tmpNode.appendChild(rng.cloneContents());
            }

            var orig = tmpNode.innerHTML;
            var convTable = this.inPrimaryLayout(tmpNode.textContent)
                ? this.convTableForward
                : this.convTableBackward;

            var _this = this;
            var parseChildNodes = function(node) {
                if(node instanceof Element) {
                    var childNodes = node.childNodes;
                    for(var i = childNodes.length - 1; i >= 0; --i)
                        parseChildNodes(childNodes[i]);
                }
                else if(node.nodeType == node.TEXT_NODE) {
                    var text = node.nodeValue;
                    var newText = _this.switchKeybLayout(node.nodeValue, convTable);
                    if(newText != text)
                        node.parentNode.replaceChild(doc.createTextNode(newText), node);
                }
            }
            parseChildNodes(tmpNode);

            var res = tmpNode.innerHTML;
            if(res != orig)
                doc.execCommand("insertHTML", false, res);
        }
    },
    handleNoSel: function(node) {
        this.select(node);
        this.switchSelKeybLayout(true);
    },
    select: function(node) {
        var e = this.noSelBehavior;
        if(!e || typeof e != "object")
            return;
        var evt = node.ownerDocument.createEvent("KeyboardEvent");
        evt.initKeyEvent(
            "keypress", true /*bubbles*/, true /*cancelable*/, node.ownerDocument.defaultView,
            e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,
            e.keyCode, e.charCode
        );
        node.dispatchEvent(evt);
    },
    insertText: function(ta, text) {
        //var editor = ta.QueryInterface(Components.interfaces.nsIDOMNSEditableElement).editor
        var editor = ta.editor
            .QueryInterface(Components.interfaces.nsIPlaintextEditor || Ci.nsIEditor);
        if(editor.flags & editor.eEditorReadonlyMask)
            return;

        var sTop = ta.scrollTop;
        var sHeight = ta.scrollHeight;
        var sLeft = ta.scrollLeft;
        // var sWidth = ta.scrollWidth;

        if(text)
            editor.insertText(text);
        else
            editor.deleteSelection(0, 0);

        ta.scrollTop = sTop + (ta.scrollHeight - sHeight);
        ta.scrollLeft = sLeft; // + (ta.scrollWidth - sWidth);
    }
}`);

Отсутствует

 

№17308Сегодня 01:41:04

green25
Участник
 
Группа: Members
Зарегистрирован: 14-12-2024
Сообщений: 47
UA: unknown 0.0

Re: Custom Buttons

Dumby
Добавляю закладку !
1.png
Стоит появится этому и все identity-icon-box - пропадает ?

1.png
СНЯТ ВОПРОС  Было:
#urlbar:not(.searchButton) > #urlbar-input-container > #identity-box[pageproxystate="invalid"] {
  pointer-events:  none;
  -moz-user-focus: ignore;
}
Надо:
#urlbar:not(.searchButton) > #urlbar-input-container > #identity-box[pageproxystate="invalid"] {
  pointer-events: inherit;
  -moz-user-focus: ignore;
}

Отредактировано green25 (Сегодня 08:19:04)

Отсутствует

 

№17309Сегодня 13:50:49

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

Re: Custom Buttons

Andrey_Krropotkin пишет

Я считаю что в этом коде слишком перемудрено

А можно поподробнее?
По пунктам, где именно ты считаешь перемудрено.

в ошибках при редактировании любой кнопки в ошибках показывает такое сообщение -TypeError: this.cssProperties is undefined

Это, видимо, из-за options.cssInHelp
Либо переключить в false, либо, если прям очень надо,
то попробовать дописать после var optsOvr = options.codeMirror;

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

Выделить код

Код:

//
					if (isCSS) {
						var {generateCssProperties} = require("resource://devtools/server/actors/css-properties.js");
						var {CssProperties, normalizeCssData} = require("resource://devtools/client/fronts/css-properties.js");
						opts.cssProperties = new CssProperties(normalizeCssData({properties: generateCssProperties(document)}));
					}

Uncaught Error: Action with ID 'TranslateBufer1' already added

Ну так ChromeUtils.importESModule()
не возвращает ничего даже близко похожего на g


Можно разделить, PageActions отдельно,
а g, допустим, пусть будет SystemGlobal

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

Выделить код

Код:

((id, g, pa) => addDestructor(reason => id in g && g[id].destroy(reason)) || id in g || ({
    actions: [{
        title: "Перевод из буфера",
        tooltip: "Перевод из буфера",
        iconURL: gticon,
        id: "TranslateBufer1",
        _insertBeforeActionID: "copyURL",

        onCommand: (e, btn) => ujs_google_translat('auto|ru')
    }],
    init() {
        g[id] = this;
        this.actions = this.actions.map(action => {
            action.extensionID = "custombuttons@xsms.org";
            return pa.addAction(new pa.Action(action));
        });
    },
    destroy(reason) {
        if (reason[5] != "e") return;
        delete g[id];
        for(var action of this.actions) action.remove();
    }
}).init())(
    "CBPageActionsMaker", Cu.getGlobalForObject(Cu), PageActions
);

на примере показать как добавлять в новый сайдбар (боковую панель) элементы, на пример самое простое - загрузки

Нет такого «как добавлять».
Как-то насильно запихать разве что.
И, из кнопки это не слишком удобно, возможно что-то типа

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

Выделить код

Код:

(() => {
	var url = "about:downloads";
	var img = "chrome://browser/skin/downloads/downloads.svg";

	var id = "viewDownloadsSidebar";
	var fluentFile = "browser/appmenu.ftl";
	var fluentLabel = "appmenuitem-downloads";

	var sc = SidebarController;

	var sep = document.querySelector("#sidebarMenu-popup > menuseparator");
	if (sep) {
		var switcher = document.createXULElement("menuitem");
		switcher.dataset.l10nId = fluentLabel;
		switcher.id = "sidebar-switcher-downloads";
		switcher.addEventListener("command", () => sc.toggle(id));
		sep.before(switcher);
	}
	var sb = sc.makeSidebar({
		url,
		iconUrl: img,
		elementId: switcher?.id,
		menuL10nId: fluentLabel,
		revampL10nId: fluentLabel,
		menuId: "menu_downloadsSidebar"
	});
	var popup = document.getElementById("viewSidebarMenu");
	var menuitem = sc.createMenuItem(id, sb);
	popup.insertBefore(menuitem,popup.querySelector(".webextension-menuitem"));

	var maybeAddSidebar = sb => {
		var bars = sc.sidebars;
		bars.has(id) || bars.set(id, sb);
	}
	Object.defineProperty(sb, "hasOwnProperty", {value(prop) {
		prop == "extensionId" && setTimeout(maybeAddSidebar, 0, sb);
		return Object.hasOwn(sb, prop);
	}, configurable: true, enumerable: true});

	sc.sidebars.set(id, sb);

	var br = sc.browser;
	var ls = `[href="${fluentFile}"]`;
	try {var tools = toolsNameMap;} catch {tools = defaultTools;}

	Object.defineProperty(tools, id, {get() {
		var doc = br.contentDocument;
		var cust = doc?.querySelector("sidebar-customize");
		if (cust && !doc.head.querySelector(ls)) {
			var link = doc.createElement("link");
			link.rel = "localization";
			link.href = fluentFile;
			doc.head.append(link);
			link.l10nMap = cbu.dbg.ref("l10nMap", cust.constructor, 0).set(id, fluentLabel);
		}
		return "downloads";
	}, configurable: true, enumerable: true});

	var sm = sc.sidebarMain;
	var initSM = setTimeout.bind(null, () => {
		sc._toolsAndExtensions = null;
		sm.fluentStrings.addResourceIds([fluentFile]);
		window.dispatchEvent(new CustomEvent("SidebarItemAdded"));
	});

	if (customElements.get("sidebar-main")) initSM();
	else {
		var resolver = Promise.withResolvers();
		Promise.any([customElements.whenDefined("sidebar-main"), resolver.promise])
			.then(add => add && initSM());
	}

	addDestructor(reason => {
		if (reason[5] != "e") return;

		if (sc.isOpen) {
			var cid = sc.currentID;
			if (cid == id) sc.hide();
			else if (cid == "viewCustomizeSidebar") {
				var link = br.contentDocument.head.querySelector(ls);
				link.l10nMap.delete(id);
				link.remove();
			}
		}
		menuitem.remove();
		switcher?.remove();

		sc.sidebars.delete(id);
		sc.toolsAndExtensions.delete(id);

		resolver?.resolve();
		sm.fluentStrings?.removeResourceIds([fluentFile]);

		window.dispatchEvent(new CustomEvent("SidebarItemRemoved"));		
	});
})();

green25 пишет

Чья кнопка ?

Ничья. Это мод-перемод одной из наследия Infocatcher
Андрей когда-то нечто подобное спрашивал,
но там весьма развесисто в смысле правок.

Отсутствует

 

Board footer

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