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

Beiträge von bege

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

    • bege
    • 23. September 2022 um 22:10

    Ich habe das von Speravir überarbeitete Skript UserCSSLoader.uc.js aus dem Github von Endor übernommen. Danke für die Übersichtlichen Konfigurationseinstellungen am Anfang des Skripts und die Rechtschreibkorrekturen!

    Die Mittelklick-Funktion funktioniert bei mir aber nicht. In meiner Version des Skripts funktioniert sie und in Speravirs Version fehlt in Zeile 300 der Eintrag onmouseup : "if (event.button == 1) event.preventDefault();",

    Vielleicht liegt es daran.

    Ich habe das ergänzt und weitere Ergänzungen aus meiner Version eingefügt.

    • die Möglichkeit, dem eigenen Dateimanager einen Parameter mit zu übergeben (vor langer Zeit von aborix hinzugefügt)
    • die Wahl, außer dem verschiebbaren Button auch ein Menü anzuzeigen, habe ich auch noch in die Konfigurationseinstellungen gelegt
    • die Möglichkeit, außer dem CSS-Ordner auch den Chrome-Ordner anzuzeigen
    • mit Strg+Linksklick kann man die CSS-Datei im Dateimanager anzeigen lassen (mein Dateimanager markiert dabei die Datei. Den Windows-Explorer konnte ich nicht dazu "überreden", das wäre wohl ein größerer Umbau. Mit dem Windows-Explorer tut Strg+Linksklick auf eine Datei also nichts anderes als im Untermenü die Option "CSS-Ordner öffnen".
    • dem Untermenü habe ich eine ID zugefügt, damit ich per CSS ein Symbol anzeigen lassen kann
    • ich habe die Funktion getFileFromURLSpec durch die in anderen Skripten geänderte Funktion getURLSpecFromActualFile ersetzt. Ob das nötig ist, weiß ich nicht.
    • der Eintrag closeMenus(event.target); in den Zeilen 370 und 507 ergibt in der Fehlerkonsole einen allgemeinen Fehler, die Editierfunktion funktioniert aber trotzdem. In Thunderbird ergibt es den Fehler "closeMenus is undefined", was auch stimmt, und die Editierfunktion funktioniert nicht. Ich habe die Zeile mal auskommentiert, weil ich nicht weiß, wofür sie ursprünglich mal gedacht war.

    Will/soll Endor diese Version ins Github übernehmen?

    JavaScript: UserCSSLoader0.0.4k+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 4 - 102*
    // @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 = 0;
    // alternativer Dateimanager, Bsp.:
    // let filemanager = "C:\\Programme\\totalcmd\\TOTALCMD.EXE";
    let filemanager = "";
    // eventuelle Parameter für den alternativen Dateimanager, sonst filemanagerParam = "";
    let filemanagerParam = "";
    // Unterordner für die CSS-Dateien:
    let cssFolder = "CSS";
    // zusätzlich Chrome-Ordner im Untermenü anzeigen: 1 = ja, 0 = nein
    let showChrome = 0;
    /* Ende Konfiguration */
    
    let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
    if (!window.Services)
        Cu.import("resource://gre/modules/Services.jsm");
    // 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\');"
            }));
            mp.appendChild($C("menuseparator"));
            mp.appendChild($C("menuitem", {
                label: "Style-Test (Chrome)",
                id: "usercssloader-test-chrome",
                hidden: true,
                accesskey: "C",
                oncommand: "UCL.styleTest(window);"
            }));
            mp.appendChild($C("menuitem", {
                label: "Style-Test (Web)",
                id: "usercssloader-test-content",
                hidden: true,
                accesskey: "W",
                oncommand: "UCL.styleTest();"
            }));
            mp.appendChild($C("menuitem", {
                label: "Styles dieser Seite auf userstyles.org finden",
                      hidden: false,
                accesskey: "S",
                oncommand: "UCL.searchStyle();"
            }));
    
            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(XULNS, '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;
        },
        styleTest: function(aWindow) {
            aWindow || (aWindow = this.getFocusedWindow());
            new CSSTester(aWindow, function(tester){
                if (tester.saved)
                    UCL.rebuild();
            });
        },
        searchStyle: function() {
            let word;
            try {
                word = gBrowser.currentURI.host;
            } catch {
                word = gBrowser.currentURI.spec;
            }
            openWebLinkIn("https://userstyles.org/styles/search/" + word, "tab", {});
        },
        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;
        },
    };
    
    function CSSTester(aWindow, aCallback) {
        this.win = aWindow || window;
        this.doc = this.win.document;
        this.callback = aCallback;
        this.init();
    }
    CSSTester.prototype = {
        sss: Components.classes["@mozilla.org/content/style-sheet-service;1"]
                .getService(Components.interfaces.nsIStyleSheetService),
        preview_code: "",
        saved: false,
        init: function() {
            this.dialog = openDialog(
                "data:text/html;charset=utf8,"+encodeURIComponent('<!DOCTYPE HTML><html lang="de"><head><title>CSSTester</title></head><body></body></html>'),
                "",
                "width=550,height=400,dialog=no");
            this.dialog.addEventListener("load", this, false);
        },
        destroy: function() {
            this.preview_end();
            this.dialog.removeEventListener("unload", this, false);
            this.previewButton.removeEventListener("click", this, false);
            this.saveButton.removeEventListener("click", this, false);
            this.closeButton.removeEventListener("click", this, false);
        },
        handleEvent: function(event) {
            switch(event.type) {
                case "click":
                    if (event.button != 0) return;
                    if (this.previewButton == event.currentTarget) {
                        this.preview();
                    }
                    else if (this.saveButton == event.currentTarget) {
                        this.save();
                    }
                    else if (this.closeButton == event.currentTarget) {
                        this.dialog.close();
                    }
                    break;
                case "load":
                    var doc = this.dialog.document;
                    doc.body.innerHTML = '\
                        <style type="text/css">\
                            :not(input):not(select) { padding: 0px; margin: 0px; }\
                            table { border-spacing: 0px; }\
                            body, html, #main, #textarea { width: 100%; height: 100%; }\
                            #textarea { font-family: monospace; }\
                        </style>\
                        <table id="main">\
                            <tr height="100%">\
                                <td colspan="4"><textarea id="textarea"></textarea></td>\
                            </tr>\
                            <tr height="40">\
                                <td><input type="button" value="Vorschau" id="Vorschau"/></td>\
                                <td><input type="button" value="Speichern" id="Speichern"/></td>\
                                <td width="80%"><span class="log"></span></td>\
                                <td><input type="button" value="Schließen" id="Schliessen"/></td>\
                            </tr>\
                        </table>\
                    ';
                    this.textbox = doc.querySelector("textarea");
                    this.previewButton = doc.querySelector('input[value="Vorschau"]');
                    this.saveButton = doc.querySelector('input[value="Speichern"]');
                    this.closeButton = doc.querySelector('input[value="Schließen"]');
                    this.logField = doc.querySelector('.log');
                    var code = "@namespace url(" + this.doc.documentElement.namespaceURI + ");\n";
                    code += this.win.location.protocol.indexOf("http"||"https") === 0 ?
                        "@-moz-document domain(" + this.win.location.host + ") {\n\n\n\n}":
                        "@-moz-document url(" + this.win.location.href + ") {\n\n\n\n}";
                    this.textbox.value = code;
                    this.dialog.addEventListener("unload", this, false);
                    this.previewButton.addEventListener("click", this, false);
                    this.saveButton.addEventListener("click", this, false);
                    this.closeButton.addEventListener("click", this, false);
                    this.textbox.focus();
                    let p = this.textbox.value.length - 3;
                    this.textbox.setSelectionRange(p, p);
                    break;
                case "unload":
                    this.destroy();
                    this.callback(this);
                    break;
            }
        },
        preview: function() {
            var code = this.textbox.value;
            if (!code || !/\:/.test(code))
                return;
            code = "data:text/css;charset=utf-8," + encodeURIComponent(this.textbox.value);
            if (code == this.preview_code)
                return;
            this.preview_end();
            var uri = Services.io.newURI(code, null, null);
            this.sss.loadAndRegisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET);
            this.preview_code = code;
            this.log("Preview");
        },
        preview_end: function() {
            if (this.preview_code) {
                let uri = Services.io.newURI(this.preview_code, null, null);
                this.sss.unregisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET);
                this.preview_code = "";
            }
        },
        save: function() {
            var data = this.textbox.value;
            if (!data) return;
            var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
            fp.init(window, "", Ci.nsIFilePicker.modeSave);
            fp.appendFilter("CSS Files","*.css");
            fp.defaultExtension = "css";
            if (window.UCL)
                fp.displayDirectory = UCL.FOLDER;
            var res = fp.show();
            if (res != fp.returnOK && res != fp.returnReplace) return;
            var suConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
            suConverter.charset = "UTF-8";
            data = suConverter.ConvertFromUnicode(data);
            var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
            foStream.init(fp.file, 0x02 | 0x08 | 0x20, 0664, 0);
            foStream.write(data, data.length);
            foStream.close();
            this.saved = true;
        },
        log: function() {
            this.logField.textContent = dateFormat(new Date(), "%H:%M:%S") + ": " + $A(arguments);
        }
    };
    
    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
  • Wie erstellt man keyboard shortcuts ?

    • bege
    • 7. Juli 2022 um 22:34

    Hier ein Beispiel, das aborix mal erstellt hat. Es schließt alle Tabs.

    JavaScript
    // ==UserScript==
    // key.CloseAllTabs_aborix.uc.js
    // https://www.camp-firefox.de/forum/viewtopic.php?p=1099118#p1099118
    // ==/UserScript== 
    
    (function() {
       setTimeout(function() {
      var browser_chrome = 'chrome://browser/content/browser.xhtml';
    
      if (location != browser_chrome)
        return;
     
      let key = document.createXULElement('key');
      key.id = 'key_closeAllTabs';
      key.setAttribute('key', 'W');
      // key.setAttribute('keycode', 'VK_F1')
      key.setAttribute('modifiers', 'alt');
      key.setAttribute('oncommand',
        'gBrowser.removeAllTabsBut(gBrowser.selectedTab); gBrowser.removeTab(gBrowser.selectedTab);');
      document.getElementById('mainKeyset').appendChild(key);
       }, 6000);
    })();
    Alles anzeigen

    Der timout-Wert am Ende muss angepasst werden.

  • Kann man mit CSS ein Element "rückwirkend" ansprechen?

    • bege
    • 31. Januar 2022 um 18:38

    .DeJaVu upward(1) funktioniert nicht, weil, wie schon geschrieben, die URL weiter als ein Element weit verschachtelt ist. :upward() mit einer Zahl muss immer genau die Verschachtelungstiefe bezeichnen, daher anfällig für jede Veränderung des Layout.

    Nachdem ich aber auf deinen Hinweis hin bei der Suche nach :has und :upward das gefunden habe https://www.reddit.com/r/uBlockOrigin…asx_or_xupward/

    habe ich jetzt diese Variante:

    Code
    startpage.com##a[href*="exefiles.com"]:upward(.w-gl__result__main)

    Die funktioniert erst dann nicht mehr, wenn die CLASS des obersten Elements geändert wird.

  • Kann man mit CSS ein Element "rückwirkend" ansprechen?

    • bege
    • 31. Januar 2022 um 17:58
    Zitat von .DeJaVu

    Geht einfacher:

    startpage.com##a[href^="https://www.exefiles.com"]:upward(1)

    upward ist das Stichwort.

    Info für alle:

    Zitat

    subject:nth-ancestor(n)

    Do not use.

    Deprecated in favor of

    upward

    Alles anzeigen

    Die URL kommt in dem zu versteckenden Block zwei mal vor und ist mehrere Ebenen tief verschachtelt. Daher scheint mir im konkreten Fall meine Lösung einfacher und weniger anfällig bei Änderungen zu sein.

    Die Tipps von dir zeigen mir, dass in uBlock Origin viel mehr steckt, als ich wusste. :thumbup:

    Edit: Die Vereinfachung des Hostnamens ist hilfreich!

  • Kann man mit CSS ein Element "rückwirkend" ansprechen?

    • bege
    • 31. Januar 2022 um 15:14

    Sören Hentzschel Dankeschön für die Erklärung. Wär auch zu schön gewesen. ^^ Nein, bisher nutze ich Skripte nur für Firefox-Funktionen.

    Durch den Hinweis von .DeJaVu (Dankeschön auch dafür) bin ich auf diese Beschreibung gestoßen https://github.com/gorhill/uBlock…osmetic-filters und damit funktioniert es tatsächlich. So lange bis es mit CSS geht also eine Möglichkeit ohne Skript.

    Beispiel:

    Code: uBlock-Origin-Eintrag in "Meine Filter"
    eu.startpage.com##div.w-gl__result__main:has(a[href^="https://www.exefiles.com"])
  • Kann man mit CSS ein Element "rückwirkend" ansprechen?

    • bege
    • 30. Januar 2022 um 21:15

    Hallo,

    ich blende in den Duckduckgo-Suchergebnissen Ergebnisse von für mich uninteressanten Seiten aus. Das geht, weil im ersten div-Element gleich die Domain enthalten ist.

    Bei Startpage kommt die Domain aber erst in einem verschachtelten Element.

    Also div.class div a[href^="domain"]

    So wird zwar dieses Element ausgeblendet, aber nicht der ganzen Kasten des Suchergebnisses. CSS müsste also ausgehend von dem Element mit der URL rückwirkend auf ein übergeordnetes Element wirken. Geht sowas? Ich befürchte nicht.

    Falls nicht, wie müsste ein Skript dafür aussehen?

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

    • bege
    • 21. Januar 2022 um 00:56
    Zitat von Speravir

    Nun aber ist diese Änderung seit Version 96 aktiv!

    Danke für den Hinweis!

  • Script Speichern in für Fx 78 wieder anpassen

    • bege
    • 24. Dezember 2021 um 17:27
    Zitat von .DeJaVu

    Nur überflogen, #113 und andere. Es geht um den zusätzlichen Button, der als Trigger was in Firefox auslöst, was derzeit nicht bekannt ist, so ähnlich hatte Sören das auch geschrieben. Und das schon seit einem Jahr, mit entsprechenden Folgen. Die Frage, die sich mir stellt: ob ihr weiterhin mit einem fehlerhaften Script arbeiten wollt, falls der Schalter aus #113 nicht helfen sollte, ob eure Daten so unwichtig sind. Oder sich einer eine Testkonfiguration zurechtlegt und tüftelt und alle anderen so lange warten. Es geht doch nur um zwei lausige Klicks, oder? Rein pragmatisch gedacht.

    ? Deine letzten Antworten bringen keine Hilfe zur gestellten Frage und entspechen auch nicht den Tatsachen.

    Wie aus meiner Antwort (hoffentlich) hervorgeht, funktioniert das Skript mit dem entsprechenden Schalter. Das von FuchsFan beschriebene Verhalten liegt bei mir daran, was ich vorher beim Speichern ohne das Skript gemacht habe und ist in meinen Augen kein Fehler..

  • Script Speichern in für Fx 78 wieder anpassen

    • bege
    • 23. Dezember 2021 um 19:46
    Zitat von FuchsFan
    Zitat von FuchsFan

    Erst nachdem ich in der handlers.json den Wert {"defaultHandlersVersion":{"de":4},"mimeTypes":{"application/pdf":{"action":0,"extensions":["pdf"],"ask":true}, von 4 auf 0 geändert habe, ist es wieder vorbei.

    Neuerdings sind nach den vielen Updates die Werte in der handlers.json wieder automatisch umgestellt worden. Hatte das schon vor einiger Zeit bemerkt, aber es als einmalige Sache abgehakt.

    Nun habe ich mal rein geschaut, durchweg die werte auf 1 gestellt, somit öffnen sich die Dateien automatisch nach dem Download mit dem verknüpften Programm. Ärgerlich!

    Alles wieder auf Null eingerichtet, nun ist wieder Ruhe.

    Wurde das bei euch auch schon bemerkt?

    Ich war verreist, deshalb erst jetzt eine Reaktion.

    Hängt es vielleicht damit zusammen?:

    Zitat von bege

    Bei mir macht das Skript mit einem Dateityp das, was ich vorher mit dem normalen Fx-Download-Dialog mit dem Dateityp gemacht habe.

    Speichere ich eine Datei, tut das auch das Skript, ohne sie anzuzeigen und sie wird nicht gelöscht nach einem Neustart.
    Lasse ich die Datei mit Firefox oder einem anderen Programm anzeigen, zeigt auch das Skript die Datei nach dem Download an und sie wird nach einem Neustart gelöscht.

    (aus #111)

    Das Löschen wurde ja mit user_pref("browser.helperApps.deleteTempFileOnExit", false); gelöst.

  • Script-Button verschiebbar machen

    • bege
    • 23. Dezember 2021 um 19:36
    Zitat von milupo
    Zitat von bananovic

    Aber die Scripts in Thunderbird lassen sich nicht verschieben.

    Die sollten sich auch verschieben lassen. Bei mir tun die beiden Skripte das, vorausgesetzt, du hast das Anpassen-Fenster geöffnet.

    Liste der Userscripts - ab Version 91+

    Wie sehen die bei dir aus? Ich habe das in TB nie hingekriegt und irgendwann den Hinweis bekommen, dass CustomizableUI.createWidget in TB nicht verfügbar sei. Vielleicht können wir das im TB-Forum weiterführen.

  • Elemente in der Seitenleiste untersuchen?

    • bege
    • 28. Oktober 2021 um 19:03
    Zitat von milupo

    Und ich weiß auch nicht, warum du ignorierst, dass die anderen, die sich hier zu Wort gemeldet haben, das ebenfalls für unmöglich halten.

    Lies meinen Beitrag noch mal. Das Gegenteil ist der Fall.

  • Elemente in der Seitenleiste untersuchen?

    • bege
    • 28. Oktober 2021 um 18:24
    Zitat von milupo

    ... Es gibt nichts außer treechildren. Die einzelnen Selektoren müssten darunter sein. Da gibt es aber nichts...

    Danke, milupo und alle anderen, die genauso hartnäckig dran bleiben wie ich.

    Ich bleibe deswegen so hartnäckig, weil, was du schreibst, nicht ganz stimmt. Das hier ist ein Auszug aus der folderpane.css aus der omni.ja von Thunderbird.

    Zitat

    /* ..... Local folders ..... */

    .tabmail-tab[type="folder"][IsServer="true"][ServerType="none"],

    treechildren::-moz-tree-image(folderNameCol, isServer-true, serverType-none) {

    list-style-image: url("chrome://messenger/skin/icons/folder-local.svg");

    fill: var(--primary);

    }

    /* ..... Secure mail server ..... */

    .tabmail-tab[type="folder"][IsServer="true"][ServerType="imap"][IsSecure="true"],

    .tabmail-tab[type="folder"][IsServer="true"][ServerType="pop3"][IsSecure="true"],

    treechildren::-moz-tree-image(folderNameCol, isServer-true, serverType-pop3, isSecure-true),

    treechildren::-moz-tree-image(folderNameCol, isServer-true, serverType-imap, isSecure-true) {

    list-style-image: url("chrome://messenger/skin/icons/message-secure.svg");

    fill: var(--primary);

    }

    Alles anzeigen

    Die treechildren haben also eine ganze Menge Eigenschaften, die sich alle per CSS ansprechen lassen. Sowohl die Erweiterung "Phoenity Icons" als auch edvoldi und ich nutzen eine geänderte folderpane.css um die Ordnersymbole zu ändern:

    Thunderbird 78 - Hässliche Icons - Thunderbird Mail DE
    Um Rückfragen vorzubeugen, bitten wir um folgende Angaben:Thunderbird-Version (konkrete Versionsnummer 78.0 Betriebssystem + Version: Windows 7 Pro - 64bit…
    www.thunderbird-mail.de

    Die Eigenschaften IsServer und ServerType finden sich auch in der folderpane.js.

    Mir fehlt noch eine einzige Eigenschaft, nämlich der Kontoname. Der wird natürlich auch in der folderpane.js verarbeitet, aber ich kann keine passende CSS-Eigenschaft erkennen.

    Und an dem Punkt magst du recht haben, dass die tatsächlich nicht existiert, obwohl Thunderbird es schafft, den richtigen Kontonamen dem jeweiligen Konto zuzuordnen, auch wenn die Kontenreihenfolge verändert wird.

    Um das herauszufinden und eine generelle Antwort zum Untersuchen der Seitenleiste zu bekommen, habe ich nachgefragt und wie es aussieht, lautet die Antwort auf beides: Geht nicht.

    Deshalb bleibt wohl nur, wie .DeJaVu  2002Andreas zitiert, im Einzelfall die omni.ja zu durchforsten und zu hoffen, dass diese Konstruktion wieder geändert wird, wie Sören Hentzschel schreibt.

    Also nochmal danke an alle, die sich hier beteiligt haben. <3

  • Elemente in der Seitenleiste untersuchen?

    • bege
    • 27. Oktober 2021 um 19:32

    Sören Hentzschel  2002Andreas

    Ich bin dankbar für die Tipps, wie ich mit meiner Fragestellung in Thunderbird weiterkomme, aber da das hier das Firefox-Forum ist, möchte ich nochmal meine Ausgangsfrage stellen, die auch den Firefox betrifft:

    Wie kann man die Selektoren und Eigenschaften der Elemente in der Seitenleiste, also der treechildren, herausfinden?

  • Elemente in der Seitenleiste untersuchen?

    • bege
    • 27. Oktober 2021 um 17:42
    Zitat von milupo
    Zitat von bege

    Ich habe auch schon diverse js-Dateien im TB-Code durchforstet, dort werden natürlich auch Konto- und Servernamen angesprochen, aber wie die CSS-Eigenschaft heißt, war für mich nicht ersichtlich.

    Nochmal: Es ist nicht möglich die Konten per CSS einzeln anzusprechen. Es gibt keine spezifischen Selektoren, sondern eben nur treechildren und dafür nur eine Klasse, die für alle Konten gilt. Die Konten einzeln anzusprechen ist offensichtlich nur per Skript möglich. Ein solches Skript muss sozusagen eigene Selektoren mitbringen. Warte mal, bis sich aborix meldet.

    Aber die Kontonamen stehen doch im Ordnerbaum. Dann muss es doch mindestens eine Eigenschaft wie label oder ähnlich geben.

  • Elemente in der Seitenleiste untersuchen?

    • bege
    • 27. Oktober 2021 um 17:29
    Zitat von 2002Andreas
    Zitat von bege

    die einzelnen Elemente in der Seitenleiste

    Die Browser-Werkzeuge öffnen.

    Dann darin die Sidebar erst aktivieren

    Dankeschön! Das ist tatsächlich ein Schritt weiter, aber weiter als bis treechildren komme ich damit noch nicht. Irgendwie muss Firefox die Elemente doch auch ansprechen. Ich finde HTML und besonders Javascript zwar schwierig, wenn's ans Eingemachte geht, aber Zauberei ist es dann doch nicht. :S

    In der Thunderbird-Erweiterung "Phoenity Icons" gibt es CSS-Dateien, die die Symbole ansprechen, aber nicht per Konto, sondern nur per Ordner-Typ. Es gibt also die Selektoren, aber wie findet man die heraus? Warum ist die Seitenleiste auch beim Firefox nicht per Inspektor untersuchbar? Gibt es dafür einen anderen Weg?

    Zitat von Sören Hentzschel
    Zitat von milupo

    Er möchte in TB jedem Konto eine eigene Farbe zuweisen. Das hat er früher mit der Erweiterung Account Colors gemacht, die es aber nicht als Webextension gibt.

    bege: Muss denn der ganze Bereich eingefärbt sein, so wie im Screenshot der Erweiterung auf der Erweiterungs-Seite von Thunderbird zu sehen? Denn wenn es reicht, die Icons einzufärben: Das ist ein Standard-Feature von Thunderbird seit Version 78. Nur als Alternative, falls es auch ein bisschen weniger sein darf, weil das auch ohne Anpassung funktioniert.

    Danke euch beiden. Ideal wäre tatsächlich, den ganzen Hintergrund je Konto einzufärben, weil ich per CSS die klassischen Ordnersymbole nutze, die sind für mich immer noch am übersichtlichsten. Es würde auch reichen, die Hintergründe der Kontobezeichnungen einzufärben, dafür gibt es sogar den Code im TB-Forum, aber wie bei den Ordnern nur für alle Konten, nicht per Konto. Dafür brauche ich eine Eigenschaft, die das Konto bezeichnet. Mit dem Inspektor ist das bei allen anderen Elementen ja kein Problem, nur eben in der Seitenleiste.

    Ich habe auch schon diverse js-Dateien im TB-Code durchforstet, dort werden natürlich auch Konto- und Servernamen angesprochen, aber wie die CSS-Eigenschaft heißt, war für mich nicht ersichtlich.

  • Elemente in der Seitenleiste untersuchen?

    • bege
    • 27. Oktober 2021 um 01:06

    Hallo,

    mit dem Inspektor kann ich die einzelnen Elemente in der Seitenleiste z.B. Lesezeichen nicht untersuchen. Das gilt genauso für Thunderbird 91. Ich brauche das gerade für Thunderbird, komme damit aber nicht weiter. Da es das gleiche Problem im Firefox gibt, hoffe ich hier auf Hilfe.

    Gibt es eine Möglichkeit, die Selektoren und Eigenschaften der Elemente herauszufinden?

  • RestartFirefox_plus.uc.js keine Funktion

    • bege
    • 8. Oktober 2021 um 22:51
    Zitat von milupo

    Es ist auch immer furchtbar mit Kommas, Semikola und Klammern. Wenn man da nicht aufpasst, hat man einen Syntaxfehler.

    Das kann ich aus eigener stundenlanger Erfahrung nur bestätigen. ;)

  • RestartFirefox_plus.uc.js keine Funktion

    • bege
    • 8. Oktober 2021 um 22:10
    Zitat von oldman53

    Hallo,

    mit dem Originalen Script gibt es die Auswahl:

    Linksklick = Neustart

    Rechtsklick = Neustart + Cache löschen.

    Wird bei Hover angezeigt.

    Und diese Doppelauswahl nur mit dem Button im Hamburger, wäre der Hit.

    Alles anzeigen

    Der Teil dieses Skripts fürs Hamburger-Menü mit dieser Funktion sieht bei mir so aus:

    JavaScript
    (function() {
    if (location != 'chrome://browser/content/browser.xhtml') return;
    
    /* App (Hamburger) Menu */
    var menuitem = document.createXULElement('toolbarbutton');
    menuitem.id = 'restartfirefox-appMenu';
    menuitem.classList.add('subviewbutton', 'subviewbutton-iconic');
    menuitem.setAttribute('label' , 'Neustart');
    menuitem.setAttribute('tooltiptext' , 'Neustart (mit Rechts- und Mittelklick wird userChrome.js-Cache geleert)');
    menuitem.style.listStyleImage= 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAEZ0FNQQAAsY58%2B1GTAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAN8SURBVHjaVJFNTBxlAIafb2Z29gd2l4VdYCkokAUt1AJplQRTrVqjUWMPPWHSCzb21IOn9qIHY2xMahoTTb00NmkUm5qAjdpUI61VaCxCpCVYixt%2ByvKzCwu7LDs7zMw3HmhM%2Bt6fJ0%2FyCp69wiOzZBCPcqSmIXg0HPHuC4R8nkLWyOXyYiIzfuVHzMIA%2BZsLtH18EApntUdhpzUSD5577nDLi%2FGWKjx%2BHVfR8HpFwNwsxTMzza%2BOXJ1%2B58Ev2sVEV%2ByEawXqxf8FllNWEQ9ePXzsqQOecIDU8jampSAVD76Al2BIIx4Dv2Nz7%2FYq%2B5%2BP8sNXE6WdAhdQlOM9rzUdaGiN8M9UjnKvQjzuA0UjV3AxDIcHywqRoEbXoVrKgyBtKXYEUvprmiN9oaoyvr9wl62NHJbtJeDzOo17YmprVzWOppLO2RRNwf1FSOzSUAXsCIR4QdP13UPfjhUde2mjuBXUjcXNEabOnJmq7Y4Nd7z1fu%2BJ%2FR2Jpgrm0jauAI8GlnSlBi4I0bO6sLBWHc9esxRdmjOZf5n%2B5CLWzCzOvsbKupBZ1xgmElUoC%2BgoKtRGQfNomoaND8P8XS%2Bby1olO7O6GHTl1DejGDOrNB%2BvpO7I%2Ba31%2FDP9Z28YUmqoqhCKcG2EYD6ZMUTojZ8WHmsqD%2BI6wnWFajugCkuuZaV%2FZS47wp99R7E3LbxPV6rtr7dV1pmyuBWs3hr7dZ380LC2tzseffvUHm86C1JC2A%2FrGcn509cn%2BPvTk9ibc1R06qL91Ms1CadF000ll9rVS2VykLzVr0lHOgtpuJ9yUFyXxqhKZjbH2nJRI9IZwyw2kXjvXV%2FIOWgaBcc2a%2BtjdVXR1J3iBDx8QUpQUJAuJJclseogxz441H5vrPO72cm0VSyVPJq27ZaHm8ST3Y0M9d9Kkr19A1A1x4VIObTGBfNrsJ5XmE9b6KqgvrOGhr1Vns2sgeNIkXiigvHf1liZuHWZYjINSEXRVLewZjN6bYmYbvN4rcDvVzFKLnOpErMLBpvbklClznyyyPDA6DjTX3wJWICr%2Bnb3ffjXSGpl5Nxnn88uh2ORUCBaHfVQU%2BsjVuGhKqJT5lFYShr8fGH4j42bH53EnJ4EtgEEPQOTzHx9mqXLl9AT9TS82RvreOmVcMTXVh4JhIr5kp3LFu6u3Lk%2ByMylQazU3ENYAvw3AFUTimFqj5i7AAAAAElFTkSuQmCC)',
    menuitem.setAttribute('onclick', 'if (event.button == 0) { \
                                      Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit); \
                                  }; \
                                  if (event.button == 1 || event.button == 2) { \
                                      Services.appinfo.invalidateCachesOnRestart(); \
                                      Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit); \
                                  };');
    var refItem = document.getElementById('appMenu-viewCache').content.getElementById('appMenu-quit-button2');
    refItem.parentNode.insertBefore(menuitem, refItem);
    })();
    Alles anzeigen

    Falls es bei dir wie gewünscht funktioniert, gebührt der Dank diesem Forum. <3 Ich weiß nicht mehr, woher ich diesen Code habe, wahrscheinlich aus all den Tipps hier zusammengebastelt. :)

  • Toggle Findbar

    • bege
    • 6. Oktober 2021 um 21:24
    Zitat von Speravir
    Zitat von bege

    Gerade probiert, da fehlt immer noch }; vor der letzten Zeile.

    Auweia. Und ich dachte, es wäre davor schon peinlich genug. Jetzt auch bei mir nochmals korrigiert, Harff182 hatte es aber gleich korrekt gepostet.

    Es ist ja eher beruhigend zu sehen, dass auch andere über solche Sachen stolpern. :S

  • Toggle Findbar

    • bege
    • 4. Oktober 2021 um 20:31
    Zitat von Speravir

    Auf Wunsch hier eine aktualisierte Version von oben:

    JavaScript
    /*
    * ToggleFindbar - aborix in
    * https://www.camp-firefox.de/forum/thema/123414/?postID=1091349#post1091349
    * kleines Update: Speravir
    */
    (function() {
        if (window.gBrowser) {
            document.getElementById('cmd_find').setAttribute('oncommand',
                'if (!gFindBar || gFindBar.hidden) { gLazyFindCommand("onFindCommand") } else { gFindBar.close() }'
            );
    })();
    Alles anzeigen

    (Nur in Zeile 2 geändert, wegen des vorangestellten Kommentars bei mir Zeile 6.)

    Edit: Korrigiert, siehe direkt folgende Antwort von Harff182.

    Danke für den Code. Gerade probiert, da fehlt immer noch }; vor der letzten Zeile.

Unterstütze uns!

Jährlich (2025)

82,4 %

82,4% (535,86 von 650 EUR)

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