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

Beiträge von BarbaraZ-

  • In memoriam

    • BarbaraZ-
    • 4. November 2026 um 16:15

    Jepp, das mit Janosch auch gerade gelesen.

    "Bremen ist meine Lieblingsstadt" – Zum Tod des Zeichners Janosch - buten un binnen
    Der Erfinder von Tigerente, Tiger und Bär ist mit 95 Jahren gestorben. Er hatte eine besondere Beziehung zu Bremen und verbrachte einige Jugendjahre im…
    www.butenunbinnen.de
  • Seiten-Ladefehler

    • BarbaraZ-
    • 28. Oktober 2026 um 16:43

    Hier auch kein Problem.

  • extra_Config_menu zeigt das Icon nicht an.

    • BarbaraZ-
    • 28. Oktober 2026 um 16:32

    Jepp, jetzt klappt es. Danke. Muss nur noch sehen, den Base64 Code rauszubekommen und mich stören optisch da ganz am Ende: "Einstellungen" und "Neustart".

  • extra_Config_menu zeigt das Icon nicht an.

    • BarbaraZ-
    • 28. Oktober 2026 um 16:24

    Hallo Mira,
    ich hatte es ja so übernommen, wie du es mir im Beitrag #6 angeboten hast.

    Als dieses nicht klappte, habe ich das warpmenuto, was vorher notwenig war eingefügt. Also erst im Nachgang.
    Und schon mal herzliehcne Dank andich und allen anderen, die die Geduld hier aufbringen.

  • extra_Config_menu zeigt das Icon nicht an.

    • BarbaraZ-
    • 28. Oktober 2026 um 16:14

    So, ich habe jetzt so übernommen für "TextOpenexe: und vFileManager:" mit meinen Anpassungen. Irgendwas ist immer noch unrund, denn in Zeile 47 muss irgendwie noch das warpmenuto eingebaut werden, damit das Script auch weiss, wo das Icon platziert werden muss.

    Habe es versucht klappt aber nicht. Das aktuelle Script sieht so aus:

    JavaScript
    // ==UserScript==
    // @name           extras_config_menu.uc.js
    // @compatibility  Firefox 159*.*
    // @include        main
    // @version        1.0.20261027
    // @edit           @aborix 7/21 CSS Dateien als Untermenü eingefügt
    // @edit           @2002Andreas 8/21 Shadow CSS Dateien als Untermenü + Ordner eingefügt
    // @edit           @BrokenHeart 1/25 Anpass. wg. Änderung der Sicherheitsrichtlinien bei 'inlineEvents'
    // @edit           @Mira 8/26 Anpass. f. security.allow_unsafe_dangerous_privileged_evil_eval = false
    // @edit           @Mira 8/26 Anpass. f. Userscripte im Unterordner "chrome/scripts", Expliziter Ausschluss von "userChromeShadow.uc.js"
    // @edit           @Mira 8/26 Anpass. zum Ausschluss von "userChromeShadow.uc.js", lässt sich auswählen
    // @edit           @Mira 8/26 Anpass. f. "Skriptliste in Zwischenablage"
    // @edit           @Mira 8/26 1. Altlast "warpmenuto: 'helpMenu'" ersetzt durch die Auswahl, ob ein Button oder ein Menü erstellt werden soll.
    // @edit           @Mira 8/26 2. Das komplette CSS entsorgt! Code für Button ergänzt.
    // @edit           @Mira 8/26 Skript entrümpelt! Code für "Bild Url" & "config Einträge.css" sowie "Einbindung GM-Skripte-Ordner" entfernt.
    // @edit           @Mira 8/26 Anpass. f. den Button. Auswahl für flexibles SVG-Icon oder festes Base64-PNG-Icon hinzugefügt
    // @edit           @Mira 8/26 Anpass. f. den Skriptordner. Ordner kann jetzt ausgewählt, bzw. benannt werden.
    // @edit           @Mira 11/26 Aufruf "if (window.__SSi == "window0")" korrigiert!
    // @Source         https://www.camp-firefox.de/forum/thema/140829/?postID=1296710#post1296710
    
    // ==/UserScript==
    
    /* ----------------------------------------------------------------------------------- */
    /*     Zu beachten ist, dass die Grafiken sich im richtigen Ordner befinden müssen     */
    /*            %appdata%\Mozilla\Firefox\Profiles\"Profilname"\chrome\icons             */
    /* ----------------------------------------------------------------------------------- */
    
    /* ----------------------------------------------------------------------------------- */
    /*  IMPORTANT!         This script was edited and modified using AI.                   */
    /* ----------------------------------------------------------------------------------- */
    
    'use strict';
    
    var uProfMenu = {
      // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      // Hier kann der Pfad zum einem Texteditor eintragen werden 
      // (unter Ubuntu 10.04 z.B.: '/usr/bin/gedit'). Bei Fehleintrag wird view_source.editor.path ausgelesen:
      //TextOpenExe: 'E:\\Notepad++\\notepad++.exe',
      TextOpenExe: 'E:\\Notepad++\\notepad++.exe',
      // Falls gewuenscht, in Zeile 18 einen Dateimanager eintragen (komplett leer lassen fuer Dateimanager des Systems) Beispiele:
      // vFileManager: 'C:\\Programme\\TotalCommander\\Totalcmd64.exe',
      vFileManager: 'C:\\Programme\\TotalCommander\\Totalcmd64.exe',
      // In der folgenden Zeile kann festgelegt werden, ob ein verschiebbarer Button erstellt wird:
      showAsButton: 1,  // 1: ja / Button wird erstellt, 0: nein / Menue unter "Extras"
      // In der folgenden Zeile (24) 'menu' eintragen, damit es unter "Extras" als Menue erscheint, sonst die id des gewuenschten Elements *nach* dem der Button erscheinen soll (z.B. 'urlbar', 'searchbar', 'undoclosetab-button','abp-toolbarbutton')
      // Bitte nicht so etwas wie die Menue- oder Navigationsleiste (sondern einen Menuepunkt oder einen Button mit id auf diesen Leisten) eintragen:
     warpmenuto: 'helpMenu', 
     // Unter Linux sollte/kann versucht werden, die userChromeJS-Skripte zu sortieren, unter Windows ist das evtl. nicht noetig (die Sortierung wird Gross- und Kleinschreibung *nicht* beruecksichtigen - dazu wird die sort()-Funktion entsprechend mit einer Vergleichsfunktion aufgerufen)
      sortScripts: 0,   // 1 zum Erzwingen der Sortierung
      // Zeigt die Datei userChromeShadow.uc.js falls vorhanden in der Skriptliste an (1: ja, 0: nein):
      showuCS: 0,  // Default => 0
      // Einbindung CSS-Ordner (0: nein, 1: UserCSSLoader-Ordner im Chrome-Verzeichnis):
      cssOrdner: 1,
      // Falls Javacripte sich nicht nur im chrome-Verzeichnis, sondern auch in einem Unterverzeichnis befinden, 
      // hier den Ordnernamen des Unterverzeichnises eintragen.
      // Sonst: '' , es werden dann nur die Skripte aus dem chrome-Verzeichnis angezeigt
      jsSubfolder: 'scripts',
      // Nachfolgend gueltige about:Adressen eintragen, die ebenfalls aufgerufen werden sollen oder
      // zum Ausblenden: abouts: [],
      // Damit die about:-Seiten nicht als Untermenue, sondern direkt als Menuepunkte aufgefuehrt werden, muss das erste Element '0' sein:
      // Zum Beispiel so: abouts: ['0','about:about','about:addons','about:cache','about:config','about:support'],
      abouts: ['about:about','about:addons','about:cache','about:config','about:crashes',
               'about:downloads','about:home','about:logins','about:memory','about:support',
               'about:preferences','about:performance','about:profiles'
              ],
      // Die normalen Firefox-Einstellungen auch zur Verfuegung stellen (0: nein, 1: ja):          
      showNormalPrefs: 1,
      // Stellt "Skriptliste in Zwischenablage" zur Verfuegung (1: ja, 2: mit getrennter Nummerierung, 3: mit gemeinsamer Nummerierung) oder nicht (0):
      enableScriptsToClip: 2,
      // Um den Eintrag "Neustart" zu erzwingen (falls z.B. das andere Skript zu spaet eingebunden und nicht erkannt wird), auf 1 setzen:
      enableRestart: 1,
      // Button-Aussehen (1: flexibles SVG-Icon aus Icon-Ordner, 0: festes Base64-PNG-Icon):
      buttonStyle: 1,  // Default => 0
      // Symbol (Icon) nur fuer Button:
            icon: 'pencil.png',         // [Name.Dateiendung] des Symbols
      iconColour: '#FF00FF',        // Farbe fuer das SVG-Icon setzen (leer fuer Originalfarbe)
        iconPath: '/chrome/icons/',   // Pfad zum Ordner der das Icon beinhaltet
    
      // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    
    
      // --- INIT (ANGEPASST) ---
      init: function() {
        // Profil-URI und Icon-URL einmalig bereitstellen
        var curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));
        var iconUrl = curProfDir + this.iconPath + this.icon;
        var iconColour = this.iconColour;
        var buttonStyle = this.buttonStyle;
    
        if (this.showAsButton) {
          // als verschiebbaren Button anlegen
          // if (window.__SSi == "window0") {
          if (window.gBrowser && !CustomizableUI.getWidget("ExtraConfigMenu-button")) {
            CustomizableUI.createWidget({
              id: "ExtraConfigMenu-button",
              defaultArea: CustomizableUI.AREA_NAVBAR,
              label: "Extra Config Menü",
              tooltiptext: "Extra Config Menü\nRechtsklick öffnet about:config",
    
              onCreated: function(button) {
                // Optik direkt am Button-Element setzen
                if (buttonStyle) {
                  // flexibles SVG-Icon aus dem Icon-Ordner
                  button.style.MozContextProperties = 'fill, stroke, fill-opacity';
                  button.style.listStyleImage = 'url("' + iconUrl + '")';
                  if (iconColour) {
                    button.style.color = iconColour;
                  }
                } else {
                  button.style.listStylemage: =        url("file:///C:/Users/Barbaraz-/AppData/Roaming/Mozilla/Firefox/Profiles/zex9etk7.default/chrome/Icons/pencil.png"); 		
              }
    
    
            });
          }
          var menu = document.getElementById("ExtraConfigMenu-button");
    
          // KORREKTUR:
          if (!menu) {
            return;
          }
    
          menu.setAttribute("type", "menu");
          // Dropmarker ausblenden (ersetzt ehemaliges CSS-Stylesheet)
          menu.querySelectorAll("dropmarker, .toolbarbutton-menu-dropmarker").forEach(function(d) {
            d.style.display = "none";
          });
          menu.addEventListener('click', function(event) {
            if (event.button == 2 && !this.open) {
              openTrustedLinkIn("about:config", "tab");
              event.preventDefault();
            }
          }, true);
        } else {
          var zielmenu = document.getElementById('menu_ToolsPopup');
          // da showAsButton nicht gesetzt ist, als Untermenue von Extras anlegen
          if (zielmenu == null) {
            userChrome.log("extras_config_menu.uc.js findet Zielmenue nicht, evtl. weil ein anderes Fenster als das Hauptfenster geoeffnet wurde.");
            return;
          }
          var menu = zielmenu.appendChild(this.createME("menu", "Extra Config Men\u00FC", null, 0, "ExtraConfigMenu"));
          menu.setAttribute("class", "menu-iconic"); 
    
          // Ersetze ondblclick durch addEventListener
          menu.addEventListener('dblclick', function() {
            openTrustedLinkIn('about:config', 'tab');
          }, true);
        }
    
        let sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);       
        let uri = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
    
    		/*--------------------------------------------------------------------------*/	
    		/*------------------- Einige Menüeinträge ausgeblendet ---------------------*/
    		/*--------------------------------------------------------------------------*/
    
        #submenu-CSSShadow,
    
        menuitem.uProfMenu_folder[label="CSSShadow-Ordner"]
        {
          display: none !important;
        }
          `), null, null);
          sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
        /*
        #submenu-cssweb,
        menuitem.uProfMenu_folder[label="CSSWeb-Ordner"]
        */
        // Menü-Popup erstellen
        var menupopup = menu.appendChild(this.createME("menupopup", null, null, 0, "ExtraConfigMenu-popup"));
    
        // Event-Listener für popupshowing (unchanged, aber sicher)
        menu.addEventListener('popupshowing', function(event) {
          uProfMenu.getScripts(0);
          uProfMenu.getCss(3);
          uProfMenu.getCss(4);
          uProfMenu.getCss(5);
        }, true);
    
        // --- UNTERMENÜS (unchanged) ---
        var submenu = menupopup.appendChild(this.createME("menu", "Meine Scripte", null, 0, "submenu-ucjs"));
        // Anlegen von Untermenues fuer userChromeJS-Skripte und CSS-Dateien (befuellen spaeter)
        var submenupopup = submenu.appendChild(this.createME("menupopup", null, null, 0, "submenu-ucjs-items"));
        var submenu = menupopup.appendChild(this.createME("menu", "css", null, 0, "submenu-css"));
        var submenupopup = submenu.appendChild(this.createME("menupopup", null, null, 0, "submenu-css-items"));
        var submenu = menupopup.appendChild(this.createME("menu", "CSSShadow", null, 0, "submenu-CSSShadow"));
        var submenupopup = submenu.appendChild(this.createME("menupopup", null, null, 0, "submenu-CSSShadow-items"));
        var submenu = menupopup.appendChild(this.createME("menu", "cssweb", null, 0, "submenu-cssweb"));
        var submenupopup = submenu.appendChild(this.createME("menupopup", null, null, 0, "submenu-cssweb-items"));
        // Ende Anlegen von Untermenues
    
        // Skriptliste in Zwischenablage (ANGEPASST: sCommand als Funktion)
        if (this.enableScriptsToClip) {
          menupopup.appendChild(this.createME(
            "menuitem",
            "Skriptliste in Zwischenablage",
            function() { uProfMenu.getScripts(1); },
            "uProfMenu_clipboard",
            0
          ));
        }
    
        menupopup.appendChild(document.createXULElement('menuseparator'));
    
        // --- KONFIGDATEIEN (ANGEPASST: sCommand als Funktion) ---
        // Einbindung von Konfigdateien
    
        menupopup.appendChild(this.createME(
          "menuitem", "userChrome.css",
          function() { uProfMenu.edit(0, 'userChrome.css'); },
          "uProfMenu_edit", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "userChromeShadow.css",
          function() { uProfMenu.edit(0, 'userChromeShadow.css'); },
          "uProfMenu_edit", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "userContent.css",
          function() { uProfMenu.edit(0, 'userContent.css'); },
          "uProfMenu_edit", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "userChrome.js",
          function() { uProfMenu.edit(0, 'userChrome.js'); },
          "uProfMenu_edit", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "prefs.js",
          function() { uProfMenu.edit(1, 'prefs.js'); },
          "uProfMenu_edit", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "user.js",
          function() { uProfMenu.edit(1, 'user.js'); },
          "uProfMenu_edit", 0
        ));
        // Ende Einbindung von Konfigdateien
        
        menupopup.appendChild(this.createME(
          "menuitem", "CSS-Ordner",
          function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm') + uProfMenu.getDirSep() + 'css'); },
          "uProfMenu_folder", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "CSSShadow-Ordner",
          function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm') + uProfMenu.getDirSep() + 'CSSShadow'); },
          "uProfMenu_folder", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "CSSWeb-Ordner",
          function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm') + uProfMenu.getDirSep() + 'CSSWeb'); },
          "uProfMenu_folder", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "Chromeordner",
          function() { uProfMenu.prefDirOpen('UChrm'); },
          "uProfMenu_folder", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "Profilordner",
          function() { uProfMenu.prefDirOpen('ProfD'); },
          "uProfMenu_folder", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "Icons-Ordner",
          function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm') + uProfMenu.getDirSep() + 'Icons'); },
          "uProfMenu_folder", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "Installationsordner",
          function() { uProfMenu.prefDirOpen('CurProcD'); },
          "uProfMenu_folder", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "Addonordner",
          function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD') + uProfMenu.getDirSep() + 'extensions'); },
          "uProfMenu_folder", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "Startup-Cacheordner",
          function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfLD') + uProfMenu.getDirSep() + 'startupCache'); },
          "uProfMenu_folder", 0
        ));
        // Ende Einbindung von Ordnern
    
        // --- ABOUT-SEITEN (ANGEPASST: Closure-Problem gelöst) ---
        // Einbindung von abouts
        if (this.abouts.length > 0) {
          menupopup.appendChild(document.createXULElement('menuseparator'));
          // falls der erste Eintrag des Arrays = '0' ist, dann kein Untermenue anlegen, sondern direkt als Menuepunkte einbinden
          if (this.abouts[0] == '0') {
            for (var i = 1; i < this.abouts.length; i++) {
              (function(index) {
                var about = uProfMenu.abouts[index];
                menupopup.appendChild(uProfMenu.createME(
                  "menuitem", about,
                  function() { openTrustedLinkIn(about, 'tab'); },
                  "uProfMenu_about", 0
                ));
              })(i);
            }
          } else {
            // der erste Eintrag des arrays ist ungleich '0', deshalb als Untermenue einrichten
            var submenu = menupopup.appendChild(this.createME("menu", "uc.js", null, 0, "submenu-about"));
            var submenupopup = submenu.appendChild(this.createME("menupopup", null, null, 0, "submenu-about-items"));
            this.fillMenu("submenu-about", "submenu-about-items", "about:", this.abouts, "uProfMenu_about", 1);
          }
        }
        // Ende Einbindung von abouts
        // Separator, falls dieser nicht schon durch abouts generiert wurde und weitere Menuepunkte folgen werden
        // --- EINSTELLUNGEN & NEUSTART (ANGEPASST) ---
        if (this.abouts.length == 0 && (this.showNormalPrefs || typeof(ToolRstartMod) != "undefined")) {
          menupopup.appendChild(document.createXULElement('menuseparator'));
        }
        // Falls gewuenscht (s. Konfigurationsabschnitt), Zugriff auf die normalen Einstellungen
        if (this.showNormalPrefs) {
          menupopup.appendChild(this.createME(
            "menuitem", "Einstellungen",
            function() { try { openOptionsDialog(); } catch(e) { openPreferences(); } },
            "uProfMenu_prefs", 0
          ));
        }
        // Falls addRestartButton installiert ist, Neustart zur Verfuegung stellen (addRestartButton 1.0.20120105mod erforderlich)
        if (this.enableRestart) {
          menupopup.appendChild(this.createME(
            "menuitem", "Neustart",
            function() {
              Services.appinfo.invalidateCachesOnRestart();
              Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit, 0);
            },
            0, 0
          ));
        }
      },
    
      // --- HILFSFUNKTIONEN (unchanged) ---
      // Betriebssystem nach https://developer.mozilla.org/en/Code_snippets/Miscellaneous ermitteln
      getDirSep: function() {
        var osString = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS;
        var dirsep = "/";
        switch(osString) {
          case "WINNT": dirsep = "\\"; break;
          case "Linux": dirsep = "/"; break;
          case "Darwin": dirsep = "/"; break;
        }
        return dirsep;
      },
    
      // --- EDIT (changed by Mira) --- 
      edit: function(OpenMode, Filename) {
        var Path = "";
        var dSep = this.getDirSep();  // die Trennzeichen zwischen Ordnern abhaengig vom Betriebssystem machen
    
        // --- Pfad-Handling für chrome/scripts/ ---
        if (Filename.includes("/") || Filename.includes("\\")) {
          Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename;
        } else {
          // Original-Logik
          switch (OpenMode) {
            //Current is Chrome Directory
            case 0: Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename; break;
            //Current is Profile Directory
            case 1: Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename; break;
            //Current is Root
            case 2: Path = Filename; break;
            //Current is CSS folder
            case 3: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSS" + dSep + Filename; break;
            //Current is CSSWeb folder
            case 4: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSWeb" + dSep + Filename; break;
            //Current is CSSShadow folder
            case 5: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSShadow" + dSep + Filename; break;
          }
        }
        this.launch(this.TextOpenExe, Path);
      },
    
      dirOpen: function(Path) {
        if (this.vFileManager.length != 0) {
          var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
          var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
          var args = [Path];
          file.initWithPath(this.vFileManager);
          process.init(file);
          // Verzeichnis mit anderem Dateimanager oeffnen
          process.run(false, args, args.length);
        } else {
          // Verzeichnis mit Dateimanager des Systems oeffnen
          var dir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
          dir.initWithPath(Path);
          dir.launch();
        }
      },
    
      prefDirOpen: function(prefDir) {
        var Path = this.getPrefDirectoryPath(prefDir);
        this.dirOpen(Path);
      },
    
      getPrefDirectoryPath: function(str) {
        // get profile directory
        var file = Components.classes["@mozilla.org/file/directory_service;1"]
          .getService(Components.interfaces.nsIProperties)
          .get(str, Components.interfaces.nsIFile);
        if (str == 'CurProcD') file = file.parent;
        return file.path;
      },
    
      launch: function(RanPath, OpenPath) {
        var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
        var proc = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
        var args = [OpenPath];
        file.initWithPath(RanPath);
        // falls der im Konfigurationsabschnitt definierte Editor nicht gefunden wird, auf Einstellung in about:config ausweichen:
        if (!file.exists()) {
          var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
          RanPath = pref.getCharPref("view_source.editor.path");
          file.initWithPath(RanPath);
        }
        proc.init(file);
        proc.run(false, args, args.length);
      },
    
      stringComparison: function(a, b) {
        a = a.toLowerCase().replace(/ä/g,"a").replace(/ö/g,"o").replace(/ü/g,"u").replace(/ß/g,"s");
        b = b.toLowerCase().replace(/ä/g,"a").replace(/ö/g,"o").replace(/ü/g,"u").replace(/ß/g,"s");
        return (a == b) ? 0 : (a > b) ? 1 : -1;
      },
    
      // --- GETSCRIPTS (changed by Mira) ---
      getScripts: function(iType) {
        // Array nimmt Namen der gefundenen Skripte auf
        let ucJsScripts = [];
        // Suchmuster, also die Dateierweiterungen uc.js
        let extjs = /\.uc\.js$/i;
    
        // --- 1. Standard-UChrm-Ordner durchsuchen (ohne userChromeShadow.uc.js) ---
        let uchrmFolder = Services.dirsvc.get("UChrm", Ci.nsIFile);
        if (uchrmFolder.exists()) {
          // files mit Eintraegen im Chrome-Ordner befuellen
          let files = uchrmFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
          // Ordner bzw. files durchlaufen und kontrollieren, ob gesuchte Dateien dabei sind
          while (files.hasMoreElements()) {
            let file = files.getNext().QueryInterface(Ci.nsIFile);
            // uc.js gefunden -> im Array ablegen
            if (extjs.test(file.leafName)) {
              // userChromeShadow.uc.js nur ausblenden, wenn showuCS nicht gesetzt (0) ist
              if (file.leafName === "userChromeShadow.uc.js" && !this.showuCS) {
                continue;
              }
              ucJsScripts.push(file.leafName);
            }
          }
        }
    
        // --- 2. chrome/scripts-Ordner durchsuchen (falls vorhanden) ---
        let chromeScriptsFolder = Services.dirsvc.get("ProfD", Ci.nsIFile);
        chromeScriptsFolder.append("chrome");
        chromeScriptsFolder.append(this.jsSubfolder);
        if (this.jsSubfolder && chromeScriptsFolder.exists()) {
          // files mit Eintraegen im Scripts-Ordner befuellen
          let files = chromeScriptsFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
          // Ordner bzw. files durchlaufen und kontrollieren, ob gesuchte Dateien dabei sind
          while (files.hasMoreElements()) {
            let file = files.getNext().QueryInterface(Ci.nsIFile);
            // uc.js gefunden -> im Array ablegen
            if (extjs.test(file.leafName)) {
              ucJsScripts.push("chrome/" + this.jsSubfolder + "/" + file.leafName); // Pfad-Präfix für spätere Verarbeitung
            }
          }
        }
    
        if (this.sortScripts) ucJsScripts.sort(this.stringComparison);
    
        // Aufruf der naechsten Methoden um die beiden Untermenues oder die Zwischenablage zu befuellen
        if (iType == 0) {
          this.fillMenu("submenu-ucjs", "submenu-ucjs-items", "Meine Scripte", ucJsScripts, "uProfMenu_ucjs", 0);
        } else {
          // Für Zwischenablage: Nur Dateinamen (ohne Pfad) verwenden
          var simpleNames = ucJsScripts.map(f => f.split(/[\\/]/).pop());
          var result = this.fillClipboardValue(simpleNames, []);
          Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(result);
        }
      },
    
      // --- GETCSS (unchanged) ---
      getCss: function(iType) {
        // Array nimmt Namen der gefundenen css-Dateien auf
        let cssFiles = [];
        // Suchmuster, also die Dateierweiterung css
        let extcss = /\.css$/i;
        let aFolder = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
        if (iType == 3) aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path + this.getDirSep() + "CSS");
        else if (iType == 4) aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path + this.getDirSep() + "CSSWeb");
        else if (iType == 5) aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path + this.getDirSep() + "CSSShadow");
        // files mit Eintraegen im CSS- bzw. CSSWeb-Ordner befuellen
        let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
        // Ordner bzw. files durchlaufen und kontrollieren, ob gesuchte Dateien dabei sind
        while (files.hasMoreElements()) {
          let file = files.getNext().QueryInterface(Ci.nsIFile);
          // css gefunden -> im Array ablegen
          if (extcss.test(file.leafName)) cssFiles.push(file.leafName);
        }
        if (this.sortScripts) cssFiles.sort(this.stringComparison);
        // Untermenue befuellen
        if (iType == 3) this.fillMenu("submenu-css", "submenu-css-items", "Meine CSS-Dateien", cssFiles, "uProfMenu_css", 3);
        else if (iType == 4) this.fillMenu("submenu-cssweb", "submenu-cssweb-items", "Meine CSSWeb-Dateien", cssFiles, "uProfMenu_css", 4);
        else if (iType == 5) this.fillMenu("submenu-CSSShadow", "submenu-CSSShadow-items", "Meine CSSShadow-Dateien", cssFiles, "uProfMenu_css", 5);
      },
    
      // --- FILLMENU (ANGEPASST: Closure-Problem gelöst + Event-Handler korrigiert) ---
      fillMenu: function(whichsubmenu, whichsubmenuitems, strlabel, scriptArray, sClass, sTyp) {
        // Beschriftung des Untermenues mit Anzahl der gefundenen Dateien ergaenzen
        var e = document.getElementById(whichsubmenu);
        e.setAttribute('label', strlabel + ' (' + scriptArray.length + ')');
        var popup = document.getElementById(whichsubmenuitems);
        // zunaechst Untermenue zuruecksetzen
        while (popup.hasChildNodes()) popup.removeChild(popup.firstChild);
    
        var uProfMenu = this; // Für Closure
        // Untermenue endlich befuellen
        for (var i = scriptArray.length - 1; i > -1; i--) {
          (function(index) {
            var fileName = scriptArray[index];
            var mitem;
    
            // Korrektur durch Mira
            if (sTyp == 0) {
              mitem = uProfMenu.createME("menuitem", fileName, null, sClass, 0);
              // Extrahiere Dateinamen für Anzeige (z. B. "chrome/scripts/test.uc.js" → "test.uc.js")
              var displayName = fileName.split(/[\\/]/).pop();
              mitem.setAttribute('label', displayName);
              mitem.addEventListener('command', function() {
                uProfMenu.edit(0, fileName); // Original-Pfad (mit Präfix) an edit() übergeben
              }, true);
              mitem.addEventListener('click', function(event) {
                uProfMenu.openAtGithub(event, displayName);
              }, true);
              mitem.setAttribute("tooltiptext", "Linksklick: Bearbeiten,\nMittelklick: https://github.com/.../" + uProfMenu.cleanFileName(displayName) + " öffnen,\nRechtsklick: Suche auf GitHub");
            }
            // Korrektur ENDE
            else if (sTyp == 1) {
              mitem = uProfMenu.createME("menuitem", fileName, function() {
                openTrustedLinkIn(fileName, 'tab');
              }, sClass, 0);
            }
            else if (sTyp == 3) {
              mitem = uProfMenu.createME("menuitem", fileName, function() {
                uProfMenu.edit(3, fileName);
              }, sClass, 0);
            }
            else if (sTyp == 4) {
              mitem = uProfMenu.createME("menuitem", fileName, function() {
                uProfMenu.edit(4, fileName);
              }, sClass, 0);
            }
            else if (sTyp == 5) {
              mitem = uProfMenu.createME("menuitem", fileName, function() {
                uProfMenu.edit(5, fileName);
              }, sClass, 0);
            }
            popup.insertBefore(mitem, popup.firstChild);
          })(i);
        }
      },
    
      // --- FILLCLIPBOARDVALUE (changed by Mira) --- ganz neu !!
      fillClipboardValue: function(sArray) {
        var retValue = "Meine Skripte (" + sArray.length + "):\n------------------------";
        for (var i = 0; i < sArray.length; i++) {
          retValue += "\n" + (i + 1) + ". " + sArray[i];
        }
        return retValue;
      },
      
      // --- CREATEME (ANGEPASST: sCommand als Funktion) ---
      createME: function(sTyp, sLabel, sCommand, sClass, sId) {
        // Anlegen von menuitem, menu oder menupop - fuer bestimmte Typen nicht eingesetzte Parameter werden als 0 uebergeben
        const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        var m = document.createElementNS(XUL_NS, sTyp);
        switch (sTyp) {
          case "menuitem":
            // this.createME("menuitem","Label des Items","ZuzuweisenderCodeFueroncommand","GewuenschteKlasseDesItems",0)
            m.setAttribute('label', sLabel);
            m.setAttribute('class', sClass);
            if (sCommand && typeof sCommand === 'function') {
              m.addEventListener('command', sCommand, true);
            }
            break;
          case "menu":
            // this.createME("menu","Label des Menues",0,0,"GewuenschteIdDesMenues")
            m.setAttribute('label', sLabel);
            m.setAttribute('id', sId);
            break;
          case "menupopup":
            //this.createME("menupopup",0,0,0,"GewuenschteIdDesMenupopups");
            m.setAttribute('id', sId);
            break;
        }
        return m;
      },
    
      // --- OPENATGITHUB (unchanged) ---
      openAtGithub: function(e, sScript) {
        if (e.button == 1) {
          // Mittelklick - Seite auf GitHub oeffnen (funktioniert nur, wenn Ordner- und bereinigter Dateiname [ohne Erweiterung] uebereinstimmen):
          var sUrl = "https://github.com/ardiman/userChrome.js/tree/master/" + this.cleanFileName(sScript);
          openWebLinkIn(sUrl, 'tab');
        }
        if (e.button == 2) {
          // Rechtsklick - Suche auf GitHub starten (funktioniert nur, wenn der Dateiname im Code hinterlegt ist):
          e.preventDefault();
          var sUrl = "https://github.com/search?langOverride=&language=&q=" + sScript + "&repo=&start_value=1&type=Code";
          openWebLinkIn(sUrl, 'tab');
        }
      },
    
      // --- CLEANFILENAME (unchanged) ---
      cleanFileName: function(sName) {
        /* Das folgende Array enthaelt regulaere Ausdruecke, um ungueltige Zeichenfolgen entfernen:
        /Datei-Erweiterungen am Ende/, /"ucjs_" am Anfang/, /"_"gefolgtVonZahlUndDanachBeliebigenZeichen/
        / "_fx"gefolgtVonZahl(en)/, /"-" oder "+" oder "."/, /"_v"gefolgtVonZahlen
        */
        sName = sName.toLowerCase();
        var regs = [/\.uc\.js$/, /\.uc\.xul$/, /^ucjs_/, /_\d.+/, /_fx\d+/, /[-+\.]/g, /_v\d+/];
        for (var i = 0; i < regs.length; i++) {
          sName = sName.replace(regs[i], "");
        }
        return sName;
      }
    };
    
    // Initialisierung
    uProfMenu.init();
    Alles anzeigen
  • extra_Config_menu zeigt das Icon nicht an.

    • BarbaraZ-
    • 28. Oktober 2026 um 12:19

    Sorry, wenn es denn so einfach wäre.

    Es gibt hier leider mindestens zwei verschiedene Scripte.
    Von daher weiss ich nicht welcher gemeint ist
    Außerdem nutze ich für mein Icon nicht den base64 code.

  • extra_Config_menu zeigt das Icon nicht an.

    • BarbaraZ-
    • 28. Oktober 2026 um 10:08

    Moin,
    dieses schon aktuelle Script zeigt, seit dem Update auf die Version 159.0 von gestern, mir das Icon nicht an.

    JavaScript
    // ==UserScript==
    // @name           extras_config_menu.uc.js
    // @compatibility  Firefox 159*.*
    // @include        main
    // @version        1.0.2026127
    // @edit           @aborix 7/21 CSS Dateien als Untermenü eingefügt
    // @edit           @2002Andreas 8/21 Shadow CSS Dateien als Untermenü + Ordner eingefügt
    // @edit           @BrokenHeart 1/25 Anpass. wg. Änderung der Sicherheitsrichtlinien bei 'inlineEvents'
    // @edit           @Mira 8/26 Anpass. f. security.allow_unsafe_dangerous_privileged_evil_eval = false
    // @edit           @Mira 8/26 Anpass. f. Userscripte im Unterordner "chrome/scripts", Expliziter Ausschluss von "userChromeShadow.uc.js"
    // @edit           @Mira 8/26 Anpass. zum Ausschluss von "userChromeShadow.uc.js", lässt sich auswählen
    // @edit           @Mira 8/26 Anpass. f. "Skriptliste in Zwischenablage"
    // @edit           @Mira 8/26 1. Altlast "warpmenuto: 'helpMenu'" ersetzt durch die Auswahl, ob ein Button oder ein Menü erstellt werden soll.
    // @edit           @Mira 8/26 2. Das komplette CSS entsorgt! Code für Button ergänzt.
    // @edit           @Mira 8/26 Skript entrümpelt! Code für "Bild Url" & "config Einträge.css" sowie "Einbindung GM-Skripte-Ordner" entfernt.
    // @edit           @Mira 8/26 Anpass. f. den Button. Auswahl für flexibles SVG-Icon oder festes Base64-PNG-Icon hinzugefügt
    // @edit           @Mira 8/26 Anpass. f. den Skriptordner. Ordner kann jetzt ausgewählt, bzw. benannt werden.
    // @edit           @Mira 11/26 Aufruf "if (window.__SSi == "window0")" korrigiert!
    // @Source         https://www.camp-firefox.de/forum/thema/140829/?postID=1296710#post1296710
    
    
    var uProfMenu = {
      // Beginn der Konfiguration
      // In der Zeile (16) den Pfad zum Texteditor eintragen (unter Ubuntu 10.04 z.B.: '/usr/bin/gedit'). Bei Fehleintrag wird view_source.editor.path ausgelesen:
      //TextOpenExe: 'E:\\Notepad++\\notepad++.exe',
      TextOpenExe: 'E:\\Notepad++\\notepad++.exe',
      // Falls gewuenscht, in Zeile 18 einen Dateimanager eintragen (komplett leer lassen fuer Dateimanager des Systems) Beispiele:
      // vFileManager: 'C:\\Programme\\TotalCommander\\Totalcmd64.exe',
      vFileManager: 'C:\\Programme\\TotalCommander\\Totalcmd64.exe',
      // In der folgenden Zeile (24) 'menu' eintragen, damit es unter "Extras" als Menue erscheint, sonst die id des gewuenschten
      // Elements *nach* dem der Button erscheinen soll (z.B. 'urlbar', 'searchbar', 'undoclosetab-button','abp-toolbarbutton')
      // Bitte nicht so etwas wie die Menue- oder Navigationsleiste (sondern einen Menuepunkt oder einen Button mit id auf diesen Leisten) eintragen:
     warpmenuto: 'helpMenu',
     // Unter Linux sollte/kann versucht werden, die userChromeJS-Skripte zu sortieren, unter Windows ist das evtl. nicht noetig (die Sortierung wird Gross- und Kleinschreibung *nicht* beruecksichtigen - dazu wird die sort()-Funktion entsprechend mit einer Vergleichsfunktion aufgerufen)
      sortScripts: 0,   // 1 zum Erzwingen der Sortierung
      // Einbindung GM-Skripte-Ordner (0: nein, 1: Greasemonkey [Profil-Verzeichnis], 2: UserScriptLoader [Chrome-Verzeichnis], 3: Scriptish [Profil-Verzeichnis]):
      gmOrdner: 0,
      // Einbindung CSS-Ordner (0: nein, 1: UserCSSLoader-Ordner im Chrome-Verzeichnis):
      cssOrdner: 1,
      // In Zeile 30 gueltige about:Adressen eintragen, die ebenfalls aufgerufen werden sollen.
      // - Zum Ausblenden: abouts: [],
      // - Damit die about:-Seiten nicht als Untermenue, sondern direkt als Menuepunkte aufgefuehrt werden, muss das erste Element '0' sein:
      // abouts: ['0','about:about','about:addons','about:cache','about:config','about:support'],
      abouts: ['about:profiles','about:debugging#/runtime/this-firefox','about:about','about:cache','about:crashes','about:home','about:logins','about:memory','about:support','about:performance','about:translations#src=detect'],
      // Die normalen Firefox-Einstellungen auch zur Verfuegung stellen (0: nein, 1: ja):
      showNormalPrefs: 0,
      // Stellt "Skriptliste in Zwischenablage" zur Verfuegung (1: ja, 2: mit getrennter Nummerierung, 3: mit gemeinsamer Nummerierung) oder nicht (0):
      enableScriptsToClip: 1,
      // Um den Eintrag "Neustart" zu erzwingen (falls z.B. das andere Skript zu spaet eingebunden und nicht erkannt wird), auf 1 setzen:
      enableRestart: 0,
      // Ende der Konfiguration
    
      init: function() {
    	  if (location.href !== 'chrome://browser/content/browser.xhtml')    return;
        if (this.warpmenuto.toLowerCase() == 'menu') {
          // aufgrund des gewaehlten warpmenuto als Untermenue von Extras anlegen
          var zielmenu = document.getElementById('menu_ToolsPopup');
          if (zielmenu==null) {
            userChrome.log("extras_config_menu.uc.js findet Zielmenue nicht, evtl. weil ein anderes Fenster als das Hauptfenster " +
                           "geoeffnet wurde. Falls dieser Fehler auch im Hauptfenster auftritt, bitte die vorgehende Definition " +
                           "von 'zielmenu' kontrollieren.");
           return
          }
          var menu = zielmenu.appendChild(this.createME("menu","Config Men\u00FC",0,0,"ExtraConfigMenu"));
          menu.setAttribute("class","menu-iconic");
          menu.setAttribute("ondblclick","openTrustedLinkIn('about:config', 'tab');");
         } else {
    		 
    	/*	 
          // als Button nach dem per warpmenuto gewaehlten Element anlegen (s. Kommentar ueber warpmenuto im Konfigurationsabschnitt)
          var zielmenu = document.getElementById(this.warpmenuto);
          if (zielmenu==null) {
            userChrome.log("extras_config_menu.uc.js findet Zielpunkt '"+this.warpmenuto+"' nicht, evtl. weil ein anderes Fenster als das Hauptfenster " +
                           "geoeffnet wurde. Falls dieser Fehler auch im Hauptfenster auftritt, bitte die vorgehende Definition " +
                           "von 'warpmenuto' kontrollieren.");
            return;
          }
          var menu = zielmenu.parentNode.insertBefore(document.createXULElement('toolbarbutton'), zielmenu.nextSibling);
          menu.setAttribute("id", "ExtraConfigMenu-button");
          menu.setAttribute("class", "toolbarbutton-1");
          menu.setAttribute("type", "menu");
          menu.setAttribute("tooltiptext", "Extra Config Menü\nMittelklick \öffnet about:config");
          menu.setAttribute("onclick", "if (event.button === 2 && !this.open) {openTrustedLinkIn('about:config','tab')};");
        }
    	*/
    	if (this.showAsButton) {
          // als verschiebbaren Button anlegen
          // if (window.__SSi == "window0") {
          if (window.gBrowser && !CustomizableUI.getWidget("ExtraConfigMenu-button")) {
            CustomizableUI.createWidget({
              id: "ExtraConfigMenu-button",
              defaultArea: CustomizableUI.AREA_NAVBAR,
              label: "Extra Config Menü",
              tooltiptext: "Extra Config Menü\nRechtsklick öffnet about:config",
     		
          }
          var menu = document.getElementById("ExtraConfigMenu-button");
          menu.setAttribute("type", "menu");
    	  menu.addEventListener('click', function(event) {
    			if (event.button == 2 && !this.open) { 
    				openTrustedLinkIn("about:config", "tab");
    				event.preventDefault();
    			};
    	 },true);
    	  
        }
    	
        //ab hier ist alles gleich, egal ob Button oder Menue
          var css =`  
          #ExtraConfigMenu, #ExtraConfigMenu-button { 
            list-style-image:         url("file:///C:/Users/Barbaraz-/AppData/Roaming/Mozilla/Firefox/Profiles/zex9etk7.default/chrome/Icons/pencil.png"); 		
    		} 
          #ExtraConfigMenu-button > dropmarker, #ExtraConfigMenu-button > hbox > .toolbarbutton-menu-dropmarker { 
            display: none !important; 
          }`;
        var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
        var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(css));
        sss.loadAndRegisterSheet(uri,sss.AGENT_SHEET);
    	menu.addEventListener('popupshowing', function(event) {
    			uProfMenu.getScripts(0);
    			uProfMenu.getCss(3);
    			uProfMenu.getCss(4);
    			uProfMenu.getCss(5);
    	 },true);
    	
        var menupopup = menu.appendChild(this.createME("menupopup",0,0,0,"ExtraConfigMenu-popup"));
        
    	// Anlegen von Untermenues fuer userChromeJS-Skripte und CSS-Dateien (befuellen spaeter)
        var submenu = menupopup.appendChild(this.createME("menu","Meine Skripte",0,0,"submenu-ucjs"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-ucjs-items"));
        // var submenu = menupopup.appendChild(this.createME("menu","uc.xul",0,0,"submenu-ucxul"));
        // var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-ucxul-items"));
        var submenu = menupopup.appendChild(this.createME("menu","css",0,0,"submenu-css"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-css-items"));
    	var submenu = menupopup.appendChild(this.createME("menu","CSSShadow",0,0,"submenu-CSSShadow"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-CSSShadow-items"));
        var submenu = menupopup.appendChild(this.createME("menu","cssweb",0,0,"submenu-cssweb"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-cssweb-items"));
        if (this.enableScriptsToClip) menupopup.appendChild(this.createME("menuitem","Skriptliste in die Zwischenablage","uProfMenu.getScripts(1)","uProfMenu_clipboard",0));
        // Ende Anlegen von Untermenues
        menupopup.appendChild(document.createXULElement('menuseparator'));
       
        // Einbindung von Konfigdateien
     	menupopup.appendChild(this.createME("menuitem","userChrome.css","uProfMenu.edit(0,'userChrome.css');","uProfMenu_edit",0));
    	menupopup.appendChild(this.createME("menuitem","userChromeShadow.css","uProfMenu.edit(0,'userChromeShadow.css');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","userContent.css","uProfMenu.edit(0,'userContent.css');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","userChrome.js","uProfMenu.edit(0,'userChrome.js');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","prefs.js","uProfMenu.edit(1,'prefs.js');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","user.js","uProfMenu.edit(1,'user.js');","uProfMenu_edit"),0);
        // Ende Einbindung von Konfigdateien
       
        menupopup.appendChild(document.createXULElement('menuseparator'));
        
    	// Einbindung von Ordnern
        switch (this.gmOrdner) {
          case 1:
            menupopup.appendChild(this.createME("menuitem","GM-skripty","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'gm_scripts');","uProfMenu_folder"),0);
            break;
          case 2:
            menupopup.appendChild(this.createME("menuitem","USL-skripty","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'UserScriptLoader');","uProfMenu_folder"),0);
            break;
          case 3:
            menupopup.appendChild(this.createME("menuitem","Skripty Scriptish","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'scriptish_scripts');","uProfMenu_folder"),0);
            break;
        }
    
        menupopup.appendChild(this.createME("menuitem","CSS-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'css');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","CSSShadow-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'CSSShadow');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","CSSWeb-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'CSSWeb');","uProfMenu_folder"),0);
    	menupopup.appendChild(this.createME("menuitem","CSSForum-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'cssforum');","uProfMenu_folder"),0);
    	menupopup.appendChild(this.createME("menuitem","Chrome-Ordner","uProfMenu.prefDirOpen('UChrm');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Add-ons-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'extensions');","uProfMenu_folder"),0);
    	menupopup.appendChild(this.createME("menuitem","Profilordner","uProfMenu.prefDirOpen('ProfD');","uProfMenu_folder"),0);
    	menupopup.appendChild(this.createME("menuitem","Installationsordner","uProfMenu.prefDirOpen('CurProcD');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Startup/Skript-Cacheordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfLD')+uProfMenu.getDirSep()+'startupCache');","uProfMenu_folder"),0);
        // Ende Einbindung von Ordnern
        
    	// Einbindung von abouts
        if (this.abouts.length>0) {
          menupopup.appendChild(document.createXULElement('menuseparator'));
          // falls der erste Eintrag des Arrays = '0' ist, dann kein Untermenue anlegen, sondern direkt als Menuepunkte einbinden
          if (this.abouts[0]=='0') {
            for (var i = 1; i < this.abouts.length; i++) {
            menupopup.appendChild(this.createME("menuitem",this.abouts[i],"openTrustedLinkIn('"+this.abouts[i]+"','tab')","uProfMenu_about"),0);
            }
           } else {
            // der erste Eintrag des arrays ist ungleich '0', deshalb als Untermenue einrichten
            var submenu = menupopup.appendChild(this.createME("menu","uc.js",0,0,"submenu-about"));
            var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-about-items"));
            this.fillMenu("submenu-about","submenu-about-items", "Meine about: Seiten",this.abouts,"uProfMenu_about",1);
          }
        }
        // Ende Einbindung von abouts
        
    	// Separator, falls dieser nicht schon durch abouts generiert wurde und weitere Menuepunkte folgen werden
        if (this.abouts.length==0 && (this.showNormalPrefs || typeof(ToolRstartMod) != "undefined")) menupopup.appendChild(document.createXULElement('menuseparator'));
        // Falls gewuenscht (s. Konfigurationsabschnitt), Zugriff auf die normalen Einstellungen
        if (this.showNormalPrefs) 
    		menupopup.appendChild(this.createME("menuitem","Einstellungen","try{openOptionsDialog();}catch(e){openPreferences();}","uProfMenu_prefs"),0);
        // Falls addRestartButton installiert ist, Neustart zur Verfuegung stellen (addRestartButton 1.0.20120105mod erforderlich)
      if(this.enableRestart) menupopup.appendChild(this.createME("menuitem","Neustart",
        "Services.appinfo.invalidateCachesOnRestart(); Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit,0);"));
        },
    
      getDirSep:function() {
        // Betriebssystem nach https://developer.mozilla.org/en/Code_snippets/Miscellaneous ermitteln
        var osString = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS;
        var dirsep = "/";
        switch(osString) {
          case "WINNT":
            dirsep = "\\";
            break;
          case "Linux":
            dirsep = "/";
            break;
          case "Darwin":
            dirsep = "/";
            break;
        }
        return dirsep;
      },
    
      edit:function(OpenMode,Filename){
        var Path = "";
        var dSep = this.getDirSep();  // die Trennzeichen zwischen Ordnern abhaengig vom Betriebssystem machen
        switch (OpenMode){
          //Current is Chrome Directory
          case 0:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename;
            break;
          //Current is Profile Directory
          case 1:
            var Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename;
            break;
          //Current is Root
          case 2:
            var Path = Filename;
            break;
          //Current is CSS folder
          case 3:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSS" + dSep + Filename;
            break;
          //Current is CSSWeb folder
          case 4:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSWeb" + dSep + Filename;
            break;
    		//Current is CSSShadow folder
          case 5:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSShadow" + dSep + Filename;
            break;
        }
        this.launch(this.TextOpenExe,Path);
      },
    
      dirOpen:function(Path){
        if (this.vFileManager.length != 0) {
          var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
          var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
          var args = [Path];
          file.initWithPath(this.vFileManager);
          process.init(file);
          // Verzeichnis mit anderem Dateimanager oeffnen
          process.run(false, args, args.length);
         } else {
          // Verzeichnis mit Dateimanager des Systems oeffnen
          var dir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
          dir.initWithPath(Path);
          dir.launch();
        }
      },
    
      prefDirOpen:function(prefDir){
        Path = this.getPrefDirectoryPath(prefDir);
        this.dirOpen(Path);
      },
    
      getPrefDirectoryPath:function(str){
        // get profile directory
        var file = Components.classes["@mozilla.org/file/directory_service;1"]
          .getService(Components.interfaces.nsIProperties)
          .get(str, Components.interfaces.nsIFile);
        if (str == 'CurProcD') {
          file = file.parent;
        };
        return file.path;
      },
    
      launch:function(RanPath,OpenPath){
        var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
        var proc = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
        var args = [OpenPath];
        file.initWithPath(RanPath);
        // falls der im Konfigurationsabschnitt definierte Editor nicht gefunden wird, auf Einstellung in about:config ausweichen:
        if (!file.exists()) {
          var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
          RanPath = pref.getCharPref("view_source.editor.path");
          file.initWithPath(RanPath);
        }
        proc.init(file);
        proc.run(false, args, args.length);
      },
    
      stringComparison:function(a, b){
        a = a.toLowerCase();
        a = a.replace(/ä/g,"a");
        a = a.replace(/ö/g,"o");
        a = a.replace(/ü/g,"u");
        a = a.replace(/ß/g,"s");
        b = b.toLowerCase();
        b = b.replace(/ä/g,"a");
        b = b.replace(/ö/g,"o");
        b = b.replace(/ü/g,"u");
        b = b.replace(/ß/g,"s");
        return(a==b)?0:(a>b)?1:-1;
      },
    
      getScripts:function(iType) {
        // Arrays (jeweils ein Array fuer uc.js und uc.xul) nehmen Namen der gefundenen Skripte auf
        let ucJsScripts = [];
        let ucXulScripts = [];
        // Suchmuster, also die Dateierweiterungen uc.js und uc.xul
        let extjs = /\.uc\.js$/i;
        //let extxul = /\.uc\.xul$/i;
        let aFolder = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
        aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path);
        // files mit Eintraegen im Chrome-Ordner befuellen
        let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
        // Ordner bzw. files durchlaufen und kontrollieren, ob gesuchte Dateien dabei sind
        while (files.hasMoreElements()) {
          let file = files.getNext().QueryInterface(Ci.nsIFile);
          // keine gewuenschte Datei, deshalb continue
          //if (!extjs.test(file.leafName) && !extxul.test(file.leafName)) continue;
          // uc.js gefunden -> im Array ablegen
          if (extjs.test(file.leafName)) ucJsScripts.push(file.leafName);
          // uc.xul gefunden -> im Array ablegen
          //if (extxul.test(file.leafName)) ucXulScripts.push(file.leafName);
        }
        if (this.sortScripts) {
          ucJsScripts.sort(this.stringComparison);
          //ucXulScripts.sort(this.stringComparison);
        }
        // Aufruf der naechsten Methoden um die beiden Untermenues oder die Zwischenablage zu befuellen
        if (iType==0) {
          this.fillMenu("submenu-ucjs","submenu-ucjs-items", "Meine Skripte",ucJsScripts,"uProfMenu_ucjs",0);
          //this.fillMenu("submenu-ucxul","submenu-ucxul-items", "uc.xul",ucXulScripts,"uProfMenu_ucxul",0);
         } else {
          var result = this.fillClipboardValue(ucJsScripts,ucXulScripts);
          Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(result);
        }
      },
    
      getCss:function(iType) {
        // Array nimmt Namen der gefundenen css-Dateien auf
        let cssFiles = [];
        // Suchmuster, also die Dateierweiterung css
        let extcss = /\.css$/i;
        let aFolder = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
        if (iType==3) {
          aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path+this.getDirSep()+"CSS");
         } else if (iType==4) {
          aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path+this.getDirSep()+"CSSWeb");
        }  else if (iType==5) {
          aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path+this.getDirSep()+"CSSShadow");
        }
        // files mit Eintraegen im CSS- bzw. CSSWeb-Ordner befuellen
        let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
        // Ordner bzw. files durchlaufen und kontrollieren, ob gesuchte Dateien dabei sind
        while (files.hasMoreElements()) {
          let file = files.getNext().QueryInterface(Ci.nsIFile);
          // css gefunden -> im Array ablegen
          if (extcss.test(file.leafName)) cssFiles.push(file.leafName);
        }
        if (this.sortScripts) {
          cssFiles.sort(this.stringComparison);
        }
        // Untermenue befuellen
        if (iType==3) {
          this.fillMenu("submenu-css","submenu-css-items","Meine CSS-Dateien",cssFiles,"uProfMenu_css",3);
         } else if (iType==4) {
          this.fillMenu("submenu-cssweb","submenu-cssweb-items","Meine CSSWeb-Dateien",cssFiles,"uProfMenu_css",4);
        }  else if (iType==5) {
          this.fillMenu("submenu-CSSShadow","submenu-CSSShadow-items","Meine CSSShadow-Dateien",cssFiles,"uProfMenu_css",5);
        }
      },
    
      fillMenu:function(whichsubmenu, whichsubmenuitems, strlabel, scriptArray,sClass,sTyp) {
        // Beschriftung des Untermenues mit Anzahl der gefundenen Dateien ergaenzen
        var e = document.getElementById(whichsubmenu);
        e.setAttribute('label',strlabel + ' (' + scriptArray.length + ')');
        var popup = document.getElementById(whichsubmenuitems);
        // zunaechst Untermenue zuruecksetzen
        while(popup.hasChildNodes()){
          popup.removeChild(popup.firstChild);
        }
        // Untermenue endlich befuellen
        for (var i = scriptArray.length-1; i > -1; i--) {
          // Typunterscheidung (userChromeJS-Skript oder about: oder css)
          if (sTyp==0){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(0,'"+scriptArray[i]+"')",sClass,0);
    		mitem.addEventListener('click', function(event) {
    			uProfMenu.openAtGithub(event,'"+scriptArray[i]+"');
    			event.preventDefault();
    		},true);
    		
            mitem.setAttribute("tooltiptext"," Linksklick: Bearbeiten,\n Mittelklick: https://github.com/.../"+this.cleanFileName(scriptArray[i])+" oeffnen,\n Rechtsklick: Suche auf GitHub");
           } else if (sTyp==1){
            var mitem = this.createME("menuitem",scriptArray[i],"openTrustedLinkIn('"+scriptArray[i]+"','tab')",sClass,0);
           } else if (sTyp==3){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(3,'"+scriptArray[i]+"')",sClass,0);
           } else if (sTyp==4){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(4,'"+scriptArray[i]+"')",sClass,0);
          }
    	  else if (sTyp==5){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(5,'"+scriptArray[i]+"')",sClass,0);
          }
          popup.insertBefore(mitem, popup.firstChild);
        }
      },
    
      fillClipboardValue:function(sArray,xArray) {
        var retValue;
        var s = 0;
        var x = 0;
        s = sArray.length;
        x = xArray.length;
        switch(this.enableScriptsToClip) {
          case 1:
            retValue = "userChromeJS/uc.js ("+s+"):\n------------------------\n"+sArray.join("\n");
            break;
          default:
            retValue = "userChromeJS/uc.js ("+s+"):\n------------------------";
            for (var i = 0; i < s ; i++) {
              j = i + 1;
              retValue = retValue + "\n" + j + ". " + sArray[i];
            }
             break;
        }
        return retValue;
      },
    
      createME:function(sTyp,sLabel,sCommand,sClass,sId) {
        // Anlegen von menuitem, menu oder menupop - fuer bestimmte Typen nicht eingesetzte Parameter werden als 0 uebergeben
        const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        var m = document.createElementNS(XUL_NS, sTyp);
        switch (sTyp) {
          case "menuitem":
            // this.createME("menuitem","Label des Items","ZuzuweisenderCodeFueroncommand","GewuenschteKlasseDesItems",0)
            m.setAttribute('label', sLabel);
            m.setAttribute('class',sClass);
    		m.addEventListener('command', function(event) {
    			Function(sCommand)();
    		}, true);
    		
            break;
          case "menu":
            // this.createME("menu","Label des Menues",0,0,"GewuenschteIdDesMenues")
            m.setAttribute('label', sLabel);
            m.setAttribute('id', sId);
            break;
          case "menupopup":
            //this.createME("menupopup",0,0,0,"GewuenschteIdDesMenupopups");
            m.setAttribute('id', sId);
            break;
        }
        return m;
      },
    
      openAtGithub:function(e,sScript) {
        if (e.button==1){
          // Mittelklick - Seite auf GitHub oeffnen (funktioniert nur, wenn Ordner- und bereinigter Dateiname [ohne Erweiterung] uebereinstimmen):
          var sUrl = "https://github.com/ardiman/userChrome.js/tree/master/"+this.cleanFileName(sScript);
          openWebLinkIn(sUrl, 'tab');
        }
        if (e.button==2){
          // Rechtsklick - Suche auf GitHub starten (funktioniert nur, wenn der Dateiname im Code hinterlegt ist):
          e.preventDefault();
          var sUrl = "https://github.com/search?langOverride=&language=&q="+sScript+"&repo=&start_value=1&type=Code";
          openWebLinkIn(sUrl, 'tab');
        }
      },
    
      cleanFileName:function(sName) {
        sName = sName.toLowerCase();
        /* Das folgende Array enthaelt regulaere Ausdruecke, um ungueltige Zeichenfolgen entfernen:
        /Datei-Erweiterungen am Ende/, /"ucjs_" am Anfang/, /"_"gefolgtVonZahlUndDanachBeliebigenZeichen/
        / "_fx"gefolgtVonZahl(en)/, /"-" oder "+" oder "."/, /"_v"gefolgtVonZahlen
        */
        var regs = [/\.uc\.js$/,/\.uc\.xul$/,/^ucjs_/,/_\d.+/,/_fx\d+/,/[-+\.]/g,/_v\d+/];
        for (var i = 0; i < regs.length; i++) {
          sName = sName.replace(regs[i],"");
        }
        return sName;
      }
    
    };
    
    uProfMenu.init();
    Alles anzeigen

    Das Icon war zwischen der Adressleiste und dem Zip-Icon platziert.

    Wo liegt der Fehler?

  • Ungenutztes Feld

    • BarbaraZ-
    • 23. Oktober 2026 um 17:26

    Ich weiss nicht, was dort gehakt hatte. Habe einmal den Fuchs komplett geschlossen und neu geöffnet. Damit ist alles sauber.
    Danke und Sorry für unnötige Arbeit.

  • Ungenutztes Feld

    • BarbaraZ-
    • 23. Oktober 2026 um 17:19

    Sieht hier so aus:

  • Ungenutztes Feld

    • BarbaraZ-
    • 23. Oktober 2026 um 17:14

    Sorry, doch noch nicht ganz. Wenn ich auf den Tab "Nachrichten" umschalte, ist das "Dreipunktefeld" noch präsent.
    Lässt sich doch bestimmt auch entfernen.

    2002Andreas Habe Deinen Beitrag #7 gerade erst gesehen. Und ja, ich nutze - Foren ignorieren - ebenso wenig.

  • Ungenutztes Feld

    • BarbaraZ-
    • 23. Oktober 2026 um 17:05

    .DeJaVu nicht mehr notwendig. Code von Andreas passt. Dahinter verbarg sich bei mir nur RSS-Feed. Nicht mehr, nicht weniger.

  • Ungenutztes Feld

    • BarbaraZ-
    • 23. Oktober 2026 um 17:04

    Perfekt danke, ich hatte den Code erst komplett ans Ende gesetzt, so ist es aber einfacher.

  • Ungenutztes Feld

    • BarbaraZ-
    • 23. Oktober 2026 um 16:51

    Moin,

    ich möchte gerne das Feld mit den drei Punkten (Mehr Optionen) weg haben, welches bei Aufruf des Forums angezeigt wird.
    Die Anzeige erfolgt. bevor ich mich einlogge. Ich nutze es nicht.

    Gerne so, dass ich dadurch eine Zeile mehr habe, und der Text dann hochrutscht, damit ich dann die Rubriken besser angezeigt bekomme.

    Aber:

    Wenn ich mich eingeloggt habe, sieht es so aus:

    Hier soll ebenfalls das "Dreipunktefeld" entfernt werden.
    Hierbei soll aber die Zeile mit "Alle als gelesen markieren" bestehen bleiben.

    Ist dieses möglich?

    Schon mal Danke im Voraus.

    Nachtrag:

    ich nutze zum anpassen folgenden Code:

    CSS
    /* Camp Firefox Forum - *Farbe globaler Hintergrund im Forum*/
    
    @-moz-document domain("camp-firefox.de") {
    
    section.box:nth-child(2){
    display: none !important; /* Unerledigte Themen ausblenden */
    }
    
    .wbbBoardNodeContainer:has([data-board-id="20"]) {
      display: none; /* Smartphone und Tablets ausblenden */
    }
    
    html,
    body,
    .main,
    .boxesFooter,
    .boxesFooterBoxes,
    .layoutBoundary,
    .pageFooterCopyright,
    .pageHeaderFacade,
    .pageNavigation
    {background: #6495ed !important; /*cornflowerblue*/
    }
    
    a,
    button,
    input,
    textarea,
    .messageGroupList .columnSubject > .statusDisplay
    {transition: none !important;
    -webkit-transition: none !important;
    }
    
    a.externalURL,
    .pageNavigation a,
    .contentHeaderTitle a
    {color: lightblue !important;
    font-weight: bold !important;
    }
    
    a.externalURL:hover,
    .pageNavigation a:hover,
    .contentHeaderTitle a:hover
    {color: #dc143c !important; /*crimson*/
    font-weight: 900 !important;
    }
    
    #pageContainer,
    .pageContainer
    {max-width: 1500px !important;
    margin-left: 80px !important;
    margin: 0px auto !important;
    }
    
    #tpl_wbb_board .pageNavigationIcons > li:not(:last-child)
    {margin-left: 0px !important;
    }
    
    #tpl_wbb_board .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wbb_unresolvedThreadList .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wbb_userPostList .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wcf_disclaimer .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wcf_membersList .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wcf_recentActivityList .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wcf_team .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wcf_userSearch .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wcf_usersOnlineList .pageNavigation .pageNavigationIcons.jsPageNavigationIcons
    {left: calc(1vw - 100% + 85px) !important;
    }
    
    #tpl_wbb_thread .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wbb_unreadThreadList .pageNavigation .pageNavigationIcons.jsPageNavigationIcons
    {left: calc(1vw - 100% + 110px) !important;
    }
    
    #tpl_wcf_articleList .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wcf_conversation .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wcf_ignoredUsers .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wcf_notificationList .pageNavigation .pageNavigationIcons.jsPageNavigationIcons
    {left: calc(1vw - 100% + 5px) !important;
    }
    
    #tpl_wbb_boardList .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wbb_board[itemid="Nachrichten"] .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wbb_board[itemid="Smalltalk"] .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wbb_board[itemid="Erweiterungen & Themes"] .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wbb_board[itemid="Vorab-Versionen"] .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wbb_board[itemid="Probleme auf Websites"] .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wbb_board[itemid="Müllhalde"] .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wbb_board[itemid="Schaltzentrale"] .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wbb_board[itemid="Firefox Allgemein"] .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wbb_board[itemid="Individuelle Anpassungen"] .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    *#tpl_wbb_board[itemid="Firefox-Produkte für Android"] .pageNavigation .pageNavigationIcons.jsPageNavigationIcons,
    #tpl_wbb_board[itemid="Firefox-Produkte für Apple iOS"] .pageNavigation .pageNavigationIcons.jsPageNavigationIcons
    {left: calc(1vw - 100% + 125px) !important;
    }
    
    #tpl_wbb_unreadThreadList .section .tabularListRow.tabularListRowHead
    {background: #eee !important; /*lightgray*/
    }
    
    #tpl_wbb_userPostList .message
    {border: none !important;
    padding: 1px !important;
    }
    
    #tpl_wbb_userPostList .messageContent,
    #tpl_wbb_userPostList .messageFooterGroup
    {background: #eee !important; /*lightgray*/
    margin-left: 0px !important;
    }
    
    #tpl_wcf_disclaimer .content form .section.htmlContent > ol li
    {background: #eee !important; /*lightgray*/
    border-bottom: 1px #888 solid !important;
    padding: 0px 5px 5px 5px !important;
    }
    
    #tpl_wcf_membersList .section.sectionContainerList > ol li,
    #tpl_wcf_recentActivityList .section.sectionContainerList > ul li,
    #tpl_wcf_searchResult .section.sectionContainerList > ul li,
    #tpl_wcf_team .section.sectionContainerList > ol li,
    #tpl_wcf_usersOnlineList .section.sectionContainerList > ol li
    {border-bottom: 1px #888 solid !important; /*gray*/
    }
    
    #tpl_wcf_notificationList .content ul.containerList.userNotificationItemList li.jsNotificationItem.notificationItem div.box32 div img
    {height: 32px !important;
    width: 32px !important;
    }
    
    #tpl_wcf_recentActivityList .containerList > li .containerHeadline,
    #tpl_wcf_recentActivityList .containerContent.htmlContent
    {background: #fff !important; /*white*/
    padding: 2px !important;
    }
    
    #tpl_wcf_settings .content p.success
    {background-color: #ff6800 !important; /*orange*/
    border: none !important;
    color: #222 !important; /*black*/
    }
    
    #tpl_wbb_board .section ul.wbbBoardList > li.wbbBoardContainer,
    #tpl_wbb_unreadThreadList .section .tabularListColumns > ol.tabularListColumns,
    #tpl_wcf_disclaimer .section > ul.boardrules-rules,
    #tpl_wcf_membersList .section.sectionContainerList > ol,
    #tpl_wcf_notificationList .content ul.containerList.userNotificationItemList li.jsNotificationItem.notificationItem,
    #tpl_wcf_recentActivityList .section.sectionContainerList > ul,
    #tpl_wcf_searchResult .section.sectionContainerList,
    #tpl_wcf_team .section.sectionContainerList > ol,
    #tpl_wcf_usersOnlineList .section.sectionContainerList > ol
    {background: #eee !important; /*gray*/
    border-bottom: 1px #888 solid !important; /*white*/
    }
    
    #tpl_wbb_userPostList .message:hover,
    #tpl_wbb_userPostList .messageContent:hover
    {background: #00bfff !important; /*DeepSkyBlue1*/
    }
    
    #tpl_wbb_board .section ul.wbbBoardList > li.wbbBoardContainer:hover,
    #tpl_wbb_unreadThreadList .section ol.tabularList li.tabularListRow ol.tabularListColumns:hover,
    #tpl_wcf_membersList .section.sectionContainerList > ol li:hover,
    #tpl_wcf_notificationList .content ul.containerList.userNotificationItemList li.jsNotificationItem.notificationItem:hover,
    #tpl_wcf_recentActivityList .section.sectionContainerList > ul li:hover,
    #tpl_wcf_searchResult .section.sectionContainerList > ul li:hover,
    #tpl_wcf_team .section.sectionContainerList > ol li:hover,
    #tpl_wcf_usersOnlineList .section.sectionContainerList > ol li:hover
    {background: #faebd7 !important; /*AntiqueWhite*/
    }
    
    .attachmentThumbnail .attachmentThumbnailImage img
    {opacity: .95 !important;
    transition: none !important;
    -webkit-transition: none !important;
    }
    
    .badge,
    a.badge,
    .newMessageBadge
    {color: #ee0 !important; /*yellow2*/
    font-weight: 900 !important;
    }
    
    .boxesFooterBoxes .box > .boxContent
    {margin-top: 0px !important;
    margin-left: 20px !important;
    min-height: 80px !important;
    }
    
    .boxesFooterBoxes .boxContainer
    {padding: 0px !important;
    margin-left: -5px !important;
    }
    
    .buttonGroup > li:last-child .button[data-tooltip="Inhalt melden"],
    .messageFooterButtons > li:last-child .button[data-tooltip="Inhalt melden"],
    .messageFooterButtonsExtra > li:last-child .button[data-tooltip="Inhalt melden"]
    {background: #c00 !important; /*red*/
    }
    
    .buttonGroup > li:last-child .button[data-tooltip="Zitieren"],
    .messageFooterButtons > li:last-child .button[data-tooltip="Zitieren"],
    .messageFooterButtonsExtra > li:last-child .button[data-tooltip="Zitieren"]
    {background: #44f !important;
    }
    
    .containerHeadline a,
    .htmlContent a,
    .messageBody > .messageText a,
    .messageGroupAuthor a.userLink,
    .messageGroupList .columnLastPost a,
    .messageSignature > div a,
    .messageText a,
    .redactor-layer a,
    .sidebarItemTitle a.userLink,
    a.messageGroupLink,
    a.wbbLastPostAuthor,
    #tpl_wcf_notificationList .content ul.containerList.userNotificationItemList li.jsNotificationItem.notificationItem a
    {color: #286ce6 !important;
    }
    
    .containerHeadline a:hover,
    .htmlContent a:hover,
    .messageBody > .messageText a:hover,
    .messageGroupAuthor a.userLink:hover,
    .messageGroupList .columnLastPost a:hover,
    .messageSignature > div a:hover,
    .messageText a:hover,
    .redactor-layer a:hover,
    .sidebarItemTitle a.userLink:hover,
    .tabularBoxTitle > header h2 a:hover,
    a.messageGroupLink:hover,
    a.wbbLastPostAuthor:hover,
    #tpl_wcf_notificationList .content ul.containerList.userNotificationItemList li.jsNotificationItem.notificationItem a:hover
    {color: #dc143c !important;
    }
    
    .columnSubject > h3 a,
    .containerHeadline > h3,
    .tabularBoxTitle > header > h2
    {font-size: 16px !important;
    }
    
    .content .userAvatarImage
    {background: none !important;
    border: none !important;
    height: 32px !important;
    width: 32px !important;
    }
    
    .contentHeader
    {max-height: 64px !important;
    padding: 0px !important;
    margin: 0px 0px 5px 0px !important;
    }
    
    .contentHeader .contentTitle
    {font-size: 16px !important;
    font-weight: 900 !important;
    }
    
    .contentHeader.userProfileUser
    {min-height: 120px !important;
    }
    
    .contentHeader + .section,
    .contentHeader + .sectionContainer,
    .contentHeader + form,
    .messageHeader + .messageBody,
    .paginationTop + .section
    {margin-top: 0px !important;
    
    }
    .contentHeader .inlineDataList,
    .contentHeaderTitle ul,
    .messageHeaderBox > .messageHeaderMetaData *
    {color: black !important;
    }
    
    .main
    {padding: 0px !important;
    padding-bottom: 10px !important;
    }
    
    .boxesFooter,
    .boxesFooterBoxes,
    .layoutBoundary,
    .main,
    .pageFooterCopyright,
    .pageHeaderFacade,
    .pageNavigation
    {background-color: #6495ed !important;
    }
    
    .main #about,
    .main #recentActivity,
    li.jsIgnoredUser .box48
    {background: #eee !important;
    padding: 5px !important;
    }
    
    .main #recentActivity li:hover,
    .main ol.userList li.jsIgnoredUser .box48:hover
    {background: #fff !important;
    }
    
    .main .layoutBoundary
    {padding: 0px 15px !important;
    }
    
    .main ol.userList li.jsIgnoredUser
    {background: #eee !important;
    padding: 0px !important;
    }
    
    .main ol.userList li.jsIgnoredUser .box48
    {background: #eee !important;
    padding: 3px !important;
    }
    
    .message
    {border: 1px #888 solid !important;
    }
    
    .messageContent,
    .messageFooterGroup
    {
    background: #ddd !important;
    padding: 10px !important;
    margin-left: 20px !important;
    }
    
    .messageFooterGroup
    {padding: 2px !important;
    margin-top: 0px !important;
    }
    
    .messageGroupAuthor a.userLink
    .sidebarItemTitle a.userLink
    {font-style: italic !important;
    }
    
    .messageGroupList .box32 a,
    #tpl_wcf_notificationList .content ul.containerList.userNotificationItemList li.jsNotificationItem.notificationItem div.box32 div
    {width: 32px !important;
    }
    
    .messageGroupList .columnLastPost a
    {overflow: visible !important;
    }
    
    .messageGroupList .tabularList .tabularListRow:not(.tabularListRowHead) .columnStats > dl
    {visibility: visible !important;
    }
    
    .messageGroupList .tabularList li.divider ol.wbbThreadAnnouncement
    {background: #bb190040 !important;
    }
    
    .messageGroupList .tabularList li.divider ol.wbbThreadSticky
    {background: #89faff4f !important;
    }
    
    .messageGroupList .tabularList li.divider:hover
    {background: #eef6f9 !important;
    }
    
    .messageGroupList .userAvatarImage
    {background: none !important;
    border: none !important;
    height: 75% !important;
    width: 75% !important;
    }
    
    .messageHeader
    {border-bottom: 1px #888 solid !important;
    margin-bottom: 3px !important;
    padding-bottom: 0px !important;
    }
    
    .messageHeaderBox > .messageStatus *
    {color: #f5deb3 !important;
    }
    
    .messageList.messageReducedList > li:not(:last-child)
    {padding-bottom: 10px !important;
    }
    
    .messageSidebar .userAvatar span.badgeOnline
    {padding: 1px !important;
    margin: 0px 0px 0px 36px !important;
    }
    
    .pageHeaderFacade > .layoutBoundary .pageHeaderLogo > a
    {padding: 0px 0px 0px 10px !important;
    }
    
    .pageHeaderFixed .pageHeaderPanel
    {animation: none !important;
    transform: none !important;
    position: absolute !important;
    }
    
    .pageHeaderFixed .userPanel,
    .pageHeaderFacade .userPanel
    {animation: none !important;
    position: absolute !important;
    top: 10px !important;
    transition: none !important;
    -webkit-transition: none !important;
    z-index: 999 !important;
    }
    
    Media screen and (min-width:1025px)
    {.pageHeaderFixed .userPanel,
    .pageHeaderFacade .userPanel
    {left: calc((100vw - 1360px) / 2 + 400px) !important;
    }
    }
    
    Media screen and (min-width:1400px)
    {.pageHeaderFixed .userPanel,
    .pageHeaderFacade .userPanel
    {left: calc((100vw - 1360px) / 2 + 400px) !important;
    }
    }
    
    .pageHeaderNormal .pageHeaderPanel
    {position: absolute !important;
    transform: none !important;
    -webkit-transform: none !important;
    }
    
    .pageHeaderPanel,
    .pageHeaderFacade > .layoutBoundary
    {background: none !important;
    }
    
    .pageNavigation
    {padding: 10px 0px 4px 0px !important;
    }
    
    .pageNavigation
    {margin-left: 10px !important;
    }
    
    .pageNavigation .breadcrumbs
    {margin-left: 125px;
    }
    
    .pageNavigation .layoutBoundary
    {background-color: #286ce6 !important;
    margin-left: 5px;
    margin-right: 20px;
    }
    
    @-moz-document domain(camp-firefox.de) {
    .layoutBoundary 
    {max-width: 100vw !important;
    }
    }
    
    .pageNavigation .pageNavigationIcons.jsPageNavigationIcons
    {color: lightblue !important;
    flex-direction: row !important;
    left: -1160px !important;
    margin-left: 0px !important;
    margin-right: 20px !important;
    position: relative !important;
    }
    
    .pageNavigation .pageNavigationIcons.jsPageNavigationIcons::after
    {content: " Du bist hier: " !important;
    color: lightblue !important;
    font-size: 16px !important;
    font-weight: 900 !important;
    margin-left: 10px !important;
    }
    
    .paginationTop
    {margin-top: 10px !important;
    }
    
    .quoteBox .quoteBoxContent
    {font-style: normal !important;
    }
    
    .quoteBox .quoteBoxContent .quoteBox
    {background: #fef6de !important;
    margin-right: 10px !important;
    }
    
    .quoteBoxContent
    {padding-left: 10px !important;
    }
    
    .quoteBoxTitle
    {color: blue !important;
    font-size: 15px !important;
    }
    
    .quoteBoxTitle,
    .xboxesFooterBoxes .box
    {margin-bottom: 0px !important;
    }
    
    .searchBarOpen .pageHeaderSearch
    {background: none !important;
    inset: 0px !important;
    left: calc((100vw - 1360px) / 2 + 600px) !important;
    margin-top: 0px !important;
    max-width: 400px !important;
    position: absolute !important;
    top: 10px !important;
    z-index: 999 !important;
    }
    
    .searchBarOpen .pageHeaderSearch form
    {border: 1px #444 solid !important;
    }
    
    .searchBarOpen .pageHeaderSearch form .pageHeaderSearchInput
    {background: #ddd !important;
    }
    
    .searchBarOpen .pageHeaderSearch form .pageHeaderSearchInputContainer .pageHeaderSearchType > .button::after
    {text-align: start !important;
    }
    
    .searchBarOpen .pageHeaderSearch form .pageHeaderSearchType.dropdown
    {width: 200px !important;
    }
    
    .sidebar
    {margin-top: 30px !important;
    }
    
    .sidebar.boxesSidebarRight .boxContainer .box .boxTitle
    {background: #eee !important;
    border-bottom: 1px #888 solid !important;
    }
    
    .sidebar.boxesSidebarRight .boxContainer .box h2
    {padding: 20px 20px 0px !important;
    margin-top: -20px !important;
    }
    
    .tabularBoxTitle > header
    {background: #eee !important;
    border-bottom: 1px #888 solid !important;
    margin-bottom: 0px !important;
    }
    
    .tabularListRowHead > .tabularListColumns > li,
    .tabularBoxTitle > header a,
    .tabularBoxTitle > header .icon
    {color: #009cff !important;
    font-weight: 900 !important;
    }
    
    .tabularListRowHead
    {border-bottom: 2px solid #8cd2ff !important;
    }
    
    .userMention
    {background: none !important;
    border: none !important;
    padding: 0px !important;
    }
    
    .wbbBoardDescription
    {max-width: 610px !important;
    }
    
    .wbbBoardList .wbbBoard
    {padding: 2px 0px !important;
    }
    
    .xboxesFooterBoxes .boxContainer h2.boxTitle,
    .xboxesFooterBoxes .boxContainer .boxContent.messageShareButtons
    {max-height: 0px !important;
    }
    
    .xboxesFooterBoxes .boxContainer,
    .boxesFooterBoxes .boxContainer section.box:nth-of-type(2)
    {background: #eee !important;
    margin-left: 0px !important;
    margin-right: 0px !important;
    }
    
    woltlab-quote,
    .quoteBox
    {padding: 0px 0px 4px 10px !important;
    min-height: 0px !important;
    }
    
    /* Html Content, zB about:support */
    
    .messageBody > .messageText table *,
    .redactor-layer table *
    {font-size: 12px !important;
    }
    
    .htmlContent table td,
    .htmlContent table th,
    .messageBody > .messageText table td,
    .messageBody > .messageText table th,
    .messageSignature > div table td,
    .messageSignature > div table th,
    .redactor-layer table td,
    .redactor-layer table th,
    .table td,
    .table th,
    .tabularListRow
    {padding: 0px !important;
    }
    
    /* Elemente ausblenden */
    
    .box16,
    .boxesFooterBoxes .boxContainer section.box:nth-of-type(1),
    .box[data-box-identifier="com.woltlab.wcf.RegisterButton"],
    .contentHeader .contentHeaderIcon,
    .messageGroupListStatsSimple,
    .messageHeader::after,
    .messageHeader::before,
    .pageHeaderLogo .pageHeaderLogoSmall,
    .pageHeaderLogo img.pageHeaderLogoLarge,
    .pageHeaderLogo,
    .pageNavigation .pageNavigationIcons.jsPageNavigationIcons a[data-tooltip="RSS-Feed"],
    .quoteBox .userLink,
    .quoteBoxIcon,
    .sidebar.boxesSidebarRight .boxContainer .box .boxTitle::after,
    .sidebar.boxesSidebarRight .boxContainer .box .boxTitle::before,
    .tabularBoxTitle > header::after,
    .tabularBoxTitle > header::before,
    .tabularListRowHead::after,
    .tabularListRowHead::before,
    #tpl_wbb_board .wbbStats,
    #tpl_wbb_boardList .wbbStats,
    #tpl_wbb_userPostList .messageFooterGroup,
    #tpl_wcf_articleList .pageNavigation .pageNavigationIcons.jsPageNavigationIcons::after,
    #tpl_wcf_recentActivityList small.containerContentType
    {display: none !important;
    }
    
    /* Camp-Firefox Ergänzungen */
    
    #redactor-toolbar-0 
    {background: #3b83bd! important;
    }
    
    /*Vorschaufenster für eine Antwort breiter*/
    
    .dialogContent
    {min-width: 900px! important;
    }
    
    /*Text Code eingefügt*/
    
    .re-button.re-code.re-button-icon::after
    {font-weight: bold! important;
    content: 'Code' ! important; }
    
    .re-button.re-code.re-button-icon:hover 
    {color: black! important;
    }
    
    /*Rahmen um Antwortfenster*/
    
    .messageContent.messageQuickReplyContent 
    {border-left: 1px solid black! important;
    border-right: 1px solid black! important;
    border-bottom: 1px solid black! important;
    }
    
    .messageTabMenu
    {border-top: 1px solid black! important;
    border-bottom: 1px solid black! important;
    }
    
    /*Rahmen um Zitatfenster und andere*/
    
    .codeBox.collapsibleBbcode.cssHighlighter,
    .quoteBox.collapsibleBbcode,
    .quoteBox.collapsibleBbcode.collapsed,
    .codeBox.collapsibleBbcode.cssHighlighter.collapsed,
    .quoteBox.collapsibleBbcode.jsCollapsibleBbcode 
    {background: beige! important;
    border: 1px solid black! important;
    }
    
    /*Zitateblock farbig*/
    
    blockquote.quoteBox 
    {background: marigold ! important;
    }
    
    .userAvatarImage 
    {border-radius: 0 ! important;
    }
    
    span.quoteBoxTitle 
    {font-size: 16px ! important;
    }
    
    /* Smilies ausgeklappt*/
    
    LI[data-name="smilies"]
    {display:none! important;
    }
    
    DIV[class="messageTabMenuContent messageTabMenu"][data-preselect="true"][data-collapsible="false"] 
    {margin-left:10px! important;
    border:none! important;
    display: block! important;
    }
    
    .messageTabMenuNavigation.jsOnly 
    {border-bottom:1px solid black! important;
    }
    
    /* Überschriften in Unterforen */
    
    .tabularBoxTitle > header a 
    {color: marigold! important;
    }
    
    /* Boxen unterschiedlich einfaerben */
    
    #pageHeaderPanel > DIV > DIV > DIV > NAV > OL > LI:nth-child(2) > OL
    {background: beige! important;
    }
    
    #pageHeaderPanel > DIV > DIV > DIV > NAV > OL > LI:last-child > OL
    {background: red! important;
    }
    
    /* Ungelesene Themen ausblenden */
    
    .box[data-box-identifier="com.woltlab.wbb.UnreadThreads"] 
    {display: none! important;
    }
    
    /* Aufzählungszeichen ist fett */
    
    .paginationTop > nav:nth-child(1) > ul:nth-child(1) > li:nth-child(n+2) > a:nth-child(1):hover,
    .paginationTop > nav:nth-child(1) > ul:nth-child(1) > li:nth-child(n+3) > a:nth-child(1):hover,
    .messageListPagination > nav:nth-child(1) > ul:nth-child(1) > li:nth-child(n+2) > a:nth-child(1):hover,
    
    #content > FOOTER > DIV > NAV > UL > LI:nth-child(n+1) > A:hover
    {color: white! important;
    background: marigold! important;
    }
    
    /* Untere Boxen auch blau */
    .boxesFooterBoxes
    {background: #3b83bd! important;
    }
    
    /* PopUps ausblenden */
    
    @-moz-document
    url-prefix("https://www.camp-firefox.de/forum/forum/"),
    url-prefix("https://www.camp-firefox.de/suchergebnisse/"),
    url-prefix("https://www.camp-firefox.de/forum/ungelesene-beitraege/")
    
    {.popover { display: none; }
    }
    
    /* Aktiv für alle Webseiten */
    
    {text-shadow: transparent 0px 0px 0px, rgba(0,0,0,0.68) 0px 0px 0px !important
    }
    
    /* Beitrag bearbeiten hochsetzen */
    
    .wbbPost 
    {position: relative !important;
    }
    
    .messageSidebar + .messageContent 
    {padding-top: 54px !important;
    }
    
    .messageFooterGroup 
    {position: absolute !important;
    top: 0 !important;
    left: 260px !important;
    right: 30px !important;
    }
    
    .jsReportPost.jsOnly {
    margin-right: -19px !important;
    }
    
    /* URL Link - Intern */
    
    .messageSignature * a {
    color:blue !important;
    }
    
    /* URL Link - Extern */
    
    a.externalURL {
    color: red !important;
    }
    
    .messageSignature * .externalURL Span{
    color: red !important;
    }
    
    .messageSignature * .externalURL{
    color: red !important;
    }
    }
    Alles anzeigen
  • Firefox beenden Warnung.uc.js funktioniert in Fx 159 nicht mehr

    • BarbaraZ-
    • 7. Oktober 2026 um 20:04

    Dann entschuldige bitte, dass ich mich hier reingehängt habe.
    Allerdings, wenn es jetzt läuft, brauche ich es späetr nicht anzupassen.

  • Firefox beenden Warnung.uc.js funktioniert in Fx 159 nicht mehr

    • BarbaraZ-
    • 7. Oktober 2026 um 19:25

    Hallo Andreas,
    nein, ich nutze nur die "aktive" Version. Kein Nightly und kein Beta.

  • Firefox beenden Warnung.uc.js funktioniert in Fx 159 nicht mehr

    • BarbaraZ-
    • 7. Oktober 2026 um 18:23

    Hallo Mira,
    Danke, mal gleich übernommen.

  • Firefox beenden Warnung.uc.js funktioniert in Fx 159 nicht mehr

    • BarbaraZ-
    • 7. Oktober 2026 um 17:50

    Ich nutze dazu folgendes Script:

    JavaScript
    // Angepasst durch aborix
    // ab Fx 133 wird in den Zeilen 57 und 58 pinnedTabCount statt _numPinnedTabs verwendet
    // Änderung in Zeile 12 durch Sören am 30.09.2026 
    
    (function() {
    
      if (window.__SSi != 'window0')
        return;
    
      const lazy = {};
      ChromeUtils.defineESModuleGetters(lazy, {
        BrowserGlue: "moz-src:///browser/components/BrowserGlue.sys.mjs."
      });
    
      lazy.BrowserGlue.prototype._onQuitRequest =
      function BG__onQuitRequest(aCancelQuit, aQuitType) {
    
        // If user has already dismissed quit request, then do nothing
        if (aCancelQuit instanceof Ci.nsISupportsPRBool && aCancelQuit.data) {
          return;
        }
    
        // There are several cases where we won't show a dialog here:
        // 1. There is only 1 tab open in 1 window
        // 2. browser.warnOnQuit == false
        // 3. The browser is currently in Private Browsing mode
        // 4. The browser will be restarted.
        // 5. The user has automatic session restore enabled and
        //    browser.sessionstore.warnOnQuit is not set to true.
        // 6. The user doesn't have automatic session restore enabled
        //    and browser.tabs.warnOnClose is not set to true.
        //
        // Otherwise, we will show the "closing multiple tabs" dialog.
        //
        // aQuitType == "lastwindow" is overloaded. "lastwindow" is used to indicate
        // "the last window is closing but we're not quitting (a non-browser window is open)"
        // and also "we're quitting by closing the last window".
    
        if (aQuitType == "restart" || aQuitType == "os-restart") {
          return;
        }
    
        // browser.warnOnQuit is a hidden global boolean to override all quit prompts.
        if (!Services.prefs.getBoolPref("browser.warnOnQuit")) {
          return;
        }
    
        var windowcount = 0;
        var pagecount = 0;
        let pinnedcount = 0;
        for (let win of BrowserWindowTracker.orderedWindows) {
          if (win.closed) {
            continue;
          }
          windowcount++;
          let tabbrowser = win.gBrowser;
          if (tabbrowser) {
            pinnedcount += tabbrowser.pinnedTabCount; // bis Fx 132 wurde statt pinnedTabCount _numPinnedTabs verwendet
            pagecount += tabbrowser.visibleTabs.length - tabbrowser.pinnedTabCount; // bis Fx 132 wurde statt pinnedTabCount _numPinnedTabs verwendet
          }
        }
    
        // No windows open so no need for a warning.
        if (!windowcount) {
          return;
        }
    
        // browser.warnOnQuitShortcut is checked when quitting using the shortcut key.
        // The warning will appear even when only one window/tab is open. For other
        // methods of quitting, the warning only appears when there is more than one
        // window or tab open.
        let shouldWarnForShortcut =
          this._quitSource == "shortcut" &&
          Services.prefs.getBoolPref("browser.warnOnQuitShortcut");
        let shouldWarnForTabs =
          //pagecount >= 2 &&
          Services.prefs.getBoolPref("browser.tabs.warnOnClose");
        if (!shouldWarnForTabs && !shouldWarnForShortcut) {
          return;
        }
    
        if (!aQuitType) {
          aQuitType = "quit";
        }
    
        let win = BrowserWindowTracker.getTopWindow();
    
        // Our prompt for quitting is most important, so replace others.
        win.gDialogBox.replaceDialogIfOpen();
    
        let titleId = {
        id: "tabbrowser-confirm-close-tabs-title",
        args: { tabCount: pagecount },
       };
       let quitButtonLabelId = "tabbrowser-confirm-close-tabs-button";
       let closeTabButtonLabelId = "tabbrowser-confirm-close-tab-only-button";
       
       let showCloseCurrentTabOption = false;
        if (windowcount > 1) {
          // More than 1 window. Compose our own message based on whether
         // the shortcut warning is on or not.
         if (shouldWarnForShortcut) {
           showCloseCurrentTabOption = true;
           titleId = "tabbrowser-confirm-close-warn-shortcut-title";
           quitButtonLabelId =
            "tabbrowser-confirm-close-windows-warn-shortcut-button";
         } else {
           titleId = {
             id: "tabbrowser-confirm-close-windows-title",
             args: { windowCount: windowcount },
           };
           quitButtonLabelId = "tabbrowser-confirm-close-windows-button";
         }
    	        
        } else if (shouldWarnForShortcut) {
           if (win.gBrowser.visibleTabs.length > 1) {
           showCloseCurrentTabOption = true;
           titleId = "tabbrowser-confirm-close-warn-shortcut-title";
           quitButtonLabelId = "tabbrowser-confirm-close-tabs-with-key-button";
         } else {
           titleId = "tabbrowser-confirm-close-tabs-with-key-title";
           quitButtonLabelId = "tabbrowser-confirm-close-tabs-with-key-button";
         }
        }
    
        // The checkbox label is different depending on whether the shortcut
        // was used to quit or not.
        let checkboxLabelId;
        if (shouldWarnForShortcut) {
          const quitKeyElement = win.document.getElementById("key_quitApplication");
          const quitKey = ShortcutUtils.prettifyShortcut(quitKeyElement);
          checkboxLabelId = {
             id: "tabbrowser-ask-close-tabs-with-key-checkbox",
            args: { quitKey },
          };
        } else {
          checkboxLabelId = "tabbrowser-ask-close-tabs-checkbox";
        }
    
    const [title, quitButtonLabel, checkboxLabel] =
          win.gBrowser.tabLocalization.formatMessagesSync([
          titleId,      
    	  quitButtonLabelId,
          checkboxLabelId,
        ]);
    
     // Only format the "close current tab" message if needed
       let closeTabButtonLabel;
       if (showCloseCurrentTabOption) {
         [closeTabButtonLabel] = win.gBrowser.tabLocalization.formatMessagesSync([
           closeTabButtonLabelId,
         ]);
       }
    
        let warnOnClose = { value: true };
        let flags;
       if (showCloseCurrentTabOption) {
         // Adds buttons for quit (BUTTON_POS_0), cancel (BUTTON_POS_1), and close current tab (BUTTON_POS_2).
         // Also sets a flag to reorder dialog buttons so that cancel is reordered on Unix platforms.
         flags =
           (Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0 +
             Services.prompt.BUTTON_TITLE_CANCEL * Services.prompt.BUTTON_POS_1 +
             Services.prompt.BUTTON_TITLE_IS_STRING *
               Services.prompt.BUTTON_POS_2) |
           Services.prompt.BUTTON_POS_1_IS_SECONDARY;
           Services.prompt.BUTTON_TITLE_CANCEL * Services.prompt.BUTTON_POS_1;
       } else {
    	   // Adds quit and cancel buttons
         flags =
           Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0 +
           Services.prompt.BUTTON_TITLE_CANCEL * Services.prompt.BUTTON_POS_1;
       }
    
        // 1 Fenster mit höchstens 1 nicht angehefteter Tab
        if (windowcount == 1 && pagecount < 2 && this._quitSource != "shortcut") {
       title.value = "Fenster schließen?";
       quitButtonLabel.value = "Schließen";
      checkboxLabel.value = null;
       }
    
       
        let buttonPressed = Services.prompt.confirmEx(
          win,
          title.value,
          null,
          flags,
          quitButtonLabel.value,
          null,
          showCloseCurrentTabOption ? closeTabButtonLabel.value : null,
          checkboxLabel.value,
          warnOnClose
        );
    		
        // If the user has unticked the box, and has confirmed closing, stop showing
        // the warning.
        if (buttonPressed == 0 && !warnOnClose.value) {
          if (shouldWarnForShortcut) {
            Services.prefs.setBoolPref("browser.warnOnQuitShortcut", false);
          } else {
            Services.prefs.setBoolPref("browser.tabs.warnOnClose", false);
          }
        }
       // Close the current tab if user selected BUTTON_POS_2
       if (buttonPressed === 2) {
         win.gBrowser.removeTab(win.gBrowser.selectedTab);
       }
       
        this._quitSource = "unknown";
    
        aCancelQuit.data = buttonPressed != 0;
      }
    
    })();
    Alles anzeigen

    Egal ob ich eineoder mehrere Fenster schließe.
    Klappt tadellos.

  • Umrandung für Adresszeile

    • BarbaraZ-
    • 30. September 2026 um 20:09

    Hallo Andreas, ich war so frei und habe mich mal beim Code aus Beitrag #2 bedient.
    Viele Dank.

  • Firefox beenden Warnung.uc.js funktioniert in Fx 159 nicht mehr

    • BarbaraZ-
    • 30. September 2026 um 17:10

    Ich habe die Änderung aus Beitrag #2 mal gleich in die aktuelle Version von 157.0 übernommen.
    Klappt tadellos.

  • Symbol Sidebars anzeigen ausblenden

    • BarbaraZ-
    • 29. September 2026 um 17:31

    schlingo Ja, das habe ich hiermit ausgeblendet:

    CSS
    /* Hamburger-Menu ausblenden */
    #PanelUI-button
    { display: none !important; }

Unterstütze uns!

Jährlich (2026)

76,1 %

76,1% (589,79 von 775 EUR)

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