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

  • Script für Lesezeichen-Anzahl funkt nicht mehr.

    • Mira_Belle
    • 2. November 2026 um 15:34

    Nichts für ungut, aber ganz sicher steckt in irgendeinem CSS der Code, der verhindert, dass das Menü breiter dargestellt wird!
    Wie sehen denn die anderen Menüs aus der Menüleiste aus?
    Sind die auch FIX?

    Wenn Du magst, kannst Du auch mal testweise ein anderes Skript ausprobieren,
    dann siehst Du, ob das Menü da auch in der Breite beschränkt wird.

    Hier, nur zum Testen!!

    JavaScript
    // BookmarkCount.uc.js
    
    /* ******************************************************************************************************************* */
    /* Author BrokenHeart               => https://www.camp-firefox.de/forum/thema/136572/?postID=1229536#post1229536 **** */
    /* Correction from BrokenHeart      => https://www.camp-firefox.de/forum/thema/136572/?postID=1229696#post1229696 **** */
    /* Extension from Sören Henschel    => https://www.camp-firefox.de/forum/thema/136572/?postID=1229555#post1229555 **** */
    /* Customized by Mira inspired by grisu2099     ********************************************************************** */
    /* Source                           => https://www.camp-firefox.de/forum/thema/136572/?postID=1229875#post1229883 **** */
    /* Customized by Mira inspired by Horstmann     ********************************************************************** */
    /* Source                           => https://www.camp-firefox.de/forum/thema/136572/?postID=1229993#post1229993 **** */
    /* Adjustments for 139 and customized by Mira inspired by Horstmann     ********************************************** */
    /* Source                           => https://www.camp-firefox.de/forum/thema/136572/?postID=1270254#post1270254 **** */
    /* Bugfixes for 'popupshowing' to 'popupshown'inspired by BrokenHeart & Horstmann ************************************ */
    /* Source                           => https://www.camp-firefox.de/forum/thema/136572/?postID=1274881#post1274881 **** *
    /* ******************************************************************************************************************* */
    /* Version 1.04a                    => https://www.camp-firefox.de/forum/thema/136572/?postID=1274881#post1274881 **** */
    /* Version 1.05                     => https://www.camp-firefox.de/forum/thema/136572/?postID=1291576#post1291576 **** */
    /* ******************************************************************************************************************* */
    /* Custom Counter in the Bookmarks for folders and links ************************************************************* */
    /* ******************************************************************************************************************* */
    
    'use strict';
    
    (function() {
      if (!window.gBrowser) return;
    
      setTimeout(function() { setFunction(); }, 10);
    
      let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons'));
    
      // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      
      //Custom icons in profile/chrome/icons folder
      let icon1 = "folder-fat.svg";                     //  Custom  Folder Icon
      let icon2 = "bookmark-hollow.svg";                //  Custom  Link Icon              
      let icon3 = "arrow-right.svg";                    //  Custom  Arrow Icon
    
      // Custom settings
      let bm_font_size = 12; 
      let cs_font_weight = 700;
      let bm_icon_size = 16;
    
      // NEU: Schriftfarben getrennt definieren
      //let cs_font_color_1 = "#FFA500";                 // Farbe für Folder-Zähler (links)
      //let cs_font_color_2 = "#00FFFF";                 // Farbe für Link-Zähler (rechts)
      let cs_font_color_1 = "#FFD700";                 // Farbe für Folder-Zähler (links)
      let cs_font_color_2 = "#FFD700";                 // Farbe für Link-Zähler (rechts)
    
      // NEU: Symbolfarben getrennt definieren 
      //let cs_icon_color_1 = "#5fe575";                 // Farbe für "Ordner", 1.Symbol
      //let cs_icon_color_2 = "#fbf328";                 // Farbe für "Link", 2.Symbol
      //let cs_icon_color_3 = "#bbf700";                 // Farbe für den Pfeil
      let cs_icon_color_1 = "#C0C0C0";                 // Farbe für "Ordner", 1.Symbol
      let cs_icon_color_2 = "#C0C0C0";                 // Farbe für "Link", 2.Symbol
      let cs_icon_color_3 = "#C0C0C0";                 // Farbe für den Pfeil
    
      // NEU: Farbe für die Zahlenwerte und Symbole beim Hovern. 
    
      let cs_font_hovercolor_1 = "#FFD700";                 // Farbe für Folder-Zähler (links)
      let cs_font_hovercolor_2 = "#FFD700";                 // Farbe für Link-Zähler (rechts) "#80ffff";
      let cs_icon_hovercolor_1 = "#C0C0C0";                 // Farbe für "Ordner", 1.Symbol "#ff0000";
      let cs_icon_hovercolor_2 = "#C0C0C0";                 // Farbe für "Link", 2.Symbol "#00ff00";
    
      let cs_icon_hovercolor_3 = "#ffff80";                 // Farbe für den Pfeil
    
      // Calculated settings  
      let cs_font_size = `${bm_font_size}px`;
      let cs_icon_size = `${bm_icon_size}px`;
      let cs_width_one = `calc(${bm_icon_size}px + 1.4em)`;
      let cs_width_uno = `calc(${bm_icon_size}px)`;
      let cs_width_two = `calc(${bm_icon_size}px + 1.4em)`;
      let cs_width_due = `calc(${bm_icon_size}px)`;
    
      //let useStyle1 = true; // <- HIER Weiche setzen: true = Variante 1, false = Variante 2
      let useStyle = 1; // <- HIER Weiche setzen:  0 = Symbole hinter den Zählern, 1 = Symbole vor den Zählern
      // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    
      // Symbole vor den Zählern
      let css_one = `
        #bmContent::before {
          content: attr(data-value1) !important;
          width: ${cs_width_one} !important;
          align-items: center !important;
          display: flex !important;
          justify-content: end !important;
          margin-left: 16px !important;
          margin-right: -1px !important;
          background-image: url("${ProfilePath}/${icon1}")!important;
          background-position: center right calc(${cs_width_one} - ${cs_icon_size}) !important;
          background-repeat: no-repeat !important;
          background-size: ${cs_icon_size} ${cs_icon_size} !important;
          color: ${cs_font_color_1} !important;
          fill: ${cs_icon_color_1} !important;
        }
        #bmContent::after {
          content: attr(data-value2) !important;
          width: ${cs_width_two} !important;
          align-items: center !important;
          display: flex !important;
          justify-content: end !important;
          margin-left: 4px !important;
          margin-right: -1px !important;
          background-image: url("${ProfilePath}/${icon2}") !important;
          background-position: center right calc(${cs_width_two} - ${cs_icon_size}) !important;
          background-repeat: no-repeat !important;
          background-size: ${cs_icon_size} ${cs_icon_size} !important;
          color: ${cs_font_color_2} !important;
          fill: ${cs_icon_color_2} !important;
        }
      `;
    
      // Symbole hinter den Zählern
      let css_two = `
        #bmContent::before {
          content: attr(data-value1) !important;
          width: ${cs_width_one} !important;
          align-items: center !important;
          display: flex !important;
          justify-content: end !important;
          background-image: url("${ProfilePath}/${icon1}")!important;
          background-position: center right calc(${cs_width_uno} - ${cs_icon_size}) !important;
          background-repeat: no-repeat !important;
          background-size: ${cs_icon_size} ${cs_icon_size} !important;
          color: ${cs_font_color_1} !important;
          fill: ${cs_icon_color_1} !important;
          padding: 2px 20px 0px 10px !important;
          margin-left: 16px !important;
          margin-right: 12px !important;
        }
        #bmContent::after {
          content: attr(data-value2) !important;
          width: ${cs_width_two} !important;
          align-items: center !important;
          display: flex !important;
          justify-content: end !important;
          background-image: url("${ProfilePath}/${icon2}")!important;
          background-position: center right calc(${cs_width_due} - ${cs_icon_size}) !important;
          background-repeat: no-repeat !important;
          background-size: ${cs_icon_size} ${cs_icon_size} !important;
          color: ${cs_font_color_2} !important;
          fill: ${cs_icon_color_2} !important;
          padding: 2px 22px 0 0 !important;
          margin-left: -14px !important;
          margin-right: -1px !important;
        }
      `;
    
      function setFunction() {
        const css =`
          /* Fix für Firefox Nightly - Label als Flex-Container */
          #bookmarksMenuPopup > menu > label,
          #bookmarksMenuPopup > menu > menupopup > menu > label,
          #bookmarksMenuPopup > menu > menupopup > menu > menupopup > menu > label,
          #PlacesToolbarItems > .bookmark-item > menupopup > menu > label {
            display: flex !important;
            justify-content: space-between !important;
          }
    
          /* Counter Container */
          #bmContent {
            display: flex !important;
            margin-inline: auto 0 !important;
            font-family: Consolas, "Lucida Console", "Courier New", monospace !important;
            font-size: ${cs_font_size} !important;
            font-weight: ${cs_font_weight} !important;
            height: ${cs_icon_size} !important;
          }
    
          /* Dynamisch gewählter Counter-Stil */
          ${useStyle ? css_one : css_two}
    
          /* Pfeil */
          menupopup > menu::after {
            content: "" !important;
            background-image: url("${ProfilePath}/${icon3}")!important;
            height: ${cs_icon_size} !important;
            fill: ${cs_icon_color_3} !important;
            margin-inline: 0 !important;
          }
    
    
          /* Farbe für die Zahlenwerte und Symbole beim Hovern. */
          menupopup[placespopup="true"] > menu.bookmark-item:hover > .menu-text > #bmContent::before {
              color: ${cs_font_hovercolor_1} !important;
              fill: ${cs_icon_hovercolor_1} !important;
          }
          menupopup[placespopup="true"] > menu.bookmark-item:hover > .menu-text > #bmContent::after {
              color: ${cs_font_hovercolor_2} !important;
              fill: ${cs_icon_hovercolor_2} !important;
          }
          /* Farbe für den Pfeil beim Hovern. */
          menupopup > menu:hover::after { 
              fill: ${cs_icon_hovercolor_3} !important; }
          }
    
    
        `;
    
        const sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
        const uri = Services.io.newURI('data:text/css,' + encodeURIComponent(css));
        sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
    
        let bmbMenu = document.getElementById('bookmarks-menu-button');
        let bookMenu = document.getElementById('bookmarksMenu');
        let persToolBar = document.getElementById('PersonalToolbar');
    
        if(bmbMenu) {
          let bmbMenuPopup = document.getElementById('BMB_bookmarksPopup');
          if(bmbMenuPopup) {
            bmbMenuPopup.openPopup();
            bmbMenuPopup.hidePopup();
            bmbMenuPopup.setAttribute("hasbeenopened","true");
          }
          bmbMenu.addEventListener('popupshowing', onPopupShowing);
        }
        if(bookMenu) {
          let bookMenuPopup = document.getElementById('bookmarksMenuPopup');
          if(bookMenuPopup) {
            bookMenuPopup.openPopup();
            bookMenuPopup.hidePopup();
            bookMenuPopup.setAttribute("hasbeenopened","true");
          }
          bookMenu.addEventListener('popupshowing', onPopupShowing);
        }
        if(persToolBar) {
          persToolBar.addEventListener('popupshown', onPopupShowing);
        }
      }
    
      function onPopupShowing(aEvent) {
        let popup = aEvent.originalTarget;
        for (let item of popup.children) {
          if (item.localName != 'menu' || item.id?.startsWith('history')) continue;
    
          setTimeout(() => {
            let itemPopup = item.menupopup;
            itemPopup.hidden = true;
            itemPopup.collapsed = true;
            itemPopup.openPopup();
            itemPopup.hidePopup();
    
            let menuitemCount = 0;
            let menuCount = 0;
            for (let subitem of itemPopup.children) {
              if (subitem.classList.contains('bookmark-item') && !subitem.disabled && !subitem.hidden) {
                if (subitem.localName == 'menuitem') menuitemCount++;
                else if (subitem.localName == 'menu') menuCount++;
              }
            }
    
            itemPopup.hidden = false;
            itemPopup.collapsed = false;
    
            // Neues Element für Zaehler
            let bmCounta = item.childNodes[1];
            if (!bmCounta) return;                             // Falls undefiniert
    
            bmCounta.innerHTML = "";
            let bmContent = document.createElement("bmContent");
            bmContent.id = "bmContent";
            bmCounta.appendChild(bmContent);
    
            //let strCountOut1 = " " + menuCount + " ";         //  Has no brackets
            //let strCountOut1 = "(" + menuCount + ")";         //  Has round brackets
            //let strCountOut1 = "[" + menuCount + "]";         //  Has square brackets
            
            let strCountOut1 = String(menuCount).padEnd(2, " ");
            bmContent.setAttribute('data-value1', strCountOut1);
    
            //let strCountOut2 = " " + menuitemCount + " ";      //  Has no brackets
            //let strCountOut2 = "(" + menuitemCount + ")";      //  Has round brackets
            //let strCountOut2 = "[" + menuitemCount + "]";      //  Has square brackets
            // let strCountOut2 = String(menuitemCount).padEnd(2, " ");
            // bmContent.setAttribute('data-value2', strCountOut2);
            
            let strCountOut2 = (useStyle === 0)
              ? String(menuitemCount).padStart(4, "/  ") // (5, " |  ")
              : String(menuitemCount).padEnd(2, " "); //1 rechtsbündig / 2 linksbündig
            bmContent.setAttribute('data-value2', strCountOut2);
          }, 100);
        }
      }
    })();
    Alles anzeigen
  • extra_config_menu.uc.js > ohne security.allow_unsafe_dangerous_privileged_evil_eval auf false

    • Mira_Belle
    • 1. November 2026 um 23:15

    :thumbup:

  • ucjsDownloadStatubarModoki.uc.js geht nicht mehr

    • Mira_Belle
    • 1. November 2026 um 23:07

    Habe mich abgemüht und auch eine Lösung parat!
    Nur war Fuchsfan schneller!
    Du hast nun die Auswahl:!:

    JavaScript
    // ==UserScript==
    // -*- mode:JScript; Encoding:utf8n -*-
    // @name           upperURI.uc.js
    // @namespace      http://d.hatena.ne.jp/p-arai/
    // @description    Add upper URIs to the context menu in Location bar.
    // @include        main
    // @compatibility  Firefox 159+
    // @author         p-arai
    // @version        2026/11/01 fix by mira with Mistral AI see comments
    // @version        2024/12/30 fix Bug
    // @version        2024/12/22 fix Bug 1936336 - Disallow inline event handlers
    // @version        2024/08/13 fix undefined erroor
    // @version        2023/04/18 00:20 use openTrustedLinkIn instead of openWebLinkIn
    // @version        2023/04/17 22:50 Bug 1817443 - remove openUILinkIn entirely and rename fromChrome
    // @version        2023/02/08 10:00 Bug 1815439 - Remove useless loadURI wrapper from browser.js
    // @version        2022/08/22 09:50 fixed wrong popup
    // @version        2021/11/25 00:30 replace whereToOpenLink with BrowserUtils.whereToOpenLink Bug 1742801
    // @version        2020/06/01 00:30 fix 69.0a1 Bug 1551320 - Replace all createElement calls in XUL documents with createXULElement
    // @version        2019.11.22 Bug 1326520 - Rename nsIURI.path to pathQueryRef
    // @version        2007.08.05
    // ==/UserScript==
    
    (function() {
      // Fx 158+: Das Kontextmenü der Adressleiste wird vom window-globalen
      // EditContextMenu-Objekt verwaltet (Popup #textbox-contextmenu hängt direkt
      // unter <html id="main-window">, Einträge #edit-contextmenu-*).
      // Ohne diese API ist keine Erweiterung des Menüs mehr möglich.
      if (typeof window.EditContextMenu != "object" || !EditContextMenu.addItems) {
        Cu.reportError(
          "upperURI.uc.js: window.EditContextMenu nicht gefunden (Firefox < 158?)."
        );
        return;
      }
    
      // ---- URIs der übergeordneten Pfade ermitteln (synchron) ----
      function getUpURIs() {
        var uri_array = [];
        var uri = gBrowser.currentURI;
        var host;
        try {
          host = uri.host;
        } catch (e) {
          return uri_array;
        }
        var uri_path = uri.pathQueryRef;
        if (/^(?:data:|javascript:|chrome:|about:)/.test(uri.pathQueryRef))
          return uri_array;
        if (uri_path == "/")
          return uri_array;
        uri_path = uri_path.replace(/\/$/, "");
        var path_array = uri_path.split("/");
        let path = path_array.pop();
        if (host == "tools.taskcluster.net" ||
            host == "firefox-ci-tc.services.mozilla.com") {
          let path_array2 = path.split(".");
          path_array2.pop();
          while (path_array2.length) {
            uri_array.push(uri.prePath + path_array.join("/") + "/" + path_array2.join("."));
            path_array2.pop();
          }
        }
        while (path_array.length) {
          uri_array.push(uri.prePath + path_array.join("/") + "/");
          let path = path_array.pop();
          if (host == "tools.taskcluster.net" ||
              host == "firefox-ci-tc.services.mozilla.com") {
            let path_array2 = path.split(".");
            path_array2.pop();
            while (path_array2.length) {
              uri_array.push(uri.prePath + path_array.join("/") + "/" + path_array2.join("."));
              path_array2.pop();
            }
          }
        }
        return uri_array;
      }
    
      // ---- Flachen Menüeintrag für eine höhere URL erzeugen ----
      function makeUpperURIItem(url) {
        var uri = gBrowser.currentURI;
        var menuitem = document.createXULElement("menuitem");
        menuitem.setAttribute("class", "upperURI-item");
        menuitem.setAttribute("label",
          url == uri.prePath ? url : url.replace(uri.prePath, ""));
        menuitem.setAttribute("tooltiptext", url);
        // Link (nur im aktuellen Tab) öffnen
        menuitem.addEventListener("command", function(event) {
          openLinkIn(url, "current", {
            allowThirdPartyFixup: false,
            triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal({})
          });
        });
        // Mittel-/Rechtsklick: in neuem Tab / Fenster öffnen
        menuitem.addEventListener("click", function(event) {
          if (event.button == 2) return;
          var where = BrowserUtils.whereToOpenLink(event, false, true);
          openTrustedLinkIn(url, where, {
            allowThirdPartyFixup: false,
            postData: null,
            referrerInfo: null,
            triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal({})
          });
        });
        return menuitem;
      }
    
      // ---- Eigenen Eintrag-Satz registrieren (offizielle Fx-158-API) ----
      EditContextMenu.addItems({
        // Immer TRUE, damit unser onShowing auch bei anderen Eingabefeldern
        // (Suchleiste etc.) aufgerufen wird und dort unsere Einträge
        // entfernen kann. Die eigentliche Prüfung passiert in onShowing.
        matches: input => true,
    
        // Einmalige Erzeugung: nur das <menu>-Element. Die URL-Einträge werden
        // dynamisch in onShowing erzeugt
        // Leeres Menü wird über menu.hidden versteckt.
        createItems() {
          let fragment = document.createDocumentFragment();
          let sep = document.createXULElement("menuseparator");
          sep.setAttribute("id", "upperURI-separator");
          fragment.appendChild(sep);
          let menu = document.createXULElement("menu");
          menu.setAttribute("id", "upperURI-menu");
          menu.setAttribute("label", "Höhere URL");
          menu.setAttribute("class", "upperURI-menu");
          let menupopup = document.createXULElement("menupopup");
          menupopup.setAttribute("id", "upperURI-menupopup");
          menu.appendChild(menupopup);
          fragment.appendChild(menu);
          return fragment;
        },
    
        // Bei jedem Öffnen des Kontextmenüs: bisherige dynamische Einträge
        // entfernen und für die aktuelle URL neu erzeugen
        onShowing(input, items) {
          let menu = items.find(item => item.id == "upperURI-menu");
          if (!menu) return;
          let menupopup = menu.menupopup || menu.querySelector("menupopup");
          if (!menupopup) return;
    
          // Alte Einträge entfernen
          menupopup.replaceChildren();
    
          // Nur für das Eingabefeld der Adressleiste
          if (!input || input.id != "urlbar-input") {
            menu.hidden = true;
            let sep = items.find(item => item.id == "upperURI-separator");
            if (sep) sep.hidden = true;
            return;
          }
    
          let uri_array = getUpURIs();
          menu.hidden = uri_array.length == 0;
          let sep = items.find(item => item.id == "upperURI-separator");
          if (sep) sep.hidden = uri_array.length == 0;
          for (var i = 0; i < uri_array.length; i++) {
            menupopup.appendChild(makeUpperURIItem(uri_array[i]));
          }
        }
      });
    
      // Falls das Popup bei der Registrierung noch nicht existierte (es wird von
      // EditContextMenu erst beim ersten Rechtsklick erzeugt), jetzt erzwingen,
      // damit unser Eintrag-Satz eingefügt wird (addItems fügt nur bei vorhandenem
      // Popup ein; _ensurePopup fügt danach alle registrierten Sets ein).
      if (!document.getElementById("textbox-contextmenu") && EditContextMenu._ensurePopup) {
        EditContextMenu._ensurePopup();
      }
    })();
    Alles anzeigen
  • ucjsDownloadStatubarModoki.uc.js geht nicht mehr

    • Mira_Belle
    • 1. November 2026 um 13:45

  • ucjsDownloadStatubarModoki.uc.js geht nicht mehr

    • Mira_Belle
    • 1. November 2026 um 13:33

    Endor Ich habe da einen Fix:!:
    Ersetze:

    JavaScript
      init: function() {
        if (document.documentElement.getAttribute("chromehidden") !="" )
          return;

    durch:

    JavaScript
      init: function() {
      var chromehidden = document.documentElement.getAttribute("chromehidden");
      if (chromehidden && chromehidden != "")
        return;
  • ucjsDownloadStatubarModoki.uc.js geht nicht mehr

    • Mira_Belle
    • 1. November 2026 um 12:23

    Sei so lieb und beschreiben mal kurz die Funktion
    und was genau nicht mehr funktioniert.
    Erscheint die Leiste gar nicht mehr?

  • Firefox 159 Hamburger-Menü wieder rund

    • Mira_Belle
    • 31. Oktober 2026 um 11:34

    Mitleser Alles gut! Mir war das erwähnte, das mit dem falschen Thema/Film, etwas sauer aufgestoßen.
    Schwamm drüber.

  • Firefox 159 Hamburger-Menü wieder rund

    • Mira_Belle
    • 31. Oktober 2026 um 09:22

    Mitleser
    Das CSS schon im ersten Beitrag stammte von mir!
    Noch fragen?

    Zitat von Mitleser

    Vielleicht warst du einfach nur im falschen Thema/Film...

    Und DAS hättest Du Dir sparen können!
    Wenn man so bescheuert angegangen wird, was ja von Dir mit Sicherheit nicht als Jux oder Spaß gemeint war/ist,
    macht es echt hier keinen Spaß mehr. Das Gefluche und Geschimpfe lasse ich jetzt mal, aber sein Dir gewiss,
    es waren keine netten Gedanken.

  • Firefox 159 Hamburger-Menü wieder rund

    • Mira_Belle
    • 30. Oktober 2026 um 20:40

    Was für eine Diskussion.

    Warum ich die Einheit dennoch "vorgebe" habe ich ja bereits beschrieben.
    Klar ist aber, dass im digitalen und eben im CSS eigentlich bei einem Wert von "0" eben keine Einheit angegeben wird.
    Ausnahmen bestätigen die Regel!

    Was ich mich aber Frage, warum man aus der Sache so ein Bohei macht.

  • Firefox 159 Hamburger-Menü wieder rund

    • Mira_Belle
    • 30. Oktober 2026 um 15:07
    Zitat von milupo

    Nur so mal als Hinweis: Ist der Wert 0, ist die Angabe der Maßeinheit nicht nötig.

    Das ist richtig und absolut korrekt!
    Ich hatte es aber mit Absicht bei "0px" belassen, weil Nutzer, die mit CSS so gar nichts am Hut haben,
    gerne beim Ändern der Werte eben genau diese "Maßeinheit" vergessen!
    Und dann funktioniert das CSS eben nicht.
    Und ja, man könnte auch z.B. "em" nutzen oder, .... aber das verwirrt hier nur.

  • extra_Config_menu zeigt das Icon nicht an.

    • Mira_Belle
    • 28. Oktober 2026 um 17:10
    Zitat von 2002Andreas
    Zitat von Mira_Belle

    wenn Du ein eigenes Nutzt!

    Dazu muss es aber auch selber eingetragen werden;)

    Hat sie doch, also in der von mir für sie angepassten Version.

    BarbaraZ- Ich ändere für Dich das Script oben noch mal,
    damit "Einstellungen" und "Neustart" nicht mehr im Menü erscheint.

  • extra_Config_menu zeigt das Icon nicht an.

    • Mira_Belle
    • 28. Oktober 2026 um 16:59

    Warum willst Du den Base64 Code raus haben?
    Das Symbol wird doch gar nicht genutzt, wenn Du ein eigenes Nutzt!
    Zitat:

    Code
    // Button-Aussehen (1: flexibles SVG-Icon aus Icon-Ordner, 0: festes Base64-PNG-Icon):
      buttonStyle: 1,  // Default => 0

    Und wie Andy schon schreibt, die Einträge "Einstellungen" und "Neustart" kannst Du im Script ein, bzw. ausblenden.

  • extra_Config_menu zeigt das Icon nicht an.

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

    Nun sollte es aber passen.

    Nochmals geändert!!
    Einstellungen und Neustart sind jetzt ausgeblendet.

  • extra_Config_menu zeigt das Icon nicht an.

    • Mira_Belle
    • 28. Oktober 2026 um 16:20

    Hi BarbaraZ- Da ist aber so einiges durcheinander geraten!
    In meinem "neuen" Script kommt "warpmenuto" gar nicht vor!
    Warte ein wenig, ich werde es für Dich anpassen!

  • Icon des extras_config_menu.uc.js wird in 159 nicht mehr angezeigt

    • Mira_Belle
    • 28. Oktober 2026 um 14:37

    Es geht mir nicht so sehr darum ein komplettes Changelog im Header zuverwurschteln!
    Aber so die letzten paar Änderungen könnten es doch schon sein.
    Machen all die Anderen auch, siehe doch nur alice0775 Scripte, oder jene von die alten von ardiman.

    Aber wenigstens könnte man die Versions-Nr. ändern, dann hätte ich, wie in diesem Beispiel,
    sofort gesehen, dass Andy da was geändert hat und hätte mal genau hingeschaut!
    Noch besser wäre es gewesen, er hätte im Thread darauf hingewiesen.

    Wie ich schon schrieb, ich sah das Script, sah im Header, oh, das ist ja meins,
    komisch funktioniert doch.
    Und weil ich im ersten Moment dachte, es würde an seipes Konfiguration liegen,
    habe ich mich dann nicht mehr darum gekümmert!
    Erst Sörens Hinweis machte mich stutzig und ich schaute darauf hin mir das Script noch einmal genauer an.

    Und ja, ich habe auch einen Fehler gemacht!!
    Hätte ich die Änderung, bzw. die Versions-Nr. in meinem genutzten Script gleich geändert,
    wäre diese Angelegenheit viel schneller von mir erkannt worden.


    Ich sehe gerade, dass Andy der Gleichen Meinung ist wie Du grisu2099 .
    Nun denn, dann kann ich mir in Zukunft ja den Header, da der von verdammt vielen eh nicht gelesen wird
    komplett sparen!
    Ist ja dann egal, ob hier dutzende Scripte im Board herumgeistern, die zwar alle einen gemeinsamen Ursprung haben,
    aber deren Code dann irgendwie komplett unterschiedlich ist!

    Vielleicht lasse ich es auch ganz sein, mach nur noch mein Ding und frickel dann und wann auch mal
    irgendwie in einem hier geposteten Script herum, ohne mitzuteilen, was ich geändert habe.
    Das macht es dann doch viel "bunter" und vielfältiger, wenn für ein und dieselbe Funktion
    ein halbes Dutzend verschiedene Skript gibt.

    Das ist jetzt nicht böse gemeint, soll aber zum Nachdenken anregen.

  • extra_Config_menu zeigt das Icon nicht an.

    • Mira_Belle
    • 28. Oktober 2026 um 14:21

    BarbaraZ- Entschuldige bitte, war auf der Arbeit und habe nur kurz per Smartphone Dir geantwortet!

    Hier => RE: extra_config_menu.uc.js > ohne security.allow_unsafe_dangerous_privileged_evil_eval auf false
    findest Du das neue, aktuelle Script!!

    Natürlich musst Du den Userkonfigbereich noch anpassen!

    Das ist aber gar nicht schwer!!
    Du kopierst ganz einfach Deinen vom alten Script und ersetzt den im "neuen" Script. Fettisch!

  • extra_Config_menu zeigt das Icon nicht an.

    • Mira_Belle
    • 28. Oktober 2026 um 11:59

    Schau doch bitte im richtigrn Threat nach!

    Es gibt eine neue Version.

  • Findbar automatisch leeren

    • Mira_Belle
    • 28. Oktober 2026 um 09:00

    Gute Besserung

  • Icon des extras_config_menu.uc.js wird in 159 nicht mehr angezeigt

    • Mira_Belle
    • 28. Oktober 2026 um 08:49

    Sören Hentzschel

    ^^ Stimmt.

    Was ich doof finde, ist mal wieder, dass der Code am (im) Script geändert wurde, aber der Header nicht angepasst wurde!!
    Wenigstens im Text hätte man erwähnen können WAS geändert wurde.

    Ich hatte mir nur den Header angeschaut und dachte, komisch, mein Script, genau mein Script,
    geht doch bei mir!
    Tja und die Falle hatte zugeschnappt, weil ich Kamel "meinen" Header auch nicht aktualisiert hatte.

    Es sind hier also gleich zwei Fehler passiert!
    Andreas hat auf seine Änderung nicht hingewiesen
    und ich hatte den Header meines aktuellen Scripts nicht in Ordnung gehalten.

    Es kann doch nicht sein, dass man jedes Mal den kompletten Code eines Scripts erst einmal analysieren muss,
    weil man auch den Header nichts mehr geben muss!

    Dann kann ich mir, und eigentlich auch alle anderen, es sparen einen Solchen zu erstellen!

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

    • Mira_Belle
    • 28. Oktober 2026 um 08:47

    Mitleser Danke für den Hinweis.
    Die Änderung ist hier erklärt => @edit           @Mira 11/26 Aufruf "if (window.__SSi == "window0")" korrigiert! 
    Zeilennummern ergeben (haben) ja im Grunde keinen Sinn, da sie sich durch Änderungen in anderen Zeilen ändern können
    und somit der Bezug verloren geht! Daher der Codeschnipsel auf die auskommentierte Zeile.
    Da muss ich mir noch was Besseres einfallen lassen.

    Endor Neue Version!

Unterstütze uns!

Jährlich (2026)

76,1 %

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

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