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

Beiträge von BrokenHeart

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 11. Januar 2025 um 22:53
    Zitat von FuchsFan

    Erst einmal meinen Dank, dass Du dich der Sache angenommen hast. :thumbup:

    Zitat von 2002Andreas

    Also auf die Schnelle...perfekt..hier funktioniert alles damit bis jetzt :) :thumbup:

    Ganz herzlichen Dank dafür...mein wichtigstes Skript ist das.

    Gerne :). Ich glaube ihr beide seid die einzigen, die dieses Skript nutzen (mag mich natürlich irren) ^^.

    Hier übrigens die Version des Skripts die keine Sicherheits-Richtlinie mehr verletzt. Bei mir erscheinen nur noch eine zu ignorierende Start-Fehlermeldung und ein "FILE_NOT_FOUND" Fehler. Diese Fehler müssten aber eigentlich auch schon vorher existiert haben.

    CSS: extras_config_menu.uc.js
    // ==UserScript==
    // @name           extras_config_menu.uc.js
    // @compatibility  Firefox 5*.*
    // @include        main
    // @version        1.0.20190504
    // @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'
    // ==/UserScript==
    
    var uProfMenu = {
      // Beginn der Konfiguration
      // In der folgenden Zeile (11) den Pfad zum Texteditor eintragen (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\\Notepad++\\notepad++.exe',
      // Falls gewuenscht, in Zeile 15 einen 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 (19) 'menu' eintragen, damit es unter "Extras" als Menue erscheint, sonst die id des gewuenschten
      // Elements *nach* dem der Button erscheinen soll (z.B. 'urlbar', 'searchbar', 'undoclosetab-button','abp-toolbarbutton')
      // Bitte nicht so etwas wie die Menue- oder Navigationsleiste (sondern einen Menuepunkt oder einen Button mit id auf diesen Leisten) eintragen:
     warpmenuto: 'helpMenu',
     // 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
      // Einbindung GM-Skripte-Ordner (0: nein, 1: Greasemonkey [Profil-Verzeichnis], 2: UserScriptLoader [Chrome-Verzeichnis], 3: Scriptish [Profil-Verzeichnis]):
      gmOrdner: 0,
      // Einbindung CSS-Ordner (0: nein, 1: UserCSSLoader-Ordner im Chrome-Verzeichnis):
      cssOrdner: 0,
      // In Zeile 30 gueltige about:Adressen eintragen, die ebenfalls aufgerufen werden sollen.
      // - Zum Ausblenden: abouts: [],
      // - Damit die about:-Seiten nicht als Untermenue, sondern direkt als Menuepunkte aufgefuehrt werden, muss das erste Element '0' sein:
      // abouts: ['0','about:about','about:addons','about:cache','about:config','about:support'],
      abouts: ['about:about','about:debugging#/runtime/this-firefox','about:cache','about:config','about:crashes','about:downloads','about:home','about:logins','about:memory','about:support','about:preferences','about:performance','about:profiles'],
      // Die normalen Firefox-Einstellungen auch zur Verfuegung stellen (0: nein, 1: ja):
      showNormalPrefs: 0,
      // Stellt "Skriptliste in Zwischenablage" zur Verfuegung (1: ja, 2: mit getrennter Nummerierung, 3: mit gemeinsamer Nummerierung) oder nicht (0):
      enableScriptsToClip: 1,
      // Um den Eintrag "Neustart" zu erzwingen (falls z.B. das andere Skript zu spaet eingebunden und nicht erkannt wird), auf 1 setzen:
      enableRestart: 0,
      // Ende der Konfiguration
    
      init: function() {
        if (this.warpmenuto.toLowerCase() == 'menu') {
          // aufgrund des gewaehlten warpmenuto als Untermenue von Extras anlegen
          var zielmenu = document.getElementById('menu_ToolsPopup');
          if (zielmenu==null) {
            userChrome.log("extras_config_menu.uc.js findet Zielmenue nicht, evtl. weil ein anderes Fenster als das Hauptfenster " +
                           "geoeffnet wurde. Falls dieser Fehler auch im Hauptfenster auftritt, bitte die vorgehende Definition " +
                           "von 'zielmenu' kontrollieren.");
           return
          }
          var menu = zielmenu.appendChild(this.createME("menu","Config Men\u00FC",0,0,"ExtraConfigMenu"));
          menu.setAttribute("class","menu-iconic");
          menu.setAttribute("ondblclick","openTrustedLinkIn('about:config', 'tab');");
         } else {
    		 
    	/*	 
          // als Button nach dem per warpmenuto gewaehlten Element anlegen (s. Kommentar ueber warpmenuto im Konfigurationsabschnitt)
          var zielmenu = document.getElementById(this.warpmenuto);
          if (zielmenu==null) {
            userChrome.log("extras_config_menu.uc.js findet Zielpunkt '"+this.warpmenuto+"' nicht, evtl. weil ein anderes Fenster als das Hauptfenster " +
                           "geoeffnet wurde. Falls dieser Fehler auch im Hauptfenster auftritt, bitte die vorgehende Definition " +
                           "von 'warpmenuto' kontrollieren.");
            return;
          }
          var menu = zielmenu.parentNode.insertBefore(document.createXULElement('toolbarbutton'), zielmenu.nextSibling);
          menu.setAttribute("id", "ExtraConfigMenu-button");
          menu.setAttribute("class", "toolbarbutton-1");
          menu.setAttribute("type", "menu");
          menu.setAttribute("tooltiptext", "Extra Config Menü\nMittelklick \öffnet about:config");
          menu.setAttribute("onclick", "if (event.button === 2 && !this.open) {openTrustedLinkIn('about:config','tab')};");
        }
    	*/
    	
    	 // 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"
            });
    		
          }
          var menu = document.getElementById("ExtraConfigMenu-button");
          menu.setAttribute("type", "menu");
    	  menu.addEventListener('click', function(event) {
    			if (event.button == 2 && !this.open) { 
    				openTrustedLinkIn("about:config", "tab");
    				event.preventDefault();
    			};
    	 },true);
    	  
        }
    	
        //ab hier ist alles gleich, egal ob Button oder Menue
        var css = " \
          #ExtraConfigMenu, #ExtraConfigMenu-button { \
            list-style-image: url(file:///C:/Users/weiss/IconsFirefox/pencil.svg);  \
    		 margin-top: 0px !important; \
    		 opacity: 1 !important;\
          } \
          #ExtraConfigMenu-button > dropmarker, #ExtraConfigMenu-button > hbox > .toolbarbutton-menu-dropmarker { \
            display: none !important; \
          }";
        var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
        var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(css));
        sss.loadAndRegisterSheet(uri,sss.AGENT_SHEET);
    	menu.addEventListener('popupshowing', function(event) {
    			uProfMenu.getScripts(0);
    			uProfMenu.getCss(3);
    			uProfMenu.getCss(4);
    			uProfMenu.getCss(5);
    	 },true);
    	
        var menupopup = menu.appendChild(this.createME("menupopup",0,0,0,"ExtraConfigMenu-popup"));
        // Anlegen von Untermenues fuer userChromeJS-Skripte und CSS-Dateien (befuellen spaeter)
        var submenu = menupopup.appendChild(this.createME("menu","Meine Scripte",0,0,"submenu-ucjs"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-ucjs-items"));
        // var submenu = menupopup.appendChild(this.createME("menu","uc.xul",0,0,"submenu-ucxul"));
        // var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-ucxul-items"));
        var submenu = menupopup.appendChild(this.createME("menu","css",0,0,"submenu-css"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-css-items"));
    	var submenu = menupopup.appendChild(this.createME("menu","CSSShadow",0,0,"submenu-CSSShadow"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-CSSShadow-items"));
        var submenu = menupopup.appendChild(this.createME("menu","cssweb",0,0,"submenu-cssweb"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-cssweb-items"));
        if (this.enableScriptsToClip) menupopup.appendChild(this.createME("menuitem","Skriptliste in Zwischenablage","uProfMenu.getScripts(1)","uProfMenu_clipboard",0));
        // Ende Anlegen von Untermenues
        menupopup.appendChild(document.createXULElement('menuseparator'));
        // Einbindung von Konfigdateien
     	menupopup.appendChild(this.createME("menuitem","Bild Url","uProfMenu.edit(0,'Bild Url.css');","uProfMenu_edit",0));
    	menupopup.appendChild(this.createME("menuitem","config Einträge.css","uProfMenu.edit(0,'config Einträge.css');","uProfMenu_edit",0));
    	/*menupopup.appendChild(this.createME("menuitem","Forum.css","uProfMenu.edit(0,'./CSSWeb/Forum.css');","uProfMenu_edit",0)); */
        menupopup.appendChild(this.createME("menuitem","userChrome.css","uProfMenu.edit(0,'userChrome.css');","uProfMenu_edit",0));
    	menupopup.appendChild(this.createME("menuitem","userChromeShadow.css","uProfMenu.edit(0,'userChromeShadow.css');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","userContent.css","uProfMenu.edit(0,'userContent.css');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","userChrome.js","uProfMenu.edit(0,'userChrome.js');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","prefs.js","uProfMenu.edit(1,'prefs.js');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","user.js","uProfMenu.edit(1,'user.js');","uProfMenu_edit"),0);
    
        // Ende Einbindung von Konfigdateien
        menupopup.appendChild(document.createXULElement('menuseparator'));
        // Einbindung von Ordnern
        switch (this.gmOrdner) {
          case 1:
            menupopup.appendChild(this.createME("menuitem","GM-skripty","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'gm_scripts');","uProfMenu_folder"),0);
            break;
          case 2:
            menupopup.appendChild(this.createME("menuitem","USL-skripty","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'UserScriptLoader');","uProfMenu_folder"),0);
            break;
          case 3:
            menupopup.appendChild(this.createME("menuitem","Skripty Scriptish","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'scriptish_scripts');","uProfMenu_folder"),0);
            break;
        }
    
        menupopup.appendChild(this.createME("menuitem","CSS-Ordner ","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'css');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","CSSShadow-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'CSSShadow');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","CSSWeb-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'CSSWeb');","uProfMenu_folder"),0);
    	 menupopup.appendChild(this.createME("menuitem","Chromeordner","uProfMenu.prefDirOpen('UChrm');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Profilordner","uProfMenu.prefDirOpen('ProfD');","uProfMenu_folder"),0);
    	    menupopup.appendChild(this.createME("menuitem","Icons-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'Icons');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Installationsordner","uProfMenu.prefDirOpen('CurProcD');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Addonordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'extensions');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Startup-Cacheordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfLD')+uProfMenu.getDirSep()+'startupCache');","uProfMenu_folder"),0);
      /*   menupopup.appendChild(this.createME("menuitem","Ordner about","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'about');","uProfMenu_folder"),0); */
        // Ende Einbindung von Ordnern
        // 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++) {
            menupopup.appendChild(this.createME("menuitem",this.abouts[i],"openTrustedLinkIn('"+this.abouts[i]+"','tab')","uProfMenu_about"),0);
            }
           } else {
            // der erste Eintrag des arrays ist ungleich '0', deshalb als Untermenue einrichten
            var submenu = menupopup.appendChild(this.createME("menu","uc.js",0,0,"submenu-about"));
            var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,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
        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","try{openOptionsDialog();}catch(e){openPreferences();}","uProfMenu_prefs"),0);
        // Falls addRestartButton installiert ist, Neustart zur Verfuegung stellen (addRestartButton 1.0.20120105mod erforderlich)
        if(typeof(ToolRstartMod) != "undefined" || this.enableRestart) menupopup.appendChild(this.createME("menuitem","Neustart",
        "try{ToolRstartMod.restartApp(false);} catch(e){alert(e);}","uProfMenu_restart"),0);
      },
    
      getDirSep:function() {
        // Betriebssystem nach https://developer.mozilla.org/en/Code_snippets/Miscellaneous ermitteln
        var osString = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS;
        var dirsep = "/";
        switch(osString) {
          case "WINNT":
            dirsep = "\\";
            break;
          case "Linux":
            dirsep = "/";
            break;
          case "Darwin":
            dirsep = "/";
            break;
        }
        return dirsep;
      },
    
      edit:function(OpenMode,Filename){
        var Path = "";
        var dSep = this.getDirSep();  // die Trennzeichen zwischen Ordnern abhaengig vom Betriebssystem machen
        switch (OpenMode){
          //Current is Chrome Directory
          case 0:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename;
            break;
          //Current is Profile Directory
          case 1:
            var Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename;
            break;
          //Current is Root
          case 2:
            var Path = Filename;
            break;
          //Current is CSS folder
          case 3:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSS" + dSep + Filename;
            break;
          //Current is CSSWeb folder
          case 4:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSWeb" + dSep + Filename;
            break;
    		//Current is CSSShadow folder
          case 5:
            var 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){
        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();
        a = a.replace(/ä/g,"a");
        a = a.replace(/ö/g,"o");
        a = a.replace(/ü/g,"u");
        a = a.replace(/ß/g,"s");
        b = b.toLowerCase();
        b = b.replace(/ä/g,"a");
        b = b.replace(/ö/g,"o");
        b = b.replace(/ü/g,"u");
        b = b.replace(/ß/g,"s");
        return(a==b)?0:(a>b)?1:-1;
      },
    
      getScripts:function(iType) {
        // Arrays (jeweils ein Array fuer uc.js und uc.xul) nehmen Namen der gefundenen Skripte auf
        let ucJsScripts = [];
        let ucXulScripts = [];
        // Suchmuster, also die Dateierweiterungen uc.js und uc.xul
        let extjs = /\.uc\.js$/i;
        //let extxul = /\.uc\.xul$/i;
        let aFolder = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
        aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path);
        // files mit Eintraegen im Chrome-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);
          // keine gewuenschte Datei, deshalb continue
          //if (!extjs.test(file.leafName) && !extxul.test(file.leafName)) continue;
          // uc.js gefunden -> im Array ablegen
          if (extjs.test(file.leafName)) ucJsScripts.push(file.leafName);
          // uc.xul gefunden -> im Array ablegen
          //if (extxul.test(file.leafName)) ucXulScripts.push(file.leafName);
        }
        if (this.sortScripts) {
          ucJsScripts.sort(this.stringComparison);
          //ucXulScripts.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);
          //this.fillMenu("submenu-ucxul","submenu-ucxul-items", "uc.xul",ucXulScripts,"uProfMenu_ucxul",0);
         } else {
          var result = this.fillClipboardValue(ucJsScripts,ucXulScripts);
          Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(result);
        }
      },
    
      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: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);
        }
        // Untermenue endlich befuellen
        for (var i = scriptArray.length-1; i > -1; i--) {
          // Typunterscheidung (userChromeJS-Skript oder about: oder css)
          if (sTyp==0){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(0,'"+scriptArray[i]+"')",sClass,0);
    		mitem.addEventListener('click', function(event) {
    			uProfMenu.openAtGithub(event,'"+scriptArray[i]+"');
    			event.preventDefault();
    		},true);
    		
            mitem.setAttribute("tooltiptext"," Linksklick: Bearbeiten,\n Mittelklick: https://github.com/.../"+this.cleanFileName(scriptArray[i])+" oeffnen,\n Rechtsklick: Suche auf GitHub");
           } else if (sTyp==1){
            var mitem = this.createME("menuitem",scriptArray[i],"openTrustedLinkIn('"+scriptArray[i]+"','tab')",sClass,0);
           } else if (sTyp==3){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(3,'"+scriptArray[i]+"')",sClass,0);
           } else if (sTyp==4){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(4,'"+scriptArray[i]+"')",sClass,0);
          }
    	  else if (sTyp==5){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(5,'"+scriptArray[i]+"')",sClass,0);
          }
          popup.insertBefore(mitem, popup.firstChild);
        }
      },
    
      fillClipboardValue:function(sArray,xArray) {
        var retValue;
        var s = 0;
        var x = 0;
        s = sArray.length;
        x = xArray.length;
        switch(this.enableScriptsToClip) {
          case 1:
            retValue = "userChromeJS/uc.js ("+s+"):\n------------------------\n"+sArray.join("\n")+
                       "\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------\n"+xArray.join("\n");
            break;
          default:
            retValue = "userChromeJS/uc.js ("+s+"):\n------------------------";
            for (var i = 0; i < s ; i++) {
              j = i + 1;
              retValue = retValue + "\n" + j + ". " + sArray[i];
            }
            retValue = retValue + "\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------";
            if (this.enableScriptsToClip==2) s = 0;
            for (var i = 0; i < x ; i++) {
              j = i + s + 1;
              retValue = retValue + "\n" + j + ". " + xArray[i];
            }
            break;
        }
        return retValue;
      },
    
      createME: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);
    		m.addEventListener('command', function(event) {
    			Function("return " + 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: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:function(sName) {
        sName = sName.toLowerCase();
        /* 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
        */
        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;
      }
    
    };
    
    uProfMenu.init();
    Alles anzeigen
  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 11. Januar 2025 um 20:12
    Zitat von FuchsFan

    Nun nur noch ds extra-config-Script. :rolleyes:

    Hier mal das Skript mit etlichen Anpassungen. Es werden immer noch Fehler in der Konsole ausgegeben, d.h. es wird noch nicht alles funktionieren, aber den Ist-Zustand kann ja vielleicht mal jemand testen:/.

    CSS
    // ==UserScript==
    // @name           extras_config_menu.uc.js
    // @compatibility  Firefox 5*.*
    // @include        main
    // @version        1.0.20190504
    // @edit           @aborix 7/21 CSS Dateien als Untermenü eingefügt 
    // @edit           @2002Andreas 8/21 Shadow CSS Dateien als Untermenü + Ordner eingefügt 
    // ==/UserScript==
    
    var uProfMenu = {
      // Beginn der Konfiguration
      // In der folgenden Zeile (11) den Pfad zum Texteditor eintragen (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\\Notepad++\\notepad++.exe',
      // Falls gewuenscht, in Zeile 15 einen 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 (19) 'menu' eintragen, damit es unter "Extras" als Menue erscheint, sonst die id des gewuenschten
      // Elements *nach* dem der Button erscheinen soll (z.B. 'urlbar', 'searchbar', 'undoclosetab-button','abp-toolbarbutton')
      // Bitte nicht so etwas wie die Menue- oder Navigationsleiste (sondern einen Menuepunkt oder einen Button mit id auf diesen Leisten) eintragen:
     warpmenuto: 'helpMenu',
     // 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
      // Einbindung GM-Skripte-Ordner (0: nein, 1: Greasemonkey [Profil-Verzeichnis], 2: UserScriptLoader [Chrome-Verzeichnis], 3: Scriptish [Profil-Verzeichnis]):
      gmOrdner: 0,
      // Einbindung CSS-Ordner (0: nein, 1: UserCSSLoader-Ordner im Chrome-Verzeichnis):
      cssOrdner: 0,
      // In Zeile 30 gueltige about:Adressen eintragen, die ebenfalls aufgerufen werden sollen.
      // - Zum Ausblenden: abouts: [],
      // - Damit die about:-Seiten nicht als Untermenue, sondern direkt als Menuepunkte aufgefuehrt werden, muss das erste Element '0' sein:
      // abouts: ['0','about:about','about:addons','about:cache','about:config','about:support'],
      abouts: ['about:about','about:debugging#/runtime/this-firefox','about:cache','about:config','about:crashes','about:downloads','about:home','about:logins','about:memory','about:support','about:preferences','about:performance','about:profiles'],
      // Die normalen Firefox-Einstellungen auch zur Verfuegung stellen (0: nein, 1: ja):
      showNormalPrefs: 0,
      // Stellt "Skriptliste in Zwischenablage" zur Verfuegung (1: ja, 2: mit getrennter Nummerierung, 3: mit gemeinsamer Nummerierung) oder nicht (0):
      enableScriptsToClip: 1,
      // Um den Eintrag "Neustart" zu erzwingen (falls z.B. das andere Skript zu spaet eingebunden und nicht erkannt wird), auf 1 setzen:
      enableRestart: 0,
      // Ende der Konfiguration
    
      init: function() {
        if (this.warpmenuto.toLowerCase() == 'menu') {
          // aufgrund des gewaehlten warpmenuto als Untermenue von Extras anlegen
          var zielmenu = document.getElementById('menu_ToolsPopup');
          if (zielmenu==null) {
            userChrome.log("extras_config_menu.uc.js findet Zielmenue nicht, evtl. weil ein anderes Fenster als das Hauptfenster " +
                           "geoeffnet wurde. Falls dieser Fehler auch im Hauptfenster auftritt, bitte die vorgehende Definition " +
                           "von 'zielmenu' kontrollieren.");
           return
          }
          var menu = zielmenu.appendChild(this.createME("menu","Config Men\u00FC",0,0,"ExtraConfigMenu"));
          menu.setAttribute("class","menu-iconic");
          menu.setAttribute("ondblclick","openTrustedLinkIn('about:config', 'tab');");
         } else {
    		 
    	/*	 
          // als Button nach dem per warpmenuto gewaehlten Element anlegen (s. Kommentar ueber warpmenuto im Konfigurationsabschnitt)
          var zielmenu = document.getElementById(this.warpmenuto);
          if (zielmenu==null) {
            userChrome.log("extras_config_menu.uc.js findet Zielpunkt '"+this.warpmenuto+"' nicht, evtl. weil ein anderes Fenster als das Hauptfenster " +
                           "geoeffnet wurde. Falls dieser Fehler auch im Hauptfenster auftritt, bitte die vorgehende Definition " +
                           "von 'warpmenuto' kontrollieren.");
            return;
          }
          var menu = zielmenu.parentNode.insertBefore(document.createXULElement('toolbarbutton'), zielmenu.nextSibling);
          menu.setAttribute("id", "ExtraConfigMenu-button");
          menu.setAttribute("class", "toolbarbutton-1");
          menu.setAttribute("type", "menu");
          menu.setAttribute("tooltiptext", "Extra Config Menü\nMittelklick \öffnet about:config");
          menu.setAttribute("onclick", "if (event.button === 2 && !this.open) {openTrustedLinkIn('about:config','tab')};");
        }
    	*/
    	
    	 // 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"
            });
    		
          }
          var menu = document.getElementById("ExtraConfigMenu-button");
          menu.setAttribute("type", "menu");
         /* menu.setAttribute("onclick", "if (event.button === 2 && !this.open) {openTrustedLinkIn('about:config','tab'); event.preventDefault();};");*/
    	  
    	  menu.addEventListener('click', function(event) {
    			if (event.button == 2 && !this.open) { 
    				openTrustedLinkIn("about:config", "tab");
    				event.preventDefault();
    			};
    	 },true);
    	  
        }
    	
        //ab hier ist alles gleich, egal ob Button oder Menue
        var css = " \
          #ExtraConfigMenu, #ExtraConfigMenu-button { \
            list-style-image: url(file:///C:/Users/weiss/IconsFirefox/pencil.svg);  \
    		 margin-top: 0px !important; \
    		 opacity: 1 !important;\
          } \
          #ExtraConfigMenu-button > dropmarker, #ExtraConfigMenu-button > hbox > .toolbarbutton-menu-dropmarker { \
            display: none !important; \
          }";
        var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
        var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(css));
        sss.loadAndRegisterSheet(uri,sss.AGENT_SHEET);
        /*menu.setAttribute("onpopupshowing","uProfMenu.getScripts(0);uProfMenu.getCss(3);uProfMenu.getCss(4);uProfMenu.getCss(5)");*/
    	
    	menu.addEventListener('popupshowing', function(event) {
    			console.log("popupshowing");
    			uProfMenu.getScripts(0);
    			uProfMenu.getCss(3);
    			uProfMenu.getCss(4);
    			uProfMenu.getCss(5);
    	 },true);
    	
        var menupopup = menu.appendChild(this.createME("menupopup",0,0,0,"ExtraConfigMenu-popup"));
        // Anlegen von Untermenues fuer userChromeJS-Skripte und CSS-Dateien (befuellen spaeter)
        var submenu = menupopup.appendChild(this.createME("menu","Meine Scripte",0,0,"submenu-ucjs"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-ucjs-items"));
        // var submenu = menupopup.appendChild(this.createME("menu","uc.xul",0,0,"submenu-ucxul"));
        // var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-ucxul-items"));
        var submenu = menupopup.appendChild(this.createME("menu","css",0,0,"submenu-css"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-css-items"));
    	var submenu = menupopup.appendChild(this.createME("menu","CSSShadow",0,0,"submenu-CSSShadow"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-CSSShadow-items"));
        var submenu = menupopup.appendChild(this.createME("menu","cssweb",0,0,"submenu-cssweb"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-cssweb-items"));
        if (this.enableScriptsToClip) menupopup.appendChild(this.createME("menuitem","Skriptliste in Zwischenablage","uProfMenu.getScripts(1)","uProfMenu_clipboard",0));
        // Ende Anlegen von Untermenues
        menupopup.appendChild(document.createXULElement('menuseparator'));
        // Einbindung von Konfigdateien
     	menupopup.appendChild(this.createME("menuitem","Bild Url","uProfMenu.edit(0,'Bild Url.css');","uProfMenu_edit",0));
    	menupopup.appendChild(this.createME("menuitem","config Einträge.css","uProfMenu.edit(0,'config Einträge.css');","uProfMenu_edit",0));
    	/*menupopup.appendChild(this.createME("menuitem","Forum.css","uProfMenu.edit(0,'./CSSWeb/Forum.css');","uProfMenu_edit",0)); */
        menupopup.appendChild(this.createME("menuitem","userChrome.css","uProfMenu.edit(0,'userChrome.css');","uProfMenu_edit",0));
    	menupopup.appendChild(this.createME("menuitem","userChromeShadow.css","uProfMenu.edit(0,'userChromeShadow.css');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","userContent.css","uProfMenu.edit(0,'userContent.css');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","userChrome.js","uProfMenu.edit(0,'userChrome.js');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","prefs.js","uProfMenu.edit(1,'prefs.js');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","user.js","uProfMenu.edit(1,'user.js');","uProfMenu_edit"),0);
    
        // Ende Einbindung von Konfigdateien
        menupopup.appendChild(document.createXULElement('menuseparator'));
        // Einbindung von Ordnern
        switch (this.gmOrdner) {
          case 1:
            menupopup.appendChild(this.createME("menuitem","GM-skripty","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'gm_scripts');","uProfMenu_folder"),0);
            break;
          case 2:
            menupopup.appendChild(this.createME("menuitem","USL-skripty","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'UserScriptLoader');","uProfMenu_folder"),0);
            break;
          case 3:
            menupopup.appendChild(this.createME("menuitem","Skripty Scriptish","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'scriptish_scripts');","uProfMenu_folder"),0);
            break;
        }
    
        menupopup.appendChild(this.createME("menuitem","CSS-Ordner ","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'css');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","CSSShadow-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'CSSShadow');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","CSSWeb-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'CSSWeb');","uProfMenu_folder"),0);
    	 menupopup.appendChild(this.createME("menuitem","Chromeordner","uProfMenu.prefDirOpen('UChrm');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Profilordner","uProfMenu.prefDirOpen('ProfD');","uProfMenu_folder"),0);
    	    menupopup.appendChild(this.createME("menuitem","Icons-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'Icons');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Installationsordner","uProfMenu.prefDirOpen('CurProcD');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Addonordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'extensions');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Startup-Cacheordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfLD')+uProfMenu.getDirSep()+'startupCache');","uProfMenu_folder"),0);
      /*   menupopup.appendChild(this.createME("menuitem","Ordner about","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'about');","uProfMenu_folder"),0); */
        // Ende Einbindung von Ordnern
        // 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++) {
            menupopup.appendChild(this.createME("menuitem",this.abouts[i],"openTrustedLinkIn('"+this.abouts[i]+"','tab')","uProfMenu_about"),0);
            }
           } else {
            // der erste Eintrag des arrays ist ungleich '0', deshalb als Untermenue einrichten
            var submenu = menupopup.appendChild(this.createME("menu","uc.js",0,0,"submenu-about"));
            var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,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
        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","try{openOptionsDialog();}catch(e){openPreferences();}","uProfMenu_prefs"),0);
        // Falls addRestartButton installiert ist, Neustart zur Verfuegung stellen (addRestartButton 1.0.20120105mod erforderlich)
        if(typeof(ToolRstartMod) != "undefined" || this.enableRestart) menupopup.appendChild(this.createME("menuitem","Neustart",
        "try{ToolRstartMod.restartApp(false);} catch(e){alert(e);}","uProfMenu_restart"),0);
      },
    
      getDirSep:function() {
        // Betriebssystem nach https://developer.mozilla.org/en/Code_snippets/Miscellaneous ermitteln
        var osString = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS;
        var dirsep = "/";
        switch(osString) {
          case "WINNT":
            dirsep = "\\";
            break;
          case "Linux":
            dirsep = "/";
            break;
          case "Darwin":
            dirsep = "/";
            break;
        }
        return dirsep;
      },
    
      edit:function(OpenMode,Filename){
        var Path = "";
        var dSep = this.getDirSep();  // die Trennzeichen zwischen Ordnern abhaengig vom Betriebssystem machen
        switch (OpenMode){
          //Current is Chrome Directory
          case 0:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename;
            break;
          //Current is Profile Directory
          case 1:
            var Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename;
            break;
          //Current is Root
          case 2:
            var Path = Filename;
            break;
          //Current is CSS folder
          case 3:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSS" + dSep + Filename;
            break;
          //Current is CSSWeb folder
          case 4:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSWeb" + dSep + Filename;
            break;
    		//Current is CSSShadow folder
          case 5:
            var 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){
        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();
        a = a.replace(/ä/g,"a");
        a = a.replace(/ö/g,"o");
        a = a.replace(/ü/g,"u");
        a = a.replace(/ß/g,"s");
        b = b.toLowerCase();
        b = b.replace(/ä/g,"a");
        b = b.replace(/ö/g,"o");
        b = b.replace(/ü/g,"u");
        b = b.replace(/ß/g,"s");
        return(a==b)?0:(a>b)?1:-1;
      },
    
      getScripts:function(iType) {
        // Arrays (jeweils ein Array fuer uc.js und uc.xul) nehmen Namen der gefundenen Skripte auf
        let ucJsScripts = [];
        let ucXulScripts = [];
        // Suchmuster, also die Dateierweiterungen uc.js und uc.xul
        let extjs = /\.uc\.js$/i;
        //let extxul = /\.uc\.xul$/i;
        let aFolder = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
        aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path);
        // files mit Eintraegen im Chrome-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);
          // keine gewuenschte Datei, deshalb continue
          //if (!extjs.test(file.leafName) && !extxul.test(file.leafName)) continue;
          // uc.js gefunden -> im Array ablegen
          if (extjs.test(file.leafName)) ucJsScripts.push(file.leafName);
          // uc.xul gefunden -> im Array ablegen
          //if (extxul.test(file.leafName)) ucXulScripts.push(file.leafName);
        }
        if (this.sortScripts) {
          ucJsScripts.sort(this.stringComparison);
          //ucXulScripts.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);
          //this.fillMenu("submenu-ucxul","submenu-ucxul-items", "uc.xul",ucXulScripts,"uProfMenu_ucxul",0);
         } else {
          var result = this.fillClipboardValue(ucJsScripts,ucXulScripts);
          Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(result);
        }
      },
    
      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: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);
        }
        // Untermenue endlich befuellen
        for (var i = scriptArray.length-1; i > -1; i--) {
          // Typunterscheidung (userChromeJS-Skript oder about: oder css)
          if (sTyp==0){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(0,'"+scriptArray[i]+"')",sClass,0);
            mitem.setAttribute("onclick","uProfMenu.openAtGithub(event,'"+scriptArray[i]+"')");
            mitem.setAttribute("tooltiptext"," Linksklick: Bearbeiten,\n Mittelklick: https://github.com/.../"+this.cleanFileName(scriptArray[i])+" oeffnen,\n Rechtsklick: Suche auf GitHub");
           } else if (sTyp==1){
            var mitem = this.createME("menuitem",scriptArray[i],"openTrustedLinkIn('"+scriptArray[i]+"','tab')",sClass,0);
           } else if (sTyp==3){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(3,'"+scriptArray[i]+"')",sClass,0);
           } else if (sTyp==4){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(4,'"+scriptArray[i]+"')",sClass,0);
          }
    	  else if (sTyp==5){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(5,'"+scriptArray[i]+"')",sClass,0);
          }
          popup.insertBefore(mitem, popup.firstChild);
        }
      },
    
      fillClipboardValue:function(sArray,xArray) {
        var retValue;
        var s = 0;
        var x = 0;
        s = sArray.length;
        x = xArray.length;
        switch(this.enableScriptsToClip) {
          case 1:
            retValue = "userChromeJS/uc.js ("+s+"):\n------------------------\n"+sArray.join("\n")+
                       "\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------\n"+xArray.join("\n");
            break;
          default:
            retValue = "userChromeJS/uc.js ("+s+"):\n------------------------";
            for (var i = 0; i < s ; i++) {
              j = i + 1;
              retValue = retValue + "\n" + j + ". " + sArray[i];
            }
            retValue = retValue + "\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------";
            if (this.enableScriptsToClip==2) s = 0;
            for (var i = 0; i < x ; i++) {
              j = i + s + 1;
              retValue = retValue + "\n" + j + ". " + xArray[i];
            }
            break;
        }
        return retValue;
      },
    
      createME: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);
    		/*m.setAttribute('oncommand',sCommand);*/
    		
    		
    		m.addEventListener('command', function(event) {
    			console.log("Command:" + sCommand);
    			Function("return " + 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: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:function(sName) {
        sName = sName.toLowerCase();
        /* 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
        */
        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;
      }
    
    };
    
    uProfMenu.init();
    Alles anzeigen
  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • BrokenHeart
    • 11. Januar 2025 um 18:50
    Zitat von milupo

    M. E. brauchst du dort nichts ersetzen. onCommand und onCreated sind keine Inline-Eventhandler. Achte hier auf die Schreibweise: Inline-Eventhandler werden durchweg klein geschrieben, da gibt es keine Großbuchstaben.

    Noch als Ergänzung: Die Funktion CreateWidget(aProperties) erwartet ein Objekt mit bestimmten Eigenschaftswerten bzw. Elementen. OnCommand und OnCreated sind genauso Elemente dieses Übergabeobjekts wie zB:. id und type, aber eben als 'Funktionsparamter'. Das hat, wie du richtig gesagt hast, nichts mit inline-Eventhandlern zu tun und da darf natürlich auch nichts angepasst werden.

    In JavaScript hat ein Objekt ja formal folgendes Aussehen:

    Code
    const meinObjekt = {
      Eigenschaftsname_1: Wert_1,
      Eigenschaftsname_2: Wert_2,
      ...
      Eigenschaftsname_n: Wert_n,
    };

    Wie üblich bei den hier verwendeten UserSkripten wird dann dieses Übergabeobjekt mit dem gesamten Startcode gleich in den Funktionsaufruf hineingeschrieben, was von der Syntax dann so aussieht wie bekannt (und was ich persönlich nicht sehr übersichtlich finde).

    Hier sind alle möglichen Eigenschaften für das CreateWidget-Objekt aufgelistet:

    JavaScript
    /**
       * Create a widget.
       *
       * To create a widget, you should pass an object with its desired
       * properties. The following properties are supported:
       *
       * - id:            the ID of the widget (required).
       * - type:          a string indicating the type of widget. Possible types
       *                  are:
       *                  'button' - for simple button widgets (the default)
       *                  'view'   - for buttons that open a panel or subview,
       *                             depending on where they are placed.
       *                  'button-and-view' - A combination of 'button' and 'view',
       *                             which looks different depending on whether it's
       *                             located in the toolbar or in the panel: When
       *                             located in the toolbar, the widget is shown as
       *                             a combined item of a button and a dropmarker
       *                             button. The button triggers the command and the
       *                             dropmarker button opens the view. When located
       *                             in the panel, shown as one item which opens the
       *                             view, and the button command cannot be
       *                             triggered separately.
       *                  'custom' - for fine-grained control over the creation
       *                             of the widget.
       * - viewId:        Only useful for views and button-and-view widgets (and
       *                  required there): the id of the <panelview> that should be
       *                  shown when clicking the widget.  If used with a custom
       *                  widget, the widget must also provide a toolbaritem where
       *                  the first child is the view button.
       * - onBuild(aDoc): Only useful for custom widgets (and required there); a
       *                  function that will be invoked with the document in which
       *                  to build a widget. Should return the DOM node that has
       *                  been constructed.
       * - onBeforeCreated(aDoc): Attached to all non-custom widgets; a function
       *                  that will be invoked before the widget gets a DOM node
       *                  constructed, passing the document in which that will happen.
       *                  This is useful especially for 'view' type widgets that need
       *                  to construct their views on the fly (e.g. from bootstrapped
       *                  add-ons). If the function returns `false`, the widget will
       *                  not be created.
       * - onCreated(aNode): Attached to all widgets; a function that will be invoked
       *                  whenever the widget has a DOM node constructed, passing the
       *                  constructed node as an argument.
       * - onDestroyed(aDoc): Attached to all non-custom widgets; a function that
       *                  will be invoked after the widget has a DOM node destroyed,
       *                  passing the document from which it was removed. This is
       *                  useful especially for 'view' type widgets that need to
       *                  cleanup after views that were constructed on the fly.
       * - onBeforeCommand(aEvt, aNode): A function that will be invoked when the user
       *                          activates the button but before the command
       *                          is evaluated. Useful if code needs to run to
       *                          change the button's icon in preparation to the
       *                          pending command action. Called for any type that
       *                          supports the handler.  The command type, either
       *                          "view" or "command", may be returned to force the
       *                          action that will occur.  View will open the panel
       *                          and command will result in calling onCommand.
       * - onCommand(aEvt): Useful for custom, button and button-and-view widgets; a
       *                    function that will be invoked when the user activates
       *                    the button. A custom widget with a view should
       *                    return "view" or "command" to continue processing
       *                    the command per the needs of the widget.
       * - onClick(aEvt): Attached to all widgets; a function that will be invoked
       *                  when the user clicks the widget.
       * - onViewShowing(aEvt): Only useful for views and button-and-view widgets; a
       *                  function that will be invoked when a user shows your view.
       *                  If any event handler calls aEvt.preventDefault(), the view
       *                  will not be shown.
       *
       *                  The event's `detail` property is an object with an
       *                  `addBlocker` method. Handlers which need to
       *                  perform asynchronous operations before the view is
       *                  shown may pass this method a Promise, which will
       *                  prevent the view from showing until it resolves.
       *                  Additionally, if the promise resolves to the exact
       *                  value `false`, the view will not be shown.
       * - onViewHiding(aEvt): Only useful for views; a function that will be
       *                  invoked when a user hides your view.
       * - l10nId:        fluent string identifier to use for localizing attributes
       *                  on the widget. If present, preferred over the
       *                  label/tooltiptext.
       * - tooltiptext:   string to use for the tooltip of the widget
       * - label:         string to use for the label of the widget
       * - localized:     If true, or undefined, attempt to retrieve the
       *                  widget's string properties from the customizable
       *                  widgets string bundle.
       * - removable:     whether the widget is removable (optional, default: true)
       *                  NB: if you specify false here, you must provide a
       *                  defaultArea, too.
       * - overflows:     whether widget can overflow when in an overflowable
       *                  toolbar (optional, default: true)
       * - defaultArea:   default area to add the widget to
       *                  (optional, default: none; required if non-removable)
       * - shortcutId:    id of an element that has a shortcut for this widget
       *                  (optional, default: null). This is only used to display
       *                  the shortcut as part of the tooltip for builtin widgets
       *                  (which have strings inside
       *                  customizableWidgets.properties). If you're in an add-on,
       *                  you should not set this property.
       *                  If l10nId is provided, the resulting shortcut is passed
       *                  as the "$shortcut" variable to the fluent message.
       * - showInPrivateBrowsing: whether to show the widget in private browsing
       *                          mode (optional, default: true)
       * - hideInNonPrivateBrowsing: whether to hide the widget in non private
       *                             browsing mode windows (optional, default: false)
       * - tabSpecific:      If true, closes the panel if the tab changes.
       * - locationSpecific: If true, closes the panel if the location changes.
       *                     This is similar to tabSpecific, but also if the location
       *                     changes in the same tab, we may want to close the panel.
       * - webExtension:  Set to true if this widget is being created on behalf of an
       *                  extension.
       *
       * @param aProperties the specifications for the widget.
       * @return a wrapper around the created widget (see getWidget)
       */
    Alles anzeigen
  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • BrokenHeart
    • 8. Januar 2025 um 15:58
    Zitat von Aushilfsarnie

    seit dem Update auf 134 funktioniert das Script bei mir leider nicht mehr.

    Hallo,

    mit welcher nTabbarPosition nutzt du das Skript? Die Positionen 4 (links, hover) und 5 (rechts) funktionieren in der FF134 (noch) nicht.

  • Farbiger Ladebalken

    • BrokenHeart
    • 6. Januar 2025 um 15:03
    Zitat von 2002Andreas

    Sieht hier so aus in Fx 133 ohne Anpassungen:

    Ja, habe es auch gerade ohne 'userChrome.css' getestet. Sieht dann hier genauso aus. Dann gehört das wohl so.

    Ich finde die Animation nur etwas "überstylt". Aber gut, Geschmackssache..

  • Farbiger Ladebalken

    • BrokenHeart
    • 6. Januar 2025 um 14:52
    Zitat von BarbaraZ-

    Hier klappt nicht mehr.

    Der Ladebalken macht nicht mehr dass, was er soll, er macht einfch: NICHTS.

    Also hier "funktioniert" das Skript noch (128 und 133).

    Die Animation sieht nur irgendwie komisch aus. Keine Ahnung ob das so sein soll oder an meinen eigenen CSS-Anpassungen liegt?


    Nutzt du noch andere Skripte? Wenn ja, laufen diese Skripte überhaupt bei dir?

  • Was hört Ihr gerade?

    • BrokenHeart
    • 5. Januar 2025 um 20:33

    Hier mal was anspruchsvolles...
    Besser als die sexistischen und stereotypischen Videos, welche hier ohne jegliche Botschaft und musikalische Raffinesse vermehrt gepostet werden ;):

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

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

    • BrokenHeart
    • 29. Dezember 2024 um 15:12
    Zitat von FuchsFan

    Im Script Extra-Config-Menü hatte ich bisher diesen Befehl {label:'Addon-Manager', command:"BrowserOpenAddonsMgr();"}, zu stehen, mit dem der Addon-Manager aufgerufen werden konnte.

    Guckst du hier:

    Beitrag

    RE: Entwicklung Firefox

    Größtenteils ja. Aber BrowserOpenAddonsMgr() wäre jetzt BrowserAddonUI.openAddonsMgr() und ich weiß nicht, ob ich noch etwas übersehen habe. Aber das meiste, was geändert wurde, befindet sich definitiv in BrowserCommands.
    Sören Hentzschel
    15. April 2024 um 21:53
  • Einführung der „Gefällt mir“-Reaktion

    • BrokenHeart
    • 29. Dezember 2024 um 14:35
    Zitat von Sören Hentzschel

    Die Reaktion heißt hier schon immer „Gefällt mir“ und nicht „Danke“ (wobei das inhaltlich sowieso sehr nahe beieinander liegt).

    Oh je, ich war so sehr bei "Danke", wohl bedingt durch die Namensgebung in einem anderen Forum und weil ich die Funktion selten nutze, dass ich hier überhaupt nicht genau hingeschaut habe. Sorry. Hat sich der Punkt also schnell erledigt... :)

  • Einführung der „Gefällt mir“-Reaktion

    • BrokenHeart
    • 29. Dezember 2024 um 13:45

    Prinzipiell halte ich die "Danke"-Funktion für eine gute Sache, aber das führt natürlich das Bedanken ad absurdum :(:

    Beitrag

    Korrupte Texte in .pdf

    Hat sonnst auch jemand Textkorruption in .pdf dateien? In meinem Falle komischerweise nur in Schaltplänen, aber auch nur in Firefox.

    Weiß vlt jemand wie man das fixen kann?
    Vodkasaft
    28. Dezember 2024 um 13:01

    Warum bedankt man sich beim Threadersteller für die Eingangsfrage und warum wird so ziemlich jeder Beitrag mit "Danke" ausgezeichnet? Ist nicht der einzige Thread hier im Forum, aber hier wirds am deutlichsten. Bei so einem inflationären Gebrauch sind auch die unterschiedlichen Auszeichnungen sinnlos. Gut sind nur sehr wenige, die sich bei allen unentwegt bedanken müssen. War auch schon abzusehen, da es in anderen Foren genauso aussieht...

    Meine Vorschläge (nein, müssen nicht umgesetzt werden!):

    - Aus der "Danke"-Funktion eine "Gefällt mir"-Funktion machen. Unterstreicht besser den subjektiven Charakter und ist nicht wie "Danke" so sehr an einen hilfreichen oder nützlichen Beitrag gebunden. Dann sind natürlich auch die "Reaktions-Auszeichnungen" überflüssig ("Große Hilfe" etc.).

    - Die Funktion (nur?) für den Smalltalk freischalten, da es da ja keine "hilfreichste Antwort" gibt.

    Ergänzend: Beim "erledigt"-Markieren durch den TE einen Hinweistext bringen, ob er nicht auch eine "hilfsreichte Antwort" auswählen mag. Da diese Bewertung eben auch für andere Hilfesuchende sehr nützlich ist. Oder gibts das mittlerweile schon?

  • Frohe Weihnachten und einen guten Rutsch

    • BrokenHeart
    • 25. Dezember 2024 um 13:34

    Wünsche allen frohe Weihnachten. ✨🎄🎇

    Zitat von milupo

    und vor allem bleibt gesund. Es könnte ja sein, ich brauche nach Weihnachten noch Hilfe von euch. ;) :)

    Ja, genau das ist der Geist der Weihnacht... ;):saint:

  • Statusleiste seit Nightly 135 verändert

    • BrokenHeart
    • 18. Dezember 2024 um 18:25
    Zitat von grisu2099

    Hier dein Skript in der für mich angepaßten Version:

    Super :thumbup:. Vielen Dank! Dann werde ich mal schauen, ob ich das auch so in der Art hinbekomme mit den Icons. Das Skript 'space_and_separator_restorer.uc.js' nutze ich ja auch hier.

    Zitat von milupo

    So kann das manchmal sein: JavaScript-Genie, aber zu doof zum Kopieren. :D

    Lass das "JavaScript-Genie weg", dann bleibt nur der "Kopier-Trottel". So wird eher ein Schuh draus. :)

  • Statusleiste seit Nightly 135 verändert

    • BrokenHeart
    • 18. Dezember 2024 um 17:18
    Zitat von grisu2099

    Für mich schon.. ;) ^^

    Hab es jetzt hinbekommen - sieht dann so aus:

    Oha, das sieht bei dir jetzt wirklich gut aus. :thumbup:

    Wäre es möglich, dass du mal deine Anpassungen bezüglich der Statusleiste hier postest? Welche Abstandshalter nutzt du da?

    Zitat von grisu2099

    Danke für das neue Skript und die Hilfe bei der Anpassung :!: :thumbup:

    Gerne :)

  • Statusleiste seit Nightly 135 verändert

    • BrokenHeart
    • 18. Dezember 2024 um 16:54
    Zitat von 2002Andreas

    Neues Profil, ohne die Leiste unten:

    Ja du hast recht. Ich hatte es nicht in einem neuen Profil getestet. Bei mir verursacht neben dem Statusleisten-Skript noch dieses Skript dieses Verhalten:

    JavaScript
    // Restore 'Space & Separator' items script for Firefox 60+ by Aris
    //
    // Default browser scripts always remove spaces and separators from default palette, so
    // because of that they are added to an own toolbar now.
    //
    // - spaces and separators can be moved to any toolbar
    // - to remove spaces or separators move them into palette
    // - configuration toolbar behaves like a default toolbar, items and buttons can be placed on it
    // - configuration toolbar is not visible outside customizing mode
    // - default "Flexible Space" item is hidden from palette and added to configuration toolbar
    // [!] BUG: do not move spaces, flexible spaces or separator to configuration toolbar or it will cause glitches
    // [!] BUG: do not move 'main space' item to palette or it will get lost until next time customizing mode gets opened
    
    
    Components.utils.import("resource:///modules/CustomizableUI.jsm");
    var appversion = parseInt(Services.appinfo.version);
    
    var AddSeparator = {
      init: function() {
    	  
    	var tb_config_label = "Configuration Toolbar";
    	var tb_spacer_label = "Space";
    	var tb_sep_label = "Separator";
    	var tb_spring_label = "Flexible Space";
      
    	try {
    		
    	  if(appversion <= 62) var tb_config = document.createElement("toolbar");
    	  else var tb_config = document.createXULElement("toolbar");
    	  tb_config.setAttribute("id","configuration_toolbar");
    	  tb_config.setAttribute("customizable","true");
    	  tb_config.setAttribute("class","toolbar-primary chromeclass-toolbar browser-toolbar customization-target");
    	  tb_config.setAttribute("mode","icons");
    	  tb_config.setAttribute("iconsize","small");
    	  tb_config.setAttribute("toolboxid","navigator-toolbox");
    	  tb_config.setAttribute("lockiconsize","true");
    	  tb_config.setAttribute("ordinal","1005");
    	  tb_config.setAttribute("defaultset","toolbarspacer,toolbarseparator");
    	  
    	  document.querySelector('#navigator-toolbox').appendChild(tb_config);
    	  
    	  CustomizableUI.registerArea("configuration_toolbar", {legacy: true});
    	  if(appversion >= 65) CustomizableUI.registerToolbarNode(tb_config);
    	  
    	  
    	  if(appversion <= 62) var tb_label = document.createElement("label");
    	  else var tb_label = document.createXULElement("label");
    	  tb_label.setAttribute("label", tb_config_label+": ");
    	  tb_label.setAttribute("value", tb_config_label+": ");
    	  tb_label.setAttribute("id","tb_config_tb_label");
    	  tb_label.setAttribute("removable","false");
    	  
    	  tb_config.appendChild(tb_label);
    	  
    	  
    	  if(appversion <= 62) var tb_spacer = document.createElement("toolbarspacer");
    	  else var tb_spacer = document.createXULElement("toolbarspacer");
    	  tb_spacer.setAttribute("id","spacer");
    	  tb_spacer.setAttribute("class","chromeclass-toolbar-additional");
    	  tb_spacer.setAttribute("customizableui-areatype","toolbar");
    	  tb_spacer.setAttribute("removable","false");
    	  tb_spacer.setAttribute("label", tb_spacer_label);
    	  
    	  tb_config.appendChild(tb_spacer);
    	
    	  
    	  if(appversion <= 62) var tb_sep = document.createElement("toolbarseparator");
    	  else var tb_sep = document.createXULElement("toolbarseparator");
    	  tb_sep.setAttribute("id","separator");
    	  tb_sep.setAttribute("class","chromeclass-toolbar-additional");
    	  tb_sep.setAttribute("customizableui-areatype","toolbar");
    	  tb_sep.setAttribute("removable","false");
    	  tb_sep.setAttribute("label", tb_sep_label);
     	  
    	  tb_config.appendChild(tb_sep);
    	  
    	 
    	  if(appversion <= 62) var tb_spring = document.createElement("toolbarspring");
    	  else var tb_spring = document.createXULElement("toolbarspring");
    	  tb_spring.setAttribute("id","spring");
    	  tb_spring.setAttribute("class","chromeclass-toolbar-additional");
    	  tb_spring.setAttribute("customizableui-areatype","toolbar");
    	  tb_spring.setAttribute("removable","false");
    	  tb_spring.setAttribute("label", tb_spring_label);
    	  	  
    	  tb_config.appendChild(tb_spring);
    
    	  
    	  // CSS
    	  var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
    
    	  var uri = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent('\
    	  \
    		#configuration_toolbar { \
    	      -moz-appearance: none !important; \
    		  background-color: var(--toolbar-bgcolor); \
    		  background-image: var(--toolbar-bgimage); \
    		  background-clip: padding-box; \
    		  color: var(--toolbar-color, inherit); \
    		} \
    		#main-window:not([customizing]) #configuration_toolbar { \
    		  visibility: collapse; \
    		}\
    		#main-window[customizing] #configuration_toolbar #tb_config_tb_label { \
    		  font-weight: bold !important; \
    		}\
    		#main-window[customizing] #configuration_toolbar :-moz-any(#spacer,#separator,#spring) { \
    		  -moz-margin-start: 20px; \
    		}\
    		#main-window[customizing] #configuration_toolbar :-moz-any(#wrapper-spacer,#wrapper-separator,#wrapper-spring) .toolbarpaletteitem-label { \
    		  display: block !important; \
    		  -moz-margin-end: 20px; \
    		}\
    		#main-window[customizing] #wrapper-spacer #spacer { \
    		  margin: 2px 0 !important; \
    		}\
    		#main-window[customizing] #configuration_toolbar #wrapper-spring #spring { \
    		  margin: -1px 0 !important; \
    		  min-width: 80px !important; \
    		}\
    		#main-window[customizing] #configuration_toolbar > * { \
    		  padding: 10px !important; \
    		}\
    		#main-window[customizing] #configuration_toolbar > :-moz-any(#wrapper-spacer,#wrapper-separator,#wrapper-spring) { \
    		  border: 1px dotted !important; \
    		  -moz-margin-start: 2px !important; \
    		  -moz-margin-end: 2px !important; \
    		}\
    		#main-window[customizing] toolbarspacer { \
    		  border: 1px solid !important; \
    		}\
    		toolbar[orient="vertical"] toolbarseparator { \
    		  -moz-appearance: none !important; \
    		  border-top: 1px solid rgba(15,17,38, 0.5) !important; \
    		  border-bottom: 1px solid rgba(255,255,255, 0.3) !important; \
    		  margin: 2px 2px !important; \
    		  height: 1px !important; \
    		  width: 18px !important; \
    		}\
    		toolbar[orient="vertical"] toolbarspacer { \
    		  -moz-appearance: none !important; \
    		  height: 18px !important; \
    		  width: 18px !important; \
    		}\
    		#customization-palette toolbarpaletteitem[id^="wrapper-customizableui-special-spring"], \
    		#customization-palette-container :-moz-any(#spring,#wrapper-spring) { \
    		  display: none !important; \
    		}\
    	  \
    	  '), null, null);
    
    	  sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
    	
    	} catch(e){}	
    
      }
    
    }
    
    setTimeout(function(){
      AddSeparator.init();
    },500);
    Alles anzeigen

    Liegt dann wohl wirklich an der XUL-Toolbar-Erzeugung. Es kommen ja auch entsprechende Meldungen in der Konsole.

  • Statusleiste seit Nightly 135 verändert

    • BrokenHeart
    • 18. Dezember 2024 um 16:37
    Zitat von 2002Andreas

    Sieht dann so aus mit dem Zusatz im Skript:

    Es macht für mich ehrlich gesagt wenig Sinn, die Statusmeldung zwischen die Icons zu schieben, so wie grisu2099 das wollte, da die Breite der Status-Meldung ja variiert. Aber vielleicht habe ich sein Anliegen auch falsch interpretiert.

    Bei Verwendung von Icons wäre es meiner Meinung nach am besten, wenn der Statustext ganz links stehen würde und die Icons alle am rechten Rand (funktioniert noch nicht!). Was auch noch eine praktikable Lösung wäre: Den Selektor #bottom-toolbar in
    Zeile 17 so umzuschreiben:

    CSS
    	#bottom-toolbar {
    			height: 24px !important;
    			direction: rtl !important;
    		}

    Dann wird der Statustext am rechten Rand links vor die Icons gesetzt.

  • Statusleiste seit Nightly 135 verändert

    • BrokenHeart
    • 18. Dezember 2024 um 16:19
    Zitat von 2002Andreas

    Wenn man diese zusätzliche Leiste einfügt, dann ist beim Öffnen von einem neuen Fenster oder einem privaten Fenster der Button für Erweiterungen verschwunden.

    Ich glaube allerdings, dass das so gewollt ist, dass es diesen Button nur in einem Fenster gibt. Auch ohne die Zusatzleiste wird der Erweiterungs-Button in jedem neuen Fenster versteckt. Im Fehlerbehebungsmodus darf man das nicht testen, da der Button da ein ganz anderes Verhalten besitzt, da ja alle Erweiterungen deaktiviert wurden. Ist eben ein besonders "einmaliger" Button...:/

  • Statusleiste seit Nightly 135 verändert

    • BrokenHeart
    • 18. Dezember 2024 um 16:01
    Zitat von grisu2099

    Wäre es evtl. machbar, die Position des neuen Labels an die ID eines Elementes in der Leiste zu koppeln?

    Das sollte eigentlich recht einfach machbar sein, da man bei insertBefore ja einen "Referenzknoten" angeben kann.

    Also müsste man nur in Zeile 58 anstatt der null -> document.getElementById('logins-button') einfügen. Ist nur ein Beispiel, den richtigen ID-Namen über die Browser-Werkzeuge ermitteln!

    Ansonsten muss ich noch einiges am Skript ändern, da ich es mit Icons (verwende ich nicht in der Statusleiste) noch nicht getestet hatte...

  • Statusleiste seit Nightly 135 verändert

    • BrokenHeart
    • 18. Dezember 2024 um 15:01
    Zitat von 2002Andreas

    Wenn man diese zusätzliche Leiste einfügt, dann ist beim Öffnen von einem neuen Fenster oder einem privaten Fenster der Button für Erweiterungen verschwunden.

    Ja, in einem neuen Fenster wird für unified-extensions-button das hidden-Attibute auf true gesetzt. Stellt man das händisch wieder auf false, dann ist auch der Button wieder da. Warum das so ist und vor allem in welchem Zusammenhang das mit zusätzlichen Leisten steht, müsste man mal untersuchen...:/

  • Statusleiste seit Nightly 135 verändert

    • BrokenHeart
    • 18. Dezember 2024 um 14:34
    Zitat von 2002Andreas

    Das lag doch nicht an dir, Schuld hatte wie immer Windows ;)

    Genau aus diesem Grund nutzt man ja Windows, weil man dann nie schuld daran ist, wenn etwas nicht funktioniert! ;)

    Bei Linux ist es andersrum, da bist DU immer selber schuld....:/

    "Close all Gates and never pay the Bill."

  • Statusleiste seit Nightly 135 verändert

    • BrokenHeart
    • 18. Dezember 2024 um 14:27
    Zitat von 2002Andreas

    Nur mal so, funtioniert auch in Fx 133 einwandfrei :thumbup:

    Oh, hatte bei mir nicht funktioniert, weil wieder zu doof zum Kopieren gewesen. Aber stimmt, geht doch. Dann schreibe ich mal
    "FF 133+" in das Skript.

    Danke fürs Testen.:thumbup:

Unterstütze uns!

Jährlich (2025)

101,9 %

101,9% (662,48 von 650 EUR)

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