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

Beiträge von Mira_Belle

  • Andere Tabs schließen?

    • Mira_Belle
    • 28. August 2026 um 15:45

    Schade dass niemand das Skript ausprobiert hat, dann wäre aufgefallen, dass es das Falsche ist!

    OK, verstehe ich das richtig, dass es darum geht so wenig JS-Code zu verwenden als möglich?
    Das richtige Skript von mir hat nur 28 Zeilen JS-Code!

    Aber ist jetzt egal, es soll ja nicht in einen Wettstreit ausarten.

  • Andere Tabs schließen?

    • Mira_Belle
    • 28. August 2026 um 14:35
    Zitat von Mitleser

    Das Script aus Beitrag #36 ist keinesfalls ein repariertes Script sondern eine neue, funktionierende Lösung, ...

    Super, einen direkten Vergleich werde ich dann bei mir machen.
    Zumal beide Skripte in etwa gleich viele Zeilen Code haben!
    Ich würde mich freuen, wenn Du "mein" Skript mal unter Linux testen könntest.

  • Andere Tabs schließen?

    • Mira_Belle
    • 28. August 2026 um 10:04
    Zitat von 2002Andreas

    Es ging Mitleser darum, dass das Skript bei ihm funktioniert, bei anderen aber nicht.

    Ok, dann vergesst meinen Beitrag, oder, da nach unserer Konversation ja noch nichts geschrieben wurde,
    kannst Du meinen Krempel ja den Übersichtlichkeit halber löschen.

  • Andere Tabs schließen?

    • Mira_Belle
    • 28. August 2026 um 09:59

    2002Andreas Das weiß ich!
    Ist es denn wirklich so, dass ein kaputtes Skript zu "reparieren" wichtiger ist, als eine funktionierende Lösung anbieten zu können?

  • Andere Tabs schließen?

    • Mira_Belle
    • 28. August 2026 um 09:10

    Komme mal wieder zu spät!!
    Mit meinem Skript habe ich keine Probleme.

    Zum Vergleich:

    JavaScript
    // ==UserScript== 
    // @name           
    // @description    Tab schließen + Kontextmenü auch in dem Einstellungsfenster
    // @charset        UTF-8
    // @author         @aborix 5. November 2020
    // @version        v2025.05.02
    // @note           Vorlage Script von @aborix (+ Änderungen von @milupo aus dem Fuchsforum 1.10.24)
    // @note           Anpassung von @milupo ( 08.10.2024 ab Fx 132 > tabbrowser-tabbox statt appcontent)
    // @Source         https://www.camp-firefox.de/forum/thema/131567/?postID=1158359#post1158359
    // EventListener   https://www.camp-firefox.de/forum/thema/131567/?postID=1270981#post1270981
    
    
    (function() {
    
      if (!window.gBrowser)
        return;
    
      var contextMenu = document.getElementById('contentAreaContextMenu');
      var menuseparator = document.createXULElement('menuseparator');
      menuseparator.id = 'context-sep-closetab';
      contextMenu.append(menuseparator);
      var menuitem = document.createXULElement('menuitem');
      menuitem.id = 'context-closetab';
      menuitem.setAttribute('label', 'Tab schließen');
      //menuitem.setAttribute('oncommand', 'gBrowser.removeCurrentTab();');
      /* Fix1 */
      //menuitem.addEventListener('click', () => {
      //  BrowserCommands.closeTabOrWindow();
      //});
      contextMenu.append(menuitem);
    
      //var appcontent = document.getElementById('appcontent');
      var appcontent = document.getElementById('tabbrowser-tabbox');
      appcontent.addEventListener('contextmenu', event => { 
        setTimeout(() => {
          if (gContextMenu && !gContextMenu.shouldDisplay) {
            for (let string of 'back forward reload bookmarkpage'.split(' ')) {
              document.getElementById('context-' + string).removeAttribute('hidden');
            }
            document.getElementById('context-stop').setAttribute('hidden', 'true');
            const A = 'navigation sep-navigation savepage sep-paste selectall sep-viewsource viewsource viewinfo sep-bidi inspect-a11y inspect sep-closetab closetab'.split(' ');
            for (let node of contextMenu.childNodes) {
              if (A.includes(node.id.substring(8)))
                node.removeAttribute('hidden');
              else
                node.setAttribute('hidden', 'true');
            }
            contextMenu.openPopupAtScreen(event.screenX, event.screenY, true, event);
          }
        }, 50);
      });
    
          /* Fix 2 */
          document.getElementById('context-closetab').addEventListener('click', () => {
                 BrowserCommands.closeTabOrWindow();
         });
    })();
    Alles anzeigen

    Es sind zwei mögliche Fixe enthalten!

  • extra_config_menu.uc.js > ohne security.allow_unsafe_dangerous_privileged_evil_eval auf false

    • Mira_Belle
    • 27. August 2026 um 16:53
    Zitat von FuchsFan

    Aber ja! :)

    Na dann =>

    JavaScript
    // ==UserScript==
    // @name           extras_config_menu.uc.js
    // @compatibility  Firefox 154*.*
    // @include        main
    // @version        1.0.20260826
    // @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.
    // @Source         https://www.camp-firefox.de/forum/thema/140829/?postID=1293269#post1293269
    
    // ==/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.                   */
    /* ----------------------------------------------------------------------------------- */
    
    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: 'C:\\Program Files (x86)\\Notepad++\\notepad++.exe',
      TextOpenExe: 'C:\\Program Files\\Microsoft VS Code\\Code.exe',
      // Falls gewuenscht, kann hier ein Dateimanager eintragen (komplett leer lassen fuer Dateimanager des Systems) Beispiele:
      // vFileManager: 'E:\\Total Commander\\Totalcmd.exe',
      // vFileManager: 'C:\\Program Files (x86)\\FreeCommander\\FreeCommander.exe'
      vFileManager: '',
      // 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"0: nein / Menue unter "Extras"
      // 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: 'edit.svg',         // [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") {
            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 {
                  // festes Base64-PNG-Icon
                  button.style.listStyleImage = 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACnElEQVR4Xm2RzYtbZRSHn/fr3pvJzTB3qiNM2k2pMBUGhEHaqsUqdeFGQalCobgREaFu/B/cqCtxVSjoQhBEQRBmIfWDKgNGJUPt0Nhah9JJ4iSd5E6+bu5972tAO4SS5/DjXZ1znsMrNiq1eikMQqYYJCmjxNH5+zdW777L0J5KKl9VPmnf+ut9KWkwhbheuzNcOVYOmGKc5iRO0r1ykeXCx0h7kt4fC3z5wfqbQnAJwQHa5S7jAZSRuJ0mkf81cheobhBXZa+ri1uptQjHAZoZCEC1PiPgDuwxCfwerBU7b73zXn//3usCcdt4HkZ7SGZg431U51NUCgwlO3cV/bVXhR/6p9ut+nP9QYeNn7/n8qUPZxvQ/Q6VVWHk4ZqWRvlJjpx9hcGfW2wO95N2q8m3618A2WwDt/0RplSAXsBed57eyossHl5GYdHacG3zGpADM06wjQ1UUIN+CLHPvfAxojPnKLiE+bDE1R9+5GatAmgPeGCAteQ7l5GBhGSyuROyd/gFouUyWkqEErR2mwXAAA8BRS0AgMQBjSra30ZkEeDzz9Dn4ZcvMO51SMcJcTdGChmA0ABA6cAgzyG3I8jLEBylV4fWoaeIc0V7t0Uv7pFbC+CA+28mp/8+SwXKnMVmz1O9HpE+eobMZdjcoY1GIHD/NwIdoH1fBaNguzlg88pVyoUi4vTbFI8eJxsNAIfSkrliESllH/L0v0jktNNomFGv1TFrL3Fo9QSMR3jaEEXzLC09gjaKp595No0WjyCEB4zRclICUMDxtRMce/wJ1MIi2SglXShhfI/cOjxPoZRmbq4gXzt/gVrtBrdvbiG+Wf+p/mvll1BpiVAGhCDPxuAUDotz4HKHlIJON6bRbL4hhPjcMx5mkn8BBLEUrsVZbq0AAAAASUVORK5CYII=)';
                }
              }
    
    
            });
          }
          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,
        #submenu-cssweb,
        menuitem.uProfMenu_folder[label="CSSShadow-Ordner"],
        menuitem.uProfMenu_folder[label="CSSWeb-Ordner"]  {
          display: none !important;
        }
          `), null, null);
          sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
    */
        // 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.uc.js > ohne security.allow_unsafe_dangerous_privileged_evil_eval auf false

    • Mira_Belle
    • 27. August 2026 um 15:49

    FuchsFan Ich habe Deinen Ratschlag befolgt und es ermöglicht
    einen eigenen Ordner für die Skripte unter "chrome" zu benennen!

    Die betreffende Variable und die Erläuterung dazu:

    JavaScript
      // 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',

    Ist klar was gemeint ist, oder muss/ sollte das irgendwie anders Formuliert werden?

  • extra_config_menu.uc.js > ohne security.allow_unsafe_dangerous_privileged_evil_eval auf false

    • Mira_Belle
    • 27. August 2026 um 15:08

    2002Andreas Du hattest noch die Version mit dem internen CSS erwischt!
    War mein Fehler!
    Habe kurz drauf meinen Fehler erkannt und den Beitrag editiert
    und das CSS aus dem Skript entfernt.
    Probiere es noch einmal aus, bitte.

    Mit dieser Konfiguration schaut es dann so aus

    Hier die Konfig:

    JavaScript
      // ■■ 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: 'C:\\Program Files (x86)\\Notepad++\\notepad++.exe',
      TextOpenExe: 'C:\\Program Files\\Microsoft VS Code\\Code.exe',
      // Falls gewuenscht, kann hier ein Dateimanager eintragen (komplett leer lassen fuer Dateimanager des Systems) Beispiele:
      // vFileManager: 'E:\\Total Commander\\Totalcmd.exe',
      // vFileManager: 'C:\\Program Files (x86)\\FreeCommander\\FreeCommander.exe'
      vFileManager: '',
      // 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"0: nein / Menue unter "Extras"
      // 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,
      // 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: 0,  // Default => 0
      // Symbol (Icon) nur fuer Button:
            icon: 'edit.svg',         // [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 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    Alles anzeigen
  • extra_config_menu.uc.js > ohne security.allow_unsafe_dangerous_privileged_evil_eval auf false

    • Mira_Belle
    • 27. August 2026 um 10:16

    Leck mich am ...... (von mir selbst zensiert) :saint:
    Das lief ja besser als ich dachte.
    Habe noch ein paar weitere Änderungen vorgenommen!
    Was haltet ihr davon?

    JavaScript
    /*
    // ==UserScript==
    // @name           extras_config_menu.uc.js
    // @compatibility  Firefox 154*.*
    // @include        main
    // @version        1.0.20260826
    // @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 Anpassung für security.allow_unsafe_dangerous_privileged_evil_eval = false
    // @edit           @Mira 8/26 Anpassung für Userscripte im Unterordner "chrome/scripts", Expliziter Ausschluss von "userChromeShadow.uc.js"
    // @edit           @Mira 8/26 Anpassung für Ausschluss von "userChromeShadow.uc.js", lässt sich auswählen
    // @edit           @Mira 8/26 Anpassung für "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 Anpassung für den Button. Auswahl für flexibles SVG-Icon oder festes Base64-PNG-Icon hinzugefügt
    
    // ==/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.                   */
    /* ----------------------------------------------------------------------------------- */
    
    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: 'C:\\Program Files (x86)\\Notepad++\\notepad++.exe',
      TextOpenExe: 'C:\\Program Files\\Microsoft VS Code\\Code.exe',
      // Falls gewuenscht, kann hier ein Dateimanager eintragen (komplett leer lassen fuer Dateimanager des Systems) Beispiele:
      // vFileManager: 'E:\\Total Commander\\Totalcmd.exe',
      // vFileManager: 'C:\\Program Files (x86)\\FreeCommander\\FreeCommander.exe'
      vFileManager: '',
      // 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"0: nein / Menue unter "Extras"
      // 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,
      // 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: 0,  // Default => 0
      // Symbol (Icon) nur fuer Button:
            icon: 'edit.svg',         // [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") {
            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 {
                  // festes Base64-PNG-Icon
                  button.style.listStyleImage = 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACnElEQVR4Xm2RzYtbZRSHn/fr3pvJzTB3qiNM2k2pMBUGhEHaqsUqdeFGQalCobgREaFu/B/cqCtxVSjoQhBEQRBmIfWDKgNGJUPt0Nhah9JJ4iSd5E6+bu5972tAO4SS5/DjXZ1znsMrNiq1eikMQqYYJCmjxNH5+zdW777L0J5KKl9VPmnf+ut9KWkwhbheuzNcOVYOmGKc5iRO0r1ykeXCx0h7kt4fC3z5wfqbQnAJwQHa5S7jAZSRuJ0mkf81cheobhBXZa+ri1uptQjHAZoZCEC1PiPgDuwxCfwerBU7b73zXn//3usCcdt4HkZ7SGZg431U51NUCgwlO3cV/bVXhR/6p9ut+nP9QYeNn7/n8qUPZxvQ/Q6VVWHk4ZqWRvlJjpx9hcGfW2wO95N2q8m3618A2WwDt/0RplSAXsBed57eyossHl5GYdHacG3zGpADM06wjQ1UUIN+CLHPvfAxojPnKLiE+bDE1R9+5GatAmgPeGCAteQ7l5GBhGSyuROyd/gFouUyWkqEErR2mwXAAA8BRS0AgMQBjSra30ZkEeDzz9Dn4ZcvMO51SMcJcTdGChmA0ABA6cAgzyG3I8jLEBylV4fWoaeIc0V7t0Uv7pFbC+CA+28mp/8+SwXKnMVmz1O9HpE+eobMZdjcoY1GIHD/NwIdoH1fBaNguzlg88pVyoUi4vTbFI8eJxsNAIfSkrliESllH/L0v0jktNNomFGv1TFrL3Fo9QSMR3jaEEXzLC09gjaKp595No0WjyCEB4zRclICUMDxtRMce/wJ1MIi2SglXShhfI/cOjxPoZRmbq4gXzt/gVrtBrdvbiG+Wf+p/mvll1BpiVAGhCDPxuAUDotz4HKHlIJON6bRbL4hhPjcMx5mkn8BBLEUrsVZbq0AAAAASUVORK5CYII=)';
                }
              }
    
    
            });
          }
          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);
        }
    
        // 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("scripts");
        if (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/scripts/" + 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.uc.js > ohne security.allow_unsafe_dangerous_privileged_evil_eval auf false

    • Mira_Belle
    • 26. August 2026 um 22:42
    Zitat von Endor

    Der kann weg. Der wurde nur gebraucht wenn das Script userScriptloader.uc.js

    Danke für die Erklärung, dann kann der Code dafür ja ausgemistet werden.
    Macht das Skript dann etwas "schlanker".

    Zitat von 2002Andreas

    Im ersten liegen die CSS-Dateien für Shadow:

    Was auch immer das bedeuten soll,
    aber Deine Erklärung sagt mir, es ist von Nutzen.
    Also bleibt es!
    Ich nutze es nicht, also blende ich es nur per internem CSS aus
    und versehe es mit einem Kommentar!

    Zitat von 2002Andreas

    Im anderen die CSS-Dateien für Webseiten etc.

    Nutze ich so zwar auch nicht, was ich aber überdenken werde,
    denn es macht ja die userContent.css wieder übersichtlicher:!:
    Ergo, das bleibt auch!

    Fazit.

    Der Code für "Bild Url" & "config Einträge.css" sowie
    für die "Einbindung GM-Skripte-Ordner" kann weg.

    Der Code für "CSSShadow-Ordner" & "CSSWeb-Ordner" belasse ich unangetastet im Skript,
    für mich persönlich schaffe ich ein internes CSS und blende den für mich uninteressanten Menüeintrag einfach aus.

    Und so gehe ich auch bei den beiden Menüeinträgen "CSSShadow" & "cssweb" vor.

    Das Skript wird um Code zur Aktivierung/Deaktivierung der Sichtbarkeit der Datei "userChromeShadow.uc.js" ergänzt.
    Per Default nicht sichtbar! Und natürlich auch mit Erläuterung. 8o

    Melde mich dann wieder, wenn ich etwas vorzuweisen habe,
    oder wenn jemand noch eine Frage oder Anmerkung hat.

  • extra_config_menu.uc.js > ohne security.allow_unsafe_dangerous_privileged_evil_eval auf false

    • Mira_Belle
    • 26. August 2026 um 21:21

    Auf ein Neues!

    Dies bezierht sich auf 2002Andreas Beitrag!!

    Den UserScriptLoader nutze ich, aber ich habe den so ganz anders eingebunden
    und der lädt ganz normal die Skripte, die im Ordner

    C:\Users\Mira\AppData\Roaming\Mozilla\Firefox\Profiles\Mira\chrome\scripts

    liegen.

    :/

    Ok, also werde ich den Code für "Deine" Erweiterung rausschmeißen!
    ( Bild Url.css und config Einträge.css )

    Was ich mich noch frage, wozu sind "CSSShadow-Ordner" & "CSSWeb-Ordner" da?
    Nutze ich nicht, sind nicht angelegt
    und diese Einträge habe ich per internem CSS ausgeblendet.

    Womit ich auch so gar nichts anfangen kann,
    sind die Submenüs "CSSShadow" und "cssweb"
    Auch diese habe ich per internem CSS vorerst ausgeblendet!

    Wer sich nun fragt warum nicht gleich den Code bereinigen.
    1. Ich weiß nicht wozu diese Einträge da sind.
    2. Wollte ich so wenig Code wie möglich ändern und nur notwendige Anpassungen vornehmen.
    ... Der Code soll ja so nah wie Möglich am Original bleiben!!

    Wäre also sehr schön, wenn mir jemand Erklärungen liefern könnte und
    auch was mit den "Einbindung GM-Skripte-Ordner" passieren soll.
    Wird das denn noch genutzt?

    Zitat von 2002Andreas

    Das möchte ich nicht entscheiden, nur ich habe das noch nie genutzt/gebraucht. Evtl. können ja andere User etwas dazu sagen.

    Und ich denke, dass es keine schlechte Idee ist die userChromeShadow.uc.js per Funktion sichtbar oder unsichtbar zu machen.
    Dann kann jeder Anwender selbst entscheiden!
    Im Grunde ist das zwar meiner Meinung Quatsch, da das Menü ja zum direkten Aufruf der Dateien da ist,
    damit sie eben direkt bearbeitet werden können und genau diese Datei eigentlich nie bearbeitet werden sollte,
    aber wenn es doch jemand braucht, warum nicht!
    Sie würde ja auch nur angezeigt werden, wenn sie vorhanden ist.

  • UserCSSLoader (2025)

    • Mira_Belle
    • 26. August 2026 um 20:59

    bege's Version funktioniert bestens und auch die Symbole werden entsprechend richtig angezeigt.

    Danke!

  • UserCSSLoader (2025)

    • Mira_Belle
    • 26. August 2026 um 14:38

    Also ich hatte es in Version 150 getestet, CSS wurde ein, bzw ausgeschaltet,
    aber die Häkchen waren immer sichtbar!! Egal ob das CSS aktiviert oder deaktiviert war.

  • extra_config_menu.uc.js > ohne security.allow_unsafe_dangerous_privileged_evil_eval auf false

    • Mira_Belle
    • 26. August 2026 um 14:34

    Mh, danke für den Hinweis.
    Kommt davon, wenn man mehrere Sachen gleichzeitig macht, machen will.
    Und im Hintergrund hatte ich schon einen ellenlangen Text, der nun verloren geagangen ist,
    weil der Browser einfach neu startete. DAS muss ich mal beobachten,
    eventuell war das ja auch nur ein Bedienfehler.

  • UserCSSLoader (2025)

    • Mira_Belle
    • 26. August 2026 um 11:51
    Zitat von lenny2

    Es ist unmöglich, den Stil zu deaktivieren. Wenn ich den Stil in der Dropdown-Liste auswähle, verschiebt sich das Symbol in der Liste um einige Pixel nach links, aber der Stil wird nicht deaktiviert.

    Diese Erklärung verstehe ich nicht.
    Was meinst Du mit "Stil"?
    Ob ein Button oder ein Menü erstellt werden soll?

  • extra_config_menu.uc.js > ohne security.allow_unsafe_dangerous_privileged_evil_eval auf false

    • Mira_Belle
    • 26. August 2026 um 11:48
    Zitat von 2002Andreas

    Naja, du musst sie bearbeiten, wenn du weitere Codes eintragen willst. Oder du musst sie mit einer @import url befüllen, und diese dann erweitern wenn nötig. Wobei du dann allerdings noch einen weiteren Ordner erst selber erstellen musst.

    "Reden" wir beide vom Skript?
    Denn um dieses geht es mir, das muss in der Regel nicht mehr bearbeitet werden,
    denn es ist ja nur dazu da, dass die userChromeShadow.css geladen wird.

    Zitat von 2002Andreas

    Bisher hat noch niemand wirklich gefragt, wozu diese beiden Dateien sind:

    Mh, habe ich mich schon gefragt.
    Aber da ich deren Nutzen noch nicht erkannt habe, habe ich diese Menüeinträge einfach per externem CSS einfach ausgeblendet.
    Bin aber froh, dass Du dafür jetzt aber eine Erklärung nachreichst.

    Ob diese Funktion überhaupt von irgendwem genutzt wird?
    Wenn nicht, könnte man den Skriptcode bereinigen.
    Dann wäre das Skript etwas "schlanker"!
    Kann aber alles belassen und eben per internem CSS ein oder ausblenden.
    Was meinst Du? Was wäre wohl die "bessere" Variante?

    Zitat von 2002Andreas

    Oder auch diese Dateien, die ja wohl gar nicht mehr gebraucht werden :/

    Sind die nicht für "Einbindung GM-Skripte-Ordner", also Greasemonkey [Profil-Verzeichnis], UserScriptLoader [Chrome-Verzeichnis] oder Scriptish [Profil-Verzeichnis]) vonnöten?
    Oder?
    Denkst Du, das kann "raus"?
    Für Entschlackung des Codes wäre es ja gut.

  • extra_config_menu.uc.js > ohne security.allow_unsafe_dangerous_privileged_evil_eval auf false

    • Mira_Belle
    • 26. August 2026 um 11:15

    2002Andreas Danke für den Hinweis.

    Habe mir über alles noch keine Gedanken gemacht,
    aber natürlich werde ich in den Erläuterungen genauer darauf eingehen!

    Und du hast recht, wer die userChromeShadow.uc.js gar nicht angelegt hat,
    bekommt diese ja auch gar nicht gezeigt!
    Wer die userChromeShadow.css zwecks ::part benötigt, wird, sollte, wissen wofür
    die userChromeShadow.uc.js vorhanden ist.

    Meine Tendenz, per "default" ausgeblendet, da in der Regel diese Datei eh nie bearbeitet werden muss.
    Und die "Liste" ist ja nicht nur zur Auflistung der Skripte da, sondern eher dafür, diese direkt in einem Editor
    aufrufen und bearbeiten zu können.
    So sehe ich das zumindest.
    Oder?

  • UserCSSLoader (2025)

    • Mira_Belle
    • 26. August 2026 um 10:09

    lenny2 Mir scheint, dass Deine Version des Skripts eine ältere Version ist!
    Hast Du denn schon mal die oben verlinkte,

    userChrome.js/Firefox 143/usercssloader/usercssloader.uc.js at master · Endor8/userChrome.js
    Skripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.
    github.com

    ausprobiert?


    Nachtrag!

    Gerade noch einmal getestet.
    Das Skript funktioniert.

  • UserCSSLoader (2025)

    • Mira_Belle
    • 26. August 2026 um 09:08

    Hallo lenny2
    Poste doch mal Dein komplettes Skript. Es geistern mittlerweile so viele Versionen davon hier herum,
    dass man um zu helfen, erraten muss, wo ein Fehler vorliegen könnte.

  • extra_config_menu.uc.js > ohne security.allow_unsafe_dangerous_privileged_evil_eval auf false

    • Mira_Belle
    • 26. August 2026 um 09:00

    bege Erst einmal vielen lieben Dank für Dein Skript.

    Da muss ich mich mal näher mit befassen, aber so beim drüberfliegen,
    habe ich schon so ein zwei Sachen gesehen, die ich richtig gut finde.

    In Deinen Anmerkungen hast Du erwähnt, dass Du lieber das CSS im Code hast.
    Das geht mir eigentlich genau so und ich werde da auch nochmal drüber schlafen,
    denn das wird wirklich sehr unübersichtlich, Code hier, Code da,
    und alles greift irgendwie ineinander, wenn es crasht, geht die Suche los.
    Das ist ätzend.

    Und das mit der Angabe von Zeilennummern, da hast Du auch völlig recht,
    das stimmte ja schon im originalen Skript nicht mehr!

    userChromeShadow.uc.js, Du hast recht! Ich nutze sie, da sie für das Laden der userChromeShadow.css gebraucht wird,
    aber selbst keinen weiteren Code darin "verewigt" habe.
    Ich dachte mir halt, lieber ausschließen, damit nicht jemand Unbedarftes diese ändert oder gar einfach löscht!
    Denn dann ist das Gejammere wieder groß, weil der Firefox nicht mehr so ausschaut wie gewünscht,
    und wer kommt schon darauf, dass es an Selektoren liegt, die einen ::part() Selektor benötigen?
    Und da haben wir es dann wieder, liegt der Fehler am Skript, oder im CSS:?:
    Sitze ich selbst am Rechner, finde ich den Fehler recht schnell, aber so aus der Ferne?

    Aber okay, ich werde das nochmals überdenken und eventuell per Grundeinstellung ausblenden,
    Also per "Schalter" ON, OFF. (1/0).

Unterstütze uns!

Jährlich (2026)

71,6 %

71,6% (554,79 von 775 EUR)

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