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

Beiträge von Endor

  • UserCSSLoader (2025)

    • Endor
    • 24. August 2025 um 08:31

    Hallo Speravir .
    Danke für Deine neue Version.
    Funktioniert soweit gut. Ein Hinweis:
    Tastaturkürzel zum Importieren von Stilen funktioniert nur mit Alt+R.
    Bei Alt+I tut sich nichts.

    Mfg.
    Endor

  • Skript VerticalToolbar.uc.js funktioniert in neu erstellten Profilen nicht mehr richtig

    • Endor
    • 24. August 2025 um 08:26

    Halo zusammen.
    Ich habe genau das selbe Problem seit Firefox 144 Nightly.

    JavaScript
    (function() {
    /*******************************************************************************/
    
    
        if (location != 'chrome://browser/content/browser.xhtml') {
            return;
        }
    
    
    /*******************************************************************************/
    
        // Background Color
        var vb_bg_color = '#f6f6f6';
        // Border Color
        var vb_border_color = 'rgb(0,128,0)';
        // Number of columns
        var vb_cols = 1;
        // Visibility on Start
        var vb_visibilityOnStart = 1;
    
        // Button Icon, if Toolbar is visible
        vb_isVisibleImage = 'url("data:image/x-icon;base64,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")';
        // Button Icon, if Toolbar is hidden
        vb_isHiddenImage = 'url("data:image/x-icon;base64,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")';
    
    
    /*******************************************************************************/
    
    
        var vb_h = window.outerHeight;
        var vb_minH = vb_h/20;
        var vb_maxH = vb_h/1;
        var vb_width = 40;
        var vb_totalwidth = vb_cols * vb_width;
    
    
    	var vb_style = '\
    	box-sizing: content-box !important; \
    	background-color: ' + vb_bg_color + ' !important; \
    	min-width: ' + vb_totalwidth + 'px !important; \
    	max-width: ' + vb_totalwidth + 'px !important; \
    	min-height: ' + vb_minH + 'px !important; \
    	max-height: ' + vb_maxH + 'px !important; \
    	position: absolute !important; \
    	right: 17px !important; \
    	padding: 5px 0 !important; \
    	border: 2px ridge ' + vb_border_color + '; \
    	border-radius: 10px !important; \
    	z-index: 1 !important; \
    	';
    
        var vb_element = document.getElementById('navigator-toolbox');
        var vb_toolbar = document.createElement('toolbar');
        vb_toolbar.id = 'fp-toolbar';
        vb_toolbar.setAttribute('customizable', true);
        vb_toolbar.setAttribute('mode', 'icons');
        vb_toolbar.setAttribute('style', vb_style);    
        vb_element.appendChild( vb_toolbar );
        vb_toolbar.setAttribute('collapsed', false);        
    
    
        CustomizableUI.registerArea( 'fp-toolbar' , { legacy: true } );
        CustomizableUI.registerToolbarNode(vb_toolbar);
    
    
        setTimeout(function(){ 
            var tmp_positionInfo = vb_toolbar.getBoundingClientRect();
            var tmp_height = tmp_positionInfo.height;
            var vb_ptop = ( vb_h - tmp_height ) / 2; 
            vb_toolbar.style.top = vb_ptop + 'px';
    
            if( vb_visibilityOnStart == 0 ) {
                vb_toolbar.setAttribute('collapsed', true);
            }
        }, 500);    
    
    
    /*******************************************************************************/
    
    
        try {
            ChromeUtils.importESModule("resource:///modules/CustomizableUI.sys.mjs");
            CustomizableUI.createWidget({
                id: "fp-toggle-toolbar",
                defaultArea: CustomizableUI.AREA_NAVBAR,
                removable: true,
                label: "Vertical Toolbar",
                tooltiptext: "Vertical Toolbar",
                            onClick: function() {
                    var node = document.getElementById('fp-toolbar');
                    var isCollapsed = node.getAttribute('collapsed');
                    if( isCollapsed == 'false' ) {
                        node.setAttribute( 'collapsed' , 'true' );
                        node.style.visibility = 'collapse';
                        document.getElementById(this.id).style.listStyleImage = vb_isHiddenImage;
                    } else {
                        node.setAttribute( 'collapsed' , 'false' );
                        node.style.visibility = 'visible';
                        document.getElementById(this.id).style.listStyleImage = vb_isVisibleImage;
                    }
                },
                onCreated: function(aNode) {
                    if( vb_visibilityOnStart == 1 ) {
                        aNode.style.listStyleImage = vb_isVisibleImage;
                    } else {
                        aNode.style.listStyleImage = vb_isHiddenImage;
                    }
                    return aNode;
                }
            });
        } catch (e) {
            Components.utils.reportError(e);
        };
    
    
    /*******************************************************************************/
    })();
    Alles anzeigen

    Verwende aber keinen zusätzlichen CSS Code.
    Habt Ihr eine Idee woran es liegt?

    Mfg.
    Endor

  • UserCSSLoader (2025)

    • Endor
    • 23. August 2025 um 10:55
    Zitat von Mira_Belle

    aber leider nur, wenn let position = 0;!

    Ja das kann ich bestätigen. Ist hier auch so.
    Das könnte aber schon länger nicht mehr funktioniert haben,
    Da nicht verwendet auch nie getestet.

    Zitat von Mira_Belle

    Editor im Firefox hinterlegt

    Das mit dem hinterlegten Pfad ist bei einigen Scripten so gemacht.
    Mich persönlich stört das nicht. Aber da hat sicher jeder seine
    eigene Vorstellung darüber.
    Mfg.
    Endor

  • UserCSSLoader (2025)

    • Endor
    • 23. August 2025 um 08:32

    Hallo Mira_Belle .
    Verwendest Du den CSS Code für die Symbolleistenschaltfläche?
    Den muss du deaktivieren dann steht CSS an der Stelle.

    Mfg.
    Endor

  • UserCSSLoader (2025)

    • Endor
    • 23. August 2025 um 08:13

    Hallo bege
    Vielen Dank nun funktioniert weder alles.
    :thumbup::thumbup:

    Speravir
    Version von Bege funktioniert hier einwandfrei.
    Alles funktioniert wieder wie es soll.
    Sobald du das OK gibst lade ich die dann bei mir hoch.

    Mfg.
    Endor

  • UserCSSLoader (2025)

    • Endor
    • 22. August 2025 um 09:36

    Hallo Speravir.
    Dieser Tippfehler ist schon in der ersten Version dieses Scripts,
    also vor 14 Jahren enthalten. Hatte sogar Aborix diesbezüglich
    mal gefragt ob man das ändern müsste er sagte da spezifiziert nicht nötig.

    Deine Version oben ist prima. Funktioniert soweit alles.
    :thumbup::thumbup:
    Eine Frage dazu noch, in unserem Original konnte man auch mit
    Mittelklick auf die Schaltfläche die Stile importieren. Das geht weder
    bei der von mir noch bei Deiner Version. Ließe sich das eventuell
    noch einbauen. Das hatte Aborix seinerzeit auch eingefügt.

    Mfg.
    Endor

  • UserCSSLoader (2025)

    • Endor
    • 18. August 2025 um 18:12

    Kann gar nicht sein, denn er hat nur oben den Konfigurationsteil eingebaut.
    Die dazu gehörenden Funktionen aber nicht. Wie soll es dann gehen?
    Mfg.
    Endor

  • UserCSSLoader (2025)

    • Endor
    • 18. August 2025 um 13:15

    Hallo 2002Andreas.
    Vielen Dank!!!
    Damit funktioniert es hier auch wieder.
    Klasse!!!
    Mfg.
    Endor

  • UserCSSLoader (2025)

    • Endor
    • 18. August 2025 um 12:53

    Nein. Was fehlt steht ja im erwähnten Beitrag .
    Ansonsten funktioniert das Script einwandfrei.
    Funktioniert das Script extraconfigmenu.uc.js bei Dir
    ohne CSP zu deaktivieren noch? Weil bei mir wird alles angezeigt
    aber bei klick tut sich nichts. Egal ob mit oder ohne CSP.

    Mfg.
    Endor

  • UserCSSLoader (2025)

    • Endor
    • 18. August 2025 um 12:09

    Boersenfeger

    Ab Firefox 142 das Script lädt die Stile aber bei klick im Popupmenü tut sich nichts mehr.
    Bei meiner Version oben schon.

  • UserCSSLoader (2025)

    • Endor
    • 18. August 2025 um 10:16

    Ja das Script ist schon sehr alt.
    Wurde von vielen Leuten nur aktualisiert damit es läuft.
    Griever siehe hier:

    GitHub - Griever/userChromeJS
    Contribute to Griever/userChromeJS development by creating an account on GitHub.
    github.com

    Ist aber schon lange nichts mehr los da.
    Er hat das Script am 23.12.2012 zuletzt aktualisiert.

    Von hier habe ich die Datei runter geladen:

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

    Mfg.
    Endor

  • UserCSSLoader (2025)

    • Endor
    • 17. August 2025 um 17:52
    Zitat von Mira_Belle

    Und "Oktale Literale sind nicht zulässig. Verwenden Sie die Syntax "0o664"."

    Alles Böhmische Dörfer für mich :rolleyes:
    Ich habe ja nur ein Script vom japanischen Portal
    runter geladen und die Schaltfläche eingebaut, auch nur den Code
    aus unserem Script an passende Stellen eingefügt usw.
    Dass das überhaupt funktioniert ist für mich schon ein Wunder...
    Mfg.
    Endor

  • UserCSSLoader (2025)

    • Endor
    • 17. August 2025 um 16:59

    Hallo Mira_Belle !

    Also im Menü oben siehst auch den Eintrag zum öffnen des CSS Ordners.
    Darunter sollte auch der Eintrag zum öffnen des Chrome Ordners hin.

  • UserCSSLoader (2025)

    • Endor
    • 17. August 2025 um 11:25

    Hallo zusammen. Speravir , BrokenHeart , Mira_Belle, milupo , 2002Andreas
    Habe eine funktionierende Version vom usercssloader.uc.js auf Basis einer
    Version aus den asiatischen Tiefen gemacht.
    Hat wie gehabt frei verschiebbare Schaltfläche usw. Funktioniert auch
    in Firefox 143 unabhängig ob CSP aktiviert ist oder nicht.
    Im Moment fehlt noch der Eintrag zum öffnen des Chromeordners
    und die Möglichkeit zur Verwendung eines alternativen Dateimanagers.
    Also anstelle vom Explorer zbs. den Totalcomander.
    Ich habe es versucht einzubauen, durch einfügen der entsprechenden Teile
    aus unserem Script, aber dann funktioniert es nicht mehr.
    Vielleicht kann jemand von euch sich das mal anschauen:

    HTML
    // ==UserScript==
    // @name           UserCSSLoader
    // @description    CSS-Codes - Styles laden und verwalten
    // @namespace      http://d.hatena.ne.jp/Griever/
    // @author         Griever
    // @include        main
    // @license        MIT License
    // @compatibility  Firefox 141+
    // @charset        UTF-8
    // @version        0.0.4r4
    // @note           0.0.4r4 prevent close menu when middleclick
    // @note           0.0.4r3 Fx92: getURLSpecFromFile() -> getURLSpecFromActualFile()
    // @note           0.0.4r2 AUTHOR_SHEET-Unterstützung hinzugefügt, wichtig: Dateiendung muss .author.css sein!
    // @note           0.0.4 Remove E4X
    // @note           CSS Entry-Klasse erstellt
    // @note           Style-Test-Funktion überarbeitet
    // @note           Wenn die Datei gelöscht wurde, CSS beim Neu-Erstellen und Löschen des Menüs abbrechen
    // @note           uc einlesen .uc.css temporäre Korrespondenz zum erneuten Lesen
    // ==/UserScript==
    /****** Bedienungsanleitung ******
    
    CSS-Ordner im Chrome-Ordner erstellen, CSS-Dateien dort ablegen - speichern.
    Diejenigen, deren Dateiname mit "xul-" beginnen, diejenigen, die mit ".as.css" enden, sind AGENT_SHEET, 
    alle anderen außer USER_SHEET werden gelesen. Da der Inhalt der Datei nicht überprüft wird,
    darauf achten, die Angabe von @namespace nicht zu vergessen!
    
    Schaltfläche wird in Navigationsleiste eingefügt
    Linksklick auf Stil, zum aktivieren/deaktivieren
    Mittelklick auf Stil zum aktivieren/deaktivieren, ohne Menü zu schließen
    Rechtsklick auf Stil zum Öffnen im Editor
    Strg+Linksklick zum Anzeigen im Dateimanager
    
    Verwenden des in "view_source.editor.path" angegebenen Editors
    Dateiordner kann in Konfiguration geändert werden
    
     **** Anleitung Ende ****/
    
    (function(){
    	
    let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
     
    // Wenn beim Start ein weiteres Fenster (zweites Fenster) vorhanden ist, beenden
    let list = Services.wm.getEnumerator("navigator:browser");
    while(list.hasMoreElements()){ if(list.getNext() != window) return; }
    
    if (window.UCL) {
    	window.UCL.destroy();
    	delete window.UCL;
    }
    const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
    
    window.UCL = {
    	USE_UC		: "UC" in window,
    	AGENT_SHEET	: Ci.nsIStyleSheetService.AGENT_SHEET,
    	USER_SHEET 	: Ci.nsIStyleSheetService.USER_SHEET,
    	AUTHOR_SHEET: Ci.nsIStyleSheetService.AUTHOR_SHEET,
    	readCSS    	: {},
    	get disabled_list() {
    		let obj = [];
    		try {
    			obj = decodeURIComponent(this.prefs.getCharPref("disabled_list")).split("|");
    		} catch(e) {}
    		delete this.disabled_list;
    		return this.disabled_list = obj;
    	},
    	get prefs() {
    		delete this.prefs;
    		return this.prefs = Services.prefs.getBranch("UserCSSLoader.")
    	},
    	get styleSheetServices(){
    		delete this.styleSheetServices;
    		return this.styleSheetServices = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
    	},
    	get FOLDER() {
    		let aFolder;
    		try {
    			// UserCSSLoader.FOLDER verwenden
    			let folderPath = this.prefs.getCharPref("FOLDER");
    			aFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile)
    			aFolder.initWithPath(folderPath);
    		} catch (e) {
    			aFolder = Services.dirsvc.get("UChrm", Ci.nsIFile);
    			aFolder.appendRelativePath("CSS");
    		}
    		if (!aFolder.exists() || !aFolder.isDirectory()) {
    			aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664);
    		}
    		delete this.FOLDER;
    		return this.FOLDER = aFolder;
    	},
    		
    	getFocusedWindow: function() {
    		let win = document.commandDispatcher.focusedWindow;
    		if (!win || win == window) win = content;
    		return win;
    	},
    
    	init: function() {
    		const cssmenu = $C("menu", {
    			id: "usercssloader-menu",
    			tooltiptext: "UserCSSLoader\n\nLinksklick: Stylesheets anzeigen\nMittelklick: Styles importieren",
    			label: "CSS",
    			accesskey: "C"
    		});
    		const menupopup = $C("menupopup", {
    			id: "usercssloader-menupopup"
    		});
    		cssmenu.appendChild(menupopup);
    
    		let menu = $C("menu", {
    			label: "Style-Loader-Menü",
    			id: "style-loader-menu",
    			accesskey: "y"
    		});
    		menupopup.appendChild(menu);
    		let mp = $C("menupopup", { id: "usercssloader-submenupopup" });
    		menu.appendChild(mp);
    		let rebuildItem = $C("menuitem", {
    			label: "Styles importieren",
    			accesskey: "R",
    			acceltext: "Alt + R",
    		});
    		rebuildItem.addEventListener("command", () => UCL.rebuild());
    		mp.appendChild(rebuildItem);
    		mp.appendChild($C("menuseparator"));
    		let createCSS = $C("menuitem", {
    			label: "CSS-Datei erstellen",
    			accesskey: "E",
    		});
    		createCSS.addEventListener("command", () => UCL.create());
    		mp.appendChild(createCSS);
    		let openFolder = $C("menuitem", {
    			label: "CSS-Ordner öffnen",
    			accesskey: "O",
    		});
    		openFolder.addEventListener("command", () => UCL.openFolder());
    		mp.appendChild(openFolder);
    		let editChromeItem = $C("menuitem", {
    			label: "userChrome.css bearbeiten",
    			//hidden: false,
    		});
    		editChromeItem.addEventListener("command", () => UCL.editUserCSS("userChrome.css"));
    		mp.appendChild(editChromeItem);
    		let editContentItem = $C("menuitem", {
    			label: "userContent.css bearbeiten",
    			//hidden: false,
    		});
    		editContentItem.addEventListener("command", () => UCL.editUserCSS("userContent.css"));
    		mp.appendChild(editContentItem);
    		
    		let styleTestChrome = $C("menuitem", {
    			label: "Stil Testen (Chrome)",
    			id: "usercssloader-test-chrome",
    			hidden: true,
    			accesskey: "C",
    		});
    		styleTestChrome.addEventListener("command", () => UCL.styleTest("window"));
    		mp.appendChild(styleTestChrome);
    		let styleTest = $C("menuitem", {
    			label: "Stil Testen(Webseiten)",
    			id: "usercssloader-test-content",
    			hidden: true,
    			accesskey: "W",
    		});
    
    		menu = $C("menu", {
    			label: ".uc.css",
    			accesskey: "U",
    			hidden: !UCL.USE_UC
    		});
    		menupopup.appendChild(menu);
    		mp = $C("menupopup", { id: "usercssloader-ucmenupopup" });
    		menu.appendChild(mp);
    		let UCrebuild = $C("menuitem", {
    			label: "Importieren(.uc.js)",
    		});
    		UCrebuild.addEventListener("command", () => UCL.UCrebuild());
    		mp.appendChild(UCrebuild);
    		mp.appendChild($C("menuseparator", { id: "usercssloader-ucsepalator" }));
    
    		
    		CustomizableUI.createWidget({
    			id: 'usercssloader-menu-item',
    			type: 'custom',
    			defaultArea: CustomizableUI.AREA_NAVBAR,
    			onBuild: function(aDocument) {
    				let toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbaritem');
    				toolbaritem.id = 'usercssloader-menu-item';
    				toolbaritem.className = 'chromeclass-toolbar-additional';
    				return toolbaritem;
    			}
    		});
    		$('usercssloader-menu-item').appendChild(cssmenu);
    
    		let key = $C("key", {
    			id: "usercssloader-rebuild-key",
    			key: "R",
    			modifiers: "alt",
    		});
    		key.addEventListener("command", () => UCL.rebuild());
    		$("mainKeyset").appendChild(key);
    
    		this.rebuild();
    		this.initialized = true;
    		if (UCL.USE_UC) {
    			setTimeout(function() {
    				UCL.UCcreateMenuitem();
    			}, 1000);
    		}
    		window.addEventListener("unload", this, false);
    	},
    	uninit: function() {
    		const dis = [];
    		for (let x of Object.keys(this.readCSS)) {
    			if (!this.readCSS[x].enabled)
    				dis.push(x);
    		}
    		this.prefs.setCharPref("disabled_list", encodeURIComponent(dis.join("|")));
    		window.removeEventListener("unload", this, false);
    	},
    	destroy: function() {
    		var i = document.getElementById("usercssloader-menu");
    		if (i) i.parentNode.removeChild(i);
    		var i = document.getElementById("usercssloader-rebuild-key");
    		if (i) i.parentNode.removeChild(i);
    		this.uninit();
    	},
    	handleEvent: function(event) {
    		switch(event.type){
    			case "unload": this.uninit(); break;
    		}
    	},
    	rebuild: function() {
    		let ext = /\.css$/i;
    		let not = /\.uc\.css/i;
    		let files = this.FOLDER.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
    
    		while (files.hasMoreElements()) {
    			let file = files.getNext().QueryInterface(Ci.nsIFile);
    			if (!ext.test(file.leafName) || not.test(file.leafName)) continue;
    			let CSS = this.loadCSS(file);
    			CSS.flag = true;
    		}
    		for (let leafName of Object.keys(this.readCSS)) {
    			const CSS = this.readCSS[leafName];
    			if (!CSS.flag) {
    				CSS.enabled = false;
    				delete this.readCSS[leafName];
    			}
    			delete CSS.flag;
    			this.rebuildMenu(leafName);
    		}
    		if (this.initialized) {
    			if (typeof(StatusPanel) !== "undefined")
    				StatusPanel._label = "Styles importiert";
    			else
    				XULBrowserWindow.statusTextField.label = "Styles importiert";
    		}
    	},
    	loadCSS: function(aFile) {
    		var CSS = this.readCSS[aFile.leafName];
    		if (!CSS) {
    			CSS = this.readCSS[aFile.leafName] = new CSSEntry(aFile);
    			if (this.disabled_list.indexOf(CSS.leafName) === -1) {
    				CSS.enabled = true;
    			}
    		} else if (CSS.enabled) {
    			CSS.enabled = true;
    		}
    		return CSS;
    	},
    	rebuildMenu: function(aLeafName) {
    		var CSS = this.readCSS[aLeafName];
    		var menuitem = document.getElementById("usercssloader-" + aLeafName);
    		if (!CSS) {
    			if (menuitem)
    				menuitem.parentNode.removeChild(menuitem);
    			return;
    		}
    
    		if (!menuitem) {
    			menuitem = $C("menuitem", {
    				label		: aLeafName,
    				id			: "usercssloader-" + aLeafName,
    				class		: "usercssloader-item " + (CSS.SHEET == this.AGENT_SHEET? "AGENT_SHEET" : CSS.SHEET == this.AUTHOR_SHEET? "AUTHOR_SHEET": "USER_SHEET"),
    				type		: "checkbox",
    				autocheck	: "false",
    			});
    			menuitem.addEventListener("command", () => { UCL.toggle(aLeafName); });
    			menuitem.addEventListener("mouseup", (event) => { if (event.button === 1) event.preventDefault(); });
    			menuitem.addEventListener("click", (event) => { UCL.itemClick(event); });
    			document.getElementById("usercssloader-menupopup").appendChild(menuitem);
    		}
    		menuitem.setAttribute("checked", CSS.enabled);
    	},
    	toggle: function(aLeafName) {
    		var CSS = this.readCSS[aLeafName];
    		if (!CSS) return;
    		CSS.enabled = !CSS.enabled;
    		this.rebuildMenu(aLeafName);
    	},
    	itemClick: function(event) {
    		if (event.button == 0) return;
    
    		event.preventDefault();
    		event.stopPropagation();
    		let label = event.currentTarget.getAttribute("label");
    
    		if (event.button == 1) {
    			this.toggle(label);
    		}
    		else if (event.button == 2) {
    			closeMenus(event.target);
    			this.edit(this.getFileFromLeafName(label));
    		}
    	},
    	getFileFromLeafName: function(aLeafName) {
    		let f = this.FOLDER.clone();
    		f.QueryInterface(Ci.nsIFile); // use appendRelativePath
    		f.appendRelativePath(aLeafName);
    		return f;
    	},
    	styleTest: function(aWindow) {
    		aWindow || (aWindow = this.getFocusedWindow());
    		new CSSTester(aWindow, function(tester){
    			if (tester.saved)
    				UCL.rebuild();
    		});
    	},
    
    	openFolder: function() {
    		this.FOLDER.launch();
    	},
    	
    	editUserCSS: function(aLeafName) {
    		let file = Services.dirsvc.get("UChrm", Ci.nsIFile);
    		file.appendRelativePath(aLeafName);
    		this.edit(file);
    	},
    	edit: function(aFile) {
    		var editor = Services.prefs.getCharPref("view_source.editor.path");
    		if (!editor) return alert("Unter about:config den vorhandenen Schalter:\n view_source.editor.path mit dem Editorpfad ergänzen");
    		try {
    			var UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
    			UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8";
    			var path = UI.ConvertFromUnicode(aFile.path);
    			var app = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
    			app.initWithPath(editor);
    			var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
    			process.init(app);
    			process.run(false, [path], 1);
    		} catch (e) {}
    	},
    	create: function(aLeafName) {
    		if (!aLeafName) aLeafName = prompt("Name des Styles", dateFormat(new Date(), "%Y_%m%d_%H%M%S"));
    		if (aLeafName) aLeafName = aLeafName.replace(/\s+/g, " ").replace(/[\\/:*?\"<>|]/g, "");
    		if (!aLeafName || !/\S/.test(aLeafName)) return;
    		if (!/\.css$/.test(aLeafName)) aLeafName += ".css";
    		let file = this.getFileFromLeafName(aLeafName);
    		this.edit(file);
    	},
    	UCrebuild: function() {
    		let re = /^file:.*\.uc\.css(?:\?\d+)?$/i;
    		let query = "?" + new Date().getTime();
    		Array.slice(document.styleSheets).forEach(function(css){
    			if (!re.test(css.href)) return;
    			if (css.ownerNode) {
    				css.ownerNode.parentNode.removeChild(css.ownerNode);
    			}
    			let pi = document.createProcessingInstruction('xml-stylesheet','type="text/css" href="'+ css.href.replace(/\?.*/, '') + query +'"');
    			document.insertBefore(pi, document.documentElement);
    		});
    		UCL.UCcreateMenuitem();
    	},
    	UCcreateMenuitem: function() {
    		let sep = $("usercssloader-ucsepalator");
    		let popup = sep.parentNode;
    		if (sep.nextSibling) {
    			let range = document.createRange();
    			range.setStartAfter(sep);
    			range.setEndAfter(popup.lastChild);
    			range.deleteContents();
    			range.detach();
    		}
    
    		let re = /^file:.*\.uc\.css(?:\?\d+)?$/i;
    		Array.slice(document.styleSheets).forEach(function(css) {
    			if (!re.test(css.href)) return;
    			let fileURL = decodeURIComponent(css.href).split("?")[0];
    			let aLeafName = fileURL.split("/").pop();
    			let m = $C("menuitem", {
    				label		: aLeafName,
    				tooltiptext	: fileURL,
    				id			: "usercssloader-" + aLeafName,
    				type		: "checkbox",
    				autocheck	: "false",
    				checked		: "true",
    			});
    			m.css = css;
    			m.addEventListener("command", function() {
    				this.setAttribute("checked", !(this.css.disabled = !this.css.disabled));
    			});
    			m.addEventListener("mouseup", function(event) {
    				if (event.button === 1) event.preventDefault();
    			});
    			m.addEventListener("click", function(event) {
    				UCL.UCItemClick(event);
    			});
    			popup.appendChild(m);
    		});
    	},
    	UCItemClick: function(event) {
    		if (event.button == 0) return;
    		event.preventDefault();
    		event.stopPropagation();
    
    		if (event.button == 1) {
    			event.target.doCommand();
    		}
    		else if (event.button == 2) {
    			closeMenus(event.target);
    			let fileURL = event.currentTarget.getAttribute("tooltiptext");
    			let file = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getFileFromURLSpec(fileURL);
    			this.edit(file);
    		}
    	},
    };
    
    function CSSEntry(aFile) {
    	this.path = aFile.path;
    	this.leafName = aFile.leafName;
    	this.lastModifiedTime = 1;
    	this.SHEET = /^xul-|\.as\.css$/i.test(this.leafName) ?
    		Ci.nsIStyleSheetService.AGENT_SHEET:
    		/\.author\.css$/i.test(this.leafName)?
    			Ci.nsIStyleSheetService.AUTHOR_SHEET:
    			Ci.nsIStyleSheetService.USER_SHEET;
    }
    CSSEntry.prototype = {
    	sss: Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService),
    	_enabled: false,
    	get enabled() {
    		return this._enabled;
    	},
    	set enabled(isEnable) {
    		var aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile)
    		aFile.initWithPath(this.path);
    
    		var isExists = aFile.exists(); // true, wenn die Datei bereits existiert
    		var lastModifiedTime = isExists ? aFile.lastModifiedTime : 0;
    		var isForced = this.lastModifiedTime != lastModifiedTime; //true, wenn es eine Änderung in der Datei gibt
    
    		var fileURL = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getURLSpecFromActualFile(aFile);
    		var uri = Services.io.newURI(fileURL, null, null);
    
    		if (this.sss.sheetRegistered(uri, this.SHEET)) {
    			// Wenn diese Datei bereits gelesen wurde
    			if (!isEnable || !isExists) {
    				this.sss.unregisterSheet(uri, this.SHEET);
    			}
    			else if (isForced) {
    				// Nach Stornierung erneut einlesen
    				this.sss.unregisterSheet(uri, this.SHEET);
    				this.sss.loadAndRegisterSheet(uri, this.SHEET);
    			}
    		} else {
    			// Datei wurde nicht gelesen
    			if (isEnable && isExists) {
    				this.sss.loadAndRegisterSheet(uri, this.SHEET);
    			}
    		}
    		if (this.lastModifiedTime !== 1 && isEnable && isForced) {
    			log(this.leafName + " wurde aktualisiert");
    		}
    		this.lastModifiedTime = lastModifiedTime;
    		return this._enabled = isEnable;
    	},
    };
    
    function CSSTester(aWindow, aCallback) {
    	this.win = aWindow || window;
    	this.doc = this.win.document;
    	this.callback = aCallback;
    	this.init();
    }
    CSSTester.prototype = {
    	sss: Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService),
    	preview_code: "",
    	saved: false,
    	init: function() {
    		this.dialog = openDialog(
    			"data:text/html;charset=utf8,"+encodeURIComponent('<!DOCTYPE HTML><html lang="ja"><head><title>CSSTester</title></head><body></body></html>'),
    			"",
    			"width=550,height=400,dialog=no");
    		this.dialog.addEventListener("load", this, false);
    	},
    	destroy: function() {
    		this.preview_end();
    		this.dialog.removeEventListener("unload", this, false);
    		this.previewButton.removeEventListener("click", this, false);
    		this.saveButton.removeEventListener("click", this, false);
    		this.closeButton.removeEventListener("click", this, false);
    	},
    	handleEvent: function(event) {
    		switch(event.type) {
    			case "click":
    				if (event.button != 0) return;
    				if (this.previewButton == event.currentTarget) {
    					this.preview();
    				}
    				else if (this.saveButton == event.currentTarget) {
    					this.save();
    				}
    				else if (this.closeButton == event.currentTarget) {
    					this.dialog.close();
    				}
    				break;
    			case "load":
    				var doc = this.dialog.document;
    				doc.body.innerHTML = '\
    					<style type="text/css">\
    						:not(input):not(select) { padding: 0px; margin: 0px; }\
    						table { border-spacing: 0px; }\
    						body, html, #main, #textarea { width: 100%; height: 100%; }\
    						#textarea { font-family: monospace; }\
    					</style>\
    					<table id="main">\
    						<tr height="100%">\
    							<td colspan="4"><textarea id="textarea"></textarea></td>\
    						</tr>\
    						<tr height="40">\
    							<td><input type="button" value="Preview" /></td>\
    							<td><input type="button" value="Save" /></td>\
    							<td width="80%"><span class="log"></span></td>\
    							<td><input type="button" value="Close" /></td>\
    						</tr>\
    					</table>\
    				';
    				this.textbox = doc.querySelector("textarea");
    				this.previewButton = doc.querySelector('input[value="Preview"]');
    				this.saveButton = doc.querySelector('input[value="Save"]');
    				this.closeButton = doc.querySelector('input[value="Close"]');
    				this.logField = doc.querySelector('.log');
    
    				var code = "@namespace url(" + this.doc.documentElement.namespaceURI + ");\n";
    				code += this.win.location.protocol.indexOf("http") === 0?
    					"@-moz-document domain(" + this.win.location.host + ") {\n\n\n\n}":
    					"@-moz-document url(" + this.win.location.href + ") {\n\n\n\n}";
    				this.textbox.value = code;
    				this.dialog.addEventListener("unload", this, false);
    				this.previewButton.addEventListener("click", this, false);
    				this.saveButton.addEventListener("click", this, false);
    				this.closeButton.addEventListener("click", this, false);
    
    				this.textbox.focus();
    				let p = this.textbox.value.length - 3;
    				this.textbox.setSelectionRange(p, p);
    
    				break;
    			case "unload":
    				this.destroy();
    				this.callback(this);
    				break;
    		}
    	},
    	preview: function() {
    		var code = this.textbox.value;
    		if (!code || !/\:/.test(code))
    			return;
    		code = "data:text/css;charset=utf-8," + encodeURIComponent(this.textbox.value);
    		if (code == this.preview_code)
    			return;
    		this.preview_end();
    		var uri = Services.io.newURI(code, null, null);
    		this.sss.loadAndRegisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET);
    		this.preview_code = code;
    		this.log("Preview");
    	},
    	preview_end: function() {
    		if (this.preview_code) {
    			let uri = Services.io.newURI(this.preview_code, null, null);
    			this.sss.unregisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET);
    			this.preview_code = "";
    		}
    	},
    	save: function() {
    		var data = this.textbox.value;
    		if (!data) return;
    
    		var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
    		fp.init(window, "", Ci.nsIFilePicker.modeSave);
    		fp.appendFilter("CSS Files","*.css");
    		fp.defaultExtension = "css";
    		if (window.UCL)
    			fp.displayDirectory = UCL.FOLDER;
    		var res = fp.show();
    		if (res != fp.returnOK && res != fp.returnReplace) return;
    
    		var suConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
    		suConverter.charset = "UTF-8";
    		data = suConverter.ConvertFromUnicode(data);
    		var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
    		foStream.init(fp.file, 0x02 | 0x08 | 0x20, 0664, 0);
    		foStream.write(data, data.length);
    		foStream.close();
    		this.saved = true;
    	},
    	log: function() {
    		this.logField.textContent = dateFormat(new Date(), "%H:%M:%S") + ": " + $A(arguments);
    	}
    };
    
    UCL.init();
    
    function $(id) { return document.getElementById(id); }
    function $A(arr) { return Array.slice(arr); }
    function $C(name, attr) {
    	const el = document.createElementNS(XULNS, name);
    	if (attr) Object.keys(attr).forEach(function(n) { el.setAttribute(n, attr[n]) });
    	return el;
    }
    function dateFormat(date, format) {
    	format = format.replace("%Y", ("000" + date.getFullYear()).substr(-4));
    	format = format.replace("%m", ("0" + (date.getMonth()+1)).substr(-2));
    	format = format.replace("%d", ("0" + date.getDate()).substr(-2));
    	format = format.replace("%H", ("0" + date.getHours()).substr(-2));
    	format = format.replace("%M", ("0" + date.getMinutes()).substr(-2));
    	format = format.replace("%S", ("0" + date.getSeconds()).substr(-2));
    	return format;
    }
    
    function log(mes) { console.log(mes); }
    })();
    Alles anzeigen

    Hoffe jemand von euch kann da weiter helfen.

    CSS Code für Schaltfläche:

    CSS
    @namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
    @-moz-document url(chrome://browser/content/browser.xhtml){
    	
    #usercssloader-menu {
    appearance:none!important;
    margin-right: 0px !important;
    margin-left: 1px !important;
    min-width: 18px !important;
    background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAADJklEQVR4Xi3Pb0yVdRjG8e%2Fze57ncDrAOWwRhDQ7xYAMlAgIBW2txaio5TvMzZa68oWtzRdKbXbIpWyOzcWLWqXkFjUtsIksW72wuTVx%2BEJHCxhkSCNoKLYDwuH8e66eNV98dr24t%2Fu%2BLwsAoKsucqg4tFS4kiTtge4PFAkRksADGdsyua4JXJ7ITH0yQw%2BABTB3sHGipGNjJX8MgzGw6oEBQi5kPYinQBYEbDDAX5PEulJXPhqn2bQE2Fayfa2S8THOfu%2FwzTkDzmOQV8nAkOHMoIFgmS9K3w%2Fi5DmP1fwqdrbRFIR6euqJ6btc2Y4jsGWM0emOWrU2FAtQRTSiid7n9EJtkQCVlebrUle9lnuLVA3v09%2FG8diLCFxp%2BDVprF2a2KHqsrACtqVbQy9L8T2qq4goaKOpz5uka22Kn1yn2gBHOPMSx9o3obJokbS8R%2Fp3txTfK918Q%2B2tjwrQYPcWaW6Xdj5fKkB9B2uks%2Bv1VICYSWXQjia4eWuB8z2%2F0%2F%2FpGMMD04yP3qFzfzXBoE3sszGmR27Tubuc3KDDsf4ZsME2iO4GjuqXQh1orxDwv1OxBsX2VQlQcWGObnzdog%2F3bhCg0uIHNPLFVqnf%2F8DlA2ctDSTgxNFnOHFgE7jAg7kQcjnS8TRgQcCiprGQzncrIZ0i%2Fu0so7lLODlgsh6QSMNCAix8BhJJNH6b5NwyFNhwLwWuB%2FNxEoemudi9wMT8Cq4LBrDwgLUULK%2FBPR9%2BjC4ytPUC17%2F8DR6CpYEplt%2BeJTX7OH9HbEL5NvKwjGvj4AHprC8DSZ%2B%2FzHJgI%2BuI%2BxdvbL9E%2BJRLJr%2BSr5LXKd8foqY8QjqN7fxzlzhaAy8LGYHnQTxJ3hNhFlptCi4XsP7PEoaD4mr4KlveeZjNG4qYvDbKyipJolCXOI70U630Y6uvRfrZzyuvSKOvavK9Kp2OFqv3zagWLzb7s21aubBZ519HFjzrg8NP8utbu2hWMIyyHpYBYwyOa2Hn2cwuJAiHAthp%2Be087s4n6e5LjwzeodECAKiAffk5PJLOkJKFACzLZ8B27jfMYgUM7mKSuzPwMcB%2F6Jh%2FV5xUni0AAAAASUVORK5CYII%3D") no-repeat !important;
    background-position:1px 6px!important;
    }
       
    #usercssloader-menu:hover {
    appearance:none !important;
    margin-left: 1px !important;
    margin-right: 0px !important;
    background: #E3E3E3 url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAADJklEQVR4Xi3Pb0yVdRjG8e%2Fze57ncDrAOWwRhDQ7xYAMlAgIBW2txaio5TvMzZa68oWtzRdKbXbIpWyOzcWLWqXkFjUtsIksW72wuTVx%2BEJHCxhkSCNoKLYDwuH8e66eNV98dr24t%2Fu%2BLwsAoKsucqg4tFS4kiTtge4PFAkRksADGdsyua4JXJ7ITH0yQw%2BABTB3sHGipGNjJX8MgzGw6oEBQi5kPYinQBYEbDDAX5PEulJXPhqn2bQE2Fayfa2S8THOfu%2FwzTkDzmOQV8nAkOHMoIFgmS9K3w%2Fi5DmP1fwqdrbRFIR6euqJ6btc2Y4jsGWM0emOWrU2FAtQRTSiid7n9EJtkQCVlebrUle9lnuLVA3v09%2FG8diLCFxp%2BDVprF2a2KHqsrACtqVbQy9L8T2qq4goaKOpz5uka22Kn1yn2gBHOPMSx9o3obJokbS8R%2Fp3txTfK918Q%2B2tjwrQYPcWaW6Xdj5fKkB9B2uks%2Bv1VICYSWXQjia4eWuB8z2%2F0%2F%2FpGMMD04yP3qFzfzXBoE3sszGmR27Tubuc3KDDsf4ZsME2iO4GjuqXQh1orxDwv1OxBsX2VQlQcWGObnzdog%2F3bhCg0uIHNPLFVqnf%2F8DlA2ctDSTgxNFnOHFgE7jAg7kQcjnS8TRgQcCiprGQzncrIZ0i%2Fu0so7lLODlgsh6QSMNCAix8BhJJNH6b5NwyFNhwLwWuB%2FNxEoemudi9wMT8Cq4LBrDwgLUULK%2FBPR9%2BjC4ytPUC17%2F8DR6CpYEplt%2BeJTX7OH9HbEL5NvKwjGvj4AHprC8DSZ%2B%2FzHJgI%2BuI%2BxdvbL9E%2BJRLJr%2BSr5LXKd8foqY8QjqN7fxzlzhaAy8LGYHnQTxJ3hNhFlptCi4XsP7PEoaD4mr4KlveeZjNG4qYvDbKyipJolCXOI70U630Y6uvRfrZzyuvSKOvavK9Kp2OFqv3zagWLzb7s21aubBZ519HFjzrg8NP8utbu2hWMIyyHpYBYwyOa2Hn2cwuJAiHAthp%2Be087s4n6e5LjwzeodECAKiAffk5PJLOkJKFACzLZ8B27jfMYgUM7mKSuzPwMcB%2F6Jh%2FV5xUni0AAAAASUVORK5CYII%3D") no-repeat !important;
    background-position:1px 6px!important;
    }
     
    #usercssloader-menu > .menu-text,
    #usercssloader-menu > .menu-right {
    display: none !important;
    }
    }
    Alles anzeigen
    Code
    Mfg.
    Endor
  • Der Glückwunsch-Thread

    • Endor
    • 13. August 2025 um 16:41

    Hallo milupo.
    Auch von mir alles alles Gute zum Geburtstag!!!
    Viel Gesundheit, Glück und Wohlergehen wünsche ich Dir
    von ganzen Herzen. Bleib gesund und lass dich feiern.
    Mfg.
    Endor

  • Öffnen aktuell aktive Tab in einem privaten Fenster (Skript)

    • Endor
    • 2. August 2025 um 14:07

    Siehe meine edits oben.

    Mfg.
    Endor

  • Öffnen aktuell aktive Tab in einem privaten Fenster (Skript)

    • Endor
    • 2. August 2025 um 13:43
    Zitat von lenny2

    Das Skript funktioniert nicht,

    Funktioniert es überhaupt nicht oder nur nicht so wie du es möchtest?

    Edit: habe es eben selbst getestet, ja leider funktioniert es nicht mehr.
    Werde dem Autor mal Bescheid geben.

    Edit2:
    Erledigt:

    privatetabs.uc.js not works in Firefox 141 · Issue #121 · aminomancer/uc.css.js
    Hi. Your script privateTabs.uc.js not works at all in Firefox 141. https://github.com/aminomancer/uc.css.js/blob/master/JS/privateTabs.uc.js Line 65: This file…
    github.com

    Mfg.
    Endor

  • Öffnen aktuell aktive Tab in einem privaten Fenster (Skript)

    • Endor
    • 2. August 2025 um 11:32

    Vielleicht das hier:

    uc.css.js/JS/privateTabs.uc.js at master · aminomancer/uc.css.js
    A dark indigo CSS theme for Firefox and a large collection of privileged scripts to add new buttons, menus, behaviors and other opinionated features. The theme…
    github.com

    Mfg.
    Endor

  • ScrollTopAndBottom.uc.js und Open with.uc.js zeigen keine Icons mehr an im Nightly

    • Endor
    • 1. August 2025 um 15:52

    In Zeile 224 gab es 4 listStyleImage die habe ich umgeändert
    in --menuitem-icon das war es schon.

    Anderes Script wo ich nicht klar komme:

    JavaScript
    /* Firefox userChrome script
     * Shortcut menu to modify about:config entries
     * Tested on Firefox 132+
     * Author: garywill (https://garywill.github.io)
     * 
     */
    
    // ==UserScript==
    // @include         main
    // @onlyonce
    // ==/UserScript==
    
    console.log("aboutconfig_menu.uc.js");
    
    (() => {
      
    
        const prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
        ChromeUtils.importESModule("resource:///modules/CustomizableUI.sys.mjs")
        const sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
        // ---------------------------------------------------------------------------------------
        
        const button_label = "about:config Kontextmenü";
        const cssuri_icon = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
                toolbarbutton#aboutconfig-button .toolbarbutton-icon {
                    list-style-image: url("data:image/svg+xml;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAgIC0gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogICAtIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiB2aWV3Qm94PSIwIDAgMTYgMTYiPjxwYXRoIGZpbGw9ImNvbnRleHQtZmlsbCIgZD0iTTEzLjkgOS44MWExLjIzIDEuMjMgMCAwIDAgMC0uMTd2LS4wOGE1LjY3IDUuNjcgMCAwIDAtMi40LTMuMzYgMS4xNyAxLjE3IDAgMCAxLS41Ni0uOTVWM2ExIDEgMCAwIDAtMS0xSDYuMDZhMSAxIDAgMCAwLTEgMXYyLjI1YTEuMTcgMS4xNyAwIDAgMS0uNTYgMSA1LjY2IDUuNjYgMCAwIDAtMi4zNSAzLjMzdi4xMmEuNTMuNTMgMCAwIDAgMCAuMTEgNS4zNSA1LjM1IDAgMCAwLS4xMSAxIDUuNjUgNS42NSAwIDAgMCAzLjI0IDUuMDkgMSAxIDAgMCAwIC40NC4xaDQuNTdhMSAxIDAgMCAwIC40NC0uMUE1LjY1IDUuNjUgMCAwIDAgMTQgMTAuODNhNS4zIDUuMyAwIDAgMC0uMS0xLjAyem0tOC4yNy0yYTMuMTggMy4xOCAwIDAgMCAxLjQzLTIuNlY0aDEuODh2MS4yNWEzLjE4IDMuMTggMCAwIDAgMS40MyAyLjYgMy42OCAzLjY4IDAgMCAxIDEuNTQgMi4yNHYuMjJhMi44MiAyLjgyIDAgMCAxLTMuNjgtLjU5QTMuNDggMy40OCAwIDAgMCA0LjU2IDlhMy43NiAzLjc2IDAgMCAxIDEuMDctMS4xNXoiPjwvcGF0aD48L3N2Zz4=");
                }
                toolbarbutton#aboutconfig-button .toolbarbutton-badge {
                    background-color: #009f00;
                    visibility: hidden; 
                }           
                `), null, null);
        const cssuri_warnbadge = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
                toolbarbutton#aboutconfig-button .toolbarbutton-badge {
                    background-color: red ;
                    visibility: unset;
                } 
                `), null, null);
       
        sss.loadAndRegisterSheet(cssuri_icon, sss.USER_SHEET);
      
        
        var prefItems = [ 
    	{
                name: "📼 Kein automatisches Popup beim Download",
                type: prefs.PREF_BOOL,
                pref: "browser.download.alwaysOpenPanel",
                possibleVals: [
                    {  val: false },
                    {  val: true },
                ]
            },
    	{
                name: "🎞️ Beim Schließen vom letzten Tab den Browser nicht schließen",
                type: prefs.PREF_BOOL,
                pref: "browser.tabs.closeWindowWithLastTab",
                possibleVals: [
                    {  val: false },
                    {  val: true },
                ]
            },
    		"seperator",
    	{
                name: "🔎 Suche aus Suchleiste im neuen Tab öffnen",
                type: prefs.PREF_BOOL,
                pref: "browser.search.openintab",
                possibleVals: [
                    {  val: false },
                    {  val: true },
                ]
            },
    	{
                name: "📖 Lesezeichen im neuen Tab öffnen",
                type: prefs.PREF_BOOL,
                pref: "browser.tabs.loadBookmarksInTabs",
                possibleVals: [
                    {  val: false },
                    {  val: true },
                ]
            },
    	{
                name: "📖 Link aus Adressleiste im neuen Tab öffnen",
                type: prefs.PREF_BOOL,
                pref: "browser.urlbar.openintab",
                possibleVals: [
                    {  val: false },
                    {  val: true },
                ]
            },
    		"seperator",
    	{
                name: "🎊 Animations Modus",
                type: prefs.PREF_STRING,
                pref: "image.animation_mode",
                possibleVals: [
                    { name: "Einmal", val: "once" },
                    { name: "Keine", val: "none" },
                    { name: "Dauerhaft", val: "normal" },
                ]
            },
    	     "seperator", 
    		{
                name: "🔏 CSP aktivieren - deaktivieren",
                type: prefs.PREF_BOOL,
                pref: "security.browser_xhtml_csp.enabled",
                possibleVals: [
                    {  val: false  },
                    {  val: true },
                ]
            },
    		{
                name: "🔏 Urlbar Verhalten - deaktivieren",
                type: prefs.PREF_BOOL,
                pref: "browser.urlbar.scotchBonnet.enableOverride",
                possibleVals: [
                    {  val: false  },
                    {  val: true },
                ]
            },		
    		{
                name: "🔏 eval erlauben - verbieten",
                type: prefs.PREF_BOOL,
                pref: "security.allow_unsafe_dangerous_privileged_evil_eval",
                possibleVals: [
                    {  val: false  },
                    {  name: "true ⚠️",  val: true , sign: '‼️' },
                ]
    		},	
            {
                name: "🌐 IPv6 ausschalten",
                type: prefs.PREF_BOOL,
                pref: "network.dns.disableIPv6",
                possibleVals: [
                    {  val: false },
                    {  val: true },
                ]
            },
            {
                name: "🔐 DNS Modus",
                type: prefs.PREF_INT,
                pref: "network.trr.mode",
                possibleVals: [
                    { name: "0 - Default" , val: 0 },
                    { name: "2 - DoH, fallback Plain DNS" , val: 2 },
                    { name: "3 - DoH only" , val: 3 }, 
                    { name: "5 - Plain DNS" , val: 5 }
                ]
            },
            {
                name: "🔐 DoH server",
                type: prefs.PREF_STRING,
                pref: "network.trr.uri",
                possibleVals: [
                    { name: "Cloudflare" , val: "https://mozilla.cloudflare-dns.com/dns-query" },
                    { name: "NextDNS" , val: "https://firefox.dns.nextdns.io/" }
                ] // See buildin DoH at 'network.trr.resolvers'
            },
            {
                name: "🔏 Veraltete TLS Version aktivieren",
                type: prefs.PREF_BOOL,
                pref: "security.tls.version.enable-deprecated",
                possibleVals: [
                    { val: false  },
                    { name: "true ⚠️",  val: true , sign: '‼️'},
                ]
            },
    
            "seperator",    
            {
                name: "🖱️ Mausrad-Y-Multiplikator",
                type: prefs.PREF_INT,
                pref: "mousewheel.default.delta_multiplier_y",
                possibleVals: [
                    { val: 150 },
                ]
            },
            {
                name: "🖱️ Vertikaler Faktor des Systembildlaufes",
                type: prefs.PREF_INT,
                pref: "mousewheel.system_scroll_override.vertical.factor",
                possibleVals: [
                    { val: 250 },
                ]
            },
    
    
            "seperator",    
            {
                name: "▶️ Autoplay Medien Standard",
                type: prefs.PREF_INT,
                pref: "media.autoplay.default",
                possibleVals: [
                    { val: 0, name: "0 - allow" },
                    { val: 1, name: "1 - blockAudible 👍" },
                    { val: 5, name: "5 - blockAll" },
                ]
            },
    		{
                name: "📺 Videos gesperrt - Videos frei",
                type: prefs.PREF_BOOL,
                pref: "media.mediasource.enabled",
                possibleVals: [
                    {  val: false  },
                    {  val: true },
                ]
            },
            {
                name: "▶️ Media Autoplay ext bg",
                type: prefs.PREF_BOOL,
                pref: "media.autoplay.allow-extension-background-pages",
                possibleVals: [
                    {  val: false  },
                    {  val: true },
                ]
            },
            {
                name: "▶️ Richtlinien zur Sperrung von Autoplay-Medien",
                type: prefs.PREF_INT,
                pref: "media.autoplay.blocking_policy",
                possibleVals: [
                    { val: 0, name: "0 - no block" },
                    { val: 1, name: "1 - block 👍" },
                    { val: 2, name: "2 - block more" },
                    // 0=sticky (default), 1=transient, 2=user
                ]
            },
            {
                name: "▶️ InternetAudio",
                type: prefs.PREF_BOOL,
                pref: "dom.webaudio.enabled",
                possibleVals: [
                    {  val: false },
                    {  val: true  ,  sign: '‼️' , warnbadge: true},
                ]
            },
    
            "seperator",    
            {
                name: "🔤 Benutzerdefinierte Web-Schriften zulassen",
                type: prefs.PREF_INT,
                pref: "browser.display.use_document_fonts",
                possibleVals: [
                    { name: "1 - Allow", val: 1 },
                    { name: "0 - Disallow", val: 0 },
                ]
            },
             {
                name: "💻 Keine Popup Anmeldung für Browser-Werkzeuge",
                type: prefs.PREF_BOOL,
                pref: "devtools.debugger.prompt-connection",
                possibleVals: [
                    {  val: true  },
                    { name: "false ⚠️",   val: false , sign: '‼️' },
                ]
            },
            {
                name: "🔏 Tooltips aktivieren - deaktivieren",
                type: prefs.PREF_BOOL,
                pref: "browser.chrome.toolbar_tips",
                possibleVals: [
                    {  val: false  },
                    {  val: true },
                ]
            },
    		 "seperator",
    		{
                name: "💻 Popups nicht automatisch schließen",
                type: prefs.PREF_BOOL,
                pref: "ui.popup.disable_autohide",
                possibleVals: [
                    {  val: false  },
                    {  val: true },
                ]
            },
        ];
    	
    	if (!window.gBrowser){
        return;
        }
        
        CustomizableUI.createWidget({
            id: 'aboutconfig-button', // button id
            type: "custom",
            defaultArea: CustomizableUI.AREA_NAVBAR,
            removable: true,
            onBuild: function (doc) {
                let btn = doc.createXULElement('toolbarbutton');
                btn.id = 'aboutconfig-button';
                btn.label = button_label;
                btn.tooltipText = button_label;
                btn.type = 'menu';
                btn.className = 'toolbarbutton-1 chromeclass-toolbar-additional';
                btn.setAttribute("badged", "true"); 
                btn.setAttribute("badge", "!"); 
                
                let mp = doc.createXULElement("menupopup");
                mp.id = 'aboutconfig-popup';
                mp.onclick = function(event) {  event.preventDefault()  ;} ;
                
    
                
                prefItems.forEach( function (item, items_i) { // loop every user defined pref
                    
                    if (item === "seperator") 
                    {
                        mp.appendChild(doc.createXULElement('menuseparator'));
                        return;
                    }
                    
                    //var current_val = getItemCurrentVal(item) ;
                    var menu = doc.createXULElement("menu");
                    menu.label = item.name ? item.name : item.pref ;
                    menu.id = "aboutconfig_menu_" + items_i ;
                    menu.className = 'menuitem-iconic' ;
                    
                
                    var menupopup = doc.createXULElement("menupopup");
                    menupopup.id = "aboutconfig_menupopup_" + items_i ;
                    menupopup.className = 'menuitem-iconic' ;
                    
    
                    
                    item.possibleVals.forEach( function (pv, i) { // loop every possible value
                        
                        var display_val = prefPossibleValToDisplay(item, pv.val) ;
                        
                        // Submenu item. One is one possible value
                        var menuitem = doc.createXULElement("menuitem");
                        menuitem.label = pv.name ? pv.name : display_val ;
                        menuitem.id = "aboutconfig_menu_" + items_i + "__" + i  ;
                        menuitem.setAttribute('type', 'radio') ;
                        menuitem.className = 'menuitem-iconic' ;
                        menuitem.tooltipText = display_val ;
    
                        if (pv ['sign'])
                            menuitem.label += '  ' + pv['sign']; 
                        
                        
                        menuitem.addEventListener('click', function(event) { 
                            //console.log(this.id); 
                            setItemPrefVal(item , pv.val);
                        } ) ;
                        menupopup.appendChild(menuitem);
                        
                    });           
                                    
                    var default_val = getItemDefaultVal(item);
                    var default_val_display = null;
                    var reset_label = "Zurücksetzen: ";
                    if (item.signWhenDefaultVal)
                        reset_label += item.signWhenDefaultVal + ' ' ;
                    if (default_val !== undefined && default_val !== null)
                    {
                        default_val_display = prefPossibleValToDisplay(item, default_val);
                        reset_label += default_val_display ;
                    }
                    else
                        reset_label += ' (delete in about:config)'
                    
                    menupopup.appendChild(
                        doc.createXULElement('menuseparator')
                    );
                    
                    // Submenu entry to reset a pref to default
                    var default_item = doc.createXULElement("menuitem");
                    default_item.id = "aboutconfig_menu_" + items_i + "__default" ;
                    default_item.className = 'menuitem-iconic';
                    default_item.label = reset_label;
                    default_item.tooltipText = default_val_display;
    
                    default_item.addEventListener('click', function(event) { 
                        //console.log(this.id); 
                        //setItemPrefVal(item , getItemDefaultVal(item) );
                        prefs.clearUserPref(item.pref);
                    } ) ;
                    
                    menupopup.appendChild(default_item);
                    
                    //------------
                    menu.appendChild(menupopup);
                    mp.appendChild(menu);
                    
                    
                });
                
                btn.appendChild(mp);
    
                mp.addEventListener('popupshowing', function() { 
                    //console.log(this);
                    evalPopulateMenu(this); 
                    
                    update_badge();
                    
                });
    
                btn.onclick = function(event) {
                    if (event.button == 1) {
                        const win = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                            .getService(Components.interfaces.nsIWindowMediator)
                            .getMostRecentWindow("navigator:browser");
                        win.gBrowser.selectedTab = win.gBrowser.addTrustedTab('about:config');
                    }
                    
                    update_badge();
                };
                
                return btn;
            }
        });
        
        function getItemDefaultVal (item) {
            var default_val = undefined;
            try{
                if ( item.type == prefs.PREF_BOOL )
                    default_val = prefs.getDefaultBranch(item.pref).getBoolPref('');
                else if ( item.type == prefs.PREF_INT )
                    default_val = prefs.getDefaultBranch(item.pref).getIntPref('');
                else if ( item.type == prefs.PREF_STRING )
                    default_val = prefs.getDefaultBranch(item.pref).getStringPref('');
            }catch(err) { default_val = null }
            
            return default_val;
        }
        function getItemCurrentVal (item) {
            var current_val = null;
            try{
                if ( item.type == prefs.PREF_BOOL )
                    current_val = prefs.getBoolPref(item.pref);
                else if ( item.type == prefs.PREF_INT )
                    current_val = prefs.getIntPref(item.pref);
                else if ( item.type == prefs.PREF_STRING )
                    current_val = prefs.getStringPref(item.pref);
            }catch(err){ }
            return current_val ;
        }
        
        function if_pref_current_val_is (item, pv_index) {
            var current_val = getItemCurrentVal(item) ;
            if (current_val === null)
                return false;
            
            if ( current_val === item.possibleVals[pv_index].val )
                return true;
            else 
                return false;
        }
        
        function setItemPrefVal(item, newVal)
        {
            if ( item.type == prefs.PREF_BOOL )
                prefs.setBoolPref(item.pref, newVal);
            else if ( item.type == prefs.PREF_INT )
                prefs.setIntPref(item.pref, newVal);
            else if ( item.type == prefs.PREF_STRING )
                prefs.setStringPref(item.pref, newVal);
            
            update_badge();
        }
        function prefPossibleValToDisplay(item, possible_val ) {
            if (possible_val === null) 
                return "null";
            
            var display_val = possible_val.toString();
            if (item.type == prefs.PREF_STRING)
                display_val = `'${display_val}'`;
            
            return display_val;
        }
        
        function evalPopulateMenu(popupmenu)
        {
            prefItems.forEach( function (item, items_i) {
                if (item === "seperator") 
                    return;
                
                const menu = popupmenu.querySelector("#aboutconfig_menu_" + items_i);
                menu.label = item.name ? item.name : item.pref ;
                menu.style.fontWeight = "";
                
                const default_val = getItemDefaultVal(item);
                        
                var current_val = getItemCurrentVal(item) ;
                var current_val_display = prefPossibleValToDisplay(item, current_val);
                menu.tooltipText = `Pref: ${item.pref}\nValue: ${current_val_display}`;
                
                if (current_val !== null)
                {
                    if (item.type == prefs.PREF_BOOL) 
                        menu.label += '  [' + ( current_val?'T':'F' ) + ']';
                    else if (item.type == prefs.PREF_INT) 
                        menu.label += '  [' + current_val + ']';
                    else if (item.type == prefs.PREF_STRING) {
                        var current_val_display_short;
                        
                        if (current_val.length > 8)
                            current_val_display_short = current_val.substring(0, 6) + '..'; 
                        else 
                            current_val_display_short = current_val;
                        
                        menu.label += '  [' + current_val_display_short + ']';
                    }
                } 
                
                if (current_val !== default_val)
                    menu.style.fontWeight = "bold";
                
                if (current_val === default_val && item.signWhenDefaultVal)
                    menu.label += '  ' + item.signWhenDefaultVal;
    
                
                item.possibleVals.forEach( function (pv, i) {
                    menuitem = popupmenu.querySelector("#aboutconfig_menu_" + items_i + "__" + i);
                    if ( if_pref_current_val_is(item, i) )
                    { 
                        menuitem.setAttribute("checked",true);
                     
                        if (pv ['sign'])
                            menu.label += '  ' + pv['sign'];
                    }
                    else 
                        menuitem.setAttribute("checked",false);
                });
            });
        }
        
        function add_warnbadge()
        {
            if ( ! sss.sheetRegistered(cssuri_warnbadge, sss.USER_SHEET) )
                 sss.loadAndRegisterSheet(cssuri_warnbadge, sss.USER_SHEET);
        }
        function rm_warnbadge()
        {
            if ( sss.sheetRegistered(cssuri_warnbadge, sss.USER_SHEET) )
                 sss.unregisterSheet(cssuri_warnbadge, sss.USER_SHEET);
        }
        
        update_badge();
        async function update_badge()
        {
            
            var show_warnbadge = false;
            
            for (item of prefItems)
            {
                if (typeof(item) === "string")
                    continue;
                
                const current_val = getItemCurrentVal(item) ;
                if (
                    item.possibleVals.some ( function(ele) {
                        return ( ele ['val'] === current_val && ele ['warnbadge'] && ele ['warnbadge'] === true );
                    } )
                )
                {
                    show_warnbadge = true;
                    break;
                }
            }
                 
            
            if (show_warnbadge)
                add_warnbadge();
            else 
                rm_warnbadge();
        }
        
        
    })();
    Alles anzeigen

    Es fehlt nur das Hakensymbol im Untermenü. alles andere passt.
    Das wird aber anscheinend schon länger nicht mehr angezeigt.
    Ab Firefox 143 sind da nur noch Vierecke zu sehen.

    Mfg.
    Endor

  • ScrollTopAndBottom.uc.js und Open with.uc.js zeigen keine Icons mehr an im Nightly

    • Endor
    • 1. August 2025 um 10:13
    Zitat von Mira_Belle

    Die da wären?

    zbs.

    JavaScript
    // ==UserScript==
    // @name           Tab Context Menu Navigation
    // @version        1.1.2a
    // @author         aminomancer
    // @homepage       https://github.com/aminomancer/uc.css.js
    // @description    Add some new menuitems to the tab context menu for navigating tabs. Includes Back, Forward, Reload, and Bookmark. The new menuitems look just like the navigation group at the top of the content area context menu. So they're oriented horizontally and have icons instead of labels. But functionally, they're a bit different. If you click the "Reload" button, for example, instead of reloading the current tab it will reload the tab you right-clicked to open the context menu. If you had multiple tabs selected and you right-clicked one of them, it will reload all of them. If you click the "Back" button, it will navigate the context tab(s) back by one. So this gives you some capabilities not already available in Firefox. In particular, you can navigate back/forward in tabs without opening them, since it operates on the context tab rather than the active tab. You can also navigate back/forward in multiple tabs at once. This script was made by request. It's not recommended on macOS, since the context menu items and functions are significantly different. It should be technically compatible but it might look weird depending on your settings.
    // @downloadURL    https://cdn.jsdelivr.net/gh/aminomancer/uc.css.js@master/JS/tabContextMenuNavigation.uc.js
    // @updateURL      https://cdn.jsdelivr.net/gh/aminomancer/uc.css.js@master/JS/tabContextMenuNavigation.uc.js
    // @license        This Source Code Form is subject to the terms of the Creative Commons Attribution-NonCommercial-ShareAlike International License, v. 4.0. If a copy of the CC BY-NC-SA 4.0 was not distributed with this file, You can obtain one at http://creativecommons.org/licenses/by-nc-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
    // ==/UserScript==
    
    class TabContextMenuNavigation {
      static config = {
        l10n: {
          "Go Back (Single Tab)": "Eine Seite zurück",
    
          "Go Back (Multiselected)": "Ausgewählte Tabs eine Seite zurück gehen",
    
          "Go Back Access Key": "z",
    
          "Go Forward (Single Tab)": "Eine Seite vor",
    
          "Go Forward (Multiselected)": "Ausgewählte Tabs eine Seite vor gehen",
    
          "Go Forward Access Key": "v",
    
          "Reload (Single Tab)": "Aktuelle Seite neu laden",
    
          "Reload (Multiselected)": "Ausgewählte Seiten neu laden",
    
          "Reload Access Key": "n",
    
          "Bookmark (Single Tab)": "Lesezeichen für Seite hinzufügen",
    
          "Bookmark (Multiselected)": "Lesezeichen für ausgewählte Seiten hinzufügen",
    
          "Bookmark Access Key": "L",
        },
        // firefox doesn't have localized strings for these menuitems, since it
        // doesn't have any user-facing features like this where you can navigate
        // tabs that aren't currently active/selected. nor does it have any ability
        // to navigate multiple tabs at once. so you have to localize the tooltips
        // yourself to match your browser language.
      };
      create(doc, tag, props, isHTML = false) {
        let el = isHTML ? doc.createElement(tag) : doc.createXULElement(tag);
        for (let prop in props) el.setAttribute(prop, props[prop]);
        return el;
      }
      constructor() {
        this.config = TabContextMenuNavigation.config;
        let { l10n } = this.config;
        document.documentElement.setAttribute(
          "operatingsystem",
          AppConstants.platform
        );
        this.loadStylesheet();
        // menuitem group
        this.contextNavigation = this.create(document, "menugroup", {
          id: "tab-context-navigation",
        });
        this.contextNavSeparator = this.create(document, "menuseparator", {
          id: "tab-context-sep-navigation",
        });
        this.tabContext.prepend(this.contextNavSeparator);
        this.tabContext.prepend(this.contextNavigation);
        // new menuitems
        this.contextBack = this.contextNavigation.appendChild(
          this.create(document, "menuitem", {
            id: "tab-context-back",
            class: "menuitem-iconic",
            tooltiptext: l10n["Go Back (Single Tab)"],
            accesskey: l10n["Go Back Access Key"]        
    	  })
    	  );
        this.contextForward = this.contextNavigation.appendChild(
          this.create(document, "menuitem", {
            id: "tab-context-forward",
            class: "menuitem-iconic",
            tooltiptext: l10n["Go Forward (Single Tab)"],
            accesskey: l10n["Go Forward Access Key"]              
    	  })
    	  );
    	  
        this.contextReload = this.contextNavigation.appendChild(
          this.create(document, "menuitem", {
            id: "tab-context-reload",
            class: "menuitem-iconic",
            tooltiptext: l10n["Reload (Single Tab)"],
            accesskey: l10n["Reload Access Key"]
    	  })        
    	  );
        this.contextBookmark = this.contextNavigation.appendChild(
          this.create(document, "menuitem", {
            id: "tab-context-bookmark",
            class: "menuitem-iconic",
            tooltiptext: l10n["Bookmark (Single Tab)"],
            accesskey: l10n["Bookmark Access Key"]
    	  })		
        );
    	document.getElementById('tab-context-back').addEventListener('command', () =>{
    			//menuitem.addEventListener('command', () =>{
    			tabContextMenuNavigation.goBack();
          });
    	document.getElementById('tab-context-forward').addEventListener('command', function() {
    			//menuitem.addEventListener('command', () => {
    			tabContextMenuNavigation.goForward();
          });
    	document.getElementById('tab-context-reload').addEventListener('command', function() {
    			//menuitem.addEventListener('command', () => {
    			tabContextMenuNavigation.reload();
          });
    	document.getElementById('tab-context-bookmark').addEventListener('command', function() {
    			//menuitem.addEventListener('command', () => {
    			tabContextMenuNavigation.bookmark();
          });
    	  
        // remove the separator after "New Tab" menuitem,
        // since it'll look awkward with the menugroup above it.
        let newTab = this.tabContext.querySelector("#context_openANewTab");
        if (newTab.nextElementSibling.tagName === "menuseparator") {
          newTab.nextElementSibling.remove();
        }
        // set up listener to hide/disable menuitems
        this.tabContext.addEventListener("popupshowing", this);
      }
      handleEvent(e) {
        switch (e.type) {
          case "popupshowing":
            this.onPopupShowing(e);
            break;
        }
      }
      // we want to disable/enable the back & forward menuitems just like the
      // back/forward buttons in the navbar. we also want to change the tooltips for
      // all 4 menuitems based on whether more than 1 tab is selected.
      onPopupShowing(e) {
        if (e.target !== this.tabContext) return;
        let { l10n } = this.config;
        if (this.contextTab?.multiselected) {
          this.contextBack.disabled = !gBrowser.selectedTabs.some(
            tab => gBrowser.getBrowserForTab(tab).webNavigation.canGoBack
          );
          this.contextForward.disabled = !gBrowser.selectedTabs.some(
            tab => gBrowser.getBrowserForTab(tab).webNavigation.canGoForward
          );
          this.contextBack.setAttribute(
            "tooltiptext",
            l10n["Go Back (Multiselected)"]
          );
          this.contextForward.setAttribute(
            "tooltiptext",
            l10n["Go Forward (Multiselected)"]
          );
          this.contextReload.setAttribute(
            "tooltiptext",
            l10n["Reload (Multiselected)"]
          );
          this.contextBookmark.setAttribute(
            "tooltiptext",
            l10n["Bookmark (Multiselected)"]
          );
        } else {
          this.contextBack.disabled = !gBrowser.getBrowserForTab(this.contextTab)
            .webNavigation.canGoBack;
          this.contextForward.disabled = !gBrowser.getBrowserForTab(this.contextTab)
            .webNavigation.canGoForward;
          this.contextBack.setAttribute(
            "tooltiptext",
            l10n["Go Back (Single Tab)"]
          );
          this.contextForward.setAttribute(
            "tooltiptext",
            l10n["Go Forward (Single Tab)"]
          );
          this.contextReload.setAttribute(
            "tooltiptext",
            l10n["Reload (Single Tab)"]
          );
          this.contextBookmark.setAttribute(
            "tooltiptext",
            l10n["Bookmark (Single Tab)"]
          );
        }
      }
      goBack() {
        if (this.contextTab?.multiselected) {
          gBrowser.selectedTabs.forEach(tab => {
            let browser = gBrowser.getBrowserForTab(tab);
            if (browser.webNavigation.canGoBack) browser.goBack();
          });
        } else {
          gBrowser.getBrowserForTab(this.contextTab).goBack();
        }
      }
      goForward() {
        if (this.contextTab?.multiselected) {
          gBrowser.selectedTabs.forEach(tab => {
            let browser = gBrowser.getBrowserForTab(tab);
            if (browser.webNavigation.canGoForward) browser.goForward();
          });
        } else {
          gBrowser.getBrowserForTab(this.contextTab).goForward();
        }
      }
      reload() {
        if (this.contextTab?.multiselected) gBrowser.reloadMultiSelectedTabs();
        else gBrowser.reloadTab(this.contextTab);
      }
      bookmark() {
        PlacesUIUtils.showBookmarkPagesDialog(
          this.contextTab?.multiselected
            ? PlacesCommandHook.uniqueSelectedPages
            : PlacesCommandHook.getUniquePages([this.contextTab])
        );
      }
      loadStylesheet() {
        // we're gonna use a <style> element instead of the usual stylesheet
        // service, since this seems to be the only way to get media queries to work
        // in an author sheet without saving the stylesheet to disk somewhere and
        // loading it from a chrome:// url. this restricts us in some ways but it
        // doesn't matter since these elements only appear in one place.
        let style = document.createElement("style");
        style.textContent = `#tab-context-navigation>.menuitem-iconic>.menu-iconic-text,#tab-context-navigation>.menuitem-iconic>.menu-accel-container{display:none;}#tab-context-navigation>.menuitem-iconic{-moz-box-flex:1;-moz-box-pack:center;-moz-box-align:center;}#tab-context-navigation>.menuitem-iconic>.menu-iconic-left{appearance:none;}#tab-context-navigation>.menuitem-iconic>.menu-iconic-left>.menu-iconic-icon{width:1.25em;height:auto;margin:7px;-moz-context-properties:fill;fill:currentColor;}#tab-context-back{list-style-image:url("chrome://browser/skin/back.svg");}#tab-context-forward{list-style-image:url("chrome://browser/skin/forward.svg");}#tab-context-reload{list-style-image:url("chrome://global/skin/icons/reload.svg");}#tab-context-bookmark{list-style-image:url("chrome://browser/skin/bookmark-hollow.svg");}#tab-context-back:-moz-locale-dir(rtl),#tab-context-forward:-moz-locale-dir(rtl),#tab-context-reload:-moz-locale-dir(rtl){transform:scaleX(-1);}#contentAreaContextMenu[touchmode]>#tab-context-navigation>menuitem{padding-block:7px;}#tab-context-navigation{background-color:menu;padding-bottom:4px;}#tab-context-sep-navigation{margin-inline-start:-28px;margin-top:-4px;}@media (-moz-windows-non-native-menus){#tab-context-navigation:not([hidden]){background-color:inherit;padding:0 0 4px;display:flex;flex-direction:row;--menuitem-min-width:calc(2em + 16px);min-width:calc(4 * var(--menuitem-min-width))}#tab-context-navigation>.menuitem-iconic{flex:1 0 auto}#tab-context-navigation>.menuitem-iconic[_moz-menuactive="true"]{background-color:transparent}#tab-context-navigation>.menuitem-iconic>.menu-iconic-left{margin:0;padding:0}#tab-context-navigation>.menuitem-iconic>.menu-iconic-left>.menu-iconic-icon{width:var(--menuitem-min-width);height:32px;padding:8px 1em;margin:0}#tab-context-navigation>.menuitem-iconic[_moz-menuactive="true"]:not([disabled="true"])>.menu-iconic-left>.menu-iconic-icon{background-color:var(--menuitem-hover-background-color)}#tab-context-navigation>.menuitem-iconic[_moz-menuactive="true"][disabled="true"]>.menu-iconic-left>.menu-iconic-icon{background-color:var(--menuitem-disabled-hover-background-color)}#tab-context-navigation>.menuitem-iconic:first-child{-moz-box-pack:start}#tab-context-navigation>.menuitem-iconic:last-child{-moz-box-pack:end}#tab-context-navigation>.menuitem-iconic:last-child,#tab-context-navigation>.menuitem-iconic:first-child{flex-grow:0;width:calc(var(--menuitem-min-width) + calc(100% - 4 * var(--menuitem-min-width)) / 6)}#tab-context-sep-navigation{margin-top:0;margin-inline:0}}:root[operatingsystem="linux"] #tab-context-navigation>.menuitem-iconic>.menu-iconic-left{padding-inline-end:0!important;margin-inline-end:0!important;}#context_reloadTab,#context_reloadSelectedTabs,#context_bookmarkTab,#context_bookmarkSelectedTabs{display:none!important;}`;
        document.head.appendChild(style);
      }
      get tabContext() {
        return (
          this._tabContext ||
          (this._tabContext = document.getElementById("tabContextMenu"))
        );
      }
      get contextTab() {
        return TabContextMenu.contextTab;
      }
    }
    
    if (gBrowserInit.delayedStartupFinished) {
      window.tabContextMenuNavigation = new TabContextMenuNavigation();
    } else {
      let delayedListener = (subject, topic) => {
        if (topic == "browser-delayed-startup-finished" && subject == window) {
          Services.obs.removeObserver(delayedListener, topic);
          window.tabContextMenuNavigation = new TabContextMenuNavigation();
        }
      };
      Services.obs.addObserver(delayedListener, "browser-delayed-startup-finished");
    }
    Alles anzeigen

    Vielleicht kriegst Du das ja auch zum laufen.

    Edit:
    Hat sich erledigt. Habe es selbst hinbekommen.
    Lag wohl an meiner dreckigen Brille......
    Mfg.
    Endor

Unterstütze uns!

Jährlich (2025)

104,5 %

104,5% (679,10 von 650 EUR)

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