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

  • Keine Erweiterunen mehr im Überhangmenü nach Update auf Fx109.0

    • bege
    • 22. Januar 2023 um 19:59
    Zitat von reni

    Sorry, wenn ich mich hier mein "einklinke" - Wer bestimmt eigentlich die Reihenfolge in dem Erweiterungsmenü und die Anzahl der angezeigten Erweiterungen?

    Bei mir stehen oben diejenigen, die ich vorher im Überhangmenü hatte, darunter alle anderen alphabetisch.


    Zitat von 2002Andreas
    Zitat von reni

    Wer bestimmt eigentlich die Reihenfolge

    Mozilla ;)

    In Zukunft werden die aber verschiebbar sein.

    Wenigstens etwas, das zur Übersichtlichkeit beiträgt.

  • Keine Erweiterunen mehr im Überhangmenü nach Update auf Fx109.0

    • bege
    • 22. Januar 2023 um 19:57
    Zitat von 2002Andreas
    Zitat von bege

    Habe ich etwas übersehen oder falsch verstanden

    Die sind jetzt alle in dem neuen Button oben rechts für Erweiterungen.

    Wenn nicht, sieh mal im Anpassenfenster nach.


    Zitat von bege

    das Überhangmenü tatsächlich nicht mehr für Addon-Buttons verwendet werden

    Richtig.

    Siehe bitte auch mal hier:

    Beitrag

    Addons-icon verstecken/entfernen

    kann ich dieses "puzzleteil" icon, das zum anzeigen und verwalten der addons hinzugefügt wurde, irgendwie los werden?

    Es gibt ka schon im Anwendungsmenü den Bereich Addons und themes, über den ich alles machen kann, dieses neue icon finde ich komplett unnötig. Ich kann es über "Symbolleiste anpassen" aber leider nicht verschieben. Gibt es es vielleicht eine Möglichkeit über about:config ?
    Thaliel
    18. Januar 2023 um 03:31

    So sieht das dann für die Zukunft aus:

    Alles anzeigen

    Danke für die prompte Antwort.

    Jetzt habe ich also zwei "Überhangmenüs", eins für Firefox-Funktionen und eines für Addons und kann nicht nur die Addon-Buttons darin anzeigen lassen, die ich ab und zu brauche, sondern muss durch alle nicht angezeigten Addon-Buttons scrollen. Schade, finde ich sehr umständlich.

  • Keine Erweiterunen mehr im Überhangmenü nach Update auf Fx109.0

    • bege
    • 22. Januar 2023 um 19:47

    Hallo,

    nach dem Update auf Fx109.0 sind alle Addon-Button aus dem Erweiterungsmenü verschwunden und auch im Pool von "Symbolleiste anpassen" gibt es keine Addon-Button mehr und es können auch keine mehr dorthin verschoben werden. Das Hinzufügen geht nur über den neuen Addon-Button. Die vorhandenen Buttons können auch nicht mehr ins Überhangmenü verschoben werden, sondern nur noch per Klick auf "an Symbolleiste anheften" entfernt werden.

    Habe ich etwas übersehen oder falsch verstanden, oder kann das Überhangmenü tatsächlich nicht mehr für Addon-Buttons verwendet werden, die man nicht so oft braucht? Das würde bedeuten, dass ich alle Buttons in einer Symbolleiste anzeigen muss, was Platzverschwendung und unübersichtlich wäre.

  • Skript "OpenbookModoki" funktioniert nicht mehr

    • bege
    • 22. Januar 2023 um 19:04

    Ich hatte damit schon länger noch ein anderes Problem. Wenn ich ein Stichwort eingeben wollte, sprang der Cursor nach dem ersten Buchstaben in das Feld für den Namen des Lesezeichens und löschte mit dem zweiten eingegebenen Buchstaben den dortigen Inhalt.

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

    • bege
    • 29. November 2022 um 13:43
    Zitat von Doesbaddel

    Deshalb sage ich erstmal vielen Dank für die Hilfe und überlege weiter.

    Ich nutze die Erweiterung auch und ich weiß keine Lösung für deine Frage. Aber die Erweiterung setzt doch ein Symbol in die Adressleiste, das genau diese Funktion hat: Ein Klick und die Seite ist gespeichert. Hat es einen bestimmten Grund, dass du das über das Kontextmenü und nicht über dieses Symbol machen willst?

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

    • bege
    • 24. September 2022 um 19:23

    Dharkness Wie schon geschrieben passt es für mich besser wie es ist. Vielleicht findet sich noch jemand, der es so sieht wie du und es umschreiben will.

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

    • bege
    • 24. September 2022 um 14:13
    Zitat von Dharkness

    Hallo bege,

    warum im Menupopup noch ein Menupopup Namens Style-Loader-Menü erzeugen und da dann die Menuitems einfügen, kann man die Menuitems nicht direkt im Menupopup des Buttons einfügen?

    Kann man bestimmt, aber das ist wohl vom ursprünglichen Entwickler des Skripts so angelegt. Ich finde das auch übersichtlicher, weil ich eine Menge CSS-Dateien habe und seltener die anderen Menüpunkte nutze. Und für einen schnellen Zugriff auf eine Datei habe ich die Strg+Linksklick-Funktion hinzugefügt.

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

    • bege
    • 24. September 2022 um 02:56

    Wer das Skript in #3092 vor dem Lesen dieses Beitrags kopiert hat, bitte nochmal updaten. Ich habe noch ein paar Korrekturen hinzugefügt.

  • 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

Unterstütze uns!

Jährlich (2025)

104,5 %

104,5% (679,10 von 650 EUR)

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