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

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

    • Mira_Belle
    • 14. August 2026 um 22:14

    ok

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

    • Mira_Belle
    • 12. August 2026 um 23:27
    Zitat von Mira_Belle

    Was passierte denn bisher bei Linksklick?

    Ich beantworte mal meine Frage selber!!
    Nichts.

    Werde mir überlegen, ob ich das wieder auf den Mittelklick lege,
    oder ob es in dem Konfigbereich dafür eine Einstellung geben wird,

    oder, ob auf eine Taste, Mitte oder Rechte eine weitere Funktion drauf kommt!

    Könnt ja mal darüber diskutieren.
    Einstellungen oder ...
    Überlegt mal was am ehesten Sinn ergibt.
    Mh, ob wohl ich Option 1 präferiere.
    Dann kann jeder selber festlegen mit welcher Taste der Tab mit about:config sich öffnet.


    Gute n8
    werde alles Weitere per Smartphone hier verfolgen,
    eventuell auch mal eine Nachricht hinterlassen,
    aber am Skript werde ich nichts mehr machen.

    Bin dann mal weg.
    Mein Schiff ich koooooome.

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

    • Mira_Belle
    • 12. August 2026 um 23:11

    Äh, nein.

    Der Linksklick öffnet den Tab mit about:config

    Was passierte denn bisher bei Linksklick?


    Noch kann ich das schnell ändern!!
    Muss aber ins Bett, um 4:30 Uhr ist die Nacht vorbei!!
    Und dann kann ich erst in 14 Tagen etwas ändern.

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

    • Mira_Belle
    • 12. August 2026 um 22:26

    So allgemein, weil auch Mitleser das offensichtlich missverstanden hatte.

    Ist aber jetzt nicht mehr so dringlich, da ich mich nun festgelegt habe!
    Ich finde "Meine Skripte" recht gut,
    da dieser Ausdruck ja auch im Menü Verwendung findet.

    Schaut dann so aus:

    Code
    Meine Skripte (5):
    ------------------------
    1. # check.uc.js
    2. # 1 extensionsUpdateChecker.uc.js
    3. # 1_TEST.uc.js
    4. # 1_TEST_2.uc.js
    5. # FoxInstanzStarter.uc.js
  • extra_config_menu.uc.js > ohne security.allow_unsafe_dangerous_privileged_evil_eval auf false

    • Mira_Belle
    • 12. August 2026 um 22:15

    Schreibe ich so verwirrend?
    Es geht nicht ums Menü!!

    Aber, ja, ich werde die betreffend Zeile

    var retValue = "Installierte Skripte (" + sArray.length + "):\n------------------------";

    in

    var retValue = "Meine Skripte (" + sArray.length + "):\n------------------------";

    ändern:!:

    Dann passt das alles auch zusammen!
    Ergibt Sinn.

    ---------------------------------------------------------
    Ist erledigt:!:

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

    • Mira_Belle
    • 12. August 2026 um 21:29

    Mitleser
    Das Script wurde von mir nur Fehlerbereinigt und moderat angepasst!
    Es funktioniert genau so, wie das Ursprüngliche auch!

    Wenn das Ursprüngliche für Linux, und wahrscheinlich auch für Apple angepasst werden musste,
    so dann auch diese Version.

    Bei dem Ausdruck "Eigene Skripte", ging es nur um die oberste Zeile,
    wenn Du auf "Skriptliste in Zwischenablage" klickst
    und dann alles aus der Zwischenablage dann irgendwo einfügst!

    Siehe hier, einfach aus der Zwischenablage hier eingefügt:

    Code
    Eigene Skripte (5):
    ------------------------
    1. # check.uc.js
    2. # 1 extensionsUpdateChecker.uc.js
    3. # 1_TEST.uc.js
    4. # 1_TEST_2.uc.js
    5. # FoxInstanzStarter.uc.js

    "Userskripte" oder "Benutzte Skripte" oder "Installierte Skripte" fielen mir ein.
    Gefällt mir aber alles nicht so wirklich.
    Daher die Frage, ob jemand einen besseren Begriff parat hat. ;)

    Wenn es keine Vorschläge geben sollte, tendiere ich dann doch z.Z. am ehesten zu "Userskripte".
    Aber ich bin wankelmütig:!:
    Kann morgen schon wieder ganz anders sein.

  • "Die Magie ist weg"

    • Mira_Belle
    • 12. August 2026 um 16:28

    Ich konnte es nachvollziehen, ob wohl ich nicht vom Fach bin!

    Klar, mithilfe des Werkzeuges bekomme ich auch so einiges hin.
    Doch wirklich "programmieren" kann ich nicht!!
    Für mich ist es eher wie hacken!
    Aber im Gegensatz zu manch anderen lasse ich mir sehr oft
    so ein Skript Zeile für Zeile von dem Werkzeug erklären,
    damit ich so einigermaßen verstehe, was da so passiert und was der Code so macht.
    Das eine oder andere habe ich tatsächlich gelernt und muss nicht bei jeder kleinen Änderung die KI bemühen.

    Aber im Artikel ging es ja auch um noch tiefere Schichten und da bin ich definitiv raus!!
    Er hat es aber sehr schön beschrieben!!
    Vom Macher und Lösungsfinder zum Kontrolleur.

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

    • Mira_Belle
    • 12. August 2026 um 14:29

    Bereinigte und überarbeitete Version!

    JavaScript
    /*
    // ==UserScript==
    // @name           extras_config_menu.uc.js
    // @compatibility  Firefox 153*.*
    // @include        main
    // @version        1.0.20260812
    // @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 "Skriptliste in Zwischenablage"
    // ==/UserScript==
    */
    
    var uProfMenu = {
      // --- KONFIGURATION (unchanged) ---
      TextOpenExe: 'C:\\Program Files\\Microsoft VS Code\\Code.exe',
      vFileManager: '',
      warpmenuto: 'helpMenu',
      sortScripts: 0,
      gmOrdner: 0,
      cssOrdner: 1,
      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'
              ],
      showNormalPrefs: 1,
      enableScriptsToClip: 2,
      enableRestart: 0,
    
      // --- INIT (ANGEPASST) ---
      init: function() {
        if (this.warpmenuto.toLowerCase() == 'menu') {
          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.");
            return;
          }
          var menu = zielmenu.appendChild(this.createME("menu", "Config Men\u00FC", null, 0, "ExtraConfigMenu"));
          menu.setAttribute("class", "menu-iconic");
          // Ersetze ondblclick durch addEventListener
          menu.addEventListener('dblclick', function() {
            openTrustedLinkIn('about:config', 'tab');
          }, true);
        } else {
          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"
            });
          }
          var menu = document.getElementById("ExtraConfigMenu-button");
    
          // KORREKTUR:
          if (!menu) {
            return;
          }
    
          menu.setAttribute("type", "menu");
          menu.addEventListener('click', function(event) {
            if (event.button == 2 && !this.open) {
              openTrustedLinkIn("about:config", "tab");
              event.preventDefault();
            }
          }, true);
        }
    
        // CSS-Styles (unchanged)
        var css = " \
          #ExtraConfigMenu, #ExtraConfigMenu-button { \
            list-style-image: 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=);  \
            margin-top: 0px !important; \
            opacity: 1 !important; \
          } \
          #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);
    
        // 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"));
        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"));
    
        // 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) ---
        menupopup.appendChild(this.createME(
          "menuitem", "Bild Url",
          function() { uProfMenu.edit(0, 'Bild Url.css'); },
          "uProfMenu_edit", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "config Einträge.css",
          function() { uProfMenu.edit(0, 'config Einträge.css'); },
          "uProfMenu_edit", 0
        ));
        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
        ));
    
        // --- ORDNER (ANGEPASST: sCommand als Funktion) ---
        menupopup.appendChild(document.createXULElement('menuseparator'));
        switch (this.gmOrdner) {
          case 1:
            menupopup.appendChild(this.createME(
              "menuitem", "GM-skripty",
              function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD') + uProfMenu.getDirSep() + 'gm_scripts'); },
              "uProfMenu_folder", 0
            ));
            break;
          case 2:
            menupopup.appendChild(this.createME(
              "menuitem", "USL-skripty",
              function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm') + uProfMenu.getDirSep() + 'UserScriptLoader'); },
              "uProfMenu_folder", 0
            ));
            break;
          case 3:
            menupopup.appendChild(this.createME(
              "menuitem", "Skripty Scriptish",
              function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD') + uProfMenu.getDirSep() + 'scriptish_scripts'); },
              "uProfMenu_folder", 0
            ));
            break;
        }
    
        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
        ));
    
        // --- ABOUT-SEITEN (ANGEPASST: Closure-Problem gelöst) ---
        if (this.abouts.length > 0) {
          menupopup.appendChild(document.createXULElement('menuseparator'));
          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 {
            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);
          }
        }
    
        // --- EINSTELLUNGEN & NEUSTART (ANGEPASST) ---
        if (this.abouts.length == 0 && (this.showNormalPrefs || typeof(ToolRstartMod) != "undefined")) {
          menupopup.appendChild(document.createXULElement('menuseparator'));
        }
        if (this.showNormalPrefs) {
          menupopup.appendChild(this.createME(
            "menuitem", "Einstellungen",
            function() { try { openOptionsDialog(); } catch(e) { openPreferences(); } },
            "uProfMenu_prefs", 0
          ));
        }
        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) ---
      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();
    
        // --- Pfad-Handling für chrome/scripts/ ---
        if (Filename.includes("/") || Filename.includes("\\")) {
          Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename;
        } else {
          // Original-Logik
          switch (OpenMode) {
            case 0: Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename; break;
            case 1: Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename; break;
            case 2: Path = Filename; break;
            case 3: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSS" + dSep + Filename; break;
            case 4: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSWeb" + dSep + Filename; break;
            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);
          process.run(false, args, args.length);
        } else {
          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) {
        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);
        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) {
        let ucJsScripts = [];
        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()) {
          let files = uchrmFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
          while (files.hasMoreElements()) {
            let file = files.getNext().QueryInterface(Ci.nsIFile);
            if (extjs.test(file.leafName) && file.leafName !== "userChromeShadow.uc.js") {
              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()) {
          let files = chromeScriptsFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
          while (files.hasMoreElements()) {
            let file = files.getNext().QueryInterface(Ci.nsIFile);
            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);
    
        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) {
        let cssFiles = [];
        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");
        let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
        while (files.hasMoreElements()) {
          let file = files.getNext().QueryInterface(Ci.nsIFile);
          if (extcss.test(file.leafName)) cssFiles.push(file.leafName);
        }
        if (this.sortScripts) cssFiles.sort(this.stringComparison);
        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) {
        var e = document.getElementById(whichsubmenu);
        e.setAttribute('label', strlabel + ' (' + scriptArray.length + ')');
        var popup = document.getElementById(whichsubmenuitems);
        while (popup.hasChildNodes()) popup.removeChild(popup.firstChild);
    
        var uProfMenu = this; // Für Closure
        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) ---
      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) {
        const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        var m = document.createElementNS(XUL_NS, sTyp);
        switch (sTyp) {
          case "menuitem":
            m.setAttribute('label', sLabel);
            m.setAttribute('class', sClass);
            if (sCommand && typeof sCommand === 'function') {
              m.addEventListener('command', sCommand, true);
            }
            break;
          case "menu":
            m.setAttribute('label', sLabel);
            m.setAttribute('id', sId);
            break;
          case "menupopup":
            m.setAttribute('id', sId);
            break;
        }
        return m;
      },
    
      // --- OPENATGITHUB (unchanged) ---
      openAtGithub: function(e, sScript) {
        if (e.button == 1) {
          var sUrl = "https://github.com/ardiman/userChrome.js/tree/master/" + this.cleanFileName(sScript);
          openWebLinkIn(sUrl, 'tab');
        }
        if (e.button == 2) {
          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) {
        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

    Endor Wenn Du magst, bitte nochmals testen,
    und wenn Du diese Version für gut befindest, ....

    So, wenn doch noch Fehler vorhanden sein sollten, was ja nie auszuschließen ist,
    bin nun in Urlaub.
    Entweder schaut jemand anders dann danach, oder es muss 14 Tage warten.
    Eventuell habe ich heute Abend noch mal etwas Zeit.
    Also testet, was das Zeug hält. :D


    "Eigene Skripte"

    Also so wirklich werde ich mit dieser Bezeichnung nicht wirklich warm!

    Aber "Userskripte" oder "Benutzte Skripte" oder "Installierte Skripte" finde ich jetzt auch nicht soo dolle!

    Hat denn niemand eine andere Idee?

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

    • Mira_Belle
    • 12. August 2026 um 14:09

    :?:

    Wenn Du
    retValue = "userChromeJS/uc.js ("+s+"):\n------------------------\n"+sArray.join("\n")+"\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------\n"+xArray.join("\n");
    und
    retValue = retValue + "\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------";

    auskommentiert hast, dürfte nuserChromeJS/uc.xul gar nicht "erscheinen"!

    Und was mich auch irritiert ist das undefined für die installierten Skripts!

    Test-Skript, schon vorbereitet!

    JavaScript
    var uProfMenu = {
      // --- KONFIGURATION (unchanged) ---
      TextOpenExe: 'C:\\Program Files\\Notepad++\\notepad++.exe',
      vFileManager: '',
      warpmenuto: 'helpMenu',
      sortScripts: 0,
      gmOrdner: 0,
      cssOrdner: 1,
      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'
              ],
      showNormalPrefs: 1,
      enableScriptsToClip: 2,
      enableRestart: 0,
    
      // --- INIT (ANGEPASST) ---
      init: function() {
        if (this.warpmenuto.toLowerCase() == 'menu') {
          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.");
            return;
          }
          var menu = zielmenu.appendChild(this.createME("menu", "Config Men\u00FC", null, 0, "ExtraConfigMenu"));
          menu.setAttribute("class", "menu-iconic");
          // Ersetze ondblclick durch addEventListener
          menu.addEventListener('dblclick', function() {
            openTrustedLinkIn('about:config', 'tab');
          }, true);
        } else {
          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"
            });
          }
          var menu = document.getElementById("ExtraConfigMenu-button");
    
          // KORREKTUR:
          if (!menu) {
            return;
          }
    
          menu.setAttribute("type", "menu");
          menu.addEventListener('click', function(event) {
            if (event.button == 2 && !this.open) {
              openTrustedLinkIn("about:config", "tab");
              event.preventDefault();
            }
          }, true);
        }
    
        // CSS-Styles (unchanged)
        var css = " \
          #ExtraConfigMenu, #ExtraConfigMenu-button { \
            list-style-image: 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=);  \
            margin-top: 0px !important; \
            opacity: 1 !important; \
          } \
          #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);
    
        // 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"));
        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"));
    
        // 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) ---
        menupopup.appendChild(this.createME(
          "menuitem", "Bild Url",
          function() { uProfMenu.edit(0, 'Bild Url.css'); },
          "uProfMenu_edit", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "config Einträge.css",
          function() { uProfMenu.edit(0, 'config Einträge.css'); },
          "uProfMenu_edit", 0
        ));
        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
        ));
    
        // --- ORDNER (ANGEPASST: sCommand als Funktion) ---
        menupopup.appendChild(document.createXULElement('menuseparator'));
        switch (this.gmOrdner) {
          case 1:
            menupopup.appendChild(this.createME(
              "menuitem", "GM-skripty",
              function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD') + uProfMenu.getDirSep() + 'gm_scripts'); },
              "uProfMenu_folder", 0
            ));
            break;
          case 2:
            menupopup.appendChild(this.createME(
              "menuitem", "USL-skripty",
              function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm') + uProfMenu.getDirSep() + 'UserScriptLoader'); },
              "uProfMenu_folder", 0
            ));
            break;
          case 3:
            menupopup.appendChild(this.createME(
              "menuitem", "Skripty Scriptish",
              function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD') + uProfMenu.getDirSep() + 'scriptish_scripts'); },
              "uProfMenu_folder", 0
            ));
            break;
        }
    
        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
        ));
    
        // --- ABOUT-SEITEN (ANGEPASST: Closure-Problem gelöst) ---
        if (this.abouts.length > 0) {
          menupopup.appendChild(document.createXULElement('menuseparator'));
          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 {
            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);
          }
        }
    
        // --- EINSTELLUNGEN & NEUSTART (ANGEPASST) ---
        if (this.abouts.length == 0 && (this.showNormalPrefs || typeof(ToolRstartMod) != "undefined")) {
          menupopup.appendChild(document.createXULElement('menuseparator'));
        }
        if (this.showNormalPrefs) {
          menupopup.appendChild(this.createME(
            "menuitem", "Einstellungen",
            function() { try { openOptionsDialog(); } catch(e) { openPreferences(); } },
            "uProfMenu_prefs", 0
          ));
        }
        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) ---
      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 (unchanged) ---
      edit: function(OpenMode, Filename) {
        var Path = "";
        var dSep = this.getDirSep();
        switch (OpenMode) {
          case 0: Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename; break;
          case 1: Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename; break;
          case 2: Path = Filename; break;
          case 3: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSS" + dSep + Filename; break;
          case 4: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSWeb" + dSep + Filename; break;
          case 5: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSShadow" + dSep + Filename; break;
        }
        this.launch(this.TextOpenExe, Path);
      },
    */
      // --- EDIT (changed by Mira) --- 
      edit: function(OpenMode, Filename) {
        var Path = "";
        var dSep = this.getDirSep();
    
        // --- Pfad-Handling für chrome/scripts/ ---
        if (Filename.includes("/") || Filename.includes("\\")) {
          Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename;
        } else {
          // Original-Logik
          switch (OpenMode) {
            case 0: Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename; break;
            case 1: Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename; break;
            case 2: Path = Filename; break;
            case 3: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSS" + dSep + Filename; break;
            case 4: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSWeb" + dSep + Filename; break;
            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);
          process.run(false, args, args.length);
        } else {
          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) {
        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);
        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 (unchanged) ---
      getScripts: function(iType) {
        let ucJsScripts = [];
        let extjs = /\.uc\.js$/i;
        let aFolder = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
        aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path);
        let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
        while (files.hasMoreElements()) {
          let file = files.getNext().QueryInterface(Ci.nsIFile);
          if (extjs.test(file.leafName)) ucJsScripts.push(file.leafName);
        }
        if (this.sortScripts) ucJsScripts.sort(this.stringComparison);
        if (iType == 0) {
          this.fillMenu("submenu-ucjs", "submenu-ucjs-items", "Meine Scripte", ucJsScripts, "uProfMenu_ucjs", 0);
        } else {
          var result = this.fillClipboardValue(ucJsScripts, []);
          Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(result);
        }
      },
    */
      // --- GETSCRIPTS (changed by Mira) ---
      getScripts: function(iType) {
        let ucJsScripts = [];
        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()) {
          let files = uchrmFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
          while (files.hasMoreElements()) {
            let file = files.getNext().QueryInterface(Ci.nsIFile);
            if (extjs.test(file.leafName) && file.leafName !== "userChromeShadow.uc.js") {
              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()) {
          let files = chromeScriptsFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
          while (files.hasMoreElements()) {
            let file = files.getNext().QueryInterface(Ci.nsIFile);
            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);
    
        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) {
        let cssFiles = [];
        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");
        let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
        while (files.hasMoreElements()) {
          let file = files.getNext().QueryInterface(Ci.nsIFile);
          if (extcss.test(file.leafName)) cssFiles.push(file.leafName);
        }
        if (this.sortScripts) cssFiles.sort(this.stringComparison);
        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) {
        var e = document.getElementById(whichsubmenu);
        e.setAttribute('label', strlabel + ' (' + scriptArray.length + ')');
        var popup = document.getElementById(whichsubmenuitems);
        while (popup.hasChildNodes()) popup.removeChild(popup.firstChild);
    
        var uProfMenu = this; // Für Closure
        for (var i = scriptArray.length - 1; i > -1; i--) {
          (function(index) {
            var fileName = scriptArray[index];
            var mitem;
            /*
            if (sTyp == 0) {
              mitem = uProfMenu.createME("menuitem", fileName, null, sClass, 0);
              mitem.addEventListener('command', function() {
                uProfMenu.edit(0, fileName);
              }, true);
              mitem.addEventListener('click', function(event) {
                uProfMenu.openAtGithub(event, fileName);
              }, true);
              mitem.setAttribute("tooltiptext", "Linksklick: Bearbeiten,\nMittelklick: https://github.com/.../" + uProfMenu.cleanFileName(fileName) + " öffnen,\nRechtsklick: Suche auf GitHub");
            }
            */
            // 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 (unchanged) ---
      fillClipboardValue: function(sArray, xArray) {
        var retValue;
        var s = sArray.length;
        var x = xArray.length;
        switch(this.enableScriptsToClip) {
          case 1:
    //        retValue = "userChromeJS/uc.js ("+s+"):\n------------------------\n"+sArray.join("\n")+"\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------\n"+xArray.join("\n");
    //        retValue = "userChromeJS/uc.js ("+s+"):\n------------------------\n"+sArray.join("\n")+"\n\nUserskripte ("+x+"):\n-------------------------\n"+xArray.join("\n");
            break;
          default:
    //        retValue = "userChromeJS/uc.js ("+s+"):\n------------------------";
            retValue = "Eigene Skripte ("+s+"):\n------------------------";
            for (var i = 0; i < s; i++) {
              j = i + 1;
              retValue = retValue + "\n" + j + ". " + sArray[i];
            }
    //        retValue = retValue + "\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------";
    //        retValue = retValue + "\n\nUserskripte ("+x+"):\n-------------------------";
            if (this.enableScriptsToClip == 2) s = 0;
            for (var i = 0; i < x; i++) {
              j = i + s + 1;
              retValue = retValue + "\n" + j + ". " + xArray[i];
            }
            break;
        }
        return retValue;
      },
    */
      // --- FILLCLIPBOARDVALUE (changed by Mira) ---
      fillClipboardValue: function(sArray, xArray) {
        var retValue;
        var s = sArray.length;
        var x = xArray.length;
        switch(this.enableScriptsToClip) {
          case 1:
            break;
          default:
            retValue = "Eigene Skripte ("+s+"):\n------------------------";
            for (var i = 0; i < s; i++) {
              j = i + 1;
              retValue = retValue + "\n" + j + ". " + sArray[i];
            }
            if (this.enableScriptsToClip == 2) s = 0;
            for (var i = 0; i < x; i++) {
              j = i + s + 1;
              retValue = retValue + "\n" + j + ". " + xArray[i];
            }
            break;
        }
        return retValue;
      },
    
      // --- CREATEME (ANGEPASST: sCommand als Funktion) ---
      createME: function(sTyp, sLabel, sCommand, sClass, sId) {
        const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        var m = document.createElementNS(XUL_NS, sTyp);
        switch (sTyp) {
          case "menuitem":
            m.setAttribute('label', sLabel);
            m.setAttribute('class', sClass);
            if (sCommand && typeof sCommand === 'function') {
              m.addEventListener('command', sCommand, true);
            }
            break;
          case "menu":
            m.setAttribute('label', sLabel);
            m.setAttribute('id', sId);
            break;
          case "menupopup":
            m.setAttribute('id', sId);
            break;
        }
        return m;
      },
    
      // --- OPENATGITHUB (unchanged) ---
      openAtGithub: function(e, sScript) {
        if (e.button == 1) {
          var sUrl = "https://github.com/ardiman/userChrome.js/tree/master/" + this.cleanFileName(sScript);
          openWebLinkIn(sUrl, 'tab');
        }
        if (e.button == 2) {
          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) {
        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


    Ergebniss sollte in etwa so aussehen:

    Code
    Eigene Skripte (56):
    ------------------------
    1. # check.uc.js
    2. # 1 extensionsUpdateChecker.uc.js
    3. # 1_TEST.uc.js
    4. # 1_TEST_2.uc.js
    5. # FoxInstanzStarter.uc.js
    6. # TEST-CSSLoader.uc.js
    7. 00 sidebar_test.uc.js
    8. 00_toggle_toolbar_Horst.uc.js
    9. 01 Button_for_AboutConfig.uc.js
    10. 01 Button_for_Erweiterungen_verschiebbar.uc.js
    11. 02 Button_for_PersonalToolbar.uc.js
    12. 05 Button_for_About-Dialog.uc.js
    13. 05 Button_for_Addons-UpDate-Check.uc.js
    14. 05 Button_for_Browser-Werkzeuge.uc.js
    15. 05 Button_for_Downloads.uc.js
    16. 05 Button_for_ProfilesChanges.uc.js
    17. 05 Button_for_QuickLinks-about.uc.js
    18. 05 Button_for_QuickLinks-cf.uc.js
    19. 05 Button_for_Restart_Firefox.uc.js
    20. 05 Button_for_Werkzeuge-fuer-Webentwickler.uc.js
    21. 06 Button_for_Chromefolder.uc.js
    22. 06 Button_for_Profilfolder.uc.js
    23. 06 Button_for_QuickLink.uc.js
    24. 06 Button_for_QuickLinks.uc.js
    25. 07 Button_for_Firefox-Verzeichnisse.uc.js
    26. 09 Button_for_Restart_in_Hamburger-Menu.uc.js
    27. aboutConfig_menu.uc.js
    28. aboutConfig_menu_2.uc.js
    29. addonbar_vertical.uc.js
    30. Anzeige.uc.js
    31. AutoPopup.uc.js
    32. BackupProfile.uc.js
    33. BookmarkCount.uc.js
    34. Clock+Date.uc.js
    35. CloseTab.uc.js
    36. ContextTranslate-DeepL.uc.js
    37. ContextTranslate-Google.uc.js
    38. FavIconInUrlBar.uc.js
    39. Fenster_schließen.uc.js
    40. Hamburger-Menu.uc.js
    41. newTabButtonUndoTabList.uc.js
    42. newTabFromHistory.uc.js
    43. OpenLinkWith.uc.js
    44. OpenPageWith.uc.js
    45. Private-Browsing-Label verschiebbar.uc.js
    46. ReloadAllTabs.uc.js
    47. ReloadTab_by_double click.uc.js
    48. Scrollbar.2.0.8.b.uc.js
    49. SkipToTopAndBottom.uc.js
    50. TabContextCloseAllTabs.uc.js
    51. ToggleFindbar.uc.js
    52. Tooltips.uc.js
    53. uBlock Update.uc.js
    54. UndoListInTabmenuToo.uc.js
    55. Warnung.uc.js
    56. wetterfuchsbutton.uc.js
    Alles anzeigen

    Der zweite Eintrag userChromeJS/uc.xul (0): kann ja nicht erscheinen.

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

    • Mira_Belle
    • 11. August 2026 um 20:30

    Ah, jetzt ja!

    Einfach beide Zeilen

    JavaScript
    retValue = "userChromeJS/uc.js ("+s+"):\n------------------------\n"+sArray.join("\n")+"\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------\n"+xArray.join("\n");

    und

    JavaScript
    retValue = retValue + "\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------";

    per " // " auskommentieren.

    Und wer mag, kann

    Code
    retValue = "userChromeJS/uc.js ("+s+"):\n------------------------";

    das userChromeJS/uc.js z.B. in "Userskripte" oder "Eigene Skripte" oder "Installierte Skripte" ändern. ;)

    Oder wir legen das jetzt hier fest und ich poste noch einmal das komplett überarbeitete Skript.


    Zitat von Mira_Belle

    "Userskripte" oder "Eigene Skripte" oder "Installierte Skripte"

    Ich weiß nicht so recht, was am besten passt, was am ehesten zu trifft,
    was am ehesten Sinn macht (ergibt).

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

    • Mira_Belle
    • 11. August 2026 um 20:12

    2002Andreas Mach doch bitte mal einen Sreenshot.
    Denn ich sehe so einen Menüeintrag bei mir nicht!

    Oder bist Du im Skript auf "userChromeJS/uc.xul" gestoßen?

    _______________________________________________

    Ah!
    Im Skript.
    DAS lass ich mal unangetastet!!
    Ich weiß nicht, was der Teil tut
    und ich bin z.Z. schon am Koffer packen und habe daher keine Zeit mehr mich intensiv mit dem Skript zu beschäftigen.
    Wenn es Zeit hat, und das hat es, da bin ich mir sicher, beschäftige ich mich gegen Ende des Monats damit.

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

    • Mira_Belle
    • 11. August 2026 um 19:15

    Also funktioniert es doch.
    Gut,
    nun möchte ich nur noch wissen, ob es eine gute Idee war,
    die userChromeShadow.uc.js da rauszunehmen.

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

    • Mira_Belle
    • 11. August 2026 um 18:58
    Zitat von 2002Andreas

    oder verwechselst du etwas?

    Möglicherweise bin ich gerade etwas durcheinander.
    Aber ist dieses Skript nicht dafür verantwortlich, die userChromeShadow.css zu suchen
    und zu laden?

    Wie dem auch sei, lässt sich ja in den Testskript ganz leicht rückgängig machen.
    Der Code ist ja noch vorhanden!

    Aber andere Frage!
    Werden bei Dir die Userskripte direkt aus "chrome" wie auch aus "chrome/skripts" angezeigt,
    damit Du sie mit einem klick bearbeiten kannst?

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

    • Mira_Belle
    • 11. August 2026 um 18:24
    Zitat von FuchsFan

    Ich habe in Nightly getestet, aber im Submenü "Meine Scripte" werden nur aus dem Ordner chrome die Scripte aufgelistet.

    Merkwürdig.
    Funktioniert hier bei mir sowohl in der Final, als auch in der Nighty.

    Zitat von FuchsFan

    Und dann fehlt "Neustart" ganz.

    Mh, ....
    War dieser Menüpunkt denn im ursprünglichen Skript vorhanden?

    Zitat von FuchsFan

    Dann müsstest du das bei allen anderen auch so machen.

    Diese Aussage verstehe ich nicht so ganz.
    Mir ging es nur um die userChromeShadow.uc.js.
    Da unbedachte Änderungen an dieser sämtliche Anpassungen per css "ausschalten" können.
    Und ganz ehrlich, wer an dieser Datei wirklich was ändern will, muss schon wissen, was er tut!
    Macht man versehentlich ein Userskript "kaputt", funktioniert halt ein Button nicht mehr,
    oder irgendwas wird nicht mehr angezeigt oder so,
    aber es bricht keine Panik aus, weil der Firefox plötzlich kaputt ist.

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

    • Mira_Belle
    • 11. August 2026 um 15:38

    Hi, ich habe noch "eine" kleine Anpassung vorgenommen!
    Ich habe das Skript insofern geändert, dass
    a. die userChromeShadow.uc.js nicht mehr "eingebunden" wird!
    Somit kann niemand versehentlich diese bearbeiten und verändern.
    b. Auch ich halte das Chromeverzeichnis sauber und habe die Userskripte unter chrome/scripts,
    wie auch die Cascading Style Sheets (CSS) unter chrome/css.
    Also werden die Userskripte, welche im anderen Ordner liegen, auch eingebunden,
    werden angezeigt und man kann sie bearbeiten.

    Ansonsten habe ich alles beim Alten belassen!
    Und den alten Code nur auskommentiert!

    Schaut es Euch mal an.

    JavaScript
    /*
    // ==UserScript==
    // @name           extras_config_menu.uc.js
    // @compatibility  Firefox 153*.*
    // @include        main
    // @version        1.0.20260811
    // @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"
    // ==/UserScript==
    */
    
    var uProfMenu = {
      // --- KONFIGURATION (unchanged) ---
      TextOpenExe: 'C:\\Program Files\\Notepad++\\notepad++.exe',
      vFileManager: '',
      warpmenuto: 'helpMenu',
      sortScripts: 0,
      gmOrdner: 0,
      cssOrdner: 1,
      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'
              ],
      showNormalPrefs: 1,
      enableScriptsToClip: 2,
      enableRestart: 0,
    
      // --- INIT (ANGEPASST) ---
      init: function() {
        if (this.warpmenuto.toLowerCase() == 'menu') {
          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.");
            return;
          }
          var menu = zielmenu.appendChild(this.createME("menu", "Config Men\u00FC", null, 0, "ExtraConfigMenu"));
          menu.setAttribute("class", "menu-iconic");
          // Ersetze ondblclick durch addEventListener
          menu.addEventListener('dblclick', function() {
            openTrustedLinkIn('about:config', 'tab');
          }, true);
        } else {
          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"
            });
          }
          var menu = document.getElementById("ExtraConfigMenu-button");
    
          // KORREKTUR:
          if (!menu) {
            return;
          }
    
          menu.setAttribute("type", "menu");
          menu.addEventListener('click', function(event) {
            if (event.button == 2 && !this.open) {
              openTrustedLinkIn("about:config", "tab");
              event.preventDefault();
            }
          }, true);
        }
    
        // CSS-Styles (unchanged)
        var css = " \
          #ExtraConfigMenu, #ExtraConfigMenu-button { \
            list-style-image: 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=);  \
            margin-top: 0px !important; \
            opacity: 1 !important; \
          } \
          #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);
    
        // 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"));
        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"));
    
        // 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) ---
        menupopup.appendChild(this.createME(
          "menuitem", "Bild Url",
          function() { uProfMenu.edit(0, 'Bild Url.css'); },
          "uProfMenu_edit", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "config Einträge.css",
          function() { uProfMenu.edit(0, 'config Einträge.css'); },
          "uProfMenu_edit", 0
        ));
        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
        ));
    
        // --- ORDNER (ANGEPASST: sCommand als Funktion) ---
        menupopup.appendChild(document.createXULElement('menuseparator'));
        switch (this.gmOrdner) {
          case 1:
            menupopup.appendChild(this.createME(
              "menuitem", "GM-skripty",
              function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD') + uProfMenu.getDirSep() + 'gm_scripts'); },
              "uProfMenu_folder", 0
            ));
            break;
          case 2:
            menupopup.appendChild(this.createME(
              "menuitem", "USL-skripty",
              function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm') + uProfMenu.getDirSep() + 'UserScriptLoader'); },
              "uProfMenu_folder", 0
            ));
            break;
          case 3:
            menupopup.appendChild(this.createME(
              "menuitem", "Skripty Scriptish",
              function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD') + uProfMenu.getDirSep() + 'scriptish_scripts'); },
              "uProfMenu_folder", 0
            ));
            break;
        }
    
        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
        ));
    
        // --- ABOUT-SEITEN (ANGEPASST: Closure-Problem gelöst) ---
        if (this.abouts.length > 0) {
          menupopup.appendChild(document.createXULElement('menuseparator'));
          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 {
            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);
          }
        }
    
        // --- EINSTELLUNGEN & NEUSTART (ANGEPASST) ---
        if (this.abouts.length == 0 && (this.showNormalPrefs || typeof(ToolRstartMod) != "undefined")) {
          menupopup.appendChild(document.createXULElement('menuseparator'));
        }
        if (this.showNormalPrefs) {
          menupopup.appendChild(this.createME(
            "menuitem", "Einstellungen",
            function() { try { openOptionsDialog(); } catch(e) { openPreferences(); } },
            "uProfMenu_prefs", 0
          ));
        }
        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) ---
      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 (unchanged) ---
      edit: function(OpenMode, Filename) {
        var Path = "";
        var dSep = this.getDirSep();
        switch (OpenMode) {
          case 0: Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename; break;
          case 1: Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename; break;
          case 2: Path = Filename; break;
          case 3: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSS" + dSep + Filename; break;
          case 4: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSWeb" + dSep + Filename; break;
          case 5: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSShadow" + dSep + Filename; break;
        }
        this.launch(this.TextOpenExe, Path);
      },
    */
      // --- EDIT (changed by Mira) --- 
      edit: function(OpenMode, Filename) {
        var Path = "";
        var dSep = this.getDirSep();
    
        // --- Pfad-Handling für chrome/scripts/ ---
        if (Filename.includes("/") || Filename.includes("\\")) {
          Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename;
        } else {
          // Original-Logik
          switch (OpenMode) {
            case 0: Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename; break;
            case 1: Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename; break;
            case 2: Path = Filename; break;
            case 3: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSS" + dSep + Filename; break;
            case 4: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSWeb" + dSep + Filename; break;
            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);
          process.run(false, args, args.length);
        } else {
          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) {
        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);
        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 (unchanged) ---
      getScripts: function(iType) {
        let ucJsScripts = [];
        let extjs = /\.uc\.js$/i;
        let aFolder = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
        aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path);
        let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
        while (files.hasMoreElements()) {
          let file = files.getNext().QueryInterface(Ci.nsIFile);
          if (extjs.test(file.leafName)) ucJsScripts.push(file.leafName);
        }
        if (this.sortScripts) ucJsScripts.sort(this.stringComparison);
        if (iType == 0) {
          this.fillMenu("submenu-ucjs", "submenu-ucjs-items", "Meine Scripte", ucJsScripts, "uProfMenu_ucjs", 0);
        } else {
          var result = this.fillClipboardValue(ucJsScripts, []);
          Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(result);
        }
      },
    */
      // --- GETSCRIPTS (changed by Mira) ---
      getScripts: function(iType) {
        let ucJsScripts = [];
        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()) {
          let files = uchrmFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
          while (files.hasMoreElements()) {
            let file = files.getNext().QueryInterface(Ci.nsIFile);
            if (extjs.test(file.leafName) && file.leafName !== "userChromeShadow.uc.js") {
              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()) {
          let files = chromeScriptsFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
          while (files.hasMoreElements()) {
            let file = files.getNext().QueryInterface(Ci.nsIFile);
            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);
    
        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) {
        let cssFiles = [];
        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");
        let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
        while (files.hasMoreElements()) {
          let file = files.getNext().QueryInterface(Ci.nsIFile);
          if (extcss.test(file.leafName)) cssFiles.push(file.leafName);
        }
        if (this.sortScripts) cssFiles.sort(this.stringComparison);
        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) {
        var e = document.getElementById(whichsubmenu);
        e.setAttribute('label', strlabel + ' (' + scriptArray.length + ')');
        var popup = document.getElementById(whichsubmenuitems);
        while (popup.hasChildNodes()) popup.removeChild(popup.firstChild);
    
        var uProfMenu = this; // Für Closure
        for (var i = scriptArray.length - 1; i > -1; i--) {
          (function(index) {
            var fileName = scriptArray[index];
            var mitem;
            /*
            if (sTyp == 0) {
              mitem = uProfMenu.createME("menuitem", fileName, null, sClass, 0);
              mitem.addEventListener('command', function() {
                uProfMenu.edit(0, fileName);
              }, true);
              mitem.addEventListener('click', function(event) {
                uProfMenu.openAtGithub(event, fileName);
              }, true);
              mitem.setAttribute("tooltiptext", "Linksklick: Bearbeiten,\nMittelklick: https://github.com/.../" + uProfMenu.cleanFileName(fileName) + " öffnen,\nRechtsklick: Suche auf GitHub");
            }
            */
            // 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 (unchanged) ---
      fillClipboardValue: function(sArray, xArray) {
        var retValue;
        var s = sArray.length;
        var x = xArray.length;
        switch(this.enableScriptsToClip) {
          case 1:
            retValue = "userChromeJS/uc.js ("+s+"):\n------------------------\n"+sArray.join("\n")+"\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------\n"+xArray.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];
            }
            retValue = retValue + "\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------";
            if (this.enableScriptsToClip == 2) s = 0;
            for (var i = 0; i < x; i++) {
              j = i + s + 1;
              retValue = retValue + "\n" + j + ". " + xArray[i];
            }
            break;
        }
        return retValue;
      },
    
      // --- CREATEME (ANGEPASST: sCommand als Funktion) ---
      createME: function(sTyp, sLabel, sCommand, sClass, sId) {
        const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        var m = document.createElementNS(XUL_NS, sTyp);
        switch (sTyp) {
          case "menuitem":
            m.setAttribute('label', sLabel);
            m.setAttribute('class', sClass);
            if (sCommand && typeof sCommand === 'function') {
              m.addEventListener('command', sCommand, true);
            }
            break;
          case "menu":
            m.setAttribute('label', sLabel);
            m.setAttribute('id', sId);
            break;
          case "menupopup":
            m.setAttribute('id', sId);
            break;
        }
        return m;
      },
    
      // --- OPENATGITHUB (unchanged) ---
      openAtGithub: function(e, sScript) {
        if (e.button == 1) {
          var sUrl = "https://github.com/ardiman/userChrome.js/tree/master/" + this.cleanFileName(sScript);
          openWebLinkIn(sUrl, 'tab');
        }
        if (e.button == 2) {
          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) {
        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
    • 10. August 2026 um 22:44
    Zitat von Endor

    Habe jetzt Mira_Belles Version genommen.

    Hau.
    Du hast entschieden,
    aber woran hast Du es festgemacht?

  • 1 Script funktioniert nicht mehr und ich weiss nicht, welches es von diesen 2 (Zusatzleisten) ist.

    • Mira_Belle
    • 10. August 2026 um 22:03
    Zitat von .DeJaVu

    Aufpassen, bitte keine Blanko-Ausnahme bescheinigen.

    Sollte auch keine sein!
    Die bezog sich auf die Hilfe, die benötigt wird, wenn jemand doch Probleme hat das aktuelle Skript
    zu konfigurieren.

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

    • Mira_Belle
    • 10. August 2026 um 15:11
    Zitat von FuchsFan

    Das War auch der Fehler, nun funktioniert es ohne. :thumbup:

    Schön,
    nun entscheidet, welches Skript weiter gepflegt werden soll.
    Denn wir sollten nur eines von beiden weiter pflegen und Endor sollte DAS dann "sichern".

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

    • Mira_Belle
    • 10. August 2026 um 14:59

    2002Andreas Alles gut!

    Da bei mir eben kein Fehler ausgeworfen wird,
    kannst Du bitte mal das Skript testen?

    JavaScript
    /*
    // ==UserScript==
    // @name           extras_config_menu.uc.js
    // @compatibility  Firefox 153*.*
    // @include        main
    // @version        1.0.20260810
    // @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
    // ==/UserScript==
    */
    
    var uProfMenu = {
      // --- KONFIGURATION (unchanged) ---
      TextOpenExe: 'C:\\Program Files\\Notepad++\\notepad++.exe',
      vFileManager: '',
      warpmenuto: 'helpMenu',
      sortScripts: 0,
      gmOrdner: 0,
      cssOrdner: 1,
      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'],
      showNormalPrefs: 1,
      enableScriptsToClip: 2,
      enableRestart: 0,
    
      // --- INIT (ANGEPASST) ---
      init: function() {
        if (this.warpmenuto.toLowerCase() == 'menu') {
          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.");
            return;
          }
          var menu = zielmenu.appendChild(this.createME("menu", "Config Men\u00FC", null, 0, "ExtraConfigMenu"));
          menu.setAttribute("class", "menu-iconic");
          // Ersetze ondblclick durch addEventListener
          menu.addEventListener('dblclick', function() {
            openTrustedLinkIn('about:config', 'tab');
          }, true);
        } else {
          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"
            });
          }
          var menu = document.getElementById("ExtraConfigMenu-button");
    
          // KORREKTUR:
          if (!menu) {
            return;
          }
    
          menu.setAttribute("type", "menu");
          menu.addEventListener('click', function(event) {
            if (event.button == 2 && !this.open) {
              openTrustedLinkIn("about:config", "tab");
              event.preventDefault();
            }
          }, true);
        }
    
        // CSS-Styles (unchanged)
        var css = " \
          #ExtraConfigMenu, #ExtraConfigMenu-button { \
            list-style-image: 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=);  \
            margin-top: 0px !important; \
            opacity: 1 !important; \
          } \
          #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);
    
        // 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"));
        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"));
    
        // 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) ---
        menupopup.appendChild(this.createME(
          "menuitem", "Bild Url",
          function() { uProfMenu.edit(0, 'Bild Url.css'); },
          "uProfMenu_edit", 0
        ));
        menupopup.appendChild(this.createME(
          "menuitem", "config Einträge.css",
          function() { uProfMenu.edit(0, 'config Einträge.css'); },
          "uProfMenu_edit", 0
        ));
        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
        ));
    
        // --- ORDNER (ANGEPASST: sCommand als Funktion) ---
        menupopup.appendChild(document.createXULElement('menuseparator'));
        switch (this.gmOrdner) {
          case 1:
            menupopup.appendChild(this.createME(
              "menuitem", "GM-skripty",
              function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD') + uProfMenu.getDirSep() + 'gm_scripts'); },
              "uProfMenu_folder", 0
            ));
            break;
          case 2:
            menupopup.appendChild(this.createME(
              "menuitem", "USL-skripty",
              function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm') + uProfMenu.getDirSep() + 'UserScriptLoader'); },
              "uProfMenu_folder", 0
            ));
            break;
          case 3:
            menupopup.appendChild(this.createME(
              "menuitem", "Skripty Scriptish",
              function() { uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD') + uProfMenu.getDirSep() + 'scriptish_scripts'); },
              "uProfMenu_folder", 0
            ));
            break;
        }
    
        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
        ));
    
        // --- ABOUT-SEITEN (ANGEPASST: Closure-Problem gelöst) ---
        if (this.abouts.length > 0) {
          menupopup.appendChild(document.createXULElement('menuseparator'));
          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 {
            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);
          }
        }
    
        // --- EINSTELLUNGEN & NEUSTART (ANGEPASST) ---
        if (this.abouts.length == 0 && (this.showNormalPrefs || typeof(ToolRstartMod) != "undefined")) {
          menupopup.appendChild(document.createXULElement('menuseparator'));
        }
        if (this.showNormalPrefs) {
          menupopup.appendChild(this.createME(
            "menuitem", "Einstellungen",
            function() { try { openOptionsDialog(); } catch(e) { openPreferences(); } },
            "uProfMenu_prefs", 0
          ));
        }
        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) ---
      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: function(OpenMode, Filename) {
        var Path = "";
        var dSep = this.getDirSep();
        switch (OpenMode) {
          case 0: Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename; break;
          case 1: Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename; break;
          case 2: Path = Filename; break;
          case 3: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSS" + dSep + Filename; break;
          case 4: Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSWeb" + dSep + Filename; break;
          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);
          process.run(false, args, args.length);
        } else {
          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) {
        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);
        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 (unchanged) ---
      getScripts: function(iType) {
        let ucJsScripts = [];
        let extjs = /\.uc\.js$/i;
        let aFolder = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
        aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path);
        let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
        while (files.hasMoreElements()) {
          let file = files.getNext().QueryInterface(Ci.nsIFile);
          if (extjs.test(file.leafName)) ucJsScripts.push(file.leafName);
        }
        if (this.sortScripts) ucJsScripts.sort(this.stringComparison);
        if (iType == 0) {
          this.fillMenu("submenu-ucjs", "submenu-ucjs-items", "Meine Scripte", ucJsScripts, "uProfMenu_ucjs", 0);
        } else {
          var result = this.fillClipboardValue(ucJsScripts, []);
          Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(result);
        }
      },
    
      // --- GETCSS (unchanged) ---
      getCss: function(iType) {
        let cssFiles = [];
        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");
        let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
        while (files.hasMoreElements()) {
          let file = files.getNext().QueryInterface(Ci.nsIFile);
          if (extcss.test(file.leafName)) cssFiles.push(file.leafName);
        }
        if (this.sortScripts) cssFiles.sort(this.stringComparison);
        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) {
        var e = document.getElementById(whichsubmenu);
        e.setAttribute('label', strlabel + ' (' + scriptArray.length + ')');
        var popup = document.getElementById(whichsubmenuitems);
        while (popup.hasChildNodes()) popup.removeChild(popup.firstChild);
    
        var uProfMenu = this; // Für Closure
        for (var i = scriptArray.length - 1; i > -1; i--) {
          (function(index) {
            var fileName = scriptArray[index];
            var mitem;
            if (sTyp == 0) {
              mitem = uProfMenu.createME("menuitem", fileName, null, sClass, 0);
              mitem.addEventListener('command', function() {
                uProfMenu.edit(0, fileName);
              }, true);
              mitem.addEventListener('click', function(event) {
                uProfMenu.openAtGithub(event, fileName);
              }, true);
              mitem.setAttribute("tooltiptext", "Linksklick: Bearbeiten,\nMittelklick: https://github.com/.../" + uProfMenu.cleanFileName(fileName) + " öffnen,\nRechtsklick: Suche auf GitHub");
            }
            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 (unchanged) ---
      fillClipboardValue: function(sArray, xArray) {
        var retValue;
        var s = sArray.length;
        var x = xArray.length;
        switch(this.enableScriptsToClip) {
          case 1:
            retValue = "userChromeJS/uc.js ("+s+"):\n------------------------\n"+sArray.join("\n")+"\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------\n"+xArray.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];
            }
            retValue = retValue + "\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------";
            if (this.enableScriptsToClip == 2) s = 0;
            for (var i = 0; i < x; i++) {
              j = i + s + 1;
              retValue = retValue + "\n" + j + ". " + xArray[i];
            }
            break;
        }
        return retValue;
      },
    
      // --- CREATEME (ANGEPASST: sCommand als Funktion) ---
      createME: function(sTyp, sLabel, sCommand, sClass, sId) {
        const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        var m = document.createElementNS(XUL_NS, sTyp);
        switch (sTyp) {
          case "menuitem":
            m.setAttribute('label', sLabel);
            m.setAttribute('class', sClass);
            if (sCommand && typeof sCommand === 'function') {
              m.addEventListener('command', sCommand, true);
            }
            break;
          case "menu":
            m.setAttribute('label', sLabel);
            m.setAttribute('id', sId);
            break;
          case "menupopup":
            m.setAttribute('id', sId);
            break;
        }
        return m;
      },
    
      // --- OPENATGITHUB (unchanged) ---
      openAtGithub: function(e, sScript) {
        if (e.button == 1) {
          var sUrl = "https://github.com/ardiman/userChrome.js/tree/master/" + this.cleanFileName(sScript);
          openWebLinkIn(sUrl, 'tab');
        }
        if (e.button == 2) {
          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) {
        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

    Wie Du leicht erkennen kannst habe ich eine kleine Korrektur in Zeile 52 eingebaut.
    Ob es funktioniert?

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

    • Mira_Belle
    • 10. August 2026 um 14:47
    Zitat von 2002Andreas

    Hier schon:

    Weder in der aktuellen Version (153) noch in der aktuellen Nightly!

Unterstütze uns!

Jährlich (2026)

70,5 %

70,5% (546,48 von 775 EUR)

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