Beiträge von Boersenfeger
-
-
-
-
-
Wenn ich aber auf einen Vorschlag aus dem Popup klicke, dann wird das Feld nicht geleert.
Hier erscheint kein PopUp und das ist auch so gewollt.
-
Oh, tut mir leid, ich habe keine Einschränkungen mit dem aus #4 , allerdings nutze ich noch 2 Scripte: searchEngineIcon.uc.js
JavaScript
Alles anzeigen// ==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"); }und SearchEngineWheelScroll.uc.js
JavaScript
Alles anzeigen// ==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"); }sowie ein kleines CSS,
Vielleicht hilfts.
-
Oh, ich habe dir die alte Version geschickt
JavaScript
Alles anzeigen//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); })();Besser?
-
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
Alles anzeigen/* 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); })();Funktioniert in 158 und 160
-
So ist es für mich völlig ausreichend! Vielen Dank!


Wenn jemand andere, neuere, angepasstere Vorschläge hat, gerne hier anbieten.
-
-
Mira_Belle Gerne per PN, falls es mich doch noch irgendwann erwischt

-
-
Moin, wir reden von dieser Erweiterung?
Sie funktioniert hier bisher einwandfrei ohne Bezahlung in Nightly....
-
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
Alles anzeigen/* 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); })(); -
-
-
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
Alles anzeigen// ==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();In Zeile 59 ists geändert aber der Button bleibt verschwunden.

Er sollte zwischen den Vor- und Zurückpfeil sein. Wo hakt es?
-
2002Andreas vielen Dank, ich habs mir jetzt zurechtgebastelt.
CSS
Alles anzeigen/* 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; } -
Moin, 2002Andreas , wie müsste der erweiterte Code aussehen, wenn auch die Extra-Suchleiste mit dem blauen Rand ausgestattet sein soll?
-
