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

Общайтесь со знакомыми и друзьями в нашей группе в Контакте.

№1692630-06-2023 17:39:24

Farby
Участник
 
Группа: Members
Зарегистрирован: 21-11-2012
Сообщений: 249
UA: Google 2.1

Re: Custom Buttons

в 115`ом перестала работать jsm`ка, может и раньше, но у меня получилось так

AppMenuTbbSaveHTMLChild.jsm

Выделить код

Код:

/*

	write(path, html) {
		if (typeof IOUtils != "object") {
			var {OS} = ChromeUtils.import("resource://gre/modules/osfile.jsm");
			var IOUtils = {writeUTF8: (path, txt) => OS.File.writeAtomic(path, new TextEncoder().encode(txt))};
		}
		(this.write = IOUtils.writeUTF8 || IOUtils.writeAtomicUTF8)(path, html);
*/
	async write(path, html) {
		try { // if (typeof IOUtils != "object") don`t access to...
			var {OS} = ChromeUtils.import("resource://gre/modules/osfile.jsm");
			var OSFile = {writeUTF8: (path, txt) => OS.File.writeAtomic(path, new TextEncoder().encode(txt))};
		} catch {}
		(this.write = await IOUtils.writeUTF8 || OSFile.writeAtomicUTF8)(path, html);

PS: хотя может это только у меня...

Отредактировано Farby (30-06-2023 17:41:33)


Жизнь иногда такое выкидывает, что хочется подобрать...

На форуме

 

№1692730-06-2023 23:36:30

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

Re: Custom Buttons

Farby пишет

может и раньше

Вряд ли. Дело в том, что функция написана неправильно,
из-за непонимания того, как работает var. Вроде бы основы, но из неочевидных.


Из-за этой var-записи typeof IOUtils всегда был "undefined", поэтому всегда использовался osfile.jsm
А в 115 его удалили: Bug 1776480 - Remove OS.File, и косяк вылез наружу.
Лучше, наверно, было бы так написать

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

Выделить код

Код:

//.....
	write(path, html) {
		if (typeof IOUtils == "object")
			var write = IOUtils.writeUTF8 || IOUtils.writeAtomicUTF8; // Fx 85+ || 82-84
		if (!write) { // Fx 79-81
			var {OS} = ChromeUtils.import("resource://gre/modules/osfile.jsm");
			write = (path, txt) => OS.File.writeAtomic(path, new TextEncoder().encode(txt));
		}
		(this.write = write)(path, html);
	}


А если всякое вокруг Firefox 79-84 не нужно, то можно прямо в save()
заменить this.write на IOUtils.writeUTF8 (и сам write() тогда удалить).

Отсутствует

 

№1692801-07-2023 09:32:00

Farby
Участник
 
Группа: Members
Зарегистрирован: 21-11-2012
Сообщений: 249
UA: Google 2.1

Re: Custom Buttons

Dumby пишет

Из-за этой var-записи typeof IOUtils всегда был "undefined"

Спасибо за объяснения, а то уже начал думать что у меня лыжи не едут или асфальт не красивый!

Добавлено 01-07-2023 09:34:38
О, забыл и за код конечно!

Отредактировано Farby (01-07-2023 09:34:38)


Жизнь иногда такое выкидывает, что хочется подобрать...

На форуме

 

№1692903-07-2023 09:18:55

Viatcheslav
Участник
 
Группа: Members
Откуда: г. Бобруйск, Беларусь
Зарегистрирован: 23-11-2016
Сообщений: 312
UA: Firefox 88.0

Re: Custom Buttons

Есть такая кнопка

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

Выделить код

Код:

// Убрать замыливание последних букв и вернуть многоточие в названии вкладок.
// https://forum.mozilla-russia.org/viewtopic.php?pid=749234#p749234
((func, destroy) => {
    [...gBrowser.tabs].forEach(func);
    addEventListener("TabOpen", func, false, gBrowser.tabContainer);
    addEventListener("TabAttrModified", func, false, gBrowser.tabContainer);
    addDestructor(() => [...gBrowser.tabs].forEach(destroy));
})(e => {
    var tab = e.target || e;
    var lab = tab.textLabel;
    if (!lab.hasAttribute("crop")) {
        lab.setAttribute("crop", "end");
        lab.setAttribute("flex", "1");
    }
    else if (lab.value == tab.label) return;
    lab.setAttribute("value", tab.label);
}, tab => {
    var lab = tab.textLabel;
    for(var attr of ["crop", "flex", "value"]) lab.removeAttribute(attr);
});

На  [firefox] 114 и СВ 0.0.7.0.0.31 она перестала работать.
Пожалуйста, если можно, подправьте её, или адаптируйте под UCF.
Спасибо за помощь :beer:

Отсутствует

 

№1693003-07-2023 12:55:05

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

Re: Custom Buttons

Viatcheslav
Перестало работать в [firefox] 109.
На мой запрос Dumby посоветовал сделать это стилем: https://forum.mozilla-russia.org/viewto … 93#p803493


«The Truth Is Out There»

Отсутствует

 

№1693104-07-2023 05:43:53

Viatcheslav
Участник
 
Группа: Members
Откуда: г. Бобруйск, Беларусь
Зарегистрирован: 23-11-2016
Сообщений: 312
UA: Firefox 88.0

Re: Custom Buttons

unter_officer пишет

На мой запрос Dumby посоветовал сделать это стилем: https://forum.mozilla-russia.org/viewto … 93#p803493

У меня в таком виде не завелось... :(

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

Выделить код

Код:

.tab-label-container {
    mask: none !important;
}
.tab-secondary-label {
    overflow: hidden !important;
}
.tab-secondary-label > .tab-icon-sound-label,
.tab-label-container > .tab-label {
    display: inline-block;
    max-width: 100% !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
    white-space: nowrap !important;
    min-width: 0 !important;
    line-height: 1.25em !important;
    height: 1.25em !important;
    margin: 0 !important;
}
.tab-close-button {
    padding: 5px !important;
    width: 20px !important;
    height: 20px !important;
}
.tab-close-button:not(:hover) {
    padding-inline-start: 0 !important;
    width: 15px !important;
}

Может быть, первой строкой нужно добавить пространство имён? :sick:

Отсутствует

 

№1693204-07-2023 15:17:31

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

Re: Custom Buttons

А так ли они нужны эти точки?
#tabbrowser-tabs .tab-label-container[textoverflow][labeldirection="ltr"]:not([pinned]) {
    mask-image: none !important; /* !!! del.fadein */
}

Отсутствует

 

№1693304-07-2023 19:07:08

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

Re: Custom Buttons

в 115 перестала работать кнопка Undo Close Tab

скрытый текст
// http://infocatcher.ucoz.net/js/cb/undoCloseTabs.js
// https://forum.mozilla-russia.org/viewtopic.php?id=56267
// https://github.com/Infocatcher/Custom_Buttons/tree/master/Undo_Close_Tabs

// Undo Close Tabs button for Custom Buttons
// (code for "initialization" section)

// (c) Infocatcher 2009-2021
// version 0.3.3.3 - 2021-09-04

var options = {
    menuTemplate: [
        "closedWindows",
        "separator",
        "restoreClosedWindows",
        "clearClosedWindows",
        "separator",
        "closedTabs",
        "separator",
        "restoreClosedTabs",
        "clearClosedTabs",
        "separator",
        "clearAll",
        "separator",
        "restoreLastSession",
        "separator",
        "buttonMenu"
    ],
    showInTabContextMenu: false,
    /*
    menuTemplateTabContext: [ // like menuTemplate
        "closedTabs",
        "separator",
        "restoreClosedTabs",
        "clearClosedTabs"
    ],
    */
    windowItemTemplate: "(%count) %title",
    windowSelectedTabPrefix: "*",
    buttonTipTemplate: ["header", "title", "url", "closedAt"],
    itemTipTemplate: ["title", "url", "closedAt"],
    hideRestoreAllForSingleEntry: false,
    allowDeleteEntries: true,
    accesskeys: { // Empty string ("") to disable or string with possible values ("0123...", "abcd...")
        closedTabs: "",
        closedWindows: ""
    },
    accesskeySeparator: " ", // <accesskey><separator><label>
    openMenuOnMouseover: false,
    useMenu: false,
    rightClickToUndoCloseTab: false // Useful with "useMenu: true"
};

function _localize(sid) {
    var strings = {
        en: {
            restoreTab: "Restore the most recently closed tab",

            restoreAllTabs: "Restore all tabs",
            restoreAllTabsAccesskey: "t",
            clearTabsHistory: "Clear history of closed tabs",
            clearTabsHistoryAccesskey: "b",

            restoreAllWindows: "Restore all windows",
            restoreAllWindowsAccesskey: "w",
            clearWindowsHistory: "Clear history of closed windows",
            clearWindowsHistoryAccesskey: "d",

            clearAllHistory: "Clear all history",
            clearAllHistoryAccesskey: "C",

            restoreLastSession: "Restore last session",
            restoreLastSessionAccesskey: "s",

            deleteUndoEntry: "Delete",

            buttonMenu: "Button menu",
            buttonMenuAccesskey: "m",

            tabContextMenu: "Recently Closed Tabs",
            tabContextMenuAccesskey: "y",

            itemTip: "%ago ago, %date",
            day: "d"
        },
        ru: {
            restoreTab: "Восстановить последнюю закрытую вкладку",

            restoreAllTabs: "Восстановить все вкладки",
            restoreAllTabsAccesskey: "л",
            clearTabsHistory: "Очистить историю закрытых вкладок",
            clearTabsHistoryAccesskey: "д",

            restoreAllWindows: "Восстановить все окна",
            restoreAllWindowsAccesskey: "о",
            clearWindowsHistory: "Очистить историю закрытых окон",
            clearWindowsHistoryAccesskey: "н",

            clearAllHistory: "Очистить всю историю",
            clearAllHistoryAccesskey: "ч",

            restoreLastSession: "Восстановить последнюю сессию",
            restoreLastSessionAccesskey: "с",

            deleteUndoEntry: "Удалить",

            buttonMenu: "Меню кнопки",
            buttonMenuAccesskey: "М",

            tabContextMenu: "Недавно закрытые вкладки",
            tabContextMenuAccesskey: "о",

            itemTip: "%ago назад, %date",
            day: "д"
        }
    };
    var locale = (function() {
        if("Services" in window && "locale" in Services) {
            var locales = Services.locale.requestedLocales // Firefox 64+
                || Services.locale.getRequestedLocales && Services.locale.getRequestedLocales();
            if(locales)
                return locales[0];
        }
        var prefs = "Services" in window && Services.prefs
            || Components.classes["@mozilla.org/preferences-service;1"]
                .getService(Components.interfaces.nsIPrefBranch);
        function pref(name, type) {
            return prefs.getPrefType(name) != prefs.PREF_INVALID ? prefs["get" + type + "Pref"](name) : undefined;
        }
        if(!pref("intl.locale.matchOS", "Bool")) { // Also see https://bugzilla.mozilla.org/show_bug.cgi?id=1414390
            var locale = pref("general.useragent.locale", "Char");
            if(locale && locale.substr(0, 9) != "chrome://")
                return locale;
        }
        return Components.classes["@mozilla.org/chrome/chrome-registry;1"]
            .getService(Components.interfaces.nsIXULChromeRegistry)
            .getSelectedLocale("global");
    })().match(/^[a-z]*/)[0];
    _localize = function(sid) {
        return strings[locale] && strings[locale][sid] || strings.en[sid] || sid;
    };
    return _localize.apply(this, arguments);
}

var JSON = "JSON" in window
    ? {
        parse: function(arg) {
            return typeof arg == "string"
                ? (JSON = window.JSON).parse(arg)
                : (this.parse = function(obj) {
                    return obj;
                }) && arg;
        }
    }
    : "nsIJSON" in Components.interfaces
        ? {
            parse: function(s) {
                return Components.classes["@mozilla.org/dom/json;1"]
                    .createInstance(Components.interfaces.nsIJSON)
                    .decode(s);
            }
        }
        : {
            parse: function(s) {
                return Components.utils.evalInSandbox("(" + s + ")", new Components.utils.Sandbox("about:blank"));
            }
        };

this.onclick = function(e) {
    if(e.target != this)
        return;
    if(e.button == 1 || e.button == 0 && (e.ctrlKey || e.shiftKey || e.altKey || e.metaKey))
        this.undoCloseTabsList.clearAllLists();
    else if(
        e.button == 0
        || e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey
            && this.undoCloseTabsList.options.rightClickToUndoCloseTab
    ) {
        if(
            e.button == 0 && !this.undoCloseTabsList.options.useMenu
            || e.button == 2 && this.undoCloseTabsList.options.rightClickToUndoCloseTab
        ) {
            if(this.undoCloseTabsList.closedTabCount)
                this.undoCloseTabsList.undoCloseTab();
            else
                this.undoCloseTabsList.drawUndoList() && this.undoCloseTabsList.showMenu(e);
        }
        // Allow use "command" section only from hotkey:
        e.preventDefault();
        e.stopPropagation();
    }
};
if(!this.hasOwnProperty("defaultContextId"))
    this.defaultContextId = this.getAttribute("context") || "custombuttons-contextpopup";
this.onmousedown = function(e) {
    if(e.target != this)
        return;
    if(this.undoCloseTabsList.options.useMenu) {
        if(e.button == 0)
            this.undoCloseTabsList.drawUndoList();
    }
    else if(e.button == 2) {
        var showCbMenu = e.ctrlKey || e.shiftKey || e.altKey || e.metaKey || !this.undoCloseTabsList.drawUndoList();
        this.setAttribute(
            "context",
            showCbMenu
                ? this.defaultContextId
                : this.undoCloseTabsList.mpId
        );
    }
};
this.onmouseover = function(e) {
    if(e.target != this)
        return;
    if(!this.disabled)
        this.undoCloseTabsList.updUI();
    this.undoCloseTabsList.options.useMenu && 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
                && this.undoCloseTabsList.drawUndoList()
            ) {
                node.open = false;
                this.open = true;
                return true;
            }
            return false;
        },
        this
    );
    if(
        this.undoCloseTabsList.options.openMenuOnMouseover
        && this.undoCloseTabsList.drawUndoList()
    )
        this.undoCloseTabsList.openMenu();
};

this.undoCloseTabsList = {
    button: this,
    options: options,
    mpId: this.id + "-context",
    cmId: this.id + "-contextSub",
    tcmId: this.id + "-tabContextMenu",
    tipId: this.id + "-tooltip",
    errPrefix: "[Custom Buttons :: Undo Close Tabs List]: ",
    get mp() {
        var btn = this.button;
        var mp = btn.getElementsByTagName("menupopup");
        mp = mp.length && mp[0];
        mp && mp.parentNode.removeChild(mp);
        mp = this.createElement("menupopup", {
            id: this.mpId,
            onclick: "this.parentNode.undoCloseTabsList.checkForMiddleClick(event);",
            onpopupshowing: "if(event.target == this) document.popupNode = this.parentNode;",
            onpopuphidden: "if(event.target == this) document.popupNode = null;"
        });
        if(this.cm)
            mp.setAttribute("context", this.cmId);
        var tb = btn.parentNode;
        if(
            this.options.useMenu
            && 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");
        }
        delete this.mp;
        return this.mp = btn.appendChild(mp);
    },
    get useCentextMenu() {
        delete this.useCentextMenu;
        return this.useCentextMenu = this.options.allowDeleteEntries
            && ("forgetClosedTab" in this.ss || "forgetClosedWindow" in this.ss);
    },
    get cm() {
        delete this.cm;
        if(!this.useCentextMenu)
            return this.cm = null;
        var cm = document.getElementById(this.cmId);
        cm && cm.parentNode.removeChild(cm);
        cm = this.createElement("menupopup", {
            id: this.cmId,
            onpopupshowing: "return this.undoCloseTabsList.canDeleteUndoEntry(this.triggerNode || document.popupNode);"
        });
        var mi = this.createElement("menuitem", {
            oncommand: "this.parentNode.undoCloseTabsList.deleteUndoEntry(this.parentNode.triggerNode || document.popupNode);",
            label: _localize("deleteUndoEntry"),
            closemenu: "single"
        });
        cm.appendChild(mi);
        cm.undoCloseTabsList = this;
        return this.cm = document.getElementById("mainPopupSet").appendChild(cm);
    },
    get cbMenu() {
        var cbPopup = document.getElementById(this.button.defaultContextId);
        if(!cbPopup) {
            Components.utils.reportError(this.errPrefix + "cb menu not found");
            return this.cbMenu = null;
        }
        cbPopup = cbPopup.cloneNode(true);
        var id = "-" + this.button.id.match(/\d*$/)[0] + "-cloned";
        cbPopup.id += id;
        Array.prototype.slice.call(cbPopup.getElementsByAttribute("id", "*")).forEach(function(node) {
            node.id += id;
        });
        var menu = this.createElement("menu", {
            label: _localize("buttonMenu"),
            accesskey: _localize("buttonMenuAccesskey")
        });
        menu.appendChild(cbPopup);
        cbPopup.setAttribute(
            "onpopupshowing",
            '\
            var btn = document.popupNode = this.parentNode.parentNode.parentNode\n\
                .undoCloseTabsList.button;\n\
            custombutton.setContextMenuVisibility(btn);'
        );
        delete this.cbMenu;
        return this.cbMenu = menu;
    },
    get ss() {
        delete this.ss;
        return this.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
    },
    get appInfo() {
        delete this.appInfo;
        return this.appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
            .getService(Components.interfaces.nsIXULAppInfo);
    },
    get appVersion() {
        delete this.appVersion;
        return this.appVersion = parseFloat(this.appInfo.version);
    },
    get platformVersion() {
        delete this.platformVersion;
        return this.platformVersion = parseFloat(this.appInfo.platformVersion);
    },
    get appName() {
        delete this.appName;
        return this.appName = this.appInfo.name;
    },

    init: function() {
        window.addEventListener("TabClose",       this, false);
        window.addEventListener("SSTabRestoring", this, false);
        window.addEventListener("unload",         this, false);
        if(this.appName == "SeaMonkey") // No SSTab* events in SeaMonkey
            window.addEventListener("TabOpen", this, false);
        setTimeout(function(_this) {
            _this.mp.addEventListener("DOMMenuItemActive",   _this, false);
            _this.mp.addEventListener("DOMMenuItemInactive", _this, false);
            _this.initTooltip();
        }, 50, this);
        this.addPbExitObserver(true);
        this.updUIGlobal();
        if(this.options.showInTabContextMenu) setTimeout(function(_this) {
            _this.initTabContext();
        }, 100, this);
    },
    initTabContext: function() {
        var origMi = this.tabContextUndoClose;
        if(!origMi) {
            LOG("Can't find \"Undo Close Tab\" item in tab context menu");
            return;
        }
        var menu = document.getElementById(this.tcmId);
        menu && menu.parentNode.removeChild(menu); // For SeaMonkey
        menu = this.createElement("menu", {
            id: this.tcmId,
            label: _localize("tabContextMenu"),
            accesskey: _localize("tabContextMenuAccesskey"),
            tooltip: this.tipId,
            popupsinherittooltip: "true"
        });
        menu.undoCloseTabsList = this;
        menu.onclick = function(e) {
            if(e.target != this)
                return;
            if(e.button == 1 || e.button == 0 && (e.ctrlKey || e.shiftKey || e.altKey || e.metaKey)) {
                if(this.undoCloseTabsList.closedTabCount) {
                    this.undoCloseTabsList.undoCloseTab();
                    closeMenus(this);
                }
            }
        };
        var origMp = this.mp;
        var mp = origMp.cloneNode(true);
        mp.id = this.button.id + "-tabContext";
        var _this = this;
        function drawUndoList() {
            var ok = false;
            var opts = _this.options;
            var origTemplate = opts.menuTemplate;
            opts.menuTemplate = opts.menuTemplateTabContext || origTemplate;
            _this.mp = mp;
            try {
                ok = _this.drawUndoList();
            }
            catch(e) {
                Components.utils.reportError(e);
            }
            opts.menuTemplate = origTemplate;
            _this.mp = origMp;
            return ok;
        }
        function updMenu() {
            if(drawUndoList())
                menu.removeAttribute("disabled");
            else
                menu.setAttribute("disabled", "true");
        }
        mp._updatePopup = function(e) {
            if(e.target != this)
                return;
            document.popupNode = _this.button;
            drawUndoList();
        };
        mp.setAttribute("onpopupshowing", "this._updatePopup(event);");
        mp.onclick = function(e) {
            _this.checkForMiddleClick(e, updMenu);
        };
        menu.appendChild(mp);
        addEventListener("popupshown", function(e) {
            if(e.target == e.currentTarget)
                setTimeout(updMenu, 0); // Pseudo async
        }, false, origMi.parentNode);
        addEventListener("DOMMenuItemActive",   this, false, mp);
        addEventListener("DOMMenuItemInactive", this, false, mp);
        origMi.parentNode.insertBefore(menu, origMi.nextSibling);
        origMi.setAttribute("hidden", "true");
    },
    initTooltip: function() {
        var tip = document.getElementById(this.tipId);
        tip && tip.parentNode.removeChild(tip);
        tip = this.tip = this.createElement("tooltip", {
            id: this.tipId,
            orient: "vertical",
            onpopupshowing: "return this.undoCloseTabsList.updTooltip(this, this.triggerNode || document.tooltipNode);",
            onpopuphiding: "this.cancelUpdateTimer();"
        });
        tip.undoCloseTabsList = this;
        tip._updateTimer = 0;
        tip.initUpdateTimer = function(fn, context) {
            if(this._updateTimer)
                clearInterval(this._updateTimer);
            this._updateTimer = setInterval(function() {
                fn.call(context);
            }, 1000);
        };
        tip.cancelUpdateTimer = function() {
            if(this._updateTimer) {
                clearInterval(this._updateTimer);
                this._updateTimer = 0;
            }
        };
        var btn = this.button;
        btn.removeAttribute("tooltiptext");
        btn.setAttribute("tooltip", this.tipId);
        btn.setAttribute("popupsinherittooltip", "true");
        document.getElementById("mainPopupSet").appendChild(tip);
        if(this.appVersion >= 61 && "getAnonymousElementByAttribute" in document) {
            var label = document.getAnonymousElementByAttribute(tip, "class", "tooltip-label");
            label && label.remove();
        }
    },
    _hasPbExitObserver: false,
    addPbExitObserver: function(add) {
        if(add == this._hasPbExitObserver || !("Services" in window))
            return;
        this._hasPbExitObserver = add;
        if(add)
            Services.obs.addObserver(this, "last-pb-context-exited", false);
        else
            Services.obs.removeObserver(this, "last-pb-context-exited");
    },
    destroy: function() {
        window.removeEventListener("TabClose",       this, false);
        window.removeEventListener("SSTabRestoring", this, false);
        window.removeEventListener("unload",         this, false);
        if(this.appName == "SeaMonkey")
            window.removeEventListener("TabOpen", this, false);
        this.mp.removeEventListener("DOMMenuItemActive",   this, false);
        this.mp.removeEventListener("DOMMenuItemInactive", this, false);
        this.addPbExitObserver(false);
        var menu = document.getElementById(this.tcmId);
        if(menu) {
            menu.parentNode.removeChild(menu);
            this.tabContextUndoClose.removeAttribute("hidden");
        }
        var tip = this.tip;
        tip && tip.parentNode && tip.parentNode.removeChild(tip);
    },
    handleEvent: function(e) {
        switch(e.type) {
            case "TabClose":
            case "SSTabRestoring":
            case "TabOpen":
                setTimeout(function(_this) {
                    _this.updUI();
                }, 0, this);
            break;
            case "DOMMenuItemActive":
            case "DOMMenuItemInactive":
                if(!("XULBrowserWindow" in window))
                    break;
                XULBrowserWindow.setOverLink(
                    e.type == "DOMMenuItemActive"
                        ? (e.target.getAttribute("cb_urlDecoded") || "")
                            .replace(/ \n/g, ", ")
                        : "",
                    null
                );
            break;
            case "unload":
                this.updUIGlobal();
                this.destroy();
        }
    },
    observe: function(subject, topic, data) {
        if(topic == "last-pb-context-exited") {
            setTimeout(function(_this) {
                _this.updUI();
            }, 25, this);
        }
    },

    createElement: function(name, attrs) {
        var node = document.createElementNS(xulns, name);
        if(attrs) for(var attrName in attrs) if(attrs.hasOwnProperty(attrName))
            node.setAttribute(attrName, attrs[attrName]);
        return node;
    },
    get tabContextUndoClose() {
        return document.getElementById("context_undoCloseTab")
            || document.getElementById("tabContextUndoCloseTab") // Firefox 2.0
            || document.getAnonymousElementByAttribute(gBrowser, "tbattr", "tabbrowser-undoclosetab"); // SeaMonkey
    },
    get closedWindowCount() {
        if(!("getClosedWindowCount" in this.ss)) {
            delete this.closedWindowCount;
            return this.closedWindowCount = 0;
        }
        this.__defineGetter__("closedWindowCount", function() {
            return this.ss.getClosedWindowCount();
        });
        return this.closedWindowCount;
    },
    get closedTabCount() {
        return this.ss.getClosedTabCount(window);
    },
    undoCloseTab: function(i) {
        if("undoCloseTab" in window) // Firefox 2.0+
            undoCloseTab(i);
        else // SeaMonkey
            gBrowser.undoCloseTab(i);
    },
    clearUndoTabsList: function() {
        var closedTabCount = this.closedTabCount;
        if(!closedTabCount)
            return;
        if("forgetClosedTab" in this.ss) // Gecko 1.9.2+
            while(closedTabCount--)
                this.ss.forgetClosedTab(window, 0);
        else {
            // Doesn't work in SeaMonkey
            const pName = "browser.sessionstore.max_tabs_undo";
            let val = cbu.getPrefs(pName);
            cbu.setPrefs(pName, 0);
            cbu.setPrefs(pName, val);
        }
        this.updUIGlobal();
    },
    clearUndoWindowsList: function() {
        var closedWindowCount = this.closedWindowCount;
        if(!closedWindowCount)
            return;
        if("forgetClosedWindow" in this.ss) // Gecko 1.9.2+
            while(closedWindowCount--)
                this.ss.forgetClosedWindow(0);
        else
            this.ss.setWindowState(window, '{"windows":[{}],"_closedWindows":[]}', false);
        this.updUIGlobal();
    },
    clearAllLists: function() {
        this.clearUndoTabsList();
        this.clearUndoWindowsList();
    },
    canDeleteUndoEntry: function(mi) {
        switch(mi.getAttribute("cb_type")) {
            case "tab":    return "forgetClosedTab"    in this.ss;
            case "window": return "forgetClosedWindow" in this.ss;
        }
        return false;
    },
    deleteUndoEntry: function(mi) {
        var i = +mi.getAttribute("cb_index");
        if(mi.getAttribute("cb_type") == "window") {
            this.ss.forgetClosedWindow(i);
            this.updUIGlobal();
        }
        else {
            this.ss.forgetClosedTab(window, i);
            this.updUI();
        }
        this.drawUndoList();
    },
    showMenu: function(e, isContext, mp) {
        var btn = this.button;
        document.popupNode = btn.ownerDocument.popupNode = btn;
        if(!mp)
            mp = this.mp;
        if("openPopupAtScreen" in mp)
            mp.openPopupAtScreen(e.screenX, e.screenY, isContext);
        else
            mp.showPopup(btn, e.screenX, e.screenY, isContext ? "context" : "popup", null, null);
    },
    openMenu: function() {
        var mp = this.mp;
        if("openPopup" in mp)
            mp.openPopup(this.button, "after_start");
        else
            mp.showPopup(this.button, -1, -1, "popup", "bottomleft", "topleft");
    },
    drawUndoList: function() {
        var mp = this.mp;

        var wc = this.closedWindowCount;
        var tc = this.closedTabCount;
        var ss = this.ss;
        var canRestoreLastSession = "restoreLastSession" in ss && ss.canRestoreLastSession
        if(!wc && !tc && !canRestoreLastSession) {
            mp.textContent = "";
            mp.hidePopup();
            return false;
        }

        this._undoWindowItems = wc && JSON.parse(ss.getClosedWindowData());
        this._undoTabItems    = tc && JSON.parse(ss.getClosedTabData(window));
        var df = document.createDocumentFragment();

        this.options.menuTemplate.forEach(function(sid, indx, arr) {
            switch(sid) {
                case "closedWindows":
                    wc && this.addUndoWindowsList(df);
                break;
                case "restoreClosedWindows":
                    wc > this.options.hideRestoreAllForSingleEntry
                    && df.appendChild(this.createElement("menuitem", {
                        label: _localize("restoreAllWindows"),
                        accesskey: _localize("restoreAllWindowsAccesskey"),
                        oncommand: "for(var i = 0; i < " + this._undoWindowItems.length + "; ++i) undoCloseWindow();"
                    }));
                break;
                case "clearClosedWindows":
                    wc && df.appendChild(this.createElement("menuitem", {
                        label: _localize("clearWindowsHistory"),
                        accesskey: _localize("clearWindowsHistoryAccesskey"),
                        oncommand: "this.parentNode.parentNode.undoCloseTabsList.clearUndoWindowsList();"
                    }));
                break;
                case "closedTabs":
                    tc && this.addUndoTabsList(df);
                break;
                case "restoreClosedTabs":
                    tc > this.options.hideRestoreAllForSingleEntry
                    && df.appendChild(this.createElement("menuitem", {
                        label: _localize("restoreAllTabs"),
                        accesskey: _localize("restoreAllTabsAccesskey"),
                        oncommand: "for(var i = 0; i < " + this._undoTabItems.length + "; ++i) this.parentNode.parentNode.undoCloseTabsList.undoCloseTab();"
                    }));
                break;
                case "clearClosedTabs":
                    tc && df.appendChild(this.createElement("menuitem", {
                        label: _localize("clearTabsHistory"),
                        accesskey: _localize("clearTabsHistoryAccesskey"),
                        oncommand: "this.parentNode.parentNode.undoCloseTabsList.clearUndoTabsList();"
                    }));
                break;
                case "clearAll":
                    (
                        wc && tc
                        || wc && arr.indexOf("clearClosedWindows") == -1
                        || tc && arr.indexOf("clearClosedTabs") == -1
                    )
                    && df.appendChild(this.createElement("menuitem", {
                        label: _localize("clearAllHistory"),
                        accesskey: _localize("clearAllHistoryAccesskey"),
                        oncommand: "this.parentNode.parentNode.undoCloseTabsList.clearAllLists();"
                    }));
                break;
                case "restoreLastSession": // Gecko 2.0+
                    canRestoreLastSession && df.appendChild(this.createElement("menuitem", {
                        label: _localize("restoreLastSession"),
                        accesskey: _localize("restoreLastSessionAccesskey"),
                        oncommand: "this.parentNode.parentNode.undoCloseTabsList.ss.restoreLastSession();"
                    }));
                break;
                case "buttonMenu":
                    let cbMenu = this.cbMenu;
                    if(cbMenu)
                        df.appendChild(cbMenu);
                break;
                case "separator":
                    if(df.hasChildNodes() && df.lastChild.localName != "menuseparator")
                        df.appendChild(document.createElementNS(xulns, "menuseparator"));
                break;
                default:
                    Components.utils.reportError(this.errPrefix + 'Invalid template entry: "' + sid + '"');
            }
        }, this);

        while(df.hasChildNodes() && df.lastChild.localName == "menuseparator")
            df.removeChild(df.lastChild);

        this._undoWindowItems = this._undoTabItems = null;

        mp.textContent = "";
        if(!df.hasChildNodes()) {
            mp.hidePopup();
            return false;
        }
        mp.appendChild(df);
        return true;
    },
    addUndoWindowsList: function(undoPopup) {
        // Based on code from chrome://browser/content/browser.js
        // Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.3a1pre) Gecko/20090824 Minefield/3.7a1pre

        var keys = this.options.accesskeys.closedWindows;
        this._undoWindowItems.forEach(function(undoItem, i) {
            var tabs = undoItem.tabs;
            var [key, keyPrefix] = this.getKey(keys, i);
            var title = undoItem.title;
            var selected = undoItem.selected;
            var selectedTab = tabs[selected && selected - 1];
            var urls = [];
            tabs.forEach(function(tab) {
                if(!tab.entries || !tab.entries.length) // Can be [] for about:blank
                    return;
                var url = this.convertURI(tab.entries[tab.index - 1].url, 120);
                var selectedPrefix = tab == selectedTab && tabs.length > 1
                    ? this.options.windowSelectedTabPrefix
                    : "";
                urls.push(selectedPrefix + url);
            }, this);
            var url = urls.join(" \n");
            var mi = this.createElement("menuitem", {
                label: keyPrefix + this.options.windowItemTemplate
                    .replace("%title", title)
                    .replace("%count", tabs.length),
                accesskey: key,
                "class": "menuitem-iconic bookmark-item menuitem-with-favicon",
                oncommand: "undoCloseWindow(" + i + ");",
                cb_url: url,
                cb_urlDecoded: this.convertURI(url),
                cb_closedAt: undoItem.closedAt || 0,
                cb_index: i,
                cb_type: "window"
            });
            if(this.cm)
                mi.setAttribute("context", this.cmId);
            var icon = selectedTab.image || selectedTab.attributes && selectedTab.attributes.image;
            if(icon)
                mi.setAttribute("image", this.cachedIcon(icon));
            if(i == 0)
                mi.setAttribute("key", "key_undoCloseWindow");
            undoPopup.appendChild(mi);
        }, this);
    },
    addUndoTabsList: function(undoPopup) {
        // Based on code from chrome://browser/content/browser.js
        // Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.3a1pre) Gecko/20090824 Minefield/3.7a1pre

        var keys = this.options.accesskeys.closedTabs;
        this._undoTabItems.forEach(function(undoItem, i) {
            var state = undoItem.state;
            var [key, keyPrefix] = this.getKey(keys, i);
            var title = undoItem.title;
            var url = state && state.entries && state.entries[state.index - 1].url || "";
            var mi = this.createElement("menuitem", {
                label: keyPrefix + title,
                accesskey: key,
                class: "menuitem-iconic bookmark-item menuitem-with-favicon",
                oncommand: "this.parentNode.parentNode.undoCloseTabsList.undoCloseTab(" + i + ");",
                cb_url: url,
                cb_urlDecoded: this.convertURI(url),
                cb_closedAt: undoItem.closedAt || 0,
                cb_index: i,
                cb_type: "tab"
            });
            if(
                state
                && "attributes" in state
                && "privateTab-isPrivate" in state.attributes
            ) // https://addons.mozilla.org/addon/private-tab/
                mi.setAttribute("privateTab-isPrivate", "true");
            if(this.cm)
                mi.setAttribute("context", this.cmId);
            var image = undoItem.image // Firefox
                || state && state.attributes && state.attributes.image // SeaMonkey
                || state && state.xultab
                    && /(?:^| )image=(\S+)/.test(state.xultab)
                    && decodeURI(RegExp.$1); // Only Firefox 2.0 ?
            if(image)
                mi.setAttribute("image", this.cachedIcon(image));
            if(i == 0)
                mi.setAttribute("key", "key_undoCloseTab");
            undoPopup.appendChild(mi);
        }, this);
    },
    getKey: function(keys, i) {
        var key = keys && keys.charAt(i % keys.length);
        var keyPrefix = keys && (key + this.options.accesskeySeparator);
        return [key, keyPrefix];
    },
    checkForMiddleClick: function(e, upd) {
        var mi = e.target;
        if(
            "doCommand" in mi
            && e.button == 1
            && mi.parentNode == e.currentTarget
        ) {
            mi.doCommand();
            if(upd)
                upd();
            else
                this.drawUndoList();
        }
    },
    crop: function(s, crop) {
        if(crop == undefined)
            crop = 500;
        if(s.length <= crop)
            return s;
        var start = Math.round(crop*0.6);
        return s.substr(0, start) + "…" + s.substr(start - crop);
    },
    convertURI: function(uri, crop) {
        if(!uri || uri.indexOf("\n") != -1)
            return uri;
        uri = this.losslessDecodeURI(uri);
        return this.crop(uri, crop);
    },
    losslessDecodeURI: function(uri) {
        if(uri) try {
            return this._losslessDecodeURI(uri);
        }
        catch(e) {
            Components.utils.reportError(e);
        }
        return uri;
    },
    get _losslessDecodeURI() {
        var ldu;
        if("losslessDecodeURI" in window)
            ldu = losslessDecodeURI;
        else if("UrlbarInput" in window) // Firefox 75+
            ldu = Components.utils.import("resource:///modules/UrlbarInput.jsm", {}).losslessDecodeURI;
        delete this._losslessDecodeURI;
        return this._losslessDecodeURI = ldu
            ? function(uri) {
                return ldu(makeURI(uri));
            }
            : decodeURI;
    },
    cachedIcon: function(src) {
        src = src.replace(/[&#]-moz-resolution=\d+,\d+$/, ""); // Firefox 22+
        if(
            !/^https?:/.test(src)
            // IDN, see https://bugzilla.mozilla.org/show_bug.cgi?id=311045
            || /^https?:\/\/[^.:\/]+\.[^a-z0-9-]+(?:\/|$)/.test(src) && this.platformVersion < 46
            || this.appName == "SeaMonkey" && this.appVersion <= 2
            || this.appName == "Firefox"   && this.appVersion <= 3.5
        )
            return src;
        return "moz-anno:favicon:" + src; // https://bugzilla.mozilla.org/show_bug.cgi?id=467828
    },
    updUI: function() {
        var tabsCount = this.closedTabCount;
        var dis = !tabsCount && !this.closedWindowCount;
        if(
            dis
            && this.options.useMenu
            && this.options.menuTemplate.indexOf("restoreLastSession") != -1
            && "restoreLastSession" in this.ss && this.ss.canRestoreLastSession
        )
            dis = false;
        this.button.disabled = dis;
    },
    updTooltip: function(tip, tn) {
        var template, header, title, url, closedAt;
        if(tn == this.button) {
            template = this.options.buttonTipTemplate;
            header = _localize("restoreTab");
            let undoTabItems = JSON.parse(this.ss.getClosedTabData(window));
            if(undoTabItems.length) {
                let lastItem = undoTabItems[0];
                title = lastItem.title;
                url = lastItem.state && lastItem.state.entries
                    && lastItem.state.entries[lastItem.state.index - 1].url;
                closedAt = lastItem.closedAt || 0;
            }
        }
        else if(tn.hasAttribute("cb_index")) {
            template = this.options.itemTipTemplate;
            title = tn.getAttribute("label");
            url = tn.getAttribute("cb_url");
            closedAt = +tn.getAttribute("cb_closedAt");
        }
        else {
            return false;
        }

        var tipData = this.getTooltipData(template, header, title, url, closedAt);
        tip.textContent = "";
        tip.appendChild(tipData);
        if(closedAt && template.indexOf("closedAt") != -1) {
            tip.initUpdateTimer(function() {
                var tipData = this.getTooltipData(template, header, title, url, closedAt);
                if(tipData.textContent != tip.textContent) {
                    tip.textContent = "";
                    tip.appendChild(tipData);
                }
            }, this);
        }
        return tip.hasChildNodes();
    },
    getTooltipData: function(template, header, title, url, closedAt) {
        var df = document.createDocumentFragment();
        var hasHeader = header && template.indexOf("header") != -1;
        function item(key, val) {
            var lbl = document.createElementNS(xulns, "label");
            lbl.className = "cb-" + key + " tooltip-label";
            lbl.textContent = val;
            lbl.setAttribute("maxwidth", "450"); // Trick to restore right border for long lines
            if(key == "closedAt" || hasHeader && key != "header")
                lbl.style.color = "grayText";
            return df.appendChild(lbl);
        }
        template.forEach(function(key) {
            switch(key) {
                case "header":
                    if(header)
                        item(key, header);
                break;
                case "title":
                    if(title && title != url)
                        item(key, title);
                break;
                case "url":
                    if(url)
                        item(key, this.convertURI(url));
                break;
                case "closedAt":
                    if(!closedAt)
                        break;
                    let dt = Math.round(Math.max(0, Date.now() - closedAt)/1000);
                    let days = Math.floor(dt/24/3600);
                    dt -= days*24*3600;
                    let d = new Date((dt + new Date(dt).getTimezoneOffset()*60)*1000);
                    let m = d.getMinutes();
                    let ts = d.getHours() + ":" + (m > 9 ? m : "0" + m);
                    if(days)
                        ts = days + _localize("day") + " " + ts;
                    let tsTip = _localize("itemTip")
                        .replace("%ago", ts)
                        .replace("%date", new Date(closedAt).toLocaleString());
                    item(key, tsTip);
            }
        }, this);
        return df;
    },
    get wm() {
        delete this.wm;
        return this.wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
            .getService(Components.interfaces.nsIWindowMediator);
    },
    updUIGlobal: function() {
        var isSeaMonkey = this.appName == "SeaMonkey";
        var ws = this.wm.getEnumerator(isSeaMonkey ? null : "navigator:browser");
        const id = this.button.id;
        while(ws.hasMoreElements()) {
            let win = ws.getNext();
            if(isSeaMonkey && !this.isBrowserWindow(win))
                continue;
            let btn = win.document.getElementById(id);
            if(btn && "undoCloseTabsList" in btn) {
                let ucl = btn.undoCloseTabsList;
                ucl.ensureSessionsInitialized(ucl.updUI, ucl);
            }
        }
    },
    isBrowserWindow: function(win) {
        var loc = window.location.href;
        return loc == "chrome://browser/content/browser.xul"
            || loc == "chrome://navigator/content/navigator.xul";
    },
    ensureSessionsInitialized: function(callback, context) {
        var _this = this;
        var stopTime = Date.now() + 3e3;
        (function ensureInitialized() {
            try {
                _this.ss.getClosedTabCount(window);
                callback.call(context);
                return;
            }
            catch(e) {
                if(Date.now() > stopTime) {
                    Components.utils.reportError(
                        _this.errPrefix
                        + "Can't initialize: nsISessionStore.getClosedTabCount() failed"
                    );
                    Components.utils.reportError(e);
                    return;
                }
            }
            setTimeout(ensureInitialized, 50);
        })();
    }
};

if(!this.undoCloseTabsList.options.useMenu && this.undoCloseTabsList.useCentextMenu) {
    this.oncontextmenu = function(e) {
        if(
            e.target != this
            || e.ctrlKey || e.shiftKey || e.altKey || e.metaKey
            || !this.undoCloseTabsList.mp.hasChildNodes()
        )
            return;
        e.preventDefault();
        this.undoCloseTabsList.showMenu(e); // Show menu without "context" flag
    };
}
if(this.undoCloseTabsList.options.rightClickToUndoCloseTab) {
    this.oncontextmenu = function(e) {
        if(e.target == this && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey)
            e.preventDefault();
    };
}

this.disabled = true;
setTimeout(function(_this) {
    _this.undoCloseTabsList.init();
}, 0, this);



//===================
// Styles
// Used icons from Undo Closed Tabs Button extension

// Styles can't override hardcoded icon

/*
if( // Remove icon only if nsIStyleSheetService works on-the-fly (Firefox 3.0+)
    !Components.ID("{41d979dc-ea03-4235-86ff-1e3c090c5630}")
        .equals(Components.interfaces.nsIStyleSheetService)
) {
    let icon = this.icon
        || this.ownerDocument.getAnonymousElementByAttribute(this, "class", "toolbarbutton-icon");
    if(icon)
        icon.src = "";
    else
        this.image = "";
}
*/
var cssStr = '\
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");\n\
    @-moz-document url("%windowURL%") {\n\
        %button% {\n\
            list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAEEUlEQVRIS9XVbWxTVRgA4Pfce3tv27t2bbNuXbfCBuyzAZ2MEdkkLH5gJvEH8TOZEo0JFdgmbgjTgEHUGQXGMJEMmDJMiNvQjS9BJhH8MY3IfsB0rnTraCcbm13b2+/1fni2xAVuxOHAH57+adNz3uee9z3vuQj+44FmG79VksglAIoMgBhCSLpdnFkBkiQxl2OQgRdbJhjoKkQofM+ALklSGSNwf1iAjbXNZ3MdI+MB+7vPF989IEnoZwBVQhCWBgVhW13b+WX5KXpFR7fDe/ntZ8wYiONUiXLojlKEU4LGANgRDpZHBH7r9iPnilZaM4jKFTlQ/P5XvHV+6o5si7HzuWUL+hzngSstRfxf0DSwa9cHa3GgWgmQTv4UNMMggyWTMuYtYepOXCKfKMiGZ4tyQEMDjPrDcGVoDI780As3/AGhJIVs2vTk6pqkJAhOFn8KaG1tpV1u53h5+RpGr7s1/uTxCIgk6g/EiaqmM2i5NRseL7SCgwMg8Wo9A5CsBLjPADDki8CbbRdgQiI631n/2NOFANwUUF9frxPECVf1628gn893Sx55IIhxBavcffIi1fO7H15atRJiAoD8XBI4UmYCwOIkCdY3fyuyrGrHZ+UldXJAwoDn5hThQESYpNXXQpJuw4HTiuzM+fBAfu7UFIQ/0wN/nfydrEKwSCdARfMZftVSa6kcEPx+v0NeA7wlKowYXX+AT604+DWTmT4XcufhFsN6r9MJ/gAHiVotpBmNoNNoIctAw8Xf7FKMjx2TA7zX6/3p7860SBCKEGJSBrj4PIyozMkm0KhZsDv7hTUP5Xt+HfFpuvqGVBZTKizEuOePEYiL0V/kQJzjuG9u1zS8RDAhRFv6/FFr5YFTaopicJGRt932yDmJQLQ3JpY9+lEHVZCTB6PecTAmEMNyIIZr8MU/3U8iSSo5RGfZPZGFFftPaU0a9dgxW+mXBEGQtJJ5xbq1hUo3mdENzxjYyoq65UAUA5/MdAGKiFQHSGbB1WEPDZGIq3COYRQD1I/XPJttn39PKRlWYpUgfvraU2/JgXAwGHxvRkAUEd6JAteYJAUhioNLwaigLN1z8sNQLA5mQyK//YWHr8zRaV9EjY2NikDAuwkQ2oL7IIRH9UzATf9PPuBUS4gIKY92u/Zf5zhixaKsAa1BXzOhhrNoz96d21JNaavT0tO9xQ+W5GDg5X8BTE/lCSIBUcqW3kGX3XW1Jz7sdtVXrn31EGpo2Nm0bl1VHt7maTw7Eo1GL8wGwPcOiRSKMpIgUpzOAd2JjqOdNTW1B1HDx7ttlRs2mnCDHZ5NYPkalmXnut3uxe3tbZeqqzd/h/bt21tgs1WocYP13AtAr9cnDg4Omo8fb7leVbXFdUfvg7uB///An8idyhRIYoVPAAAAAElFTkSuQmCC") !important;\n\
        }\n\
        %button%:hover {\n\
            list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAECUlEQVRIS9XVe2xTVRgA8O/ce3tv310fa8P6AOoapwznYtXFzchQJNEYNTHEODSaYLK4jsEaGcQnEpAQu8r+WLJMMmOMIQXnNgeKYTJjfBGzMEGTztVubcGmD9q1t+263t7r2Qxka8DhwD88//SP2/P97vd95zsXwX+80ErjC4JAjE4BvWEN5BFCwvXirAjAwWkfgIVjwczK4Sc7QtlbBpwRBLG+ADVcDnbu+fjUHZMX4+mJA00NNw8IAvoZQKIEsLOp4pv7PaMP2jRKanjclzi/99kKDBSuVaobKhEuCYoCyKIZaMjOcW+89clIXe1qA9H80Hp4uqu/UGszvlNl1J/eVF/pjY9CurERcVcyugq4XAdf5gXowP2SL00XAUkzSGteSxuq7LIDw2Miu9UET9y7DhgSwHcpAhN/RuHrC34QeJ57wED17nryqQ6dDtj5jBYAj8dDB4L+WNNzz0uUStWS+PPHI4so5EtzRNuRL9Hday1QX22D6RkOSLxbShGgZAgwKSiYjsTgo2/GQCGTfbXP8egWO0BqAXC73WVFfi7gbN+Fkskkv1jggCAui2Ri1/BZ6pfpGGy+7x7IFnjA2f69rvziSDopBUY5Cd1ffMtXmfX7+rY2vFsKCBiILwbwfiJL0tIpVihz9J4UlWvL4TaTaWnwRZaMJkFOzMFnP5zjmhprG0uB4szMzGTpkcMImQFG7csUV7X2nmA0ZRow6w2Amw/BSARmZ3MgFotBi8srk0iAERHweygkVBoUg6UAl0gkzl7rTPMEIcogxuBPcVbHByckKrkKJIwYwtFw8cUN1bFfLyaU33uDEp1KDQatDkLRCNy+SnGhFCikUqlT1xsaTiCYDKLNE+n8ndt7Tkp5QKhcKkoMtTwyUgREx7LcY5tdg5TNtBoSbBos5ZJLpUAe9+DoP91PHEmKWUTbJpP59Y7uIYVBKY0NNm/8lCAIkqBE22re9lB6rR7FUwl45fH7x0qBWQx0L3cB8oiUpkmm0h9JiIRsNlBrUkcxQI14w7udx34kxIwE9wLxfW3P7CkFsizL7l8W4HnEk6RovvlksTiLgwvJXEG6sXP4YJ4rQoVGxe3d+vC41ax8AfX09IhS7OXXEBDteA4yeDmXAxY9n3/BhUnApvjoOX9vPJODhnXWKbVWsyMlhdOo8/1Dr1tMa7YYjRWpurp6KwZe+hfA1b/iAyAHmvZ4g0Ff0PtbLhzwH25pbulDne5DPa2OnXfhNAeLON1CofDdSgB875Akw2zCKZn8f0xKhz4fGH21veMIch9+b9uO7U4LHrAPVxK4dI9MJrMGAoHqgYHj405nxxnU1eWqaW1tV+ABO38rALVaXRYK+Q39/Z5wW9vuwA19D24G/v8DfwHJNM8naEZRUgAAAABJRU5ErkJggg==") !important;\n\
        }\n\
        %button%[disabled="true"] {\n\
            list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAADCklEQVRIS9WVz0sbQRTHZ3Y32awxYkOIMaQQjBJ026zVVLCeCpX2H2jpqaceSjGnUpBcKj0IpVA81UtLT4VCoYdepJcapBYKGjfNbwNqTGJsbGKi5pdmd/s2tEVCjBrroQMLw8x77/Pem+/MYnTOA59zfHQmwPj4+AWCIG5OTk6+OyrRpgFOp7MTgn6pVCpdLS0t9MTExH49SFMACNaFMZ7v6enRRSKRiiRJnbCWbQgAI8LjWbyBMaFtdC7r67GLwWD4CQRnLBYL4XK5yoIgbKpUqkB7e9u3oSHrlMViz/2J8bcCnl/8TJCUmVJQW0cB0ls/W91u3gqDNBqNVTNoEcrlcmhnZwdtJDdEiqSEUql0zeFwLMj7VYDf728t7xdTV/oHFeBQrAdIJpPkzMwMA5ljnU5XNwfoAgI7tLKyUhJF0T42NuavApaWltolJEQBQGWz2Xw971gsRvM8r+nr68NKpbKhulOplBSNRldBYWwtgNze3o4d5b28vKxdW1vTQRWEQqFoCIEqCtC26VoAARV4GnkCxJRIJExms5mEgeLxuJDP5wmKokSNRkNotVosw/f29hDYLdQCMABcx91ukKYV2mAxGAykDBgZGflUKBQYCHoVMlebTCYMypLh8VoA2t3d/XAcQN4Ph8P2TCbTC1NxeHj4rbwGFYzOuma1jIphoCKUTqdjtQAJAK9PApBtoF3Xi8WimeO4N78Bt+fm5vRqtZqGivIHBwePawEiaPr5SQFVncPNBHmK8hza4giFQx0KSlGB4D/0en13LUAAgPM0gMO2cKhTcA40yNMN79Moy7IZ7PV6OyrC/iuMkZ2zDSgB8KBZADwXz4KhgIAkKQECe2SzDS5ij8c9beg03tK0tpUZhtHANb93BsAU+KvyhXwlHl+f7+cG7uPvPv7FZZazQv9eQi+Fcrm82SyApmk9nIkK/B8GAr6vNlv/U+wL+O6yvawR1PC+2cCH/QBAwlNyJxTyhViW+4gjEa+lu/sSA0ar/wIgCwu+rmAwmIN3K9rUD+c0ifz/gF/LJ4uAUJQHTwAAAABJRU5ErkJggg==") !important;\n\
        }\n\
        toolbar[iconsize="small"] %button% {\n\
            list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACPElEQVQ4T2NkIBL8//+fEQj+oytnJEY/UDPXzPOPTdINZQ+jG0LQgPvv/wvsvf9k54FzN432X39S9rQ3oR/ZUrgBvb29akxMf7mQJcWVNYTeCWvOfvrijVK9nymDRevqKwqsfxdYiLDNqUgP+whSCzZg4sS+dkYmxlx2NrYfMAM4efiYXonr8Z27/4q52NeGQZiLlYGd4Q/D9iuPGDafu/3/zZevvocrwraCDZgwoWd/QECwtbi4xD8QHxRS178xsPq2LmfKC/FlEBAUYfgDFORlZWCQ52FgUOP5zVCz9sjfiw/eKMENCAwMMeXl5XsMc8FPJhbOjv235A5fe8zoZWvLwMTIxPD45UsGPm5uBiVxQQZN7u8MnVtPXUN2gbGAgOAJpDBg/MrIKtCy/bLRsVtPmXi4uBj+/fn2+9vPvyycHJyMLgZaDAcvXPoFN8A/IMhIUEBoLUoIA+Ps4382qfotZ112nL3JVOyieyjdQYfXuGWtgbCgCOOnzx//IrvAgJ9fYDKWdMH4mYlduX/HOa0AHamD3Jyc5v5TtptzsrMzeBmrXWKcNGkS399/Pw8GBoTIA71QgSNhwaL7/9zjdzN6d10wdDdR/5XrbWbNOHvOjA18fHwmTo6ubECQQChlcnBzR5y9/yT4wcVTb1+/fW7DuGjR3EXR0QlfgMn16N+/fy8TMoCJiUkCiK0PHNqvduXSuTrGNWtWugcHh737+PHjHUKaYfL8/Pyip04dV7tw4dBhgnmBkKEUGwAAgK/XtUYSNDQAAAAASUVORK5CYII=") !important;\n\
        }\n\
        toolbar[iconsize="small"] %button%:hover {\n\
            list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACRElEQVQ4T2NkIBr8Z2RgYPyPrhwoSBj8//+fbfXt11phqqIXGRhRDSFoAFAzz8KLzzdvP3nZ+titFwWPe+OnIVsJN6BnSo88ww8GTmRJBRUV/jeSuvOOXL6nVeJuxBA3Z+cZWfY/M0x1BZc3+Pp+A6kFGzBxYm8T0GnFrKwsP2AGsHPyMH2RNebdfukxc6KLOYMAFzvDq3fvGC49fMFw+dGL/z9+/nQ7UBm+B2zAhIk9+3x9A2ylJKX/gfigkLr9jZHVt305Y4i9JQMbJy/Dn3//GbhZmRiEuVgYWP9+ZVh19MLfHz9/y0MMmNCz39cvwEJQQOgBzAU/mdg4m3dflTty7TGjkYYm2KmvP3xg4OLgYBDm42H48/09w/UnLy8hG2AuLCRyFCkMGL8ysAo0brtoeOzmEyZ2NjYGFsY/v7///sfCzMTCKCEiyvDo+dNfcAP8/AJNhYSEV6GEMCMj0BA2yaqNZ1x3nr/FlO+kfSTbSY/bqHmtAQ8PH+OPH9/+ohggKCjUhyVVMH5hYlfs3XFeO1BH8hAHB4d50NTt5pzs7AyuhioXGWfO7OD/9p35EDAQFcVExYuxJat///6BLWJiYvo/59jtjN5dF418zDV/ZbpZWDDOnTtzI7+AoLGDvSM3KytbFKF0ycHNHXnx/tPgW+dPvnn99qk948LF8+bFRMV/Aqa4Y9+/f79G0AAODjGgUywOHdivefHipUbGVetWOYUGhr778OEDPAoJGSIgICB87Ngh5bNnL54gmBcIGUaxAQAqY9puYCzN/wAAAABJRU5ErkJggg==") !important;\n\
        }\n\
        toolbar[iconsize="small"] %button%[disabled="true"] {\n\
            list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB70lEQVQ4T2NkoBAwEqu/vLzcjpOT81pDQ8MbZD1EGVBZWZn579+/qUxMTBXt7e1dGAbcv3+f4/2n9z6M//7zoLvo7NlzXh8+fPQTFxdnfwEEvPy8R+RlpWd4evruBakFu+DCpfNLONg4/NjZ2X4jG3D16jWup0+fsRsZGTGysLAwvH79muH9+/cMQHMY2NjY8jMzMyfBDNivrKhs+f8/wy+YAb9+/WJcs2YNj66uLgMvLy+Kw75//85w6dKl74yMjNZwAxQVlEz//f13D1nlgwcPBG/evCmloqLCBFQMth1oMwMfHx/Dx48f/z99+vQssgHGDP8ZjqCHwd27d+UfP36szs7ODvLGO2BAcgNdwCEhIcH46NGjt8gGGP3/938VtmgFBrIB0N8mcnJyB1VVVbkOHjxgzMnJxfT169cnCAPklQyApk/AlS6ePXumJSQk9ACoxuHKlStmQPonUG0e4+XLl8X//v29V0lJWQoYKaWEEtaXL1/SgX43AQbJWhMT01DGq9ev7ODm4tKWEJdi+/PnTxwhA4CpMfz161e+79+/e/f7919Pxtu3b85RUlJ5+////8PAwLlPyAAODg5BoPONXr16YfDmzbtWxseP79vLyCgAY+j9Q0KaYfJAVwgCA1DpzZs3p4nKC/gMptgAAO1G2FJifkXnAAAAAElFTkSuQmCC") !important;\n\
        }\n\
    }'
    .replace(/%windowURL%/g, window.location.href)
    .replace(/%button%/g, "#" + this.id);
   
   
var cssURI = this.cssURI = Components.classes["@mozilla.org/network/io-service;1"]
    .getService(Components.interfaces.nsIIOService)
    .newURI("data:text/css," + encodeURIComponent(cssStr), null, null);
var sss = this.sss = Components.classes["@mozilla.org/content/style-sheet-service;1"]
    .getService(Components.interfaces.nsIStyleSheetService);
if(!sss.sheetRegistered(cssURI, sss.USER_SHEET))
    sss.loadAndRegisterSheet(cssURI, sss.USER_SHEET);


   
       

this.onDestroy = function(reason) {
    this.undoCloseTabsList.destroy();
    if(reason == "destructor") // May happens before "unload"
        this.undoCloseTabsList.updUIGlobal();
    if(reason == "update" || reason == "delete") {
        let sss = this.sss;
        let cssURI = this.cssURI;
        if(sss.sheetRegistered(cssURI, sss.USER_SHEET))
            sss.unregisterSheet(cssURI, sss.USER_SHEET);
    }
};
if(this.undoCloseTabsList.options.useMenu) {
    this.type = "menu";
    this.orient = "horizontal";
}


выдает  ошибку -   _this.ss.getClosedTabCount - не функция

Отсутствует

 

№1693404-07-2023 19:14:01

vending_machine
Участник
 
Группа: Members
Зарегистрирован: 10-01-2020
Сообщений: 530
UA: Firefox 102.0

Re: Custom Buttons

Andrey_Krropotkin пишет

в 115 перестала работать кнопка Undo Close Tab

И кнопка Двойным левым кликом на папке закладок добавлять закладку в папку закладок, от 06.06.2019

скрытый текст
// Двойным левым кликом на папке закладок добавлять закладку в папку закладок, от 06.06.2019. ......................
addEventListener("dblclick", (e, targ = e.originalTarget)=> {     
   if ( e.button || !targ._placesNode || !PlacesUtils.nodeIsFolder(targ._placesNode) ) return;         
   
   var docTitle = gBrowser.selectedTab.label.substr(0, 50);
   var folderId = PlacesUtils.getConcreteItemId(targ._placesNode);
   var folderTitle = PlacesUtils.bookmarks.getItemTitle(folderId);
   var currentURI = Services.io.newURI(gBrowser.currentURI.spec, null, null);
   PlacesUtils.bookmarks.insertBookmark(folderId, currentURI, -1, docTitle); 

   // всплывающая подсказка ....
   var favicon = gBrowser.selectedTab.image || "chrome://global/skin/icons/Portrait.png";
   Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
   .showAlertNotification(favicon, "Добавил в папку " + folderTitle + ":", docTitle);

   setTimeout(()=> { document.getElementById("bookmarksMenuPopup").hidePopup() }, 50);
});

Отсутствует

 

№1693504-07-2023 19:33:46

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

Re: Custom Buttons

vending_machine у меня такой код

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

Выделить код

Код:

// Двойным левым кликом на папке закладок добавлять закладку в папку закладок, от 06.06.2019. .............................................................
addEventListener("dblclick", async e => {
	if (e.button) return;
	var trg = e.target, node = trg._placesNode || trg._placesView?._resultNode;
	if (!node || !PlacesUtils.nodeIsFolder(node)) return;

	var parentGuid = PlacesUtils.getConcreteItemGuid(node);
	try {
		await PlacesTransactions.NewBookmark({
			//index: 0,
			parentGuid,
			url: gBrowser.currentURI.spec,
			title: gBrowser.selectedTab.label.substr(3, 50)
		}).transact();

		var msg = `Добавил в папку ${
			PlacesUtils.bookmarks.getLocalizedTitle({guid: parentGuid, title: node.title})
		}:`;
		var popupIconURL = gBrowser.selectedTab.image || "chrome://global/skin/icons/Portrait.png"
	}
	catch(ex) {
		msg = "ERROR! " + ex.message;
		popupIconURL = "chrome://global/skin/icons/warning.svg";
	}
	var n = PopupNotifications.show(
		gBrowser.selectedBrowser, "PDES-popup", msg, null, null, null, {popupIconURL, hideClose: true}
	);
	setTimeout(() => n.remove(), 2e3);
});

Отсутствует

 

№1693604-07-2023 19:39:41

vending_machine
Участник
 
Группа: Members
Зарегистрирован: 10-01-2020
Сообщений: 530
UA: Firefox 115.0

Re: Custom Buttons

Andrey_Krropotkin пишет

vending_machine у меня такой код

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

Выделить код

Код:

// Двойным левым кликом на папке закладок добавлять закладку в папку закладок, от 06.06.2019. .............................................................
addEventListener("dblclick", async e => {
	if (e.button) return;
	var trg = e.target, node = trg._placesNode || trg._placesView?._resultNode;
	if (!node || !PlacesUtils.nodeIsFolder(node)) return;

	var parentGuid = PlacesUtils.getConcreteItemGuid(node);
	try {
		await PlacesTransactions.NewBookmark({
			//index: 0,
			parentGuid,
			url: gBrowser.currentURI.spec,
			title: gBrowser.selectedTab.label.substr(3, 50)
		}).transact();

		var msg = `Добавил в папку ${
			PlacesUtils.bookmarks.getLocalizedTitle({guid: parentGuid, title: node.title})
		}:`;
		var popupIconURL = gBrowser.selectedTab.image || "chrome://global/skin/icons/Portrait.png"
	}
	catch(ex) {
		msg = "ERROR! " + ex.message;
		popupIconURL = "chrome://global/skin/icons/warning.svg";
	}
	var n = PopupNotifications.show(
		gBrowser.selectedBrowser, "PDES-popup", msg, null, null, null, {popupIconURL, hideClose: true}
	);
	setTimeout(() => n.remove(), 2e3);
});

Да, этот работает, спасибо

Отсутствует

 

№1693704-07-2023 20:25:26

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

Re: Custom Buttons

Andrey_Krropotkin пишет

getClosedTabCount - не функция

rename

Отсутствует

 

№1693805-07-2023 05:44:57

Viatcheslav
Участник
 
Группа: Members
Откуда: г. Бобруйск, Беларусь
Зарегистрирован: 23-11-2016
Сообщений: 312
UA: Firefox 88.0

Re: Custom Buttons

_zt пишет

А так ли они нужны эти точки?

Каждому своё...


_zt пишет

#tabbrowser-tabs .tab-label-container[textoverflow][labeldirection="ltr"]:not([pinned]) {
    mask-image: none !important; /* !!! del.fadein */
}

В таком виде не работает :(

Отсутствует

 

№1693905-07-2023 12:50:21

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

Re: Custom Buttons

Viatcheslav
Не работает у вас, у меня работает и на чистом профиле работает. Делайте выводы.

Отсутствует

 

№1694006-07-2023 06:13:48

Viatcheslav
Участник
 
Группа: Members
Откуда: г. Бобруйск, Беларусь
Зарегистрирован: 23-11-2016
Сообщений: 312
UA: Firefox 88.0

Re: Custom Buttons

_zt пишет

Не работает у вас, у меня работает и на чистом профиле работает. Делайте выводы.

Да, сделал - стили лучше подключать через userChrome.css
Через UCF непонятным образом что-то работает, что-то нет, ну да ладно :sick:
Прошу прощение за оффтоп :offtopic:

Отсутствует

 

№1694106-07-2023 12:40:47

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

Re: Custom Buttons

Viatcheslav
Я сам через ucf подключаю только то, что не работает в userChrome, т.е. требует особых прав. Так себе обоснование, но как пример - скрытие вкладок через скрипт ucf (не стиль напрямую, а скрипт запускающий стиль) происходит с задержкой, т.е. окно запускается с вкладками, а потом (через долю секунды) они исчезают, скрытие вкладок через userChrome вообще вкладки не отображает при запуске.

Отсутствует

 

№1694207-07-2023 10:45:00

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

Re: Custom Buttons

Dumby спасибо, еще вопрос, посмотришь Инспектор DOM под 115

Отсутствует

 

№1694307-07-2023 11:43:03

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

Re: Custom Buttons

Andrey_Krropotkin пишет

посмотришь Инспектор DOM

Вот всё что есть

Отсутствует

 

№1694407-07-2023 12:42:17

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

Re: Custom Buttons

Dumby все работает, спасибо

Отсутствует

 

№1694507-07-2023 12:54:30

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

Re: Custom Buttons

Dumby пишет

Вот всё что есть

Dumby, большое спасибо! :beer:


«The Truth Is Out There»

Отсутствует

 

№1694607-07-2023 13:12:19

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

Re: Custom Buttons

Dumby еще вопрос есть кнопка

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

Выделить код

Код:

// Показывать количество открытых табов , от 10.05.2019. ................................
(function () {  

   self.onclick = function(e) {  
      if ( e.button == 0 ) return PanelUI.showSubView('allTabsMenu-allTabsView', this);
   };

   // Стиль для счётчика и меню ....
   var uri = makeURI('data:text/css,'+ encodeURIComponent('\
            %button% { -moz-appearance: none !important; border: 0 !important; margin-right: -4px !important; }\
            %button% {color: #4800FF !important;}\
            %button% .toolbarbutton-icon {width: -0px !important;}\
            %button% .toolbarbutton-text {\
      display: flex !important; margin-left: -8px !important; color: #4800FF !important; font-weight: bold !important;\
   }\
      %button% {\
      flex-direction: row !important;\
   }\
   '.replace(/%button%/g, "#" + _id) ));
   const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET); 
   addDestructor(function() { sss.unregisterSheet(uri, sss.AGENT_SHEET) });  
      
 
   // Считать и показывать количество вкладок ....
   function count() {
     try { window.clearTimeout( tabTimeout ) } catch(e) {};
     tabTimeout = window.setTimeout(function() {
        self.label = (gBrowser.selectedTab._tPos + 1) + '/' + gBrowser.visibleTabs.length;
     }, 50 );
   };
   count();

   // Отслеживать открытие, закрытие вкладок и переключение групп вкладок ....
   var tabs = gBrowser.tabContainer;
   addEventListener("TabOpen", count, false, tabs );
   addEventListener("TabClose", count, false, tabs );
   addEventListener("TabSelect", count, false, tabs);
   function getChangeTabGroup() {
      addEventListener("TabHide", function c(e) { 
         count();
         setTimeout(function() { getChangeTabGroup() }, 50 ) 
         removeEventListener( e.type, c, false, tabs ); 
      }, false, tabs );
   };
   getChangeTabGroup();
   
})()


при нажатии пишет в ошибках Could not show panel subview with id:  allTabsMenu-allTabsView panelUI.js:407:15
если на панели сначала нажать родную кнопку, а потом эту, то работает

Отредактировано Andrey_Krropotkin (07-07-2023 13:13:02)

Отсутствует

 

№1694707-07-2023 16:36:03

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

Re: Custom Buttons

Andrey_Krropotkin пишет

Could not show panel subview

Можно gTabsPanel.init(); куда-нибудь вписать.

Отсутствует

 

№1694807-07-2023 17:04:14

b0ttle
Участник
 
Группа: Members
Зарегистрирован: 22-10-2020
Сообщений: 182
UA: Firefox 114.0

Re: Custom Buttons

Что он делает - Инспектор DOM? Есть attributes-inspector, но он некоторые бордюры не видит. DOM для таких случаев подойдет, или нет? Если не трудно, можете дать ссылку на настройку конфига. Так бы сам проверил.

Отредактировано b0ttle (07-07-2023 17:05:48)

Отсутствует

 

№1694907-07-2023 18:10:26

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

Re: Custom Buttons

b0ttle пишет

Есть attributes-inspector, но он некоторые бордюры не видит.

Так он и не обновлялся уже сколько. Мод

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

Выделить код

Код:

data:text/html;charset=utf-8,<!DOCTYPE html>%0A<html><head>%0A%09<title>Attributes Inspector (mod)</title>%0A%09<meta http-equiv="Content-Type" content="text/html; charset=utf-8">%0A%0A%09<script type="module">%0A%0A%09%09var url = "data:application/octet-stream;base64,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";%0A%0A%09%09var response = await fetch(url);%0A%09%09var stream = response.body.pipeThrough(new DecompressionStream("gzip"));%0A%09%09pre.append(await new Response(stream).text());%0A%0A%09</script>%0A%0A</head><body><pre id="pre"></pre></body></html>

Отсутствует

 

№1695008-07-2023 06:32:31

b0ttle
Участник
 
Группа: Members
Зарегистрирован: 22-10-2020
Сообщений: 182
UA: Firefox 114.0

Re: Custom Buttons

А это одно и тоже) Я думал разное. У меня через ucf attrsInspector.js

Отредактировано b0ttle (08-07-2023 06:33:27)

Отсутствует

 

Board footer

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