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
    • 22. Juni 2025 um 15:09
    Zitat von bege
    Zitat von Endor

    Habe da in der Beschreibung aber nichts zum Ausrufezeichen-Badges finden können.
    Wird hier auch mal angezeigt, dann wieder nicht usw.

    Ich habe mal nachgefragt, bisher noch keine endgültige Antwort.

    https://github.com/garywill/aboutconfig-menu/issues/3

    Die übersetzte Antwort des Entwicklers:

    Zitat

    Derzeit wird update_badge() nur dann aufgerufen, wenn wir auf das Symbol klicken oder die Voreinstellung über unser Menü ändern. Der Status des Badges entspricht also nicht immer dem tatsächlichen Wert der prefs.

    Das muss verbessert werden (in Zukunft, nicht sicher, wann ... 🤦‍♂️).

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

    • bege
    • 21. Juni 2025 um 19:26
    Zitat von Endor

    Habe da in der Beschreibung aber nichts zum Ausrufezeichen-Badges finden können.
    Wird hier auch mal angezeigt, dann wieder nicht usw.

    Ich habe mal nachgefragt, bisher noch keine endgültige Antwort.

    [Question] What does the exclamation mark badge indicate? · Issue #3 · garywill/aboutconfig-menu
    Hello, thanks for this great script. Sometimes the button has an exclamation mark badge, sometimes it hasn't. I don't understand what it indicates and how it…
    github.com
  • userChrome.js Scripte für den Fuchs (Diskussion)

    • bege
    • 19. Juni 2025 um 18:10
    Zitat von 2002Andreas
    Zitat von bege

    die Bedeutung des Ausrufezeichen-Badges

    Reine optische Sache als Warnung bei Änderungen.

    Kannst du so deaktivieren:

    Was meinst du mit "als Warnung bei Änderungen"? Wenn ich alles auf Standard setze, bleibt das Ausrufezeichen.

    Manchmal aber verschwindet es, ohne dass ich den Zusammenhang erkennen kann. Im obigen Beitrag dachte ich, es liege an dem eingefügten Code, das scheint aber nicht der Fall zu sein.

    Dass ich das auskommentieren kann, ist mir schon klar. Es gibt im Skript aber die Funktionen add_warnbadge und rm_warnbadge, die steuern, ob der rote Hintergrund angezeigt wird. Ich vermute, dass das Ausrufezeichen im Symbol versteckt ist und dadurch sichtbar wird oder nicht. Das kann ich gerade nicht weiter testen. Ich verstehe aber nicht, wann diese Funktionen angesteuert werden.

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

    • bege
    • 19. Juni 2025 um 15:14
    Zitat von Endor

    Hallo zusammen.
    Hallo bege
    Danke für Deine Änderung.
    Habe ich alles so übernommen und hoch geladen.

    https://github.com/Endor8/userChr…nfig_menu.uc.js

    Hier die Übersicht der Änderungen:

    https://github.com/Endor8/userChr…b6d7c9f0ec05640

    Mfg.
    Endor

    Danke!

    Wäre schön, wenn noch jemand die Bedeutung des Ausrufezeichen-Badges auf dem Button herausfindet.

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

    • bege
    • 19. Juni 2025 um 14:03
    Zitat von Endor

    Hallo zusammen.
    Es gibt mal wieder ein neues Script.

    aboutconfig_menu.uc.js

    ...

    Das Script ist wie immer auf Github bei mir zu finden:

    https://github.com/Endor8/userChr…nfig_menu.uc.js

    Mfg.
    Endor

    Genial, Dankeschön! Funktioniert, ich bekomme aber diese Fehlermeldung in der Konsole

    Zitat

    13:58:45.307 Uncaught ReferenceError: CustomizableUI is not defined
    <anonymous> file:///C:/Users/bege/AppData/Roaming/Mozilla/Firefox/Profiles/487kit50.Quantum/chrome/JS/aboutconfig_menu_orig.uc.js:250
    <anonymous> file:///C:/Users/bege/AppData/Roaming/Mozilla/Firefox/Profiles/487kit50.Quantum/chrome/JS/aboutconfig_menu_orig.uc.js:537
    loadScript file:///C:/Program Files/Mozilla Firefox/userChromeJS/utilities.js:114
    aboutconfig_menu_orig.uc.js:250:5

    Edit: damit (wurde schon an anderer Stelle diskutiert) vor CustomizableUI.createWidget erscheint der Fehler nicht mehr. Dann verschwindet aber auch das rote Ausrufezeichen auf dem Button. Das ist nicht Teil des Symbols list-style-image. Die Bedeutung konnte ich bisher nicht herausfinden.

    JSON
    if (!window.gBrowser){
        return;
    }

    Ich habe unter CSP noch das hinzugefügt

    JavaScript
    {
                name: "🔏 eval erlauben - verbieten",
                type: prefs.PREF_BOOL,
                pref: "security.allow_unsafe_dangerous_privileged_evil_eval",
                possibleVals: [
                    {  val: false  },
                    {  name: "true ⚠️",  val: true , sign: '‼️' },
                ]
        },

    und die Einrückungen bei den prefs vereinheitlicht. Sieht dann so aus:

    JavaScript: aboutconfig_menu.uc.js
    /* Firefox userChrome script
     * Shortcut menu to modify about:config entries
     * Tested on Firefox 139+
     * Author: garywill (https://garywill.github.io)
     * 
     */
    
    // ==UserScript==
    // @include         main
    // @onlyonce
    // ==/UserScript==
    
    console.log("aboutconfig_menu.uc.js");
    
    (() => {
      
    
        const prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
        ChromeUtils.importESModule("resource:///modules/CustomizableUI.sys.mjs")
        const sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
        // ---------------------------------------------------------------------------------------
        
        const button_label = "about:config shortcut menu";
        const cssuri_icon = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
                toolbarbutton#aboutconfig-button .toolbarbutton-icon {
                    list-style-image: url("data:image/svg+xml;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAgIC0gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogICAtIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiB2aWV3Qm94PSIwIDAgMTYgMTYiPjxwYXRoIGZpbGw9ImNvbnRleHQtZmlsbCIgZD0iTTEzLjkgOS44MWExLjIzIDEuMjMgMCAwIDAgMC0uMTd2LS4wOGE1LjY3IDUuNjcgMCAwIDAtMi40LTMuMzYgMS4xNyAxLjE3IDAgMCAxLS41Ni0uOTVWM2ExIDEgMCAwIDAtMS0xSDYuMDZhMSAxIDAgMCAwLTEgMXYyLjI1YTEuMTcgMS4xNyAwIDAgMS0uNTYgMSA1LjY2IDUuNjYgMCAwIDAtMi4zNSAzLjMzdi4xMmEuNTMuNTMgMCAwIDAgMCAuMTEgNS4zNSA1LjM1IDAgMCAwLS4xMSAxIDUuNjUgNS42NSAwIDAgMCAzLjI0IDUuMDkgMSAxIDAgMCAwIC40NC4xaDQuNTdhMSAxIDAgMCAwIC40NC0uMUE1LjY1IDUuNjUgMCAwIDAgMTQgMTAuODNhNS4zIDUuMyAwIDAgMC0uMS0xLjAyem0tOC4yNy0yYTMuMTggMy4xOCAwIDAgMCAxLjQzLTIuNlY0aDEuODh2MS4yNWEzLjE4IDMuMTggMCAwIDAgMS40MyAyLjYgMy42OCAzLjY4IDAgMCAxIDEuNTQgMi4yNHYuMjJhMi44MiAyLjgyIDAgMCAxLTMuNjgtLjU5QTMuNDggMy40OCAwIDAgMCA0LjU2IDlhMy43NiAzLjc2IDAgMCAxIDEuMDctMS4xNXoiPjwvcGF0aD48L3N2Zz4=");
                }
                toolbarbutton#aboutconfig-button .toolbarbutton-badge {
                    background-color: #009f00;
                    visibility: hidden; 
                }           
                `), null, null);
        const cssuri_warnbadge = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
                toolbarbutton#aboutconfig-button .toolbarbutton-badge {
                    background-color: red ;
                    visibility: unset;
                } 
                `), null, null);
       
        sss.loadAndRegisterSheet(cssuri_icon, sss.USER_SHEET);
      
        
        var prefItems = [ 
        {
                name: "📼 Kein automatisches Popup beim Download",
                type: prefs.PREF_BOOL,
                pref: "browser.download.alwaysOpenPanel",
                possibleVals: [
                    {  val: false },
                    {  val: true },
                ]
            },
        {
                name: "🎞️ Beim Schließen vom letzten Tab den Browser nicht schließen",
                type: prefs.PREF_BOOL,
                pref: "browser.tabs.closeWindowWithLastTab",
                possibleVals: [
                    {  val: false },
                    {  val: true },
                ]
            },
            "seperator",
        {
                name: "🔎 Suche aus Suchleiste im neuen Tab öffnen",
                type: prefs.PREF_BOOL,
                pref: "browser.search.openintab",
                possibleVals: [
                    {  val: false },
                    {  val: true },
                ]
            },
        {
                name: "📖 Lesezeichen im neuen Tab öffnen",
                type: prefs.PREF_BOOL,
                pref: "browser.tabs.loadBookmarksInTabs",
                possibleVals: [
                    {  val: false },
                    {  val: true },
                ]
            },
        {
                name: "📖 Link aus Adressleiste im neuen Tab öffnen",
                type: prefs.PREF_BOOL,
                pref: "browser.urlbar.openintab",
                possibleVals: [
                    {  val: false },
                    {  val: true },
                ]
            },
            "seperator",
        {
                name: "🎊 Animations Modus",
                type: prefs.PREF_STRING,
                pref: "image.animation_mode",
                possibleVals: [
                    { name: "Einmal", val: "once" },
                    { name: "Keine", val: "none" },
                    { name: "Dauerhaft", val: "normal" },
                ]
            },
            "seperator",
        {
                name: "🔏 CSP aktivieren - deaktivieren",
                type: prefs.PREF_BOOL,
                pref: "security.browser_xhtml_csp.enabled",
                possibleVals: [
                    {  val: false  },
                    {  val: true },
                ]
            },
        
        {
                name: "🔏 eval erlauben - verbieten",
                type: prefs.PREF_BOOL,
                pref: "security.allow_unsafe_dangerous_privileged_evil_eval",
                possibleVals: [
                    {  val: false  },
                    {  name: "true ⚠️",  val: true , sign: '‼️' },
                ]
        },
        {
            name: "🌐 IPv6 ausschalten",
            type: prefs.PREF_BOOL,
            pref: "network.dns.disableIPv6",
            possibleVals: [
                {  val: false },
                {  val: true },
            ]
        },
        {
            name: "🔐 DNS Modus",
            type: prefs.PREF_INT,
            pref: "network.trr.mode",
            possibleVals: [
                { name: "0 - Default" , val: 0 },
                { name: "2 - DoH, fallback Plain DNS" , val: 2 },
                { name: "3 - DoH only" , val: 3 }, 
                { name: "5 - Plain DNS" , val: 5 }
            ]
        },
        {
            name: "🔐 DoH server",
            type: prefs.PREF_STRING,
            pref: "network.trr.uri",
            possibleVals: [
                { name: "Cloudflare" , val: "https://mozilla.cloudflare-dns.com/dns-query" },
                { name: "NextDNS" , val: "https://firefox.dns.nextdns.io/" }
            ] // See buildin DoH at 'network.trr.resolvers'
        },
        {
            name: "🔏 Veraltete TLS Version aktivieren",
            type: prefs.PREF_BOOL,
            pref: "security.tls.version.enable-deprecated",
            possibleVals: [
                { val: false  },
                { name: "true ⚠️",  val: true , sign: '‼️'},
            ]
        },
        
            "seperator",
        {
            name: "🖱️ Mausrad-Y-Multiplikator",
            type: prefs.PREF_INT,
            pref: "mousewheel.default.delta_multiplier_y",
            possibleVals: [
                { val: 150 },
            ]
        },
        {
            name: "🖱️ Vertikaler Faktor des Systembildlaufes",
            type: prefs.PREF_INT,
            pref: "mousewheel.system_scroll_override.vertical.factor",
            possibleVals: [
                { val: 250 },
            ]
        },
        
        
            "seperator",
        {
            name: "▶️ Autoplay Medien Standard",
            type: prefs.PREF_INT,
            pref: "media.autoplay.default",
            possibleVals: [
                { val: 0, name: "0 - allow" },
                { val: 1, name: "1 - blockAudible 👍" },
                { val: 5, name: "5 - blockAll" },
            ]
        },
        {
                name: "📺 Videos gesperrt - Videos frei",
                type: prefs.PREF_BOOL,
                pref: "media.mediasource.enabled",
                possibleVals: [
                    {  val: false  },
                    {  val: true },
                ]
        },
        {
            name: "▶️ Media Autoplay ext bg",
            type: prefs.PREF_BOOL,
            pref: "media.autoplay.allow-extension-background-pages",
            possibleVals: [
                {  val: false  },
                {  val: true },
            ]
        },
        {
            name: "▶️ Richtlinien zur Sperrung von Autoplay-Medien",
            type: prefs.PREF_INT,
            pref: "media.autoplay.blocking_policy",
            possibleVals: [
                { val: 0, name: "0 - no block" },
                { val: 1, name: "1 - block 👍" },
                { val: 2, name: "2 - block more" },
                // 0=sticky (default), 1=transient, 2=user
            ]
        },
        {
            name: "▶️ InternetAudio",
            type: prefs.PREF_BOOL,
            pref: "dom.webaudio.enabled",
            possibleVals: [
                {  val: false },
                {  val: true  ,  sign: '‼️' , warnbadge: true},
            ]
        },
    
            "seperator",    
        {
            name: "🔤 Benutzerdefinierte Web-Schriften zulassen",
            type: prefs.PREF_INT,
            pref: "browser.display.use_document_fonts",
            possibleVals: [
                { name: "1 - Allow", val: 1 },
                { name: "0 - Disallow", val: 0 },
            ]
        },
        {
            name: "💻 Keine Popup Anmeldung für Browser-Werkzeuge",
            type: prefs.PREF_BOOL,
            pref: "devtools.debugger.prompt-connection",
            possibleVals: [
                {  val: true  },
                { name: "false ⚠️",   val: false , sign: '‼️' },
            ]
        },       
        {
            name: "🔏 Tooltips aktivieren - deaktivieren",
            type: prefs.PREF_BOOL,
            pref: "browser.chrome.toolbar_tips",
            possibleVals: [
                {  val: false  },
                {  val: true },
            ]
        },
        ];
        
        if (!window.gBrowser){
        return;
        }
    
        CustomizableUI.createWidget({
            id: 'aboutconfig-button', // button id
            type: "custom",
            defaultArea: CustomizableUI.AREA_NAVBAR,
            removable: true,
            onBuild: function (doc) {
                let btn = doc.createXULElement('toolbarbutton');
                btn.id = 'aboutconfig-button';
                btn.label = button_label;
                btn.tooltipText = button_label;
                btn.type = 'menu';
                btn.className = 'toolbarbutton-1 chromeclass-toolbar-additional';
                btn.setAttribute("badged", "true"); 
                btn.setAttribute("badge", "!"); 
                
                let mp = doc.createXULElement("menupopup");
                mp.id = 'aboutconfig-popup';
                mp.onclick = function(event) {  event.preventDefault()  ;} ;
                
    
                
                prefItems.forEach( function (item, items_i) { // loop every user defined pref
                    
                    if (item === "seperator") 
                    {
                        mp.appendChild(doc.createXULElement('menuseparator'));
                        return;
                    }
                    
                    //var current_val = getItemCurrentVal(item) ;
                    var menu = doc.createXULElement("menu");
                    menu.label = item.name ? item.name : item.pref ;
                    menu.id = "aboutconfig_menu_" + items_i ;
                    menu.className = 'menuitem-iconic' ;
                    
                
                    var menupopup = doc.createXULElement("menupopup");
                    menupopup.id = "aboutconfig_menupopup_" + items_i ;
                    menupopup.className = 'menuitem-iconic' ;
                    
    
                    
                    item.possibleVals.forEach( function (pv, i) { // loop every possible value
                        
                        var display_val = prefPossibleValToDisplay(item, pv.val) ;
                        
                        // Submenu item. One is one possible value
                        var menuitem = doc.createXULElement("menuitem");
                        menuitem.label = pv.name ? pv.name : display_val ;
                        menuitem.id = "aboutconfig_menu_" + items_i + "__" + i  ;
                        menuitem.setAttribute('type', 'radio') ;
                        menuitem.className = 'menuitem-iconic' ;
                        menuitem.tooltipText = display_val ;
    
                        if (pv ['sign'])
                            menuitem.label += '  ' + pv['sign']; 
                        
                        
                        menuitem.addEventListener('click', function(event) { 
                            //console.log(this.id); 
                            setItemPrefVal(item , pv.val);
                        } ) ;
                        menupopup.appendChild(menuitem);
                        
                    });           
                                    
                    var default_val = getItemDefaultVal(item);
                    var default_val_display = null;
                    var reset_label = "Zurücksetzen: ";
                    if (item.signWhenDefaultVal)
                        reset_label += item.signWhenDefaultVal + ' ' ;
                    if (default_val !== undefined && default_val !== null)
                    {
                        default_val_display = prefPossibleValToDisplay(item, default_val);
                        reset_label += default_val_display ;
                    }
                    else
                        reset_label += ' (delete in about:config)'
                    
                    menupopup.appendChild(
                        doc.createXULElement('menuseparator')
                    );
                    
                    // Submenu entry to reset a pref to default
                    var default_item = doc.createXULElement("menuitem");
                    default_item.id = "aboutconfig_menu_" + items_i + "__default" ;
                    default_item.className = 'menuitem-iconic';
                    default_item.label = reset_label;
                    default_item.tooltipText = default_val_display;
    
                    default_item.addEventListener('click', function(event) { 
                        //console.log(this.id); 
                        //setItemPrefVal(item , getItemDefaultVal(item) );
                        prefs.clearUserPref(item.pref);
                    } ) ;
                    
                    menupopup.appendChild(default_item);
                    
                    //------------
                    menu.appendChild(menupopup);
                    mp.appendChild(menu);
                    
                    
                });
                
                btn.appendChild(mp);
    
                mp.addEventListener('popupshowing', function() { 
                    //console.log(this);
                    evalPopulateMenu(this); 
                    
                    update_badge();
                    
                });
    
                btn.onclick = function(event) {
                    if (event.button == 1) {
                        const win = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                            .getService(Components.interfaces.nsIWindowMediator)
                            .getMostRecentWindow("navigator:browser");
                        win.gBrowser.selectedTab = win.gBrowser.addTrustedTab('about:config');
                    }
                    
                    update_badge();
                };
                
                return btn;
            }
        });
        
        function getItemDefaultVal (item) {
            var default_val = undefined;
            try{
                if ( item.type == prefs.PREF_BOOL )
                    default_val = prefs.getDefaultBranch(item.pref).getBoolPref('');
                else if ( item.type == prefs.PREF_INT )
                    default_val = prefs.getDefaultBranch(item.pref).getIntPref('');
                else if ( item.type == prefs.PREF_STRING )
                    default_val = prefs.getDefaultBranch(item.pref).getStringPref('');
            }catch(err) { default_val = null }
            
            return default_val;
        }
        function getItemCurrentVal (item) {
            var current_val = null;
            try{
                if ( item.type == prefs.PREF_BOOL )
                    current_val = prefs.getBoolPref(item.pref);
                else if ( item.type == prefs.PREF_INT )
                    current_val = prefs.getIntPref(item.pref);
                else if ( item.type == prefs.PREF_STRING )
                    current_val = prefs.getStringPref(item.pref);
            }catch(err){ }
            return current_val ;
        }
        
        function if_pref_current_val_is (item, pv_index) {
            var current_val = getItemCurrentVal(item) ;
            if (current_val === null)
                return false;
            
            if ( current_val === item.possibleVals[pv_index].val )
                return true;
            else 
                return false;
        }
        
        function setItemPrefVal(item, newVal)
        {
            if ( item.type == prefs.PREF_BOOL )
                prefs.setBoolPref(item.pref, newVal);
            else if ( item.type == prefs.PREF_INT )
                prefs.setIntPref(item.pref, newVal);
            else if ( item.type == prefs.PREF_STRING )
                prefs.setStringPref(item.pref, newVal);
            
            update_badge();
        }
        function prefPossibleValToDisplay(item, possible_val ) {
            if (possible_val === null) 
                return "null";
            
            var display_val = possible_val.toString();
            if (item.type == prefs.PREF_STRING)
                display_val = `'${display_val}'`;
            
            return display_val;
        }
        
        function evalPopulateMenu(popupmenu)
        {
            prefItems.forEach( function (item, items_i) {
                if (item === "seperator") 
                    return;
                
                const menu = popupmenu.querySelector("#aboutconfig_menu_" + items_i);
                menu.label = item.name ? item.name : item.pref ;
                menu.style.fontWeight = "";
                
                const default_val = getItemDefaultVal(item);
                        
                var current_val = getItemCurrentVal(item) ;
                var current_val_display = prefPossibleValToDisplay(item, current_val);
                menu.tooltipText = `Pref: ${item.pref}\nValue: ${current_val_display}`;
                
                if (current_val !== null)
                {
                    if (item.type == prefs.PREF_BOOL) 
                        menu.label += '  [' + ( current_val?'T':'F' ) + ']';
                    else if (item.type == prefs.PREF_INT) 
                        menu.label += '  [' + current_val + ']';
                    else if (item.type == prefs.PREF_STRING) {
                        var current_val_display_short;
                        
                        if (current_val.length > 8)
                            current_val_display_short = current_val.substring(0, 6) + '..'; 
                        else 
                            current_val_display_short = current_val;
                        
                        menu.label += '  [' + current_val_display_short + ']';
                    }
                } 
                
                if (current_val !== default_val)
                    menu.style.fontWeight = "bold";
                
                if (current_val === default_val && item.signWhenDefaultVal)
                    menu.label += '  ' + item.signWhenDefaultVal;
    
                
                item.possibleVals.forEach( function (pv, i) {
                    menuitem = popupmenu.querySelector("#aboutconfig_menu_" + items_i + "__" + i);
                    if ( if_pref_current_val_is(item, i) )
                    { 
                        menuitem.setAttribute("checked",true);
                     
                        if (pv ['sign'])
                            menu.label += '  ' + pv['sign'];
                    }
                    else 
                        menuitem.setAttribute("checked",false);
                });
            });
        }
        
        function add_warnbadge()
        {
            if ( ! sss.sheetRegistered(cssuri_warnbadge, sss.USER_SHEET) )
                 sss.loadAndRegisterSheet(cssuri_warnbadge, sss.USER_SHEET);
        }
        function rm_warnbadge()
        {
            if ( sss.sheetRegistered(cssuri_warnbadge, sss.USER_SHEET) )
                 sss.unregisterSheet(cssuri_warnbadge, sss.USER_SHEET);
        }
        
        update_badge();
        async function update_badge()
        {
            
            var show_warnbadge = false;
            
            for (item of prefItems)
            {
                if (typeof(item) === "string")
                    continue;
                
                const current_val = getItemCurrentVal(item) ;
                if (
                    item.possibleVals.some ( function(ele) {
                        return ( ele ['val'] === current_val && ele ['warnbadge'] && ele ['warnbadge'] === true );
                    } )
                )
                {
                    show_warnbadge = true;
                    break;
                }
            }
                 
            
            if (show_warnbadge)
                add_warnbadge();
            else 
                rm_warnbadge();
        }
        
        
    })();
    Alles anzeigen
  • userChrome.js Scripte für den Fuchs (Diskussion)

    • bege
    • 10. Juni 2025 um 21:40
    Zitat von BrokenHeart

    Ja! Jedes Skript wird über die von uns verwendete UserChrome-Logik zweimal aufgerufen. Warum das im Detail so ist, kann ich jetzt auch nicht sagen

    Ist doch ganz einfach: Doppelt hält besser! 🤣

    Danke dir, Sören Hentzschel und 2002Andreas für die Antworten. War mal wieder ein lehrreicher Abend. 🙏

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

    • bege
    • 10. Juni 2025 um 21:22
    Zitat von Sören Hentzschel

    So sefinitiv ist das wohl nicht, Fehlermeldungen lügen nicht. ;) Es wäre vermutlich hilfreich, wenn du den Code teilen würdest, um den es geht.

    Die Fehlermeldung

    Zitat

    21:09:08.499 Uncaught TypeError: document.getElementById(...) is null
    init file:///C:/Users/bege/AppData/Roaming/Mozilla/Firefox/Profiles/487kit50.Quantum/chrome/JS/VersionInAddonBar.uc.js:34
    <anonymous> file:///C:/Users/bege/AppData/Roaming/Mozilla/Firefox/Profiles/487kit50.Quantum/chrome/JS/VersionInAddonBar.uc.js:37
    VersionInAddonBar.uc.js:34:18

    Die Add-on Bar (ID wird in Zeile 120 definiert)

    JavaScript: addonbar.uc.js
    // Add-on Bar script for Firefox 126+ by Aris
    //
    // no 'close' button
    // 'toggle' toolbar with 'Ctr + /' on Windows/Linux or 'Cmd + /' on macOS
    // no 'Add-on Bar' entry in toolbar context menu
    //
    // option: smaller buttons / reduced toolbar button height
    //
    // flexible spaces on add-on bar behave like on old Firefox versions
    
    // [!] Fix for WebExtensions with own windows by 黒仪大螃蟹 (for 1-N scripts)
    
    
    var appversion = parseInt(Services.appinfo.version);
    
    var compact_buttons = false; // reduced toolbar height and smaller buttons
    
    var AddAddonbar = {
      init: function() {
    
    	if (location != 'chrome://browser/content/browser.xhtml')
          return;
    	  
    	/* blank tab workaround */
    	try {
    	  if(gBrowser.selectedBrowser.getAttribute('blank')) gBrowser.selectedBrowser.removeAttribute('blank');
    	} catch(e) {}
    	
    	try {
    	  Services.prefs.getDefaultBranch('browser.addonbar.').setBoolPref('enabled',true);
    	} catch(e) {}
    
    	var addonbar_label = 'Add-on Bar';
    	var compact_buttons_code = '';
    	
    	if(compact_buttons)
    	  compact_buttons_code = `
    		#addonbar toolbarbutton .toolbarbutton-icon {
    		  padding: 0 !important;
    		  width: 16px !important;
    		  height: 16px !important;
    		}
    		#addonbar .toolbarbutton-badge-stack {
    		  padding: 0 !important;
    		  margin: 0 !important;
    		  width: 16px !important;
    		  min-width: 16px !important;
    		  height: 16px !important;
    		  min-height: 16px !important;
    		}
    		#addonbar toolbarbutton .toolbarbutton-badge {
    		  margin-top: 0px !important;
    		  font-size: 5pt !important;
    		  min-width: unset !important;
    		  min-height: unset !important;
    		  margin-inline-start: 0px !important;
    		  margin-inline-end: 0px !important;
    		}
    		#addonbar .toolbaritem-combined-buttons {
    		  margin-inline: 0px !important;
    		}
    		#addonbar toolbarbutton {
    		  padding: 0 !important;
    		}
    	  `;
    
    	// style sheet
    	Components.classes['@mozilla.org/content/style-sheet-service;1'].getService(Components.interfaces.nsIStyleSheetService).loadAndRegisterSheet(
    	  Services.io.newURI('data:text/css;charset=utf-8,' + encodeURIComponent(`
    		  #addonbar toolbarpaletteitem[place=toolbar][id^=wrapper-customizableui-special-spring],
    		  #addonbar toolbarspring {
    			-moz-box-flex: 1 !important;
    			min-width: unset !important;
    			width: unset !important;
    			max-width: unset !important;
    		  }
    		  #main-window[customizing] #addonbar {
    			outline: 1px dashed !important;
    			outline-offset: -2px !important;
    		  }
    		  #addonbar {
    			border-top: 1px solid var(--sidebar-border-color,rgba(0,0,0,0.1)) !important;
    			background-color: var(--toolbar-bgcolor);
    			background-image: var(--toolbar-bgimage);
    			-moz-window-dragging: no-drag !important;
    		  }
    		  :root[lwtheme] #addonbar {
    			background: var(--lwt-accent-color) !important;
    		  }
    		  :root[lwtheme][lwtheme-image='true'] #addonbar {
    			background: var(--lwt-header-image) !important;
    			background-position: 0vw 50vh !important;
    		  }
    		  /* autohide add-on bar in fullscreen mode */
    		  /*#main-window[sizemode='fullscreen']:not([inDOMFullscreen='true']) #addonbar {
    			visibility: visible !important;
    			display: block !important;
    			min-height: 1px !important;
    			height: 1px !important;
    			max-height: 1px !important;
    		  }
    		  #main-window[sizemode='fullscreen']:not([inDOMFullscreen='true']) #addonbar:hover {
    			min-height: 24px !important;
    			height: 24px !important;
    			max-height: 24px !important;
    		  }*/
    		  #unified-extensions-button[hidden]{
    			visibility: visible !important;
    			display: flex !important;
    		  }
    		  `+compact_buttons_code+`
    	  `), null, null),
    	  Components.classes['@mozilla.org/content/style-sheet-service;1'].getService(Components.interfaces.nsIStyleSheetService).AGENT_SHEET
    	);
    
    	// toolbar
    	try {
    	  if(document.getElementById('addonbar') == null) {
    		var tb_addonbar = document.createXULElement('toolbar');
    		tb_addonbar.setAttribute('id','addonbar');
    		tb_addonbar.setAttribute('collapsed', 'false');
    		tb_addonbar.setAttribute('toolbarname', addonbar_label);
    		tb_addonbar.setAttribute('defaultset','spring,spring'); 
    		tb_addonbar.setAttribute('customizable','true');
    		tb_addonbar.setAttribute('mode','icons');
    		tb_addonbar.setAttribute('iconsize','small');
    		tb_addonbar.setAttribute('context','toolbar-context-menu');
    		tb_addonbar.setAttribute('lockiconsize','true');
    		tb_addonbar.setAttribute('class','toolbar-primary chromeclass-toolbar browser-toolbar customization-target');
    
    		document.getElementById('browser').parentNode.appendChild(tb_addonbar);
    		//tb_addonbar.insertBefore(document.querySelector('#statuspanel'),tb_addonbar.firstChild);
    		
    		CustomizableUI.registerArea('addonbar', {legacy: true});
    		
    		setTimeout(function(){
    		  CustomizableUI.registerArea('addonbar', {legacy: true});
    		},2000);
    	  
    		CustomizableUI.registerToolbarNode(tb_addonbar);
    		
    		// 'Ctr + /' on Windows/Linux or 'Cmd + /' on macOS to toggle add-on bar
    		var key = document.createXULElement('key');
    		key.id = 'key_toggleAddonBar';
    		key.setAttribute('key', '/');
    		key.setAttribute('modifiers', 'accel');
    		/*key.setAttribute('oncommand',`
    			var newAddonBar = document.getElementById('addonbar');
    			setToolbarVisibility(newAddonBar, newAddonBar.collapsed);
    			Services.prefs.getBranch('browser.addonbar.').setBoolPref('enabled',!newAddonBar.collapsed);
    		  `);*/
    		key.addEventListener("command", () => {var newAddonBar = document.getElementById('addonbar');
    			setToolbarVisibility(newAddonBar, newAddonBar.collapsed);
    			Services.prefs.getBranch('browser.addonbar.').setBoolPref('enabled',!newAddonBar.collapsed);} );
    		document.getElementById('mainKeyset').appendChild(key);
    		
    		
    		try {
    		  setToolbarVisibility(document.getElementById('addonbar'), Services.prefs.getBranch('browser.addonbar.').getBoolPref('enabled'));
    		} catch(e) {}
    	  
    	  }
    	} catch(e) {}
    
      }
    
    }
    
    /* initialization delay workaround */
    document.addEventListener('DOMContentLoaded', AddAddonbar.init(), false);
    /* Use the below code instead of the one above this line, if issues occur */
    /*
    setTimeout(function(){
      AddAddonbar.init();
    },2000);
    */
    
    /* fix for downloads button on add-on bar - thanks to dimdamin */
    /* https://github.com/Aris-t2/CustomJSforFx/issues/125#issuecomment-2506613776 */
    (async url => !location.href.startsWith(url) || await delayedStartupPromise ||
    	(async (scrNT, nTjs) => {
    		if (scrNT.length >= 1) {
    			nTjs.uri = "data:application/x-javascript;charset=UTF-8,";
    			nTjs.res = await fetch(scrNT[0].src);
    			nTjs.src = (await nTjs.res.text())
    				.replace(/navigator-toolbox/, "addonbar_v")
    				.replace(/widget-overflow/, "addonbar");
    			(await ChromeUtils.compileScript(nTjs.uri + encodeURIComponent(nTjs.src))).executeInGlobal(this);
    		};
    	})(document.getElementById("navigator-toolbox").querySelectorAll(":scope > script"), {})
    )("chrome://browser/content/browser.x");
    Alles anzeigen

    Das Skript, das einen Button in der Add-on Bar platziert und die Fehlermeldung erzeugt (die beanstandete ID wird in Zeile 18 definiert)

    JavaScript: VersionInAddonBar.uc.js
    // ==UserScript==
    // @name           VersionInAddonBar.uc.js
    // @description    Versionsnummer in der Addon-Bar anzeigen
    // @include        main
    // @charset        UTF-8
    // @note           Basiert auf dem Script MemoryMonitorMod.uc.js und der Erweiterung "Version in Statusbar"
    // @note           Bit-Version aus https://www.camp-firefox.de/forum/thema/135247-anwendungsname-und-version-in-der-men%C3%BCleiste/
    // @note           In Zeilen 18 u. 19 die Toolbar und die Position (hinter welchem Element) auf der Toolbar anpassen.
    // @note           Ein Klick auf den Button öffnet das Fenster "Über Firefox".
    // ==/UserScript==
    
            setTimeout(function() {
    
    var ucjsVN = {
    
        init : function () {
           let profile = Cc["@mozilla.org/toolkit/profile-service;1"].getService(Ci.nsIToolkitProfileService).currentProfile.name;
            var Toolbar = 'addonbar';
    		  var Position = 'customizableui-special-separator177';
            // var Position = 'formhistory_yahoo_com-browser-action';
            // var Position = 'textarea-cache-lite_wildsky_cc-browser-action';
            var info = Components.classes['@mozilla.org/xre/app-info;1'].getService(Components.interfaces.nsIXULAppInfo);
            var bit = (Services.appinfo.is64Bit ? 64 : 32);
            var versionPanel = document.createXULElement('toolbaritem');
            versionPanel.id = 'VersionDisplay';
            versionPanel.setAttribute('tooltiptext', 'Versions-Nummer. Klick öffnet "Über ' + info.vendor + ' ' + info.name + '"');
            versionPanel.addEventListener('click', function () {
              openAboutDialog();
            });
            versionPanel.style.paddingTop = '4px';
            var label = document.createXULElement('label');
            label.setAttribute('value', "v" + info.version + " (" + bit + "bit)" + " [" + profile + "]");
            versionPanel.appendChild(label);
            document.getElementById(Toolbar).insertBefore(versionPanel, document.getElementById(Position).nextSibling);
        },
    }
    ucjsVN.init();
    			         }, 3000);
    Alles anzeigen

    Zitat von BrokenHeart
    Zitat von bege

    Woran liegt das?

    Konkret kann man das natürlich nicht bei jedem Skript sagen, aber wenn du verhinderst, dass das Skript zweimal aufgerufen wird, dann sollten sich solche Fehler in aller Regel vermeiden lassen. Daher bei jedem Skript z.B. diesen Code am Anfang einfügen:

    JavaScript
    if (!window.gBrowser){
    	return;
    }

    Tatsächlich verschwindet die Fehlermeldung dadurch bei diesem Skript. Ich verstehe aber noch nicht, warum. Was meinst du mit "zweimal aufgerufen"? Passiert das bei dem Skript? Und trotz einer auch sehr langen timeout-Zeit?

    Edit: Mit einem anderen Skript habe ich es auch probiert. Ist für einen Nur-Bastler wie mich nicht einfach, die richtige Stelle dafür zu finden. Ganz am Anfang funktioniert es nicht immer, das legt mitunter das ganze Skript lahm. Aber mit probieren habe ich es herausgefunden.

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

    • bege
    • 10. Juni 2025 um 20:46
    Zitat von Sören Hentzschel

    Auch, wenn Scripts ansonsten zu funktionieren scheinen, empfehle ich, solche Fehler zu beheben. Denn man kann nicht grundsätzlich ausschließen, dass nach Auftreten eines Fehlers nicht irgendwelche Dinge nicht mehr korrekt ausgeführt werden. Und selbst, wenn es keine Probleme gibt, wird ja nur das Entdecken tatsächlicher Fehler erschwert, wenn in der Konsole unnötige Fehlermeldungen erscheinen.

    Ich habe versucht, das auf andere Skripte mit diesem Fehler zu übertragen. Bei Skripten, die sich auf Elemente aus einem anderen Skript beziehen, bekomme ich den Fehler, obwohl das Element des ersten Skripts definitiv bei der Ausführung des zweiten Skript vorhanden ist. (setTimeout so lang, dass ich sehen kann, wie das zweite Skript ausgeführt wird während das Element des ersten Skripts bereits vorhanden ist: Beispiel platzieren eines Buttons in der vom ersten Skript erzeugten Addonbar. Dennoch kommt für das zweite Skript der Fehler, dass die ID der Addonbar null ist, während der Button genau dort platziert wird.)

    Woran liegt das?

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

    • bege
    • 10. Juni 2025 um 19:57
    Zitat von 2002Andreas

    Das Skript müsste angepasst werden. In dem aus Beitrag Nr. 23 gibt es nämlich keine.

    Mit diesem Code aus dem verlinkten Skript - eingefügt unter der Konfiguration - verschwindet die Fehlermeldung.

    JavaScript
            //[FF139+] ->
            if(!document.getElementById("unknownContentType")) 
            return;
            //<- [FF139+]

    An der Funktion ändert sich dadurch nichts, es gibt eben eine Fehlermeldung weniger. Wie gesagt gibt es diese Fehlermeldung bei einer ganzen Reihe von Skripten bei mir, die alle funktionieren, u.a. welche von alice0775.

    Sören Hentzschel Kannst du zu diesen Fehlermeldungen etwas sagen?

    Zitat von bege

    Die Fehlermeldung document.getElementById(...) is null habe ich bei vielen Skripten, die wie dies hier trotzdem funktionieren. Für mich nur eines von vielen Javascript-Rätseln. 😉

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

    • bege
    • 10. Juni 2025 um 18:24
    Zitat von 2002Andreas

    Die Fehlermeldung erscheint hier allerdings auch.

    Die Fehlermeldung document.getElementById(...) is null habe ich bei vielen Skripten, die wie dies hier trotzdem funktionieren. Für mich nur eines von vielen Javascript-Rätseln. 😉

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

    • bege
    • 9. Juni 2025 um 17:46
    Zitat von Endor

    Halle bege

    Kann ich gerne machen.
    Würde vorschlagen mein vorhandenes mit obigem ersetzen.
    Was meinst Du - Ihr?

    Mfg.
    Endor

    Von mir aus gerne, ich hatte es ja per CSS so geändert und habe jetzt die neue Version übernommen. Ich weiß nicht, ob das bei jemand anderem Probleme bereitet.

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

    • bege
    • 9. Juni 2025 um 16:43
    Zitat von jizz
    JavaScript
    // ==UserScript==
    // @include       chrome://mozapps/content/downloads/unknownContentType.xhtml
    // @charset       UTF-8
    // @sandbox       true
    // @version       Fx139+
    // ==/UserScript==
    
    (function () {
    
        const { FileUtils } = ChromeUtils.importESModule('resource://gre/modules/FileUtils.sys.mjs');
        const { setTimeout } = ChromeUtils.importESModule('resource://gre/modules/Timer.sys.mjs');
    
        setTimeout(function () {
            saveTo()
        }, 200);
    
        function saveTo () {
            // config
            const dirArray = [
                ['C:\\', 'System'],
                ['D:\\', 'DATA'],
                ['D:\\Software', 'Software'],
                ['D:\\Downloads', 'herunterladen'],
                ['D:\\Video', 'Video'],
                ['' + FileUtils.getDir('UChrm', []).path + '', 'chrome'],
                //['' + FileUtils.getDir('UChrm', ['SubScript']).path + '', 'SubScript'],
    
                ['F:\\', 'F:'],
                ['G:\\', 'G:'],
                ['H:\\', 'H:'],
            ];
    
            const button = document.getElementById('unknownContentType').getButton('cancel');
            const saveTo = button.parentNode.insertBefore(createEl('button', {
                label: 'Speichern nach',
                class: 'dialog-button',
                type: 'menu'
            }), button);
            const saveToMenu = saveTo.appendChild(createEl('menupopup'));
            saveToMenu.appendChild(createEl("html:link", {
                rel: "stylesheet",
                href: "chrome://global/skin/global.css"
            }));
            saveToMenu.appendChild(createEl("html:link", {
                rel: "stylesheet",
                href: "chrome://global/content/elements/menupopup.css"
            }));
            dirArray.forEach(function (a) {
                const [dir, name] = [a[0], a[1]];
                saveToMenu.appendChild(createEl('menuitem', {
                    label: (name || (dir.match(/[^\\/]+$/) || [dir])[0]),
                    image: 'moz-icon:file:///' + dir + '\\',
                    class: 'menuitem-iconic',
                    dir: dir,
                    onclick: function () {
                        const locationtext = document.getElementById('locationtext');
                        const file = new FileUtils.File(this.getAttribute('dir') + '\\' + (locationtext ? locationtext.value : document.getElementById('location').value));
                        dialog.mLauncher.saveDestinationAvailable(file);
                        dialog.onCancel = function () { };
                        close();
    
                    }
                }));
            });
        }
    
        function createEl (type, attrs = {}, doc = document) {
            let el = type.startsWith('html:')
                ? doc.createElementNS('http://www.w3.org/1999/xhtml', type)
                : doc.createXULElement(type);
    
            for (let key of Object.keys(attrs)) {
                key.startsWith('on')
                    ? el.addEventListener(key.slice(2).toLocaleLowerCase(), attrs[key])
                    : el.setAttribute(key, attrs[key]);
            }
    
            return el;
        }
    }());
    Alles anzeigen


    Perfekt! Macht genau, was grisu2099 und ich mit CSS gebastelt haben.

    Endor , nimmt du das ins Github repo auf?

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

    • bege
    • 3. Juni 2025 um 22:28
    Zitat von grisu2099

    Frag mich aber bitte nicht, wo/wie ich das gefunden habe... :D :saint:

    Na gut. 😉

    Zitat von Endor

    Für das Script saveto.uc.js gibt es eine neue Version für Firefox 139

    Es gibt noch einen Fehler im Skript. Im letzten CSS-Befehl muss es ganz am Ende des Selektors menu-text heißen statt menu-iconic-text. Sonst greifen die padding-Werte nicht.

    Ich nutze eine Windows-App, die abends das Windows-Theme von hell auf dunkel stellt. Dann funktionieren die Farben des Popups nicht mehr richtig, weil der Hintergrund im Skript hell fixiert ist, die Schrift aber auf weiß geändert wird. Um den Hintergrund flexibel je nach Windows-Theme zu halten, habe ich im zweiten CSS-Befehl den background: -Wert von #F0F0F0 auf var(--background-color-box) geändert.

    Edit: Im dritten Befehl den background: -Wert von #91C9F7 auf var(--button-background-color-hover) ändern lässt den Hintergrund beim Hovern flexibel je nach Windows-Theme.

    Mit diesen Änderungen funktioniert es wieder prima. Danke Endor und alle Mitdenker.

    Zitat von Horstmann

    padding-left und padding-right überschreiben hier padding für links/rechts, soweit ich weiss.

    Das ginge auch in einer Zeile: padding: 3px 12px 3px 5px;. Aber für so Bastler wie mich ist es wie geschrieben übersichtlicher. Deshalb kann es von mir aus so bleiben.

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

    • bege
    • 3. Juni 2025 um 21:53
    Zitat von grisu2099

    Füge mal den folgenden Schnipsel zusätzlich in den CSS-Teil des Skriptes ein und teste:

    CSS
    hbox.dialog-button-box button.dialog-button menupopup menuitem:not([highlightable]) > .menu-highlightable-text,
    			menuitem[highlightable] > .menu-text {
    				display: none;
    			}

    👍Super, danke.

    Hast du eine Idee, warum auch das alte Skript plötzlich dieses Verhalten zeigt?

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

    • bege
    • 3. Juni 2025 um 21:24
    Zitat von milupo

    Ja, bei mir auch und vor allem mit meiner älteren Version hier ebenfalls. :( Ich habe etwas herumexperimentiert, aber keine Lösung gefunden.

    Das ist ja verrückt. Bei meiner alten Version war die Anzeige korrekt, aber beim Klick auf einen Ordner passierte nichts mehr. Nach deinem Beitrag habe ich die alte Version nochmal aktiviert und jetzt sind auch hier die Labels zwei mal zu sehen. Kein weiteres Firefox-Update dazwischen (aktuell 139.0.1). 🤔

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

    • bege
    • 3. Juni 2025 um 20:21
    Zitat von milupo

    Ich denke mal, an den Zeilen 26-28.

    Daran habe ich auch gedacht. Aber das verändert ja nur die Position der Labels . Aber warum sind sie mit der neuen Skriptversion zwei Mal da?

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

    • bege
    • 3. Juni 2025 um 18:50
    Zitat von Endor

    Hallo zusammen.
    Für das Script saveto.uc.js gibt es eine neue Version für Firefox 139

    Das sieht bei mir so aus. Woran kann das liegen?

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

    • bege
    • 8. Mai 2025 um 22:07
    Zitat von pro100user

    Bitte helfen Sie, das Problem mit dem Skript auf FF 138.0.1 zu lösen. Partition Übergang funktioniert nicht, nicht öffnen Explorer.

    Hier https://github.com/Endor8/userChr…35/saveto.uc.js findest du eine funktionierende Version.

  • Diskussion über neues Unterforum nur für Skripte

    • bege
    • 8. Mai 2025 um 21:57
    Zitat von Horstmann

    Und nur mal 2 Beispiele:

    Diese schon öfters erwähnte Thread ist gepackt voll mit super Infos zu der addEventListener Geschichte, aber immens aufgebläht durch die Einzelscript Diskussionen.

    Hier haben wir wichtige Infos zu eval etc., die in einem Script spezifischen Thread versteckt sind.

    Das sind für mich 2 typische Beispiele: Die Themen wurden erstellt, weil Skripte nach Firefox-Updates nicht mehr funktionierten. Das ist nach meiner Beobachtung die Regel. Im Verlauf der Diskussion wurden die nötigen Änderungen herausgefunden und in die Skripte integriert. Dass in dem Thema auch für die folgenden Firefox-Versionen grundsätzliche Informationen stehen, weiß man beim Erstellen des Themas noch nicht. Um solche Themen übersichtlich in einem Unterforum darzustellen, müsste also ein Moderator die Themen durchforsten und dann umbenennen und - oft nur zum Teil - verschieben. Und nach diversen Firefox-Updates ist manches schon wieder anders.

    Die weniger aufwändige Möglichkeit, mit der Tendenz des Lebens zum Chaos umzugehen, ist wie bisher mit vertretbarem Zeitaufwand die Forensuche zu nutzen.

  • Diskussion über neues Unterforum nur für Skripte

    • bege
    • 8. Mai 2025 um 19:27
    Zitat von 2002Andreas

    Inzwischen sind hier auch schon mehr als 10 Beiträge drin, die nichts mit dem Thema zu tun haben ;)

    Würdest du die einschließlich diesem hier bitte auch auslagern? Dann bleibt dieses Thema übersichtlich.
    Diese Diskussion hatten wir schon mal um das Skript-Diskussionen-Sammelthema und es gibt weiterhin beides: Einzelne und Sammelthemen. Und ich hoffe, dass das so bleibt. Es gab schon in der anderen Diskussion unterschiedliche Auffassungen dazu.

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