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

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№1562615-06-2021 22:05:45

foxboy
Участник
 
Группа: Members
Зарегистрирован: 06-06-2015
Сообщений: 34
UA: Palemoon 24.0

Re: Custom Buttons

Есть у кого кнопка - переключиться на первую вкладку и закрыть все справа.

Отсутствует

 

№1562715-06-2021 23:11:32

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

Re: Custom Buttons

Dumby
Спасибо. Наконец то эта кнопочка вернулась, а то мучился с локальным конвертером, который какой-то мусор в код добавлял.
Иконка для темной темы - data:image/png;base64,iVBORw0KGgoAAAANS … VORK5CYII=

Отсутствует

 

№1562816-06-2021 02:15:48

vv07
Участник
 
Группа: Members
Зарегистрирован: 07-11-2007
Сообщений: 689
UA: Firefox 54.0

Re: Custom Buttons

Dumby

Непонятно. Клонируешь кнопок сколько угодно,

Я сам уже понял это, хотя изначально почему то дублировалось содержимое.
Поэтому и убрал коммент, но вы успели прочитать.
По

проблемы при работе Compact Menu

причина ясна
Я ваш код вписал, а старый из секции код

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

/*CODE*/
const ids = [

    "file-menu",
    "edit-menu",
    "view-menu",
    "bookmarksMenu",
    "history-menu",
    "tools-menu",
    "helpMenu"
];
const id = "Compact-Menu-menupopup";
var popup = document.getElementById(id);
if (!popup) {
    popup = this.appendChild(document.createElement("menupopup"));
    const attrs = {
        id: id,
        position: "after_start",
        oncontextmenu: "event.preventDefault()",
        oncommand: "event.stopPropagation()",
    };
    for (var attr in attrs) popup.setAttribute(attr, attrs[attr]);

    ids.forEach(function(id) {
        var clonedMenu = document.getElementById(id).cloneNode(true);
        clonedMenu.hidden = false;
        popup.appendChild(clonedMenu);
    });
}
popup.openPopup(this);

не убрал.
Поэтому и возникала такая ситуация.
Не подскажете, как определять ID для других категорий меню и как их вписывать?
На старой кнопке, они видимо благодаря приведенному выше коду, сами подхватывались
скрытый текст
97e4fda1057e.jpg
, а сейчас самому шаманить придется :)
И задам вопрос тут походу уже, хотя похожая тема есть, но не совсем то что надо.
На старых версиях, работало отличное расширение Status-4-Evar,которое добавляло и индикатор загрузки сайтов.
Очень удобная вещь была. На новых увы, расширение не работает, а своего ничего нет.
Попробовал Load Progress Bar, но не то :( Тут вроде есть решение, но куда это пихать, что бы заработало, я не знаю.
Может кто подскажет? И будет ли это работать. Может есть альтернативное решение., что бы выглядело так
скрытый текст
53089e79b9ad.jpg

Отредактировано vv07 (16-06-2021 11:42:06)

Отсутствует

 

№1562916-06-2021 16:17:19

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 89.0

Re: Custom Buttons

Dumby
Не могу к этой панели dropmarker привязать . По ходу, это невозможно. хочу вправо сдвинуть..
65ychs6t.png
e9wb9dh2.png
В author : #editBMPanel_folderMenuList::part(dropmarker) {margin-right: -2px !important;} И ни фига...

Отредактировано ВВП (16-06-2021 16:31:03)

Отсутствует

 

№1563016-06-2021 20:55:54

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

Re: Custom Buttons

vv07 пишет

Не подскажете, как определять ID для других категорий меню и как их вписывать?

Не, для других категорий меню ничего не предусмотрено,
только те, что есть.
ID можно кнопкой Attributes Inspector посмотреть.
Или с помощью Browser Toolbox, но для такой задачи
это как из пушки по воробьям.
А раз есть стойкое предпочтение видеть пункты меню с иконками,
тогда можно специальный стиль составить (пример).


ВВП пишет

В author : #editBMPanel_folderMenuList::part(dropmarker) {margin-right: -2px !important;} И ни фига...

У меня это работает.
Ну, в два пикселя, конечно, вглядываться не захотел,
поставил сразу -18px и дропмаркер наглядно уехал вправо. Скриншот:

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

Выделить код

Код:

data:image/png;base64,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

Отсутствует

 

№1563116-06-2021 21:39:33

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 89.0

Re: Custom Buttons

Dumby
Косяк был: влепил по умолчанию

скрытый текст
:host {
  -moz-appearance: -moz-menulist-arrow-button;
  width: 17px;
  height: 17px;
  filter: brightness(1200%);
  margin-right: 2px !important;
 
}

Вот он и замер намертво. На каждый ID надо отдельно лепить ::part(dropmarker) . Теперь , вроде, норм...

Отсутствует

 

№1563217-06-2021 05:08:40

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

Re: Custom Buttons

Помогите, пожалуйста, создать кнопку для проматывания страницы сайта до конца вниз с необходимой периодичностью, например, раз в 10 мин. Для определённости, адрес страницы - https://babushkina.by/news/%d0%b2%d1%80%d0%b5%d0%bc%d1%8f-%d0%b2%d1%8b%d0%b1%d0%b8%d1%80%d0%b0%d1%82%d1%8c-%d0%bb%d1%83%d1%87%d1%88%d1%83%d1%8e/
Важно срабатывание без нажатия на кнопку.
Здесь есть варианты решения - https://techarks.ru/general/brauzeri/kak-avtomaticheski-prokrutit-veb-straniczu-vniz-ili-vverh-v-chrome-ili-firefox/
только я не очень в этом понимаю :blush: Будет ли работать приведенный вариант с консолью, и что означают числовые параметры:

Выделить код

Код:

«var scroll = setInterval (function () {window.scrollBy (0,1000);}, 2000);»

Помогите, пожалуйста :whiteflag: Спасибо :beer:

Отсутствует

 

№1563317-06-2021 09:54:48

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 89.0

Re: Custom Buttons

Dumby
А на этом скрине чем навели на drpomarker ? У меня atributes не показывает...
vdg37tbo.png
А нет кода - "открыть все папки в сидебаре" ? Историю , желательно...Т.е , открываю сидебар сразу пусть папки истории раскроются.

Отредактировано ВВП (17-06-2021 15:21:07)

Отсутствует

 

№1563417-06-2021 21:02:46

beggrr
Участник
 
Группа: Members
Зарегистрирован: 04-02-2014
Сообщений: 128
UA: Firefox 85.0

Re: Custom Buttons

Если popup окошко открыто с помощью window.open()
Можно каким то образом заставить ссылки в нем открываться в новых вкладках этого же окошка?
Сейчас я кликаю по ссылке и она открывается в текущей вкладке popup'а. А если выбираю в контекстном меню ссылки "Открыть в новой вкладке", то открывается во вкладке основного окна.

Отсутствует

 

№1563518-06-2021 08:36:37

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

Re: Custom Buttons

Viatcheslav пишет

Будет ли работать приведенный вариант с консолью, и что означают числовые параметры

Вот прямо так, в кавычках «», — не будет,
а без кавычек — будет, если скроллер это window.
Числовые параметры означают:


первый (1000) — на сколько пикселей прокрутить,
положительное число — вниз, отрицательное — вверх,
но лучше использовать window.scrollTo(0, window.scrollMaxY)


второй (2000) — с какой периодичностью в миллисекундах прокручивать,
в данном случае, каждые две секунды.
Десять минут это 10 * 60 * 1000 = 600000 миллисекунд.


ВВП пишет

А на этом скрине чем навели на drpomarker ? У меня atributes не показывает...

Сначала навёл на <menulist>, далее кнопками стрелок клавиатуры:


Ctrl+ArrowDown (Контрол и стрелка вниз) — переход к дочерним узлам,
первый будет, соответственно, <html:link>


Затем Ctrl+ArrowRight — переход к следующему соседнему узлу,
первый следующий будет <hbox>, а второй — уже тот самый <dropmarker>


Вообще, наверно, полезно будет перечитать имеющиеся
в кнопке сочетания клавиш (ссылки на страницы кнопки есть в начале кода).

Историю , желательно...Т.е , открываю сидебар сразу пусть папки истории раскроются.

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

Выделить код

Код:

(url => addEventListener("pageshow", e => {
	if (e.target.documentURI != url) return;

	var rn = e.target.getElementById("historyTree").view._rootNode;
	var ind = rn.childCount;
	while(ind--) {
		var node = rn.getChild(ind);
		if (node.containerOpen) continue;
		node.containerOpen = true;
		Services.xulStore.setValue(url, node.uri, "open", "true");
	}
}, false, document.getElementById("sidebar") || 1))(
	"chrome://browser/content/places/historySidebar.xhtml"
);

Отсутствует

 

№1563618-06-2021 10:35:41

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 89.0

Re: Custom Buttons

Dumby
Да, теперь вкурил . Кстати, этот дроп только так : (он и в  другом месте есть,типа, добавить закладку из контекста...) Короче, работает, но нет ли тут принципиального косяка?

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

Выделить код

Код:

vbox.panel-subview-body > vbox#editBookmarkPanelContent > vbox#editBookmarkPanelRows > vbox#editBMPanel_folderRow > hbox > menulist#editBMPanel_folderMenuList::part(dropmarker){margin-right: 4px !important;}

Отсутствует

 

№1563718-06-2021 12:16:52

Пострел
Участник
 
Группа: Members
Зарегистрирован: 08-04-2021
Сообщений: 51
UA: Firefox 89.0

Re: Custom Buttons

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

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

Выделить код

Код:

Services.search.addPolicyEngine({

    iconURL: "",
    chrome_settings_overrides: {
        search_provider: {
            name: "",
            search_url: "",
            search_form: "",
            search_url_get_params: "tt=mzl&q={searchTerms}",
            suggest_url: "",
            suggest_url_get_params: "type=list&q={searchTerms}"
        }
    }
});

вписать эти два поисковика,

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

https://cs.majento.ru/, и https://www.nigma.net.ru/

При выделении текста и поиске из контекстного меню, открываются страницы поисковиков,
без результатов поиска.

Отсутствует

 

№1563818-06-2021 15:13:22

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 89.0

Re: Custom Buttons

Пострел
В поисковике nigma так:

скрытый текст
"search_url": "https://www.nigma.net.ru/index.php?",
       "search_url_get_params": "query={searchTerms}"

Отсутствует

 

№1563918-06-2021 17:11:18

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 89.0

Re: Custom Buttons

Dumby
Последнее вроде.Хочу чтобы кнопка Undo не реагировала на закрытые или открытые окна...

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

Выделить код

Код:

// 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-2015, 2017-2018
// version 0.3.3.1 - 2018-08-01

var options = {
    menuTemplate: [
        "closedWindows",
        "separator",
        "restoreClosedWindows",
        "clearClosedWindows",
        "separator",
        "closedTabs",
        "separator",
        "restoreClosedTabs",
        "clearClosedTabs",
        "separator",
        "clearAll",
        "separator",
        "restoreLastSession",
        "separator"
       
    ],
    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: ""
    },
    accesskeyPostfix: " ", // <accesskey><postfix><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",

            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: "Удалить",

            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
    ? window.JSON
    : "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;
        });
        
        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 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, document.tooltipNode);",
            onpopuphiding: "this.cancelUpdateTimer();",
            style: "padding: 0;"
        });
        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 "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 selectedTab = tabs[undoItem.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.accesskeyPostfix);
        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;
        try {
            uri = "losslessDecodeURI" in window
                ? losslessDecodeURI(makeURI(uri))
                : decodeURI(uri);
        }
        catch(e) {
            Components.utils.reportError(e);
        }
        return this.crop(uri, crop);
    },
    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.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;
            //lbl.setAttribute("value", val);
            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)) {
                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,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") !important;\n\
            -moz-image-region: rect(0, 24px, 24px, 0) !important;\n\
        }\n\
        %button%:hover {\n\
            -moz-image-region: rect(0, 48px, 24px, 24px) !important;\n\
        }\n\
        %button%[disabled="true"] {\n\
            -moz-image-region: rect(0, 72px, 24px, 48px) !important;\n\
        }\n\
        toolbar[iconsize="small"] %button% {\n\
            -moz-image-region: rect(24px, 16px, 40px, 0) !important;\n\
        }\n\
        toolbar[iconsize="small"] %button%:hover {\n\
            -moz-image-region: rect(24px, 32px, 40px, 16px) !important;\n\
        }\n\
        toolbar[iconsize="small"] %button%[disabled="true"] {\n\
            -moz-image-region: rect(24px, 48px, 40px, 32px) !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 == "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";
}

var style = custombutton.buttonGetHelp(self).replace(/id/g, _id);
var uri = makeURI('data:text/css,'+ encodeURIComponent(style));
var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
sss.loadAndRegisterSheet(uri, 0);
addEventListener("contextmenu", e => !this.disabled || e.ctrlKey || e.shiftKey || e.preventDefault(), false, this);

Отсутствует

 

№1564018-06-2021 17:57:14

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

Re: Custom Buttons

Есть у меня кнопка, которая по ЛКМ открывает текстовый редактор, установленный в системе Akelpad. По СКМ эмулирует редактор в браузере, по ПКМ CB меню. Можно сделать тоже самое для ucf, тоько для ПКМ сделать эмуляцию, как СКМ с вставкой из буфера? Может, такое уже кто и просил, ткните носом.

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0422%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0439%20%u0440%u0435%u0434%u0430%u043A%u0442%u043E%u0440%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAApKSlRRkZGh0BAQHxBQUF+QUFBfkFBQX5BQUF+QEBAfEZGRogaGho1AAAAAAABAAECAgICAgICAgQEBAUAAAAAMTEwWeLi4f//////+vr6//r6+v/6+vr//Pz8//v7+//5+fn++/v7/7CwsPdNTU2hAQEBAgAAAAAAAAAAAwMDBAAAAABvbm+x8vHy/+Df4Pfi4+P76ubr++Lh4vvk5OT7/f39+/////v////77/Dv/aysrP8BEAElKngnxDCDLdEvgSzOLX8qy0GTPu1Zq1b/WatW/lasU/9op2f/xcPF/8PEw//i5+L/8vfx//H27//p6+n/qqqq/ESaQOS67a7/teip/rbpqv+36qv/suSm/6zfoP+s36D/teOo/4bNfP93s3b/39bf/9XY1f/5/Pj/+Pv2/+vs6/+qqar/T6RK8bvjsP6t2qT8sNym/LDcpvyx3af+st6o/7LeqP+w3ab/vuaz/1mqVP+2w7b/3dvd//D07//4+/f/6+zr/6qqqv8BNwFvndiU/8Djt/y34a//ueGw/7nhsP+54bD/ueGw/7jgr//B5Lj/mtSS/3q1ev/WzNb/4ufh//f79f/p6+n/qqqq/wAAAANHk0Pbzu/F/73gtP3A47f/wOO3/8Djt//A47f/wOO4/73itf/D5rn/Y7Je/7/MwP/k4eP/+f35/+vs6/+qqqr/AAAAAAAzAGap4KP/zebG+8Tkvv/G5b//xuS//8blv//F5b7/vuK2/8LkuP+U0Yv/ZaBl/97W3v/u9e3/6+3r/6qqqv8DAQMAAAAABE6XS+Db8dT/yuPD/czmxv/N5sf/zObG/8blv//A47j/t+Cu/7vjsP9nuWP/uMW5/+zr6//s7+z/qamq/wACAAQAAAAAATQBZrTir//a6dX70ufN/9Pozv/N5sf/xuS//8Djt/+44K//u+Ow/4zNgv9uqW7/6+Tr/+ru6v+qqar/AAAAAQMBAwAAAAAHVJhS2Or25v/W59L91OjP/8zmxv/G5b//wOO3/7rhsP+w3ab/tuSp/1isU/+vva//6+rq/6qqqv8AAAAAAQIBAwAAAAAENQRkv+S7/+Pr3vvR58z/zObG/8bkv/+/4rf/ueCw/7Hep/+z4Kf/h818/3Kucv/r4uv/qKqo/gAAAAAAAAABAwEDAAAAAApVl1TU7Pbo/9HlzP3P58j/xuS//8Ljuf+64bH/s9+p/6vcoP+t4KD/Wq5U/8bSx/23tLf9AAAAAAAAAAABAgEDAAAAAAk3CWaq36b/1unR+cLjvPzF5r78t+Cv/LXgrP2w36b8odmW/Kzgn/1yxGf7gLKA/52Sne0AAAAAAAAAAAAAAAECAQIAAAEADUOCQcdwt23/Zati82GrXvVjrWD4XKlY9FqpVvZaqlX3UqZN81OnTvxYbFndGxcbNAAAAAAAAAAAAAAAAAABAQEAAAAAFBAUHTAzMGcqKipRJSclUS8wL14nJyZNKCspVy4uLlsiJCJKNjU2aQQABAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...........%0Athis.onclick%20%3De%3D%3E%20%7B%0A%20%20%20if%20%28%20e.button%20%3D%3D%3D%201%20%29%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28notepad%2C%20%7B%0A%20%20%20%20triggeringPrincipal%3A%20Services.scriptSecurityManager.getSystemPrincipal%28%29%0A%20%20%20%20%7D%29%3B%20//%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%20%20%20%20%0A%7D%3B%0A%0A//%20%u041E%u0431%u043D%u043E%u0432%u0438%u0442%u044C%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%20%u0432%20%u0442%u0435%u043A%u0443%u0449%u0435%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20%u043F%u043E%u0441%u043B%u0435%20%u043E%u0431%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...........%0Aif%20%28%20gBrowser.currentURI.spec%20%3D%3D%20notepad%20%29%20%7B%0A%20%20%20%20%20var%20val%20%3D%20content.document.getElementsByTagName%28%22textarea%22%29%5B0%5D.value%3B%0A%20%20%20%20%20loadURI%28notepad%29%3B%0A%20%20%20%20%20setTimeout%28%28%29%3D%3E%20content.document.getElementsByTagName%28%22textarea%22%29%5B0%5D.value%20%3D%20val%2C%20500%29%3B%20%20%20%20%20%0A%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%0A//%20%u041E%u0447%u0438%u0441%u0442%u0438%u0442%u044C%20%u0430%u0434%u0440%u0435%u0441%u043D%u0443%u044E%20%u0441%u0442%u0440%u043E%u043A%u0443%20%u0432%20%u043A%u043B%u0430%u0434%u043A%u0435%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%u0430%20...........%0AaddEventListener%28%22TabAttrModified%22%2C%20%28%29%3D%3E%20gBrowser.currentURI.spec%20%3D%3D%20notepad%20%26%26%20gURLBar.reset%28%29%29%3B%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0430%u0435%u043C%20%u0430%u0434%u0440%u0435%u0441%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%u0430%20%u043A%u0430%u043A%20base64%20%u0438%u0437%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0421%u043F%u0440%u0430%u0432%u043A%u0430%20%u0438%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0435%u043C%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u0434%u043B%u044F%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%u0430%20...........%0Avar%20notepad%20%3D%20%22data%3Atext/html%3Bbase64%2C%22%20+%20window.btoa%28self.getAttribute%28%27Help%27%29.replace%28%27selfImage%27%2C%20self.image%29%29%3B%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20...........%0Athis.tooltipText%20%3D%20%22%u0422%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0439%20%u0440%u0435%u0434%u0430%u043A%u0442%u043E%u0440%20%5Cn%u041B%u041A%u041C%3A%20Akelpad%20%5Cn%u0421%u041A%u041C%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%20%5Cn%u041F%u041A%u041C%3A%20CB%20%u043C%u0435%u043D%u044E%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20file%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.createInstance%28Ci.nsIFile%29%3B%0Afile.initWithPath%28%20%22c%3A%5C%5CProgram%20Files%5C%5CAkelPad%5C%5CAkelPad.exe%22%20%29%3B%0Afile.launch%28%29%3B%0A%0A%0A//%20%u0432%u0441%u043F%u043B%u044B%u0432%u0430%u044E%u0449%u0435%u0435%20%u0441%u043E%u043E%u0431%u0449%u0435%u043D%u0438%u0435%20....%0Avar%20alertsService%20%3D%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%3B%0AalertsService.showAlertNotification%28self.image%2C%20%22Akelpad%22%2C%20%22%u0417%u0430%u043F%u0443%u0441%u043A%u0430%u0435%u043C%20Akelpad%21%22%2C%20false%2C%20%22%22%2C%20null%2C%20%22%22%29%3B%0AsetTimeout%28%28%29%3D%3E%20alertsService.closeAlert%28%29%2C%202000%29%3B%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%3Cmeta%20http-equiv%3D%22Content-Type%22%20content%3D%22text/html%3B%20charset%3Dutf-8%22/%3E%3Ctitle%3ENotepad%3C/title%3E%0A%3Chead%3E%0A%20%3Clink%20rel%3D%22shortcut%20icon%22%20href%3D%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAApKSlRRkZGh0BAQHxBQUF+QUFBfkFBQX5BQUF+QEBAfEZGRogaGho1AAAAAAABAAECAgICAgICAgQEBAUAAAAAMTEwWeLi4f//////+vr6//r6+v/6+vr//Pz8//v7+//5+fn++/v7/7CwsPdNTU2hAQEBAgAAAAAAAAAAAwMDBAAAAABvbm+x8vHy/+Df4Pfi4+P76ubr++Lh4vvk5OT7/f39+/////v////77/Dv/aysrP8BEAElKngnxDCDLdEvgSzOLX8qy0GTPu1Zq1b/WatW/lasU/9op2f/xcPF/8PEw//i5+L/8vfx//H27//p6+n/qqqq/ESaQOS67a7/teip/rbpqv+36qv/suSm/6zfoP+s36D/teOo/4bNfP93s3b/39bf/9XY1f/5/Pj/+Pv2/+vs6/+qqar/T6RK8bvjsP6t2qT8sNym/LDcpvyx3af+st6o/7LeqP+w3ab/vuaz/1mqVP+2w7b/3dvd//D07//4+/f/6+zr/6qqqv8BNwFvndiU/8Djt/y34a//ueGw/7nhsP+54bD/ueGw/7jgr//B5Lj/mtSS/3q1ev/WzNb/4ufh//f79f/p6+n/qqqq/wAAAANHk0Pbzu/F/73gtP3A47f/wOO3/8Djt//A47f/wOO4/73itf/D5rn/Y7Je/7/MwP/k4eP/+f35/+vs6/+qqqr/AAAAAAAzAGap4KP/zebG+8Tkvv/G5b//xuS//8blv//F5b7/vuK2/8LkuP+U0Yv/ZaBl/97W3v/u9e3/6+3r/6qqqv8DAQMAAAAABE6XS+Db8dT/yuPD/czmxv/N5sf/zObG/8blv//A47j/t+Cu/7vjsP9nuWP/uMW5/+zr6//s7+z/qamq/wACAAQAAAAAATQBZrTir//a6dX70ufN/9Pozv/N5sf/xuS//8Djt/+44K//u+Ow/4zNgv9uqW7/6+Tr/+ru6v+qqar/AAAAAQMBAwAAAAAHVJhS2Or25v/W59L91OjP/8zmxv/G5b//wOO3/7rhsP+w3ab/tuSp/1isU/+vva//6+rq/6qqqv8AAAAAAQIBAwAAAAAENQRkv+S7/+Pr3vvR58z/zObG/8bkv/+/4rf/ueCw/7Hep/+z4Kf/h818/3Kucv/r4uv/qKqo/gAAAAAAAAABAwEDAAAAAApVl1TU7Pbo/9HlzP3P58j/xuS//8Ljuf+64bH/s9+p/6vcoP+t4KD/Wq5U/8bSx/23tLf9AAAAAAAAAAABAgEDAAAAAAk3CWaq36b/1unR+cLjvPzF5r78t+Cv/LXgrP2w36b8odmW/Kzgn/1yxGf7gLKA/52Sne0AAAAAAAAAAAAAAAECAQIAAAEADUOCQcdwt23/Zati82GrXvVjrWD4XKlY9FqpVvZaqlX3UqZN81OnTvxYbFndGxcbNAAAAAAAAAAAAAAAAAABAQEAAAAAFBAUHTAzMGcqKipRJSclUS8wL14nJyZNKCspVy4uLlsiJCJKNjU2aQQABAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22type%3D%22image/x-icon%22%3E%0A%3C/head%3E%0A%0A%3CTEXTAREA%3E%3C/TEXTAREA%3E%0A%3Cstyle%3E%0A%0Ahtml%20%7B%0A%20%20background-color%3A%20black%3B%0A%20%20overflow%3A%20hidden%3B%0A%7D%0Atextarea%20%7B%0A%20%20background%3A%20%23383838%3B%0A%20%20overflow-y%3A%20auto%3B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20border-radius%3A%202px%3B%0A%20%20border%3A%202px%20inset%20white%3B%0A%20%20color%3A%20white%3B%0A%7D%0A%3C/style%3E%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№1564119-06-2021 15:43:28

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

Re: Custom Buttons

Пострел пишет

https://cs.majento.ru/

Может так :/

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

Выделить код

Код:

Services.search.addPolicyEngine({

	iconURL: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAABM2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///LYKY/wAAAP8AAAD/AAAA/w8rMv8AAAD/AAAA/wAAAP8AAAD/BQ8R/0K93f9M2///TNv//0zb//9M2///Qr3d/wAAAP8AAAD/I2V2/yh0h/8odIf/LYKY/xlIVP8odIf/I2V2/wAAAP8KHCH/TNv//0zb//9M2///TNv//x5XZf8AAAD/KHSH/0zb//9M2///TNv//0zb//9M2///TNv//0K93f8AAAD/AAAA/0zb//9M2///TNv//0zb//8UOUP/AAAA/0zb//9M2///TNv//0zb//9M2///Qr3d/xQ5Q/8AAAD/AAAA/yNldv9M2///TNv//0zb//9M2///FDlD/wAAAP9M2///TNv//0zb//9M2///Qr3d/wAAAP8AAAD/Dysy/zeguv9M2///TNv//0zb//9M2///TNv//yh0h/8AAAD/Hldl/0zb//9M2///TNv//yh0h/8AAAD/I2V2/0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///AAAA/wAAAP8PKzL/FDlD/yNldv83oLr/AAAA/wAAAP8UOUP/AAAA/y2CmP9M2///TNv//0zb//9M2///TNv//0K93f8ZSFT/AAAA/wAAAP8ZSFT/TNv//yh0h/8FDxH/AAAA/wocIf8odIf/TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
	chrome_settings_overrides: {
		search_provider: {
			name: "ClearSearch – поиск в Яндексе без рекламы",
			search_url: "https://cs.majento.ru/search/",
			search_url_post_params: "phrase={searchTerms}"
		}
	}
});

ВВП пишет

Хочу чтобы кнопка Undo не реагировала на закрытые или открытые окна...

В каком смысле «не реагировала»? Можно попродробнее?


xrun1 пишет

Можно сделать тоже самое для ucf, тоько для ПКМ сделать эмуляцию, как СКМ с вставкой из буфера?

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

Выделить код

Код:

(async (html, self) => CustomizableUI.createWidget(self = {
	label: "Текстовый редактор",
	tooltiptext: [
		"Текстовый редактор",
		"ЛКМ: AkelPad",
		"ПКМ: Открыть блокнот"
	].join("\n"),
	akelpadPath: "C:\\Program Files\\AkelPad\\AkelPad.exe",
	image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAApKSlRRkZGh0BAQHxBQUF+QUFBfkFBQX5BQUF+QEBAfEZGRogaGho1AAAAAAABAAECAgICAgICAgQEBAUAAAAAMTEwWeLi4f//////+vr6//r6+v/6+vr//Pz8//v7+//5+fn++/v7/7CwsPdNTU2hAQEBAgAAAAAAAAAAAwMDBAAAAABvbm+x8vHy/+Df4Pfi4+P76ubr++Lh4vvk5OT7/f39+/////v////77/Dv/aysrP8BEAElKngnxDCDLdEvgSzOLX8qy0GTPu1Zq1b/WatW/lasU/9op2f/xcPF/8PEw//i5+L/8vfx//H27//p6+n/qqqq/ESaQOS67a7/teip/rbpqv+36qv/suSm/6zfoP+s36D/teOo/4bNfP93s3b/39bf/9XY1f/5/Pj/+Pv2/+vs6/+qqar/T6RK8bvjsP6t2qT8sNym/LDcpvyx3af+st6o/7LeqP+w3ab/vuaz/1mqVP+2w7b/3dvd//D07//4+/f/6+zr/6qqqv8BNwFvndiU/8Djt/y34a//ueGw/7nhsP+54bD/ueGw/7jgr//B5Lj/mtSS/3q1ev/WzNb/4ufh//f79f/p6+n/qqqq/wAAAANHk0Pbzu/F/73gtP3A47f/wOO3/8Djt//A47f/wOO4/73itf/D5rn/Y7Je/7/MwP/k4eP/+f35/+vs6/+qqqr/AAAAAAAzAGap4KP/zebG+8Tkvv/G5b//xuS//8blv//F5b7/vuK2/8LkuP+U0Yv/ZaBl/97W3v/u9e3/6+3r/6qqqv8DAQMAAAAABE6XS+Db8dT/yuPD/czmxv/N5sf/zObG/8blv//A47j/t+Cu/7vjsP9nuWP/uMW5/+zr6//s7+z/qamq/wACAAQAAAAAATQBZrTir//a6dX70ufN/9Pozv/N5sf/xuS//8Djt/+44K//u+Ow/4zNgv9uqW7/6+Tr/+ru6v+qqar/AAAAAQMBAwAAAAAHVJhS2Or25v/W59L91OjP/8zmxv/G5b//wOO3/7rhsP+w3ab/tuSp/1isU/+vva//6+rq/6qqqv8AAAAAAQIBAwAAAAAENQRkv+S7/+Pr3vvR58z/zObG/8bkv/+/4rf/ueCw/7Hep/+z4Kf/h818/3Kucv/r4uv/qKqo/gAAAAAAAAABAwEDAAAAAApVl1TU7Pbo/9HlzP3P58j/xuS//8Ljuf+64bH/s9+p/6vcoP+t4KD/Wq5U/8bSx/23tLf9AAAAAAAAAAABAgEDAAAAAAk3CWaq36b/1unR+cLjvPzF5r78t+Cv/LXgrP2w36b8odmW/Kzgn/1yxGf7gLKA/52Sne0AAAAAAAAAAAAAAAECAQIAAAEADUOCQcdwt23/Zati82GrXvVjrWD4XKlY9FqpVvZaqlX3UqZN81OnTvxYbFndGxcbNAAAAAAAAAAAAAAAAAABAQEAAAAAFBAUHTAzMGcqKipRJSclUS8wL14nJyZNKCspVy4uLlsiJCJKNjU2aQQABAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",

	id: "ucf-noteAkelPad",
	localized: false,
	onCreated(btn) {
		btn._handleClick = this.akelpad;
		btn.oncontextmenu = this.context;
		btn.setAttribute("image", this.image);
	},
	get akelpad() {
		delete this.akelpad;
		return this.akelpad = Components.Constructor(
			"@mozilla.org/file/local;1", "nsIFile", "initWithPath"
		)(self.akelpadPath).launch;
	},
	get url() {
		var u = (code, mime) => `data:${mime};charset=utf-8,${
			encodeURIComponent(code)
		}`;
		this.fs = u(`addEventListener("pageshow", e => {
			var ta = e.target.getElementById("ta");
			ta.focus();
			docShell.doCommand("cmd_paste");
			ta.editor.beginningOfDocument();
		}, {once: true});`, "");
		delete this.url;
		return this.url = u(html.replace("ICON", self.image), "text/html");
	},
	context(e) {
		if (e.ctrlKey || e.shiftKey) return;
		e.preventDefault();
		var gb = this.ownerGlobal.gBrowser;
		(gb.selectedTab = gb.addTrustedTab(self.url))
			.linkedBrowser.messageManager.loadFrameScript(self.fs, false);
	}
}))( // <!DOCTYPE HTML> breaks the style :(
`<html>
	<head>
		<title>Notepad</title>
		<link rel="shortcut icon" href="ICON">
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
		<style>
			html {
				overflow: hidden;
				background-color: black;
			}
			textarea {
				width: 100%;
				height: 100%;
				color: white;

				outline: none;
				padding: 2px 4px;
				/*resize: none;*/

				overflow-y: auto;
				border-radius: 2px;
				background: #383838;
				border: 2px inset white;
			}
		</style>
	</head>
	<body>
		<textarea id="ta"></textarea>
	</body>
</html>`);

Отсутствует

 

№1564219-06-2021 17:43:47

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 89.0

Re: Custom Buttons

Dumby

Dumby пишет

В каком смысле «не реагировала»? Можно попродробнее?

В смысле, undoclose.window не надо. Только вкладки закрытые, без закр.окон. Иногда окно выскочит(при авторизации,к примеру) ,а кнопка целую простынь показывает в popup
Пункты я убираю, но сама кнопка ярко горит...Короче, как бы не реагировать на undoclose.Window

Отсутствует

 

№1564319-06-2021 19:55:38

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

Re: Custom Buttons

ВВП пишет

Иногда окно выскочит(при авторизации,к примеру) ,а кнопка целую простынь показывает в popup
Пункты я убираю, но сама кнопка ярко горит...

Да, так понятнее, спасибо.
Даже не знаю, вот смотри — горит или не горит,
вроде, должно проходить через метод updUI()

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

Выделить код

Код:

…
    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;
    },


так вот, может там убрать && !this.closedWindowCount
то есть, останется только var dis = !tabsCount;

Отсутствует

 

№1564419-06-2021 21:04:16

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 89.0

Re: Custom Buttons

Dumby

Dumby пишет

так вот, может там убрать && !this.closedWindowCount

Класс!

Отсутствует

 

№1564519-06-2021 22:16:37

Пострел
Участник
 
Группа: Members
Зарегистрирован: 08-04-2021
Сообщений: 51
UA: Firefox 89.0

Re: Custom Buttons

ВВП, Dumby.

Все в елочку ©.
Очень благодарен вам, за вашу помощь. Спасибо.

Отсутствует

 

№1564619-06-2021 22:18:39

beggrr
Участник
 
Группа: Members
Зарегистрирован: 04-02-2014
Сообщений: 128
UA: Firefox 85.0

Re: Custom Buttons

beggrr пишет

Если popup окошко открыто с помощью window.open()
Можно каким то образом заставить ссылки в нем открываться в новых вкладках этого же окошка?
Сейчас я кликаю по ссылке и она открывается в текущей вкладке popup'а. А если выбираю в контекстном меню ссылки "Открыть в новой вкладке", то открывается во вкладке основного окна.

Никто не  ответит? :(

Отсутствует

 

№1564719-06-2021 23:14:05

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

Re: Custom Buttons

beggrr пишет

Никто не  ответит?

Ну, если вопрос адресован тем, у кого нередко

popup окошко открыто с помощью window.open()

то, скорее всего, нет. Если бы ответ был, то уже запостили бы, наверно.


А если вопрос адресован более широкой аудитории,
то шансов ещё меньше. Ведь тогда, как бы, просматривается предложение
переспрашивать что-то типа: «а что за window?», «а какие аргументы
передаются в его метод open()», иначе говоря — «как этот попап можно увидеть?».


Но выканючивать то, что и так должно быть в вопросе, странно же.
Впрочем, дело такое, «под настроение».

Отсутствует

 

№1564820-06-2021 00:19:05

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

Re: Custom Buttons

Dumby
Спасибо, как всегда выручаете!

Отсутствует

 

№1564920-06-2021 10:52:07

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 316
UA: Firefox 87.0

Re: Custom Buttons

xrun1
А код кнопки в custom_script.js помещать?

Отсутствует

 

№1565020-06-2021 13:09:56

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

Re: Custom Buttons

Garalf
Код сохранить, например, как noteAkelPad.js и в custom_script.js loadscript("noteAkelPad.js");

Отсутствует

 

Board footer

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