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

  • userChrome.js Scripte für den Fuchs (Diskussion)

    • FuchsFan
    • 13. November 2025 um 14:13

    Heute habe ich ein neues Profil angelegt (v145.0), und in diesem wird in der Konsole der folgende Fehler angezeigt.

        

    In dem älteren Profil ist es nicht so, wie kann das sein. Was muss im Script geändert werden? Danke für jede Hilfe.

    JavaScript
    // Button_ClearCache.uc.js
    // Linksklick löscht den Cache
    // Mittelklick öffnet die Bookmarks-Sidebar
    // Rechtsklick öffnet den Chronik-Dialog
    
    (function() {
    	if (!window.gBrowser)
    		return;
    	
    	try { 
    	        CustomizableUI.createWidget({
                id: 'buttonClearCache',
                type: 'custom',
                defaultArea: CustomizableUI.AREAS,
                onBuild: function(aDocument) {
                   var toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
                   var props = {
                        id: 'buttonClearCache',
                        class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                        removable: true,
                    // Name im AnpassungFenster
                        label: 'Cache löschen',
                    // Name bei MausHover wenn in Symbolleiste
                        tooltiptext: 'Links Cache löschen / Mittelklick öffnet die Bookmarks-Sidebar / Rechts Chronik-Dialog öffnen',
                        style: 'list-style-image: url("file:///C:/FoxIcons2/Bild43.png")',
    			
    		       };
                   for (var p in props)
                      toolbaritem.setAttribute(p, props[p]);
    
                   return toolbaritem;
    			   
                   }
                });
            } catch(e) { };	
    		
    		document.getElementById('buttonClearCache').addEventListener('click', event => {
    			
    				if (event.button == 0) {
    					Services.cache2.clear();
    				}
    				if (event.button == 1) {
    					SidebarController.toggle('viewBookmarksSidebar').click();
    				}
    				if (event.button == 2) {
    					event.target.ownerDocument.getElementById('sanitizeItem').click();
    				}
    			});
    })();					
    Alles anzeigen


    Edit: Den Teil im Script habe ich jetzt so geändert:

    Code
    		//document.getElementById('buttonClearCache').addEventListener('click', event => {
    			
    			function onClick(event) {
    			
    				if (event.button == 0) {
    					Services.cache2.clear();
    				}
    				if (event.button == 1) {
    					SidebarController.toggle('viewBookmarksSidebar').click();
    				}
    				if (event.button == 2) {
    					event.target.ownerDocument.getElementById('sanitizeItem').click();
    				}
    			});
    })();					
    Alles anzeigen

    Dadurch sind die Fehler 37 und 49 weg, aber 114 in der utilities.js wird immer noch angezeigt.

  • Schaltbare vertikale Overlay-Zusatzleiste

    • FuchsFan
    • 12. November 2025 um 15:39
    Zitat von Horstmann

    Mir ist das auch hier schon aufgefallen; meine Vermutung war aber dass du einfach den Screenshot rechts zu stark angeschnitten hattest.

    Nein, hier hatte ich das Script getestet, nur den Hintergrund geändert, sonst nichts. So ist es jetzt mit ein paar Änderungen, Breite kann ja beliebig angepasst werden.

  • Schaltbare vertikale Overlay-Zusatzleiste

    • FuchsFan
    • 12. November 2025 um 14:30
    Zitat von Mitleser

    Für Buttons, die in der Breite von den Standardbuttons abweichen kann in der '■UserConfiguration TOOLBAR■' --vt-toolbar-min-width: 32px; /*Leistenbreite bei mouseout*/ angepasst werden. Dann würde auch der rechte Rand des Buttons sichtbar sein.

    Die Breite hatte ich schon geändert, aber das sind nicht die einzelnen Button. Das sieht so aus:

  • Schaltbare vertikale Overlay-Zusatzleiste

    • FuchsFan
    • 12. November 2025 um 09:22

    Gefällt mir auch! :thumbup:

  • Eigene Zusatzleisten ab ff 143+

    • FuchsFan
    • 10. November 2025 um 19:47
    Zitat von Horstmann

    ansonsten müsste sie jetzt automatisch gesetzt und an Themes angepasst sein.

    :thumbup:, passt!

  • Eigene Zusatzleisten ab ff 143+

    • FuchsFan
    • 10. November 2025 um 14:13
    Zitat von 2002Andreas

    Niemand weiß welches Skript der User überhaupt nutzt.

    Da habe ich jetzt nicht drauf geachtet, mich nur auf das Script aus #106 konzentriert.:/

    Zitat von Horstmann

    Wenn du die Border sichtbar haben möchtest, kannst du die Farbe in Zeile 53 fest eingeben

    Danke für deine Hinweise, mache ich dann noch. Auf die Schnelle hatte ich das Script erst einmal nur eingefügt, um zu prüfen ob es alles funktioniert.

  • Eigene Zusatzleisten ab ff 143+

    • FuchsFan
    • 10. November 2025 um 09:40
    Zitat von Fritz80

    aber nur so groß das nur ein Icon drauf passt.

    Ohne eine Änderung am Script, es wird alles angezeigt.:/

  • ExtrasConfigMenuPlus.uc.js anpassen

    • FuchsFan
    • 25. Oktober 2025 um 13:15
    Zitat von Boersenfeger

    Da ich diesen Eintrag nicht benötige, nutze ich weiter meine o.a. funktionierende Version.

    Mache ich ja auch, möchte ich auch nicht mehr hergeben. Dieses Script von #1 ist für mich eine Alternative, denn bisher haben wir immer Glück gehabt, dass Helfer in der Not unser Script wieder lauffähig gemacht haben. Wir wollen hoffen, dass es auch in Zukunft so bleibt.

  • ExtrasConfigMenuPlus.uc.js anpassen

    • FuchsFan
    • 25. Oktober 2025 um 11:41
    Zitat von 2002Andreas

    Ich meine das mal gelesen zu haben, bin mir aber nicht sicher.

    Nur notepad++ habe ich dort, alle anderen portablen Programme liegen auf einem anderen Laufwerk. Muss ich dann auch mal verschieben, ist ja kein Problem.

  • ExtrasConfigMenuPlus.uc.js anpassen

    • FuchsFan
    • 25. Oktober 2025 um 11:35
    Zitat von 2002Andreas

    Heißt es nicht immer: Portable Programme nicht unter C:// einzutragen!?

    ?????:/

  • ExtrasConfigMenuPlus.uc.js anpassen

    • FuchsFan
    • 25. Oktober 2025 um 11:04
    Zitat von 2002Andreas

    Aber eben nicht bei einer (normalen) Installation.

    Genau, das muss dann berücksichtigt werden, wie sich jetzt zeigt. Danke, Andreas!:)

  • ExtrasConfigMenuPlus.uc.js anpassen

    • FuchsFan
    • 25. Oktober 2025 um 10:57
    Zitat von 2002Andreas

    Wo hast du denn Notepad++ installiert?

    Auf Laufwerk C: als portable Version.

  • ExtrasConfigMenuPlus.uc.js anpassen

    • FuchsFan
    • 25. Oktober 2025 um 10:53
    Zitat von FuchsFan

    Ein Klick auf D: Ordner Software leeren, und der Inhalt des Ordners Software auf D: wird gelöscht, usw.

    Nur noch ein Hinweis hierzu, falls es nachgemacht werden soll. Im Ordner Software auf Laufwerk D muss sich die PowerShell-Datei löschen.ps1 befinden. Der Eintrag in diesem Fall sieht dann so aus Remove-Item -Path "D:\Software\*" -Exclude "löschen.ps1" -Recurse.

    Das bedeutet, der Inhalt des Ordners Software wird gelöscht, ausgenommen davon ist die Datei löschen.ps1, denn diese muss ja erhalten bleiben.

    Das wäre so auf andere Vorgänge übertragbar, Backup usw.

  • ExtrasConfigMenuPlus.uc.js anpassen

    • FuchsFan
    • 25. Oktober 2025 um 10:05

    2002Andreas , milupo , BrokenHeart

    Danke für euer Mitwirken, was letztendlich zum Erfolg führte.:thumbup:

    Zitat von BrokenHeart

    Du musst also nur in Zeile 76 deinen Pfad eintragen:

    Genau so funktioniert es jetzt, und zwar muss die Zeile so aussehen (ohne die 1) editor: 'C:\\notepad++\\notepad++.exe',

  • ExtrasConfigMenuPlus.uc.js anpassen

    • FuchsFan
    • 24. Oktober 2025 um 20:18
    Zitat von Boersenfeger

    Rein Interesse halber: Was kann dein Script, was meins nicht kann?

    Das ist erst einmal zum Test gedacht, weil dort z.B. einige Schalter bei sind, die mein Interesse geweckt haben.

    So z.B.mp.appendChild(this.createME('menuitem', 'D: Ordner Software leeren', 'ECM.open(4, "D:\\\\Software\\\\löschen.ps1")', '', 0));

    Ein Klick auf D: Ordner Software leeren, und der Inhalt des Ordners Software auf D: wird gelöscht, usw.

    Zitat von 2002Andreas

    Wenn ich das so ändere, also 230 aktivieren..231 deaktivieren.

    Hier leider nicht, wieso auch immer.

    Nun hat BrokenHeart mir wohl gezeigt, warum es nicht funktioniert.

    Zitat von BrokenHeart

    Du hast den Pfad zu deinem notepad++ Editor in den Parameter eingetragen, der für den Namen des Eintrags in deinen Voreinstellungen vorgesehen ist. Die Bibliotheksfunktion sucht also in den Prefs nach einem Eintrag C:\\notepad++\\notepad++.exe und findet natürlich nichts. Du musst also den Eintrag 'view_source.editor.path' über about:config oder in der user.js mit dem gewünschten Pfad überschreiben oder du erzeugst einfach einen neuen Eintrag mit dem Pfad auf den notepad++ Editor.

    Danke für den Hinweis, da werde ich mich morgen mit befassen. :thumbup:

  • ExtrasConfigMenuPlus.uc.js anpassen

    • FuchsFan
    • 24. Oktober 2025 um 19:06

    Das originale Script ist hier zu finden:

    ExtrasConfigMenuPlus.uc.js (ExtrasConfigMenuPlus.uc.js) ダウンロード | firefox用スクリプトアップローダー | uploader.jp
    修正
    u6.getuploader.com

    Ich habe eine Übersetzung versucht, damit wenigstens ein kleiner Überblick vorhanden ist. Es wird in dem Script auch erklärt was beim Einsatz eines eigenen Editors zu machen ist. Das habe ich in Zeile 231 eingetragen, aber beim Aufruf einer Datei (z.B. user,js) passiert nichts. Was habe ich nicht beachtet, bitte helfen?

    JavaScript
    // ==UserScript==
    // @name                ExtrasConfigMenuPlus.uc.js
    // @include             main
    // @charset             UTF-8
    // @note                extras_config_menu.uc.js / Funktionsreduktion von +α
    // @note                Klicken Sie mit der rechten Maustaste auf die Schaltfläche, um neu zu starten, und klicken Sie mit der 
    //                      mittleren  Maustaste, um about:config zu öffnen
    // @note                Der Code zum Aktivieren/Deaktivieren des Skripts wurde von rebuild_userChrome.uc.js von alice0775 ausgeliehen.
    // @version             2.0.13 Fx143+ 
    // @version             2.0.12 Fx142+ 
    // @version             2.0.11 Fx139+ / Weitere Korrekturen Erläuterung hinzugefügt
    // @version             2.0.10 Fx136+
    // @version             2.0.9  toggle / Unterstützt das Umschalten ganzzahliger Werte zwischen 0 und 1 mit Funktionen
    // @version             2.0.8  Fx115+
    // @version             2.0.7  Entwicklungsmenü
    // @version             2.0.6  Es wurde ein Problem behoben, bei dem „Neustart“ per Rechtsklick auf die Schaltfläche nicht funktionierte.
    // @version             2.0.5  Fx72beta
    // ==/UserScript==
    
    
    /*
    ■ createME Über Funktionen
    
    createME('Menütyp', 'Anzeigeetikett', 'Ausführbare Befehle und Funktionen', 'Name zur Angabe des Symbols', 'ID'));
    
    Der Name zur Angabe des Symbols kann beliebig sein, muss aber innerhalb der setIcon-Funktion übereinstimmen.
    Sie können die Entsprechung erkennen, indem Sie sich das Standardbeispielmenü und die Funktion setIcon ansehen.
    Wenn nicht angegeben, wird das Standard-Favicon angezeigt.
    
    ■ edit & open Über Funktionen
    
    Use the 'edit' function to edit files
    Use the 'open' function to open a file or folder
    Verwenden Sie die Funktion „Umschalten“, um zwischen wahren und falschen Werten zu wechseln (das Umschalten zwischen ganzzahligen Werten von 0 und 1 wird ebenfalls unterstützt).
    
    Das erste Argument jeder Funktion gibt den Basisordner an.
      0 = chrome
      1 = profile
      2 = C:\WINDOWS
      3 = C:\Program Files  oder C:\Program Files (x86)
      4 = Beim Schreiben des vollständigen Pfads im zweiten Argument *Setzen Sie das Pfadtrennzeichen auf \\\\
     'C' = Laufwerk C
     'D' = Laufwerk D
    
    Das zweite Argument gibt den Datei- oder Ordnernamen im im ersten Argument angegebenen Basisordner an.
    Vergessen Sie nicht, es in [] und den Dateinamen (Ordner) in '' einzuschließen.
    
    ■ Beispiel für die Bearbeitung von prefs.js im Profilordner
      ECM.edit(1, ['prefs.js'])
    
    ■ Beispiel für das Öffnen des Chrome-Ordners
      ECM.open(0)
    
    ■ Beispiel für den Start von Firefox (der dritte Argumentparameter kann weggelassen werden)
      ECM.open(3, ['Mozilla Firefox', 'firefox.exe'], '-no-remote')
    
    ■ Beispiel für die Aktivierung/Deaktivierung von Javascript
      ECM.toggle('javascript.enabled')
    
    
    ■ Informationen zum Ein-/Ausschalten und Bearbeiten des Userchrome-Skripts
      Klicken Sie mit der mittleren Maustaste auf ein Skript, um es zu aktivieren oder zu deaktivieren
      Bearbeiten Sie das Skript, indem Sie mit der rechten Maustaste klicken
    
    */
    
    
    (function () {
    
      'use strict'
    
      const { Preferences } = ChromeUtils.importESModule('resource://gre/modules/Preferences.sys.mjs');
    
      window.ECM = {
    
        editor: 1,
        // 1 = Editor in view_source.editor.path festgelegt
        // Wenn Sie den vollständigen Pfad zu einem Editor angeben, wird dieser Editor verwendet. *Schließen Sie den Pfad in '' ein und ersetzen Sie \ durch \\.
    
        itemLength: null,
    
        init: function () {
          try {
            CustomizableUI.createWidget({
              id: 'ExtrasConfigMenu',
              type: 'custom',
              onBuild: function(aDocument) {
                const toolbaritem = aDocument.createXULElement('toolbarbutton');
                const attributes = {
                  id: 'ExtrasConfigMenu',
                  class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                  type: 'menu',
                  label: 'Extras Config Menu',
                  image: '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=',
                  tooltiptext: 'Extras Config Menu',
                  oncontextmenu: 'return false'
                };
                for (var a in attributes) {
                  toolbaritem.setAttribute(a, attributes[a]);
                };
                return toolbaritem;
              },
              onCreated: function(toolbaritem) {
              }
            });
          } catch (e) {};
            wait();
            ECM.init2();
          this.addPrefListener(ECM.readLaterPrefListener);
          window.addEventListener('unload', this, false);
          
          let sb = window.userChrome_js?.sb;
                if (!sb) {
                    sb = Cu.Sandbox(window, {
                        sandboxPrototype: window,
                        sameZoneAs: window,
                    });
                    Cu.evalInSandbox(`
                        Function.prototype.toSource = window.Function.prototype.toSource;
                        Object.defineProperty(Function.prototype, 'toSource', {enumerable : false})
                        Object.prototype.toSource = window.Object.prototype.toSource;
                        Object.defineProperty(Object.prototype, 'toSource', {enumerable : false})
                        Array.prototype.toSource = window.Array.prototype.toSource;
                        Object.defineProperty(Array.prototype, 'toSource', {enumerable : false})
                    `, sb);
                    
                    window.addEventListener('unload', () => {
                        setTimeout(() => {
                            Cu.nukeSandbox(sb);
                        }, 0);
                    }, { once: true });
                }
                this.sb = sb;
        },
    
        init2: function (btn) {
          var btn = $('ExtrasConfigMenu');
          if (!btn) {
            wait();
            ECM.init2();
          }
          btn.addEventListener('click', (event) => ECM.onClick(event));
          const mp = btn.appendChild(this.createME('menupopup', 0, 0, 0, 'ecm-popup'));
          mp.addEventListener('click', (event) => { event.preventDefault(); event.stopPropagation(); });
          mp.addEventListener('popupshowing', (event) => ECM.onpopup(event));
          
          
          
          /* ==================== Von hier aus eingestellt ==================== */
    
          //Menü „Werkzeuge“.
          mp.appendChild($('tools-menu'));
          //Browser-Tools
          mp.appendChild($('browserToolsMenu'));
    
    
          //Freier Browserspeicher
          mp.appendChild(this.createME('menuitem', 'Speicher löschen', () => {
            const os = Services.obs;
            const gMgr = Cc['@mozilla.org/memory-reporter-manager;1'].getService(Ci.nsIMemoryReporterManager);
            const parentWindow = Services.wm.getMostRecentWindow('navigator:browser');
            os.notifyObservers(null, 'child-gc-request', null);
            Cu.forceGC();
            os.notifyObservers(null, 'child-cc-request', null);
            parentWindow.windowUtils.cycleCollect();
            os.notifyObservers(null, 'child-mmu-request', null);
            gMgr.minimizeMemoryUsage(() => '');
          }));
    
          mp.appendChild(this.createME('menuitem', 'D: Ordner Software leeren', 'ECM.open(4, "D:\\\\Software\\\\löschen.ps1")', '', 0));
          mp.appendChild(document.createXULElement('menuseparator'));
          
          //Passwort-Manager
          mp.appendChild(this.createME('menuitem', 'Passwort-Manager', 'openTrustedLinkIn("about:logins", "tab");', 'password', 0));
          
          mp.appendChild(document.createXULElement('menuseparator'));
          mp.appendChild(this.createME('menuitem', 'Javascript On/Off', 'ECM.toggle("javascript.enabled")', 'pref', 0));
          mp.appendChild(this.createME('menuitem', 'Standortintelligenz On/Off', 'ECM.toggle("geo.enabled")', 'pref', 0));
          mp.appendChild(this.createME('menuitem', 'Geben Sie den auf der Webseite angegebenen Schriftarten Vorrang', 'ECM.toggle("browser.display.use_document_fonts")', 'pref', 0));
    
          mp.appendChild(document.createXULElement('menuseparator'));
          mp.appendChild(this.createME('menuitem', 'userChrome.css', 'ECM.edit(0, ["userChrome.css"])', 'edit', 0));
          mp.appendChild(this.createME('menuitem', 'userContent.css', 'ECM.edit(0, ["userContent.css"])', 'edit', 0));
          
          mp.appendChild(document.createXULElement('menuseparator'));
          mp.appendChild(this.createME('menuitem', 'prefs.js', 'ECM.edit(1, ["prefs.js"])', 'js', 0));
          mp.appendChild(this.createME('menuitem', 'user.js', 'ECM.edit(1, ["user.js"])', 'js', 0));
          mp.appendChild(this.createME('menuitem', '_keychanger.js', 'ECM.edit(0, ["_keychanger.js"])', 'edit', 0));
          
          mp.appendChild(document.createXULElement('menuseparator'));
          mp.appendChild(this.createME('menuitem', 'Ordner chrome', 'ECM.open(0)', 'folder', 0));
          mp.appendChild(this.createME('menuitem', 'Profilordner', 'ECM.open(1)', 'folder', 0));
    
          mp.appendChild(this.createME('menuitem', 'Ordner Scripte', 'ECM.open(0, ["Scripte"])', 'folder', 0));
          mp.appendChild(this.createME('menuitem', 'Ordner CSS', 'ECM.open(0, ["CSS"])', 'folder', 0));
          //mp.appendChild(this.createME('menuitem', 'UserScriptLoader', 'ECM.open(0, ["UserScriptLoader"])', 'folder', 0));
          mp.appendChild(this.createME('menuitem', 'Installationsordner', 'ECM.open(3, ["Mozilla Firefox"])', 'folder', 0));
    
          mp.appendChild(document.createXULElement('menuseparator'));
          mp.appendChild(this.createME('menuitem', 'Firefox Update-Bestätigung', 'openAboutDialog();', 'info', 0));
    
          /* ==================== Bisherige Einstellungen ==================== */
    
    
          this.itemLength = mp.childNodes.length;
        },
    
        handleEvent: function (event) {
          if (event.type === 'unload') {
            window.removeEventListener('unload', this, false);
            this.removePrefListener(ECM.readLaterPrefListener);
            this.itemLength = null;
          }
        },
    
        onClick: function (event) {
          if (event.button === 1) {
            gBrowser.selectedTab = gBrowser.addTrustedTab('about:config');
          } else if (event.button === 2) {
            event.preventDefault();
            Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);
          } else {
            return;
          }
        },
    
        edit: function (key, pathArray) {
          const path = this.getPath(key, pathArray);
          if (this.editor === 1) {
    		//this.launch(Services.prefs.getCharPref('view_source.editor.path'), path);
            this.launch(Services.prefs.getCharPref('C:\\notepad++\\notepad++.exe'), path);
    		} else {
            this.launch(this.editor, path);
          }
        },
    
        open: function (key, pathArray, arg) {
          const path = this.getPath(key, pathArray);
          this.launch(path, arg);
        },
    
        launch: function (path, arg) {
          arg = [arg] || [];
    
          const file = new FileUtils.File(path);
          if (!file.exists()) {
            return;
          }
    
          if (!file.isDirectory()) {
            const process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
            process.init(file);
            process.run(false, arg, arg.length);
          } else {
            file.reveal();
          }
        },
    
        getDir: function (key, pathArray) {
          let dir;
          if (key.indexOf('\\') !== -1) {
            dir = new FileUtils.File(key);
          } else {
            dir = Services.dirsvc.get(key, Ci.nsIFile);
          }
          if (pathArray != null) {
            for (let i = 0, len = pathArray.length; i < len; ++i) {
              dir.append(pathArray[i]);
            }
          }
          return dir.path;
        },
    
        getPath: function (key, pathArray) {
          pathArray = pathArray || [];
          let path = '';
          switch (key) {
          case 0:
            path = this.getDir('UChrm', pathArray);
            break;
          case 1:
            path = this.getDir('ProfD', pathArray);
            break;
          case 2:
            path = this.getDir('WinD', pathArray);
            break;
          case 3:
            path = this.getDir('ProgF', pathArray);
            break;
          case 4:
            path = pathArray;
            break;
          case 'C':
            path = this.getDir('C:\\', pathArray);
            break;
          case 'D':
            path = this.getDir('D:\\', pathArray);
            break;
          }
          return path;
        },
    
        toggle: function (prefName) {
          var pref = Preferences.get(prefName);
          var prefType = Services.prefs.getPrefType(prefName);
          if (prefType === Ci.nsIPrefBranch.PREF_BOOL) {
            Preferences.set(prefName, !pref);
          } else if (prefType === Ci.nsIPrefBranch.PREF_INT) {
            Preferences.set(prefName, (pref == 1) ? 0 : 1);
          }
        },
    
        onpopup: function (event) {
          var mp = event.target;
          if (mp !== event.currentTarget) {
            return;
          }
          for (let i = this.itemLength, len = mp.childNodes.length; i < len; i++) {
            mp.removeChild(mp.lastChild);
          }
    
          var sep = document.createXULElement('menuseparator');
          mp.appendChild(sep);
    
          for (let j = 0, lenj = userChrome_js.arrSubdir.length; j < lenj; j++) {
            var dirName = (userChrome_js.arrSubdir[j] == '') ? 'root' : userChrome_js.arrSubdir[j];
            var flg = false;
            for (var i = 0, len = userChrome_js.scripts.length; i < len; i++) {
              var script = userChrome_js.scripts[i];
              if (script.dir !== dirName) continue;
              flg = true;
              break;
            }
    
            if (!flg) continue;
    
            var menu = mp.appendChild(document.createXULElement('menu'));
            menu.setAttribute('label', 'chrome/' + (dirName == 'root' ? '' : dirName));
            menu.dirName = dirName;
    
            var mp = menu.appendChild(document.createXULElement('menupopup'));
    //        mp.addEventListener('click', event => {event.stopPropagation();});
    
            var flg = false;
            for (let i = 0, len = userChrome_js.scripts.length; i < len; i++) {
              var script = userChrome_js.scripts[i];
              if (script.dir != dirName) continue;
              flg = true;
              var mi = mp.appendChild(document.createXULElement('menuitem'));
              mi.setAttribute('label', script.filename.replace(/\.uc\.js$|\.uc\.xul$/g, ''));
              mi.setAttribute('closemenu', 'none');
              mi.setAttribute('type', 'checkbox');
              mi.setAttribute('autocheck','false');
              mi.setAttribute('checked', !userChrome_js.scriptDisable[script.filename]);
              if (script.description) {
                mi.setAttribute('tooltiptext', script.description);
              }
              mi.script = script;
              mi.addEventListener('command', () => ECM.chgScriptStat(this.script.filename));
              mi.addEventListener('click', (event) => ECM.clickScriptMenu(event));
              mi.addEventListener('mouseup', (event) => {if (event.button == 1) event.preventDefault()});
            }
            mp = event.target;
          }
        },
    
        clickScriptMenu: function (event) {
          var target = event.target;
          var script = target.script;
          var fileURL = Services.io.getProtocolHandler('file').QueryInterface(Ci.nsIFileProtocolHandler).getFileFromURLSpec(script.url);
          if (event.button === 1) {
            event.stopPropagation();
            event.preventDefault();
            ECM.chgScriptStat(script.filename);
            target.setAttribute('checked', !userChrome_js.scriptDisable[script.filename]);
          } else if (event.button === 2) {
            event.stopPropagation();
            event.preventDefault();
            this.edit(4, fileURL.path);
          } else { return; }
        },
    
        chgScriptStat: function (afilename) {
          var s = ECM.getPref('userChrome.disable.script', 'str', '');
          if (!userChrome_js.scriptDisable[afilename]) {
            s = (s + ',').replace(afilename + ',', '') + afilename + ',';
          } else {
            s = (s + ',').replace(afilename + ',', '');
          }
          s = s.replace(/,,/g, ',').replace(/^,/, '');
          ECM.setPref('userChrome.disable.script', 'str', s);
          userChrome_js.scriptDisable = this.restoreState(s.split(','));
        },
    
        restoreState: function (arr) {
          var disable = [];
          for (var i = 0, len = arr.length; i < len; i++) {
            disable[arr[i]] = true;
          }
          return disable;
        },
    
        getPref: function(aPrefString, aPrefType, aDefault){
          var xpPref = Services.prefs;
          try {
            switch (aPrefType){
              case 'complex':
                return xpPref.getComplexValue(aPrefString, Ci.nsIFile); break;
              case 'str':
                return unescape(xpPref.getCharPref(aPrefString).toString()); break;
              case 'int':
                return xpPref.getIntPref(aPrefString); break;
              case 'bool':
              default:
                return xpPref.getBoolPref(aPrefString); break;
            }
            } catch(e) {}
          return aDefault;
        },
    
        setPref: function(aPrefString, aPrefType, aValue){
          var xpPref = Services.prefs;
          try {
            switch (aPrefType){
              case 'complex':
                return xpPref.setComplexValue(aPrefString, Components.interfaces.nsIFile, aValue); break;
              case 'str':
                return xpPref.setCharPref(aPrefString, escape(aValue)); break;
              case 'int':
                aValue = parseInt(aValue);
                return xpPref.setIntPref(aPrefString, aValue);  break;
              case 'bool':
              default:
                return xpPref.setBoolPref(aPrefString, aValue); break;
            }
            } catch(e) {}
          return null;
        },
    
        addPrefListener: function (aObserver) {
          try {
            let pbi = Services.prefs;
              pbi.addObserver(aObserver.domain, aObserver, false);
          } catch(e) {}
        },
    
        removePrefListener: function (aObserver) {
          try {
              let pbi =  Services.prefs;
              pbi.removeObserver(aObserver.domain, aObserver);
          } catch(e) {}
        },
    
        readLaterPrefListener: {
          domain: 'userChrome.disable',
          observe: function (aSubject, aTopic, aPrefstring) {
            if (aTopic === 'nsPref:changed') {
              setTimeout(() => {
                let s = ECM.getPref('userChrome.disable.script', 'str', s);
                userChrome_js.scriptDisable = ECM.restoreState(s.split(','));
              }, 0);
            }
          }
        },
    
        setIcon: function(type) {
            let icon = '';
            switch (type) {
                case 'edit':
                    icon = 'chrome://global/skin/icons/edit.svg';
                    break;
                case 'folder':
                    icon = 'chrome://global/skin/icons/folder.svg';
                    break;
                case 'password':
                    icon = 'chrome://browser/skin/login.svg';
                    break;t
                case 'pref':
                    icon = 'chrome://global/skin/icons/settings.svg';
                    break;
                case 'info':
                    icon = 'chrome://global/skin/icons/info.svg';
                    break;
                case 'js':
                    icon = 'moz-icon://.js?size=16';
                    break;
                case 'bat':
                    icon = 'moz-icon://.bat?size=16';
                    break;
                case 'vbs':
                    icon = 'moz-icon://.vbs?size=16';
                    break;
                default:
                    icon = 'chrome://global/skin/icons/defaultFavicon.svg';
                    break;
           }
           return icon;
        },
        
        
        createME: function(sTyp, sLabel, sCommand, sImage, sId) {
            const ele = document.createXULElement(sTyp);
            switch (sTyp) {
                case 'menuitem':
                    ele.setAttribute('label', sLabel);
                    ele.setAttribute('class', 'menuitem-iconic');
                    ele.setAttribute('image', encodeURI(this.setIcon(sImage)));
                    const func = typeof sCommand === 'string' ? (() => {
                        if (sCommand.trim().startsWith('function')) {
                            return '(' + sCommand + ').call(this, event)';
                        }
                        return sCommand;
                    })() : '(' + sCommand.toString() + ').call(this, event)';
                    ele.addEventListener('command', (event) => { Cu.evalInSandbox(func, ECM.sb); }, false);
    //                if (sClass) ele.classList.add(sClass);
                    break;
                case 'menu':
                    ele.setAttribute('label', sLabel);
                    ele.setAttribute('id', sId);
                    break;
                case 'menupopup':
                    ele.setAttribute('id', sId);
                    break;
            }
            return ele;
        }
    
      };
    window.ECM.init();
    
      function $(id) {
        let ele = {};
        if (ele[id] == null) {
          ele[id] = document.getElementById(id);
        }
        return ele[id];
      }
    
      function wait() {
        let start = new Date();
        new Date() - start < 1000;
      }
      
    }());
    Alles anzeigen
  • Eigene Zusatzleisten ab ff 143+

    • FuchsFan
    • 17. Oktober 2025 um 21:59
    Zitat von Horstmann

    Version 10/ Fix:

    :thumbup::)

  • Eigene Zusatzleisten ab ff 143+

    • FuchsFan
    • 17. Oktober 2025 um 12:05

    Horstmann

    Nur als Hinweis, stelle ich in Zeile 72 auf true, so bleibt beim Ausblenden die Leiste wieder sichtbar (Thema hatten wir schon).

  • Eigene Zusatzleisten ab ff 143+

    • FuchsFan
    • 12. Oktober 2025 um 21:58
    Zitat von Horstmann

    Das Problem ist, der Hintergrund wird bei diesem Theme gekachelt,

    Stimmt, das habe ich mal mit unterschiedlichen Themes getestet, sind immer einige dabei. Den Code werde ich mal probieren, obwohl es für mich uninteressant ist, weil die Themes, die ich nutze (sind nur ganz wenige), keine Probleme bereiten.

    Ich bedanke mich trotzdem für deinen Einsatz in dieser Sache. :thumbup:

  • Eigene Zusatzleisten ab ff 143+

    • FuchsFan
    • 12. Oktober 2025 um 19:03
    Zitat von Horstmann

    Also besser nicht beides benutzen.

    Wird befolgt!

    Letzte Version macht mit den Themes hier keine Probleme mehr, als Beispiel Clouds (bisher schwarze Leiste), jetzt voll übernommen. Prima! :thumbup:

Unterstütze uns!

Jährlich (2025)

105,8 %

105,8% (687,41 von 650 EUR)

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