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

Beiträge von Mira_Belle

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 15. Januar 2025 um 15:29
    Zitat von Endor

    Hallo Mira_Belle.
    Vielen Dank für Deine Version habe ich auch getestet.
    Aber da funktionieren die Einträge in den Unterordner, zbs. Chromeordner öffen usw.
    nicht. Da tut sich bei Klick nichts. Mit der Version von BrokenHeart funktioniert alles.
    Trotzdem auch Dir vielen Dank für Deine Mühe.

    Habe das Skript mit BrokenHeart 's Korrektur versehen!

    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 4 - 115*
    // @charset        UTF-8
    // @version        0.0.4r4
    // @note           Fx92: getURLSpecFromFile() -> getURLSpecFromActualFile()
    // @note           AUTHOR_SHEET Unterstützung hinzugefügt, wichtig: Dateiendung muss .author.css sein!
    // @note           Version 0.0.4.g ermoeglicht "Styles importieren" per Mittelklick und Verwendung
    // @note           eines anderen Dateimanager (s. vFileManager in Zeile 53)
    // @note           Frei verschiebbare Schaltfläche eingebaut von aborix 
    // @note           0.0.4 Remove E4X
    // @note           CSSEntry-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
    // @note           2025.01.14 EventListener angepasst, bzw. korrigiert by Mira Bellenbaum
    // @note           2025.01.14 Bugfix
    // ==/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 andere außer USER_SHEET werden gelesen. Da der Inhalt der Datei nicht überprüft wird,
    darauf achten, @namespace Angabe 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
    
    Verwenden des in "view_source.editor.path" angegebenen Editors
    Ordner kann geändert werden, indem ein Pfad in "UserCSSLoader.FOLDER" eingefügt wird
    
     **** Anleitung Ende ****/
    
    (function(){
    
    let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
    if (!window.Services)
    	Cu.import("resource://gre/modules/Services.jsm");
    // 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;
    }
    const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
    
    window.UCL = {
    	// vFileManager: 'C:\\Programme\\totalcmd\\TOTALCMD.EXE',
    	vFileManager: '',
    	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, endor);
    		}
    		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, endor);
    		}
    		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: "C"
            });
            // EventListener für den Klick auf das Menü hinzufügen
            cssmenu.addEventListener("click", function(event) {
                if (event.button === 1) {
                    UCL.rebuild();
                }
            });
        
            const menupopup = $C("menupopup", {
                id: "usercssloader-menupopup"
            });
            cssmenu.appendChild(menupopup);
        
            let menu = $C("menu", {
                label: "Style Loader Menü",
                accesskey: "M"
            });
            menupopup.appendChild(menu);
            let mp = $C("menupopup", { id: "usercssloader-submenupopup" });
            menu.appendChild(mp);
            mp.appendChild($C("menuitem", {
                label: "Styles importieren",
                accesskey: "R",
                acceltext: "Alt + R",
                oncommand: "UCL.rebuild();"
            }));
            mp.appendChild($C("menuseparator"));
            mp.appendChild($C("menuitem", {
                label: "CSS Datei erstellen",
                accesskey: "D",
                oncommand: "UCL.create();"
            }));
            mp.appendChild($C("menuitem", {
                label: "CSS Ordner öffnen",
                accesskey: "O",
                oncommand: "UCL.openFolder();"
            }));
            mp.appendChild($C("menuitem", {
                label: "Chrome Ordner öffnen",
                accesskey: "c",
                oncommand: "UCL.openCHRMFolder();"
            }));
            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');"
            }));
            mp.appendChild($C("menuseparator"));
            mp.appendChild($C("menuitem", {
                label: "Style Test (Chrome)",
                id: "usercssloader-test-chrome",
                hidden: true,
                accesskey: "C",
                oncommand: "UCL.styleTest(window);"
            }));
            mp.appendChild($C("menuitem", {
                label: "Style Test (Web)",
                id: "usercssloader-test-content",
                hidden: true,
                accesskey: "W",
                oncommand: "UCL.styleTest();"
            }));
            mp.appendChild($C("menuitem", {
                label: "Styles dieser Seite auf userstyles.org finden",
                accesskey: "S",
                oncommand: "UCL.searchStyle();"
            }));
        
            menu = $C("menu", {
                label: ".uc.css",
                accesskey: "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);
            
            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);
        
            window.addEventListener("unload", this);
        },
        
    	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 = "Style importiert";
    			else
    				XULBrowserWindow.statusTextField.label = "Styles importieren";
    		}
    	},
    	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"
                });
                
                // EventListener für 'command' hinzufügen
                menuitem.addEventListener("command", function() {
                    UCL.toggle(aLeafName);
                });
                
                // EventListener für 'mouseup' hinzufügen
                menuitem.addEventListener("mouseup", function(event) {
                    if (event.button === 1) {
                        event.preventDefault();
                    }
                });
        
                // EventListener für 'click' hinzufügen
                menuitem.addEventListener("click", function(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();
    		});
    	},
    	searchStyle: function() {
    		let word;
    		try {
    			word = gBrowser.currentURI.host;
    		} catch {
    			word = gBrowser.currentURI.spec;
    		}
    		openWebLinkIn("https://userstyles.org/styles/search/" + word, "tab", {});
    	},
    	openFolder:function(){
    		if (this.vFileManager.length != 0) {
    			var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
    			var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
    			var args=[this.FOLDER.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.FOLDER.launch();
    		}
    	},
    	openCHRMFolder:function(){
    		if (this.vFileManager.length != 0) {
    			var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
    			var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
    			var args=[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) {
    		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 = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
    			UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8";
    			var path = UI.ConvertFromUnicode(aFile.path);
    			var app = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
    			app.initWithPath(editor);
    			var 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"
                });
            
                m.css = css;
            
                // EventListener für 'command' hinzufügen
                m.addEventListener("command", function() {
                    m.setAttribute('checked', !(m.css.disabled = !m.css.disabled));
                });
            
                // EventListener für 'mouseup' hinzufügen
                m.addEventListener("mouseup", function(event) {
                    if (event.button === 1) {
                        event.preventDefault();
                    }
                });
            
                // EventListener für 'click' hinzufügen
                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(Components.interfaces.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: Components.classes["@mozilla.org/content/style-sheet-service;1"]
                        .getService(Components.interfaces.nsIStyleSheetService),
    	_enabled: false,
    	get enabled() {
    		return this._enabled;
    	},
    	set enabled(isEnable) {
    		var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile)
    		aFile.initWithPath(this.path);
    	
    		var isExists = aFile.exists(); // Wenn die Datei existiert true
    		var lastModifiedTime = isExists ? aFile.lastModifiedTime : 0;
    		var isForced = this.lastModifiedTime != lastModifiedTime; // Wenn es eine Änderung in der Datei gibt true
    
    		var fileURL = Services.io.getProtocolHandler("file").QueryInterface(Components.interfaces.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: Components.classes["@mozilla.org/content/style-sheet-service;1"]
                        .getService(Components.interfaces.nsIStyleSheetService),
    	preview_code: "",
    	saved: false,
    	init: function() {
    		this.dialog = openDialog(
    			"data:text/html;charset=utf8,"+encodeURIComponent('<!DOCTYPE HTML><html lang="de"><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="Vorschau" id="Vorschau"/></td>\
    							<td><input type="button" value="Speichern" id="Speichern"/></td>\
    							<td width="80%"><span class="log"></span></td>\
    							<td><input type="button" value="Schließen" id="Schliessen"/></td>\
    						</tr>\
    					</table>\
    				';
    				this.textbox = doc.querySelector("textarea");
    				this.previewButton = doc.querySelector('input[value="Vorschau"]');
    				this.saveButton = doc.querySelector('input[value="Speichern"]');
    				this.closeButton = doc.querySelector('input[value="Schließen"]');
    				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, endor, 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) {
    	var el = document.createXULElement(name);
    	if (attr) Object.keys(attr).forEach(function(n) { el.setAttribute(n, attr[n]) });
    	return el;
    }	*/
    function $C(name, attr) {
        var 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.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() { Application.console.log(Array.slice(arguments)); }
    
    })();
    Alles anzeigen

    Schaut Deines auch so aus?

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 15. Januar 2025 um 14:56

    lenny2  2002Andreas

    Löscht den Teil des Skripts, der verursacht Fehler und ich bekomme es gerade nicht hin!
    Das Skript an sich funktioniert ja!

    JavaScript
        // populate tab historis for tooltip
        var undoItems = UndoListInTabmenu._ss.getClosedTabDataForWindow(window);
        for (var i = 0; i < undoItems.length; i++) {
          var entries = undoItems[i].state ? undoItems[i].state.entries : undoItems[i].entries;
          var tooltiptext = "";
          for (var j = entries.length - 1; j > -1; j--){
            if (j != entries.length - 1)
              tooltiptext += "\n";
            tooltiptext += parseInt(j + 1, 10) + ". " + entries[j].title;
          }
          undoPopup.childNodes[i + 2/*restore all, sep*/].setAttribute("tooltiptext", tooltiptext); 
        }
    Alles anzeigen

    Oder, hier noch einmal das ganze Skript mit "neuen" Header!

    JavaScript
    // ==UserScript==
    // @name           UndoListInTabmenuToo
    // @namespace      http://space.geocities.yahoo.co.jp/gl/alice0775
    // @description    UndoListInTabmenuToo.uc.js
    // @include        main
    // @compatibility  Firefox 135
    // @author         Alice0775
    // @version        2025/01/15 fix bug by Mira Bellenbaum (Tooltips deleted because incorrect)
    // @version        2025/01/05 remove redundant menuitems
    // @version        2025/01/05 fix bug
    // @version        2024/12/22 fix Bug 1936336 - Disallow inline event handlers
    // @version        2024/08/23 Bug 1690613 - Allow access to url/title/favIconUrl without "tabs" permission in session API
    // @version        2023/06/16 08:00 Bug 1819675 - Expand recently closed tabs to include all Windows
    // @version        2022/05/10 fix ref to context-media-eme-separator
    // @version        2021/12/09 remove JSON.parse (Bug 1733425)
    // @version        2021/04/25 fix 1689378
    // @version        2019/11/14 remove eval
    // @version        2019/06/30 10:00 Bug 1555060 Convert <tabs> to a custom element
    // @version        2019/06/24 23:00 wait for gBrowser initialized
    // @version        2019/05/21 08:30 fix 69.0a1 Bug 1551320 - Replace all createElement calls in XUL documents with createXULElement
    // @version        2018/05/10 60
    // @version        2017/11/18 nsIPrefBranch to nsIPrefBranch
    // @version        2010/09/18 00:00 4.0b7pre
    // @version        2009/02/03 13:00 Tab-Verlauf im Tooltip anzeigen
    // @Note           Fügt die UndoClose-Tab-Liste zu Tabs und Kontextmenüs hinzu
    // @OriginalCode   Orginalcode aus browser.js für populateUndoSubmenu verwendet
    // @version        2018/05/09 15:00 61
    // ==/UserScript==
    // @version        2010/03/26 13:00  Minefield/3.7a4pre Bug 554991 -  allow tab context menu to be modified by normal XUL overlays
    // @version        2010/03/15 00:00  Minefield/3.7a4pre Bug 347930 -  Tab strip should be a toolbar instead
    // @version        2009/09/09 15:00 Mittelklick-Handhabung
    // @version        2009/09/03 22:00 Firefox3.7a1pre Funktion wurde wieder hergestellt.(Bug 489925. getElementById should not return anonymous nodes)
    // @version        2009/08/22 00:00 Firefox3.6 Ändern des stringbandle
    // @version        2009/04/24 00:00 #394759 [Firefox:Session Restore]-Add undo close window feature
    // @version        2008/10/12 18:00 Fx3.0.4pre Mittelklick-Popupmenü wurde nicht geschlossen und andere Korrekturen
    // @version        2007/10/05 10:00
    
    var UndoListInTabmenu = {
    // -- config --
      TABCONTEXTMENU : true ,  //Im Tabkontextmenü: anzeigen: true, nicht anzeigen: false
      CONTEXTMENU    : true ,  //Im Hauptkontextmenü: anzeigen: true , nicht anzeigen: false
    // -- config end--
      ss: null,
    
      get tabContext() {
        return document.getElementById("tabContextMenu");
      },
    
      get navigatorBundle() {
        return Services.strings.createBundle(
               "chrome://browser/locale/browser.properties"
               );
      },
    
      init: function(){
        var css =`
          #tabContextUndoList :is(menu,menuitem),
          #ContextUndoList :is(menu,menuitem) {
            min-height: 20px !important;
            padding-top: 0 !important; 
            padding-bottom: 0 !important;
          } 
        `;  
      var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
      var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(css));
      sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
    
        if (this.TABCONTEXTMENU){
          //Tabkontextmenü
          var tabContext = this.tabContext;
          this.makePopup(tabContext, null, "tabContextUndoList");
        }
        if (this.CONTEXTMENU){
          //Hauptkontextmenü
          var contextMenu = document.getElementById("contentAreaContextMenu");
          var refItem = document.getElementById("context-media-eme-separator");
          this.makePopup(contextMenu, refItem, "ContextUndoList");
        }
        // Geschlossene Tabs dem NS-Sitzungsspeicher entnehmen
        this._ss = SessionStore;
    
      },
    
      makePopup: function(popup, refItem, id){
        var menu;
        //label
        const locale = "de";
        
        // "Liste Kürzlich geschlossener Fenster"
        menu = document.createXULElement("menu");
        menu.setAttribute("id", "historyUndoWindowMenu3");
        menu.setAttribute("label", "K\u00FCrzlich geschlossene Fenster");
        menu.setAttribute("accesskey", "F");
        menu.setAttribute("disabled", "false");
        popup.insertBefore(menu, refItem);
    
        menupopup = document.createXULElement("menupopup");
        menu.appendChild(menupopup);
        menupopup.setAttribute("id", "historyUndoWindowPopup3");
        //menu.setAttribute("onpopupshowing", "UndoListInTabmenu.populateUndoWindowSubmenu(this);");
        menupopup.addEventListener("popupshowing", (event) => UndoListInTabmenu.populateUndoWindowSubmenu(event.currentTarget));
    
        //Liste kürzlich geschosener Tabs
        const LABELTEXT = "K\u00FCrzlich geschlossene Tabs";    //create menu
        menu = document.createXULElement("menu");
        menu.setAttribute("label", LABELTEXT);
        menu.setAttribute("accesskey", "K");
        if (id)
          menu.setAttribute("id", id);
        //menu.setAttribute("disabled", true);
        var menupopup = document.createXULElement("menupopup");
        menupopup.addEventListener("popupshowing", () => UndoListInTabmenu.populateUndoSubmenu(menupopup));
        //menupopup.setAttribute("onpopupshowing", "UndoListInTabmenu.populateUndoSubmenu(this);");
        menu.appendChild(menupopup);
        popup.insertBefore(menu, refItem);
    
        //Eventlistener hinzufügen
        popup.addEventListener('popupshowing', () => {
          UndoListInTabmenu.toggleRecentlyClosedWindows(document.getElementById("historyUndoWindowMenu3"));
          // no restorable tabs, so make sure menu is disabled, and return
          if (UndoListInTabmenu._ss.getClosedTabCount(window) == 0) {
            menu.setAttribute("disabled", true);
            //menu.setAttribute("hidden", true);
            return;
          }
          menu.removeAttribute("disabled");
          //menu.setAttribute("hidden", false);
        },false);
      },
    
      /**
       * Befüllen, wenn das Chronik-Menü geöffnet ist (Fx3.6)
       */
      populateUndoSubmenu: function(undoPopup) {
    		while (undoPopup.hasChildNodes()) {
    			undoPopup.removeChild(undoPopup.firstChild);
    		}
    		var utils = RecentlyClosedTabsAndWindowsMenuUtils;
    		var tabsFragment = utils.getTabsFragment(
    		  window,
          "menuitem",
          /* aPrefixRestoreAll = */ true,
          "menu-history-reopen-all-tabs"
        );
    		undoPopup.appendChild(tabsFragment);
    		  
    
        // "Append Clear undo close tb list"
        undoPopup.appendChild(document.createXULElement("menuseparator"));
    
        let m = undoPopup.appendChild(document.createXULElement("menuitem"));
        m.setAttribute("label", "Liste der letzten Tabs l\u00F6schen");
        m.setAttribute("accesskey", "C");
        m.addEventListener("command", () => {
          let prefs = Services.prefs;
          let max_undo = prefs.getIntPref("browser.sessionstore.max_tabs_undo");
          prefs.setIntPref("browser.sessionstore.max_tabs_undo", 0);
          prefs.setIntPref("browser.sessionstore.max_tabs_undo", max_undo);
        }, false);
      },
    
      toggleRecentlyClosedWindows: function PHM_toggleRecentlyClosedWindows(menu) {
        // enable/disable the Recently Closed Windows sub menu
        // no restorable windows, so disable menu
        if (this._ss.getClosedWindowCount() == 0)
          menu.setAttribute("disabled", true);
        else
          menu.removeAttribute("disabled");
      },
    
      /**
       * Populate when the history menu is opened
       */
      populateUndoWindowSubmenu: function PHM_populateUndoWindowSubmenu(undoPopup) {
    		while (undoPopup.hasChildNodes()) {
    			undoPopup.removeChild(undoPopup.firstChild);
    		}
    		let utils = RecentlyClosedTabsAndWindowsMenuUtils;
    		let windowsFragment = utils.getWindowsFragment(
          window,
          "menuitem",
          /* aPrefixRestoreAll = */ true,
          "menu-history-reopen-all-windows"
        );
        undoPopup.appendChild(windowsFragment);
        undoPopup.firstChild.setAttribute("accesskey", "R");
    
        // "Append Clear undo close window list"
        undoPopup.appendChild(document.createXULElement("menuseparator"));
    
        m = undoPopup.appendChild(document.createXULElement("menuitem"));
        m.setAttribute("label", "Liste der kürzlich geschlossenen Fenster l\u00F6schen");
        m.setAttribute("accesskey", "C");
        m.addEventListener("command", () => {
          for (let i = SessionStore.getClosedWindowCount() -1; i >= 0; i--)
            SessionStore.forgetClosedWindow(i);
        }, false);
      }
    };
    
    // Wir sollten die Weiterleitung nur starten, wenn das Browserfenster den Startprozess abgeschlossen hat
    // Ansonsten sollten wir warten, bis der Start abgeschlossen ist.
    if (gBrowserInit.delayedStartupFinished) {
      UndoListInTabmenu.init();
    } else {
      let delayedStartupFinished = (subject, topic) => {
        if (topic == "browser-delayed-startup-finished" &&
            subject == window) {
          Services.obs.removeObserver(delayedStartupFinished, topic);
          UndoListInTabmenu.init();
        }
      };
      Services.obs.addObserver(delayedStartupFinished,
                               "browser-delayed-startup-finished");
    }
    Alles anzeigen
  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 15. Januar 2025 um 14:28

    lenny2 sorry, da weiß ich gerade auch nicht weiter!
    Wenn es Dich stört, "klammere" die Funktion einfach aus.

    JavaScript
       /*     if (undoPopup.childNodes[i + 2]) {
              undoPopup.childNodes[i + 2].setAttribute("tooltiptext", tooltiptext);
          }		*/

    Wenn ich es berichtigt bekomme, poste ich hier.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 15. Januar 2025 um 10:16

    lenny2  2002Andreas
    Fehler behoben!
    In diesem Skript:!:

    JavaScript
    // ==UserScript==
    // @name           UndoListInTabmenuToo
    // @namespace      http://space.geocities.yahoo.co.jp/gl/alice0775
    // @description    UndoListInTabmenuToo.uc.js
    // @include        main
    // @compatibility  Firefox 135
    // @author         Alice0775
    // @version        2025/01/15 fix bug by Mira Bellenbaum
    // @version        2025/01/05 remove redundant menuitems
    // @version        2025/01/05 fix bug
    // @version        2024/12/22 fix Bug 1936336 - Disallow inline event handlers
    // @version        2024/08/23 Bug 1690613 - Allow access to url/title/favIconUrl without "tabs" permission in session API
    // @version        2023/06/16 08:00 Bug 1819675 - Expand recently closed tabs to include all Windows
    // @version        2022/05/10 fix ref to context-media-eme-separator
    // @version        2021/12/09 remove JSON.parse (Bug 1733425)
    // @version        2021/04/25 fix 1689378
    // @version        2019/11/14 remove eval
    // @version        2019/06/30 10:00 Bug 1555060 Convert <tabs> to a custom element
    // @version        2019/06/24 23:00 wait for gBrowser initialized
    // @version        2019/05/21 08:30 fix 69.0a1 Bug 1551320 - Replace all createElement calls in XUL documents with createXULElement
    // @version        2018/05/10 60
    // @version        2017/11/18 nsIPrefBranch to nsIPrefBranch
    // @version        2010/09/18 00:00 4.0b7pre
    // @version        2009/02/03 13:00 ツールチップにタブ内履歴を表示するようにした
    // @Note           タブやコンテキストメニューにもUndoClose Tab Listを追加するもの
    // @OriginalCode   browser.jsからpopulateUndoSubmenuを拝借し, ごにょごにょした
    // @version        2018/05/09 15:00 61
    // ==/UserScript==
    // @version        2010/03/26 13:00  Minefield/3.7a4pre Bug 554991 -  allow tab context menu to be modified by normal XUL overlays
    // @version        2010/03/15 00:00  Minefield/3.7a4pre Bug 347930 -  Tab strip should be a toolbar instead
    // @version        2009/09/09 15:00 中クリック処理
    // @version        2009/09/03 22:00 Firegox3.7a1preで動かなくなっていたのを修正(Bug 489925. getElementById should not return anonymous nodes)
    // @version        2009/08/22 00:00 Firegox3.6 stringbandleの変更による
    // @version        2009/04/24 00:00 #394759 [Firefox:Session Restore]-Add undo close window feature
    // @version        2008/10/12 18:00 Fx3.0.4pre中クリックしたときメニューポップアップが閉じないおよびその他fix
    // @version        2007/10/05 10:00
    
    var UndoListInTabmenu = {
    // -- config --
      TABCONTEXTMENU : true ,  //Im Tabkontextmenü: anzeigen: true, nicht anzeigen: false
      CONTEXTMENU    : true ,  //Im Hauptkontextmenü: anzeigen: true , nicht anzeigen: false
    // -- config end--
      ss: null,
    
      get tabContext() {
        return document.getElementById("tabContextMenu");
      },
    
      get navigatorBundle() {
        return Services.strings.createBundle(
               "chrome://browser/locale/browser.properties"
               );
      },
    
      init: function(){
    
        if (this.TABCONTEXTMENU){
          //Tabkontextmenü
          var tabContext = this.tabContext;
          this.makePopup(tabContext, null, "tabContextUndoList");
        }
        if (this.CONTEXTMENU){
          //Hauptkontextmenü
          var contextMenu = document.getElementById("contentAreaContextMenu");
          var refItem = document.getElementById("context-media-eme-separator");
          this.makePopup(contextMenu, refItem, "ContextUndoList");
        }
        // Geschlossene Tabs dem NS-Sitzungsspeicher entnehmen
        this._ss = SessionStore;
    
      },
    
      makePopup: function(popup, refItem, id){
        var menu;
        //label
        const locale = "de";
        
        // "Liste Kürzlich geschlossener Fenster"
        menu = document.createXULElement("menu");
        menu.setAttribute("id", "historyUndoWindowMenu3");
        menu.setAttribute("label", "K\u00FCrzlich geschlossene Fenster");
        menu.setAttribute("accesskey", "F");
        menu.setAttribute("disabled", "false");
        popup.insertBefore(menu, refItem);
    
        menupopup = document.createXULElement("menupopup");
        menu.appendChild(menupopup);
        menupopup.setAttribute("id", "historyUndoWindowPopup3");
        //menu.setAttribute("onpopupshowing", "UndoListInTabmenu.populateUndoWindowSubmenu(this);");
        menupopup.addEventListener("popupshowing", (event) => UndoListInTabmenu.populateUndoWindowSubmenu(event.currentTarget));
    
        //Liste kürzlich geschosener Tabs
        const LABELTEXT = "K\u00FCrzlich geschlossene Tabs";    //create menu
        menu = document.createXULElement("menu");
        menu.setAttribute("label", LABELTEXT);
        menu.setAttribute("accesskey", "K");
        if (id)
          menu.setAttribute("id", id);
        //menu.setAttribute("disabled", true);
        var menupopup = document.createXULElement("menupopup");
        menupopup.addEventListener("popupshowing", () => UndoListInTabmenu.populateUndoSubmenu(menupopup));
        //menupopup.setAttribute("onpopupshowing", "UndoListInTabmenu.populateUndoSubmenu(this);");
        menu.appendChild(menupopup);
        popup.insertBefore(menu, refItem);
    
        //Eventlistener hinzufügen
        popup.addEventListener('popupshowing', () => {
          UndoListInTabmenu.toggleRecentlyClosedWindows(document.getElementById("historyUndoWindowMenu3"));
          // no restorable tabs, so make sure menu is disabled, and return
          if (UndoListInTabmenu._ss.getClosedTabCount(window) == 0) {
            menu.setAttribute("disabled", true);
            //menu.setAttribute("hidden", true);
            return;
          }
          menu.removeAttribute("disabled");
          //menu.setAttribute("hidden", false);
        },false);
      },
    
      /**
       * Befüllen, wenn das Chronik-Menü geöffnet ist (Fx3.6)
       */
      populateUndoSubmenu: function(undoPopup) {
    		while (undoPopup.hasChildNodes()) {
    			undoPopup.removeChild(undoPopup.firstChild);
    		}
    		var utils = RecentlyClosedTabsAndWindowsMenuUtils;
    		var tabsFragment = utils.getTabsFragment(
    		  window,
          "menuitem",
          /* aPrefixRestoreAll = */ true,
          "menu-history-reopen-all-tabs"
        );
    		undoPopup.appendChild(tabsFragment);
    
        // populate tab historis for tooltip
        var undoItems = UndoListInTabmenu._ss.getClosedTabDataForWindow(window);
        for (var i = 0; i < undoItems.length; i++) {
          var entries = undoItems[i].state ? undoItems[i].state.entries : undoItems[i].entries;
          var tooltiptext = "";
          for (var j = entries.length - 1; j > -1; j--){
            if (j != entries.length - 1)
              tooltiptext += "\n";
            tooltiptext += parseInt(j + 1, 10) + ". " + entries[j].title;
          }
        /* here was a bug, fixed by Mira */
        //  undoPopup.childNodes[i + 2/*restore all, sep*/].setAttribute("tooltiptext", tooltiptext); 
            if (undoPopup.childNodes[i + 2]) {
              undoPopup.childNodes[i + 2].setAttribute("tooltiptext", tooltiptext);
          }
        }
    
        // "Append Clear undo close tb list"
        undoPopup.appendChild(document.createXULElement("menuseparator"));
    
        let m = undoPopup.appendChild(document.createXULElement("menuitem"));
        m.setAttribute("label", "Liste der letzten Tabs l\u00F6schen");
        m.setAttribute("accesskey", "C");
        m.addEventListener("command", () => {
          let prefs = Services.prefs;
          let max_undo = prefs.getIntPref("browser.sessionstore.max_tabs_undo");
          prefs.setIntPref("browser.sessionstore.max_tabs_undo", 0);
          prefs.setIntPref("browser.sessionstore.max_tabs_undo", max_undo);
        }, false);
      },
    
      toggleRecentlyClosedWindows: function PHM_toggleRecentlyClosedWindows(menu) {
        // enable/disable the Recently Closed Windows sub menu
        // no restorable windows, so disable menu
        if (this._ss.getClosedWindowCount() == 0)
          menu.setAttribute("disabled", true);
        else
          menu.removeAttribute("disabled");
      },
    
      /**
       * Populate when the history menu is opened
       */
      populateUndoWindowSubmenu: function PHM_populateUndoWindowSubmenu(undoPopup) {
    		while (undoPopup.hasChildNodes()) {
    			undoPopup.removeChild(undoPopup.firstChild);
    		}
    		let utils = RecentlyClosedTabsAndWindowsMenuUtils;
    		let windowsFragment = utils.getWindowsFragment(
          window,
          "menuitem",
          /* aPrefixRestoreAll = */ true,
          "menu-history-reopen-all-windows"
        );
        undoPopup.appendChild(windowsFragment);
        undoPopup.firstChild.setAttribute("accesskey", "R");
    
        // "Append Clear undo close window list"
        undoPopup.appendChild(document.createXULElement("menuseparator"));
    
        m = undoPopup.appendChild(document.createXULElement("menuitem"));
        m.setAttribute("label", "Liste der kürzlich geschlossenen Fenster l\u00F6schen");
        m.setAttribute("accesskey", "C");
        m.addEventListener("command", () => {
          for (let i = SessionStore.getClosedWindowCount() -1; i >= 0; i--)
            SessionStore.forgetClosedWindow(i);
        }, false);
      }
    };
    
    // Wir sollten die Weiterleitung nur starten, wenn das Browserfenster den Startprozess abgeschlossen hat
    // Ansonsten sollten wir warten, bis der Start abgeschlossen ist.
    if (gBrowserInit.delayedStartupFinished) {
      UndoListInTabmenu.init();
    } else {
      let delayedStartupFinished = (subject, topic) => {
        if (topic == "browser-delayed-startup-finished" &&
            subject == window) {
          Services.obs.removeObserver(delayedStartupFinished, topic);
          UndoListInTabmenu.init();
        }
      };
      Services.obs.addObserver(delayedStartupFinished,
                               "browser-delayed-startup-finished");
    }
    Alles anzeigen
  • Script für animierte Grafiken funktioniert ab FF 94 nicht mehr vollständig

    • Mira_Belle
    • 15. Januar 2025 um 07:37

    Wenn ich auch noch meinen Senf dazu geben dürfte.
    Vier Möglichkeiten:

    JavaScript
    // ------------------------------------------------------------------------------------------------
    // Version 1	
    //	let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir)); // Pfad zum Profilordner
    //	let IconPath = "/chrome/icons/"; // Pfad in den entsprechenden Unterordner
    //	let ButtonIcon = "DeepL_2.png"; // Name & Dateiendung des anzuzeigenden Symbols!
    //	menuitem.style = 'list-style-image: url("' + ProfilePath + IconPath + ButtonIcon + '")';
    // ------------------------------------------------------------------------------------------------
    // Version 2
    //	let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir)); // Pfad zum Profilordner
    //	let IconPath = "/chrome/icons/"; // Pfad in den entsprechenden Unterordner
    //	let ButtonIcon = "DeepL_2.png"; // Name & Dateiendung des anzuzeigenden Symbols!
    //	menuitem.style.listStyleImage = 'url("' + ProfilePath + IconPath + ButtonIcon + '")';
    // ------------------------------------------------------------------------------------------------
    // Version 3
    //	let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons'))
    //	let ButtonIcon = "DeepL_2.png";
    //	menuitem.style.listStyleImage = 'url("' + ProfilePath + "/" + ButtonIcon + '")';
    // ------------------------------------------------------------------------------------------------
    // Version 4
    	let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
    	let IconPath = '/chrome/icons/'; // Pfad in den entsprechenden Unterordner
    	let ButtonIcon = "DeepL_2.png"; // Name & Dateiendung des anzuzeigenden Symbols!
    	menuitem.style.listStyleImage = 'url("' + ("file:" + ProfilePath + IconPath + ButtonIcon) + '")';
    // ------------------------------------------------------------------------------------------------
    Alles anzeigen

    Letztere nutze ich sehr oft. weil es bei mir mit den ersten drei Versionen sehr oft passierte,
    dass das Symbol einfach nicht angezeigt wurde.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 14. Januar 2025 um 22:26

    Endor Teste mal, ist das so, wie Du es haben möchtest?

    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 4 - 115*
    // @charset        UTF-8
    // @version        0.0.4r4
    // @note           Fx92: getURLSpecFromFile() -> getURLSpecFromActualFile()
    // @note           AUTHOR_SHEET Unterstützung hinzugefügt, wichtig: Dateiendung muss .author.css sein!
    // @note           Version 0.0.4.g ermoeglicht "Styles importieren" per Mittelklick und Verwendung
    // @note           eines anderen Dateimanager (s. vFileManager in Zeile 53)
    // @note           Frei verschiebbare Schaltfläche eingebaut von aborix 
    // @note           0.0.4 Remove E4X
    // @note           CSSEntry-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
    // @note           2025.01.14 EventListener angepasst, bzw. korrigiert by Mira Bellenbaum
    // ==/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 andere außer USER_SHEET werden gelesen. Da der Inhalt der Datei nicht überprüft wird,
    darauf achten, @namespace Angabe 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
    
    Verwenden des in "view_source.editor.path" angegebenen Editors
    Ordner kann geändert werden, indem ein Pfad in "UserCSSLoader.FOLDER" eingefügt wird
    
     **** Anleitung Ende ****/
    
    (function(){
    
    let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
    if (!window.Services)
    	Cu.import("resource://gre/modules/Services.jsm");
    // 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;
    }
    const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
    
    window.UCL = {
    	// vFileManager: 'C:\\Programme\\totalcmd\\TOTALCMD.EXE',
    	vFileManager: '',
    	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, endor);
    		}
    		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, endor);
    		}
    		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: "C"
            });
            // EventListener für den Klick auf das Menü hinzufügen
            cssmenu.addEventListener("click", function(event) {
                if (event.button === 1) {
                    UCL.rebuild();
                }
            });
        
            const menupopup = $C("menupopup", {
                id: "usercssloader-menupopup"
            });
            cssmenu.appendChild(menupopup);
        
            let menu = $C("menu", {
                label: "Style Loader Menü",
                accesskey: "M"
            });
            menupopup.appendChild(menu);
            let mp = $C("menupopup", { id: "usercssloader-submenupopup" });
            menu.appendChild(mp);
            mp.appendChild($C("menuitem", {
                label: "Styles importieren",
                accesskey: "R",
                acceltext: "Alt + R",
                oncommand: "UCL.rebuild();"
            }));
            mp.appendChild($C("menuseparator"));
            mp.appendChild($C("menuitem", {
                label: "CSS Datei erstellen",
                accesskey: "D",
                oncommand: "UCL.create();"
            }));
            mp.appendChild($C("menuitem", {
                label: "CSS Ordner öffnen",
                accesskey: "O",
                oncommand: "UCL.openFolder();"
            }));
            mp.appendChild($C("menuitem", {
                label: "Chrome Ordner öffnen",
                accesskey: "c",
                oncommand: "UCL.openCHRMFolder();"
            }));
            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');"
            }));
            mp.appendChild($C("menuseparator"));
            mp.appendChild($C("menuitem", {
                label: "Style Test (Chrome)",
                id: "usercssloader-test-chrome",
                hidden: true,
                accesskey: "C",
                oncommand: "UCL.styleTest(window);"
            }));
            mp.appendChild($C("menuitem", {
                label: "Style Test (Web)",
                id: "usercssloader-test-content",
                hidden: true,
                accesskey: "W",
                oncommand: "UCL.styleTest();"
            }));
            mp.appendChild($C("menuitem", {
                label: "Styles dieser Seite auf userstyles.org finden",
                accesskey: "S",
                oncommand: "UCL.searchStyle();"
            }));
        
            menu = $C("menu", {
                label: ".uc.css",
                accesskey: "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);
            
            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);
        
            window.addEventListener("unload", this);
        },
        
    	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 = "Style importiert";
    			else
    				XULBrowserWindow.statusTextField.label = "Styles importieren";
    		}
    	},
    	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"
                });
                
                // EventListener für 'command' hinzufügen
                menuitem.addEventListener("command", function() {
                    UCL.toggle(aLeafName);
                });
                
                // EventListener für 'mouseup' hinzufügen
                menuitem.addEventListener("mouseup", function(event) {
                    if (event.button === 1) {
                        event.preventDefault();
                    }
                });
        
                // EventListener für 'click' hinzufügen
                menuitem.addEventListener("click", function(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();
    		});
    	},
    	searchStyle: function() {
    		let word;
    		try {
    			word = gBrowser.currentURI.host;
    		} catch {
    			word = gBrowser.currentURI.spec;
    		}
    		openWebLinkIn("https://userstyles.org/styles/search/" + word, "tab", {});
    	},
    	openFolder:function(){
    		if (this.vFileManager.length != 0) {
    			var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
    			var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
    			var args=[this.FOLDER.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.FOLDER.launch();
    		}
    	},
    	openCHRMFolder:function(){
    		if (this.vFileManager.length != 0) {
    			var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
    			var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
    			var args=[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) {
    		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 = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
    			UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8";
    			var path = UI.ConvertFromUnicode(aFile.path);
    			var app = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
    			app.initWithPath(editor);
    			var 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"
                });
            
                m.css = css;
            
                // EventListener für 'command' hinzufügen
                m.addEventListener("command", function() {
                    m.setAttribute('checked', !(m.css.disabled = !m.css.disabled));
                });
            
                // EventListener für 'mouseup' hinzufügen
                m.addEventListener("mouseup", function(event) {
                    if (event.button === 1) {
                        event.preventDefault();
                    }
                });
            
                // EventListener für 'click' hinzufügen
                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(Components.interfaces.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: Components.classes["@mozilla.org/content/style-sheet-service;1"]
                        .getService(Components.interfaces.nsIStyleSheetService),
    	_enabled: false,
    	get enabled() {
    		return this._enabled;
    	},
    	set enabled(isEnable) {
    		var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile)
    		aFile.initWithPath(this.path);
    	
    		var isExists = aFile.exists(); // Wenn die Datei existiert true
    		var lastModifiedTime = isExists ? aFile.lastModifiedTime : 0;
    		var isForced = this.lastModifiedTime != lastModifiedTime; // Wenn es eine Änderung in der Datei gibt true
    
    		var fileURL = Services.io.getProtocolHandler("file").QueryInterface(Components.interfaces.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: Components.classes["@mozilla.org/content/style-sheet-service;1"]
                        .getService(Components.interfaces.nsIStyleSheetService),
    	preview_code: "",
    	saved: false,
    	init: function() {
    		this.dialog = openDialog(
    			"data:text/html;charset=utf8,"+encodeURIComponent('<!DOCTYPE HTML><html lang="de"><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="Vorschau" id="Vorschau"/></td>\
    							<td><input type="button" value="Speichern" id="Speichern"/></td>\
    							<td width="80%"><span class="log"></span></td>\
    							<td><input type="button" value="Schließen" id="Schliessen"/></td>\
    						</tr>\
    					</table>\
    				';
    				this.textbox = doc.querySelector("textarea");
    				this.previewButton = doc.querySelector('input[value="Vorschau"]');
    				this.saveButton = doc.querySelector('input[value="Speichern"]');
    				this.closeButton = doc.querySelector('input[value="Schließen"]');
    				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, endor, 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) {
    	var el = document.createXULElement(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() { Application.console.log(Array.slice(arguments)); }
    
    })();
    Alles anzeigen
  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 14. Januar 2025 um 20:59

    Endor Ist DAS das Skript von Dir, das z.Z. noch funktioniert?

    userChrome.js/Firefox 117/0-UserCSSLoader.uc.js at master · Endor8/userChrome.js
    Skripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.
    github.com
  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 14. Januar 2025 um 17:42

    2002Andreas Schau Dir dieses Skript einmal an, das nutze ich!
    Wenn Du daran Änderungen haben möchtest, gerne werde ich sie durchfahren.

    JavaScript
    // ==UserScript==
    // @name           Fenster_schließen.us.js
    // @charset        UTF-8
    // @author         @mira
    // @version        v2022.09.10
    // @note           Entwickelt von Mira Bellenbaum (mit Hilfe des Fuchsforums 09.10.2022)
    // @reviewURL      https://www.camp-firefox.de/forum/thema/135346/?postID=1210102#post1210102
    // Source          https://www.camp-firefox.de/forum/thema/135346/?postID=1210195#post1210195 
    
    
    (function() {
      if (location.href !== 'chrome://browser/content/browser.xhtml') {
        return;
      }
      const cs_Geschlossenen_Tab_wieder_öffnen = document.getElementById('context_undoCloseTab');
      const cs_Tab_schließen = document.getElementById('context_closeTab');
      const cs_Andere_Tabs_schließen = document.getElementById('context_closeOtherTabs');
      const cs_Linke_Tabs_schließen = document.getElementById('context_closeTabsToTheStart');
      const cs_Rechte_Tabs_schließen = document.getElementById('context_closeTabsToTheEnd');
      const cs_Tab_klonen = document.getElementById('context_duplicateTab');
      const cs_An_Anfang_verschieben = document.getElementById('context_moveToStart');
      const cs_An_Ende_verschieben = document.getElementById('context_moveToEnd');
      const cs_In_neues_Fenster_verschieben = document.getElementById('context_openTabInWindow');
      const cs_Alle_Tabs_auswählen = document.getElementById('context_selectAllTabs');
      const cs_Tab_als_Lesezeichen_hinzufügen = document.getElementById('context_bookmarkTab');
      const cs_Add = document.getElementById('fbcbdc47-ebd2-42f0-b2bb-7cc902ec2f40_-menuitem-_add-current-tab-menu');
      const cs_separator = document.createXULElement('menuseparator');
      
      tabContextMenu.insertBefore(cs_Andere_Tabs_schließen, cs_Geschlossenen_Tab_wieder_öffnen);
      tabContextMenu.insertBefore(cs_Rechte_Tabs_schließen, cs_Andere_Tabs_schließen);
      tabContextMenu.insertBefore(cs_Linke_Tabs_schließen, cs_Rechte_Tabs_schließen);
      tabContextMenu.insertBefore(cs_Tab_als_Lesezeichen_hinzufügen, cs_Tab_klonen);
      tabContextMenu.insertBefore(cs_In_neues_Fenster_verschieben, cs_Alle_Tabs_auswählen);
      tabContextMenu.insertBefore(cs_An_Ende_verschieben, cs_In_neues_Fenster_verschieben);
      tabContextMenu.insertBefore(cs_An_Anfang_verschieben, cs_An_Ende_verschieben);
      tabContextMenu.insertBefore(cs_Tab_schließen, cs_Add);
      tabContextMenu.insertBefore(cs_separator, cs_Tab_schließen);
    
      //Components.utils.import("resource://gre/modules/Services.jsm");
      let ss =  Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
      let custom_label = {
        init: function() {
          let uri = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
           
            @namespace html url("http://www.w3.org/1999/xhtml");
           
            #context_moveToStart label,
            #context_moveToEnd label,
            #context_openTabInWindow label,
            #context_closeOtherTabs label {
              display: none !important;
            }
    
            #context_moveToStart::after {
              content: "Tab an Anfang verschieben" !important;
              font-size: 13px !important          
            }
    
            #context_moveToEnd::after {
              content: "Tab an Ende verschieben" !important;
              font-size: 13px !important
            }
    
            #context_openTabInWindow::after {
              content: "Tab in neues Fenster verschieben" !important;
              font-size: 13px !important
            }
    
            #context_closeOtherTabs::after {
              content: "Alle anderen Tabs schließen" !important;
              font-size: 13px !important
            }
    
            #context_bookmarkTab,
            #context_toggleMuteTab,
            #context_pinTab,
            #context_duplicateTab,
            #context_moveTabOptions,
            #context_selectAllTabs,
            #context_closeTabOptions,
            #context_undoCloseTab,
            #_fbcbdc47-ebd2-42f0-b2bb-7cc902ec2f40_-menuitem-_add-current-tab-menu {
              display: none !important;
            }
            #tabContextMenu > menuseparator:nth-child(37) {
              display: none !important;
            }
    
          `), null, null);
          ss.loadAndRegisterSheet(uri, ss.AGENT_SHEET);
        }
      };
      custom_label.init();
    })();
    Alles anzeigen
  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 14. Januar 2025 um 15:18

    Danke Sören Hentzschel

    JavaScript
              menuItem.addEventListener('command', () => {
                Function(item.command)();
              });

    Das habe ich übernommen und eingepflegt!
    Aber bei der darauffolgenden Anpassung bleibt alles wie gehabt?


    PS: Der ganze Codeschnipsel.

    JavaScript
            if (item.command) {
            //  menuItem.setAttribute("oncommand", item.command);
            /*  menuItem.addEventListener("command", function() {   // oder so  */
            /*  menuItem.addEventListener("command", () => {
                eval(item.command);
              });   */
    
            // !!! Das ist eine bessere und performantere Variante !!! 
              menuItem.addEventListener('command', () => {
                Function(item.command)();
              });
    
            } else if (item.path) {
            //  menuItem.setAttribute("oncommand","Appmenu.exec(this.path, this.args);");
            /*  menuItem.addEventListener("command",  function () {   // oder so  */
              menuItem.addEventListener("command",  () => {  
                Appmenu.exec(this.path, this.args)
            });
    Alles anzeigen
  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 14. Januar 2025 um 09:36
    Zitat von Sören Hentzschel

    In den meisten Fällen... ;)

    Ja, ganz oft war es wirklich nicht so schwer, wenn ich nichts verwechselt habe, aber das Script hat mich Nerven gekostet.
    Und mit JavaScript habe ich jetzt ja nicht wirklich etwas zu tun! Nur für den Firefox komme ich damit in Berührung
    und Ahnung habe ich davon auch nicht wirklich, so auf einer Scala von 1 bis 10, würde ich mich bei zwei oder drei einordnen.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 14. Januar 2025 um 00:09

    @Horstmann Vergleiche.

    Altes Skript!

    #208

    VS.

    Neues Skript!

    #248

    Und, ist es einfach?
    Für mich war es jedenfalls nicht einfach, soll aber nichts heißen,
    aber es gab ja auch noch andere, die ein solches Skript nutzen,
    und die haben es nicht geschafft, es zu korrigieren.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 13. Januar 2025 um 21:46

    Ich hab's, ich fress 'en Besen! Dharkness   FuchsFan

    JavaScript
    // ==UserScript==
    // @name           Jizzmenu.uc.js
    // @namespace      Appmenu@gmail.com
    // @description    Basiert auf dem Script externalFuncButtonM.uc.js, Wiederherstellung der Orangenen FF-Menü Schaltfläche
    // @include        main
    // @version        update for Firefox 68+ by aborix
    // @author         defpt
    // @charset        UTF-8
    // @version        2019.08.04
    // @version        2020.05.27
    // @version        2020.07.13 Weitere Menüs und Funktionen ergänzt by bege
    // @version        2024.08.10 alle Einstellungen im Abschnitt Konfiguration vornehmen
    // @version        2024.08.18 einige Veränderungen am Skript, Symbole, Funktionen & Menüs by Mira Bellenbaum
    // @version        2025.01.13 EventListener angepasst, bzw. korrigiert by Mira Bellenbaum
    // ==/UserScript==
    
    // Definiere den Profilpfad
    let ProfilePath = PathUtils.toFileURI(
      PathUtils.join(PathUtils.profileDir, "chrome", "icons")
    );
    
    var Appmenu = {
      // Beginn der Konfiguration ------------------
    
      // Editor mit angegebenem Pfad verwenden
      // editor: 'C:\\Program Files\\Notepad++\\notepad++.exe',
      editor: "C:\\Program Files\\Microsoft VS Code\\Code.exe",
      // oder
      // in 'view_source.editor.path' eingetragenen Editor verwenden
      editor: Services.prefs.getCharPref("view_source.editor.path"),
      // Dateimanager mit angegebenem Pfad verwenden oder leer ('') wenn System-Dateimanager verwenden
      //fileManager: 'C:\\Program files\\FreeCommander XE\\FreeCommander.exe',
      fileManager: "",
      // Parameter für Dateimanager oder leer ('')
      //FMParameter: '/T',
      FMParameter: "",
      // Submenüs ohne Inhalt im Hauptmenü automatisch ausblenden
      autohideEmptySubDirs: true,
      // Submenüs im Hauptmenü nach unten verschieben
      moveSubDirstoBottom: false,
      // Ort und Aussehen des Menü-Buttons einstellen
      //   isUrlbar: 1,  // 0: TabsToolbar; 1: navbar,
      isUrlbar: 2, // 0: TabsToolbar; 1: navbar; 2: toolbar-menubar
      isButton: 0, // 0: Hamburger,klein; 1: Firefox,groß,
      // Hotkey zum Öffnen des Appmenüs oder leer ('')
      hotkey: "x",
      hotkeyModifier: "alt",
    
      // Ende der Konfiguration --------------------
    
      // Submenüs im Hauptmenü nach unten verschieben
      subdirPopupHash: [],
      subdirMenuHash: [],
    
      toolbar: {
        // Submenüs des Hauptmenüs definieren; Separator einfügen mit {name: 'separator'}
        subdirs: [
          {
            name: "Firefox Verzeichnisse",
            image: `${ProfilePath}/folder_currentColor.svg`, // Der Pfad wird direkt verwendet, ohne `url()`
          },
          {
            name: "Firefox Funktionen",
            image: `${ProfilePath}/settings_currentColor.svg`, // Der Pfad wird direkt verwendet, ohne `url()`
          },
          {
            name: "separator",
          },
        ],
    
        apps: [
          /*  Directories  */
    
          // Untermenü Firefox Verzeichnisse
          {
            name: "Profil-Verzeichniss",
            id: "AMProfil",
            root: "ProfD",
            path: "\\",
            subdir: "Firefox Verzeichnisse",
          },
          {
            name: "Chrome-Ordner",
            id: "AMchrome",
            root: "ProfD",
            path: "\\chrome",
            subdir: "Firefox Verzeichnisse",
          },
          {
            name: "CSS-Ordner",
            id: "AMCSS",
            root: "ProfD",
            path: "\\chrome\\css",
            subdir: "Firefox Verzeichnisse",
          },
          {
            name: "JS-Ordner",
            id: "AMJS",
            root: "ProfD",
            path: "\\chrome\\scripts",
            subdir: "Firefox Verzeichnisse",
          },
          {
            name: "Addon-Verzeichniss",
            id: "AMAddons",
            root: "ProfD",
            path: "\\extensions",
            subdir: "Firefox Verzeichnisse",
          },
          {
            name: "Programm-Verzeichniss",
            id: "AMProgramm",
            root: "CurProcD",
            path: "\\",
            subdir: "Firefox Verzeichnisse",
          },
          {
            name: "Startup-Cache",
            id: "AMCache",
            root: "ProfLD",
            path: "\\startupCache",
            subdir: "Firefox Verzeichnisse",
          },
        ],
    
        configs: [
          // Untermenü Firefox Funktionen
          {
            name: "Anpassen",
            id: "AMAnpassen",
            command: "gCustomizeMode.enter()",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Neustart im abgesicherten Modus",
            id: "AMModus",
            command: "safeModeRestart();",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Browser-Konsole",
            id: "AMKonsole",
            command:
              "var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {});\
                    var { BrowserConsoleManager } = require('resource://devtools/client/webconsole/browser-console-manager');\
                    BrowserConsoleManager.openBrowserConsoleOrFocus();",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Browser-Werkzeuge",
            id: "AMWerkzeuge",
            command:
              "var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {});\
                    var { BrowserToolboxLauncher } = require('resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs');\
                    BrowserToolboxLauncher.init();",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Web-Entwickler",
            id: "AMEntwickler",
            command:
              "var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {});\
                    var { gDevToolsBrowser } = require('resource://devtools/client/framework/devtools-browser');\
                    gDevToolsBrowser.toggleToolboxCommand(window.gBrowser, Cu.now());",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Firefox synchronisieren",
            id: "AMsynchron",
            command: "gSync.openPrefs('menubar');",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Zugangsdaten und Passwörter",
            id: "AMdaten",
            command:
              "LoginHelper.openPasswordManager(window, { entryPoint: 'mainmenu' })",
            tooltiptext: "about:logins",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Task Manager",
            id: "AMManager",
            command: "switchToTabHavingURI('about:processes', true)",
            tooltiptext: "about:processes",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Offline arbeiten",
            id: "AMOffline",
            command: "BrowserOffline.toggleOfflineStatus();",
            subdir: "Firefox Funktionen",
          },
          /*
            {
            name: 'separator',
            },
            */
          {
            name: "Neustart",
            id: "AMreboot",
            tooltiptext: "userChrome.js-Cache wird geleert",
            command:
              "Services.appinfo.invalidateCachesOnRestart(); \
                    Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);",
          },
          {
            name: "Beenden",
            id: "AMquit",
            command: "goQuitApplication(event);",
          },
        ],
      },
    
      _externalAppPopup: null,
      _isready: false,
    
      init: function () {
        this.handleRelativePath(this.toolbar.apps);
        const XULNS =
          "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
    
        var ExternalAppBtn = document.createElementNS(XULNS, "toolbarbutton");
    
        ExternalAppBtn.id = "AppMenuButton";
        ExternalAppBtn.setAttribute("label", "AppButton");
        //ExternalAppBtn.setAttribute("onclick","event.preventDefault();event.stopPropagation();");
        ExternalAppBtn.addEventListener("click", function (event) {
          event.preventDefault();
          event.stopPropagation();
        });
        ExternalAppBtn.setAttribute("tooltiptext", "Firefox Menü");
        ExternalAppBtn.setAttribute("type", "menu");
        ExternalAppBtn.setAttribute("removable", "true");
        
        // Definiere den Profilpfad
        let ProfilePath = PathUtils.toFileURI(
          PathUtils.join(PathUtils.profileDir, "chrome", "image")
        );
    
        // Symbole
        let DefaultIcon = "Button_groß.png";
        let AlternateIcon = "Button_klein-plus.png";
    
        // Wenn Appmenu.isButton true ist, benutze das große Symbol, sonst das kleine
        if (Appmenu.isButton) {
          ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${DefaultIcon}')`; // Großes Symbol
          ExternalAppBtn.style.width = "94px"; // Feste Breite für großes Symbol
          ExternalAppBtn.style.height = "24px"; // Feste Höhe für großes Symbol
        } else {
          ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${AlternateIcon}')`; // Kleines Symbol
          ExternalAppBtn.style.width = "16px"; // Feste Breite für kleines Symbol
          ExternalAppBtn.style.height = "21px"; // Feste Höhe für kleines Symbol
        }
    
        // Button in die richtige Toolbar einfügen
        if (Appmenu.isUrlbar === 1) {
          var navBar = document.getElementById("nav-bar-customization-target");
          navBar.insertBefore(ExternalAppBtn, navBar.firstChild);
        } else if (Appmenu.isUrlbar === 2) {
          var menubar = document.getElementById("toolbar-menubar");
          menubar.insertBefore(ExternalAppBtn, menubar.firstChild);
        } else {
          var TabsToolbar = document.getElementById("TabsToolbar");
          TabsToolbar.insertBefore(ExternalAppBtn, TabsToolbar.firstChild);
        }
    
        var ExternalAppPopup = document.createElementNS(XULNS, "menupopup");
        //ExternalAppPopup.setAttribute('onpopupshowing', 'event.stopPropagation(); Appmenu.onpopupshowing();');
        ExternalAppPopup.setAttribute("id", "AMpopup");
        this._externalAppPopup = ExternalAppPopup;
        ExternalAppBtn.appendChild(ExternalAppPopup);
        Appmenu.onpopupshowing();
    
        // Menü mit Tastaturkürzel öffnen
        let key = document.createXULElement("key");
        key.id = "key_AppMenuPopup";
        //   key.setAttribute('key', 'X');
        key.setAttribute("key", Appmenu.hotkey);
        if (Appmenu.hotkeyModifier)
          //   key.setAttribute('modifiers', 'alt');
          key.setAttribute("modifiers", Appmenu.hotkeyModifier);
        //key.setAttribute("oncommand",'document.getElementById("AMpopup").openPopup();');
        key.addEventListener("command", function () {
          document.getElementById("AMpopup").openPopup();
        });
        document.getElementById("mainKeyset").appendChild(key);
      },
    
      /* ****** NEU ****** */
    
      onpopupshowing: function () {
        if (this._isready) return;
        if (this._externalAppPopup === null) return;
        var ExternalAppPopup = this._externalAppPopup;
    
        // Funktion zum Erstellen eines Menüs mit Untermenüs
        function createMenuItem(parentPopup, item) {
          var menuItem;
          if (item.name == "separator") {
            menuItem = document.createXULElement("menuseparator");
            parentPopup.appendChild(menuItem);
          } else if (item.submenu && item.submenu.length > 0) {
            menuItem = document.createXULElement("menu");
            var subMenuPopup = document.createXULElement("menupopup");
            menuItem.appendChild(subMenuPopup);
            menuItem.setAttribute("class", "menu-iconic");
            menuItem.setAttribute("label", item.name);
            menuItem.setAttribute("image", item.image);
            parentPopup.appendChild(menuItem);
            for (let subItem of item.submenu) {
              createMenuItem(subMenuPopup, subItem);
            }
          } else {
            menuItem = document.createXULElement("menuitem");
            menuItem.setAttribute("class", "menuitem-iconic");
            menuItem.setAttribute("label", item.name);
            menuItem.setAttribute("image", item.image);
            if (item.command) {
            //  menuItem.setAttribute("oncommand", item.command);
              menuItem.addEventListener("command", function() {
                eval(item.command);
              });
            } else if (item.path) {
            //  menuItem.setAttribute("oncommand","Appmenu.exec(this.path, this.args);");
              menuItem.addEventListener("command",  function () {
                Appmenu.exec(this.path, this.args)
            });
              menuItem.path = item.path;
              menuItem.args = item.args;
            }
            menuItem.setAttribute("tooltiptext", item.tooltiptext || item.name);
            menuItem.setAttribute("id", item.id || "");
            parentPopup.appendChild(menuItem);
          }
        }
    
        // Verarbeitung der Subdirs
        for (let subdir of this.toolbar.subdirs) {
          if (subdir.name == "separator") {
            ExternalAppPopup.appendChild(
              document.createXULElement("menuseparator")
            );
          } else {
            var subdirItem = ExternalAppPopup.appendChild(
              document.createXULElement("menu")
            );
            var subdirItemPopup = subdirItem.appendChild(
              document.createXULElement("menupopup")
            );
            subdirItem.setAttribute("class", "menu-iconic");
            subdirItem.setAttribute("label", subdir.name);
            subdirItem.setAttribute("image", subdir.image);
            Appmenu.subdirPopupHash[subdir.name] = subdirItemPopup;
            Appmenu.subdirMenuHash[subdir.name] = subdirItem;
          }
        }
    
        // Verarbeitung der Apps
        for (let app of this.toolbar.apps) {
          if (app.subdir && Appmenu.subdirPopupHash[app.subdir]) {
            createMenuItem(Appmenu.subdirPopupHash[app.subdir], app);
          } else {
            createMenuItem(ExternalAppPopup, app);
          }
        }
    
        // Verarbeitung der Configs
        for (let config of this.toolbar.configs) {
          if (config.subdir && Appmenu.subdirPopupHash[config.subdir]) {
            createMenuItem(Appmenu.subdirPopupHash[config.subdir], config);
          } else {
            createMenuItem(ExternalAppPopup, config);
          }
        }
    
        if (this.autohideEmptySubDirs) {
          for (let key in Appmenu.subdirPopupHash) {
            if (Appmenu.subdirPopupHash[key].hasChildNodes()) {
              continue;
            } else {
              Appmenu.subdirMenuHash[key].setAttribute("hidden", "true");
            }
          }
        }
    
        if (this.moveSubDirstoBottom) {
          let i = ExternalAppPopup.childNodes.length;
          while (
            ExternalAppPopup.firstChild.getAttribute("class") !=
              "menuitem-iconic" &&
            i-- != 0
          ) {
            ExternalAppPopup.appendChild(ExternalAppPopup.firstChild);
          }
        }
    
        this._isready = true;
      },
    
      handleRelativePath: function (apps) {
        for (let app of apps) {
          if (app.path) {
            app.path = app.path.replace(/\//g, "\\");
            var ffdir = Cc["@mozilla.org/file/directory_service;1"]
              .getService(Ci.nsIProperties)
              .get(app.root, Ci.nsIFile).path;
            if (/^(\\)/.test(app.path)) {
              app.path = ffdir + app.path;
            }
          }
        }
      },
    
      exec: function (path, args) {
        args = args || [];
        var args_t = args.slice(0);
        for (let arg of args_t) {
          arg = arg.replace(/%u/g, gBrowser.currentURI.spec);
        }
        var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
        file.initWithPath(path);
        if (!file.exists()) {
          alert("Datei nicht gefunden: " + path);
          return;
        }
        if (file.isExecutable() && !path.endsWith(".js")) {
          var process = Cc["@mozilla.org/process/util;1"].createInstance(
            Ci.nsIProcess
          );
          process.init(file);
          process.run(false, args_t, args_t.length);
        } else if (file.isFile()) {
          if (this.editor) {
            let UI = Cc[
              "@mozilla.org/intl/scriptableunicodeconverter"
            ].createInstance(Ci.nsIScriptableUnicodeConverter);
            UI.charset = window.navigator.platform.toLowerCase().includes("win")
              ? "Shift_JIS"
              : "UTF-8";
            let path = UI.ConvertFromUnicode(file.path);
            let app = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
            app.initWithPath(this.editor);
            let process = Cc["@mozilla.org/process/util;1"].createInstance(
              Ci.nsIProcess
            );
            process.init(app);
            process.run(false, [path], 1);
          } else {
            file.launch();
          }
        } else if (file.isDirectory()) {
          if (this.fileManager) {
            let args = [this.FMParameter, path];
            let app = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
            app.initWithPath(this.fileManager);
            let process = Cc["@mozilla.org/process/util;1"].createInstance(
              Ci.nsIProcess
            );
            process.init(app);
            process.run(false, args, args.length);
          } else {
            file.launch();
          }
        }
      },
    };
    
    (function () {
      // Definiere den Profilpfad für die Symbole
      let ProfilePath = PathUtils.toFileURI(
        PathUtils.join(PathUtils.profileDir, "chrome", "icons")
      );
    
      // Standard-Symbol-Dateiname
      let ButtonIcon01 = "restart.svg";
      let ButtonIcon02 = "quit.svg";
    
      let Icon01 = "profile.svg";
      let Icon02 = "chrome.svg";
      let Icon03 = "css3.svg";
      let Icon04 = "js.svg";
      let Icon05 = "addons.svg";
      let Icon06 = "folder.svg";
      let Icon07 = "folder-1.svg";
    
      let Icon11 = "Themes.svg";
      let Icon12 = "debugging-workers.svg";
      let Icon13 = "command-console.svg";
      let Icon14 = "window-dev-tools.svg";
      let Icon15 = "developer.svg";
      let Icon16 = "sync.svg";
      let Icon17 = "passwords.svg";
      let Icon18 = "performance.svg";
      let Icon19 = "plug-disconnected.svg";
    
      // StyleSheetService zum Hinzufügen der CSS-Regeln
      let sss = Components.classes[
        "@mozilla.org/content/style-sheet-service;1"
      ].getService(Components.interfaces.nsIStyleSheetService);
      let uri = Services.io.newURI(
        "data:text/css;charset=utf-8," +
          encodeURIComponent(`
    
    
            #AMProfil   { background-image: url('${ProfilePath}/${Icon01}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 3px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */ 
                          -moz-context-properties: fill, fill-opacity;
    			          fill: currentColor;
                          }
            #AMchrome   { background-image: url('${ProfilePath}/${Icon02}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 3px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */
                          -moz-context-properties: fill, fill-opacity;
    			          fill: currentColor; 
                          }
            #AMCSS      { background-image: url('${ProfilePath}/${Icon03}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 3px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */
                          -moz-context-properties: fill, fill-opacity;
    			          fill: currentColor;                       
                          }
            #AMJS       { background-image: url('${ProfilePath}/${Icon04}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 3px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */
                          -moz-context-properties: fill, fill-opacity;
    			          fill: currentColor;                       
                          }
            #AMAddons   { background-image: url('${ProfilePath}/${Icon05}');
                          background-repeat: no-repeat !important; 
                          background-position: 11px 3px !important; 
                          background-size: 16px 16pxx !important; /* Größe des Symbols anpassen */
                          -moz-context-properties: fill, fill-opacity;
    			          fill: currentColor;                       
                          }
            #AMProgramm { background-image: url('${ProfilePath}/${Icon06}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 3px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */
                          -moz-context-properties: fill, fill-opacity;
    			          fill: currentColor;                       
                          }
            #AMCache    { background-image: url('${ProfilePath}/${Icon07}');
                          background-repeat: no-repeat !important; 
                          background-position: 11px 3px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */
                          -moz-context-properties: fill, fill-opacity;
    			          fill: currentColor;                       
                          }
    
            #AMAnpassen     { background-image: url('${ProfilePath}/${Icon11}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important;
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;                          
                            }
            #AMModus        { background-image: url('${ProfilePath}/${Icon12}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important;
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }
            #AMKonsole      { background-image: url('${ProfilePath}/${Icon13}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important;
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }
            #AMWerkzeuge    { background-image: url('${ProfilePath}/${Icon14}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important; 
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }
            #AMEntwickler   { background-image: url('${ProfilePath}/${Icon15}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important;
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }
            #AMsynchron     { background-image: url('${ProfilePath}/${Icon16}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important; 
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }
            #AMdaten        { background-image: url('${ProfilePath}/${Icon17}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important; 
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }        
            #AMManager      { background-image: url('${ProfilePath}/${Icon18}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important; 
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }
            #AMOffline      { background-image: url('${ProfilePath}/${Icon19}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important;
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }
    
    
            /* Neustart-Button */
            #AMreboot { 
                background-image: url('${ProfilePath}/${ButtonIcon01}');
                background-repeat: no-repeat !important;
                background-position: 10px 2px !important;
                background-size: 20px 20px !important; /* Größe des Symbols anpassen */
                padding-left: 10px !important; /* Platz für das Symbol lassen */
                -moz-context-properties: fill, fill-opacity !important;
                fill: #fbc96e !important;
            }
    
            /* Beenden-Button */
            #AMquit { 
                background-image: url('${ProfilePath}/${ButtonIcon02}');
                background-repeat: no-repeat !important;
                background-position: 12px 3px !important;
                background-size: 16px 16px !important; /* Größe des Symbols anpassen */
                padding-left: 10px !important; /* Platz für das Symbol lassen */
                -moz-context-properties: fill, fill-opacity !important;
                fill: red !important;
            }
    
        //    /* Menüleiste ausblenden */
        //    #main-menubar > menu { 
        //        display: none !important; 
        //    }
    
        `),
        null,
        null
      );
    
      // CSS-Regeln registrieren
      sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
    })();
    
    if (window.gBrowser) Appmenu.init();
    Alles anzeigen

    Schaut Euch Zeilen 226, bzw, die darauffolgenden an.
    Dann Zeilen 282, bzw, die darauffolgenden an.
    Und Zeilen 319 bis 327:!:

    Nun solltet Ihr Eure Versionen anpassen können.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 13. Januar 2025 um 20:29
    Zitat von Dharkness

    Hallo zusammen,
    sagt mal gibt es schon eine aktualisierte Version von Appmenu.uc.js?

    JavaScript
    ...

    Nein.
    Das ist das ursprüngliche Skript, auf dem "mein" Appmenu_neu2.uc.js-Skript basiert.

    Ich beiß' mir daran gerade die Zähne aus.

    Zwar habe ich einige Korrekturen vorgenommen, aber das Skript funktioniert noch nicht so wie gewünscht!
    Die Schaltflächen Neustart und auch Beenden funktionieren, ABER ...
    die Ordnerstuckaturen sind total durcheinander und die "Aufrufe" sind auch noch ohne Funktion.
    Ich bin noch drann:!:

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 13. Januar 2025 um 17:40
    Zitat von Boersenfeger

    Gibts eine Liste, in der die bereits umgeschriebenen Scripte aufgeführt sind?
    Ich nutze 75 Scripte und würde gerne, ohne den ganzen Thread zu durchsuchen, abgleichen, welche schon geändert sind, bzw, welche nicht geändert werden müssen!

    ...

    Da ich manchen Scripten teilweise eigene Namen verpasst habe, ist es natürlich schwierig.

    Eins habe ich bereits hier gefunden und geändert, das hat nun ein _New am Ende der Bezeichnung.

    Du wirst nicht umhinkommen, selber zu testen, welche von Deinen Skripten umgeschrieben werden müssen!
    Habe dafür auch extra die Nightly installiert.
    Und dann heißt es suchen und/oder hier den Code zu posten.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 13. Januar 2025 um 13:36

    Yes:!:
    Alle meine Skripte funktionieren jetzt.
    Alle:?:
    Nein, leider nicht alle.
    Mein wichtigstes, das Appmenu-Skript bedauerlicherweise noch nicht.
    Und ich habe es mir noch einmal angeschaut, ich denke da sind viel mehr "Baustellen" vorhanden,
    wie ich vermutete.

    Soll ich alle korrigierten Skripts hier noch einmal gebündelt reinstellen?

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 13. Januar 2025 um 12:16
    Zitat von Mira_Belle

    Sören Hentzschel D.h. ich könnte den Code auch so verwenden?

    JavaScript
    undoItems.map(function (item, id) {
    
            //    m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');            
                m.addEventListener('command', (event) => {
                        undoCloseTab(id);
                    }

    Gerade ausprobiert und es klappt!
    Habe auch zusätzlich aus (event) => { , weil der Wert nie gelesen wird, einfach () => { gemacht.
    Und es klappt.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 13. Januar 2025 um 12:06

    Sören Hentzschel D.h. ich könnte den Code auch so verwenden?

    JavaScript
    undoItems.map(function (item, index) { // Verwende `index` statt `id`
    
            //    m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');            
                m.addEventListener('command', (event) => {
                    undoCloseTab(index); // `index` statt ' + id + ' verwenden
                    }

    Und die Variable auch "Sören" nennen? :D

    BrokenHeart Um welches Skript geht es eigentlich genau, bei der Konversation mit FuchsFan ?
    Denn vom "Bildchen" her, könnte, wenn der Code funktioniert, eventuell etwas für mein Appmenu_neu2.uc.js abfallen.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 13. Januar 2025 um 09:43

    Kleiner Nachtrag zu newTabButtonUndoTabList.uc.js.

    Habe das Verhalten noch einmal überhüpft und festgestellt,
    dass es sich ganz normal, also genau wie das Alte verhält.

    Dennoch hätte ich Fragen zu dem Skript!
    1. Warum muss mp.setAttribute("onpopupshowing", "UCT.onpopupshowing(event);"); behandelt werden,
    als wäre es doch ein "EventListener"? (Das Skript funktioniert sonnt nicht!

    JavaScript
        //    mp.setAttribute("onpopupshowing", "UCT.onpopupshowing(event);");
            mp.addEventListener('popupshowing', function(event) {
                UCT.onpopupshowing(event);
            }, true);

    2. Weiter "unten" kommt diese Zeile im Code vor:
    m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');

    Daraus wurde Folgendes gemacht:

    JavaScript
    undoItems.map(function (item, id) {
    
            //    m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
    			let strCommand = 'undoCloseTab(' + id + ')';
    			m.addEventListener('command', () => {
    				Function("return " + strCommand)();
    			}, true);

    Nur habe ich vorher schon etwas mit dem Skript auseinandergesetzt und bin auf eine andere Lösung gekommen.

    JavaScript
    undoItems.map(function (item, index) { // Verwende `index` statt `id`
    
            //    m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');            
                m.addEventListener('command', (event) => {
                    if (event.button == 0) {
                        undoCloseTab(index); // `index` statt ' + id + ' verwenden
                    }

    Worin bestehen die Vor, bzw. Nachteile der jeweiligen Versionen?


    /* ********************************************************************************************************************************************************************* */

    Zitat von 2002Andreas
    Zitat von Mira_Belle

    das Zweite (Tab schließen + Kontextmenü auch in dem Einstellungsfenster),

    Haben wir schon:

    [/post]

    =O Oh, da habe ich wohl den Überblick verloren!
    Richtig, dieses Skript habe ich schon in korrigierter Fassung.

    Ergo sind es nur 3 Skripte, die mir Kopfzerbrechen bereiten:!:

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 13. Januar 2025 um 00:46
    Zitat von BarbaraZ-

    Jepp, habe mal durchgeschaut und bin mir nur bei einem unsicher.

    Gebe es mal hier zum besten:

    Code
    // Kontextmenu bei Mira_Belle
    
    /// Symbole.uc.js
    /* ****************************************************************************************** */
    
    ...
    })();

    Das Skript sollte uneingeschränkt funktionieren!
    Meines tut es jedenfalls.


    Zischenbilanz!

    CloseTab.uc.js, SkipToTopAndBottom.uc.js & newTabButtonUndoTabList.uc.js funktionieren.
    Wobei newTabButtonUndoTabList.uc.js schon irgendwie merkwürdig reagiert.
    Darauf werde ich ein später in einem eigenen Thread irgendwann noch einmal genauer eingehen.

    Ob UndoListInTabmenuToo.us.js funktioniert, habe ich noch nicht geprüft!
    Aber bei einigen Nutzern scheint es ja so zu sein.

    Nun sind bei mir nur noch 4 Skripte offen. (Die "Translate"-Skripte sind ja nahezu gleich)
    Und ich bekomme es alleine nicht hin!

    Das wäre das erste Skript (Restart item script for Firefox 89+ by Aris),
    das Zweite (Tab schließen + Kontextmenü auch in dem Einstellungsfenster),
    die beiden "Translate"-Skripte,
    und das mir wichtigste, Appmenu_neu2.uc.js.

    Link => #133

    CSS
    // ==UserScript==
    // @name           Jizzmenu.uc.js
    // @namespace      Appmenu@gmail.com
    // @description    Basiert auf dem Script externalFuncButtonM.uc.js, Wiederherstellung der Orangenen FF-Menü Schaltfläche
    // @include        main
    // @version        update for Firefox 68+ by aborix
    // @author         defpt
    // @charset        UTF-8
    // @version        2019.08.04
    // @version        2020.05.27
    // @version        2020.07.13 Weitere Menüs und Funktionen ergänzt by bege
    // @version        2024.08.10 alle Einstellungen im Abschnitt Konfiguration vornehmen
    // @version        2024.08.18 einige Veränderungen am Skript, Symbole, Funktionen & Menüs by Mira Bellenbaum
    // ==/UserScript==
    
    // Definiere den Profilpfad
    let ProfilePath = PathUtils.toFileURI(
      PathUtils.join(PathUtils.profileDir, "chrome", "icons")
    );
    
    var Appmenu = {
      // Beginn der Konfiguration ------------------
    
      // Editor mit angegebenem Pfad verwenden
      // editor: 'C:\\Program Files\\Notepad++\\notepad++.exe',
      editor: "C:\\Program Files\\Microsoft VS Code\\Code.exe",
      // oder
      // in 'view_source.editor.path' eingetragenen Editor verwenden
      editor: Services.prefs.getCharPref("view_source.editor.path"),
      // Dateimanager mit angegebenem Pfad verwenden oder leer ('') wenn System-Dateimanager verwenden
      //fileManager: 'C:\\Program files\\FreeCommander XE\\FreeCommander.exe',
      fileManager: "",
      // Parameter für Dateimanager oder leer ('')
      //FMParameter: '/T',
      FMParameter: "",
      // Submenüs ohne Inhalt im Hauptmenü automatisch ausblenden
      autohideEmptySubDirs: true,
      // Submenüs im Hauptmenü nach unten verschieben
      moveSubDirstoBottom: false,
      // Ort und Aussehen des Menü-Buttons einstellen
      //   isUrlbar: 1,  // 0: TabsToolbar; 1: navbar,
      isUrlbar: 2, // 0: TabsToolbar; 1: navbar; 2: toolbar-menubar
      isButton: 0, // 0: Hamburger,klein; 1: Firefox,groß,
      // Hotkey zum Öffnen des Appmenüs oder leer ('')
      hotkey: "x",
      hotkeyModifier: "alt",
    
      // Ende der Konfiguration --------------------
    
      // Submenüs im Hauptmenü nach unten verschieben
      subdirPopupHash: [],
      subdirMenuHash: [],
    
      toolbar: {
        // Submenüs des Hauptmenüs definieren; Separator einfügen mit {name: 'separator'}
        subdirs: [
          {
            name: "Firefox Verzeichnisse",
            image: `${ProfilePath}/folder_currentColor.svg`, // Der Pfad wird direkt verwendet, ohne `url()`
          },
          {
            name: "Firefox Funktionen",
            image: `${ProfilePath}/settings_currentColor.svg`, // Der Pfad wird direkt verwendet, ohne `url()`
          },
          {
            name: "separator",
          },
        ],
    
        apps: [
          /*  Directories  */
    
          // Untermenü Firefox Verzeichnisse
          {
            name: "Profil-Verzeichniss",
            id: "AMProfil",
            root: "ProfD",
            path: "\\",
            subdir: "Firefox Verzeichnisse",
          },
          {
            name: "Chrome-Ordner",
            id: "AMchrome",
            root: "ProfD",
            path: "\\chrome",
            subdir: "Firefox Verzeichnisse",
          },
          {
            name: "CSS-Ordner",
            id: "AMCSS",
            root: "ProfD",
            path: "\\chrome\\css",
            subdir: "Firefox Verzeichnisse",
          },
          {
            name: "JS-Ordner",
            id: "AMJS",
            root: "ProfD",
            path: "\\chrome\\scripts",
            subdir: "Firefox Verzeichnisse",
          },
          {
            name: "Addon-Verzeichniss",
            id: "AMAddons",
            root: "ProfD",
            path: "\\extensions",
            subdir: "Firefox Verzeichnisse",
          },
          {
            name: "Programm-Verzeichniss",
            id: "AMProgramm",
            root: "CurProcD",
            path: "\\",
            subdir: "Firefox Verzeichnisse",
          },
          {
            name: "Startup-Cache",
            id: "AMCache",
            root: "ProfLD",
            path: "\\startupCache",
            subdir: "Firefox Verzeichnisse",
          },
        ],
    
        configs: [
          // Untermenü Firefox Funktionen
          {
            name: "Anpassen",
            id: "AMAnpassen",
            command: "gCustomizeMode.enter()",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Neustart im abgesicherten Modus",
            id: "AMModus",
            command: "safeModeRestart();",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Browser-Konsole",
            id: "AMKonsole",
            command:
              "var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {});\
                    var { BrowserConsoleManager } = require('resource://devtools/client/webconsole/browser-console-manager');\
                    BrowserConsoleManager.openBrowserConsoleOrFocus();",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Browser-Werkzeuge",
            id: "AMWerkzeuge",
            command:
              "var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {});\
                    var { BrowserToolboxLauncher } = require('resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs');\
                    BrowserToolboxLauncher.init();",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Web-Entwickler",
            id: "AMEntwickler",
            command:
              "var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {});\
                    var { gDevToolsBrowser } = require('resource://devtools/client/framework/devtools-browser');\
                    gDevToolsBrowser.toggleToolboxCommand(window.gBrowser, Cu.now());",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Firefox synchronisieren",
            id: "AMsynchron",
            command: "gSync.openPrefs('menubar');",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Zugangsdaten und Passwörter",
            id: "AMdaten",
            command:
              "LoginHelper.openPasswordManager(window, { entryPoint: 'mainmenu' })",
            tooltiptext: "about:logins",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Task Manager",
            id: "AMManager",
            command: "switchToTabHavingURI('about:processes', true)",
            tooltiptext: "about:processes",
            subdir: "Firefox Funktionen",
          },
          {
            name: "Offline arbeiten",
            id: "AMOffline",
            command: "BrowserOffline.toggleOfflineStatus();",
            subdir: "Firefox Funktionen",
          },
          /*
            {
            name: 'separator',
            },
            */
          {
            name: "Neustart",
            id: "AMreboot",
            tooltiptext: "userChrome.js-Cache wird geleert",
            command:
              "Services.appinfo.invalidateCachesOnRestart(); \
                    Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);",
          },
          {
            name: "Beenden",
            id: "AMquit",
            command: "goQuitApplication(event);",
          },
        ],
      },
    
      _externalAppPopup: null,
      _isready: false,
    
      init: function () {
        this.handleRelativePath(this.toolbar.apps);
        const XULNS =
          "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
    
        var ExternalAppBtn = document.createElementNS(XULNS, "toolbarbutton");
    
        ExternalAppBtn.id = "AppMenuButton";
        ExternalAppBtn.setAttribute("label", "AppButton");
        ExternalAppBtn.setAttribute("onclick", "event.preventDefault();event.stopPropagation();");
        ExternalAppBtn.setAttribute("tooltiptext", "Firefox Menü");
        ExternalAppBtn.setAttribute("type", "menu");
        ExternalAppBtn.setAttribute("removable", "true");
    
        // Definiere den Profilpfad
        let ProfilePath = PathUtils.toFileURI(
          PathUtils.join(PathUtils.profileDir, "chrome", "image")
        );
    
        // Symbole
        let DefaultIcon = "Button_groß.png";
        let AlternateIcon = "Button_klein-plus.png";
    
        // Wenn Appmenu.isButton true ist, benutze das große Symbol, sonst das kleine
        if (Appmenu.isButton) {
          ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${DefaultIcon}')`; // Großes Symbol
          ExternalAppBtn.style.width = "94px"; // Feste Breite für großes Symbol
          ExternalAppBtn.style.height = "24px"; // Feste Höhe für großes Symbol
        } else {
          ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${AlternateIcon}')`; // Kleines Symbol
          ExternalAppBtn.style.width = "16px"; // Feste Breite für kleines Symbol
          ExternalAppBtn.style.height = "21px"; // Feste Höhe für kleines Symbol
        }
    
        // Button in die richtige Toolbar einfügen
        if (Appmenu.isUrlbar === 1) {
          var navBar = document.getElementById("nav-bar-customization-target");
          navBar.insertBefore(ExternalAppBtn, navBar.firstChild);
        } else if (Appmenu.isUrlbar === 2) {
          var menubar = document.getElementById("toolbar-menubar");
          menubar.insertBefore(ExternalAppBtn, menubar.firstChild);
        } else {
          var TabsToolbar = document.getElementById("TabsToolbar");
          TabsToolbar.insertBefore(ExternalAppBtn, TabsToolbar.firstChild);
        }
    
        var ExternalAppPopup = document.createElementNS(XULNS, "menupopup");
        //ExternalAppPopup.setAttribute('onpopupshowing', 'event.stopPropagation(); Appmenu.onpopupshowing();');
        ExternalAppPopup.setAttribute("id", "AMpopup");
        this._externalAppPopup = ExternalAppPopup;
        ExternalAppBtn.appendChild(ExternalAppPopup);
        Appmenu.onpopupshowing();
    
        // Menü mit Tastaturkürzel öffnen
        let key = document.createXULElement("key");
        key.id = "key_AppMenuPopup";
        //   key.setAttribute('key', 'X');
        key.setAttribute("key", Appmenu.hotkey);
        if (Appmenu.hotkeyModifier)
          //   key.setAttribute('modifiers', 'alt');
          key.setAttribute("modifiers", Appmenu.hotkeyModifier);
        key.setAttribute("oncommand", 'document.getElementById("AMpopup").openPopup();');
    /*
        key.setAttribute ('command', function (event) {
          if (event.button == 0) {
            Appmenu.exec(this.path, this.args);
          }
        });
    */
    
    
        document.getElementById("mainKeyset").appendChild(key);
      },
    
      /* ****** NEU ****** */
    
      onpopupshowing: function () {
        if (this._isready) return;
        if (this._externalAppPopup === null) return;
        var ExternalAppPopup = this._externalAppPopup;
    
        // Funktion zum Erstellen eines Menüs mit Untermenüs
        function createMenuItem(parentPopup, item) {
          var menuItem;
          if (item.name == "separator") {
            menuItem = document.createXULElement("menuseparator");
            parentPopup.appendChild(menuItem);
          } else if (item.submenu && item.submenu.length > 0) {
            menuItem = document.createXULElement("menu");
            var subMenuPopup = document.createXULElement("menupopup");
            menuItem.appendChild(subMenuPopup);
            menuItem.setAttribute("class", "menu-iconic");
            menuItem.setAttribute("label", item.name);
            menuItem.setAttribute("image", item.image);
            parentPopup.appendChild(menuItem);
            for (let subItem of item.submenu) {
              createMenuItem(subMenuPopup, subItem);
            }
          } else {
            menuItem = document.createXULElement("menuitem");
            menuItem.setAttribute("class", "menuitem-iconic");
            menuItem.setAttribute("label", item.name);
            menuItem.setAttribute("image", item.image);
            if (item.command) {
              menuItem.setAttribute("oncommand", item.command);
    
    
            } else if (item.path) {
            menuItem.setAttribute('oncommand', 'Appmenu.exec(this.path, this.args);');  
              menuItem.path = item.path;
              menuItem.args = item.args;
            }
            menuItem.setAttribute("tooltiptext", item.tooltiptext || item.name);
            menuItem.setAttribute("id", item.id || "");
            parentPopup.appendChild(menuItem);
          }
        }
    
        // Verarbeitung der Subdirs
        for (let subdir of this.toolbar.subdirs) {
          if (subdir.name == "separator") {
            ExternalAppPopup.appendChild(
              document.createXULElement("menuseparator")
            );
          } else {
            var subdirItem = ExternalAppPopup.appendChild(
              document.createXULElement("menu")
            );
            var subdirItemPopup = subdirItem.appendChild(
              document.createXULElement("menupopup")
            );
            subdirItem.setAttribute("class", "menu-iconic");
            subdirItem.setAttribute("label", subdir.name);
            subdirItem.setAttribute("image", subdir.image);
            Appmenu.subdirPopupHash[subdir.name] = subdirItemPopup;
            Appmenu.subdirMenuHash[subdir.name] = subdirItem;
          }
        }
    
        // Verarbeitung der Apps
        for (let app of this.toolbar.apps) {
          if (app.subdir && Appmenu.subdirPopupHash[app.subdir]) {
            createMenuItem(Appmenu.subdirPopupHash[app.subdir], app);
          } else {
            createMenuItem(ExternalAppPopup, app);
          }
        }
    
        // Verarbeitung der Configs
        for (let config of this.toolbar.configs) {
          if (config.subdir && Appmenu.subdirPopupHash[config.subdir]) {
            createMenuItem(Appmenu.subdirPopupHash[config.subdir], config);
          } else {
            createMenuItem(ExternalAppPopup, config);
          }
        }
    
        if (this.autohideEmptySubDirs) {
          for (let key in Appmenu.subdirPopupHash) {
            if (Appmenu.subdirPopupHash[key].hasChildNodes()) {
              continue;
            } else {
              Appmenu.subdirMenuHash[key].setAttribute("hidden", "true");
            }
          }
        }
    
        if (this.moveSubDirstoBottom) {
          let i = ExternalAppPopup.childNodes.length;
          while (
            ExternalAppPopup.firstChild.getAttribute("class") !=
              "menuitem-iconic" &&
            i-- != 0
          ) {
            ExternalAppPopup.appendChild(ExternalAppPopup.firstChild);
          }
        }
    
        this._isready = true;
      },
    
      handleRelativePath: function (apps) {
        for (let app of apps) {
          if (app.path) {
            app.path = app.path.replace(/\//g, "\\");
            var ffdir = Cc["@mozilla.org/file/directory_service;1"]
              .getService(Ci.nsIProperties)
              .get(app.root, Ci.nsIFile).path;
            if (/^(\\)/.test(app.path)) {
              app.path = ffdir + app.path;
            }
          }
        }
      },
    
      exec: function (path, args) {
        args = args || [];
        var args_t = args.slice(0);
        for (let arg of args_t) {
          arg = arg.replace(/%u/g, gBrowser.currentURI.spec);
        }
        var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
        file.initWithPath(path);
        if (!file.exists()) {
          alert("Datei nicht gefunden: " + path);
          return;
        }
        if (file.isExecutable() && !path.endsWith(".js")) {
          var process = Cc["@mozilla.org/process/util;1"].createInstance(
            Ci.nsIProcess
          );
          process.init(file);
          process.run(false, args_t, args_t.length);
        } else if (file.isFile()) {
          if (this.editor) {
            let UI = Cc[
              "@mozilla.org/intl/scriptableunicodeconverter"
            ].createInstance(Ci.nsIScriptableUnicodeConverter);
            UI.charset = window.navigator.platform.toLowerCase().includes("win")
              ? "Shift_JIS"
              : "UTF-8";
            let path = UI.ConvertFromUnicode(file.path);
            let app = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
            app.initWithPath(this.editor);
            let process = Cc["@mozilla.org/process/util;1"].createInstance(
              Ci.nsIProcess
            );
            process.init(app);
            process.run(false, [path], 1);
          } else {
            file.launch();
          }
        } else if (file.isDirectory()) {
          if (this.fileManager) {
            let args = [this.FMParameter, path];
            let app = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
            app.initWithPath(this.fileManager);
            let process = Cc["@mozilla.org/process/util;1"].createInstance(
              Ci.nsIProcess
            );
            process.init(app);
            process.run(false, args, args.length);
          } else {
            file.launch();
          }
        }
      },
    };
    
    (function () {
      // Definiere den Profilpfad für die Symbole
      let ProfilePath = PathUtils.toFileURI(
        PathUtils.join(PathUtils.profileDir, "chrome", "icons")
      );
    
      // Standard-Symbol-Dateiname
      let ButtonIcon01 = "restart.svg";
      let ButtonIcon02 = "quit.svg";
    
      let Icon01 = "profile.svg";
      let Icon02 = "chrome.svg";
      let Icon03 = "css3.svg";
      let Icon04 = "js.svg";
      let Icon05 = "addons.svg";
      let Icon06 = "folder.svg";
      let Icon07 = "folder-1.svg";
    
      let Icon11 = "Themes.svg";
      let Icon12 = "debugging-workers.svg";
      let Icon13 = "command-console.svg";
      let Icon14 = "window-dev-tools.svg";
      let Icon15 = "developer.svg";
      let Icon16 = "sync.svg";
      let Icon17 = "passwords.svg";
      let Icon18 = "performance.svg";
      let Icon19 = "plug-disconnected.svg";
    
      // StyleSheetService zum Hinzufügen der CSS-Regeln
      let sss = Components.classes[
        "@mozilla.org/content/style-sheet-service;1"
      ].getService(Components.interfaces.nsIStyleSheetService);
      let uri = Services.io.newURI(
        "data:text/css;charset=utf-8," +
          encodeURIComponent(`
    
    
            #AMProfil   { background-image: url('${ProfilePath}/${Icon01}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 3px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */ 
                          -moz-context-properties: fill, fill-opacity;
    			          fill: currentColor;
                          }
            #AMchrome   { background-image: url('${ProfilePath}/${Icon02}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 3px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */
                          -moz-context-properties: fill, fill-opacity;
    			          fill: currentColor; 
                          }
            #AMCSS      { background-image: url('${ProfilePath}/${Icon03}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 3px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */
                          -moz-context-properties: fill, fill-opacity;
    			          fill: currentColor;                       
                          }
            #AMJS       { background-image: url('${ProfilePath}/${Icon04}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 3px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */
                          -moz-context-properties: fill, fill-opacity;
    			          fill: currentColor;                       
                          }
            #AMAddons   { background-image: url('${ProfilePath}/${Icon05}');
                          background-repeat: no-repeat !important; 
                          background-position: 11px 3px !important; 
                          background-size: 16px 16pxx !important; /* Größe des Symbols anpassen */
                          -moz-context-properties: fill, fill-opacity;
    			          fill: currentColor;                       
                          }
            #AMProgramm { background-image: url('${ProfilePath}/${Icon06}'); 
                          background-repeat: no-repeat !important; 
                          background-position: 11px 3px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */
                          -moz-context-properties: fill, fill-opacity;
    			          fill: currentColor;                       
                          }
            #AMCache    { background-image: url('${ProfilePath}/${Icon07}');
                          background-repeat: no-repeat !important; 
                          background-position: 11px 3px !important; 
                          background-size: 16px 16px !important; /* Größe des Symbols anpassen */
                          -moz-context-properties: fill, fill-opacity;
    			          fill: currentColor;                       
                          }
    
            #AMAnpassen     { background-image: url('${ProfilePath}/${Icon11}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important;
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;                          
                            }
            #AMModus        { background-image: url('${ProfilePath}/${Icon12}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important;
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }
            #AMKonsole      { background-image: url('${ProfilePath}/${Icon13}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important;
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }
            #AMWerkzeuge    { background-image: url('${ProfilePath}/${Icon14}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important; 
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }
            #AMEntwickler   { background-image: url('${ProfilePath}/${Icon15}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important;
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }
            #AMsynchron     { background-image: url('${ProfilePath}/${Icon16}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important; 
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }
            #AMdaten        { background-image: url('${ProfilePath}/${Icon17}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important; 
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }        
            #AMManager      { background-image: url('${ProfilePath}/${Icon18}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important; 
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }
            #AMOffline      { background-image: url('${ProfilePath}/${Icon19}');
                              background-repeat: no-repeat !important; 
                              background-position: 11px 3px !important;
                              background-size: 16px 16px !important;
                              -moz-context-properties: fill, fill-opacity;
    			              fill: currentColor;
                            }
    
    
            /* Neustart-Button */
            #AMreboot { 
                background-image: url('${ProfilePath}/${ButtonIcon01}');
                background-repeat: no-repeat !important;
                background-position: 10px 2px !important;
                background-size: 20px 20px !important; /* Größe des Symbols anpassen */
                padding-left: 10px !important; /* Platz für das Symbol lassen */
                -moz-context-properties: fill, fill-opacity !important;
                fill: #fbc96e !important;
            }
    
            /* Beenden-Button */
            #AMquit { 
                background-image: url('${ProfilePath}/${ButtonIcon02}');
                background-repeat: no-repeat !important;
                background-position: 12px 3px !important;
                background-size: 16px 16px !important; /* Größe des Symbols anpassen */
                padding-left: 10px !important; /* Platz für das Symbol lassen */
                -moz-context-properties: fill, fill-opacity !important;
                fill: red !important;
            }
    
        //    /* Menüleiste ausblenden */
        //    #main-menubar > menu { 
        //        display: none !important; 
        //    }
    
        `),
        null,
        null
      );
    
      // CSS-Regeln registrieren
      sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
    })();
    
    if (window.gBrowser) Appmenu.init();
    Alles anzeigen

    Zeilen 226, 278, 321 & 325 sind m.M. anzupassen. Aber wie?

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Mira_Belle
    • 12. Januar 2025 um 16:58
    Zitat von BrokenHeart

    Besser?

    Äh, nicht so ganz!
    Im "alten" Skript wurden die Tabs, bei mir, in einem "neuen" Tab geöffnet!
    Im "neuen" Skript, wird der aktuelle Tab überschrieben!
    Aber halt, mir fällt da was ein, habe ich da im Firefox, also in Version 134 irgendetwas eingestellt?
    Wenn ich nur wüsste.:/

Unterstütze uns!

Jährlich (2026)

69,4 %

69,4% (538,17 von 775 EUR)

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