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

Beiträge von Boersenfeger

  • Clear Search.uc.js anpassen wieder

    • Boersenfeger
    • 17. Oktober 2026 um 14:10

    Oh, tut mir leid, ich habe keine Einschränkungen mit dem aus #4 , allerdings nutze ich noch 2 Scripte: searchEngineIcon.uc.js

    JavaScript
    // ==UserScript==
    // @name           searchEngineIcon.uc.js
    // @namespace      http://space.geocities.yahoo.co.jp/gl/alice0775
    // @description    replace the magnifying glass with the search engine's icon
    // @include        main
    // @compatibility  Firefox 151
    // @version        2026/04/19 00:00 Bug 1998985 - Convert XUL in SearchModeSwitcher to HTML
    // @version        2026/04/15 00:00 remove async function
    // @version        2026/01/23 00:00 Bug 2000685 - Replace the search service instance with a singleton
    // @version        2026/01/13 00:00 compatibility 149 from 148
    // @author         Alice0775
    // @version        2025/12/20 00:00 new search widget
    // @version        2025/02/04 23:00 Bug 1880913 - Move BrowserSearch out of browser.js
    // @version        2024/03/01 00:00 Bug 1882577 - Make nsISearchEngine.getIconURL an async function
    // @version        2023/12/24 00:00 Bug 1870644 use engine.getIconURL() instead engine.iconURI.spec
    // @version        2023/02/08 10:00 remove -moz-image-region
    // @version        2021/01/21 12:00 indicate engine name
    // @version        2020/01/26 22:00 fix typo & simplify
    // @version        2020/01/26 20:00 fox after DOM fullscreen
    // @version        2019/11/22 00:00 workaround delayed initialize using gBrowserInit.delayedStartupFinished instead async Services.search.init()
    // @version        2019/11/14 00:00 Fix 72+ Bug 1591145 Remove Document.GetAnonymousElementByAttribute
    // @version        2019/06/24 11:00 Fix 68+ Bug 1518545 - Merge engine-current/ default notifications
    // @version        2019/05/24 11:00 Fix overflowed/underflowed
    // @version        2019/03/30 19:00 Fix 67.0a1 Bug 1492475 The search service init() method should simply return a Promise
    // @version        2019/03/20 00:00 Fix 67.0a1
    // @version        2018/11/29 00:00 Fix 67.0a1 Bug 1524593 - nsISearchService (aka nsIBrowserSearchService, previously) refactor to be mostly an asynchronouse
    // @version        2018/11/29 00:00 Fix 65.0a1 Bug 1453264
    // @version        2018/09/29 23:00 Fix 64.0a1
    // @version        2018/09/24 23:00 Fix warning from nsIBrowserSearchService
    // @version        2018/07*20 23:00 Fix change option > search
    // @version        2017/11/17 02:00 Fx57
    // @version        2015/09/08 02:00 Bug 827546
    // ==/UserScript==
    var searchengineicon = {
      lazy: {},
    
      init: function() {
        this.toggleImage("init");
        window.addEventListener('aftercustomization', this, false);
        window.addEventListener('MozDOMFullscreen:Exited', this, false);
        Services.prefs.addObserver('browser.search.widget.inNavBar', this, false);
        Services.obs.addObserver(this, "browser-search-engine-modified");
        window.addEventListener("resize", this, false);
        window.addEventListener('unload', this, false);
      },
    
      uninit: function(){
        window.removeEventListener('aftercustomization', this, false);
        window.removeEventListener('MozDOMFullscreen:Exited', this, false);
        Services.prefs.removeObserver('browser.search.widget.inNavBar', this);
        Services.obs.removeObserver(this, "browser-search-engine-modified");
        window.removeEventListener("resize", this, false);
        window.removeEventListener('unload', this, false);
      },
      
      toggleImage: async function(topic) {
        Services.console.logStringMessage("toggleImage "+topic);
        ChromeUtils.defineESModuleGetters(this.lazy, {
          SearchService: "moz-src:///toolkit/components/search/SearchService.sys.mjs",
        });
        if (!this.lazy.SearchService.isInitialized) {
          await this.lazy.SearchService.init();
        }
        if (Services.prefs.getBoolPref("browser.search.widget.new", false)) {
          var searchbar = window.document.getElementById("searchbar-new");
          if (!searchbar)
            return;
          searchbar.searchModeSwitcher.updateSearchIcon();
        } else {
          var searchbar = window.document.getElementById("searchbar");
          if (!searchbar)
            return;
          let  searchbutton = searchbar.querySelector(".searchbar-search-icon");
          if (!searchbutton)
            return;
          Services.console.logStringMessage("toggleImage "+topic +" done");
          let defaultEngine = await this.lazy.SearchService.getDefault();
          var uri = await defaultEngine.getIconURL();
          //var icon = PlacesUtils.getImageURLForResolution(window, uri);
          searchbutton.setAttribute("style", "list-style-image: url('"+ uri +"') !important;/* -moz-image-region: auto !important;*/ width: 16px !important; padding: 2px 0 !important;");
          searchbar._textbox.setAttribute("placeholder", searchbar.currentEngine.name);
        }
      },
    
      observe(aSubject, aTopic, aPrefstring) {
        if (aTopic == "browser-search-engine-modified") {
          //aSubject.QueryInterface(Components.interfaces.nsISearchEngine);
          switch (aPrefstring) {
          case "engine-current":
          case "engine-default":
           this.toggleImage(aPrefstring);
            // Not relevant
            break;
          }
        }
        if (aTopic == 'nsPref:changed') {
          // 設定が変更された時の処理
          setTimeout(function(){searchengineicon.toggleImage(aTopic);}, 0);
        }
      },
    
      _timer: null,
      handleEvent: function(event){
        switch (event.type) {
          case "MozDOMFullscreen:Exited":
            setTimeout(() => {this.toggleImage(event.type);}, 1000);
            break;
          case "aftercustomization":
            this.toggleImage("aftercustomization");
            break;
          case 'unload':
            this.uninit();
            break;
        }
      }
    }
    
    // We should only start the redirection if the browser window has finished
    // starting up. Otherwise, we should wait until the startup is done.
    if (gBrowserInit.delayedStartupFinished) {
      searchengineicon.init();
    } else {
      let delayedStartupFinished = (subject, topic) => {
        if (topic == "browser-delayed-startup-finished" &&
            subject == window) {
          Services.obs.removeObserver(delayedStartupFinished, topic);
          searchengineicon.init();
        }
      };
      Services.obs.addObserver(delayedStartupFinished,
                               "browser-delayed-startup-finished");
    }
    Alles anzeigen

    und SearchEngineWheelScroll.uc.js

    JavaScript
    // ==UserScript==
    // @name        SearchEngineWheelScroll.uc.js
    // @include     main
    // @async       true
    // compatibility 149
    // @version     2026/01/28 00:00 Bug 2003300 - Replace nsISearchService.CHANGE_REASON* with SearchService.CHANGE_REASON*
    // @version     2026/01/23 00:00 Bug 2000685 - Replace the search service instance with a singleton
    // @version     2025/12/20 00:00 new search widget
    // @version     2025/10/14 00:00 Bug 1977965 - Add a "Search Image" content context menu item for performing visual searches
    // @version     2025/07/31 00:00 Bug 1979338 - Use srcset for images on menuitems
    // @version     2025/07/09 00:00 Bug 1974698 - Remove setters for synchronous setting of the default (private) engines (use Services.search.setDefault instead setter of defaultEngine)
    // @version     2025/06/03 00:00 Bug 1882577 - Make nsISearchEngine.getIconURL an async function
    // @version     2024/03/01 00:00 Bug 1882577 - Make nsISearchEngine.getIconURL an async function
    // @version     2023/12/24 00:00 Bug 1870644 use engine.getIconURL() instead engine.iconURI.spec
    // @version     2023/10/10 00:00 Stop using xml-stylesheet processing instructions
    // @version     2023/07/17 00:00 use ES module imports
    // @version     2023/02/08 10:00 remove -moz-image-region
    // @version     2022/11/06 17:00 107 Bug 1793414
    // @version     2020/06/13 11:00 Respect the focus
    // @version     2020/12/14 00:00 proton
    // @version     2020/12/14 00:00 Fix Firefox 85 Bug 1654217 - Make getEngineByAlias async
    // @version     2020/01/26 20:00 fox after DOM fullscreen
    // @version     2019/11/22 00:00 workaround delayed initialize using gBrowserInit.delayedStartupFinished instead async Services.search.init()
    // @version     2019/12/11 00:00 Fix Services.search initialize
    // @version     2019/11/14 00:00 Fix contextmenu
    // @version     2019/06/24 23:00 fix 69 wait for gBrowser initialized
    // @version			0.91	2019/5/26 Firefox67
    // @version			0.9		2018/11/30
    // ==/UserScript==
    /*
    Um ein Symbol auf der Suchschaltfläche anzuzeigen, ist die Verwendung von Alice0775s Script searchEngineIcon.uc.js die zuverlässigste Methode.
    
    Soll der Platzhalter im Suchfeld der Name der Suchmaschine sein, fügen Sie die folgende Zeile unterhalb der folgenden Zeile im selben Skript ein:
    
    `searchbutton.setAttribute("style", "list-style-image: url('"+ uri +"') !important; width: 16px !important; padding: 2px 0 !important;");`
     		searchbar.textbox.setAttribute('placeholder', Services.search.defaultEngine.name);
    */
    
    
    async function SearchEngineWheelScroll() {
    // Einstellung: true für (Ja), false für aus (Nein)
    
      const scrollDown = true // Zum nächsten Suchmaschinen-Element scrollen
      const menu_icon = true // Symbol im Kontextmenü anzeigen
      const dblclick_reset = true // Doppelklick um zur vorherigen Suchmaschine zurückzukehren
      const box_clear = true // Nach der Suche mit Doppelklick auf die Suchschaltfläche das Suchfeld leeren
      const top_engine = false // Die oberste Suchmaschine für die Direktsuche festlegen
      const select_engine = 'Google' // Suchmaschine per Stichwort auswählen, z. B. 'g'
      const sync = true // Suchbegriff aus dem Kontextmenü an die Suchleiste senden
      const hist = true // Suchbegriff aus dem Kontextmenü zum Suchverlauf hinzufügen
      const loop = false // Die Suchmaschinen in einer Schleife durchlaufen, ohne am Anfang oder Ende anzuhalten
    
    // Einstellungen Ende
    
      const box_reset = true // Suchmaschine nach der Suche in der Suchleiste zurücksetzen
      const menu_reset = true //Suchmaschine nach der Suche im Kontextmenü zurücksetzen
      window.addEventListener('aftercustomization', handleEvent, false);
      window.addEventListener('MozDOMFullscreen:Exited', handleEvent, false);
    
      const searchbar = Services.prefs.getBoolPref("browser.search.widget.new", false) ?
      document.getElementById('searchbar-new') :
      document.getElementById('searchbar');
      if(!searchbar) return;
      const lazy = {};
      ChromeUtils.defineESModuleGetters(lazy, {
        SearchService: "moz-src:///toolkit/components/search/SearchService.sys.mjs",
        FormHistory: "resource://gre/modules/FormHistory.sys.mjs",
      });
      let searchbtn = searchbar.querySelector('hbox.searchbar-search-button');
      let newSearchbtns = document.querySelectorAll(".searchmode-switcher");
      const menu = document.getElementById('context-searchselect');
      const SS = lazy.SearchService;
      menu.setAttribute("class", "menuitem-iconic");
    
      menu.addEventListener('wheel', ChangeE, false);
      if(!!menu_reset) {
        //menu.addEventListener('click', CMenu_reset, false);
        menu.parentNode.addEventListener('popuphidden', CMenu_reset, false);
      }
    
      await lazy.SearchService.init();
      if (!init()) return;
    
      CMenu();
      Services.obs.addObserver(observe, "browser-search-engine-modified");
       
    
    
    
      window.addEventListener('unload', function uninit() {
      	Services.obs.removeObserver(observe, "browser-search-engine-modified");
        window.removeEventListener('unload', uninit, false);
      }, false);
    
      function init() {
        let flg = false;
        for (let i = 0; i < newSearchbtns.length; i++) {
          newSearchbtns[i].addEventListener('wheel', async (e) => {
            const dir = (scrollDown ? 1 : -1) * Math.sign(e.deltaY);
            let searchMode = searchbar.searchMode;
            // Find the new index.
            const engines = await SS.getVisibleEngines();
            let currentName;
            if (!searchMode) {
              currentName = SS.defaultEngine.name;
            } else {
              currentName = searchMode.engineName;
            }
            let newIndex = -1;
            let lastIndex = engines.length - 1;
            for (let i = lastIndex; i >= 0; --i) {
              if (engines[i].name == currentName) {
                // Check bounds to cycle through the list of engines continuously.
                if (dir < 0 && i == 0 && loop) {
                  newIndex = lastIndex;
                } else if (dir > 0 && i == lastIndex && loop) {
                  newIndex = 0;
                } else {
                  newIndex = i + dir;
                }
                break;
              }
            }
            if (newIndex >= 0 && newIndex <= lastIndex) {
              if (engines[newIndex] == SS.defaultEngine) {
                searchbar.searchMode = null;
              } else {
                searchbar.searchMode = { engineName: engines[newIndex].name };
              }
            }
          }, false);
          
          newSearchbtns[i].addEventListener('dblclick', ResetE, false);
          flg = true;
        }
    
        if(!searchbtn) return flg;
        Services.console.logStringMessage("SearchEngineWheelScroll init");
        searchbtn.addEventListener('wheel', ChangeE, false);
        searchbtn.addEventListener('dblclick', ResetE, false);
        return true;
      }
    
      function CMenu_reset(e){
       Services.console.logStringMessage(e.type);
    
      	searchbar.value = sync? this.searchTerms : searchbar.value;
      	if(!!hist) SyncHistory();
      	setTimeout(function(){ResetE()}, 0);
      }
      function handleEvent(event) {
        Services.console.logStringMessage("SearchEngineWheelScroll "+event.type);
        switch(event.type) {
          case "MozDOMFullscreen:Exited":
            setTimeout(() => {init();}, 1000);
            break;
          case "aftercustomization":
            init();
            break;
        }
      }
    
      async function ResetE(){
      	//SS.defaultEngine = (!!top_engine || select_engine == '') ? (await SS.getVisibleEngines())[0] : await SS.getEngineByAlias(select_engine);
      	await lazy.SearchService.setDefault(
      			(!!top_engine || select_engine == '')
        			? (await SS.getVisibleEngines())[0]
        			: await SS.getEngineByAlias(select_engine),
      			lazy.SearchService.CHANGE_REASON_USER_SEARCHBAR
    		);
    
      	if(box_clear) searchbar.value = '';
      }
    
      var SSSURI = null;
      async function CMenu() {
    
      	let selectedText = menu.searchTerms || window.getSelection().toString();
      	if (selectedText.length > 15) {
      		let truncLength = 15;
      		let truncChar = selectedText[15].charCodeAt(0);
      		if (truncChar >= 0xDC00 && truncChar <= 0xDFFF)
      			truncLength++;
      		selectedText = selectedText.substr(0, truncLength) + '\u2026';
      	}
      	var menuLabel = gNavigatorBundle.getFormattedString('contextMenuSearch', [SS.defaultEngine.name, selectedText]);
      	menu.setAttribute('label', menuLabel);
      	if(!menu_icon) return;
      	let iconurl =' url('+ await SS.defaultEngine.getIconURL() + ')';
      	let style = `#context-searchselect .menu-icon{width:16px;height:16px;}
      	             #context-searchselect { --menuitem-icon: ${iconurl} !important;}`;
      	
        var sss = Cc['@mozilla.org/content/style-sheet-service;1']
                  .getService(Ci.nsIStyleSheetService);
        if (SSSURI && sss.sheetRegistered(SSSURI, sss.USER_SHEET)) {
          sss.unregisterSheet(SSSURI, sss.USER_SHEET);
        }
        var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(style));
        SSSURI = uri;
        if(!sss.sheetRegistered(uri, sss.USER_SHEET))
          sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
    /*
      	let sspi = document.createProcessingInstruction(
        	'xml-stylesheet',
        	'type="text/css" href="data:text/css,' + encodeURIComponent(style) + '"'
      		);
      	document.insertBefore(sspi, document.documentElement);
      	sspi.getAttribute = function(name) {
        	return document.documentElement.getAttribute(name);
      	};
    */  
      }
      
      function SyncHistory() {
        if (PrivateBrowsingUtils.isWindowPrivate(window)) 
          return;
      	const val = menu.searchTerms;
      		lazy.FormHistory.update({
      		  op: "bump",
      		  fieldname: "searchbar-history",
      		  value: val,
      		  source: menu.engine.name
      		});
      }
      
      async function ChangeE(e) {
    
        const dir = (scrollDown ? 1 : -1) * Math.sign(e.deltaY);
    
        // Find the new index.
        let engines = await SS.getVisibleEngines();
        let currentName = SS.defaultEngine ? SS.defaultEngine.name : "";
        let newIndex = -1;
        let lastIndex = engines.length - 1;
        for (let i = lastIndex; i >= 0; --i) {
          if (engines[i].name == currentName) {
            // Check bounds to cycle through the list of engines continuously.
            if (dir < 0 && i == 0 && loop) {
              newIndex = lastIndex;
            } else if (dir > 0 && i == lastIndex && loop) {
              newIndex = 0;
            } else {
              newIndex = i + dir;
            }
            break;
          }
        }
    
        if (newIndex >= 0 && newIndex <= lastIndex) {
          //SS.defaultEngine = engines[newIndex];
      		await lazy.SearchService.setDefault(
      			engines[newIndex],
      			lazy.SearchService.CHANGE_REASON_USER_SEARCHBAR
    	   	);
    	   	document.getElementById('context-searchselect').engine = engines[newIndex];
    	  }
      }
    
      function observe(aEngine, aTopic, aVerb) {
    
        if (aTopic == "browser-search-engine-modified") {
          //aEngine.QueryInterface(Components.interfaces.nsISearchEngine);
          if(aVerb == "engine-current" || aVerb == "engine-default")
          	CMenu();
      	}
      }
    
      if(!box_reset) return;
    	searchbar.cmd = searchbar.doSearch;
    	searchbar.doSearch = function(aData, aWhere, aEngine, aParams, isOneOff = false) {
        if (false && aWhere == 'current') {
    	  	aWhere = gBrowser.selectedTab.isEmpty? 'current': 'tab';
      	} 
      	this.cmd(aData, aWhere, aEngine, aParams, isOneOff);
      	ResetE();
      }
    }
    
    // We should only start the redirection if the browser window has finished
    // starting up. Otherwise, we should wait until the startup is done.
    if (gBrowserInit.delayedStartupFinished) {
      SearchEngineWheelScroll();
    } else {
      let delayedStartupFinished = (subject, topic) => {
        if (topic == "browser-delayed-startup-finished" &&
            subject == window) {
          Services.obs.removeObserver(delayedStartupFinished, topic);
          SearchEngineWheelScroll();
        }
      };
      Services.obs.addObserver(delayedStartupFinished,
                               "browser-delayed-startup-finished");
    }
    Alles anzeigen

    sowie ein kleines CSS,

    CSS
    /* Suchleiste ohne Icon */
    
    	toolbarbutton.searchmode-switcher {
    	display: none !important;
    	}

    Vielleicht hilfts.

  • Clear Search.uc.js anpassen wieder

    • Boersenfeger
    • 17. Oktober 2026 um 13:40

    Oh, ich habe dir die alte Version geschickt

    JavaScript
    //Suchfeld automatisch leeren
    
    //Autor @BrokenHeart
    //https://www.camp-firefox.de/forum/thema/140164-suchfeld-hellblau-und-leert-sich-nicht-mehr-scriptfehler/?postID=1284188#post1284188
    
       (function() {
    	if (!window.gBrowser)
    		return;
    
    	//Settings ---->
    	const waitingToClear = 4000; //Zeitangabe für Löschen der Eingabe: [Wert] in ms oder [0] kein automisches Löschen. 
    	//<--- Settings
    
    	function clearSearchbar() {
    		let searchbar = document.getElementById('searchbar-new');
    	
    		if(searchbar) {
    			let textbox = searchbar.inputField;
    			textbox.addEventListener("keydown", function(event) {
    				if( event.key == "Enter" ) {
    					setTimeout( function() {
    						textbox.value = '';         
    					},500);
    				}
    			});
    			
    			var idTimeOut;
    			if(waitingToClear > 0) {
    				textbox.addEventListener('input', function() {
    					
    					let urlbarGoButton = document.querySelector("#searchbar-new .urlbar-go-button");
    					
    					if(urlbarGoButton) {
    						urlbarGoButton.hidden = false;
    					}
    					
    					clearTimeout(idTimeOut);
    					idTimeOut = setTimeout(function() {
    						textbox.value = '';
    						textbox.dispatchEvent(new KeyboardEvent("keydown", { bubbles: true, cancelable: true, keyCode: 27, code: "Escape" })); 
    						setTimeout( function() {
    							textbox.dispatchEvent(new KeyboardEvent("keydown", { bubbles: true, cancelable: true, keyCode: 27, code: "Escape" })); 
    							if(urlbarGoButton) {
    								urlbarGoButton.hidden = true;
    							}
    						},100);
    					},waitingToClear);
    				});
    			}
    		}
    	}
    	setTimeout(clearSearchbar,4000); 
    })();
    Alles anzeigen

    Besser?

  • Clear Search.uc.js anpassen wieder

    • Boersenfeger
    • 17. Oktober 2026 um 13:26

    Ich nutze ein Such-Script, das ein PopUp nicht ausgibt, ansonsten aber so funktioniert, wie du es schilderst. Vielleicht kannst du es ja nutzen!?

    JavaScript
    	/* Suchfeld leeren nach 4 Sekunden */
    	/* Author @aborix und repariert von @Brokenheart */
    
    (function() {
    	if (!window.gBrowser)
    		return;
    
    	//Settings ---->
    	const waitingToClear = 4000; //Zeitangabe für Löschen der Eingabe: [Wert] in ms oder [0] kein automatisches Löschen. 
    	//<--- Settings
    
    	function clearSearchbar() {
    		let searchbar = document.getElementById('searchbar-new');
    	
    		if(searchbar) {
    			let textbox = searchbar.inputField;
    			textbox.addEventListener("keydown", function(event) {
    				if( event.key == "Enter" ) {
    					setTimeout( function() {
    						textbox.value = '';         
    					},500);
    				}
    			});
    			
    			var idTimeOut;
    			var searchbarPopup = document.querySelector("#searchbar-new > .urlbarView");
    			if(waitingToClear > 0) {
    				textbox.addEventListener('input', function() {
    					searchbarPopup.style.display = "inherit";
    					clearTimeout(idTimeOut);
    					idTimeOut = setTimeout(function() {
    						textbox.value = '';
    						setTimeout( function() {
    							searchbarPopup.style.display = "none";
    						},100)
    					},waitingToClear);
    				});
    			}
    		}
    	}
    	setTimeout(clearSearchbar,1000); 
    })();
    Alles anzeigen

    Funktioniert in 158 und 160

  • Anzeige unter about:addons in Nightly verändert

    • Boersenfeger
    • 17. Oktober 2026 um 12:26

    FuchsFan  Mira_Belle

    So ist es für mich völlig ausreichend! Vielen Dank! :):thumbup:

    Wenn jemand andere, neuere, angepasstere Vorschläge hat, gerne hier anbieten.

  • Anzeige unter about:addons in Nightly verändert

    • Boersenfeger
    • 15. Oktober 2026 um 16:24

    Nun ists wieder soweit, die Darstellung klappt mit Nightly Version 160 nicht mehr. Ich vermute, das das neue Design nicht mehr mit dem CSS harmoniert.

    Kann man es heilen?

  • Gleichwertiger Ersatz für LanguageTool?

    • Boersenfeger
    • 15. Oktober 2026 um 15:54

    Mira_Belle Gerne per PN, falls es mich doch noch irgendwann erwischt ;)

  • Gleichwertiger Ersatz für LanguageTool?

    • Boersenfeger
    • 15. Oktober 2026 um 12:16

    Warum sollte ich dass lesen, wenn ich doch bei der Nutzung keine Einschränkung erkenne? Ich nutze allerdings "nur" Rechtschreibung und Kommasetzung.

  • Gleichwertiger Ersatz für LanguageTool?

    • Boersenfeger
    • 15. Oktober 2026 um 12:00

    Moin, wir reden von dieser Erweiterung?

    Sie funktioniert hier bisher einwandfrei ohne Bezahlung in Nightly....

  • Hovern über einen Link produziert keine Einblendung

    • Boersenfeger
    • 14. Oktober 2026 um 13:30

    Wer das o.a. Script nutzt, könnte ggf. eine Korrektur einbauen.
    Bei mir in Nightly passte in der Zeile 23 der Wert -28px nicht mehr und die Einblendung war nach unten rausgerutscht.
    Jetzt sind es 2px und es passt wieder!

    In Version 158 stimmt der Wert -28px dagegen noch. Muss man im Auge behalten, ob es in der Nightly-Version nur Basteleien sind.

    JavaScript
    /* Statusleiste für Firefox ab 149 */
    
    // https://www.camp-firefox.de/forum/viewtopic.php?p=1052187&sid=d4e33b574226439c26dfb45629b71369#p1052187
    // entwickelt von aborix
    // Erneuert von Horstmann https://www.camp-firefox.de/forum/thema/140245-hovern-%C3%BCber-einen-link-produziert-keine-einblendung/?postID=1285151#post1285155
    
    (function() {
    	    if (location.href !== 'chrome://browser/content/browser.xhtml') return;
    
      let css =`
    
        #new-toolbar {
            height: 28px;
            direction: rtl;
            -moz-window-dragging: no-drag;
            border-top: 1px solid black !important;
            background-color: rgba(0,0,0,0) !important;
            color: black !important;
        }
    
        #statuspanel {
            position: fixed !important; 
            bottom: 2px !important;   
            left: 0 !important;
            max-width: 75% !important;
            transition: none !important;
        }
    
        #statuspanel-label{
            background: transparent !important;
            border: none !important;
            border-top: 3px solid #7598ff !important;
            font: 17px Arial Rounded MT Bold !important;
            font-weight: normal !important;
            color: black !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.AUTHOR_SHEET);
    
      var tb = document.createXULElement('toolbar');
      tb.id = 'new-toolbar';
      tb.setAttribute('customizable', true);
      tb.setAttribute('mode', 'icons');
      tb.setAttribute("context","toolbar-context-menu");
      var vbox  = document.createXULElement('vbox');
    
       // document.getElementById('navigator-toolbox').parentNode.insertBefore(
       // vbox, document.getElementById('browser-bottombox'));
       // neu
    	 document.getElementById('browser').parentNode.appendChild(vbox);
    
      vbox.style.backgroundColor = '#ffe4c4';
      vbox.appendChild(tb);
    
      CustomizableUI.registerArea('new-toolbar', {legacy: true});
      CustomizableUI.registerToolbarNode(tb);
    
    })();
    Alles anzeigen

  • Seit gestern ist kein Button mehr zu sehen im Extras Config Menu-Script

    • Boersenfeger
    • 7. Oktober 2026 um 18:54

    Ich sehe dafür keine Notwendigkeit und verabschiede mich erstmal in den Urlaub. :)
    Diesen Beitrag habe ich als Lesezeichen abgelegt und guck mir das nach Rückkehr an.

  • Seit gestern ist kein Button mehr zu sehen im Extras Config Menu-Script

    • Boersenfeger
    • 7. Oktober 2026 um 18:33

    Treffer, versenkt!

    Vielen Dank! :):thumbup:

  • Seit gestern ist kein Button mehr zu sehen im Extras Config Menu-Script

    • Boersenfeger
    • 7. Oktober 2026 um 17:55

    Moin, im Script habe ich bereits die Änderung aus RE: Firefox beenden Warnung.uc.js funktioniert in Fx 159 nicht mehr eingebaut, leider ist der Button verschwunden.

    JavaScript
    // ==UserScript==
    // @name           extras_config_menu.uc.js
    // @compatibility  Firefox 135*.*
    // @include        main
    // @version        1.0.20250112
    // @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 den Pfad zum Texteditor eintragen (unter Ubuntu 10.04 z.B.: '/usr/bin/gedit'). Bei Fehleintrag wird view_source.editor.path ausgelesen:
      TextOpenExe: 'H:\\Notepad++\\notepad++.exe',
      // Falls gewuenscht, in Zeile 19 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: 'H:\\TotalCommander\\TOTALCMD64.exe',
      // 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: 'back-Button',
      // 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: 1,
      // 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:addons','about:cache','about:config','about:crashes','about:downloads','about:home','about:logins','about:memory','about:support','about:preferences','about:performance','about:profiles'],
      // Die normalen Firefox-Einstellungen auch zur Verfuegung stellen (0: nein, 1: ja):
      showNormalPrefs: 1,
      // Stellt "Skriptliste in Zwischenablage" zur Verfuegung (1: ja, 2: mit getrennter Nummerierung, 3: mit gemeinsamer Nummerierung) oder nicht (0):
      enableScriptsToClip: 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 (location.href !== 'chrome://browser/content/browser.xhtml') return;
        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 verschiebbaren Button anlegen
        /*  if  (window.__SSi == "window0") */ if (!window.gBrowser){
            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(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=);  \
    		 margin-top: 0px !important; \);  \
    		 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","Meine CSS-Dateien",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","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(this.enableRestart) menupopup.appendChild(this.createME("menuitem","Neustart",
        "Services.appinfo.invalidateCachesOnRestart(); Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit,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 = "Eigene Scripte ("+s+"):\n------------------------\n"+sArray.join("\n")+
                       "Eigene Scripte ("+x+"):\n-------------------------\n"+xArray.join("\n");
            break;
          default:
            retValue = "Eigene Scripte ("+s+"):\n------------------------";
            for (var i = 0; i < s ; i++) {
              j = i + 1;
              retValue = retValue + "\n" + j + ". " + sArray[i];
            }
            retValue = retValue + "Eigene Scripte ("+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(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

    In Zeile 59 ists geändert aber der Button bleibt verschwunden.

    Er sollte zwischen den Vor- und Zurückpfeil sein. Wo hakt es?

  • Umrandung für Adresszeile

    • Boersenfeger
    • 5. Oktober 2026 um 13:11

    2002Andreas vielen Dank, ich habs mir jetzt zurechtgebastelt. :thumbup:

    CSS
    /* URL-Bar und Suchleiste mit blauem Rand, aktiv mit rotem Rand */
    
        #urlbar > div {
        outline: 2px solid blue !important;
        border-radius: 20px !important;
    	}
    	
    	#urlbar > div:focus-within {
        outline: 2px solid red !important; 
        border-radius: 20px !important;
        }
    	
    	#searchbar-new {
        outline: 2px solid blue !important; 
        border-radius: 20px !important;
        }
    
        #searchbar-new > div:focus-within {
        outline: 2px solid red !important; 
        border-radius: 20px !important;
        }
    Alles anzeigen
  • Umrandung für Adresszeile

    • Boersenfeger
    • 4. Oktober 2026 um 15:29

    Moin, 2002Andreas , wie müsste der erweiterte Code aussehen, wenn auch die Extra-Suchleiste mit dem blauen Rand ausgestattet sein soll?

  • Was hört Ihr gerade?

    • Boersenfeger
    • 1. Oktober 2026 um 18:09

    😄

  • Was hört Ihr gerade?

    • Boersenfeger
    • 1. Oktober 2026 um 16:11

    Das Original

    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.
  • Anpassungen für Scripte

    • Boersenfeger
    • 30. September 2026 um 15:40

    Würde dir das helfen?

    JavaScript
    //Suchfeld automatisch leeren
    //Autor @BrokenHeart
    //https://www.camp-firefox.de/forum/thema/140164-suchfeld-hellblau-und-leert-sich-nicht-mehr-scriptfehler/?postID=1284188#post1284188
    
    (function() {
    	if (!window.gBrowser)
    		return;
    
    	//Settings ---->
    	const waitingToClear = 4000; //Zeitangabe für Löschen der Eingabe: [Wert] in ms oder [0] kein automisches Löschen. 
    	//<--- Settings
    
    	function clearSearchbar() {
    		let searchbar = document.getElementById('searchbar-new');
    	
    		if(searchbar) {
    			let textbox = searchbar.inputField;
    			textbox.addEventListener("keydown", function(event) {
    				if( event.key == "Enter" ) {
    					setTimeout( function() {
    						textbox.value = '';         
    					},500);
    				}
    			});
    			
    			var idTimeOut;
    			if(waitingToClear > 0) {
    				textbox.addEventListener('input', function() {
    					
    					let urlbarGoButton = document.querySelector("#searchbar-new .urlbar-go-button");
    					
    					if(urlbarGoButton) {
    						urlbarGoButton.hidden = false;
    					}
    					
    					clearTimeout(idTimeOut);
    					idTimeOut = setTimeout(function() {
    						textbox.value = '';
    						textbox.dispatchEvent(new KeyboardEvent("keydown", { bubbles: true, cancelable: true, keyCode: 27, code: "Escape" })); 
    						setTimeout( function() {
    							textbox.dispatchEvent(new KeyboardEvent("keydown", { bubbles: true, cancelable: true, keyCode: 27, code: "Escape" })); 
    							if(urlbarGoButton) {
    								urlbarGoButton.hidden = true;
    							}
    						},100);
    					},waitingToClear);
    				});
    			}
    		}
    	}
    	setTimeout(clearSearchbar,4000); 
    })();
    Alles anzeigen

    In Zeile 10 kann die Zeit angepasst werden. 1000 = 1 Sekunde, hier sind es 4

  • Was schaut ihr gerade?

    • Boersenfeger
    • 28. September 2026 um 15:09

    Wurde es aber nicht.... X(

  • Was schaut ihr gerade?

    • Boersenfeger
    • 24. September 2026 um 14:45

    The Specials 30th Anniversary Tour

    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.
  • Was schaut ihr gerade?

    • Boersenfeger
    • 23. September 2026 um 16:32

    The History of FUNK

    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.

Unterstütze uns!

Jährlich (2026)

76,1 %

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

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