Wenn du schon so viel Zeit durch die Verwendung von KI einsparst, wäre ich dankbar, wenn du einen Bruchteil davon verwenden könntest, um bei deinem Codes hier im Forum JavaScript auszuwählen, damit ich nicht immer alle Beiträge bearbeiten muss, weil das falsche Syntax-Highlighting verwendet wird. Bereits ein Vorkommen von „!important” reicht beispielsweise, damit CSS erkannt wird, was für Scripts mit eingebettetem CSS ein Problem ist. ![]()
extra_config_menu.uc.js > ohne security.allow_unsafe_dangerous_privileged_evil_eval auf false
-
Endor -
10. August 2026 um 12:10 -
Erledigt
-
-
Auf ein Neues!
Dies bezierht sich auf 2002Andreas Beitrag!!
Den UserScriptLoader nutze ich, aber ich habe den so ganz anders eingebunden
und der lädt ganz normal die Skripte, die im OrdnerC:\Users\Mira\AppData\Roaming\Mozilla\Firefox\Profiles\Mira\chrome\scripts
liegen.

Ok, also werde ich den Code für "Deine" Erweiterung rausschmeißen!
( Bild Url.css und config Einträge.css )Was ich mich noch frage, wozu sind "CSSShadow-Ordner" & "CSSWeb-Ordner" da?
Nutze ich nicht, sind nicht angelegt
und diese Einträge habe ich per internem CSS ausgeblendet.Womit ich auch so gar nichts anfangen kann,
sind die Submenüs "CSSShadow" und "cssweb"
Auch diese habe ich per internem CSS vorerst ausgeblendet!Wer sich nun fragt warum nicht gleich den Code bereinigen.
1. Ich weiß nicht wozu diese Einträge da sind.
2. Wollte ich so wenig Code wie möglich ändern und nur notwendige Anpassungen vornehmen.
... Der Code soll ja so nah wie Möglich am Original bleiben!!Wäre also sehr schön, wenn mir jemand Erklärungen liefern könnte und
auch was mit den "Einbindung GM-Skripte-Ordner" passieren soll.
Wird das denn noch genutzt?Zitat von 2002AndreasDas möchte ich nicht entscheiden, nur ich habe das noch nie genutzt/gebraucht. Evtl. können ja andere User etwas dazu sagen.
Und ich denke, dass es keine schlechte Idee ist die userChromeShadow.uc.js per Funktion sichtbar oder unsichtbar zu machen.
Dann kann jeder Anwender selbst entscheiden!
Im Grunde ist das zwar meiner Meinung Quatsch, da das Menü ja zum direkten Aufruf der Dateien da ist,
damit sie eben direkt bearbeitet werden können und genau diese Datei eigentlich nie bearbeitet werden sollte,
aber wenn es doch jemand braucht, warum nicht!
Sie würde ja auch nur angezeigt werden, wenn sie vorhanden ist. -
Einbindung GM-Skripte-Ordner
Der kann weg. Der wurde nur gebraucht wenn das Script userScriptloader.uc.js
userChrome.js/userscriptloader at master · ardiman/userChrome.jsSkripte für die Firefox-Erweiterung userChromeJS. Contribute to ardiman/userChrome.js development by creating an account on GitHub.github.comverwendet wurde. Dieses funktioniert schon sehr sehr lange nicht mehr.
Das war ein Script - Ersatz für die Erweiterungen: Greasemonkey, Tampermonkey usw. -
wäre ich dankbar, wenn du einen Bruchteil davon verwenden könntest, um bei deinem Codes hier im Forum JavaScript auszuwählen
Das war nie meine Absicht zusätzliche Arbeit zu verursachen. Das ist das erste Mal, dass ich diesen Hinweis erhalten habe, eine Auswahl zu treffen. Ich habe überhaupt nicht gewusst dass es so was gibt. Danke für diese Aufklärung, werde mich bessern.


-
wozu sind "CSSShadow-Ordner" & "CSSWeb-Ordner" da?
Im ersten liegen die CSS-Dateien für Shadow:
Aufgerufen werden sie über diese Datei per import Regel.:
Im anderen die CSS-Dateien für Webseiten etc.
Die werden alle per import regel in der userContent.css aufgerufen.
-
Der kann weg. Der wurde nur gebraucht wenn das Script userScriptloader.uc.js
Danke für die Erklärung, dann kann der Code dafür ja ausgemistet werden.
Macht das Skript dann etwas "schlanker".Im ersten liegen die CSS-Dateien für Shadow:
Was auch immer das bedeuten soll,
aber Deine Erklärung sagt mir, es ist von Nutzen.
Also bleibt es!
Ich nutze es nicht, also blende ich es nur per internem CSS aus
und versehe es mit einem Kommentar!Im anderen die CSS-Dateien für Webseiten etc.
Nutze ich so zwar auch nicht, was ich aber überdenken werde,
denn es macht ja die userContent.css wieder übersichtlicher
Ergo, das bleibt auch!Fazit.
Der Code für "Bild Url" & "config Einträge.css" sowie
für die "Einbindung GM-Skripte-Ordner" kann weg.Der Code für "CSSShadow-Ordner" & "CSSWeb-Ordner" belasse ich unangetastet im Skript,
für mich persönlich schaffe ich ein internes CSS und blende den für mich uninteressanten Menüeintrag einfach aus.Und so gehe ich auch bei den beiden Menüeinträgen "CSSShadow" & "cssweb" vor.
Das Skript wird um Code zur Aktivierung/Deaktivierung der Sichtbarkeit der Datei "userChromeShadow.uc.js" ergänzt.
Per Default nicht sichtbar! Und natürlich auch mit Erläuterung.
Melde mich dann wieder, wenn ich etwas vorzuweisen habe,
oder wenn jemand noch eine Frage oder Anmerkung hat. -
wäre ich dankbar, wenn du einen Bruchteil davon verwenden könntest, um bei deinem Codes hier im Forum JavaScript auszuwählen
Das war nie meine Absicht zusätzliche Arbeit zu verursachen. Das ist das erste Mal, dass ich diesen Hinweis erhalten habe, eine Auswahl zu treffen. Ich habe überhaupt nicht gewusst dass es so was gibt. Danke für diese Aufklärung, werde mich bessern.


Danke.
Das war auch nicht als Kritik gemeint und betrifft genauso andere Nutzer. Die KI-Erwähnung war nur eine willkommene Überleitung, um das mal anzusprechen. 
-
Leck mich am ...... (von mir selbst zensiert)

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

-
Es ist also nicht ganz einfach, es für alle Nutzer perfekt zu machen
Und damit hat Andreas vollkommen recht. Mache ein Basis-Skript fertig, wer dann noch Wünsche hat, das kannst du dann nachliefern (nicht unter Zwang
). Für mich ist das Script das "Schweizer Taschenmesser", möchte ich nicht mehr missen. -
Für mich ist das Script das "Schweizer Taschenmesser", möchte ich nicht mehr missen.
dem schließe ich mich zu 100% an

Mache ein Basis-Skript fertig
Gute Idee

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

Hier die Konfig:
JavaScript
Alles anzeigen// ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // Hier kann der Pfad zum einem Texteditor eintragen werden // (unter Ubuntu 10.04 z.B.: '/usr/bin/gedit'). Bei Fehleintrag wird view_source.editor.path ausgelesen: //TextOpenExe: 'C:\\Program Files (x86)\\Notepad++\\notepad++.exe', TextOpenExe: 'C:\\Program Files\\Microsoft VS Code\\Code.exe', // Falls gewuenscht, kann hier ein Dateimanager eintragen (komplett leer lassen fuer Dateimanager des Systems) Beispiele: // vFileManager: 'E:\\Total Commander\\Totalcmd.exe', // vFileManager: 'C:\\Program Files (x86)\\FreeCommander\\FreeCommander.exe' vFileManager: '', // In der folgenden Zeile kann festgelegt werden, ob ein verschiebbarer Button erstellt wird: showAsButton: 1, // 1: ja / Button wird erstellt, 0: nein / Menue unter "Extras"0: nein / Menue unter "Extras" // Unter Linux sollte/kann versucht werden, die userChromeJS-Skripte zu sortieren, unter Windows ist das evtl. nicht noetig (die Sortierung wird Gross- und Kleinschreibung *nicht* beruecksichtigen - dazu wird die sort()-Funktion entsprechend mit einer Vergleichsfunktion aufgerufen) sortScripts: 0, // 1 zum Erzwingen der Sortierung // Zeigt die Datei userChromeShadow.uc.js falls vorhanden in der Skriptliste an (1: ja, 0: nein): showuCS: 0, // Default => 0 // Einbindung CSS-Ordner (0: nein, 1: UserCSSLoader-Ordner im Chrome-Verzeichnis): cssOrdner: 1, // Nachfolgend gueltige about:Adressen eintragen, die ebenfalls aufgerufen werden sollen oder // zum Ausblenden: abouts: [], // Damit die about:-Seiten nicht als Untermenue, sondern direkt als Menuepunkte aufgefuehrt werden, muss das erste Element '0' sein: // Zum Beispiel so: abouts: ['0','about:about','about:addons','about:cache','about:config','about:support'], abouts: ['about:about','about:addons','about:cache','about:config','about:crashes', 'about:downloads','about:home','about:logins','about:memory','about:support', 'about:preferences','about:performance','about:profiles' ], // Die normalen Firefox-Einstellungen auch zur Verfuegung stellen (0: nein, 1: ja): showNormalPrefs: 1, // Stellt "Skriptliste in Zwischenablage" zur Verfuegung (1: ja, 2: mit getrennter Nummerierung, 3: mit gemeinsamer Nummerierung) oder nicht (0): enableScriptsToClip: 2, // Um den Eintrag "Neustart" zu erzwingen (falls z.B. das andere Skript zu spaet eingebunden und nicht erkannt wird), auf 1 setzen: enableRestart: 1, // Button-Aussehen (1: flexibles SVG-Icon aus Icon-Ordner, 0: festes Base64-PNG-Icon): buttonStyle: 0, // Default => 0 // Symbol (Icon) nur fuer Button: icon: 'edit.svg', // [Name.Dateiendung] des Symbols iconColour: '#FF00FF', // Farbe fuer das SVG-Icon setzen (leer fuer Originalfarbe) iconPath: '/chrome/icons/', // Pfad zum Ordner der das Icon beinhaltet // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ -
Probiere es noch einmal aus, bitte.
ich kann keine Fehler/Probleme feststellen

-
FuchsFan Ich habe Deinen Ratschlag befolgt und es ermöglicht
einen eigenen Ordner für die Skripte unter "chrome" zu benennen!Die betreffende Variable und die Erläuterung dazu:
JavaScript// Falls Javacripte sich nicht nur im chrome-Verzeichnis, // sondern auch in einem Unterverzeichnis befinden, hier den Ordnernamen des Unterverzeichnises eintragen. // Sonst: '' , es werden dann nur die Skripte aus dem chrome-Verzeichnis angezeigt jsSubfolder: 'scripts',Ist klar was gemeint ist, oder muss/ sollte das irgendwie anders Formuliert werden?
-
Ist klar was gemeint ist
Aber ja!

-
Aber ja!

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

Diese Datei wird doch ganz normal in der Liste angezeigt, genau wie alle anderen Skripte auch. Daher gibt es keinen Grund, sie auszublenden.
Wenn dann müsste auch die userChromeShadow.css angezeigt werden.
Grund:
In dieser Datei befinden sich entweder die CSS-Codes oder die import Regeln.
Und wenn man die import Regeln nutzt, dann muss auch noch ein Ordner CSSShadow-Ordner erstellt werden.
-
Hallo Mira_Belle.
Klasse Script. Alles bestens !!!!!
Funktioniert prima. !!Nur eine Frage und kein Muss.
Ich habe hier über 100 Scripte am laufen und auch über 100 CSS Stile.
Gibt es eine Möglichkeit die Mehrspaltig im Popup anzeigen zu lassen?
Nochmals vielen Dank für diese Version.
Mfg.
Endor -