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

Beiträge von FuchsFan

  • Menü Einstellungen

    • FuchsFan
    • 20. Mai 2026 um 12:33
    Zitat von Sören Hentzschel

    Bei Screenshot 1 steht browser.settings-redesign.enabled auf true, bei Screenshot 2 auf false.

    Dankeschön, das war die Ursache. Nun steht natürlich die Frage im Raum, warum in dieser Version true, und in der anderen false, denn ich habe nicht daran geschraubt.

  • Menü Einstellungen

    • FuchsFan
    • 20. Mai 2026 um 11:24
    Zitat von 2002Andreas

    Evtl. kann Sören ja etwas dazu sagen, ob die Ansicht noch nicht für alle Nutzer erstellt wurde.

    Also, ich habe auch in der unberührten Version (meine Reserve Portable) versucht, keine Veränderung, immer Bild 2.

  • Menü Einstellungen

    • FuchsFan
    • 20. Mai 2026 um 10:39
    Zitat von 2002Andreas

    Und du bist sicher, dass es wirklich ein Profil vom Nightly ist?

    Ja, absolut, ich habe ja mehrere, alle aktualisiert, trotzdem Darstellung nach Bild 2, ist schon sehr komisch. Wenn du das bei beiden hast, dann gehe ich mal davon aus, dass es dann zum Standard wird.


    Fehlerbehebungsmodus ohne Ergebnis, Darstellung wie Bild 2.

  • Menü Einstellungen

    • FuchsFan
    • 20. Mai 2026 um 10:19

    Bitte um Aufklärung zu about:preferences, weil es dort seit geraumer Zeit doch einige Änderungen gab. Was mich aber ganz besonders interessiert, sind die im Folgenden gezeigten Darstellungen in zwei Profilen vom aktuellen Nightly. Das Bild 1 ist nur in einer Version so zu sehen, alle anderen gemäß Bild 2. Wie kann das sein?

    Bild 1: Bild 2:

  • FF150 Scripte funktionieren nicht

    • FuchsFan
    • 18. Mai 2026 um 18:38
    Zitat von milupo
    Zitat von milupo

    Außerdem hat er mehrere Skripte in einem (function() { … })();- Bereich eingebettet.

    Ab wo hast du denn kopiert?

    Slash ausgenommen. Das betrifft auch andere Button, die lassen sich auch verschieben.

  • FF150 Scripte funktionieren nicht

    • FuchsFan
    • 18. Mai 2026 um 18:24

    Auch dein Script Adressleiste_verschiebbar funktioniert hier in v152.

  • FF150 Scripte funktionieren nicht

    • FuchsFan
    • 18. Mai 2026 um 17:55

    Dein Script für die Tastatur habe ich in Version 152 getestet, es legt den Button in der Navbar an, und startet auch die Tastatur. da stimmt dann wohl doch etwas nicht mit deinem Profil.

  • Thunderbird 102.11 userChromeJS, Services is not defined in config.js

    • FuchsFan
    • 17. Mai 2026 um 12:58

    laxx

    Warum keine aktuelle Version, die Frage wurde gestellt?

    Nur als Hinweis, natürlich funktioniert es auch in TB, wenn die Vorbereitungen alle sauber erledigt wurden. Bei mir laufen vier Scripte, mehr brauche ich nicht. So sieht der Ordner chrome aus:

  • Profilmanager

    • FuchsFan
    • 16. Mai 2026 um 13:45

    Mira_Belle

    Das ist jetzt meine favorisierte Version, alle Profile können beliebig oft gestartet werden. Dieses Script, getestet von v150 bis
    v152, funktioniert ohne Probleme. Alle Profile müssen manuell eingetragen werden, wobei Unterschiede bei installierten und portablen Versionen weiterhin bestehen. Bei den installierten Versionen wird bei profile: immer der Name des Profils eingegeben (bei about:profiles entnehmen), bei den portablen dagegen muss hier immer der genaue Pfad zum Profilordner angegeben werden.
    Alle Versionen werden grundsätzlich über die firefox.exe aus dem Installationsordner gestartet (also nicht über die FirefoxLoader.exe, usw.). Dafür ist dementsprechend bei exe: der genaue Pfad zur firefox.exe anzugeben. Beispiele sind dafür im Script für alle Versionen enthalten. Dann bitte testen!

    CSS
    // ==UserScript==
    // @name           FoxStarter Auto Stable + Icons
    // @description    Firefox / Portable Starter mit Icons + CSS
    // @author         FuchsFan (KI)
    // @version        1.3.1  150+
    // @note           -no-remote entfernt
    // @include        main
    // ==/UserScript==
    
    (function () {
    
      if (!window.gBrowser) return;
    
      const btn_id = "foxstarter_auto";
      const POPUP_ID = btn_id + "-popup";
    
      const btn_icon = "file:///C:/FoxIcons2/Bild206.png";
      const ICON_BASE = "file:///C:/FoxIcons2/";
    
      const btn_tooltiptext = "Firefox Profile starten (Auswahl)";
    
      const { classes: Cc, interfaces: Ci } = Components;
    
      let cssInjected = false;
    
      // =========================================================
      // CSS
      // =========================================================
    
      function injectUserCSS() {
    
        try {
    
          if (cssInjected) return;
    
          const css = `
            #${btn_id} image.toolbarbutton-icon {
              transform: scale(1.0) !important;
              padding: 6px !important;
            }
    
            #${POPUP_ID} {
              max-width: 285px !important;
            }
    
            #${POPUP_ID} menuitem {
              padding-inline-start: 8px !important;
              padding-inline-end: 8px !important;
              margin: 0 !important;
              min-height: 24px !important;
            }
    
            #${POPUP_ID} menuitem.menuitem-iconic .menu-icon {
              margin-inline-end: 8px !important;
              margin-inline-start: -30px !important;
              width: 16px !important;
              height: 16px !important;
            }
    
            #${POPUP_ID} menuitem.menuitem-iconic .menu-text {
              margin-left: 8px !important;
              font-weight: 500 !important;
              padding: 2px 0 2px 0 !important;
            }
    
            #${POPUP_ID} menuitem.menuitem-iconic:hover .menu-text {
              margin-left: 8px !important;
              font-weight: 600 !important;
              color: red !important;
            }
          `;
    
          const sss =
            Cc["@mozilla.org/content/style-sheet-service;1"]
            .getService(Ci.nsIStyleSheetService);
    
          const uri =
            Services.io.newURI(
              "data:text/css;charset=utf-8," +
              encodeURIComponent(css)
            );
    
          if (!sss.sheetRegistered(uri, sss.AUTHOR_SHEET)) {
            sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
          }
    
          cssInjected = true;
    
        } catch (e) {
          console.error("[FoxStarter CSS]", e);
        }
      }
    
      // =========================================================
      // ITEMS + ICONS
      // =========================================================
    
      const ITEMS = {
    
        // installierte Versionen
        "ArbeitsFox 🏠": {
          exe: "C:\\Program Files\\Mozilla Firefox\\firefox.exe",
          profile: "ArbeitsFox",
          icon: "Finale.png"
        },
    
        "Reserve 1 🏠": {
          exe: "C:\\Program Files\\Mozilla Firefox\\firefox.exe",
          profile: "Reserve",
          icon: "Finale.png"
        },
    
        "Reserve 2 🏠": {
          exe: "C:\\Program Files\\Mozilla Firefox\\firefox.exe",
          profile: "Reserve-Profil 2",
          icon: "Finale.png"
        },
    
        // portable Versionen
    	"Firefox3p > portable < 🟢": {
          exe: "G:\\Firefox Test\\Firefox3p\\Firefox64\\firefox.exe",
          profile: "G:\\Firefox Test\\Firefox3p\\Profilordner",
          icon: "Finale.png"
        },
    
        "Nightly1 > portable < 🔵": {
          exe: "G:\\Firefox Test\\Nightly1\\Firefox64\\firefox.exe",
          profile: "G:\\Firefox Test\\Nightly1\\Profilordner",
          icon: "Nightly.png"
        },
    
        "Portable U Stable 3 🔥": {
          exe: "G:\\Portable.Firefox.Updater.3\\Firefox Stable x64\\firefox.exe",
          profile: "G:\\Portable.Firefox.Updater.3\\Firefox Stable x64\\profile",
          icon: "Finale.png"
        }
      };
    
      // =========================================================
      // START
      // =========================================================
    
      function launch(item) {
    
        try {
    
          const file =
            Cc["@mozilla.org/file/local;1"]
            .createInstance(Ci.nsIFile);
    
          file.initWithPath(item.exe);
    
          const process =
            Cc["@mozilla.org/process/util;1"]
            .createInstance(Ci.nsIProcess);
    
          process.init(file);
    
          let args = [];
    
          const isFirefox =
            item.exe.toLowerCase().includes("firefox.exe");
    
          const isProfilePath =
            item.profile &&
            (item.profile.includes("\\") || item.profile.includes("/"));
    
          if (isFirefox && isProfilePath) {
    
            // -no-remote entfernt
            args = [
              "-profile",
              item.profile,
              "-foreground"
            ];
    
          } else if (isFirefox) {
    
            // -no-remote entfernt
            args = [
              "-P",
              item.profile,
              "-foreground"
            ];
    
          }
    
          process.run(false, args, args.length);
    
        } catch (e) {
          console.error("[FoxStarter]", e);
        }
      }
    
      // =========================================================
      // MENU MIT ICONS
      // =========================================================
    
      function buildMenu() {
    
        const btn = document.getElementById(btn_id);
    
        if (!btn || btn.querySelector("menupopup")) return;
    
        const popup =
          document.createXULElement("menupopup");
    
        popup.setAttribute("id", POPUP_ID);
    
        for (const key of Object.keys(ITEMS)) {
    
          const item = ITEMS[key];
    
          const mi =
            document.createXULElement("menuitem");
    
          mi.setAttribute("label", key);
    
          mi.setAttribute("class", "menuitem-iconic");
    
          const icon =
            item.icon
              ? ICON_BASE + item.icon
              : btn_icon;
    
          mi.setAttribute("image", icon);
    
          mi.style.listStyleImage =
            `url("${icon}")`;
    
          mi.addEventListener("command", () => {
            launch(item);
          });
    
          popup.appendChild(mi);
        }
    
        btn.appendChild(popup);
      }
    
      // =========================================================
      // BUTTON
      // =========================================================
    
      try {
    
        CustomizableUI.createWidget({
    
          id: btn_id,
          defaultArea: CustomizableUI.AREA_NAVBAR,
          label: "FoxStart",
          tooltiptext: btn_tooltiptext,
    
          onCreated: (btn) => {
    
            btn.style.listStyleImage =
              `url("${btn_icon}")`;
    
            btn.setAttribute("type", "menu");
    
            injectUserCSS();
            buildMenu();
          }
        });
    
      } catch (e) {}
    
      setTimeout(() => {
    
        injectUserCSS();
        buildMenu();
    
      }, 500);
    
    })();
    Alles anzeigen
  • Profilmanager

    • FuchsFan
    • 15. Mai 2026 um 16:51
    Zitat von Mira_Belle

    Ja, auf diese Idee war ich auch schon gekommen.

    Mira_Belle Ich auch!;)

    Deshalb habe ich mal versucht daraus etwas Brauchbares zu schaffen, und bin damit eigentlich zufrieden. Es wird in der Navbar ein Button erstellt, über den dann das Menü mit den Profilen zur Auswahl geöffnet wird. Im Script selbst erfolgt eine besondere Einstufung für installierte und portable Versionen. Versucht habe ich bisher ergebnislos die Funktion einzubauen, sofern ein Firefox gestartet ist, dieser beim zweiten Aufruf dann ein Hinweis erfolgt (Alert), dass er bereits gestartet ist. Bisher alle Versuche erfolglos. Schau es dir an, eventuell findest du eine Lösung. So dann zum Test freigegeben:

    Code
    // ==UserScript==
    // @name           FoxStarter.uc.js
    // @description    Navbar Button (verschiebbar) +  Menü für Start von Profilen
    // @version        1.0.1
    // @author         FuchsFan (KI)
    // @include        main
    // @charset        UTF-8
    // ==/UserScript==
    
    (function () {
    
      if (!window.gBrowser) return;
    
      // Start User Einstellungen
      let btn_id = 'start_profile_btn';           // Button #id
      const btn_label = 'ProfileStart';
      const btn_tooltiptext = 'Firefox Profile starten (Auswahl)';
    
      const btn_icon = 'Bild206.png';
      const iconPath = 'file:///C:/FoxIcons2/';   // Icon-Ordner (für Button)
      const ImagePath = iconPath + btn_icon;      
      // Ende User Einstellungen
    
      const { classes: Cc, interfaces: Ci } = Components;
    
      const BrowserPath = {
    	  
    	// installierte Versionen 
    
        "ArbeitsFox 🏠": {
          cmd: "C:\\Program Files\\Mozilla Firefox\\firefox.exe<>$1 -P \"ArbeitsFox\"",
          icon: "Finale.png"
        },	
        "Reserve-Profil 1 🏠": {
          cmd: "C:\\Program Files\\Mozilla Firefox\\firefox.exe<>$1 -P \"Reserve\"",
          icon: "Finale.png"
        },
        "Reserve-Profil 2 🏠": {
          cmd: "C:\\Program Files\\Mozilla Firefox\\firefox.exe<>$1 -P \"Reserve-Profil 2\"",
          icon: "Finale.png"
        },
    	"Reserve-Profil 3 🏠": {
          cmd: "C:\\Program Files\\Mozilla Firefox\\firefox.exe<>$1 -P \"Reserve 3\"",
          icon: "Finale.png"
        },
    	
    	// portable Versionen 
    	
    	"Portable.Firefox.Updater.3 Nightly 🟠 ": {
          cmd: "G:\\Portable.Firefox.Updater.3\\Firefox Nightly x64 Launcher.exe",
          icon: "Nightly.png"
        },
    	"Firefox 3 portable 🔥": {
          cmd: "G:\\Firefox Test\\Firefox3p\\FirefoxLoader.exe",
          icon: "Finale.png"
        },
        "Nigtly 1 portable 🔵": {
          cmd: "G:\\Firefox Test\\Nightly1\\FirefoxLoader.exe",
          icon: "Nightly.png"
        }
      };
    
      function menuIconUrl(pngName) {
        // Direkte Bild-URL (am zuverlässigsten für PNG)
        const fileUrl = "file:///C:/FoxIcons2/" + pngName;
        return encodeURI(fileUrl);
      }
    
      function launch(browserPathEntry, openURL) {
        // browserPathEntry ist jetzt ein Objekt: { cmd, icon }
        let [path, argsRaw] = browserPathEntry.cmd.split("<>");
        if (!argsRaw) argsRaw = "";
    
        // Tokenizer respektiert "..." / '...' 
        const tokens = [];
        const re = /"([^"]*)"|'([^']*)'|(\S+)/g;
        let m;
        while ((m = re.exec(argsRaw)) !== null) {
          tokens.push(m[1] ?? m[2] ?? m[3]);
        }
    
        const finalArgs = tokens.map(t => t.replace(/\$1/g, openURL));
    
        const file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
        file.initWithPath(path);
    
        const process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
        process.init(file);
        process.run(false, finalArgs, finalArgs.length, {});
      }
    
      function ensurePopup() {
        const btn = document.getElementById(btn_id);
        if (!btn) return;
    
        if (btn.querySelector('#' + btn_id + '_popup')) return;
    
        const popup = document.createXULElement('menupopup');
        popup.setAttribute('id', btn_id + '_popup');
    
        for (const key of Object.keys(BrowserPath)) {
          const itemData = BrowserPath[key];
          const iconUrl = menuIconUrl(itemData.icon);
    
          const mi = document.createXULElement('menuitem');
          mi.setAttribute('label', ' ' + key);
          mi.setAttribute('value', key);
    
          // ikonisch machen + Icon setzen
          mi.setAttribute('class', 'menuitem-iconic');
          mi.setAttribute('image', iconUrl);                 // direkt als Bild-URL
          mi.style.listStyleImage = 'url("' + iconUrl + '")'; // Fallback
    
          mi.addEventListener('command', (ev) => {
            const k = ev.target.getAttribute('value');
            const url = (gBrowser.currentURI && gBrowser.currentURI.spec) ? gBrowser.currentURI.spec : '';
            launch(BrowserPath[k], url);
          }, false);
    
          popup.appendChild(mi);
        }
    
        btn.appendChild(popup);
      }
    
      try {
        CustomizableUI.createWidget({
          id: btn_id,
          defaultArea: CustomizableUI.AREA_NAVBAR,
          label: btn_label,
          tooltiptext: btn_tooltiptext,
          onCreated: (this_button) => {
            this_button.style.MozContextProperties = 'fill, stroke, fill-opacity, stroke-opacity';
            this_button.style.listStyleImage = 'url("' + ImagePath + '")';
            this_button.style.minWidth = 'fit-content';
    
            // Dropdown
            this_button.setAttribute('type', 'menu');
    
            ensurePopup();
    
            this_button.addEventListener('click', (event) => {
              if (event.button !== 0) return;
              ensurePopup();
              const popup = document.getElementById(btn_id + '_popup');
              if (popup && typeof popup.openPopup === 'function') {
                popup.openPopup(this_button, 'after_start', 0, 0, true, false);
              }
            }, true);
          }
        });
      } catch (e) {
        setTimeout(() => ensurePopup(), 200);
      }
    
      if (window.readyState !== "loading") {
        setTimeout(() => ensurePopup(), 500);
      } else {
        window.addEventListener("DOMContentLoaded", () => ensurePopup(), { once: true });
      }
    
      window.addEventListener('aftercustomization', () => {
        setTimeout(() => ensurePopup(), 100);
      }, false);
    
    })();
    Alles anzeigen
  • Profilmanager

    • FuchsFan
    • 14. Mai 2026 um 19:52
    Zitat von 2002Andreas

    Ich kenne mich mit Skripten ja nicht aus, aber wozu brauchst du die Ordner überhaupt

    Ja, sonst startet der Firefox nicht, und Icons werden auch nicht angezeigt. Du weißt, ich habe auch keine Ahnung, aber KI hat das nun mal so eingerichtet, und es funktioniert .

  • Profilmanager

    • FuchsFan
    • 14. Mai 2026 um 19:20

    Das kann ich so nicht stehen lassen, denn die im ersten Script eingetragenen portablen Versionen sind alle mit dem FirefoxUpdater erstellt worden, der Profilordner darin heißt "profile". Damit funktioniert es so, wie sie in dem Script eingetragen sind ohne Probleme. Nun habe ich eine weitere portable Version zum Test eingebaut, und da öffnete sich bei Klick immer der Profilmanager, Firefox wurde nicht gestartet. Diese Form brauchte im Script eine andere Behandlung, und der Eintrag im Script sieht dafür anders aus, und hier heißt er "Profilordner". Hier sind die Unterschiede aufgeführt:

    JavaScript
    addProfileItem(document, popup,
          "️Portable U Beta 4 🔥 ", "profile",
          "G:\\Portable.Firefox.Updater.4\\Firefox Beta x64 Launcher.exe",
          "file:///C:/FoxIcons/Beta.png"
        );
    
        // ✅ Firefox3p: Profilordner direkt starten (kein Profilmanager)
        addProfileItem(document, popup,
          "️Firefox3p 🔥 ",
          "G:\\Firefox Test\\Firefox3p\\Profilordner",
          "G:\\Firefox Test\\Firefox3p\\Firefox64\\firefox.exe",
          "file:///C:/FoxIcons/Finale.png",
          "dir"
        );
    Alles anzeigen

    Das Script wurde deswegen neu angepasst:

    JavaScript
    // == PROFILSTARTER.UC.JS v9-test - CSS SOFORT + MULTI-FENSTER FIX ===
    console.log("=== PROFILSTARTER.UC.JS v9-test - CSS SOFORT + MULTI-FENSTER FIX ===");
    
    (function() {
    
      if (!window.gBrowser)
        return;
    
      // User Settings
      let btn_id = 'aboutprofiles-Start';          // Button #id
      const btn_icon = 'p2.png';                   // Symbol
      const iconPath = 'file:///C:/FoxIcons/';     // Icon-Ordner
      const ImagePath = iconPath + btn_icon;
    
      const btn_label = 'Profil zusätzlich starten';
      const btn_tooltiptext = 'Zusätzliche Firefox-Profile starten';
    
      const POPUP_ID = btn_id + '-popup';
    
      // ✅ CSS einmalig pro Fenster injizieren
      let cssInjected = false;
    
      // ============== CSS ==============
      function injectUserCSS() {
        try {
          if (cssInjected) return;
    
          const css = `
            #${btn_id} image.toolbarbutton-icon {
              transform: scale(1.0) !important;
              padding: 6px !important;
            }
            #${POPUP_ID} {
              max-width: 285px !important;
            }
            #${POPUP_ID} menuitem {
              padding-inline-start: 8px !important;
              padding-inline-end: 8px !important;
              margin: 0 !important;
              min-height: 24px !important;
            }
            #${POPUP_ID} menuitem.menuitem-iconic .menu-icon {
              margin-inline-end: 8px !important;
              margin-inline-start: -30px !important;
              width: 16px !important;
              height: 16px !important;
            }
            #${POPUP_ID} menuitem.menuitem-iconic .menu-text {
              margin-left: 8px !important;
              font-weight: 500 !important;
              padding: 2px 0 2px 0 !important;
            }
            #${POPUP_ID} menuitem.menuitem-iconic:hover .menu-text {
              margin-left: 8px !important;
              font-weight: 600 !important;
              color: red !important;
              opacity: 1 !important;
            }
          `;
    
          const Cc = Components.classes;
          const Ci = Components.interfaces;
          const Cu = Components.utils;
    
          const Services = globalThis.Services || Cu.import("resource://gre/modules/Services.jsm").Services;
          const sss = Cc["@mozilla.org/content/style-sheet-service;1"]
                      .getService(Ci.nsIStyleSheetService);
    
          const uri = Services.io.newURI(
            "data:text/css;charset=utf-8," + encodeURIComponent(css)
          );
    
          if (!sss.sheetRegistered(uri, sss.AUTHOR_SHEET)) {
            sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
          }
    
          cssInjected = true;
          console.log("[PROFILSTARTER] CSS injiziert.");
        } catch (e) {
          console.error("[PROFILSTARTER] CSS Fehler:", e);
        }
      }
    
      // ============== Profil-Daten ==============
      const PROFIL_NAMEN = {
        
        "ArbeitsFox":        { name: " ArbeitsFox  ( >>Standard<< ) 🏠",     icon: "Finale.png" },
        "Einkauf":           { name: " Einkaufen  ( >>Shops<< ) 🏠",         icon: "s4.png" },
        "default":           { name: " Nicht starten  ( >>Default<< ) 🏠",   icon: "warnung19.png" },
        "Reserve":           { name: " Reserve 1  ( >>Ersatz-Profil<< ) 🏠", icon: "Firefox32.png" },
        "Reserve-Profil 2":  { name: " Reserve 2  ( >>Ersatz-Profil<< ) 🏠", icon: "Firefox32.png" },
        "Reserve 3":         { name: " Reserve 3  ( >>Ersatz-Profil<< ) 🏠", icon: "Firefox32.png" }
      };
    
      // ============== START (angepasst: -profile dir) ==============
      function startProfile(profileValue, exePath, mode = "name") {
        try {
          const Cc = Components.classes;
          const Ci = Components.interfaces;
    
          let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
          let defaultPath = "C:\\Program Files\\Mozilla Firefox\\firefox.exe";
          file.initWithPath(exePath || defaultPath);
    
          let args;
    
          if (mode === "dir") {
            // Profilordner direkt starten
            args = ["-no-remote", "-profile", profileValue, "-foreground"];
          } else {
            // Normal: Profilname (aus profiles.ini)
            args = ["-no-remote", "-P", profileValue || "", "-foreground"];
          }
    
          let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
          process.init(file);
          process.run(false, args, args.length);
    
          console.log(
            "[PROFILSTARTER] Start:",
            mode,
            profileValue,
            "EXE:",
            exePath || defaultPath,
            "ARGS:",
            args.join(" ")
          );
        } catch (e) {
          console.error("[PROFILSTARTER] Start Fehler:", e);
        }
      }
    
      // ============== MENU ITEM (angepasst: mode weiterreichen) ==============
      function addProfileItem(aDocument, menupopup, label, profileValue, exePath, iconURI = null, mode = "name") {
        const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        let item = aDocument.createElementNS(xulNS, "menuitem");
        item.setAttribute("label", label);
    
        if (iconURI) {
          item.setAttribute("class", "menuitem-iconic");
          item.setAttribute("image", iconURI);
        }
    
        item.addEventListener("command", () => startProfile(profileValue, exePath, mode));
        menupopup.appendChild(item);
      }
    
      function loadProfilesWithNiceNames(aDocument, menupopup) {
        const ICON_BASE = "file:///C:/FoxIcons/";
    
        const INI_PATH = "C:\\Users\\Old Man\\AppData\\Roaming\\Mozilla\\Firefox\\profiles.ini";
    
        try {
          let iniFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
          iniFile.initWithPath(INI_PATH);
    
          if (!iniFile.exists()) {
            addProfileItem(aDocument, menupopup, "❌ profiles.ini fehlt", "", null, null);
            return;
          }
    
          const iniParser = Components.classes["@mozilla.org/xpcom/ini-parser-factory;1"]
            .getService(Components.interfaces.nsIINIParserFactory)
            .createINIParser(iniFile);
    
          for (let section of iniParser.getSections()) {
            if (!section.startsWith("Profile")) continue;
    
            let profileNameRaw = iniParser.getString(section, "Name") || section.replace("Profile", "");
            let eintrag = PROFIL_NAMEN[profileNameRaw];
    
            let niceName, iconURI = null;
    
            if (eintrag && typeof eintrag === "object") {
              niceName = eintrag.name;
              if (eintrag.icon) iconURI = ICON_BASE + eintrag.icon;
            } else {
              niceName = profileNameRaw + " (unbekannt)";
            }
    
            addProfileItem(aDocument, menupopup, niceName, profileNameRaw, null, iconURI);
          }
        } catch (e) {
          console.error("[PROFILSTARTER] INI Fehler:", e);
          addProfileItem(aDocument, menupopup, "❌ profiles.ini Fehler", "", null, null);
        }
      }
    
      function buildPopupIfNeeded() {
        const button = document.getElementById(btn_id);
        if (!button) return null;
    
        if (button.getAttribute("profiles-menu-built") === "true") {
          return document.getElementById(POPUP_ID);
        }
    
        const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        let popup = document.getElementById(POPUP_ID);
    
        if (!popup) {
          popup = document.createElementNS(xulNS, "menupopup");
          popup.setAttribute("id", POPUP_ID);
          button.appendChild(popup);
        } else {
          // ggf. vorherige Einträge löschen
          while (popup.firstChild) popup.removeChild(popup.firstChild);
        }
    
        // Profile aus profiles.ini
        loadProfilesWithNiceNames(document, popup);
    
        // Portable Profile (wie bisher: mode default="name")
        addProfileItem(document, popup,
          "Portable U Nightly 3 🔥", "profile",
          "G:\\Portable.Firefox.Updater.3\\Firefox Nightly x64 Launcher.exe",
          "file:///C:/FoxIcons/Nightly.png"
        );
        addProfileItem(document, popup,
          "️Portable U Stable 3 🔥 ", "profile",
          "G:\\Portable.Firefox.Updater.3\\Firefox Stable x64 Launcher.exe",
          "file:///C:/FoxIcons/Finale.png"
        );
        addProfileItem(document, popup,
          "️Portable U Beta 3 🔥 ", "profile",
          "G:\\Portable.Firefox.Updater.3\\Firefox Beta x64 Launcher.exe",
          "file:///C:/FoxIcons/Beta.png"
        );
    
        addProfileItem(document, popup,
          "Portable U Nightly 1 🔥", "profile",
          "G:\\Portable.Firefox.Updater.1\\Firefox Nightly x64 Launcher.exe",
          "file:///C:/FoxIcons/Nightly.png"
        );
        addProfileItem(document, popup,
          "️Portable U Stable 1 🔥 ", "profile",
          "G:\\Portable.Firefox.Updater.1\\Firefox Stable x64 Launcher.exe",
          "file:///C:/FoxIcons/Finale.png"
        );
        addProfileItem(document, popup,
          "️Portable U Beta 1 🔥 ", "profile",
          "G:\\Portable.Firefox.Updater.1\\Firefox Beta x64 Launcher.exe",
          "file:///C:/FoxIcons/Beta.png"
        );
    
        addProfileItem(document, popup,
          "Portable U Nightly 2 🔥", "profile",
          "G:\\Portable.Firefox.Updater.2\\Firefox Nightly x64 Launcher.exe",
          "file:///C:/FoxIcons/Nightly.png"
        );
        addProfileItem(document, popup,
          "️Portable U Stable 2 🔥 ", "profile",
          "G:\\Portable.Firefox.Updater.2\\Firefox Stable x64 Launcher.exe",
          "file:///C:/FoxIcons/Finale.png"
        );
        addProfileItem(document, popup,
          "️Portable U Beta 2 🔥 ", "profile",
          "G:\\Portable.Firefox.Updater.2\\Firefox Beta x64 Launcher.exe",
          "file:///C:/FoxIcons/Beta.png"
        );
    
        addProfileItem(document, popup,
          "Portable U Nightly 4 🔥", "profile",
          "G:\\Portable.Firefox.Updater.4\\Firefox Nightly x64 Launcher.exe",
          "file:///C:/FoxIcons/Nightly.png"
        );
        addProfileItem(document, popup,
          "️Portable U Stable 4 🔥 ", "profile",
          "G:\\Portable.Firefox.Updater.4\\Firefox Stable x64 Launcher.exe",
          "file:///C:/FoxIcons/Finale.png"
        );
        addProfileItem(document, popup,
          "️Portable U Beta 4 🔥 ", "profile",
          "G:\\Portable.Firefox.Updater.4\\Firefox Beta x64 Launcher.exe",
          "file:///C:/FoxIcons/Beta.png"
        );
    
        // ✅ Firefox3p: Profilordner direkt starten (kein Profilmanager)
        addProfileItem(document, popup,
          "️Firefox3p 🔥 ",
          "G:\\Firefox Test\\Firefox3p\\Profilordner",
          "G:\\Firefox Test\\Firefox3p\\Firefox64\\firefox.exe",
          "file:///C:/FoxIcons/Finale.png",
          "dir"
        );
    
        button.setAttribute("profiles-menu-built", "true");
        return popup;
      }
    
      function click_button() {
        let button = document.getElementById(btn_id);
        if (!button) return;
    
        if (button.hasAttribute("listener-added"))
          return;
    
        button.setAttribute("listener-added", "true");
    
        // Kontextmenü unterdrücken
        button.addEventListener("contextmenu", event => {
          event.preventDefault();
        });
    
        // Klick: Popup öffnen (links oder rechts)
        button.addEventListener('click', event => {
          event.preventDefault();
          event.stopPropagation();
    
          // CSS ist jetzt schon beim Start aktiv (injectUserCSS ist idempotent),
          injectUserCSS();
    
          let popup = buildPopupIfNeeded();
          if (!popup) return;
    
          // Popup am Button öffnen
          try {
            popup.openPopup(button, "after_start", 0, 0, false, false);
          } catch (e) {
            console.error("[PROFILSTARTER] openPopup Fehler:", e);
          }
        });
      }
    
      // Widget anlegen (nur einmal versuchen)
      try {
        CustomizableUI.createWidget({
          id: btn_id,
          defaultArea: CustomizableUI.AREA_NAVBAR,
          label: btn_label,
          tooltiptext: btn_tooltiptext,
    
          onCreated: (this_button) => {
            this_button.style.listStyleImage = 'url("' + ImagePath + '")';
            this_button.style.minWidth = 'fit-content';
          }
        });
      } catch (e) {
        // Widget existiert evtl. schon -> ignorieren
      }
    
      // Listener pro Fenster setzen
      function initForWindow() {
        // ✅ CSS sofort verfügbar machen (damit das Icon von Anfang an stimmt)
        injectUserCSS();
    
        if (window.readyState !== "loading") {
          setTimeout(click_button, 300);
        } else {
          window.addEventListener("DOMContentLoaded", () => setTimeout(click_button, 300));
        }
      }
    
      initForWindow();
    
      window.addEventListener('aftercustomization', () => {
        injectUserCSS();
        setTimeout(() => click_button(), 100);
      });
    
    })();
    Alles anzeigen
  • Profilmanager

    • FuchsFan
    • 14. Mai 2026 um 17:58

    In allen meinen portablen Versionen wird mit meinem Script die profiles.ini der installierten Version ausgelesen. Der Grund dafür ist der, dass dieser Pfad const INI_PATH = "C:\\Users\\Old Man\\AppData\\Roaming\\Mozilla\\Firefox\\profiles.ini"; dafür aufgerufen wird, egal ob installiert oder portable. Keine Probleme damit hier.

  • Profilmanager

    • FuchsFan
    • 14. Mai 2026 um 15:35
    Zitat von Mira_Belle

    Entschuldige.

    Keine Panik, alles ist gut, Hauptsache du hast es bekommen. Gute Reise!

  • Profilmanager

    • FuchsFan
    • 14. Mai 2026 um 15:00
    Zitat von Mira_Belle

    Deshalb ist jetzt an dieser Stelle erst einmal Schluss.

    Mira_Belle Den Link hast du gesehen?

    Keine Antwort, deshalb stelle ich den Link zum Download hier ein. Es ist meine Reserve, und beinhaltet alle vier portablen Versionen im Original und startbereit. Falls jemand es laden möchte, der Download hat noch 7 Tage Gültigkeit.

    Lufi - Disroot file uploader

  • Profilmanager

    • FuchsFan
    • 14. Mai 2026 um 13:38

    icons.zip

  • Profilmanager

    • FuchsFan
    • 14. Mai 2026 um 12:42
    Zitat von Mira_Belle

    Wie hast Du die portablen Versionen erstellt?
    Warum hast Du verschiedene Launcher.exe?

    Mira_Belle , hier gab es dieses Programm dafür, funktioniert nicht mehr, und wurde auch nicht mehr weiter entwickelt https://github.com/UndertakerBen/PorFirefoxUpd/releases. Die ich damals damit erstellt habe funktionieren immer noch. Welche Version möchtest du denn haben. Übrigens,das erste Script, welches ich gezeigt habe, funktioniert in jeder Version, installiert oder portable. Auch das zweite Script in Nightla portable.

  • Profilmanager

    • FuchsFan
    • 14. Mai 2026 um 10:34
    Zitat von 2002Andreas

    Wenn das Skript in einer port. Version ist, dann ist das hier auch so:

    Danke, Andreas, so war es hier beim Test.

  • Profilmanager

    • FuchsFan
    • 14. Mai 2026 um 09:42
    Zitat von Mira_Belle

    Für das erzeugte Menü wird die profiles.ini ausgelesen.

    Habe dein Script von v150 bis v152 getestet, Button wird erzeugt, Menü ist auch da, aber überall mit der Meldung darin "profiles.ini fehlt". Das ist natürlich nicht der Fall, funktioniert es denn bei dir, dass die *.ini ausgelesen wird?

  • Profilmanager

    • FuchsFan
    • 13. Mai 2026 um 19:12
    Zitat von 2002Andreas

    Das andere ist die compatibility.ini im Profilordner:

    Danke, hatte ich mir auch schon angesehen.

Unterstütze uns!

Jährlich (2026)

61,9 %

61,9% (479,86 von 775 EUR)

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