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. Speravir

Beiträge von Speravir

  • addonbar.us.js funktioniert nicht mehr

    • Speravir
    • 28. Januar 2025 um 00:53
    Zitat von milupo

    Bei Aris kommt jetzt z. B. die ID addonbar_v nur noch im neuen Zusatzcode vor. Irgendwie scheint mir, als wird hier auf etwas Bezug genommen, was es nicht mehr gibt.

    addonbar_v ist die ID für die vertikale Addonbar. Aris hat einfach den Code 1:1 übernommen, und zwar auch in das Skript für die vertikale Leiste.

  • addonbar.us.js funktioniert nicht mehr

    • Speravir
    • 28. Januar 2025 um 00:25

    BrokenHeart: In Zeile 153 steht noch key.setAttribute('oncommand',…. Beachte das jüngste Update von addonbar.uc.js.

  • addonbar.us.js funktioniert nicht mehr

    • Speravir
    • 26. Januar 2025 um 01:16
    Zitat von BrokenHeart

    und vielleicht auch noch andere

    Jemand könnte mal alle durchtesten. Ich kann sagen, dass der Schalter für die Einstellungen funktioniert.

    Nachtrag:

    Zitat von bege

    Das Problem besteht weiter, obwohl es gerade ein Update für das Skript gab.

    Hmmm, bei mir funktioniert der Download-Button mit dem jüngsten Update, soll heißen, er zeigt das Popup.

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

    • Speravir
    • 25. Januar 2025 um 03:25
    Zitat von BrokenHeart

    Wäre vielleicht ganz gut, wenn ein paar Nutzer des Skripts mal ihre Version hier posten würden.

    Ich nutze die aktuelle Version bei Aris, die ihrer Anpassung harrt (Entfernung der Zeile mit CustomizableUI.jsm:( CustomJSforFx/scripts/restart_button.uc.js.

    Und bei der Gelegenheit: CustomJSforFx/scripts/restart_item_in_menu.uc.js ist das Skript für die Menüeinträge, das eines der Skripte ist, die einen EventListener benötigen. Siehe dazu Nightly 136 - restart_item_in_menu.uc.js stopped working · Issue #128 · Aris-t2/CustomJSforFx.

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

    • Speravir
    • 25. Januar 2025 um 01:14

    Nur als Hinweis: Aris ist informiert. Er ist derzeit aber nicht aktiv, man kann also nicht sagen, ob und wann er Anpassungen durchführen wird.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 25. Januar 2025 um 00:50
    Zitat von Horstmann

    das hier scheint momentan zu funktionieren; […]

    Generell hänge ich einfach den addEventlistener unten an, mit der ID des Buttons, und ausserhalb des oberen Codeabschnitts (...?).

    […]

    Für das von dir verlinkte Script dann evtl: sowas […]

    Danke, funktioniert!

    Endor, ich hänge mein verändertes Skript mal an, damit du es bei GiHub hochladen kannst (aus einem unbekannten Grund werden übrigens beim Einfügen die Leerzeilen entfernt):

    JavaScript
    /* Entwicklerwerkzeuge-button.uc.js
    *
    * aborix in https://www.camp-firefox.de/forum/thema/124672/?postID=1078103#post1078103
    * Abwandlung eines Skriptes unbekannter Herkunft, vgl. Endor in
    * https://www.camp-firefox.de/forum/thema/124672/?postID=1078019#post1078019
    * diverse Edits: Speravir
    *
    * beachte Milupo in https://www.camp-firefox.de/forum/thema/112673/?postID=1189373#post1189373
    * und https://www.camp-firefox.de/forum/thema/136363/?postID=1227506#post1227506
    *
    * letzte Aktualisierung durch Speravir in https://www.camp-firefox.de/forum/thema/138792/?postID=1264613#post1264613
    * mit vorgeschlagener Änderung von Horstmann in
    * https://www.camp-firefox.de/forum/thema/138792/?postID=1264536#post1264536
    */
    (function() {
    if (!window.gBrowser) return;
    const
        buttonID = 'entwickler-toolbarbutton',
        labelText = 'Entwicklerwerkzeuge',
        tooltip = labelText + ' öffnen/schließen',
        css =
    `#${buttonID} .toolbarbutton-icon {list-style-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAdUlEQVQokZVSwRHAIAgLPYfoXs7RCTpG53Avt7APrhaFU8gLMEEJAkEQgFbc7IxkVjt0r6Sp7VIVITumBpKt00FA2ThmjXzkfMMWO8EZFSj8LrUyjsG9b9DaJXq+qAIVxEUxtLHpaXE95dj1NcK2rmbwaGJ4Af0tIg00j/6iAAAAAElFTkSuQmCC')}`;
    try {
        CustomizableUI.createWidget({
            id: buttonID,
            type: 'custom',
            defaultArea: CustomizableUI.AREA_NAVBAR,
            onBuild: function(aDocument) {
                let tb_button = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
                let props = {
                    id: buttonID,
                    class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                    label: labelText,
                    tooltiptext: tooltip
                };
                for (let p in props) tb_button.setAttribute(p, props[p]);
                return tb_button;
            }
        });
    } catch(e) {};
    document.getElementById(buttonID).addEventListener("click", () => { if(event.button === 0) document.getElementById('menu_devToolbox').click(); });
    let stylesheet = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"');
    document.insertBefore(stylesheet, document.documentElement);
    setTimeout(function() {
        if (document.getElementById('menuWebDeveloperPopup').childElementCount <= 5) {
            let {require} = ChromeUtils.importESModule("resource://devtools/shared/loader/Loader.sys.mjs", {});
            require("devtools/client/framework/devtools-browser");
        };
    }, 0);
    })();
    Alles anzeigen

    Zu den IDs: Das halte ich für eine Schwäche vieler Skripte hier. Beispielsweise kommt die ID hier oben inzwischen viermal vor. da ist es wirklich besser, sie einer Variable zuzuweisen und diese dann wiederholt zu verwenden.


    Zitat von lenny2

    Vertikale Toolbar von Aris-t2 funktioniert im heutigen Nightly (24. Jan) nicht mehr X(

    Nur als Hinweis: Ich habe Aris darauf hingewiesen. Er ist derzeit aber nicht aktiv, man kann also nicht sagen, ob und wann er Anpassungen durchführen wird.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 24. Januar 2025 um 00:03
    Zitat von mkpcxxl

    Der Fehler ist, dass wenn ich den Button im zweiten Fenster drücke die Seite about:config in einem neuen Tab im ersten Fenster geöffnet wird.

    Dasselbe Verhalten ist mir auch bei dem Skript für die Entwicklerwerkzeuge aufgefallen. Mit der Version mit Inline-Handlern ging es aber. Ich nutze im Prinzip Entwicklerwerkzeuge-button.uc.js · Endor8/userChrome.js, auch wenn ich die ID, den Label- und Tooltiptext sowie den CSS-Code in eine Variable gesetzt habe.

  • UserCSSLoader (2025)

    • Speravir
    • 23. Januar 2025 um 01:34

    Falls sich jemand „meine“ Version heruntergeladen hat: Ich hatte vergessen, eine Tastenkombination zu aktivieren und das soeben nachgeholt.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 22. Januar 2025 um 03:17

    Bitte mal den UserCSSLoader testen: Version vom 22. Januar 2025 – vor allem Nutzer von Linux und MacOS wären interessant.

    Zitat von Sören Hentzschel

    Die oncontextmenu-Zeile müsste auch noch angepasst werden, falls dieser Listener eine Relevanz besitzt.

    Ah, da fällt mir ein, dass ich genau darauf hinweisen wollte: Das hier schon aktualisierte AnimationToggleButton-Skript besitzt ebenso einen solchen Eintrag, der noch nicht angepasst wurde. Ich hab darin stattdessen diese Zeile eingefügt:

    JavaScript
    tb_button.addEventListener('contextmenu', event => event.preventDefault() );

    Da die rechte Maustaste im Skript benötigt wird, hat dieser Eintrag dort einen Sinn.

    Endor und andere – ich habe mal alle (genauer: ohne den UserCSSLoader) von mir veränderten Skripte zusammengepackt und hier hochgeladen: userChrome-Skripte.zip (90 Tage lang verfügbar, d. h. bis 21. April 2025).

  • UserCSSLoader (2025)

    • Speravir
    • 22. Januar 2025 um 02:50

    Diese Version funktioniert bei mir (mit Ausnahme des filemanagerParam) :

    JavaScript: UserCSSLoader.uc.js
    // ==UserScript==
    // @name           UserCSSLoader
    // @description    CSS-Codes - Styles laden und verwalten
    // @namespace      http://d.hatena.ne.jp/Griever/
    // @author         Griever
    // @include        main
    // @license        MIT License
    // @compatibility  Firefox 116*
    // @charset        UTF-8
    // @version        0.0.4K+
    // @note           Aktualisierungen von BrokenHeart und Speravir - www.camp-firefox.de
    // @note           BrokenHearts Änderung: https://www.camp-firefox.de/forum/thema/138792/?postID=1263814#post1263814
    // @note           Fx92: getURLSpecFromFile() -> getURLSpecFromActualFile()
    // @note           AUTHOR_SHEET-Unterstützung hinzugefügt, wichtig: Dateiendung muss .author.css sein!
    // @note           Version 0.0.4.g ermöglicht "Styles importieren" per Mittelklick und Verwendung
    // @note           eines anderen Dateimanagers (siehe in Konfiguration), ergänzt um einen
    // @note           Parameter für den Dateimanager (vFMParameter in der Konfiguration) von aborix
    // @note           Frei verschiebbare Schaltfläche eingebaut von aborix
    // @note           0.0.4 Remove E4X
    // @note           CSSEntry-Klasse erstellt
    // @note           Style-Test-Funktion überarbeitet (später entfernt)
    // @note           Wenn die Datei gelöscht wurde, CSS beim Neu-Erstellen und Löschen des Menüs abbrechen
    // @note           uc einlesen .uc.css temporäre Korrespondenz zum erneuten Lesen
    // ==/UserScript==
    /****** Bedienungsanleitung ******
    CSS-Ordner im Chrome-Ordner erstellen, CSS-Dateien dort ablegen und speichern.
    Diejenigen, deren Dateiname mit "xul-" beginnen, diejenigen, die mit ".as.css" enden, sind AGENT_SHEET, 
    alle anderen außer USER_SHEET werden gelesen. Da der Inhalt der Datei nicht überprüft wird,
    darauf achten, die Angabe von @namespace nicht zu vergessen!
    CSS-Menü wird zur Menüleiste hinzugefügt.
    Linksklick auf Stil, zum Aktivieren/Deaktivieren,
    Mittelklick auf Stil zum Aktivieren/Deaktivieren, ohne Menü zu schließen,
    Rechtsklick auf Stil zum Öffnen im Editor,
    Strg+Linksklick zum Anzeigen im Dateimanager.
    Die Tastenkombinationen können im Menü eingeblendet werden (bzw. in einem Fall ausgeblendet),
    dazu nach "acceltext" suchen und den Zeilenkommentar "//" entfernen bzw. einfügen.
    Verwenden des in "view_source.editor.path" angegebenen Editors.
    Dateiordner kann in Konfiguration geändert werden.
    **** Anleitung Ende ****/
    (function(){
    /* Konfiguration */
    // Position: als Menü anzeigen = 1, als frei verschiebbare-Schaltfläche = 0
    let position = 1;
    // alternativer Dateimanager, Bsp.:
    // let filemanager = "C:\\Programme\\totalcmd\\TOTALCMD.EXE";
    let filemanager = "";
    // eventuelle Parameter für den alternativen Dateimanager, sonst filemanagerParam = "";
    //let filemanagerParam = "/O /T";//Totalcommander
    let filemanagerParam = "";
    // Unterordner für die CSS-Dateien:
    let cssFolder = "CSS";
    // zusätzlich Chrome-Ordner im Untermenü anzeigen: 1 = ja, 0 = nein
    let showChrome = 1;
    /* Ende Konfiguration */
    ChromeUtils.importESModule("resource://gre/modules/AppConstants.sys.mjs");
    let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
    // Wenn beim Start ein anderes Fenster angezeigt wird (das zweite Fenster), wird es beendet
    let list = Services.wm.getEnumerator("navigator:browser");
    while(list.hasMoreElements()){ if(list.getNext() != window) return; }
    if (window.UCL) {
        window.UCL.destroy();
        delete window.UCL;
    }
    window.UCL = {
        vFileManager: filemanager,
        vFMParameter: filemanagerParam,
        USE_UC: "UC" in window,
        AGENT_SHEET: Ci.nsIStyleSheetService.AGENT_SHEET,
        USER_SHEET : Ci.nsIStyleSheetService.USER_SHEET,
        AUTHOR_SHEET: Ci.nsIStyleSheetService.AUTHOR_SHEET,
        readCSS : {},
        get disabled_list() {
            let obj = [];
            try {
                    obj = this.prefs.getCharPref("disabled_list").split("|");
            } catch(e) {}
            delete this.disabled_list;
            return this.disabled_list = obj;
        },
        get prefs() {
                delete this.prefs;
                return this.prefs = Services.prefs.getBranch("UserCSSLoader.")
        },
        get styleSheetServices(){
                delete this.styleSheetServices;
                return this.styleSheetServices = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
        },
        get FOLDER() {
            let aFolder;
            try {
                // UserCSSLoader.FOLDER verwenden
                let folderPath = this.prefs.getCharPref("FOLDER");
                aFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
                aFolder.initWithPath(folderPath);
            } catch (e) {
                aFolder = Services.dirsvc.get("UChrm", Ci.nsIFile);
                aFolder.appendRelativePath(cssFolder);
            }
            if (!aFolder.exists() || !aFolder.isDirectory()) {
                aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664);
            }
            delete this.FOLDER;
            return this.FOLDER = aFolder;
        },
        get CHRMFOLDER() {
            let bFolder;
            try {
                // UserCSSLoader.CHRMFOLDER verwenden
                let CHRMfolderPath = this.prefs.getCharPref("CHRMFOLDER");
                bFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
                bFolder.initWithPath(CHRMfolderPath);
            } catch (e) {
                bFolder = Services.dirsvc.get("UChrm", Ci.nsIFile);
            }
            if (!bFolder.exists() || !bFolder.isDirectory()) {
                bFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664);
            }
            delete this.CHRMFOLDER;
            return this.CHRMFOLDER = bFolder;
        },
        getFocusedWindow: function() {
            let win = document.commandDispatcher.focusedWindow;
            if (!win || win == window) win = content;
            return win;
        },
        init: function() {
            const cssmenu = $C("menu", {
                id: "usercssloader-menu",
                label: "CSS",
                tooltiptext: "UserCSSLoader\n\nLinksklick: Stylesheets anzeigen\nMittelklick: Styles importieren",
                accesskey: "S",
                //acceltext: "Alt + S",
                onclick: "if (event.button == 1) UCL.rebuild()"
            });
            const menupopup = $C("menupopup", {
                id: "usercssloader-menupopup"
            });
            cssmenu.appendChild(menupopup);
            let menu = $C("menu", {
                label: "Style-Loader-Menü",
                id: "style-loader-menu",
                accesskey: "M",
                //acceltext: "Alt + M"
            });
            menupopup.appendChild(menu);
            menupopup.appendChild($C("menuseparator"));
            let mp = $C("menupopup", { id: "usercssloader-submenupopup" });
            menu.appendChild(mp);
            mp.appendChild($C("menuitem", {
                label: "Styles importieren",
                accesskey: "I",
                //acceltext: "Alt + I",
                oncommand: "UCL.rebuild();"
            }));
            mp.appendChild($C("menuseparator"));
            mp.appendChild($C("menuitem", {
                label: "CSS-Datei erstellen",
                accesskey: "E",
                //acceltext: "Alt + E",
                oncommand: "UCL.create();"
            }));
            mp.appendChild($C("menuitem", {
                label: "CSS-Ordner öffnen",
                accesskey: "O",
                //acceltext: "Alt + O",
                oncommand: "UCL.openFolder();"
            }));
            if (showChrome === 1) {
                mp.appendChild($C("menuitem", {
                    label: "Chrome-Ordner öffnen",
                    accesskey: "X",
                    acceltext: "Alt + X",
                    oncommand: "UCL.openCHRMFolder();"
                }));
            }
            mp.appendChild($C('menuseparator'));
            mp.appendChild($C("menuitem", {
                label: "userChrome.css bearbeiten",
                hidden: false,
                oncommand: "UCL.editUserCSS('userChrome.css');"
            }));
            mp.appendChild($C("menuitem", {
                label: "userContent.css bearbeiten",
                hidden: false,
                oncommand: "UCL.editUserCSS('userContent.css');"
            }));
            menu = $C("menu", {
                label: ".uc.css",
                accesskey: "U",
                //acceltext: "Alt + U",
                hidden: !UCL.USE_UC
            });
            menupopup.appendChild(menu);
            mp = $C("menupopup", { id: "usercssloader-ucmenupopup" });
            menu.appendChild(mp);
            mp.appendChild($C("menuitem", {
                label: "Importieren(.uc.js)",
                oncommand: "UCL.UCrebuild();"
            }));
            mp.appendChild($C("menuseparator", { id: "usercssloader-ucseparator" }));
            CustomizableUI.createWidget({
                id: 'usercssloader-menu-item',
                type: 'custom',
                defaultArea: CustomizableUI.AREA_NAVBAR,
                onBuild: function(aDocument) {
                    let toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbaritem');
                    toolbaritem.id = 'usercssloader-menu-item';
                    toolbaritem.className = 'chromeclass-toolbar-additional';
                    return toolbaritem;
                }
            });
            $('usercssloader-menu-item').appendChild(cssmenu);
            if (position === 1) {
                let refNode = $('helpMenu');
                refNode.parentNode.insertBefore(cssmenu, refNode.nextSibling);
            }
            
            $("mainKeyset").appendChild($C("key", {
                id: "usercssloader-rebuild-key",
                oncommand: "UCL.rebuild();",
                key: "R",
                modifiers: "alt",
            }));
            
            this.rebuild();
            this.initialized = true;
            if (UCL.USE_UC) {
                setTimeout(function() {
                    UCL.UCcreateMenuitem();
                }, 1000);
            }
            window.addEventListener("unload", this, false);
        },
        uninit: function() {
            const dis = [];
            for (let x of Object.keys(this.readCSS)) {
                if (!this.readCSS[x].enabled)
                    dis.push(x);
            }
            this.prefs.setCharPref("disabled_list", dis.join("|"));
            window.removeEventListener("unload", this, false);
        },
        destroy: function() {
            var i = document.getElementById("usercssloader-menu");
            if (i) i.parentNode.removeChild(i);
            var i = document.getElementById("usercssloader-rebuild-key");
            if (i) i.parentNode.removeChild(i);
            this.uninit();
        },
        handleEvent: function(event) {
            switch(event.type){
                case "unload": this.uninit(); break;
            }
        },
        rebuild: function() {
            let ext = /\.css$/i;
            let not = /\.uc\.css/i;
            let files = this.FOLDER.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
            while (files.hasMoreElements()) {
                let file = files.getNext().QueryInterface(Ci.nsIFile);
                if (!ext.test(file.leafName) || not.test(file.leafName)) continue;
                let CSS = this.loadCSS(file);
                CSS.flag = true;
            }
            for (let leafName of Object.keys(this.readCSS)) {
                const CSS = this.readCSS[leafName];
                if (!CSS.flag) {
                    CSS.enabled = false;
                    delete this.readCSS[leafName];
                }
                delete CSS.flag;
                this.rebuildMenu(leafName);
            }
            if (this.initialized) {
                if (typeof(StatusPanel) !== "undefined")
                    StatusPanel._label = "Styles importiert";
                else
                    XULBrowserWindow.statusTextField.label = "Styles importieren";
            }
        },
        loadCSS: function(aFile) {
            let CSS = this.readCSS[aFile.leafName];
            if (!CSS) {
                CSS = this.readCSS[aFile.leafName] = new CSSEntry(aFile);
                if (this.disabled_list.indexOf(CSS.leafName) === -1) {
                    CSS.enabled = true;
                }
            } else if (CSS.enabled) {
                CSS.enabled = true;
            }
            return CSS;
        },
        rebuildMenu: function(aLeafName) {
            let CSS = this.readCSS[aLeafName];
            let menuitem = document.getElementById("usercssloader-" + aLeafName);
            if (!CSS) {
                if (menuitem)
                    menuitem.parentNode.removeChild(menuitem);
                return;
            }
            if (!menuitem) {
                menuitem = $C("menuitem", {
                    label : aLeafName,
                    id : "usercssloader-" + aLeafName,
                    class : "usercssloader-item " + (CSS.SHEET == this.AGENT_SHEET? "AGENT_SHEET" : CSS.SHEET == this.AUTHOR_SHEET? "AUTHOR_SHEET": "USER_SHEET"),
                    type : "checkbox",
                    autocheck : "false",
                    oncommand : "UCL.toggle('"+ aLeafName +"');",
                    onclick : "UCL.itemClick(event);",
                    onmouseup : "if (event.button == 1) event.preventDefault();",
                    tooltiptext : "Linksklick: an/aus, Menü schließt\nMittelklick: an/aus, Menü bleibt offen\nRechtsklick: bearbeiten\nStrg+Linksklick: im Dateimanager anzeigen"
                    });
                document.getElementById("usercssloader-menupopup").appendChild(menuitem);
            }
            menuitem.setAttribute("checked", CSS.enabled);
        },
        toggle: function(aLeafName) {
            let CSS = this.readCSS[aLeafName];
            if (!CSS || event.ctrlKey) return;
            CSS.enabled = !CSS.enabled;
            this.rebuildMenu(aLeafName);
        },
        itemClick: function(event) {
            let label = event.currentTarget.getAttribute("label");
            if (event.button === 0) {
                if (event.ctrlKey) {
                    event.preventDefault();
                    event.stopPropagation();
                    UCL.openFolder(label);
                } else {return;}
            }
                    event.preventDefault();
                    event.stopPropagation();
            if (event.button === 1) {
                this.toggle(label);
            }
            else if (event.button === 2) {
                closeMenus(event.target);
                this.edit(this.getFileFromLeafName(label));
            }
        },
        getFileFromLeafName: function(aLeafName) {
            let f = this.FOLDER.clone();
            f.QueryInterface(Ci.nsIFile); // use appendRelativePath
            f.appendRelativePath(aLeafName);
            return f;
        },
        openFolder:function(label){
            const PathSep = AppConstants.platform === "win" ? "\\" : "/";
            let target= this.FOLDER.path + PathSep + label;
            if (this.vFileManager.length !== 0) {
                let file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
                let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
                let args = [this.vFMParameter,target];
                file.initWithPath(this.vFileManager);
                process.init(file);
                // Verzeichnis mit anderem Dateimanager öffnen
                process.run(false, args, args.length);
            } else {
                // Verzeichnis mit Dateimanager des Systems öffnen
                this.FOLDER.launch();
            }
        },
        openCHRMFolder:function(){
            if (this.vFileManager.length !== 0) {
                let file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
                let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
                let args = [this.vFMParameter,this.CHRMFOLDER.path];
                file.initWithPath(this.vFileManager);
                process.init(file);
                // Verzeichnis mit anderem Dateimanager öffnen
                process.run(false, args, args.length);
            } else {
                // Verzeichnis mit Dateimanager des Systems öffnen
                this.CHRMFOLDER.launch();
            }
        },
        editUserCSS: function(aLeafName) {
            let file = Services.dirsvc.get("UChrm", Ci.nsIFile);
            file.appendRelativePath(aLeafName);
            this.edit(file);
        },
        edit: function(aFile) {
            let editor = Services.prefs.getCharPref("view_source.editor.path");
            if (!editor) return alert("Unter about:config den vorhandenen Schalter:\n view_source.editor.path mit dem Editorpfad ergänzen");
            try {
                let UI = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
                UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8";
                let path = UI.ConvertFromUnicode(aFile.path);
                let app = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
                app.initWithPath(editor);
                let process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
                process.init(app);
                process.run(false, [path], 1);
            } catch (e) {}
        },
        create: function(aLeafName) {
            if (!aLeafName) aLeafName = prompt("Name des Styles", dateFormat(new Date(), "%Y_%m%d_%H%M%S"));
            if (aLeafName) aLeafName = aLeafName.replace(/\s+/g, " ").replace(/[\\/:*?\"<>|]/g, "");
            if (!aLeafName || !/\S/.test(aLeafName)) return;
            if (!/\.css$/.test(aLeafName)) aLeafName += ".css";
            let file = this.getFileFromLeafName(aLeafName);
            this.edit(file);
        },
        UCrebuild: function() {
            let re = /^file:.*\.uc\.css(?:\?\d+)?$/i;
            let query = "?" + new Date().getTime();
            Array.slice(document.styleSheets).forEach(function(css){
                if (!re.test(css.href)) return;
                if (css.ownerNode) {
                    css.ownerNode.parentNode.removeChild(css.ownerNode);
                }
                let pi = document.createProcessingInstruction('xml-stylesheet','type="text/css" href="'+ css.href.replace(/\?.*/, '') + query +'"');
                document.insertBefore(pi, document.documentElement);
            });
            UCL.UCcreateMenuitem();
        },
        UCcreateMenuitem: function() {
            let sep = $("usercssloader-ucseparator");
            let popup = sep.parentNode;
            if (sep.nextSibling) {
                let range = document.createRange();
                range.setStartAfter(sep);
                range.setEndAfter(popup.lastChild);
                range.deleteContents();
                range.detach();
            }
            let re = /^file:.*\.uc\.css(?:\?\d+)?$/i;
            Array.slice(document.styleSheets).forEach(function(css) {
                if (!re.test(css.href)) return;
                let fileURL = decodeURIComponent(css.href).split("?")[0];
                let aLeafName = fileURL.split("/").pop();
                let m = $C("menuitem", {
                    label : aLeafName,
                    tooltiptext : fileURL,
                    id : "usercssloader-" + aLeafName,
                    type : "checkbox",
                    autocheck : "false",
                    checked : "true",
                    oncommand : "if (!event.ctrlKey) {this.setAttribute('checked', !(this.css.disabled = !this.css.disabled));}",
                    onmouseup : "if(event.button === 1) event.preventDefault();",
                    onclick : "UCL.UCItemClick(event);"
                });
                m.css = css;
                popup.appendChild(m);
            });
        },
        UCItemClick: function(event) {
            if (event.button === 0) return;
            event.preventDefault();
            event.stopPropagation();
            if (event.button === 1) {
                event.target.doCommand();
            }
            else if (event.button === 2) {
                closeMenus(event.target);
                let fileURL = event.currentTarget.getAttribute("tooltiptext");
                let file = Services.io.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler).getURLSpecFromActualFile(fileURL);
                this.edit(file);
            }
        },
    };
    function CSSEntry(aFile) {
        this.path = aFile.path;
        this.leafName = aFile.leafName;
        this.lastModifiedTime = 1;
        this.SHEET = /^xul-|\.as\.css$/i.test(this.leafName) ? 
            Ci.nsIStyleSheetService.AGENT_SHEET:
            /\.author\.css$/i.test(this.leafName)?
            Ci.nsIStyleSheetService.AUTHOR_SHEET:
            Ci.nsIStyleSheetService.USER_SHEET;
    }
    CSSEntry.prototype = {
        sss: Components.classes["@mozilla.org/content/style-sheet-service;1"]
                .getService(Components.interfaces.nsIStyleSheetService),
        _enabled: false,
        get enabled() {
            return this._enabled;
        },
        set enabled(isEnable) {
            let aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile)
            aFile.initWithPath(this.path);
            let isExists = aFile.exists(); // true, wenn die Datei existiert
            let lastModifiedTime = isExists ? aFile.lastModifiedTime : 0;
            let isForced = this.lastModifiedTime != lastModifiedTime; // true, wenn es eine Änderung in der Datei gibt
            let fileURL = Services.io.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler).getURLSpecFromActualFile(aFile);
            let uri = Services.io.newURI(fileURL, null, null);
            if (this.sss.sheetRegistered(uri, this.SHEET)) {
                // Wenn diese Datei bereits gelesen wurde
                if (!isEnable || !isExists) {
                    this.sss.unregisterSheet(uri, this.SHEET);
                }
                else if (isForced) {
                    // Nach Stornierung erneut einlesen
                    this.sss.unregisterSheet(uri, this.SHEET);
                    this.sss.loadAndRegisterSheet(uri, this.SHEET);
                }
            } else {
                // Datei wurde nicht gelesen
                if (isEnable && isExists) {
                    this.sss.loadAndRegisterSheet(uri, this.SHEET);
                }
            }
            if (this.lastModifiedTime !== 1 && isEnable && isForced) {
                log(this.leafName + " wurde aktualisiert");
            }
            this.lastModifiedTime = lastModifiedTime;
            return this._enabled = isEnable;
        },
    };
    UCL.init();
    function $(id) { return document.getElementById(id); }
    function $A(arr) { return Array.slice(arr); }
    function $C(name, attr) {
        let el = document.createXULElement(name);
        if (attr) Object.keys(attr).forEach(function(n) {
            if(n === "oncommand") {
                el.addEventListener('command', function(event) { Function(attr[n])(); });
            }
            else if(n === "onclick") {
                el.addEventListener('click', function(event) { Function(attr[n])(); });
            }
            else if(n === "onmouseup") {
                el.addEventListener('mouseup', function(event) { Function(attr[n])(); });
            }
            else {
                el.setAttribute(n, attr[n]); 
            }
        });
        return el;
    }
    function dateFormat(date, format) {
        format = format.replace("%Y", ("000" + date.getFullYear()).substr(-4));
        format = format.replace("%m", ("0" + (date.getMonth()+1)).substr(-2));
        format = format.replace("%d", ("0" + date.getDay()).substr(-2));
        format = format.replace("%H", ("0" + date.getHours()).substr(-2));
        format = format.replace("%M", ("0" + date.getMinutes()).substr(-2));
        format = format.replace("%S", ("0" + date.getSeconds()).substr(-2));
        return format;
    }
    function log() { Application.console.log(Array.slice(arguments)); }
    })();
    Alles anzeigen

    Bitte beachten: Ich selbst habe bei mir die Tastenkombinationen für die Menüpunkte deaktiviert, aber oben aktiviert – in einem Fall mit Hinweistext (für die anderen ist er ebenso vorhanden, aber auskommentiert). Ich wäre vor allem daran interessiert, ob diese in Linux und MacOs überhaupt funktionieren. In Bezug auf ein anderes Skript hat mich Sören Hentzschel einmal darauf hingewiesen, dass dort die Meta-Taste anstelle der Strg-Taste zu benutzen war, und den benötigten Code zur Anpassung gepostet. Ich könnte diesen hier genauso verwenden (ich hab oben eine Abwandlung davon für den PathSep genutzt).

    Edit im Skript: Ich hatte vergessen, eine Tastenkombination wieder zu aktivieren. Und ich habe eine Vereinfachung wegen der Kommata bei accesskey: "M" gemacht.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 20. Januar 2025 um 01:42
    Zitat von Endor

    Dieses Script geht hier im Nightly auch nicht mehr richtig:

    Interessant. Ich nutze dafür das Addon Reload button in Location bar.

    Das funktioniert hier:

    JavaScript
    // ==UserScript==
    // @name           moveReloadIntoUrl.uc.js
    // @description    Neuladen Schaltfläche in Adressleiste verschieben
    // @compatibility  Firefox 57
    // @author         Ryan, GOLF-AT
    // @include        main
    // @shutdown       window.moveReloadIntoURL.unload();
    // @homepageURL    https://github.com/benzBrake/FirefoxCustomize
    // @version        1.2.4
    // @note           1.2.4 Bug 1880914  Move Browser* helper functions used from global menubar and similar commands to a single object in a separate file, loaded as-needed and Bug 1820534 - Move front-end to modern flexbox
    // @note           1.2.3 Änderung wird in neuen Fenstern nicht wirksam und kann nicht verwendet werden, wenn Hot-Swapping stattfindet.
    // @note           1.2.2 Kompatibilität für Firefox 103
    // @note           1.2.0 Hot-Swap-fähig, kompatibel mit Nachtmodus und Bilder wurden ins Script integriert
    // @note           1.1 20220424 Fehler behoben, und Firefox 100 Kompatibel
    // @note           1.0 20171104
    // ==/UserScript==
    (function () {
        let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
        const isGerman = (Services.locale.appLocaleAsBCP47 || Services.locale.getAppLocaleAsBCP47()).includes("de");
        if (window.moveReloadIntoURL) {
            window.moveReloadIntoURL.unload();
            delete window.moveReloadIntoURL;
        }
        window.moveReloadIntoURL = {
            handleEvent: function (aEvent) {
                if (aEvent.type === "MoveReloadIntoUrlUnload") {
                    let window = aEvent.originalTarget,
                        doc = window.document;
                    let RELOADBTN = CustomizableUI.getWidget("reload-button").forWindow(window).node;
                    if (RELOADBTN)
                        RELOADBTN.removeEventListener('DOMAttrModified', this.reloadBtnAttr);
                    let BTN = doc.getElementById("new-stop-reload-button");
                    if (BTN)
                        BTN.parentNode.removeChild(BTN);
                    if (this.STYLE) {
                        this.sss.unregisterSheet(this.STYLE.url, this.STYLE.type);
                    }
                    window.removeEventListener('MoveReloadIntoUrlUnload', this);
                    if (window.moveReloadIntoURL)
                        delete window.moveReloadIntoURL;
                }
            },
            init: function () {
                if (window.moveReloadIntoURL) {
                    this.sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
                    this.STYLE = {
                        url: Services.io.newURI('data:text/css;charset=UTF-8,' + encodeURIComponent(`
                    @-moz-document url-prefix('chrome://browser/content/browser.x') {
                        #stop-reload-button {
                            display: none;
                        }
                        #new-stop-reload-button {
                            display: flex !important;
                            order: 9999;
                        }
                        #new-stop-reload-button .urlbar-icon {
                            -moz-context-properties: fill, fill-opacity !important;
                            fill: currentColor !important;
                        }
                    }
                    `)),
                        type: this.sss.AGENT_SHEET
                    };
                    this.sss.loadAndRegisterSheet(this.STYLE.url, this.STYLE.type);
                }
                let PABTN = CustomizableUI.getWidget("pageActionButton").forWindow(window).node;
                let RELOADBTN = CustomizableUI.getWidget("reload-button").forWindow(window).node;
                let BTN = $C(document, 'hbox', {
                    id: "new-stop-reload-button",
                    class: "urlbar-page-action urlbar-addon-page-action",
                    "tooltiptext": isGerman ? 'Linksklick: Seite neuladen\r\nRechtsklick: Neu laden ohne Cache' : 'Left click: refresh page\nRight click: force refresh page',
                    style: "list-style-image: url('data:image/svg+xml;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAgIC0gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogICAtIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE2IDE2IiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9IiNkOTAwMDAiIGZpbGwtb3BhY2l0eT0iMS4wIiBzdHJva2U9IiNkOTAwMDAiIHN0cm9rZS13aWR0aD0iMSIgPgogIDxwYXRoIGQ9Ik0xMC43MDcgNiAxNC43IDZsLjMtLjMgMC0zLjk5M2EuNS41IDAgMCAwLS44NTQtLjM1NGwtMS40NTkgMS40NTlBNi45NSA2Ljk1IDAgMCAwIDggMUM0LjE0MSAxIDEgNC4xNDEgMSA4czMuMTQxIDcgNyA3YTYuOTcgNi45NyAwIDAgMCA2Ljk2OC02LjMyMi42MjYuNjI2IDAgMCAwLS41NjItLjY4Mi42MzUuNjM1IDAgMCAwLS42ODIuNTYyQTUuNzI2IDUuNzI2IDAgMCAxIDggMTMuNzVjLTMuMTcxIDAtNS43NS0yLjU3OS01Ljc1LTUuNzVTNC44MjkgMi4yNSA4IDIuMjVhNS43MSA1LjcxIDAgMCAxIDMuODA1IDEuNDQ1bC0xLjQ1MSAxLjQ1MWEuNS41IDAgMCAwIC4zNTMuODU0eiIvPgo8L3N2Zz4K"
                });
                BTN.appendChild($C(document, 'image', {
                    class: 'urlbar-icon',
                }));
                BTN.addEventListener('click', function (e) {
                        let r = CustomizableUI.getWidget("reload-button").forWindow(window).node;
                        e.preventDefault();
                        if (r && r.getAttribute('displaystop'))
                            gBrowser.stop();
                        else
                            if (e.button === 2) {
                                gBrowser.reloadWithFlags(Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE)
                            } else {
                                if (gBrowser.selectedBrowser._userTypedValue) {
                                    e.target.ownerGlobal.openTrustedLinkIn(gBrowser.selectedBrowser._userTypedValue, 'current', {
                                        postData: null,
                                        triggeringPrincipal: gBrowser.selectedBrowser.contentPrincipal
                                    });
                                } else {
                                    gBrowser.reload();
                                }
                            }
                    });
                PABTN.after(BTN);
                RELOADBTN.addEventListener('DOMAttrModified', this.reloadBtnAttr);
                this.reloadBtnAttr();
                window.addEventListener('MoveReloadIntoUrlUnload', this)
            },
            unload: function () {
                let windows = Services.wm.getEnumerator('navigator:browser');
                while (windows.hasMoreElements()) {
                    let win = windows.getNext();
                    win.dispatchEvent(new CustomEvent("MoveReloadIntoUrlUnload"));
                }
            },
            reloadBtnAttr: function (e) {
                let doc = e ? e.target.ownerDocument : document;
                btn = doc.getElementById('new-stop-reload-button');
                if (btn && (!e || e.attrName == 'displaystop')) {
                    var newVal = e ? e.newValue : doc.getElementById(
                        "reload-button").getAttribute('displaystop');
                    if (newVal)
                        btn.style.listStyleImage = "url('data:image/svg+xml;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAgIC0gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogICAtIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE2IDE2IiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9IiMwMDhjMjMiIGZpbGwtb3BhY2l0eT0iMS4wIiBzdHJva2U9IiMwMDhjMjMiIHN0cm9rZS13aWR0aD0iMS41Ij4KICA8cGF0aCBkPSJtOS4xMDggNy43NzYgNC43MDktNC43MDlhLjYyNi42MjYgMCAwIDAtLjg4NC0uODg1TDguMjQ0IDYuODcxbC0uNDg4IDAtNC42ODktNC42ODhhLjYyNS42MjUgMCAxIDAtLjg4NC44ODVMNi44NyA3Ljc1NGwwIC40OTEtNC42ODcgNC42ODdhLjYyNi42MjYgMCAwIDAgLjg4NC44ODVMNy43NTQgOS4xM2wuNDkxIDAgNC42ODcgNC42ODdhLjYyNy42MjcgMCAwIDAgLjg4NSAwIC42MjYuNjI2IDAgMCAwIDAtLjg4NUw5LjEwOCA4LjIyM2wwLS40NDd6Ii8+Cjwvc3ZnPgo=')";
                    else
                        btn.style.listStyleImage = "url('data:image/svg+xml;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAgIC0gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogICAtIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE2IDE2IiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9IiNkOTAwMDAiIGZpbGwtb3BhY2l0eT0iMS4wIiBzdHJva2U9IiNkOTAwMDAiIHN0cm9rZS13aWR0aD0iMSIgPgogIDxwYXRoIGQ9Ik0xMC43MDcgNiAxNC43IDZsLjMtLjMgMC0zLjk5M2EuNS41IDAgMCAwLS44NTQtLjM1NGwtMS40NTkgMS40NTlBNi45NSA2Ljk1IDAgMCAwIDggMUM0LjE0MSAxIDEgNC4xNDEgMSA4czMuMTQxIDcgNyA3YTYuOTcgNi45NyAwIDAgMCA2Ljk2OC02LjMyMi42MjYuNjI2IDAgMCAwLS41NjItLjY4Mi42MzUuNjM1IDAgMCAwLS42ODIuNTYyQTUuNzI2IDUuNzI2IDAgMCAxIDggMTMuNzVjLTMuMTcxIDAtNS43NS0yLjU3OS01Ljc1LTUuNzVTNC44MjkgMi4yNSA4IDIuMjVhNS43MSA1LjcxIDAgMCAxIDMuODA1IDEuNDQ1bC0xLjQ1MSAxLjQ1MWEuNS41IDAgMCAwIC4zNTMuODU0eiIvPgo8L3N2Zz4K')";
                }
            },
        }
        function $C(aDoc, tag, attrs, skipAttrs) {
            let d = (aDoc || document);
            attrs = attrs || {};
            skipAttrs = skipAttrs || [];
            var el = "createXULElement" in d ? d.createXULElement(tag) : d.createElement(tag);
            return $A(el, attrs, skipAttrs);
        }
        function $A(el, obj, skipAttrs) {
            skipAttrs = skipAttrs || [];
            if (obj) Object.keys(obj).forEach(function (key) {
                if (!skipAttrs.includes(key)) {
                    if (typeof obj[key] === 'function') {
                        el.setAttribute(key, "(" + obj[key].toString() + ").call(this, event);");
                    } else {
                        el.setAttribute(key, obj[key]);
                    }
                }
            });
            return el;
        }
        "canLoadToolbarContentPromise" in PlacesUIUtils ? PlacesUIUtils.canLoadToolbarContentPromise.then(_ => moveReloadIntoURL.init()) : moveReloadIntoURL.init();
    })();
    Alles anzeigen

    Siehe Zeilen 77–95.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 20. Januar 2025 um 01:12

    Endor:

    Ein weiteres Skript, von dem ich bei dir nur die uralte XUL-Version finde, bei Mithrandir/Ardiman aber die erste JS-Version, die inzwischen mehrfach angepasst werden musste. Damit kann man Javascript schnell de-/aktivieren:

    JavaScript
    // JsOff.uc.js
    (function() {
    if (!window.gBrowser) return;
    const
        buttonID = 'toolbar-button-js',
        configPref = 'javascript.enabled',
        labelText = 'Javascript ein-/ausschalten',
        tooltipOn = 'Javascript ist eingeschaltet',
        tooltipOff = 'Javascript ist ausgeschaltet',
        css =
    `#${buttonID}[tooltiptext="${tooltipOn}"] {list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAARVBMVEUAAAAKmAAJiAALqAAIeACG/zd6/zMAVAEMugAARgEHZgATQAADJgBS/gARvgA+zgABEAAofAAXxgA1sAAANgFb/xUMrACNps2gAAAAfUlEQVR4XmXOVwrEMAxF0afmmjZ1/0sdSYQhkAsG+0gfxj1mJhKPhJgdtNbLNE4V2BnIgRyAaTaBBCaR9kWMRQKIpG3PgK3JfyOhnRuLt12AsX7QAvydEHeFlYD8GFabeNh+ENWEA3ux8kIn7hrwXuAdnXtPGENVOVMduPUDmGIDcIkU2P8AAAAASUVORK5CYII=");}
    #${buttonID}[tooltiptext="${tooltipOff}"] {list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAY1BMVEUAAAD/RDf/HxX/U0f/0dH/LyX8CwD/Rz/MBADsCgD/y8v/vb0gAgD/aWn/MTH/Jx2kAACYAwD/FgtYBABdExP/nZ3/W0+KBgB6AgD/iYlpFRW0JCReBAA8AQDABADwEAAwAQBzWTWpAAAAiElEQVR4XmXMR5bDUAhE0Sr4QTk7h+79r9Ig2ZroDe8pwLEkkb+iGMhQYK93KIjwDZ1BNACWEBYAdGBW9RGYuQGpZwfVvC90BdKhf77meQUq/angdEJ2yNtiQhWQEGo/iQYJt3DHI7QNu7c4/KOtq7rHhXFMBuX1BasZZRhXKP6SJSJTSmWJQx/pFASUD6QxIwAAAABJRU5ErkJggg==");}`;
    try {
            CustomizableUI.createWidget({
                id: buttonID,
                type: 'custom',
                defaultArea: CustomizableUI.AREA_NAVBAR,
                onBuild: function(aDocument) {
                        let button = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
                        let attributes = {
                            id: buttonID,
                            class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                            removable: 'true',
                            label: labelText,
                            tooltiptext: Services.prefs.getBoolPref(configPref) ? tooltipOn : tooltipOff,
                        };
                        for (let a in attributes) button.setAttribute(a, attributes[a]);
                        button.addEventListener('click', () => { if(event.button === 0) {
                            let isEnabled = !Services.prefs.getBoolPref(configPref);
                            Services.prefs.setBoolPref(configPref, isEnabled);
                            let windows = Services.wm.getEnumerator('navigator:browser');
                            while (windows.hasMoreElements()) {
                                    let button = windows.getNext().document.getElementById(buttonID);
                                    if (isEnabled) { button.setAttribute('tooltiptext', tooltipOn) }
                                    else { button.setAttribute('tooltiptext', tooltipOff) };
                            };
                        }});
                        return button;
                }
            });
    } catch(e) { };
    let stylesheet = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"');
    document.insertBefore(stylesheet, document.documentElement);
    })();
    Alles anzeigen

    Beachte, dass ich alles, was man konfigurieren könnte, nach vorn gesetzt und Variablen zugewiesen habe. Nach demselben Muster habe ich auch andere Skripte geändert und würde dafür plädieren, das möglichst oft zu tun.

  • UserCSSLoader (2025)

    • Speravir
    • 19. Januar 2025 um 01:08
    Zitat von Sören Hentzschel

    Also eigentlich sollte es dadurch leichter lesbar werden

    Wie gesagt, für mich nicht. Aber wir müssen das nicht weiter ausführen.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 19. Januar 2025 um 01:05
    Zitat von lenny2

    Die optimale Variante von UndoListInTabmenuToo.uc.js sieht für mich so aus.

    (etc.) Kannst Du das bitte selbst bei GitHub eintragen oder hier auf Englisch noch einmal aufschreiben? Ich würde im letzteren Fall dann darauf verweisen.

    Zitat von lenny2

    - Die Breite der Dropdown-Liste der geschlossenen Tabs muss vergrößert werden, sie ist 3-4cm kleiner als bei der „Undo Cloae Tab 8.0.0“-Erweiterung und das ist unbequem.

    Ich halte es nicht für zu schmal, bei mir werden etwa 60 Zeichen angezeigt (schwankt, weil keine Festbreitenschrift).

    Zitat von Mira_Belle

    Wer sich das Skript anschauen möchte:

    Such darin nach \u00FC und ersetze es durch ü sowie nach \u00F6 und ersetze dies durch ö (gibts jeweils 2x) – im Skript sind jetzt schon Umlaute enthalten., so dass die Kodierung keinen Vorteil bringt.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 18. Januar 2025 um 01:46
    Zitat von Mira_Belle

    Damit ich besser vergleichen kann, wärst Du so nett und verlinkst die Beiträge?
    Jene ohne Übersetzungsschwächen (bzw. ohne Fehler). Bitte, Danke.

    Upps. OK, bei der Menge der Antworten kann man den Überblick verlieren. Und ich glaube, mir geht das selbst so:

    • Version 1 : 15. Januar 2025 um 23:04
    • Version 2: 16. Januar 2025 um 10:29

    V. 1 scheint mir die bessere zu sein, obwohl Du sie anscheinend zuerst gepostet hast. ( Endor bitte mal abgleichen.)

    Ich hatte weiter oben geschrieben, dass jemand Alice informieren sollte. Der jemand war jetzt ich:

    Error with UndoListInTabmenuToo.uc.js · Issue #91 · alice0775/userChrome.js

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 17. Januar 2025 um 01:31

    Endor & Horstmann:

    In meiner vorigen Antwort war mir nicht genau bewusst, womit ihr Probleme habt. Das ist mir erst später klar geworden. Nehmen wir das Beispiel Browsertools-Button, ich beziehe mich auf die am 7. Juni 2023 gepostete Version (als browsertoolbox.uc.js):

    Wir finden dort ab Zeile 22 ein einer Variable zugeordnetes Objekt (gekürzt um die hier nicht relevanten Teile):

    JavaScript
                    var props = {
                        // Kürzung
                        style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");',
    
                        oncommand: '(' + onCommand.toString() + ')()'
                    };
                    for (var p in props)
                        toolbaritem.setAttribute(p, props[p]);
                    return toolbaritem;

    sowie ab Z. 39 die eigentliche Funktion:

    JavaScript
        function onCommand() {
            var document = event.target.ownerDocument;
            if (!document.getElementById('menu_browserToolbox')) {
                let { require } = ChromeUtils.importESModule("resource://devtools/shared/loader/Loader.sys.mjs", {});
                require("devtools/client/framework/devtools-browser");
            };
            document.getElementById('menu_browserToolbox').click();
        };

    Das kann man nun unter Entfernung oder auch unter Erhalt der eigenen Funktion zu einem addEventListener umbauen:

    a) Entfernung, im Prinzip wie in meiner vorherigen Antwort (die Einrückung stimmt jetzt nicht mehr, weil ich alles nur kopiert habe)

    JavaScript
                    let props = {
                        // Kürzung
                        style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");'
                    };
                    for (let p in props)
                        toolbaritem.setAttribute(p, props[p]);
    
                        toolbaritem.addEventListener('click',() => {
            let document = event.target.ownerDocument;
            if (!document.getElementById('menu_browserToolbox')) {
                let { require } = ChromeUtils.importESModule("resource://devtools/shared/loader/Loader.sys.mjs", {});
                require("devtools/client/framework/devtools-browser");
            };
            document.getElementById('menu_browserToolbox').click();
        });
    
                    return toolbaritem;
    Alles anzeigen

    b) die Funktion wird gar nicht angerührt (wobei, wie Horstmann selber schreibt, ein anderer Funktionsname deutlich besser wäre, openBox oder so):

    JavaScript
                    let props = {
                        // Kürzung
                        style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");'
                    };
                    for (let p in props)
                        toolbaritem.setAttribute(p, props[p]);
    
                        toolbaritem.addEventListener('click', () => { onCommand() });
    
                    return toolbaritem;
    
    // weiterer Code
    
        function onCommand() {
        // Funktionscode
        };
    Alles anzeigen

    Ich bin selbst nicht darauf gekommen, aber Mitleser hat das so in seinem DeepL-Skript benutzt, vergleiche Posting vom 12. Januar 2025, dort mit der zusätzlichen Verbesserung, dass der Code nur bei Klick mit der linken Maustaste ausgeführt werden soll (zusätzliches if (event.button == 0) {…} um den Funktionsaufruf, beachtet dazu Sörens Hinweis: drei Gleichheitszeichen wären besser).

    Beachtet auch, dass in beiden Variationen am Ende von Zeile 24 (style: …) ein Komma entfernt werden musste. Und ich habe var in let geändert.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 17. Januar 2025 um 00:43
    Zitat von Sören Hentzschel

    Dann ist das ja logisch.

    Schon in Ordnung.

    Zitat von Mira_Belle

    da beziehst Du Dich aber auf eine Version, die längst überholt ist.

    Wie Sören dir bereits geantwortet hat: Nöö. Ich hatte durchaus bemerkt, dass Du ein geändertes Skript gepostet hast, es aber nicht heruntergeladen. Edit: Jetzt aber doch. Welche der zwei Versionen ist die neuere? Die zuletzt gepostete enthält jedenfalls viele Rechtschreibfehler und Übersetzungsschwächen (wenn man nicht sogar Fehler), die in der zuerst geposteten ausgemerzt wurden.

  • UserCSSLoader (2025)

    • Speravir
    • 17. Januar 2025 um 00:10
    Zitat von Sören Hentzschel

    Das & kann in den Zeilen 7, 8 und 19 entfernt werden.

    Ja, danke. Ich weiß das (dank dir, Du hattest schon einmal darauf hingewiesen). Ich finde es aber ohne das & viel schwerer lesbar, vor allem, wenn die Regeln umfangreicher werden, und werde es für mich deshalb beibehalten.

  • UserCSSLoader (2025)

    • Speravir
    • 16. Januar 2025 um 01:15

    Vorab: Ich beziehe mich auf diese Version von 2023 bei Endor (genauer: Revision 7947b7d), deshalb Ping Endor.

    Zunächst das Einfache: Wenn man sich wie ich den Loader als frei verschiebbare Schaltfläche anzeigen lässt (Einstellung let position = 0;, dann kann man sich per CSS ein Symbol einrichten (ob das auch als festes Menü möglich ist, habe ich nicht ausprobiert):

    CSS
    /* Symbol für den UserCSSLoader, eigentlich ein Menü */
    #usercssloader-menu {
        background-image: url("./images/CSS.png") !important;
        background-position: center !important;
        background-repeat: no-repeat !important;
        background-size: 16px !important;
        & > :is(.menu-accel-container,.menu-right) { display: none !important }
        & > .menu-text[value="CSS"] { opacity: 0 !important }
    }

    Das bedeutet, dass die Symboldatei CSS.png (siehe in CSS.zip) in einem Unterordner images des Ordners liegt, in dem sich die Stildatei befindet. Das Symbol habe ich von dieser Datei abgeleitet: File:CSS text representation (short).png (Wikimedia Commons). Beachte, dass der ursprüngliche Autor (das bin nicht ich) die Datei unter eine CC-Lizenz gesetzt hat. Ich bin aber der Überzeugung, dass für diese Datei die Schöpfungshöhe viel zu gering ist, was gewöhnlich in Wikimedia Commons mit der Vorlage Template:PD-textlogo markiert wird.

    Ich habe mir zusätzlich die folgende Stilregel in gleich zwei Stildateien geschrieben, die hier im UserCSSLoader eher nicht zeitgleich deaktiviert werden:

    CSS
    /* Check mark (x) für den UserCSSLoader */
    #usercssloader-menu menuitem[checked="false"] {
        &::before {
            content: "\274C";
            display: block;
            width: 16px;
            height: 16px;
        }
        & .menu-iconic-text { padding-inline-start: 8px !important }
    }

    \274C steht für das Zeichen ❌ (in Unicode als CROSS MARK bezeichnet).


    Nun zum eigentlichen Skriptinhalt:

    Zuerst eine Frage:
    Funktioniert bei Euch der Konfigparameter filemanagerParam? Bei mir nämlich nicht. Ich lasse stattdessen als filemanager eine Verknüpfung aufrufen, in der die Parameter enthalten sind. (In Linux und MacOS würde man wohl ein Shellscript nehmen).

    Zweitens:
    Die Tastenkombinationen sollten überarbeitet werden: Manche sind eher ungewöhnlich, manche sind doppelt (ich selbst habe sie auskommentiert). Ein paar Vorschläge wären gut. Und wieso gibt es nur für einen der Menüeinträge den entsprechenden Hinweistext (acceltext im Skript)?

    Von mir:
    * Alt+C zum Öffnen des Menüs funktioniert nicht, weil damit das Standardmenü für die Historie (Chronik) geöffnet wird.
    * Styles importieren: I statt R.
    * CSS-Datei erstellen: E statt D. Alt+D öffnet das Standard-Dateimenü.
    * Chrome-Ordner öffnen, vielleicht K statt O?

    Drittens:
    Die Skriptsammlung userstyles.org ist schon länger nicht mehr erreichbar, so dass der entsprechende Menüeintrag und die Funktion, die von diesem aufgerufen wird, entfernt werden können. Dasselbe trifft bei mir auf die Testfunktion sowie die beiden Menüeinträge zu, die diese aufrufen. Zusätzlich ist dann der vorherige Menüseparator nicht mehr nötig.

    Viertens:
    Hier nicht behandelt, aber das Skript muss wie viele andere auf Eventhandler umgestellt werden. Ich hab sie noch nicht getestet, aber BrokenHeart hat anscheinend eine dahingehend veränderte, funktionierende Version vorgestellt. (Edit: Upps, stimmt nicht.) In diese sollten die notwendigen Änderungen dann eingearbeitet werden. (Aha, Mira_Belle oder Endor – 15. Januar 2025, 15:29, oder das direkt folgende Posting um 15:58 Uhr).

    Nachtrag:
    Barbaras folgender Beitrag hat mich erinnert, dass ich vergessen habe, das um die entfernten Teile (Punkt 3) gekürzte Skript zu posten. Nicht geändert sind aber die Tastenkombinationen.

    JavaScript
    // ==UserScript==
    // @name           UserCSSLoader
    // @description    CSS-Codes - Styles laden und verwalten
    // @namespace      http://d.hatena.ne.jp/Griever/
    // @author         Griever
    // @include        main
    // @license        MIT License
    // @compatibility  Firefox 116*
    // @charset        UTF-8
    // @version        0.0.4K+
    // @note           Aktualisierung von Speravir - www.camp-firefox.de
    // @note           Fx92: getURLSpecFromFile() -> getURLSpecFromActualFile()
    // @note           AUTHOR_SHEET Verwendung hinzugefügt, wichtig: am Ende des Dateinamens .author.css
    // @note           Version 0.0.4.g ermoeglicht "Styles importieren" per Mittelklick und Verwendung
    // @note           eines anderen Dateimanager (siehe in Konfiguration)
    // @note           + ergänzt um einen Parameter für den Dateimanager (vFMParameter in der Konfiguration) von aborix
    // @note           Frei verschiebbare Schaltfläche eingebaut von aborix
    // @note           0.0.4 Remove E4X
    // @note           CSSEntry-Klasse erstellt
    // @note           Style-Test-Funktion überarbeitet
    // @note           Wenn die Datei gelöscht wurde, CSS beim Neu-Erstellen und Löschen des Menüs abbrechen
    // @note           uc einlesen .uc.css temporäre Korrespondenz zum erneuten Lesen
    // ==/UserScript==
    /****** Bedienungsanleitung ******
    CSS-Ordner im Chrome-Ordner erstellen, CSS-Dateien dort ablegen - speichern.
    Diejenigen, deren Dateiname mit "xul-" beginnen, diejenigen, die mit ".as.css" enden, sind AGENT_SHEET, 
    alle anderen außer USER_SHEET werden gelesen. Da der Inhalt der Datei nicht überprüft wird,
    darauf achten, @ Namespace Angabe nicht zu vergessen!
    CSS-Menü wird zur Menüleiste hinzugefügt
    Linksklick auf Stil, zum aktivieren/deaktivieren
    Mittelklick auf Stil zum aktivieren/deaktivieren, ohne Menü zu schließen
    Rechtsklick auf Stil zum Öffnen im Editor
    Strg+Linksklick zum Anzegen im Dateimanager
    Verwenden des in "view_source.editor.path" angegebenen Editors
    Dateiordner kann in Konfiguration geändert werden
    **** Anleitung Ende ****/
    (function(){
    /* Konfiguration */
    // Position: als Menü anzeigen = 1, als frei verschiebbare-Schaltfläche = 0
    let position = 1;
    // alternativer Dateimanager, Bsp.:
    // let filemanager = "C:\\Programme\\totalcmd\\TOTALCMD.EXE";
    let filemanager = PathUtils.join(PathUtils.profileDir, "chrome", "Totalcommander.lnk");
    // eventuelle Parameter für den alternativen Dateimanager, sonst filemanagerParam = "";
    //let filemanagerParam = "/O /A /T";
    let filemanagerParam = "";
    // Unterordner für die CSS-Dateien:
    let cssFolder = "CSS";
    // zusätzlich Chrome-Ordner im Untermenü anzeigen: 1 = ja, 0 = nein
    let showChrome = 1;
    /* Ende Konfiguration */
    
    let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
    // Wenn beim Start ein anderes Fenster angezeigt wird (das zweite Fenster), wird es beendet
    let list = Services.wm.getEnumerator("navigator:browser");
    while(list.hasMoreElements()){ if(list.getNext() != window) return; }
    const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
    if (window.UCL) {
        window.UCL.destroy();
        delete window.UCL;
    }
    window.UCL = {
        vFileManager: filemanager,
        vFMParameter: filemanagerParam,
        USE_UC: "UC" in window,
        AGENT_SHEET: Ci.nsIStyleSheetService.AGENT_SHEET,
        USER_SHEET : Ci.nsIStyleSheetService.USER_SHEET,
        AUTHOR_SHEET: Ci.nsIStyleSheetService.AUTHOR_SHEET,
        readCSS : {},
        get disabled_list() {
            let obj = [];
            try {
                    obj = this.prefs.getCharPref("disabled_list").split("|");
            } catch(e) {}
            delete this.disabled_list;
            return this.disabled_list = obj;
        },
        get prefs() {
                delete this.prefs;
                return this.prefs = Services.prefs.getBranch("UserCSSLoader.")
        },
        get styleSheetServices(){
                delete this.styleSheetServices;
                return this.styleSheetServices = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
        },
        get FOLDER() {
            let aFolder;
            try {
                // UserCSSLoader.FOLDER verwenden
                let folderPath = this.prefs.getCharPref("FOLDER");
                aFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile)
                aFolder.initWithPath(folderPath);
            } catch (e) {
                aFolder = Services.dirsvc.get("UChrm", Ci.nsIFile);
                aFolder.appendRelativePath(cssFolder);
            }
            if (!aFolder.exists() || !aFolder.isDirectory()) {
                aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664);
            }
            delete this.FOLDER;
            return this.FOLDER = aFolder;
        },
        get CHRMFOLDER() {
            let bFolder;
            try {
                // UserCSSLoader.CHRMFOLDER verwenden
                let CHRMfolderPath = this.prefs.getCharPref("CHRMFOLDER");
                bFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile)
                bFolder.initWithPath(CHRMfolderPath);
            } catch (e) {
                bFolder = Services.dirsvc.get("UChrm", Ci.nsIFile);
            }
            if (!bFolder.exists() || !bFolder.isDirectory()) {
                bFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664);
            }
            delete this.CHRMFOLDER;
            return this.CHRMFOLDER = bFolder;
        },
        getFocusedWindow: function() {
            let win = document.commandDispatcher.focusedWindow;
            if (!win || win == window) win = content;
            return win;
        },
        init: function() {
            let cssmenu = $C("menu", {
                id: "usercssloader-menu",
                label: "CSS",
                tooltiptext: "UserCSSLoader\n\nLinksklick: Stylesheets anzeigen\nMittelklick: Styles importieren",
                accesskey: "C",
                onclick: "if (event.button == 1) UCL.rebuild()"
            });
            let menupopup = $C("menupopup", {
                id: "usercssloader-menupopup"
            });
            cssmenu.appendChild(menupopup);
            let menu = $C("menu", {
                label: "Style-Loader-Menü",
                id: "style-loader-menu",
                accesskey: "M"
            });
            menupopup.appendChild(menu);
            menupopup.appendChild($C("menuseparator"));
            
            let mp = $C("menupopup", { id: "usercssloader-submenupopup" });
            menu.appendChild(mp);
            mp.appendChild($C("menuitem", {
                label: "Styles importieren",
                accesskey: "R",
                acceltext: "Alt + R",
                oncommand: "UCL.rebuild();"
            }));
            mp.appendChild($C("menuseparator"));
            mp.appendChild($C("menuitem", {
                label: "CSS-Datei erstellen",
                accesskey: "D",
                oncommand: "UCL.create();"
            }));
            mp.appendChild($C("menuitem", {
                label: "CSS-Ordner öffnen",
                accesskey: "O",
                oncommand: "UCL.openFolder();"
            }));
            if (showChrome == 1) {
                mp.appendChild($C("menuitem", {
                label: "Chrome-Ordner öffnen",
                accesskey: "O",
                oncommand: "UCL.openCHRMFolder();"
                }));
            }
            mp.appendChild($C("menuitem", {
                label: "userChrome.css bearbeiten",
                hidden: false,
                oncommand: "UCL.editUserCSS('userChrome.css');"
            }));
            mp.appendChild($C("menuitem", {
                label: "userContent.css bearbeiten",
                hidden: false,
                oncommand: "UCL.editUserCSS('userContent.css');"
            }));
            menu = $C("menu", {
                label: ".uc.css",
                accesskey: "U",
                hidden: !UCL.USE_UC
            });
            menupopup.appendChild(menu);
            mp = $C("menupopup", { id: "usercssloader-ucmenupopup" });
            menu.appendChild(mp);
            mp.appendChild($C("menuitem", {
                label: "Importieren(.uc.js)",
                oncommand: "UCL.UCrebuild();"
            }));
            mp.appendChild($C("menuseparator", { id: "usercssloader-ucseparator" }));
            CustomizableUI.createWidget({
                id: 'usercssloader-menu-item',
                type: 'custom',
                defaultArea: CustomizableUI.AREA_NAVBAR,
                onBuild: function(aDocument) {
                    let toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbaritem');
                    toolbaritem.id = 'usercssloader-menu-item';
                    toolbaritem.className = 'chromeclass-toolbar-additional';
                    return toolbaritem;
                }
            });
            $('usercssloader-menu-item').appendChild(cssmenu);
            if (position == 1) {
            let refNode = $('helpMenu');
            refNode.parentNode.insertBefore(cssmenu, refNode.nextSibling);
            }
            
            $("mainKeyset").appendChild($C("key", {
                id: "usercssloader-rebuild-key",
                oncommand: "UCL.rebuild();",
                key: "R",
                modifiers: "alt",
            }));        
            this.rebuild();
            this.initialized = true;
            if (UCL.USE_UC) {
                setTimeout(function() {
                    UCL.UCcreateMenuitem();
                }, 1000);
            }
            window.addEventListener("unload", this, false);
        },
        uninit: function() {
            const dis = [];
            for (let x of Object.keys(this.readCSS)) {
                if (!this.readCSS[x].enabled)
                    dis.push(x);
            }
            this.prefs.setCharPref("disabled_list", dis.join("|"));
            window.removeEventListener("unload", this, false);
        },
        destroy: function() {
            var i = document.getElementById("usercssloader-menu");
            if (i) i.parentNode.removeChild(i);
            var i = document.getElementById("usercssloader-rebuild-key");
            if (i) i.parentNode.removeChild(i);
            this.uninit();
        },
        handleEvent: function(event) {
            switch(event.type){
                case "unload": this.uninit(); break;
            }
        },
        rebuild: function() {
            let ext = /\.css$/i;
            let not = /\.uc\.css/i;
            let files = this.FOLDER.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
            while (files.hasMoreElements()) {
                let file = files.getNext().QueryInterface(Ci.nsIFile);
                if (!ext.test(file.leafName) || not.test(file.leafName)) continue;
                let CSS = this.loadCSS(file);
                CSS.flag = true;
            }
            for (let leafName of Object.keys(this.readCSS)) {
                const CSS = this.readCSS[leafName];
                if (!CSS.flag) {
                    CSS.enabled = false;
                    delete this.readCSS[leafName];
                }
                delete CSS.flag;
                this.rebuildMenu(leafName);
            }
            if (this.initialized) {
                if (typeof(StatusPanel) !== "undefined")
                    StatusPanel._label = "Style importiert";
                else
                    XULBrowserWindow.statusTextField.label = "Styles importieren";
            }
        },
        loadCSS: function(aFile) {
            var CSS = this.readCSS[aFile.leafName];
            if (!CSS) {
                CSS = this.readCSS[aFile.leafName] = new CSSEntry(aFile);
                if (this.disabled_list.indexOf(CSS.leafName) === -1) {
                    CSS.enabled = true;
                }
            } else if (CSS.enabled) {
                CSS.enabled = true;
            }
            return CSS;
        },
        rebuildMenu: function(aLeafName) {
            var CSS = this.readCSS[aLeafName];
            var menuitem = document.getElementById("usercssloader-" + aLeafName);
            if (!CSS) {
                if (menuitem)
                    menuitem.parentNode.removeChild(menuitem);
                return;
            }
            if (!menuitem) {
                menuitem = $C("menuitem", {
                    label : aLeafName,
                    id : "usercssloader-" + aLeafName,
                    class : "usercssloader-item " + (CSS.SHEET == this.AGENT_SHEET? "AGENT_SHEET" : CSS.SHEET == this.AUTHOR_SHEET? "AUTHOR_SHEET": "USER_SHEET"),
                    type : "checkbox",
                    autocheck : "false",
                    oncommand : "UCL.toggle('"+ aLeafName +"');",
                    onclick : "UCL.itemClick(event);",
                    onmouseup : "if (event.button == 1) event.preventDefault();",
                    tooltiptext : "Linksklick: an/aus, Menü schließt\nMittelklick: an/aus, Menü bleibt offen\nRechtsklick: bearbeiten\nStrg+Linksklick: im Dateimanager anzeigen"
                    });
                document.getElementById("usercssloader-menupopup").appendChild(menuitem);
            }
            menuitem.setAttribute("checked", CSS.enabled);
        },
        toggle: function(aLeafName) {
            var CSS = this.readCSS[aLeafName];
            if (!CSS || event.ctrlKey) return;
            CSS.enabled = !CSS.enabled;
            this.rebuildMenu(aLeafName);
        },
        itemClick: function(event) {
            let label = event.currentTarget.getAttribute("label");
            
            if (event.button == 0) {
                 if (event.ctrlKey) {
                    event.preventDefault();
                    event.stopPropagation();
                    UCL.openFolder (label);
                 } else {return;
                 }
            }
                    event.preventDefault();
                    event.stopPropagation();
            if (event.button == 1) {
                this.toggle(label);
            }
            else if (event.button == 2) {
                // closeMenus(event.target);
                this.edit(this.getFileFromLeafName(label));
            }
        },
        getFileFromLeafName: function(aLeafName) {
            let f = this.FOLDER.clone();
            f.QueryInterface(Ci.nsIFile); // use appendRelativePath
            f.appendRelativePath(aLeafName);
            return f;
        },
        openFolder:function(label){
            if (label) {
            var target= this.FOLDER.path +  "\\" + label
            } else {
                 var target= this.FOLDER.path
            }
            if (this.vFileManager.length != 0) {
                var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
                var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
                var args=[this.vFMParameter,target];
                file.initWithPath(this.vFileManager);
                process.init(file);
                // Verzeichnis mit anderem Dateimanager öffnen
                process.run(false, args, args.length);
            } else {
                // Verzeichnis mit Dateimanager des Systems öffnen
                this.FOLDER.launch();
            }
        },
        openCHRMFolder:function(){
            if (this.vFileManager.length != 0) {
                var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
                var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
                var args=[this.vFMParameter,this.CHRMFOLDER.path];
                file.initWithPath(this.vFileManager);
                process.init(file);
                // Verzeichnis mit anderem Dateimanager öffnen
                process.run(false, args, args.length);
            } else {
                // Verzeichnis mit Dateimanager des Systems öffnen
                this.CHRMFOLDER.launch();
            }
         },
        editUserCSS: function(aLeafName) {
            let file = Services.dirsvc.get("UChrm", Ci.nsIFile);
            file.appendRelativePath(aLeafName);
            this.edit(file);
        },
        edit: function(aFile) {
            var editor = Services.prefs.getCharPref("view_source.editor.path");
            if (!editor) return alert("Unter about:config den vorhandenen Schalter:\n view_source.editor.path mit dem Editorpfad ergänzen");
            try {
                var UI = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
                UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8";
                var path = UI.ConvertFromUnicode(aFile.path);
                var app = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
                app.initWithPath(editor);
                var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
                process.init(app);
                process.run(false, [path], 1);
            } catch (e) {}
        },
        create: function(aLeafName) {
            if (!aLeafName) aLeafName = prompt("Name des Styles", dateFormat(new Date(), "%Y_%m%d_%H%M%S"));
            if (aLeafName) aLeafName = aLeafName.replace(/\s+/g, " ").replace(/[\\/:*?\"<>|]/g, "");
            if (!aLeafName || !/\S/.test(aLeafName)) return;
            if (!/\.css$/.test(aLeafName)) aLeafName += ".css";
            let file = this.getFileFromLeafName(aLeafName);
            this.edit(file);
        },
        UCrebuild: function() {
            let re = /^file:.*\.uc\.css(?:\?\d+)?$/i;
            let query = "?" + new Date().getTime();
            Array.slice(document.styleSheets).forEach(function(css){
                if (!re.test(css.href)) return;
                if (css.ownerNode) {
                    css.ownerNode.parentNode.removeChild(css.ownerNode);
                }
                let pi = document.createProcessingInstruction('xml-stylesheet','type="text/css" href="'+ css.href.replace(/\?.*/, '') + query +'"');
                document.insertBefore(pi, document.documentElement);
            });
            UCL.UCcreateMenuitem();
        },
        UCcreateMenuitem: function() {
            let sep = $("usercssloader-ucseparator");
            let popup = sep.parentNode;
            if (sep.nextSibling) {
                let range = document.createRange();
                range.setStartAfter(sep);
                range.setEndAfter(popup.lastChild);
                range.deleteContents();
                range.detach();
            }
            let re = /^file:.*\.uc\.css(?:\?\d+)?$/i;
            Array.slice(document.styleSheets).forEach(function(css) {
                if (!re.test(css.href)) return;
                let fileURL = decodeURIComponent(css.href).split("?")[0];
                let aLeafName = fileURL.split("/").pop();
                let m = $C("menuitem", {
                    label : aLeafName,
                    tooltiptext : fileURL,
                    id : "usercssloader-" + aLeafName,
                    type : "checkbox",
                    autocheck : "false",
                    checked : "true",
                    oncommand : "if (!event.ctrlKey) {this.setAttribute('checked', !(this.css.disabled = !this.css.disabled));}",
                    onclick : "UCL.UCItemClick(event);"
                });
                m.css = css;
                popup.appendChild(m);
            });
        },
        UCItemClick: function(event) {
            if (event.button == 0) return;
            event.preventDefault();
            event.stopPropagation();
            if (event.button == 1) {
                event.target.doCommand();
            }
            else if (event.button == 2) {
                // closeMenus(event.target);
                let fileURL = event.currentTarget.getAttribute("tooltiptext");
                let file = Services.io.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler).getURLSpecFromActualFile(fileURL);
                this.edit(file);
            }
        },
    };
    function CSSEntry(aFile) {
        this.path = aFile.path;
        this.leafName = aFile.leafName;
        this.lastModifiedTime = 1;
        this.SHEET = /^xul-|\.as\.css$/i.test(this.leafName) ? 
            Ci.nsIStyleSheetService.AGENT_SHEET:
            /\.author\.css$/i.test(this.leafName)?
            Ci.nsIStyleSheetService.AUTHOR_SHEET:
            Ci.nsIStyleSheetService.USER_SHEET;
    }
    CSSEntry.prototype = {
        sss: Components.classes["@mozilla.org/content/style-sheet-service;1"]
                .getService(Components.interfaces.nsIStyleSheetService),
        _enabled: false,
        get enabled() {
            return this._enabled;
        },
        set enabled(isEnable) {
            var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile)
            aFile.initWithPath(this.path);
            var isExists = aFile.exists(); // true, wenn die Datei existiert
            var lastModifiedTime = isExists ? aFile.lastModifiedTime : 0;
            var isForced = this.lastModifiedTime != lastModifiedTime; // true, wenn es eine Änderung in der Datei gibt
            var fileURL = Services.io.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler).getURLSpecFromActualFile(aFile);
            var uri = Services.io.newURI(fileURL, null, null);
            if (this.sss.sheetRegistered(uri, this.SHEET)) {
                // Wenn diese Datei bereits gelesen wurde
                if (!isEnable || !isExists) {
                    this.sss.unregisterSheet(uri, this.SHEET);
                }
                else if (isForced) {
                    // Nach Stornierung erneut einlesen
                    this.sss.unregisterSheet(uri, this.SHEET);
                    this.sss.loadAndRegisterSheet(uri, this.SHEET);
                }
            } else {
                // Datei wurde nicht gelesen
                if (isEnable && isExists) {
                    this.sss.loadAndRegisterSheet(uri, this.SHEET);
                }
            }
            if (this.lastModifiedTime !== 1 && isEnable && isForced) {
                log(this.leafName + " wurde aktualisiert");
            }
            this.lastModifiedTime = lastModifiedTime;
            return this._enabled = isEnable;
        },
    };
    UCL.init();
    function $(id) { return document.getElementById(id); }
    function $A(arr) { return Array.slice(arr); }
    function $C(name, attr) {
        var el = document.createXULElement(name);
        if (attr) Object.keys(attr).forEach(function(n) { el.setAttribute(n, attr[n]) });
        return el;
    }
    function dateFormat(date, format) {
        format = format.replace("%Y", ("000" + date.getFullYear()).substr(-4));
        format = format.replace("%m", ("0" + (date.getMonth()+1)).substr(-2));
        format = format.replace("%d", ("0" + date.getDay()).substr(-2));
        format = format.replace("%H", ("0" + date.getHours()).substr(-2));
        format = format.replace("%M", ("0" + date.getMinutes()).substr(-2));
        format = format.replace("%S", ("0" + date.getSeconds()).substr(-2));
        return format;
    }
    function log() { Application.console.log(Array.slice(arguments)); }
    })();
    Alles anzeigen

    Für die Verknüpfung hab ich mal eine Totalcommander.lnk als Beispiel genommen, die Paramater seht ihr im auskommentierten Teil.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 16. Januar 2025 um 00:29
    Zitat von lenny2

    es gibt noch ein weiteres Problem (es ist in allen Versionen des Skripts vorhanden), wenn die Tabs-List leer ist, bleibt der Tabs-Menüpunkt im Hauptkontextmenü aktiv.

    Das hab ich mir vor gefühlten Ewigkeiten in die userChrome.css eingetragen:

    CSS
    /* Skript "UndoListInTabmenuToo", Tab- und Hauptkontextmenü */
    #historyUndoWindowMenu3[disabled="true"],
    #historyUndoWindowMenuPopup3[disabled="true"],
    #tabContextUndoList[disabled="true"],
    #ContextUndoList[disabled="true"]
    { display: none }

    Statt die Einträge auszublenden, könnten sie natürlich auch mit color:grey oder einem ähnlichen Farbton versehen werden. (Was immer der Standard für das Ausgrauen ist.)

    Ansonsten sollte Alice auf die Probleme im Skript hingewiesen werden.


    Zitat von Mira_Belle

    lenny2 sorry, da weiß ich gerade auch nicht weiter!
    Wenn es Dich stört, "klammere" die Funktion einfach aus.

    JavaScript
       /*     if (undoPopup.childNodes[i + 2]) {
              undoPopup.childNodes[i + 2].setAttribute("tooltiptext", tooltiptext);
          }		*/

    Wenn ich es berichtigt bekomme, poste ich hier.

    Übrigens erzeugt genau dieser Teil bei mir in der Konsole einen Fehler. Die Fehler, die Sören sah, erhalte ich nicht (ich hab das Skript direkt von Alice bezogen und die Texte übersetzt bzw. aus der Vorgängerversion übernommen).

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