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

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

    • bege
    • 4. Mai 2025 um 18:07
    Zitat von Speravir
    Zitat von bege

    Diese Skripte gehen jetzt auch wieder.
    JavaScript: AnimationToggleButton.uc.js

    Hmm?! Von welcher Version bist Du ausgegangen? (Edit: Ach, steht ja direkt im Kommentar.) Denn die bei Endor vor 4 Monaten hochgeladene Version funktioniert prima in Fx138.

    Nicht missverstehen: Es ist gut, dass du Du selbst eine Lösung gefunden hast.

    Danke für den Link, hatte ich übersehen.


    Zitat von BrokenHeart
    Zitat von bege

    Diese Skripte gehen jetzt auch wieder

    Ja, aber im Skript AnimationToggleButton.uc.js ist sehr viel toter bzw. überflüssiger Code. Die Schleife, um die Attribute zum 'button' hinzuzufügen, wurde um Abfragen ergänzt, die niemals true werden. Es gibt im aktuellen Skript die Objektvariablen für die inlineEvents überhaupt nicht mehr, also ist es sinnlos das abzufragen und dafür einen Eventlistener hinzuzufügen.

    Einen Eventlister für oncontextmenu  hinzuzufügen ist nicht notwendig, da in onClick() das Kontextmenü bereits durch die Befehle event.preventDefault() und event.stopPropagation() außer Kraft gesetzt wird.

    Bei onclick ist es sowieso unsinnig, da der Eventlistener ja weiter unten im Code nochmal hinzugefügt wird.

    Danke für die Korrekturen. Da ich nur Hobbybaster bin, habe ich versucht, es mit Kopien aus anderen Skripten wieder zum Laufen zu bringen. Die von dir angemerkten Punkte gehen über meine Kenntnisse. Natürlich hätte ich den Code daraufhin untersuchen können, welche Eventlistener tatsächlich gebraucht werden.

    Ich habe mich jetzt für das Skript in Endors Sammlung entschieden, dann bin ich auf dem gleichen Stand wie das Forum hier.

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

    • bege
    • 3. Mai 2025 um 08:29

    Diese Skripte gehen jetzt auch wieder.

    JavaScript: AnimationToggleButton.uc.js
    // 	28_AnimationToggleButton.uc.js
    // 	v. 0.4.2a
    // 2025-05-03 bege Anpassung and Firefox 138
    // https://www.camp-firefox.de/forum/thema/112673-userchrome-js-scripte-f%C3%BCr-den-fuchs-diskussion/?postID=1271136#post1271136
    // 16.05.24 Endor Anpassung an Firefox 126+
    // https://www.camp-firefox.de/forum/thema/137909
    //	211104:	BrokenHeart zuletzt in:
    //	https://www.camp-firefox.de/forum/thema/133649
    
    (function() {
    
       if (location != 'chrome://browser/content/browser.xhtml')
          return;
    
       try {
    
          CustomizableUI.createWidget({
    
             id: 'animation-button',
             type: 'custom',
             defaultArea: CustomizableUI.AREA_NAVBAR,
    
             onBuild: function(aDocument) {
    
                var button = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
                var attributes = {
                   id: 'animation-button',
                   class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                   removable: 'true',
                   label: 'Animation',
                   tooltiptext: 'Klick li: Gif ∞\nKlick mi: Gif 1x \nKlick re: Gif aus',
                   oncontextmenu: 'return false'
                };
                for (var a in attributes) {
                   //button.setAttribute(a, attributes[a]);
                   if(a === "oncommand") {
                         button.addEventListener('command', function(event) { Function(attributes[a])(); });
                   } else if(a === "onclick") {
                         button.addEventListener('click', function(event) { Function(attributes[a])(); });
                   } else if(a === "onmouseup") {
                         button.addEventListener('mouseup', function(event) { Function(attributes[a])(); });
                   } else if(a === "oncontextmenu") {
                         button.addEventListener('contextmenu', function(event) { Function(attributes[a])(); });
                   } else {
                         button.setAttribute(a, attributes[a]); 
                   }
                };
                var animmode = Services.prefs.getCharPref('image.animation_mode');
                button.setAttribute('anim', animmode);
                button.IsOnce = (animmode == 'once');
    
                function onClick() {
    
                   var button = document.getElementById('animation-button');
                   function setPref(value) {
                      Services.prefs.setCharPref('image.animation_mode', value);
                   };
                   function getPref() {
                      return Services.prefs.getCharPref('image.animation_mode');
                   };
                   function setIsOnce(value) {
                      var windows = Services.wm.getEnumerator('navigator:browser');
                      while (windows.hasMoreElements()) {
                         windows.getNext().document.getElementById('animation-button').IsOnce = value;
                      };
                   };
    
                   switch (event.button) {
    
                      case 0:
                         var animmode = getPref();
                         setPref('normal');
                         if (button.IsOnce) {
                            BrowserCommands.reloadSkipCache();
                            setIsOnce(false);
                         } else {
                            if (animmode == 'normal')
                               BrowserCommands.reloadSkipCache();
                            else
                               BrowserCommands.reload();
                         };
                         break;
    
                      case 1:
                         setPref('once');
                         BrowserCommands.reloadSkipCache();
                         setIsOnce(true);
                         break;
    
                      case 2:
                         setPref('none');
                         event.preventDefault();
                         event.stopPropagation();    
                         BrowserCommands.reload();
                         break;
                   };
    
                   var windows = Services.wm.getEnumerator('navigator:browser');
                   while (windows.hasMoreElements()) {
                      windows.getNext().document.getElementById('animation-button').setAttribute('anim', getPref());
                   };
                };
    
                //button.setAttribute('onclick', '(' + onClick.toString() + ')();');
                button.addEventListener('click', (event) => {
                   onClick();
                });
                return button;
             }
          });
    
       } catch(e) { };
    
       var css =
          '#animation-button[anim="normal"] {list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAoCAYAAAC4h3lxAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4wkNFRE2JfCuMgAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAS6SURBVFjD7ZnNTxtHFMDfm7ENtbGxoV7b2A4gATZ2VEybCyAB5d4qUntLBZcI5dQ/oKcee4l6qBRFgTYqaUqjSFS5tVUrIEJCjQqYDxmIAwUMCV+GxMYfLDs7PQQQjhcKxY03Up60WntmZ/b93pdmdhAAoK2tTQCA9yRJsgEAgoqEUvoCEWc7Ojoet7e3Z/Vjc3Ozh1J6GRE5qFdQluXxgYGBXzjPVFODiB8dKM8Z13JQFwchRAIEjojvNzU1TQHAcgYApZQAAGxXbFeEykKdnHOqJgB30v1H+Xj5b4go6XQ6dxbAwY+UMVWyq92laoudOI9XHg2lzs5OGg6HWX9//0sPwRsmc3Nz1xHxbltbW22GB5REz/TbzhfOP43bxiWOnMRKYhXLpuWGXbJryGdhQkQPANxsaWm5ciyARbRs+Cf8t3QJXeywLWIJWy3WyUnf5NWEJmHME8D2/t2AiJ8dG0LV4ep7R5U/9Mq2frU6Uv1zvsxvsVi+OkwIRJsigDVtjRRtFkWOm6RkoWTasGeI/0cdzlWnrVarCADssMwqPaRj2ZbPLM7ACliBdNaXl+2UhS+FL32t4Zp4rjyiCCBS0XSipWSgIhU1Z1I+WTbtGfPcNj01rdXP1d/IFYQiwGbhpjNpSTqPG/T8wvOaHe3OqZPYkXTM1vxV8yPKyAAAjCvGrcBcoCsXEEQ5SDkJe8KfSoVS0at9aWP63XB5+PKplU845r0j3h7CiXi03bRiWgvMB7oop4nzABwbBtGCqDP4QfCaa8v1sChaFOGE03hp/MKSZenDJE2aTjO5PWV/7B3zfo8yKuaLadm0Vo/1N4OVwWsSSoacAgAAxDQxa0gIfQLC2Se2p+xPvCPeH5DhicluipjW66CuO1gZvMqQGXISQucVW9K26B313iaM7J7m+eJI8dPAQqCLcpp8HQAn1nFb2vakdqy2m0jkTGW2eKn4WWAxcIsCTf1vAAgoX1y92ONOuEeV+oW0MO8d8d4hUmbCnhpisfhZ3d9131Kg6ZwDIKDsX/X3CLNCqGqk6r57xz2RoXxKWPKN+r6j0ulfriTmJXOkJlrzIKcACCj71/x3hFlhBgAAOcpVo1W9roRrEgBA2BWe1I7VdpE9speT5SajYk6q0IHyvjVfrzAjhDLaOcrVI9W9er8+4ph1PKJ7VIQ8yL8ByL51X69txjahCMeRuaZcg3ndM59Ubfwb/l7btG1SzTu0Yz3g2/Dds4WULa+qrxaK65eUY8oesgffhD2yIgDhhJ9346GGHIC3APlK4rQm/c5mzaYzbx+zDHH7uQCiumhV1BH9/G0IvaYQIgAgG7eMa85C54Taqo95xzx75G/WEl3DGItRSouMK8YVz4rnrlotzTlHURQXsks+5/dlWWZqDhPOOTLGfh8aGlrP8sDg4OBGY2PjjYKCglqNRmPknBOVKb+TTqcXh4eH15UXlK8c2TQ0NLj0ev2XL8fySDwe75YkSTV5YTabKwkh3wAAl2X5YRYAIkJra+uvhJDSfQuo6tBj/zhMBgBgjF0nCi4DrVb7BQCI+wOYmq4D5QHgkVar/SnLAwdeaG5udlNKPwaASs65ao5eCSExSZLGS0tLH/T19fF/AGeo9vFEBn4KAAAAAElFTkSuQmCC)} ' +
          '#animation-button[anim="once"] {list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAoCAYAAAC4h3lxAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4wkNFQw22pzCLgAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAATOSURBVFjD7VlvTFtVFD/3vtcWWlpAUkrbDazQkWkilfhl+zAahARNZjIT9QMzkS8EPm+wADMxWdRhsk842cYgbsbExWRqBkMGCwrbPpBsisi/V9rCZsBoHGwPKO277x0/sJqxviKVah/Gk7y89+7Nve/8zvmdc++5jwAAVFRUFCPia4wxGyIS0JDwPC9SSr8tLS0daG1tjeknXq/XSyn9EAAoaFcIIn4RDAZPBoPBjQAB4J2o8owhRdSW5jxPkBBAAHjT5XL1AMDYhn5KaSYAwMGDa7o3XheeB9AWgqkpx/x771sXCCEyIr4YAyD6UPhM2GQyMc1xx+FYsQBYF6JUqq2t5Xw+nzw4OAigcd6rit/vP0UI+ay8vHzvBg+oyeqqMXT7tm1+YiJNIgRYScmq2eP5xWkwhPkUYuAIIcUAcKasrKw6riL375sjJ064/HN3+XC07Zu+9LCnxBw6csRfZDKFUgVi8dHdRAg5HJdC5zryA48rH5UfRvUrly4VBFJl/uzs7JN/5lZCbKoA5heeEkdGDCvxJvnyK+OyKKb/zYgn20pzVqs1AgBy9F0VwFqI3/QjOh0ooRCf8Io9Pu4Ya2t77nvG9OGkrRNqjQYD21Q5SQKalsYSsuTkpHO05bgtQilQjtszUVsrPMvzEcN2AVD13LuY4fFETPEGvfJyyGixbD2Ip6acPzY15zJK1783cF2vdHS4p5PhCVUAhCCpq7tXYMuV9U/2FRUyQ3X13YIEVtKJ5hZbhNKNTu0fMEidne5pxvSRpFMIACDX+iC9tTVQeOuW7eexnwwSAaJ4PCH9/v0Lu4zG1fStTC4IzvGmZluIEFClZN81g0Q592TN28Jenpf0SQUAAGCxiMaqKnFPVVXiE/tmHJONx3JDlMKm8dTba2AE3EJNja+Y4yRdUii0XfHN2H0NDXkipWRLmepqb1r4kwvuKVnWSSkH4A84phsa7EuUApfIuJ6etMiFi4mDSAgAIsHuHve0IOTdV+sPBOy+o0fzxGi2SVS6u9MiFz8tEmSZZ/8AAIJXr7qFri7zcstx+6zgsy1tVD4v0NBoX4wXsFuVK1fS127cKJhLKgBEgr29Rb7OrowVAABZJtjS4gzMzNgeAADMztpnGo85fkdMjDZxd8EhiknJQlHl+/oK/R3nzeLj7bIM2NTsCNTXZRhPf2wREVNTW/B/RZtr/YX+cx2WB2q9skyUj05nLgNAyk4yNrVaf3+h/+xZy0MtV2hxPdA/UORvP6NueS2Jqgfm5qxL7e2WpZ1QI9M43CawQ2THnUr85wCoBrHZLMFbh0MpA5efv0a3BcBqXcw8dGjxhf8p9C9RiAAA3rmTvrJrt21RY2e7MD1t+e2x15gamlcUJUgpfXpoWC8NDTsDGja2IknSTTUKNSqK8lDjTEFZlj+oq6ubjd2tIUJlZWUmY+wlnuddGoyLX8Ph8HfDw8OziAj19fW8IAg3AYBTFGWY4BO/ZPbt27fLaDS+CwCIiPdEUTzPGNNMZGRlZbkopW0AgIqiDMUAIISA1+vto5TmrNcDyGnJHYQQBABlfcsjn6KxBQyCTqdrBoDIowGylq6o8gAwotPpPo/xQNQLBw4c2M1x3KsA4NLSr1dK6UPG2GhOTs7Xly9fxj8A10cIqTl/HS8AAAAASUVORK5CYII=)} ' +
          '#animation-button[anim="none"] {list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAoCAYAAAC4h3lxAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4wkNFRMXW6/c7gAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAATFSURBVFjD7ZlfTFtVHMd/55z+Adrbv7fg5E9L/4hLpg/GkABJwcb4plnilhg18OBC9rQnn3wyZosQJXswIwzQRRBxWcbcMnSaEf6EhMiDjj9hQssmVMV20FG4QHu59x4fRgnQWwTajUviL2nannPPvb/P7/f9/dLTgwAAfD5fLgC8LAhCHgAgUJARQqIIocmampqp6urqpHnk9XpLCCEnEUIUlGtIkqSRvr6+O5Rud1OFEHoz4TxPqRqosjjUGAsIgCKEXqmoqBgHgD+3ARBCMADAO9Goo/Thw1oKQJQEEGbZnvqCgp8RQoJGoylMAkh8eD4Ws2QLAlGadiyrq8VbpVRbW0v8fr/Y29sLAAAYjphNT083IIQ6fD7f8W0ZkLN1jebxDMv+EtDrZwml2M1xjsL5+TLV+rruMBsTQqgEAJoqKyvfSwmwkpPz6LLH0+xXq5c2B41Gf6nFMvZuIHBGG48zhwTweONdhxB6P6WEbtntV7c5v2HD2dn/DBYW3jis8JvN5rrNgkAoTxYgyjDBAZ0umOomHSbT/ZhWu3xAH9Lq0zabjQcAMfFdFoCXifxW0wKIcZVK2O/DQ2az/3ZJyUWJkOVMZUQWQL2+btgtUjwA0QiCaj8Pmjeb79c5nVe6GSb0o8fTmCkIWQATx+WXrq7mp1p0Ohp9IXsfRbxgNk9eKC7+NoaQCABwW6+P/OB2t9AMQMgXMaX41OzsqQJB0O+ceikeZ6uCwZN7jrzJ9OCC09kWw5jfOt7NMKE7bneLhPFKOgApZcBwXP6Hk5Nn/TbbwIROF9RQSl7kuCJXOPyamucNe7l5xGSaqnO5vl5DSLZebjFMiHg8Ta8HAmexKOoyCgAAoF1bs52YnX37xEGatdEY+NTp/GYlhfMJu8EwYepytb4RCJxBkqTLjITStAWjcabe5brCYRzfy/XfGwx/33W7WyjGq88CYNc+vmg0Bj53uVqjGO+rzXYZDHM9Hk8zxXjtaQJIvzkcbSGW/VXWeYPhQb3T2b64o2D3atcZZq7H5fqSYhx7GgDSPYejrZllJ87b7ddCVuvoNs0bDLOfud1fLRISS0d+143G4FR+/s1MA0gjDkf7ZZb9HQBAQEg673B0hq3WMQCAJYMh0OB2t0QwXs9EDcUJ4TPShTadt9s7m1h2YuuggJD0icPReS4rK9iemzu8cEDZpGv/BSCN2e2dTTbbqNykiJB48dix/sPc4OwmITput3c22mxjSt6hpczAeFHR1UspIq8kk81AxGwev5Sbe+8o7JFlAaQn/xPRIwtwlOzIA8gWcRbPZ38QieQfllN5KyvPpQWg5zj3qxx37n8JPSMJYQCQJvX6kNliGVVa95ljmMmtv2CSAERRXCKE6Lt1ur+6nc4OpUaaUop4nv8jSUKU0muSJIlKlgmlFImieHdwcDCclIH+/v5H5eXljVqt9rhKpWIopVhhznOxWGxmaGgoLDePdh7ZlJWVFeTk5Hz8ZC0NLi8vtwqCoJi6MJlMxRjjLwCASpI0kASAEIKqqqqfMMbWjQgo6tBj4zhMAgAQRbEBy6QM1Gr1RwDAbywQlfRKOA8Aw2q1+rukDCSy4PV6CwkhbwFAMaVUMUevGOMlQRBGrFbrza6uLvovNfXp2AJLOUkAAAAASUVORK5CYII=)}';
       var stylesheet = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"');
       document.insertBefore(stylesheet, document.documentElement);
    
    })();
    Alles anzeigen

    force-contextmenu.uc.js (Kontextmenü durch Seite ändern lassen oder nicht)

    JavaScript: force-contextmenu.uc.js
    (function() {
    
       if (location != 'chrome://browser/content/browser.xhtml')
          return;
    
       try {
          CustomizableUI.createWidget({
             id: 'contextmenu-button',
             type: 'custom',
             defaultArea: CustomizableUI.AREA_NAVBAR,
             onBuild: function(aDocument) {
                var button = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
                var attributes = {
                   id: 'contextmenu-button',
                   class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                   removable: 'true',
                   label: 'Rechtsklick Kontextmenu',             
                   tooltiptext: Services.prefs.getBoolPref('dom.event.contextmenu.enabled') ?
                      'Kontextmenu kann manipuliert werden' : 'Kontextmenu kann nicht manipuliert werden',
                   oncommand: '(' + onCommand.toString() + ')()'
                };
                for (var a in attributes) {
                   //button.setAttribute(a, attributes[a]);
                   if(a === "oncommand") {
                         button.addEventListener('command', function(event) { Function(attributes[a])(); });
                   } else if(a === "onclick") {
                         button.addEventListener('click', function(event) { Function(attributes[a])(); });
                   } else if(a === "onmouseup") {
                         button.addEventListener('mouseup', function(event) { Function(attributes[a])(); });
                   } else if(a === "oncontextmenu") {
                         button.addEventListener('contextmenu', function(event) { Function(attributes[a])(); });
                   } else {
                         button.setAttribute(a, attributes[a]); 
                   }
                };
                function onCommand() {
                   var isEnabled = !Services.prefs.getBoolPref('dom.event.contextmenu.enabled');
                   Services.prefs.setBoolPref('dom.event.contextmenu.enabled', isEnabled);
                   var windows = Services.wm.getEnumerator('navigator:browser');
                   while (windows.hasMoreElements()) {
                      let button = windows.getNext().document.getElementById('contextmenu-button');
                      if (isEnabled)
                         button.setAttribute('tooltiptext', 'Kontextmenu kann manipuliert werden')
                      else
                         button.setAttribute('tooltiptext', 'Kontextmenu kann nicht manipuliert werden');
                   };
                };
                return button;
             }
          });
       } catch(e) { };
    
       var css =
          '#contextmenu-button[tooltiptext="Kontextmenu kann manipuliert werden"] {list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAkhJREFUeNqUU0toU0EUPfN5n0RTI1ip6EoJpQtRBCu4qVQouFIJoVap4EKtuOsiuCriRgSxG63iRqRqBY1UXYggiliU6q4rP7hooBJJE4nUxr68N+Od13ylFbxw38zcmXvuuZ/Htl98/qPsBfGK0tBao1kYAwR9LMHzjuQbJeehrVmkcf4ycgD/kqmv8+2D4+/vxVx51PoLRJrIRp58yoFVoxoiivYHOzvgDmfw+0oSt47tHjhx9wNrc+WAFBw1DF6j7UqBqEUqZbhGJA/tJoVyoLAv0Y7xwe4jS7562JyqrG1ccuD02CCba1VldmrvVmxIT8Kn89JoEl6gkhFyU4y3AjiGVhXAiOIa2VIZo8mdodYkINwKt6BsBwETDQBbiDD/GoCJX1j0ME8aWulyV0cMFWHjlxvDxFgPPOm0psBW7AFZqS6MIhpZXLOenHvx043DFxZ4IwVGLFi41pVAXddCpM1B7lIaDzZbuH29FyUR0WWIsYDqUGcQdeRyG5uDc6qJa+Pz+XOwXk0idfY0UXWpEArTb96dyc19Z3WAt7NF87510rgA1q6Dd/MyUsdTQKkAXfTBKKU9OzrxaHZuSLJGsLDnrQB0MJNHiv2HgL7+BsOXGejHLyBZ1SPsPX2ZbkIw46gVOWmo+9egJq7SfCgiJsAtG4xWKfmyw+GuTav+C9n0CKbv3EB31xZYNLG+9jH1MY+iQkZalYXXiQvPesykaegVW+hH+9Cf+IbCzFN43A5TK1aCzMmZ7LAJv400jv+XvCH3R4ABADkKvfJiBGzqAAAAAElFTkSuQmCC)} ' +
          '#contextmenu-button[tooltiptext="Kontextmenu kann nicht manipuliert werden"] {list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYlJREFUeNpi/P//P4Nex67333/9Ffj97z8DiI8MGBkZGJiBBCsz0+ubtZ5iMHG4OhBDpXHbf0Lg8J3X/xXqty5DNgCEWUAckM0gsOnmCwZGqK0gC/4B2f7qEgwcRWsZfvQFM8yPNo1MZNjK+KDROxJmEAuyczhYmIHOBRoAhEDzGf5CxUFe+P73H4ODqijD4liziBSW7axA4RC4ATDAwcLEwMTICHYFSOs/qMvSrJQYRMo2MPwB8n/2BzP8/vsvGMUFMMDOzAR0PsQAEPjH9J/h0cfvDP3BBmAMA3+QAhrFADZmZrD/YQaAlL399ovhzddfcDVGUvwQCWwGgLzAyIAJ/jNAAhUbQPMCRDsuQwgawMXOAolGXK4gZMCxh++AsQBJBxgGgNIFEAdpSWIaAFPPBE22WA1AIhkxDIDqAMc9kGT8z4jFgP9wLzAi2QA2gIUJIhCoKclADICphxvA+vvLQdWm7faglPYfZ3hDkjhIM0g9XAyUD4BOUgayBRiIBx+A+u6CGAABBgBmFq9IdRyTmAAAAABJRU5ErkJggg==)} ';
       var stylesheet = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"');
       document.insertBefore(stylesheet, document.documentElement);
    
    })();
    Alles anzeigen

    media.mediasource.uc.js

    JavaScript: media.mediasource.uc.js
    (function() {
    
      var browser_chrome = 'chrome://browser/content/browser.xhtml';
    
       if (location != browser_chrome)
          return;
    
       try {
          CustomizableUI.createWidget({
             id: 'mediasource-enabled-button',
             type: 'custom',
             defaultArea: CustomizableUI.AREA_NAVBAR,
             onBuild: function(aDocument) {
                var button = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
                var attributes = {
                   id: 'mediasource-enabled-button',
                   class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                   removable: 'true',
                   label: 'media.mediasource',               
                   tooltiptext: Services.prefs.getBoolPref('media.mediasource.enabled') ?
                      'media.mediasource ist aktiviert' : 'media.mediasource ist deaktiviert',
                   oncommand: '(' + onCommand.toString() + ')()'
                };
                for (var a in attributes) {
                   //button.setAttribute(a, attributes[a]);
                   if(a === "oncommand") {
                         button.addEventListener('command', function(event) { Function(attributes[a])(); });
                   } else if(a === "onclick") {
                         button.addEventListener('click', function(event) { Function(attributes[a])(); });
                   } else if(a === "onmouseup") {
                         button.addEventListener('mouseup', function(event) { Function(attributes[a])(); });
                   } else if(a === "oncontextmenu") {
                         button.addEventListener('contextmenu', function(event) { Function(attributes[a])(); });
                   } else {
                         button.setAttribute(a, attributes[a]); 
                   }
                };
                function onCommand() {
                   var isEnabled = !Services.prefs.getBoolPref('media.mediasource.enabled');
                   Services.prefs.setBoolPref('media.mediasource.enabled', isEnabled);
                   event.target.ownerGlobal.BrowserCommands.reload();
                   var windows = Services.wm.getEnumerator('navigator:browser');
                   while (windows.hasMoreElements()) {
                      let button = windows.getNext().document.getElementById('mediasource-enabled-button');
                      if (isEnabled)
                         button.setAttribute('tooltiptext', 'media.mediasource ist aktiviert')
                      else
                         button.setAttribute('tooltiptext', 'media.mediasource ist deaktiviert');
                   };
                };
                return button;
             }
          });
       } catch(e) { };
    
       var css =
          '#mediasource-enabled-button[tooltiptext="media.mediasource ist aktiviert"] {list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIGSURBVDhPY2RAA4KCgkp2dnbl8vLydgICAkogsQ8fPtx7+PDhISDofP/+/T2wQihAMcDX13eunq5u0ssfvxm2x3RDRSHAc0kpgzgHK8Oly5fnbd68ORkqjDAgKSnpAisPr/6WhIlQEezAZ0E+w+8vny/OmzfPAMRnBhEeHh5z+UTEPLclTwZx8YJbBicZVC5aSYiLCMvduXNnExMfH5+SqopK0o7UqVAlhMFOoFqQHpBeJiMjo/Ln335CpRAgZns7Q/iSIigPE4D0gPQyiYmJ2R3PmQ0VRoAP7z8wvHjxgsGwJRgqggpAekB6mTg5OcFRhQ6A0cXw7t07hq/v3zHoV3syOPTHQWUQAKSX6e/fv1AuKjh48CADMN4ZLl26BHbJj58/oDIIANLL9OnTJ5SEAQPARMQgLS3NwCcqxvBy7nmGExWroDIIANLLBDT9kHZbOFQIAcTERBlk5OUZfi27DhVBBSA9IL1M165d6xRg/AcVRoB7LVsYbnXtgfIwAUgPSC/Tly9f7j14+HCeToM/VIowAKkF6QHphSdlNze3CwzsHPpXGzdBRbAD7Xo/BoafPy7u2rULnJRRMpOJiclceTm5pHfAiLlVvw4qCgFqjUEMQsCE//DRo3lnzpzBzEwwwM3NraShoVEuLCxsB2KDxL5+/Xrv7du3h27cuNEJYoMVggEDAwAplchp9LL2uwAAAABJRU5ErkJggg==)} ' +
          '#mediasource-enabled-button[tooltiptext="media.mediasource ist deaktiviert"] {list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QgVChcoe9onUQAAAvBJREFUOMttk09M22UYxz+/931b+kcg1FEoZAmWbGOSuCVOjR6IXnfzQGnCDeLBG4lpCJBAIAEye+CqB6qXJrTcPGjMolnINCbOxDl1soQyFKms0lrH1tHf731fD7SdLj7Jk/fwPt+83+/nzePQqIWFBRYXF1leXo5ba6ettSPW2jiA4zgFx3G2HMe5Njc3V2jOAjgAs7OzrKysMD8/v649b+LwxGPocIeB0n0A7ncP8EvPINE2hVIqs7S0NNnUOKlUinQ6zczMzPflR7VLLxfvMrH9JdJzMUICIIzGSB8fXXiTb/uGiYSDt1dXVy+nUqlTB6lUav3o0eOJyR8+5Y3ybkv4bAmj+TryAusvXeX5cCiTTqcnnampqbj2vJ2Lv9/l3e0vMEIh6l4jHE9PC9onkUbz4bm3+OnsMFKpQeV53nTx8QlrhZsYIRF1j/TUBxxVKvxVqVCr1bDWctIWIvfZ+xgleWf3JmNnztEbZFq5rjsyXN5Duict609qNZ48+IOHpRLHx8dYa3EDYRCNKJ7Li0d7HPYMjCjXdePxo32MaN7C/sEB9WqVSqVCtVpFSokO6RYLIySDf/7KfqQ/rrTW2P+Qgjt3fqS8V6BYLGKtJRaL8VzM95QHYLForVHGmMK99p4hcfTzaQQL7e3t2K4uhBBYa+no6KAtHIbSKVRhNNudfRhjCsoYs/VdKDqk/QEczwUL/jNRAvU6JtwBQDAYREW6YbfxuvJxK9RN1JgtZ3x8PO7W6zuvPjzgvd++QjsS6ekWsH95RkuJtIa1/tf4pvMsPr9/UGSz2YKQMnPd382NcD/SGoySGPFMN8Q3wn18HuhFSJnJZrMFmUwm2djY+OTK5UtvX2+L9j4IR3i9dojQLtZxAAdhNUgfa32v8HHnebpCgdu5XO5qMpk85To2NkYulyORSKxrz5soa7hSK3H+7yJYuNcZ41YoSkRYpFKZfD4/2dS0PiaRSJDP5xkdHY0D/7vOwLXNzc1CcxbgH/lpXYTK63B1AAAAAElFTkSuQmCC)} ';
       var stylesheet = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"');
       document.insertBefore(stylesheet, document.documentElement);
    
    })();
    Alles anzeigen
  • userChrome.js Scripte für den Fuchs (Diskussion)

    • bege
    • 3. Mai 2025 um 01:54

    In der letzten Version des Skripts "ExtensionOptionsMenu.uc.js" bei Endor funktionieren im Fx 138 die oberen drei Buttons nicht mehr. Die Hauptfunktionen für die Add-ons funktionieren.

    Im Skript gibt noch "on..."-Attribute von Elementen. Die Fehlerkonsole wirft für die Zeilen 132 und 202 entsprechende Fehler aus, wo diese Attribute verarbeitet werden.

    Außerdem in Zeile 144 ein "onclick"-Attribut.

    Obwohl es mir in einigen anderen Skripten mit den Hinweisen hier im Forum gelungen ist, passende Eventhandler hinzuzufügen, gelingt mir das bei diesem Skript an keiner Stelle.

    Wer kann helfen?

    Edit:

    Alte Zeile 132 ersetzen durch

    JavaScript
    if(a === "oncontextmenu") {
       toolbaritem.addEventListener('contextmenu', function(event) {  	Function(attributes[a])(); });
    } else {
       toolbaritem.setAttribute(a, attributes[a]); 
    }

    alte Zeile 203 ersetzen durch

    JavaScript
            if(n === "oncommand") {
                el.addEventListener('command', function(event) { Function(attr[n])(); });
            }
            else if(n === "onclick") {
                el.addEventListener('click', function(event) { Function(attr[n])(); });
            }
            else if(n === "onmouseup") {
                el.addEventListener('mouseup', function(event) { Function(attr[n])(); });
            }
            else {
                el.setAttribute(n, attr[n]); 
            }
    Alles anzeigen

    alte Zeile 144 ersetzen durch

    JavaScript
    		mp.addEventListener('click', (event) => {
    			event.preventDefault(); event.stopPropagation();
    		});
  • Entwicklung Firefox

    • bege
    • 10. April 2025 um 12:04
    Zitat von Sören Hentzschel

    Das Thema CSP und das Anpassen von Inline-Event-Handlers war in den letzten Wochen und Monaten in Zusammenhang mit den Scripts ja relativ präsent in diesem Forum. Wer sich etwas für die Hintergründe interessiert, wieso Mozilla das gemacht hat (Mozilla selbst musste über 600 Inline-Event-Handler umstellen!), bekommt in Mozillas Sicherheits-Blog etwas Lesematerial:

    https://attackanddefense.dev/2025/04/09/har…y-policies.html

    Danke, Sören!

    Ich habe in dem Text nicht verstanden, warum die Inline Eventhandler entfernt wurden. Dort steht doch, dass sie mit einer CSP gegen Missbrauch abgesichert werden können. Ich habe da noch eine Verständnislücke.

Unterstütze uns!

Jährlich (2025)

101,9 %

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

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