1. Nachrichten
  2. Forum
    1. Unerledigte Themen
    2. Forenregeln
  3. Spenden
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. camp-firefox.de
  2. Boersenfeger

Beiträge von Boersenfeger

  • Icon vom Deepl-Script im Seitenkontext Menü wird nicht angezeigt

    • Boersenfeger
    • 23. August 2025 um 18:21

    2002Andreas Danke, erledigt.. :thumbup:

    Dann werde ich wohl mal meine Scripte hinsichtlich "listStyleImage" durchforsten. Vielleicht finde ich ja dann das Script, was die "Seiteninformationen" zerschießt.

    Horstmann ich tue mich in diesen Dingen sehr schwer und konnte da nichts Genaues herauslesen, was für diesen Anwendungsfall zu traf.

  • Icon vom Deepl-Script im Seitenkontext Menü wird nicht angezeigt

    • Boersenfeger
    • 23. August 2025 um 17:49

    Moin, ich habe gelesen, dass einige Scripte ihre Icons nicht anzeigen;

    Bei mir ist das nachfolgende Deepl-Script betroffen

    JavaScript
    // Translate_DeepL.uc.js
    
    // https://github.com/ardiman/userChrome.js/tree/master/contexttranslate
    // ex ContextTranslate.uc.js///
    // modifiziert by universum 123, Umlaute geändert by 2002Andreas
    // https://www.camp-firefox.de/forum/thema/126100/?postID=1107070#post1107070
    
    (function () {
    	if (location.href !== 'chrome://browser/content/browser.xhtml') return;
    	let translate = function () {
    		let browserMM = gBrowser.selectedBrowser.messageManager;
    		browserMM.addMessageListener('getSelection', function listener(message) {
    			let t = (message.data !== '');
    			let e = (document.charset || document.characterSet);
    			if (t) {
    				openWebLinkIn('https://www.deepl.com/translator#en/de/' + encodeURIComponent(message.data), 'tab');
    			} else {
    				openWebLinkIn('https://www.deepl.com/translate?u=' + encodeURIComponent(gBrowser.currentURI.spec) + '&hl=de-DE&ie=' + e + '&sl=auto&tl=de-DE', 'tab');
    			};
    			browserMM.removeMessageListener('getSelection', listener, true);
    		});
    		browserMM.loadFrameScript('data:,sendAsyncMessage("getSelection", content.document.getSelection().toString())', true);
    	}
    	let menuitem = document.createXULElement('menuitem');
    	menuitem.id = 'context-DeepLtranslate';
    	menuitem.setAttribute('label', '\Übersetzen DeepL');
    	menuitem.classList.add('menuitem-iconic');
    
    	let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
    	let IconPath = '/chrome/icons/Deepl.png'; // Pfad in den entsprechenden Unterordner
    	let ButtonIcon = "Deepl.png"; // Name & Dateiendung des anzuzeigenden Symbols!
    	menuitem.style.listStyleImage = 'url("file:///g:/Martin/A_INSTALLATIONSDATEIEN/Downloads/Icons/deepl.png")';
    
    	menuitem.addEventListener('command', translate);
    
    	let refItem = document.getElementById('context-inspect');
    	refItem.parentNode.insertBefore(menuitem, refItem);
    })();
    Alles anzeigen

    Ist da auf den 1. Blick was zu erkennen?

    Wie im Screenshot zu sehen, ist auch der Eintrag "Seiteninformationen" betroffen. Da wüsste ich jetzt nicht, dass dafür ein Script werkelt.

  • Was hört Ihr gerade?

    • Boersenfeger
    • 22. August 2025 um 17:22

    D. Train the Best of the 12 Inch Mixes

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

  • Firefoxeinstellungen in die Cloud und wieder ins Livesystem zurück

    • Boersenfeger
    • 21. August 2025 um 15:03

    Es sollte die Bereitschaft des Admins vorliegen, einen sicheren Browser in einem Firmenumfeld anzuwenden. ;)

  • Neue Informationen zu Thunderbird Pro und Thundermail

    • Boersenfeger
    • 21. August 2025 um 11:53

    Vielen Dank!
    Ich wusste, dass der letzte Satz von Dir kommt! ^^

    Trotzdem bleibe ich bei POP. :)

  • Neue Informationen zu Thunderbird Pro und Thundermail

    • Boersenfeger
    • 21. August 2025 um 11:30

    Ich hoffe ja nicht, dass die normale Thunderbird-Version irgendwann eingestellt wird. Ein Wechsel kommt für mich nicht in Frage, da ich meine Mails gern via POP beziehe. :/

  • UserCSSLoader (2025)

    • Boersenfeger
    • 18. August 2025 um 14:29

    Ich habe jetzt einfach mal meinen Code aus dem alten Script in Endors hineinkopiert und es funktioniert alles wie vorher.

    Das ist dann Zeile 38 - 51

    JavaScript
    // ==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 ****/
     
    /* Konfiguration */
    // Position: als Menü anzeigen = 1, als frei verschiebbare-Schaltfläche = 0
    let position = 0;
    // alternativer Dateimanager, Bsp.:
    // let filemanager = "C:\\Programme\\totalcmd\\TOTALCMD.EXE";
    let filemanager = "H:\\TotalCommander\\TOTALCMD64.EXE";
    // eventuelle Parameter für den alternativen Dateimanager, sonst filemanagerParam = "";
    //let filemanagerParam = "/O /T";//Totalcommander
    let filemanagerParam = "";
    // Unterordner für die CSS-Dateien:
    let cssFolder = "CSS";
    // zusätzlich Chrome-Ordner im Untermenü anzeigen: 1 = ja, 0 = nein
    let showChrome = 1;
    /* Konfiguration 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


    Meine CSS-Datei dafür

    CSS
    	/* UserStyles Loader Button */
        
    	#usercssloader-menu {
    	margin-right: 0 !important; 
    	margin-left: 0 !important;
    	content: '' !important;
    	display: block !important;
    	width: 20px !important;
    	height: 20px !important;
    	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAABRUlEQVQ4jaXSLW/CUBTG8YdMTmxijiY1M62A8w2omZ1jlhA0mC6ZJTiSKewsDgesohgICWLjQ0DCkvJOPeGZGG3Xji50O8kvueeKv7kX+JorAFkAuRh3AATADYALnJjsfD5nHMuySJKFQuHxGElFA7nFYsE4XoAkdV1/AHAdjeRWqxXjtNttfp9MJnMP4DIUWK/XjDMYDBgdALehwHa7ZZzpdMrhcMhut0vbtmnbNgEYocBut2MSx9cJAq7rMokgYI6ZMt/+BOaYgDnmy7vr8+ac3Q80RhuWOw5JstxxfL/tjdEmCNT7SxZbM5JksTULid55e72/DALVnsN8c0KSzDcnP0TvSbLac4LA0+uHz5vo+dTuB/7F+wf7/Z5J+P9ARAxFUSqHw4FJKIpSEREDImJomlZSVbWWTqefz6Gqak3TtJKIGJ86u+Qm3Nb2fAAAAABJRU5ErkJggg==") !important;
    	background-repeat: no-repeat !important;
    	background-position: 1px 5px !important;
    	background-size: 15px 15px !important;
    	}
        
    	#usercssloader-menu > .menu-text,
    	#usercssloader-menu > .menu-right {
        display: none !important;
    	}
        
    	#usercssloader-menu:hover {
    	margin-right: 0 !important; 
    	margin-left: 0 !important;
    	content: '' !important;
    	display: block !important;
    	width: 20px !important;
    	height: 20px !important;
    	background: lightgrey !important;
    	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAABRUlEQVQ4jaXSLW/CUBTG8YdMTmxijiY1M62A8w2omZ1jlhA0mC6ZJTiSKewsDgesohgICWLjQ0DCkvJOPeGZGG3Xji50O8kvueeKv7kX+JorAFkAuRh3AATADYALnJjsfD5nHMuySJKFQuHxGElFA7nFYsE4XoAkdV1/AHAdjeRWqxXjtNttfp9MJnMP4DIUWK/XjDMYDBgdALehwHa7ZZzpdMrhcMhut0vbtmnbNgEYocBut2MSx9cJAq7rMokgYI6ZMt/+BOaYgDnmy7vr8+ac3Q80RhuWOw5JstxxfL/tjdEmCNT7SxZbM5JksTULid55e72/DALVnsN8c0KSzDcnP0TvSbLac4LA0+uHz5vo+dTuB/7F+wf7/Z5J+P9ARAxFUSqHw4FJKIpSEREDImJomlZSVbWWTqefz6Gqak3TtJKIGJ86u+Qm3Nb2fAAAAABJRU5ErkJggg==") !important;
    	background-repeat: no-repeat !important;
    	background-position: 1px 5px !important;
    	background-size: 15px 15px !important;
    	}
        
    	#usercssloader-menu > .menu-text,
    	#usercssloader-menu > .menu-right {
        display: none !important;
    	}
    	
    	#usercssloader-menupopup > menuitem,
    	#usercssloader-menupopup > menu,
    	#usercssloader-submenupopup > menuitem,
    	#usercssloader-submenupopup > menu {
        min-height: 24px !important; /* Höhe in px anpassbar */
        max-height: 24px !important;
    	}
    Alles anzeigen
  • UserCSSLoader (2025)

    • Boersenfeger
    • 18. August 2025 um 13:47

    So hatte ich das im April auch eingestellt.

    Endor Ich teste mal dein Script und gucke, ob mir was daran fehlt. Immerhin wäre es dann auf dem neuesten Stand. ;)

    In Zeile 376 steht        let sep = $("usercssloader-ucsepalator");

    Ist das korrekt oder muss es ucseparator heißen?

  • UserCSSLoader (2025)

    • Boersenfeger
    • 18. August 2025 um 12:34

    Das nutze ich nicht...:saint: habe auch gar kein Icon vom Popupmenü dazu.
    Den Chromeordner öffne ich via ExtraConfigMenu.uc.js

    Ist denn deine Version aus #4647 nun schon komplett? Der Beitrag wurde ja 2 x editiert.

  • UserCSSLoader (2025)

    • Boersenfeger
    • 18. August 2025 um 12:05

    Ich poste hier mal meine verwendete Version, die ist zwar älter, versieht aber klaglos ihren Dienst und ist ohne japanische Schnörkel, aber mit deutschen Erklärungen. Es sind meine Anpassungspfade für den Explorer drin. Vielleicht kann der ja zur Referenz benutzt werden.

    JavaScript
    // ==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 116*
    // @charset        UTF-8
    // @version        0.0.4K+
    // @note           Aktualisierungen von BrokenHeart und Speravir - www.camp-firefox.de
    // @note           BrokenHearts Änderung: https://www.camp-firefox.de/forum/thema/138792/?postID=1263814#post1263814
    // @note           Fx92: getURLSpecFromFile() -> getURLSpecFromActualFile()
    // @note           AUTHOR_SHEET-Unterstützung hinzugefügt, wichtig: Dateiendung muss .author.css sein!
    // @note           Version 0.0.4.g ermöglicht "Styles importieren" per Mittelklick und Verwendung
    // @note           eines anderen Dateimanagers (siehe in Konfiguration), ergänzt um einen
    // @note           Parameter für den Dateimanager (vFMParameter in der Konfiguration) von aborix
    // @note           Frei verschiebbare Schaltfläche eingebaut von aborix
    // @note           0.0.4 Remove E4X
    // @note           CSSEntry-Klasse erstellt
    // @note           Style-Test-Funktion überarbeitet (später entfernt)
    // @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 und 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!
    CSS-Menü wird zur Menüleiste hinzugefü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.
    Die Tastenkombinationen können im Menü eingeblendet werden (bzw. in einem Fall ausgeblendet),
    dazu nach "acceltext" suchen und den Zeilenkommentar "//" entfernen bzw. einfügen.
    Verwenden des in "view_source.editor.path" angegebenen Editors.
    Dateiordner kann in Konfiguration geändert werden.
    **** Anleitung Ende ****/
    (function(){
    /* Konfiguration */
    // Position: als Menü anzeigen = 1, als frei verschiebbare-Schaltfläche = 0
    let position = 0;
    // alternativer Dateimanager, Bsp.:
    // let filemanager = "C:\\Programme\\totalcmd\\TOTALCMD.EXE";
    let filemanager = "H:\\TotalCommander\\TOTALCMD64.EXE";
    // eventuelle Parameter für den alternativen Dateimanager, sonst filemanagerParam = "";
    //let filemanagerParam = "/O /T";//Totalcommander
    let filemanagerParam = "";
    // Unterordner für die CSS-Dateien:
    let cssFolder = "CSS";
    // zusätzlich Chrome-Ordner im Untermenü anzeigen: 1 = ja, 0 = nein
    let showChrome = 1;
    /* Ende Konfiguration */
    ChromeUtils.importESModule("resource://gre/modules/AppConstants.sys.mjs");
    let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
    // Wenn beim Start ein anderes Fenster angezeigt wird (das zweite Fenster), wird es beendet
    let list = Services.wm.getEnumerator("navigator:browser");
    while(list.hasMoreElements()){ if(list.getNext() != window) return; }
    if (window.UCL) {
        window.UCL.destroy();
        delete window.UCL;
    }
    window.UCL = {
        vFileManager: filemanager,
        vFMParameter: filemanagerParam,
        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 = 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(cssFolder);
            }
            if (!aFolder.exists() || !aFolder.isDirectory()) {
                aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664);
            }
            delete this.FOLDER;
            return this.FOLDER = aFolder;
        },
        get CHRMFOLDER() {
            let bFolder;
            try {
                // UserCSSLoader.CHRMFOLDER verwenden
                let CHRMfolderPath = this.prefs.getCharPref("CHRMFOLDER");
                bFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
                bFolder.initWithPath(CHRMfolderPath);
            } catch (e) {
                bFolder = Services.dirsvc.get("UChrm", Ci.nsIFile);
            }
            if (!bFolder.exists() || !bFolder.isDirectory()) {
                bFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664);
            }
            delete this.CHRMFOLDER;
            return this.CHRMFOLDER = bFolder;
        },
        getFocusedWindow: function() {
            let win = document.commandDispatcher.focusedWindow;
            if (!win || win == window) win = content;
            return win;
        },
        init: function() {
            const cssmenu = $C("menu", {
                id: "usercssloader-menu",
                label: "CSS",
                tooltiptext: "UserCSSLoader\n\nLinksklick: Stylesheets anzeigen\nMittelklick: Styles importieren",
                accesskey: "S",
                //acceltext: "Alt + S",
                onclick: "if (event.button == 1) UCL.rebuild()"
            });
            const menupopup = $C("menupopup", {
                id: "usercssloader-menupopup"
            });
            cssmenu.appendChild(menupopup);
            let menu = $C("menu", {
                label: "Style-Loader-Menü",
                id: "style-loader-menu",
                accesskey: "M",
                //acceltext: "Alt + M"
            });
            menupopup.appendChild(menu);
            menupopup.appendChild($C("menuseparator"));
            let mp = $C("menupopup", { id: "usercssloader-submenupopup" });
            menu.appendChild(mp);
            mp.appendChild($C("menuitem", {
                label: "Styles importieren",
                accesskey: "I",
                //acceltext: "Alt + I",
                oncommand: "UCL.rebuild();"
            }));
            mp.appendChild($C("menuseparator"));
            mp.appendChild($C("menuitem", {
                label: "CSS-Datei erstellen",
                accesskey: "E",
                //acceltext: "Alt + E",
                oncommand: "UCL.create();"
            }));
            mp.appendChild($C("menuitem", {
                label: "CSS-Ordner öffnen",
                accesskey: "O",
                //acceltext: "Alt + O",
                oncommand: "UCL.openFolder();"
            }));
            if (showChrome === 1) {
                mp.appendChild($C("menuitem", {
                    label: "Chrome-Ordner öffnen",
                    accesskey: "X",
                    acceltext: "Alt + X",
                    oncommand: "UCL.openCHRMFolder();"
                }));
            }
            mp.appendChild($C('menuseparator'));
            mp.appendChild($C("menuitem", {
                label: "userChrome.css bearbeiten",
                hidden: false,
                oncommand: "UCL.editUserCSS('userChrome.css');"
            }));
            mp.appendChild($C("menuitem", {
                label: "userContent.css bearbeiten",
                hidden: false,
                oncommand: "UCL.editUserCSS('userContent.css');"
            }));
            menu = $C("menu", {
                label: ".uc.css",
                accesskey: "U",
                //acceltext: "Alt + U",
                hidden: !UCL.USE_UC
            });
            menupopup.appendChild(menu);
            mp = $C("menupopup", { id: "usercssloader-ucmenupopup" });
            menu.appendChild(mp);
            mp.appendChild($C("menuitem", {
                label: "Importieren(.uc.js)",
                oncommand: "UCL.UCrebuild();"
            }));
            mp.appendChild($C("menuseparator", { id: "usercssloader-ucseparator" }));
            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);
            if (position === 1) {
                let refNode = $('helpMenu');
                refNode.parentNode.insertBefore(cssmenu, refNode.nextSibling);
            }
            
            $("mainKeyset").appendChild($C("key", {
                id: "usercssloader-rebuild-key",
                oncommand: "UCL.rebuild();",
                key: "R",
                modifiers: "alt",
            }));
            
            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", 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 importieren";
            }
        },
        loadCSS: function(aFile) {
            let 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) {
            let CSS = this.readCSS[aLeafName];
            let 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",
                    oncommand : "UCL.toggle('"+ aLeafName +"');",
                    onclick : "UCL.itemClick(event);",
                    onmouseup : "if (event.button == 1) event.preventDefault();",
                    tooltiptext : "Linksklick: an/aus, Menü schließt\nMittelklick: an/aus, Menü bleibt offen\nRechtsklick: bearbeiten\nStrg+Linksklick: im Dateimanager anzeigen"
                    });
                document.getElementById("usercssloader-menupopup").appendChild(menuitem);
            }
            menuitem.setAttribute("checked", CSS.enabled);
        },
        toggle: function(aLeafName) {
            let CSS = this.readCSS[aLeafName];
            if (!CSS || event.ctrlKey) return;
            CSS.enabled = !CSS.enabled;
            this.rebuildMenu(aLeafName);
        },
        itemClick: function(event) {
            let label = event.currentTarget.getAttribute("label");
            if (event.button === 0) {
                if (event.ctrlKey) {
                    event.preventDefault();
                    event.stopPropagation();
                    UCL.openFolder(label);
                } else {return;}
            }
                    event.preventDefault();
                    event.stopPropagation();
            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;
        },
        openFolder:function(label){
            const PathSep = AppConstants.platform === "win" ? "\\" : "/";
            let target= this.FOLDER.path + PathSep + label;
            if (this.vFileManager.length !== 0) {
                let file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
                let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
                let args = [this.vFMParameter,target];
                file.initWithPath(this.vFileManager);
                process.init(file);
                // Verzeichnis mit anderem Dateimanager öffnen
                process.run(false, args, args.length);
            } else {
                // Verzeichnis mit Dateimanager des Systems öffnen
                this.FOLDER.launch();
            }
        },
        openCHRMFolder:function(){
            if (this.vFileManager.length !== 0) {
                let file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
                let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
                let args = [this.vFMParameter,this.CHRMFOLDER.path];
                file.initWithPath(this.vFileManager);
                process.init(file);
                // Verzeichnis mit anderem Dateimanager öffnen
                process.run(false, args, args.length);
            } else {
                // Verzeichnis mit Dateimanager des Systems öffnen
                this.CHRMFOLDER.launch();
            }
        },
        editUserCSS: function(aLeafName) {
            let file = Services.dirsvc.get("UChrm", Ci.nsIFile);
            file.appendRelativePath(aLeafName);
            this.edit(file);
        },
        edit: function(aFile) {
            let 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 {
                let UI = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
                UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8";
                let path = UI.ConvertFromUnicode(aFile.path);
                let app = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
                app.initWithPath(editor);
                let process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.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-ucseparator");
            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",
                    oncommand : "if (!event.ctrlKey) {this.setAttribute('checked', !(this.css.disabled = !this.css.disabled));}",
                    onmouseup : "if(event.button === 1) event.preventDefault();",
                    onclick : "UCL.UCItemClick(event);"
                });
                m.css = css;
                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(Components.interfaces.nsIFileProtocolHandler).getURLSpecFromActualFile(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: Components.classes["@mozilla.org/content/style-sheet-service;1"]
                .getService(Components.interfaces.nsIStyleSheetService),
        _enabled: false,
        get enabled() {
            return this._enabled;
        },
        set enabled(isEnable) {
            let aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile)
            aFile.initWithPath(this.path);
            let isExists = aFile.exists(); // true, wenn die Datei existiert
            let lastModifiedTime = isExists ? aFile.lastModifiedTime : 0;
            let isForced = this.lastModifiedTime != lastModifiedTime; // true, wenn es eine Änderung in der Datei gibt
            let fileURL = Services.io.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler).getURLSpecFromActualFile(aFile);
            let 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;
        },
    };
    UCL.init();
    function $(id) { return document.getElementById(id); }
    function $A(arr) { return Array.slice(arr); }
    function $C(name, attr) {
        let el = document.createXULElement(name);
        if (attr) Object.keys(attr).forEach(function(n) {
            if(n === "oncommand") {
                el.addEventListener('command', function(event) { Function(attr[n])(); });
            }
            else if(n === "onclick") {
                el.addEventListener('click', function(event) { Function(attr[n])(); });
            }
            else if(n === "onmouseup") {
                el.addEventListener('mouseup', function(event) { Function(attr[n])(); });
            }
            else {
                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.getDay()).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() { Application.console.log(Array.slice(arguments)); }
    })();
    Alles anzeigen
  • Sidebar mit Lesezeichen bei Vollbild automatisch ausblenden und bei hover am linken Rand einblenden

    • Boersenfeger
    • 18. August 2025 um 11:29

    Wenn du was gebrauchen kannst, sollte es mich freuen! Lass dir die Zeit... es sind ja letztlich nur Spielereien ;)

  • Sidebar mit Lesezeichen bei Vollbild automatisch ausblenden und bei hover am linken Rand einblenden

    • Boersenfeger
    • 16. August 2025 um 16:38

    Moin, ich nutze für das Einblenden via Hover der Sidebar folgenden CSS:

    CSS
    @-moz-document url("chrome://browser/content/places/bookmarksSidebar.xhtml"),
                   url("chrome://browser/content/browser.xhtml") {
    
    				   
    #sidebar-main > sidebar-main {
        display: none !important;
    }
    
    #sidebar-box {
        display: flex !important;
        position: absolute !important;
        top: 0;
        bottom: 1px;
        width: 260px !important;
        z-index: 100 !important;
        opacity: 0 !important;
        margin-left: -255px !important;
        transition: margin-left .5s linear .4s, opacity .6s ease-in .2s !important;
    }
    
    #sidebar-box:hover {
        z-index: 100 !important;
        opacity: 1 !important;
        margin-left: 0 !important;
        transition: margin-left .66s !important;
    }
    
    #bookmarks-view-children {
        margin-top: -100px !important;
        margin-left: -15px !important;
    }
    
    #sidebar-splitter {
        display: none !important;
    }
    
    #sidebar-header {
        display: none !important;
    }
    
    /* Beschriftungsende anpassen */
    treechildren::-moz-tree-cell,
    treechildren::-moz-tree-cell-text {
        margin-inline-end: -8px !important;
    }
    
    /* Lesezeichensidebar Icon-Abstand zur linken Seite */
    .sidebar-placesTreechildren[view="bookmarks-view"] {
        margin-left: -10px !important;
    }
    
    /* Lesezeichensidebar Icon-Abstand */
    #bookmarks-view-children:-moz-tree-image {
        margin-right: 5px !important;
    }
    
    /* Suchsymbol in der Sidebar ausblenden */
    
    #input[type="search"] {
      padding-inline-start: var(--space-medium) !important;
      background-image: none !important;
    }
    
    /* Suchleiste Schrift-Größe einstellen */
    .sidebar-placesTreechildren,
    sidebarheader,
    #sidebar-search-label,
    #search-box {
        font-size: 16px !important;
        font-family: Comic Sans MS, sans-serif !important;
    }
    
    /* Sidebar Hintergrundfarbe */
    #sidebar {
        background: #c1e7bb !important;
        opacity: 1 !important;
    }
    
    /* Lesezeichen-Sidebar Suchfeld und auch Haupt-Suchfeld ohne Eintrag */
    ::placeholder {
        color: transparent !important;
    }
    
    /* Lesezeichen Sidebar öffnende Dreiecke entfernen */
    #bookmarksPanel treechildren::-moz-tree-twisty(closed),
    #bookmarksPanel treechildren::-moz-tree-twisty(open) {
        height: 0!important;
        width: 0!important;
        display: none!important;
    }
    
    /* Lesezeichen verwalten */
    treechildren::-moz-tree-image(container) {
        list-style-image: url('data:image/gif;base64,R0lGODlhEAAQAOZMAP/////MAF06AJhlAJNgAP//AP/lAP/UAJViAP/JANShAJRhAP/OAJRgAOy5AMaSAP/nAMyZAP/IAP/NAOazAP/RAMmVALaAAH5TAJNfAM2aAP/dT//XOv/KAOPOkMeRAP/nhOSxAOu4AP3KAOrTkv/nrv//1c6bAKdyAP/TAP/bPdWsMr6LA7iCALqGALiEAJNeAMCMAP/gcv/eYdGdAP/TEP/mgv/2y//gg/3JAP/ila97AP/aKsWPAJFbAJZgALeBAMiVAPC9AP/rOum2AHlQAP/4zP//z//jPpNdAP/LANixNP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEwALAAAAAAQABAAAAefgEyCg4SFhoeFDQ0LjIiCCyU5IwEBBAiXCAOEBDohFBREIg6jQgibODQKqgonDz0fPkkwDQMEMhYRERpBMUsAv8C1Mw8uLUAXKwA2EgkJDJoEGy8swAAgCZQMz0wEKigkN8wJHZQBFZrcPDsAHErllBMT6AQ1HkYVKQf6++hMGUgAhhgYSBAChH4/TBwpwLAhw35MMAiYSLFiEUcYmQQCADs=') !important;
    }
    
    /* Zeilenhöhe reduzieren */
    .sidebar-placesTree treechildren::-moz-tree-row,
    .placesTree treechildren::-moz-tree-row {
        min-height: 20px !important;
    }
    
    /* Ordner aus der Sidebar ausblenden */
    .sidebar-placesTreechildren[view="bookmarks-view"] {
    
        margin-top: -10px!important;
    }
    
    /* Fokusring um Ordner entfernen */
    treechildren {
        --default-focusring: 0px !important;
    }
    }
    Alles anzeigen

    Ich nutze Notepad++ für die Bearbeitung der Codes. Damit kannst du ab Zeile 41 zunächst mal meine weiteren Anpassungen auskommentieren.

    Damit funktioniert auch im Vollbild via Hover die Einblendung der Sidebar. Allerdings muss die Maus dann in der Sidebar bleiben, sonst verschwindet sie wieder.

  • Was hört Ihr gerade?

    • Boersenfeger
    • 16. August 2025 um 16:30
    Sportschau - Sport-News, Live-Ticker, Videos, Ergebnisse und Tabellen
    Nachrichten, Berichte der Fußball-Bundesliga, Live-Ticker und Ergebnisse, Livestreams sowie das Tor des Monats - das Sport-Angebot der ARD.
    www.sportschau.de

    Pokal

  • Beim Einfügen einer Adresse Hausnummer doppelt

    • Boersenfeger
    • 16. August 2025 um 10:10

    Ein Zusatzfeld zur Hausnummer ist z.B. der Buchstabe A etc.

    Aus eigener Erfahrung weiß ich, dass bei Vorliegen einer solchen Adresse das dann korrekt eingetragen wird. Es ist aber definitiv von den Vorgaben der Webseite abhängig.

  • Manche Webseiten werden in Firefox einfach nicht gestartet,

    • Boersenfeger
    • 15. August 2025 um 17:11

    Dann ist ja gut...

  • Manche Webseiten werden in Firefox einfach nicht gestartet,

    • Boersenfeger
    • 15. August 2025 um 15:48

    Es handelt sich dann wohl um Firmencomputer? Zu denken wäre dann auch an eine (fehlerhafte) Richtlinie, die dir der Administrator erläutern kann!?

  • Wie lässt sich die Schrift in den Tab stets vertikal zentriert halten?

    • Boersenfeger
    • 15. August 2025 um 15:27

    Solche Vorschläge sollte man im Bereich Schaltzentrale vortragen... ;)

    Ansonsten bin ich raus hier.

  • Wie lässt sich die Schrift in den Tab stets vertikal zentriert halten?

    • Boersenfeger
    • 14. August 2025 um 18:12

    Im sorry, mit diesen Schnipseln kann doch keiner testen, ob dein Code nicht an anderer Stelle Syntax-Fehler enthält bzw. ob dort Regeln drin sind, die sich gegenseitig ausschließen usw. usw. ich sag dann mal Tschüß

  • Beta Versionen von uBlock Origin zeigt Signing pending - Erledigt

    • Boersenfeger
    • 14. August 2025 um 15:35
    Zitat von Sören Hentzschel

    Ansonsten ist das eher eine Frage direkt an den Entwickler, wieso er seine Beta-Versionen nicht mehr signiert. Die Signierung selbst ist nämlich ein automatisierter Vorgang, da gibt es keine Wartezeiten.

    Danke! Sören Hentzschel Ich werde es einfach abwarten und beim nächsten Release-Update wechsele ich dann dorthin.

    milupo  2002Andreas Die about:config Einstellung ist mir durchaus bekannt, ich will sie aber nicht nutzen aus o.a. Gründen.

    Danke an Euch. Thema erledigt! :)

  • Sicherheitslücke in WinRAR bereits seit Wochen ausgenutzt

    • Boersenfeger
    • 14. August 2025 um 11:16

    Mira_Belle Danke für den Hinweis! :)

Unterstütze uns!

Jährlich (2025)

101,9 %

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

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