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

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

№1615116-01-2022 11:52:18

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

Re: Custom Buttons

Dumby

Dumby пишет

Наверно считается, что это удобно.

Так, а шо делать ? Рихтую,рихтую и никак...Вру, сделал...Похожая шняга с editBMPanel_namePicker , от тут не знаю.
Да нет, нашел в editBookmark.js ,короче, меняю на focused

Отредактировано ВВП (16-01-2022 12:41:45)

Отсутствует

 

№1615216-01-2022 21:29:06

Азат55555
Участник
 
Группа: Members
Зарегистрирован: 01-11-2018
Сообщений: 28
UA: Yandex 22

Re: Custom Buttons

Простите что отвлекаю. Как заархивировать папку? Есть папка по пути C:\\Папка нужно через CB превратить в Папка.rar

Отсутствует

 

№1615317-01-2022 21:11:54

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

Re: Custom Buttons

Азат55555 пишет

Как заархивировать папку? Есть папка по пути C:\\Папка нужно через CB превратить в Папка.rar

Запустить программу-архиватор с аргументами, очевидно же.

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

Выделить код

Код:

var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
process.startHidden = true;

process.init(FileUtils.File("C:\\Program Files (x86)\\WinRAR\\rar.exe"));

var args = ["a", "-ep1", "-r", "Y:\\Папка.rar", "C:\\Папка\\*"];

process.runw(false, args, args.length);

Отсутствует

 

№1615419-01-2022 15:31:28

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

Re: Custom Buttons

Dumby
Переделайте пожалуйста кнопочку для UCF.

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

Выделить код

Код:

/*Initialization Code*/

// Сохранить как PNG ..........
((main, parts) => this._handleClick = () => {
    var df = MozXULElement.parseXULToFragment(`
        <menupopup>
            <menuitem class="menuitem-iconic"
                image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAOwSURBVHjaYmBiYuJvamo+xiIsLLL3uaazMUAAMTY3txxjAAFubq7/ZiYm/wECACIA3f8AGhobzGhoaP8QFRr/6enp/wT5+fgBLS0tAOLi4gCnp6cAAoixtrbuFBsb6x+QNnZ2jo0MXz9/+Qdk/wfhO3fu/Gc5cuwoA4NqHEOoszjDrVu3GFiAogxJtiwMagrCQHMeMgAEoHhsdRCG4Tj463+rxGFIqN2CYI7wBpiaWhzPheF5SMhIKliCYiQtyTC4hvSLcu7cHYQQl5SSDyFGa23UWkfvfXTORWNMpiIYH2NV1xXN5gvq9kfqNjtSStF7mkAhBPTXHm3TYL1qsV2+8LyfIaXEbRjAyuzpUOCcI+cMYgzp31hCnft+fgII6Cm95oiICOd///4CFTAwAOWBgBFIM7Lw8vLZM5w7d+7/t2/fwA4DOfDp02d/QQ4GWv1z6tSpU5g+ffrI8OnTJyagFUx2Tu5MsnIyTDk52UyfPn5k/vXr9x+mjx8+MsTFxTGERMUzVK09yCAsn8AwY+ZMhlevX0Pc9PTZM4a3b94wXHjwmaEsu5th87GpQIcyMdy+fZvh79+/DEwfP35giIuPZ3hzbTeDCtcjhngnEwZVVRWGz58/g+ON5dOnz6BYYKioqGY4eOggg5SuBYORkRHDixcvQL5hZNTR0flnY2PD+O8fKAwYgGHwHyTMwMzMwrBt2zZHgAA9Uz1Lw1AUPWlKE1vFlEIFHRoKQgcRtDSLIAiCgoJuiovYP6DopnR1EdRYHO3W6tbg5K5LwclmVQviRwutpSaQtI3P+yIK7/Eu94t77jkPiqIcGUaZ5vlmlvXFbNui12LEBSPo/uU29/EYrYQ1m01WqVRYPn++FQiHI3Mj8RG4jst7wHFcFAoFaFoGsixBliRoGc338dg3AQuKojc2OoZ+vzcZ4JRwQNQAxVIJsVgMuVwO8/OL2D29xPjSHvpCHAf7+36M57iuSzUdnzISg4d3AvxgVqHrJ5BCIcxu7KCdWoLx3MFLaBjOxDJSC1lIsowzXUfVNFEnJflrJi2i1WrBtm1MpzNgAoN5U8TtySE61Sccb6/jIjuF3uMduo5DOWk/l9fwxQr0o+6J+rSqqlxjQq1WQ9kw8PH2CoF5cLtd8gaRSCSwsrqKZDJJu3A8WZbFer2hB2nLAc5ZNBplHFskEsEmSUcURV8q+GXTH5ffBo1OUzNFGUa7/cm4eGcEIbA2MBBW6df8VnC1s3/zv8mfScchaq+GhgavfwBr4dP0kYqtcwAAAABJRU5ErkJggg=="
                label="Сохранить всю страницу как PNG"
                value="all"/>

            <menuitem class="menuitem-iconic"
                image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAOwSURBVHjaYmBiYuJvamo+xiIsLLL3uaazMUAAMTY3txxjAAFubq7/ZiYm/wECACIA3f8AGhobzGhoaP8QFRr/6enp/wT5+fgBLS0tAOLi4gCnp6cAAoixtrbuFBsb6x+QNnZ2jo0MXz9/+Qdk/wfhO3fu/Gc5cuwoA4NqHEOoszjDrVu3GFiAogxJtiwMagrCQHMeMgAEoHhsdRCG4Tj463+rxGFIqN2CYI7wBpiaWhzPheF5SMhIKliCYiQtyTC4hvSLcu7cHYQQl5SSDyFGa23UWkfvfXTORWNMpiIYH2NV1xXN5gvq9kfqNjtSStF7mkAhBPTXHm3TYL1qsV2+8LyfIaXEbRjAyuzpUOCcI+cMYgzp31hCnft+fgII6Cm95oiICOd///4CFTAwAOWBgBFIM7Lw8vLZM5w7d+7/t2/fwA4DOfDp02d/QQ4GWv1z6tSpU5g+ffrI8OnTJyagFUx2Tu5MsnIyTDk52UyfPn5k/vXr9x+mjx8+MsTFxTGERMUzVK09yCAsn8AwY+ZMhlevX0Pc9PTZM4a3b94wXHjwmaEsu5th87GpQIcyMdy+fZvh79+/DEwfP35giIuPZ3hzbTeDCtcjhngnEwZVVRWGz58/g+ON5dOnz6BYYKioqGY4eOggg5SuBYORkRHDixcvQL5hZNTR0flnY2PD+O8fKAwYgGHwHyTMwMzMwrBt2zZHgAA9Uz1Lw1AUPWlKE1vFlEIFHRoKQgcRtDSLIAiCgoJuiovYP6DopnR1EdRYHO3W6tbg5K5LwclmVQviRwutpSaQtI3P+yIK7/Eu94t77jkPiqIcGUaZ5vlmlvXFbNui12LEBSPo/uU29/EYrYQ1m01WqVRYPn++FQiHI3Mj8RG4jst7wHFcFAoFaFoGsixBliRoGc338dg3AQuKojc2OoZ+vzcZ4JRwQNQAxVIJsVgMuVwO8/OL2D29xPjSHvpCHAf7+36M57iuSzUdnzISg4d3AvxgVqHrJ5BCIcxu7KCdWoLx3MFLaBjOxDJSC1lIsowzXUfVNFEnJflrJi2i1WrBtm1MpzNgAoN5U8TtySE61Sccb6/jIjuF3uMduo5DOWk/l9fwxQr0o+6J+rSqqlxjQq1WQ9kw8PH2CoF5cLtd8gaRSCSwsrqKZDJJu3A8WZbFer2hB2nLAc5ZNBplHFskEsEmSUcURV8q+GXTH5ffBo1OUzNFGUa7/cm4eGcEIbA2MBBW6df8VnC1s3/zv8mfScchaq+GhgavfwBr4dP0kYqtcwAAAABJRU5ErkJggg=="
                label="Сохранить видимую часть страницы как PNG"
                value="page"/>

            <menuitem class="menuitem-iconic"
                image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKaSURBVHjaYpx94sPD44//CDG9+/SDp8bsBw9AADEmrX7zmQEIGF+//fD/w8dPDAABxNix6/nbcA0GIQYoYGJiZGSQFBdmOHnqLAMrKwsDQAAxJq958/n/f4jsm2//GBifP3v+/8cfiMDDj/8ZmHi5ORl4gPjPn18M///9ZWDh5uVm4GJkYfj56zcD9z9GBoAAYmwH2aL8UwimDRk8+fyfgYWRgZFBgI+b4TsWBR+BtoNcxcDDwwW2R1iQn2HvgcMMX799Y/j6/TvDzz+/GVj+/fvPvO0BC8N/oGpGhv8ML3m0GS59EwWbcP/9XwaAAGSRwQ3CMAxFfxq3TgrqiSMswARMwSJMxZEdGAXBAEiQquICJMFuekDqwTlY38/Wi9kf78OqNTO8kndretBh+1puuvl+R8Dpwm9iruG8xPP/tIGzhULc1OB6voJJXxGjQpumGpsKCc8wEqISwGJfA1P1IYCEmCegkTmqLIELT/8KC+/x+cbxBpEPOl8zbn0q5voWXdcipQQrgZiC/QlQORmzNBAEUfjt7N4ichBUDIKCWNsJhiBiZ2mZf5XC0v/gT7C10lqwNMVBkBC9kKAmt7e+uQtJxBS6cNwy7L2b981bTrz/fnmIxnHTYN081i1F8PQacddDzm0M+UfAYPw/gfyTlqMNVfOJVxIGpfxNgMcZRwoYpkVpe1ezLn/jplc7B2wWb+1gwwfuvxg31lwi7MAimOU4E+IevuXoXt+gILTE1aQ1VBJnwNYR9ltXFKCweM9RWFpYCnjWiukU7dYJLs7PUMyKuglNAZt6GVncZ7SgIU2ZJ8M/bLqVQEFYN9hJPQ5201pgvhztjnk2ZhOYh+esd/vY39ZPZYWBXlURqZ4Qwg8uZXU3gM7p3vAbsXveewxHZWUAAAAASUVORK5CYII="
                label="Сохранить выбранный элемент страницы как PNG"
                value="click"/>

            <menuitem class="menuitem-iconic"
                image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAL/SURBVHjaYijccvd25ZHvv5n4RSUVQs2vswAEECOIxwACy+8v/3/30Zv/AAHE0Hb6y+//UPDv4///LD/+MjJ8+PqF4cvnnww/vgkxAAQQY8Xhb78YgQCsj5mFgQGm/P+v///fvvj/n+n/fwaGe//vMexg2Mrw7BsDA8vXHwwMPN/5GdQ/mzG8BbIBAoiRfdqvX8xf/rBCDAEaAWL8ByOgmZwMLBXGvxnrzLgYVj9cyfCL+TfDj9+/Gd7//sAQw5vK8PEXAwMTRBsD0Li3DNKikgwC4twM3NIMDF9/fGf4CVTA8u0fM+ODjwwM7qJZDH8/MTBI/GFgUAba/QYo+fEnAwNAADKoXQVhIAjOJYfgsxIR/AwRi/yBlY3gz9j7FUI+wt7CwkbEzs7CNIo2Yl53t3duElDBhYXZZXaWGbHYKW0M4b+cex7WG9FaxmxGfNcfYNH3T+pr/LcSzu1h3Wx11EU2eOkYYRSi7jVgrQeb1TDtzFHkLgu13GQIBgGkJ6GFxva8h6XqX0kgRlF+AfkEw4S7ujEGbKnAzDa6GNEYLvOh2N6wOUGaVXHKayqQsHeiHgyfqKJ51sbxjvAWoG1qWWkYiKJnZhKTpgapK1tEslRw50+4camIGz/ObfcuBP0HBREEn12I+MBUadPM5HomqbWgi8kJydzHOfdctXmU29Vhbhqq8leNfxQyLP6lWgjjdxds9Yxs95ZRVAo+h8yFqEau2fHEKjpKqgojRDg+H0iw1gb212NY2oC/MCxz5DxGaYgPsKrGsnRYUEusnvKb4MNqnBlN5aZD8q54Hb2gP+gj62bohOyKdVxgobTBk3vE7cMzDhYPkVA0NW0xaBrlk6BZtRN20I16SMIWPt0CJlLQowqJStE2YwqnQRbE2ZwazrYURDquL5zcnCINU4xdiYo7QXXo4TesSMaIGGRTJ6jnqBxvkJNwfhFa2Ovu1jlrwXjD2gZ9wITeKVhImEFXgXcIgrvri/udqySztpDZemJurTzK70h/3h1xY3xpvwGLI42vrCwxmAAAAABJRU5ErkJggg=="
                label="Сохранить выбранную область страницы как PNG"
                value="clipping"/>
        </menupopup>
    `);
    var popup = df.firstChild;
    popup.setAttribute("context", "");
    popup.setAttribute("oncommand", "handleCommand(event);");
    popup.handleCommand = e => {
        var name = _id + ":DataURLReady";
        main = main.replace("%MESSAGE_NAME%", name);

        var urls = {}, configurable = true, enumerable = true;
        Object.entries(parts).forEach(([key, part]) => Object.defineProperty(urls, key, {
            configurable, enumerable, get() {
                var value = `data:;charset=utf-8,({${
                    encodeURIComponent(main + part)
                }%0A}).init("${key}")`;
                Object.defineProperty(urls, key, {configurable, enumerable, value});
                return value;
        }}));

        // Получить название вкладки без не сохраняемых символов и лишних пробелов .....
        var getTabLabel = () => {
            var label = gBrowser.selectedTab.label;
            var label = label.replace(/[:+.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " ");
            return label.substring(0, 50);
        }

        var listener = msg => {
            var fp = makeFilePicker();
            fp.init(window, "Сохранить как…", fp.modeSave);
            fp.appendFilter("", "*.png");

            var fileName = getTabLabel();
            fileName = fileName.replace(/[:\\\/<>?*|"]+/g, '').replace(/\s+/g, '_').slice(0, 100).replace(/^\s+|\s+$/g, '');
            var fileDate = (function () {
              var d = new Date(), z = function(n){return (n < 10 ? '0' : '') + n};
              return '[' + z(d.getFullYear()) + '_' + z(d.getMonth()+1) + '_' + z(d.getDate()) + '\u00F7' + z(d.getHours()) + '_' + z(d.getMinutes()) + '_' + z(d.getSeconds()) + ']';
            })();

            fp.defaultString = fileName + "_" + fileDate + ".png";
            fp.open(res => res == fp.returnCancel || !fp.file || makeWebBrowserPersist().saveURI(
                Services.io.newURI(msg.data), document.nodePrincipal,
                null, null, null, null, null, fp.file, null, null
            ));
        }
        messageManager.addMessageListener(name, listener);
        addDestructor(() => messageManager.removeMessageListener(name, listener));

        (popup.handleCommand = e => gBrowser.selectedBrowser.messageManager
            .loadFrameScript(urls[e.target.value], false)
        )(e);
    }
    this.append(df);
    (this._handleClick = () => popup.openPopup(this, "after_start"))();
})(`
    init(cmd) {
        cmd.startsWith("c")
            ? this[cmd].init(this[cmd].parent = this)
            : this[cmd]();
    },
    capture(win, x, y, width, height) {
        var canvas = win.document.createElementNS("${xhtmlns}", "canvas");
        canvas.width = width;
        canvas.height = height;
        var ctx = canvas.getContext("2d");
        var tryDraw = ind => {
            try {ctx.drawWindow(win, x, y, canvas.width, canvas.height, "white")}
            catch(ex) {canvas.height = ind * canvas.width; tryDraw(--ind);}
        }
        tryDraw(17);
        sendAsyncMessage("%MESSAGE_NAME%", canvas.toDataURL("image/png"));
    },
    `, {

    all: `all() {
        var win = content;
        this.capture(win, 0, 0, win.innerWidth + win.scrollMaxX, win.innerHeight + win.scrollMaxY);
    }`,
    page: `page() {
        var win = content, doc = win.document, body = doc.body, html = doc.documentElement;
        var scrX = (body.scrollLeft || html.scrollLeft) - html.clientLeft;
        var scrY = (body.scrollTop || html.scrollTop) - html.clientTop;
        this.capture(win, scrX, scrY, win.innerWidth, win.innerHeight);
    }`,
    clipping: `clipping: {
        handleEvent(e) {
            if (e.button) return false;
            e.preventDefault();
            e.stopPropagation();
            switch(e.type) {
                case "mousedown":
                    this.downX = e.pageX;
                    this.downY = e.pageY;
                    this.bs.left = this.downX + "px";
                    this.bs.top = this.downY + "px";
                    this.body.appendChild(this.box);
                    this.flag = true;
                    break;
                case "mousemove":
                    if (!this.flag) return;
                    this.moveX = e.pageX;
                    this.moveY = e.pageY;
                    if (this.downX > this.moveX) this.bs.left = this.moveX + "px";
                    if (this.downY > this.moveY) this.bs.top  = this.moveY + "px";
                    this.bs.width = Math.abs(this.moveX - this.downX) + "px";
                    this.bs.height = Math.abs(this.moveY - this.downY) + "px";
                    break;
                case "mouseup":
                    this.uninit();
                    break;
            }
        },
        init() {
            var win = {};
            Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager)
                .getFocusedElementForWindow(content, true, win);
            this.win = win.value;

            this.doc = this.win.document;
            this.body = this.doc.body;
            if (!HTMLBodyElement.isInstance(this.body)) {
                Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
                    .showAlertNotification("${self.image}", ${JSON.stringify(self.label)}, "Не удается захватить!");
                return false;
            }
            this.flag = null;
            this.box = this.doc.createElement("div");
            this.bs = this.box.style;
            this.bs.border = "#0f0 dashed 1px";
            this.bs.position = "absolute";
            this.bs.zIndex = "2147483647";
            this.defaultCursor = this.win.getComputedStyle(this.body, "").cursor;
            this.body.style.cursor = "crosshair";
            ["click", "mouseup", "mousemove", "mousedown"].forEach(type=> this.doc.addEventListener(type, this, true));
        },
        uninit() {
            var pos = [this.win, parseInt(this.bs.left), parseInt(this.bs.top), parseInt(this.bs.width), parseInt(this.bs.height)];
            this.body.style.cursor = this.defaultCursor;
            this.body.removeChild(this.box);
            this.parent.capture.apply(this, pos);
            ["click", "mouseup", "mousemove", "mousedown"].forEach(type=> this.doc.removeEventListener(type, this, true));
        }
    }`,
    click: `click: {
        getPosition() {
            var html = this.doc.documentElement;
            var body = this.doc.body;
            var rect = this.target.getBoundingClientRect();
            return [
                this.win,
                Math.round(rect.left) + (body.scrollLeft || html.scrollLeft) - html.clientLeft,
                Math.round(rect.top) + (body.scrollTop || html.scrollTop) - html.clientTop,
                parseInt(rect.width),
                parseInt(rect.height)
            ];
        },
        highlight() {
            this.orgStyle = this.target.hasAttribute("style") ? this.target.style.cssText : false;
            this.target.style.cssText += "outline: red 1px solid; outline-offset: 1px; -moz-outline-radius: 2px;";
        },
        lowlight() {
            if (this.orgStyle) this.target.style.cssText = this.orgStyle;
            else this.target.removeAttribute("style");
        },
        handleEvent(e) {
            switch(e.type){
                case "click":
                    if (e.button) return;
                    e.preventDefault();
                    e.stopPropagation();
                    this.lowlight();
                    this.parent.capture.apply(this, this.getPosition());
                    this.uninit();
                    break;
                case "mouseover":
                    if (this.target) this.lowlight();
                    this.target = e.target;
                    this.highlight();
                    break;
            }
        },
        init() {
            this.win = content;
            this.doc = content.document;
            ["click", "mouseover"].forEach(type=> this.doc.addEventListener(type, this, true));
        },
        uninit() {
            this.target = false;
            ["click", "mouseover"].forEach(type=> this.doc.removeEventListener(type, this, true));
        }
    }`
});


«The Truth Is Out There»

Отсутствует

 

№1615520-01-2022 17:05:29

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

Re: Custom Buttons

unter_officer пишет

Переделайте пожалуйста кнопочку для UCF.

Нехочу. Можешь просто сам обернуть, типа

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

Выделить код

Код:

(async func => CustomizableUI.createWidget({
	id: "797743",
	label: "Сохранить как PNG",
	tooltiptext: "Сохранить как PNG",
	localized: false,
	onCreated(btn) {
		var win = btn.ownerGlobal;
		new win.Function("_id, xhtmlns, addDestructor", func.toString().slice(7, -1)).call(
			btn, this.id, "http://www.w3.org/1999/xhtml",
			destructor => win.addEventListener("unload", destructor, {once: true})
		);
		btn.setAttribute("image", "resource://usercontext-content/pet.svg");
	}
}))(() => {

// Здесь код

});


Bug 1743099 - Remove unused AddonType bits (Firefox 98+)
Кнопки с about:addons тю-тю. Соберу сейчас, на всякий случай.


Custom Buttons 0.0.7.0.0.23, paxmod и bootstrap в zip-папке.

Отсутствует

 

№1615620-01-2022 20:29:54

negodnik
 
 
Группа: Members
Зарегистрирован: 14-03-2013
Сообщений: 608
UA: Seamonkey 2.38
Веб-сайт

Re: Custom Buttons

Товарищи, есть пара вопросов по кнопкам (Windows 7, Fx 91.4.1 ESR (32 бита)).

1. Раньше, до WE, Attributes Inspector показывал BODY и все «внутренности», а теперь только browser,
(на страницах about:* продолжает показывать элементы html).
Элементы chrome продолжает нормально показывать. Подключён через ucf.
Так и должно быть или я что-то сломал?
 
2. Кнопка «Миниатюры страниц»

скрытый текст
Хочу скрыть иконку кнопки с панели. Добавил вначале кода
self.style.display = 'none';
Перестали отображаться миниатюры.
 
Пробую:
getElementById("custombuttons-button6").style.display = null;
не работает, не скрывает иконку на панели
 
Пробую:
document.getElementById("custombuttons-button6").style.display = "none";
скрывает иконку, но миниатюры не отображаются
 
Можно что-то придумать?


3. Полный ноль в скриптах решил таки сделать кнопку

скрытый текст
Хочу «нажать» на кнопку "Minimize memory usage" на странице about:memory
через клик на ucf «Суммарный жор памяти»,
а именно, на отображаемое в адресной строке число #ucf-mem-indicator-label
(третий спойлер https://forum.mozilla-russia.org/viewto … 99#p790199)

Первый вариант:

Выделить код

Код:

var elem = document.getElementById("ucf-mem-indicator-label");
elem.onclick = doMMU;

function doMMU() {
  Services.obs.notifyObservers(null, "child-mmu-request");
  gMgr.minimizeMemoryUsage(() =>
    updateMainAndFooter(
      "Memory minimization completed",
      SHOW_TIMESTAMP,
      HIDE_FOOTER
    )
  );
}

Ошибка в консоли
Uncaught ReferenceError: gMgr is not defined
    doMMU chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button9@init line 1 > Function:10
button.js:10:3
    doMMU chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button9@init line 1 > Function:10


 
Второй вариант:

Выделить код

Код:

let gMgr = Cc["@mozilla.org/memory-reporter-manager;1"].getService(
  Ci.nsIMemoryReporterManager
);

var elem = document.getElementById("ucf-mem-indicator-label");
elem.onclick = doMMU;

function doMMU() {
  Services.obs.notifyObservers(null, "child-mmu-request");
  gMgr.minimizeMemoryUsage(() =>
    updateMainAndFooter(
      "Memory minimization completed",
      SHOW_TIMESTAMP,
      HIDE_FOOTER
    )
  );
}

Ошибка в консоли
Uncaught ReferenceError: updateMainAndFooter is not defined
    doMMU chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button9@init line 1 > Function:15
button.js:15:5
 
Третий нерабочий вариант без ошибок

Выделить код

Код:

let gMgr = Cc["@mozilla.org/memory-reporter-manager;1"].getService(
  Ci.nsIMemoryReporterManager
);

var elem = document.getElementById("ucf-mem-indicator-label");
elem.onclick = doMMU;

function doMMU() {
  Services.obs.notifyObservers(null, "child-mmu-request");
  gMgr.minimizeMemoryUsage(() =>
alert('Да пошло всё в жопу!\nОпять ничего не очистилось.')
  );
}

Отсутствует

 

№1615721-01-2022 00:02:02

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

Re: Custom Buttons

negodnik пишет

Раньше, до WE, Attributes Inspector показывал BODY и все «внутренности», а теперь только browser
Так и должно быть или я что-то сломал?

Да, так и должно быть.
Attributes Inspector показывает то, что есть.
В многопроцессном Firefox вэбские „BODY и все «внутренности»”
находятся в другом процессе, то есть показывать просто нечего.

Хочу скрыть иконку кнопки с панели.
Перестали отображаться миниатюры.
Можно что-то придумать?

Миниатюры отображаются в <menupopup>, который,
в случае CB, добавляется как дочерний элемент самой кнопки.
Если кнопку скрыть, то и menupopup, соответственно, тоже будет скрытым.


Неужели нет ни одной кнопки без menupopup,
которая не жертва «Хочу скрыть», чтобы просто дописать (добавить)
этот код ей в Инициализацию.
В конце концов, можно подключить этот код в UCF custom_script_win.js

Третий нерабочий вариант без ошибок

Вариант рабочий, просто елемента ещё пока нет.
Может заверни в таймаут setTimeout(() => {/* Здесь код*/}, 2500);

Отсутствует

 

№1615821-01-2022 00:49:35

negodnik
 
 
Группа: Members
Зарегистрирован: 14-03-2013
Сообщений: 608
UA: Seamonkey 2.38
Веб-сайт

Re: Custom Buttons

Спасибо большое.
Про добавление в «чужую» инициализацию забыл, да для меня и не очень хорошо, если придётся обновлять кнопку, то ведь всю инициализацию смахну. Добавил код в custom_script_win.js. Работает.
Насчёт очистки памяти. Весь код завернул в таймаут, надеюсь, что это правильно.
Память, видимо из вредности, теперь сама отдаётся, не дожидаясь нажатия.

Отсутствует

 

№1615921-01-2022 02:16:41

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

Re: Custom Buttons

Dumby пишет

Нехочу. Можешь просто сам обернуть, типа

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

Выделить код

Код:

(async func => CustomizableUI.createWidget({
	id: "797743",
	label: "Сохранить как PNG",
	tooltiptext: "Сохранить как PNG",
	localized: false,
	onCreated(btn) {
		var win = btn.ownerGlobal;
		new win.Function("_id, xhtmlns, addDestructor", func.toString().slice(7, -1)).call(
			btn, this.id, "http://www.w3.org/1999/xhtml",
			destructor => win.addEventListener("unload", destructor, {once: true})
		);
		btn.setAttribute("image", "resource://usercontext-content/pet.svg");
	}
}))(() => {

// Здесь код

});

Большое спасибо.


«The Truth Is Out There»

Отсутствует

 

№1616021-01-2022 08:34:28

dedfor
Участник
 
Группа: Members
Зарегистрирован: 22-12-2016
Сообщений: 62
UA: Yandex 22

Re: Custom Buttons

Здравствуйте! Кто-нибудь сталкивался с проблемой горячих клавиш? Есть ли способ назначить для СВ "Горячее" сочетание клавиш так, что бы она срабатывала даже если по каким-то причинам сменилась раскладка клавиатуры?

Отредактировано dedfor (22-01-2022 07:27:16)

Отсутствует

 

№1616123-01-2022 03:17:01

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

Re: Custom Buttons

Dumby
Переделайте пожалуйста кнопочку для UCF.

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

Выделить код

Код:

/*Initialization Code*/

// Открывать ссылки длинным кликом ..........
// https://forum.mozilla-russia.org/viewtopic.php?pid=720922#p720922 .....
(code => {
	var delay = 500;               // время удержания в мс
	var inBackground = false;      // открывать в фоновой вкладке
	var relatedToCurrent = false;  // открывать рядом с related вкладкой

	var p = "CB" + _id.slice(20) + ":LongPressHandler:";
	var msgDestroy = p + "Destroy", msgResponse = p + "Response";
	code = code.replace(/%MD%/g, msgDestroy).replace("%MR%", msgResponse)
		.replace("%DL%", delay).replace("%BG%", inBackground);

	var url = "data:," + encodeURIComponent(code);
	var mm = window.getGroupMessageManager("browsers");
	mm.loadFrameScript(url, true);

	function handleLongPress(msg) {
		var [link, ref, ctrl] = msg.data;
		var bg = inBackground != null ? inBackground
			: Services.prefs.getBoolPref("browser.tabs.loadInBackground");
		gBrowser.loadOneTab(link, { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() }), {
			relatedToCurrent, inBackground: ctrl != bg, //referrerURI: makeURI(ref)
		};
	}
	mm.addMessageListener(msgResponse, handleLongPress);

	addDestructor(() => {
		mm.removeDelayedFrameScript(url);
		mm.broadcastAsyncMessage(msgDestroy);
		mm.removeMessageListener(msgResponse, handleLongPress);
	});
})(`({
	init() {
		addEventListener("mousedown", this, false);
		addMessageListener("%MD%", this);
	},
	receiveMessage() {
		removeEventListener("mousedown", this, false);
		removeMessageListener("%MD%", this);
	},
	handleEvent(e) {
		if (e.type == "mousedown") {
			if (e.button || e.shiftKey || e.altKey || e.detail != 1) return;

			var a = e.originalTarget.closest("a[href]");
			if (!a || a.href.startsWith("javascript:")) return;

			this.ctrl = e.ctrlKey;
			this.initLongPress(a);
		} else {
			if (e.type == "click" && !this.link) e.preventDefault();
			this.destroyLongPress();
		}
	},
	get timer() {
		delete this.timer;
		return this.timer = Cc["@mozilla.org/timer;1"]
			.createInstance(Ci.nsITimer);
	},
	notify() {
		sendSyncMessage("%MR%", [this.link.href, this.link.ownerDocument.URL, this.ctrl]);
		this.link = null;
		if (!%BG%) this.destroyLongPress();
	},
	initLongPress(a) {
		addEventListener("click", this, true);
		addEventListener("dragstart", this, false);
		this.timer.initWithCallback(this, %DL%, this.timer.TYPE_ONE_SHOT);
		this.link = a;
	},
	destroyLongPress() {
		removeEventListener("click", this, true);
		removeEventListener("dragstart", this, false);
		this.link && this.timer.cancel();
		this.link = null;
	}
}).init();`);


«The Truth Is Out There»

Отсутствует

 

№1616224-01-2022 01:25:27

Ki_rrrilll
Участник
 
Группа: Members
Зарегистрирован: 22-11-2013
Сообщений: 127
UA: Firefox 85.0

Re: Custom Buttons

Я хочу сделать следующее.


Нажимаю левую кнопку мыши, затем нажимаю правую, держу нажатыми в течение допустим 2 сек. После этого запускается нужная мне функция. Но если за эти 2 сек. была отпущена любая кнопка мыши, то всё сбрасывается, все таймауты обнуляются.


Можно это реализовать?

Отсутствует

 

№1616324-01-2022 18:02:27

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

Re: Custom Buttons

Dumby
Нет ли кода стоп-видео ? Выкл. звук не то. Может в настройках ? Хочу при минимизации окна добавить ...Пока просто добавляю BrowserReload();
Вроде не кошерно как-то...

скрытый текст
<toolbarbutton class="titlebar-button titlebar-min"
                   oncommand="window.minimize(); BrowserReload();"
                   data-l10n-id="browser-window-minimize-button"
                   />

Отредактировано ВВП (24-01-2022 18:40:31)

Отсутствует

 

№1616425-01-2022 11:45:03

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

Re: Custom Buttons

unter_officer пишет

Переделайте пожалуйста кнопочку для UCF.

JSM'ка

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

Выделить код

Код:

var delay = 500;               // время удержания в мс
var inBackground = false;      // открывать в фоновой вкладке
var relatedToCurrent = false;  // открывать рядом с related вкладкой

var name = "LPA", EXPORTED_SYMBOLS = [name + "Child", name + "Parent"];

var u = {get timer() {
	delete this.timer;
	return this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
}};
inBackground == null
	? Object.defineProperty(u, "bg", {
		get: Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch)
			.getBoolPref.bind(null, "browser.tabs.loadInBackground")
	})
	: u.bg = inBackground;
//ChromeUtils.defineModuleGetter(u, "E10SUtils", `resource://gre/modules/E10SUtils.jsm`);

if (!ChromeUtils.domProcessChild.childID) {
	var triggeringPrincipal = Cu.getObjectPrincipal(Cu);
	var LPAParent = class extends JSWindowActorParent {
		receiveMessage(msg) {
			var [link, inBackground, ref] = msg.data;
			this.manager.browsingContext.top
				.embedderElement.ownerGlobal.gBrowser.loadOneTab(link, {
					triggeringPrincipal, relatedToCurrent, inBackground,
					//referrerInfo: u.E10SUtils.deserializeReferrerInfo(ref)
				});
		}
	}
	ChromeUtils.registerWindowActor(name, {
		allFrames: true,
		parent: {moduleURI: __URI__},
		messageManagerGroups: ["browsers"],
		child: {moduleURI: __URI__, events: {mousedown: {}}}
	});
}

class LPAChild extends JSWindowActorChild {
	handleEvent(e) {
		if (e.type == "mousedown") {
			if (e.button || e.shiftKey || e.altKey || e.detail != 1) return;

			var a = e.originalTarget.closest("a[href]");
			if (!a || a.href.startsWith("javascript:")) return;

			this.ctrl = e.ctrlKey;
			this.initLongPress(a);
		}
		else
			e.type == "click" && !this.link && e.preventDefault(),
			this.destroyLongPress();
	}
	timeout() {
		var bg = this.ctrl != u.bg;
		var data = [this.link.href, bg];

		//var referrerInfo = Cc["@mozilla.org/referrer-info;1"].createInstance(Ci.nsIReferrerInfo);
		//referrerInfo.initWithElement(this.link);
		//data.push(u.E10SUtils.serializeReferrerInfo(referrerInfo));

		this.sendAsyncMessage("", data);
		this.link = null;
		bg || this.destroyLongPress()
			//|| this.contentWindow.windowUtils.sendMouseEventToWindow("mouseup", -1, -1, 0, 1, 0); // Linux (?)
	}
	initLongPress(a) {
		this.contentWindow.addEventListener("click", this, true);
		this.contentWindow.addEventListener("dragstart", this, false);
		u.timer.initWithCallback(() => this.timeout(), delay, u.timer.TYPE_ONE_SHOT);
		this.link = a;
	}
	destroyLongPress() {
		this.contentWindow.removeEventListener("click", this, true);
		this.contentWindow.removeEventListener("dragstart", this, false);
		this.link && u.timer.cancel();
		this.link = null;
	}
	didDestroy() {
		this.link && this.destroyLongPress();
	}
}

Ki_rrrilll пишет

Нажимаю левую кнопку мыши, затем нажимаю правую, держу нажатыми в течение допустим 2 сек. После этого запускается нужная мне функция. Но если за эти 2 сек. была отпущена любая кнопка мыши, то всё сбрасывается, все таймауты обнуляются.

Можно это реализовать?

Маловато информации, но, теоретически
возможность реализации не исключена, зависит от несказанного.

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

Выделить код

Код:

var myFunction = () => {
	gBrowser.selectedTab = gBrowser.addTrustedTab("about:robots");
}


var tid;
var launcher = () => {
	tid = null;
	myFunction();
}
var mouseup = e => {
	var tn = tid === null;
	tn && e.button == 2 && e.preventDefault();
	if (tid) tid = clearTimeout(tid);
	else if (!tn || e.button) window.removeEventListener("mouseup", mouseup);
}
addEventListener("mousedown", e => tid = e.button == 2 && e.buttons == 3 && (
	window.addEventListener("mouseup", mouseup),
	setTimeout(launcher, 2e3)
));

ВВП пишет

Dumby
Нет ли кода стоп-видео ?

Вот жеж дичь, спрашивать про видео того, у кого его в баузере нет.
Ну <video src="…"> останавливает такой, например, код:
gBrowser.selectedBrowser.browsingContext.mediaController.stop();
если только это не сколько-то самых первых секунд воспроизведения.

Отсутствует

 

№1616525-01-2022 12:07:45

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

Re: Custom Buttons

Dumby пишет

JSM'ка

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

Выделить код

Код:

var delay = 500;               // время удержания в мс
var inBackground = false;      // открывать в фоновой вкладке
var relatedToCurrent = false;  // открывать рядом с related вкладкой

var name = "LPA", EXPORTED_SYMBOLS = [name + "Child", name + "Parent"];

var u = {get timer() {
	delete this.timer;
	return this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
}};
inBackground == null
	? Object.defineProperty(u, "bg", {
		get: Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch)
			.getBoolPref.bind(null, "browser.tabs.loadInBackground")
	})
	: u.bg = inBackground;
//ChromeUtils.defineModuleGetter(u, "E10SUtils", `resource://gre/modules/E10SUtils.jsm`);

if (!ChromeUtils.domProcessChild.childID) {
	var triggeringPrincipal = Cu.getObjectPrincipal(Cu);
	var LPAParent = class extends JSWindowActorParent {
		receiveMessage(msg) {
			var [link, inBackground, ref] = msg.data;
			this.manager.browsingContext.top
				.embedderElement.ownerGlobal.gBrowser.loadOneTab(link, {
					triggeringPrincipal, relatedToCurrent, inBackground,
					//referrerInfo: u.E10SUtils.deserializeReferrerInfo(ref)
				});
		}
	}
	ChromeUtils.registerWindowActor(name, {
		allFrames: true,
		parent: {moduleURI: __URI__},
		messageManagerGroups: ["browsers"],
		child: {moduleURI: __URI__, events: {mousedown: {}}}
	});
}

class LPAChild extends JSWindowActorChild {
	handleEvent(e) {
		if (e.type == "mousedown") {
			if (e.button || e.shiftKey || e.altKey || e.detail != 1) return;

			var a = e.originalTarget.closest("a[href]");
			if (!a || a.href.startsWith("javascript:")) return;

			this.ctrl = e.ctrlKey;
			this.initLongPress(a);
		}
		else
			e.type == "click" && !this.link && e.preventDefault(),
			this.destroyLongPress();
	}
	timeout() {
		var bg = this.ctrl != u.bg;
		var data = [this.link.href, bg];

		//var referrerInfo = Cc["@mozilla.org/referrer-info;1"].createInstance(Ci.nsIReferrerInfo);
		//referrerInfo.initWithElement(this.link);
		//data.push(u.E10SUtils.serializeReferrerInfo(referrerInfo));

		this.sendAsyncMessage("", data);
		this.link = null;
		bg || this.destroyLongPress()
			//|| this.contentWindow.windowUtils.sendMouseEventToWindow("mouseup", -1, -1, 0, 1, 0); // Linux (?)
	}
	initLongPress(a) {
		this.contentWindow.addEventListener("click", this, true);
		this.contentWindow.addEventListener("dragstart", this, false);
		u.timer.initWithCallback(() => this.timeout(), delay, u.timer.TYPE_ONE_SHOT);
		this.link = a;
	}
	destroyLongPress() {
		this.contentWindow.removeEventListener("click", this, true);
		this.contentWindow.removeEventListener("dragstart", this, false);
		this.link && u.timer.cancel();
		this.link = null;
	}
	didDestroy() {
		this.link && this.destroyLongPress();
	}
}

Dumby, большое спасибо.


«The Truth Is Out There»

Отсутствует

 

№1616625-01-2022 12:42:58

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

Re: Custom Buttons

Dumby
Мне нравиться gBrowser.selectedBrowser.browsingContext.mediaController.pause();  Куда бы вставить на развертывание окна: gBrowser.selectedBrowser.browsingContext.mediaController.play();

Отсутствует

 

№1616725-01-2022 13:46:37

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

Re: Custom Buttons

ВВП пишет

Куда бы вставить на развертывание

Что-то сходу не смог найти.
А чего сразу вставить, может пробуем написать своё

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

Выделить код

Код:

(was => addEventListener("sizemodechange", e => {
	if (was == STATE_MINIMIZED) {

		setTimeout(Services.prompt.alert, 0, null, " ", "Welcome back");

	}
	was = windowState;
}))(windowState);

Отсутствует

 

№1616825-01-2022 14:00:55

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

Re: Custom Buttons

Dumby

Dumby пишет

А чего сразу вставить, может пробуем написать своё

А куда вставить ?

Отсутствует

 

№1616926-01-2022 09:44:52

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

Re: Custom Buttons

ВВП пишет

куда вставить ?

В Инициализацию.
Если алерт всегда возникает при развёртывании,
и никогда иначе, то можно строку с алертом заменить своим кодом.

Отсутствует

 

№1617026-01-2022 11:55:36

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

Re: Custom Buttons

del

Отредактировано ВВП (27-01-2022 17:56:54)

Отсутствует

 

№1617126-01-2022 16:40:47

Ki_rrrilll
Участник
 
Группа: Members
Зарегистрирован: 22-11-2013
Сообщений: 127
UA: Firefox 85.0

Re: Custom Buttons

Dumby пишет

Ki_rrrilll пишет

Нажимаю левую кнопку мыши, затем нажимаю правую, держу нажатыми в течение допустим 2 сек. После этого запускается нужная мне функция. Но если за эти 2 сек. была отпущена любая кнопка мыши, то всё сбрасывается, все таймауты обнуляются.

    Можно это реализовать?

Маловато информации, но, теоретически
возможность реализации не исключена, зависит от несказанного.

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


Может подскажете еще одну вещь. Это в  однопроцессном режиме, чтоб не было вопросов..
Почему на некоторых сайтах этот NodeList всегда пуст?

Выделить код

Код:

let elms = content.document.querySelectorAll(':hover');

Ведь если курсор находится над страницей, то какие то элементы доджны же соответствовать селектору :hover?

Отсутствует

 

№1617226-01-2022 16:52:25

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

Re: Custom Buttons

Dumby, есть вот такой вопрос.
Я никогда не пользуюсь несколькими окнами браузера.
В старых версиях FF, например, в дополнении Tab Mix Plus, была такая настройка: "Разрешить использование принудительного однооконного режима браузера".
Эта настройка приводила к тому, что при попытке открыть новое окно, открывалась новая вкладка в текущем окне.
Возможно ли такое реализовать в версии FF91 ESR?
Если такое возможно, то сделайте пожалуйста это через config.js.


«The Truth Is Out There»

Отсутствует

 

№1617327-01-2022 09:03:10

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

Re: Custom Buttons

Ki_rrrilll пишет

Может подскажете еще одну вещь.

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


unter_officer пишет

в дополнении Tab Mix Plus, была такая настройка

Она и сейчас есть. Только что-то в уе не смог найти.
Включил extensions.tabmix.singleWindow, рестарт.
И пара-тройка тестов:
1. Ctrl+N, вместо окна — вкладка (жесть какая).
    Но Ctrl+Shift+P открывает окно, если таковое не имеется, что логично.
2. Вот инфа от LPP WE открывается во вкладке
    поперёк настройки [✓]  Открывать в окне,
    но, например, с PT, увы, пустая вкладка, нелепый пример, но всё же.
3. Веб-консоль (Ctrl+Shift+K), запуск open(location, "", "width=500"); + разрешение,
    вместо окна — вкладка.

Отсутствует

 

№1617427-01-2022 11:31:39

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

Re: Custom Buttons

del

Отредактировано ВВП (27-01-2022 17:55:42)

Отсутствует

 

№1617527-01-2022 12:34:54

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

Re: Custom Buttons

Dumby пишет

Она и сейчас есть. Только что-то в уе не смог найти.
Включил extensions.tabmix.singleWindow, рестарт.
И пара-тройка тестов:
1. Ctrl+N, вместо окна — вкладка (жесть какая).
    Но Ctrl+Shift+P открывает окно, если таковое не имеется, что логично.
2. Вот инфа от LPP WE открывается во вкладке
    поперёк настройки [✓]  Открывать в окне,
    но, например, с PT, увы, пустая вкладка, нелепый пример, но всё же.
3. Веб-консоль (Ctrl+Shift+K), запуск open(location, "", "width=500"); + разрешение,
    вместо окна — вкладка.

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


Собственно я спрашивал возможно ли реализовать в версии FF91 ESR принудительное использование однооконного режима браузера.
Чтобы при попытке открыть новое окно, открывалась новая вкладка в текущем окне.
И если такое возможно, то реализовать это через config.js.


«The Truth Is Out There»

Отсутствует

 

Board footer

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