1. Nachrichten
  2. Forum
    1. Unerledigte Themen
    2. Forenregeln
  3. Spenden
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. camp-firefox.de
  2. lenny2

Beiträge von lenny2

  • userChrome.js Scripte für den Fuchs (Diskussion)

    • lenny2
    • 9. Februar 2025 um 14:57

    Das Skript bietet vier Optionen für die Erstellung eines Screenshots einer Seite

    JavaScript
    // SavePageAsPNG.uc.js
    (async func => CustomizableUI.createWidget({
        id: "SavePageAsPNG",
        label: "Save Page As PNG",
        tooltiptext: "Save Page As PNG",
        localized: false,
        // defaultArea: CustomizableUI.AREA_NAVBAR,
        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", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGwSURBVHjarJPPaxNBGIafmd1km23saqtRaLB6kFYl2ELpRayCVL20RvCmJwk9ePNWvPsXtCA9eNCDeO0hLemPo96LYAuKkRhtsBViEtI0rrt+GyFQ1oMkfjAf883M+8w7w4zyfZ9uwsxms10RzCBNTd3sSLy2lvsDCCKzWMCKGHgotOTAlpamJPm+jCmFL00bmmbD5WlmsKXTdBltB3bcxowaLWJwsTpi4bvNVu1JMmVn5cmcqTB6/DAg3hcjGpUFskjZjlgFKdmvVIiISKlfUhlyQMVPywgDjvX1YCjpOBZ2fZ+9+TuUpxcZuz7Ebl7ArkfM0dgDcOAFCvfwHTi9URJJi2RCqEuPmRxPUXn9imodLo1D6orGjMHW6govZqfDDkYviDXBlZ4vsFsrk8vXqZRWeDY8hz55lvvpGU7sFEn0RhhTtTBg/tETCvlNdj68papsUoND3Lh6iyPOOYrvv/JufYNrqcssbW8zkjwdBnz7/JKL50/x4F4at9GgsFckX/2IefQHZyb6mbl9l2LpE8ff1PnufWkD/t87yC1v/pvi4V8AwZvuNFS33/m3AAMAhEeAiqLmty4AAAAASUVORK5CYII=");
        }
    }))(() => {
    
    ((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="Save whole page as 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="Save visible part of the page as 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="Save selected page element as 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="Save selected page area as PNG"
                    value="clipping"/>
            </menupopup>
        `);
        var popup = df.firstChild;
        popup.setAttribute("context", "");
        popup.addEventListener("command", e => popup.handleCommand(e));
        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;
            }}));
            // Get tab name without non-saved characters and extra spaces
            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, "Save As…", fp.modeSave);
                fp.init(
                    !("inIsolatedMozBrowser" in window.browsingContext.originAttributes)
                      ? window.browsingContext
                      : window
                    , "Save As…", 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()) + '\u2014' + 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 = "red 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));
            }
        }`
    });
    });
    Alles anzeigen
  • Mein Sidebar Script funktioniert seit einiger Zeit nicht mehr. Was muss angepasst werden? Gibt es bessere Alternativen?

    • lenny2
    • 9. Februar 2025 um 14:26
    Zitat von 2002Andreas

    teste bitte:

    Danke :thumbup:

  • Mein Sidebar Script funktioniert seit einiger Zeit nicht mehr. Was muss angepasst werden? Gibt es bessere Alternativen?

    • lenny2
    • 9. Februar 2025 um 12:42

    2002Andreas Haben Sie den CSS-Code aus Beitrag #5 für v136 angepasst?

  • Mozilla veröffentlicht Firefox 135

    • lenny2
    • 5. Februar 2025 um 13:52

    Ich weiß nicht, in welchem Thread dies gepostet werden könnte. In Firefox v135.0 müssen Sie die Werte von zwei Parametern in about:config auf die Werte von v128.7.0esr oder v134 setzen, um die Darstellung von Schriften zu verbessern.

  • Firefox v136.0a1-OpenWith.uc.js funktioniert nicht mehr

    • lenny2
    • 4. Februar 2025 um 07:39

    Dieses Skript funktioniert definitiv.

  • Eintrag im Kontextmenü der URL-Bar anpassen

    • lenny2
    • 3. Februar 2025 um 16:19

    v136, v135

    CSS
    [data-l10n-id="main-context-menu-copy-clean-link"]::before, #strip-on-share::before {
       background: url("file:///D:/Firefox/Profiles/Chrome/icons/link.png")!important;

    v128, v134

    CSS
    [data-l10n-id="main-context-menu-strip-on-share-link"]::before, #strip-on-share::before {
       background: url("file:///D:/Firefox/Profiles/Chrome/icons/link.png")!important;
  • userChrome.js Scripte für den Fuchs (Diskussion)

    • lenny2
    • 3. Februar 2025 um 13:56

    Page info im Hauptkontextmenü (kompatibel mit Firefox v136.0a1)

    JavaScript
    // Page_Info_in_Context.uc.js
    (async (
       id = "context-viewPageInfo",
       image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACp0lEQVQ4jV2TPW9cVRCGn3fOuffu9Xo3TnCEkANYQotB2WJpUqWwJSqIUuQPRKKlsAUFpeUmEpXXEv+ACClFitQowmUIMmxASowIkjuQk9jr/fDd7F3fQ7HWdcxI04zmfc47RzPif9G4cXdR0iqy5flL9VYRAoe9rCNpG9nW7v1be2/2qxR+/v0c0vp7C/NrV5euMCkijoYTXucnEALDYcaLwx7DLGsjbTy7d7NbAk7FP12/ttSq1uZ48vyYLA/UZhwg+qMCZ5A6GGVDesODDtLK0x8+69rUh9avX1tqWVzn0dMhWR4A8eDOxzy48xEyEWQcB4O0Tlq73JK5dQBr3Li7+P7C/NpsbY4nf2dTTxKYyhnNG/KGeQfeEVXrRJXqWvP2w0UvafXq0rv8+vz4TCwhJz795s/p62ZlHQkJ4uoFTnqvVj2y5UnwZOP8XNPj75rlTze/3MV5YU4IoQCJS5Bzy3b5rXrraDgBQQEMRgUH/QmNL/4oAXHiiSueJPUkM554JmK2FlGppC1fBBjnBeNJ4HAwQWZEicN7KwFRxeHjaU1mSDCbBIZ9jx0cHXfyyQkvD3NCAHPCnOEid85BUvEkMxGV6jQvzkVk45OOSdp+dTDAOZDpFCCcK3cMnziiiidJp+JaPcZZgZzfNmRbR4MBl2aENE0zIXc2go8cUeKJU0+lGvPhlYh/9kfI3Jbt3r+1N85ftykyUkcJ6Ww2SsCPX7+Nc4aPHY2FiH5vzL8vx+2dzeaeP93Ejfykv+zMtwKzAHzy1V8kaVTOXavFfDAP3f0BP+8cdGS2AWAAz+7d7CKtSL22D11U5MQBqha4GAfeqQYuKOP33/Z59PhFmxBWfvm2cXZMb0bz9sNFma3K+eUkSVs+dozyoiPnt2Vua2ezee6c/wN/E94boB6vcgAAAABJRU5ErkJggg==",
    
       subst = `${id.toLowerCase()}-img`,
       PHandler = Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler)
    ) => {
       if (location != "chrome://browser/content/browser.xhtml") return;
       if (!PHandler.hasSubstitution(subst))
           PHandler.setSubstitution(subst, Services.io.newURI(image));
       var menuitem = document.createXULElement("menuitem");
       document.getElementById("context-viewsource").before(menuitem);
       var hidden = () => {
           var d = nsContextMenu.contentData, {context, browser} = d;
           return context.link || d.selectionInfo.text || context.onImage || context.onCanvas || context.onVideo || context.onAudio || context.onTextInput || browser.className.startsWith("webext");
       }
       menuitem.hidden = true;
       menuitem.render = () => {
           if (hidden()) return;
           menuitem.hidden = false;
           menuitem.id = `${id}`;
           menuitem.label = "Page Info";
           delete menuitem.render;
           menuitem.className = "menuitem-iconic";
           menuitem.style.cssText = `list-style-image:url("resource://${subst}");`;
           menuitem.addEventListener("command", () => gContextMenu.viewInfo());
           menuitem.render();
           menuitem.render = () => menuitem.hidden = hidden();
       }
    })(); 
    Alles anzeigen
  • Neues Profil, Nightly-Icon in der Taskleiste ziert ein Einkaufswagen

    • lenny2
    • 1. Februar 2025 um 10:46

    Ist der neue ProfilManager in v136.0a1 verfügbar?

  • Skript für vertikale Toolbar funktioniert im heutigen Nightly nicht mehr richtig

    • lenny2
    • 29. Januar 2025 um 19:05

    Skript funktioniert immer noch nicht in v136.0a1.

  • Firefox v136.0a1 - Skript „saveTo“ funktioniert nicht mehr

    • lenny2
    • 29. Januar 2025 um 18:26
    Zitat von milupo

    In dem verlinkten Skript kannst du Zeile 7 entfernen und ersetze Zeile 8 durch folgende Zeile:

    Vielen Dank, das Skript funktioniert wieder :thumbup:

  • Firefox v136.0a1 - Skript „saveTo“ funktioniert nicht mehr

    • lenny2
    • 29. Januar 2025 um 15:32

    Dieses Skript saveTo.uc.js funktioniert nicht mehr in v136.0a1 Nightly. Es könnte mit jsm und mjs zu tun haben. Vielen Dank für Ihre Hilfe! (In v134.0.2 - alles Ok)

  • Firefox v136.0a1 - Skript „copyURL“ funktioniert nicht mehr

    • lenny2
    • 28. Januar 2025 um 13:19
    Zitat von milupo

    Ersetze mal Zeile 3 durch:

    Zitat von milupo

    und Zeile 22 durch:

    Danke, damit ist das Problem gelöst :thumbup: :)

  • Firefox v136.0a1 - Skript „copyURL“ funktioniert nicht mehr

    • lenny2
    • 28. Januar 2025 um 10:59

    Dieses Skript funktioniert nicht mehr in v136.0a1 Nightly. Es könnte mit jsm und mjs zu tun haben. Vielen Dank für Ihre Hilfe!

    JavaScript
    // copyURL.js
    // Button in the url-bar for “copy url-bar link”
    (async (url, pa = ChromeUtils.import(url).PageActions) => pa.addAction(new pa.Action({
       title: "Copy link",
       tooltip: "Copy link",
       iconURL: "chrome://global/skin/icons/link.svg",
       id: "copyURL",
       pinnedToUrlbar: true,
       onCommand(e) {
           var MozXULElement = {insertFTLIfNeeded() {}};
           var document = {l10n: {setAttributes: msg => msg.textContent = "Copy to clipboard!"}};
           var show = eval(`(function ${e.view.ConfirmationHint.show})`);
           var helper = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper);
           (this.onCommand = e => {
               var win = e.view;
               var uri = win.gBrowser.selectedBrowser.currentURI;
               helper.copyString(win.gURLBar.makeURIReadable(uri).displaySpec);
               var anchor = win.BrowserPageActions.panelAnchorNodeForAction(this, e);
               show.call(win.ConfirmationHint, anchor, "", {event: e, hideArrow: true});
           })(e);
       }
    })))("resource:///modules/PageActions.jsm");
    Alles anzeigen
  • Firefox v136.0a1 - Skript „Tooltip with URL“ funktioniert nicht mehr

    • lenny2
    • 27. Januar 2025 um 19:55
    Zitat von milupo

    Ich glaube ich habe es hinbekommen. Sieh folgende Skriptversion:

    Superb! Alle Optionen funktionieren. v136.0a1, v134.0.2. Danke :thumbup::thumbup:
    Sie können den globalen Stil tooltips aller Toolbar-Buttons, Erweiterungs- und Skript-Buttons, Lesezeichen-Links, Seiten-Kontext-Links, vertikal Toolbar Aris-t2 Buttons... wenn Sie zusätzlich dieses Skript verwenden

  • Firefox v136.0a1 - Skript „Tooltip with URL“ funktioniert nicht mehr

    • lenny2
    • 27. Januar 2025 um 12:35
    Zitat von milupo

    Ich denke, das Einfachste ist, die Schaltfläche in das Anpassen-Fenster zu schieben.

    Genau das habe ich getan. Mit den Korrekturen aus Beitrag #2. Danke für eure Hilfe.

  • Firefox v136.0a1 - Skript „Tooltip with URL“ funktioniert nicht mehr

    • lenny2
    • 26. Januar 2025 um 19:24

    milupo Leider hat es nicht geklappt :( Was ist, wenn ich die Änderungen aus Beitrag #2 verwende und den Code der Button selbst entferne? Es wird dann ein Skript ohne Button sein, die Funktionalität der Button selbst ist für mich unnötig. Wäre das nicht einfacher?

  • Firefox v136.0a1 - Skript „Tooltip with URL“ funktioniert nicht mehr

    • lenny2
    • 26. Januar 2025 um 17:12
    Zitat von milupo

    Ersetze mal die Zeile 18 und 19 durch folgenden Code:

    Leider hat es nicht geklappt :(

  • Firefox v136.0a1 - Skript „Tooltip with URL“ funktioniert nicht mehr

    • lenny2
    • 26. Januar 2025 um 15:47

    Es wurden zwei Fehler entdeckt. Der Tooltip der Skript-Button selbst und der Tooltip zum Skriptstatus werden nicht angezeigt. Die Umschaltfunktion für die Enabled/Disabled funktioniert nicht (immer im Enabled Zustand) :(

    Oder eine Lösung, bei der es gar keine Button gibt.

  • Firefox v136.0a1 - Skript „Tooltip with URL“ funktioniert nicht mehr

    • lenny2
    • 26. Januar 2025 um 14:47
    Zitat von milupo

    Ersetze mal Zeile 61 durch diese:

    Zitat von milupo

    Und Zeile 82 durch diese:

    Danke! :thumbup:

  • Firefox v136.0a1 - Skript „Tooltip with URL“ funktioniert nicht mehr

    • lenny2
    • 26. Januar 2025 um 13:56

    Dieses Skript funktioniert nicht mehr in v136.0a1 Nightly. Es könnte mit jsm und mjs zu tun haben. Vielen Dank für Ihre Hilfe!

    JavaScript
    // ==UserScript==
    // tooltips_with_URL.uc.js
    // @description      Displays target URL in tooltip, when hovering over a link
    // Button has “tooltips on”/“tooltips off” positions
    // ==/UserScript==
    try {CustomizableUI.createWidget(({
        label: "Links in pop-up tooltips", localized: false,
        id: "URLTooltip", pref: "URLTooltip.enabled",
        get state() {
            return Services.prefs.getBoolPref(this.pref, true); // by default is ON
        },
        setIcon(btn, state = this.state) {
            btn.setAttribute("image", "data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' style='fill:context-fill rgb(142, 142, 152);'><path d='M9.618 6.721a2.483 2.483 0 0 0-.39-.317l-.735.734A1.486 1.486 0 0 1 8.91 9.55l-2.12 2.122a1.486 1.486 0 0 1-2.122 0 1.486 1.486 0 0 1 0-2.121l.605-.605a3.53 3.53 0 0 1-.206-1.209L3.961 8.843a2.506 2.506 0 0 0 0 3.535 2.506 2.506 0 0 0 3.535 0l2.122-2.121a2.506 2.506 0 0 0 0-3.536z'/><path d='M6.79 9.55c.12.121.25.226.389.317l.734-.734a1.486 1.486 0 0 1-.417-2.411L9.618 4.6a1.486 1.486 0 0 1 2.121 0 1.486 1.486 0 0 1 0 2.121l-.605.605c.137.391.211.798.206 1.209l1.106-1.107a2.506 2.506 0 0 0 0-3.535 2.506 2.506 0 0 0-3.535 0L6.789 6.014a2.506 2.506 0 0 0 0 3.536z'/><circle style='fill:none;stroke:context-fill rgb(142, 142, 152);stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round' cx='8' cy='8' r='7.4'/></svg>");
            btn.style.setProperty("fill", `${state ? "color-mix(in srgb, currentColor 20%, #e31b5d)" : ""}`);
        },
        onCreated(btn) {
            this.setIcon(btn), this.btn = btn, btn.owner = this;
            btn.setAttribute("oncommand", "owner.toggle()");
            btn.setAttribute("onmouseenter", "owner.mouseenter()");
        },
        mouseenter() {
            this.btn.tooltipText = this.label +' – '+ `${this.state ? "enabled" : "disabled"}`;
        },
        toggle() {
            Services.prefs.setBoolPref(this.pref, !this.state);
        },
        observe(s, topic) {
            if (topic.startsWith("q")) return this.destroy();
            var {state} = this;
            for(var {node} of CustomizableUI.getWidget(this.id).instances)
                this.setIcon(node, state);
            state ? this.initTooltip() : this.destroyTooltip();
        },
        init() {
            Services.prefs.addObserver(this.pref, this);
            Services.obs.addObserver(this, "quit-application-granted", false);
            this.state && this.initTooltip();
            delete this.init; return this;
        },
        destroy() {
            Services.prefs.removeObserver(this.pref, this);
            Services.obs.removeObserver(this, "quit-application-granted");
        },
        initTooltip() {
            var url = this.initURL = this.createURL("psInit");
            (this.initTooltip = () => Services.ppmm.loadProcessScript(url, true))();
        },
        destroyTooltip() {
            var url = this.createURL("psDestroy");
            (this.destroyTooltip = () => {
                Services.ppmm.removeDelayedProcessScript(this.initURL);
                Services.ppmm.loadProcessScript(url, false);
            })();
            delete this.createURL;
        },
        createURL: function createURL(meth) {
            var subst = this.id + "-" + meth;
            (createURL.rph || (createURL.rph = Services.io.getProtocolHandler("resource")
                    .QueryInterface(Ci.nsIResProtocolHandler)
            )).setSubstitution(subst, Services.io.newURI("data:text/javascript;charset=utf-8," + encodeURIComponent(
                `(${this[meth]})(ChromeUtils.import("resource://gre/modules/TooltipTextProvider.jsm").TooltipTextProvider.prototype)`
            )));
            delete this[meth]; return "resource://" + subst;
        },
        psInit: proto => {
            if (proto.getTextPlus) return proto.getNodeText = proto.getTextPlus.newGetNodeText;
            //================[ start content ]================
            proto.getTextPlus = node => {
                var href = getHref(node);
                if (!href || href == "#" || skipRe.test(href)) return;
                if (href.startsWith("data:")) return crop(href, 64);
                return crop(decode(href));
            }
            var skipRe = /^(?:javascript|addons):/;
            var getHref = node => {do {
                if (HTMLAnchorElement.isInstance(node) && node.href) return node.href;
            } while (node = node.flattenedTreeParentNode)}
            var crop = (url, max = 128) => url.length <= max
                ? url : url.slice(0, --max) + "\u2026"; // ellipsis
            var decode = url => {
                var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
                var ldu = Cu.import("resource:///modules/UrlbarInput.jsm", {}).losslessDecodeURI;
                return (decode = url => {try {return ldu(ios.newURI(url));} catch {return url;}})(url);
            }
            //================[ end content ]==================
            var func = proto.getTextPlus.getNodeText = proto.getNodeText;
            proto.getTextPlus.newGetNodeText = proto.getNodeText = function(node, text) {
                var res = func.apply(this, arguments);
                if (!res && !(node?.localName != "browser" && node.ownerGlobal && node.ownerDocument))
                    return false;
                var txt = this.getTextPlus(node), add = "";
                return txt ? text.value = res ? text.value + "\n" + txt + add : txt + add : res;
            }
        },
        psDestroy: proto => {
            proto.getNodeText = proto.getTextPlus.getNodeText;
        }
    }).init())} catch(ex) {Cu.reportError(ex);}
    Alles anzeigen

Unterstütze uns!

Jährlich (2025)

101,9 %

101,9% (662,48 von 650 EUR)

Jetzt spenden
  1. Kontakt
  2. Datenschutz
  3. Impressum
Community-Software: WoltLab Suite™
Mastodon