Wer das Skript in #3092 vor dem Lesen dieses Beitrags kopiert hat, bitte nochmal updaten. Ich habe noch ein paar Korrekturen hinzugefügt.
Beiträge von bege
-
-
Ich habe das von Speravir überarbeitete Skript UserCSSLoader.uc.js aus dem Github von Endor übernommen. Danke für die Übersichtlichen Konfigurationseinstellungen am Anfang des Skripts und die Rechtschreibkorrekturen!
Die Mittelklick-Funktion funktioniert bei mir aber nicht. In meiner Version des Skripts funktioniert sie und in Speravirs Version fehlt in Zeile 300 der Eintrag onmouseup : "if (event.button == 1) event.preventDefault();",
Vielleicht liegt es daran.
Ich habe das ergänzt und weitere Ergänzungen aus meiner Version eingefügt.
- die Möglichkeit, dem eigenen Dateimanager einen Parameter mit zu übergeben (vor langer Zeit von aborix hinzugefügt)
- die Wahl, außer dem verschiebbaren Button auch ein Menü anzuzeigen, habe ich auch noch in die Konfigurationseinstellungen gelegt
- die Möglichkeit, außer dem CSS-Ordner auch den Chrome-Ordner anzuzeigen
- mit Strg+Linksklick kann man die CSS-Datei im Dateimanager anzeigen lassen (mein Dateimanager markiert dabei die Datei. Den Windows-Explorer konnte ich nicht dazu "überreden", das wäre wohl ein größerer Umbau. Mit dem Windows-Explorer tut Strg+Linksklick auf eine Datei also nichts anderes als im Untermenü die Option "CSS-Ordner öffnen".
- dem Untermenü habe ich eine ID zugefügt, damit ich per CSS ein Symbol anzeigen lassen kann
- ich habe die Funktion getFileFromURLSpec durch die in anderen Skripten geänderte Funktion getURLSpecFromActualFile ersetzt. Ob das nötig ist, weiß ich nicht.
- der Eintrag closeMenus(event.target); in den Zeilen 370 und 507 ergibt in der Fehlerkonsole einen allgemeinen Fehler, die Editierfunktion funktioniert aber trotzdem. In Thunderbird ergibt es den Fehler "closeMenus is undefined", was auch stimmt, und die Editierfunktion funktioniert nicht. Ich habe die Zeile mal auskommentiert, weil ich nicht weiß, wofür sie ursprünglich mal gedacht war.
Will/soll Endor diese Version ins Github übernehmen?
JavaScript: UserCSSLoader0.0.4k+uc.js
Alles anzeigen// ==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 - 102* // @charset UTF-8 // @version 0.0.4K+ // @note Aktualisierung von Speravir - www.camp-firefox.de // @note Fx92: getURLSpecFromFile() -> getURLSpecFromActualFile() // @note AUTHOR_SHEET Verwendung hinzugefügt, wichtig: am Ende des Dateinamens .author.css // @note Version 0.0.4.g ermoeglicht "Styles importieren" per Mittelklick und Verwendung // @note eines anderen Dateimanager (siehe in Konfiguration) // @note + ergänzt um einen Parameter für den Dateimanager (vFMParameter in der Konfiguration) von aborix // @note Frei verschiebbare Schaltfläche eingebaut von aborix // @note 0.0.4 Remove E4X // @note CSSEntry-Klasse erstellt // @note Style-Test-Funktion überarbeitet // @note Wenn die Datei gelöscht wurde, CSS beim Neu-Erstellen und Löschen des Menüs abbrechen // @note uc einlesen .uc.css temporäre Korrespondenz zum erneuten Lesen // ==/UserScript== /****** Bedienungsanleitung ****** CSS-Ordner im Chrome-Ordner erstellen, CSS-Dateien dort ablegen - speichern. Diejenigen, deren Dateiname mit "xul-" beginnen, diejenigen, die mit ".as.css" enden, sind AGENT_SHEET, alle anderen außer USER_SHEET werden gelesen. Da der Inhalt der Datei nicht überprüft wird, darauf achten, @ 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 Strg+Linksklick zum Anzegen im Dateimanager Verwenden des in "view_source.editor.path" angegebenen Editors Dateiordner kann in Konfiguration geändert werden **** Anleitung Ende ****/ (function(){ /* Konfiguration */ // Position: als Menü anzeigen = 1, als frei verschiebbare-Schaltfläche = 0 let position = 0; // alternativer Dateimanager, Bsp.: // let filemanager = "C:\\Programme\\totalcmd\\TOTALCMD.EXE"; let filemanager = ""; // eventuelle Parameter für den alternativen Dateimanager, sonst filemanagerParam = ""; let filemanagerParam = ""; // Unterordner für die CSS-Dateien: let cssFolder = "CSS"; // zusätzlich Chrome-Ordner im Untermenü anzeigen: 1 = ja, 0 = nein let showChrome = 0; /* Ende Konfiguration */ 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; } const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; if (window.UCL) { window.UCL.destroy(); delete window.UCL; } window.UCL = { vFileManager: filemanager, vFMParameter: filemanagerParam, USE_UC: "UC" in window, AGENT_SHEET: Ci.nsIStyleSheetService.AGENT_SHEET, USER_SHEET : Ci.nsIStyleSheetService.USER_SHEET, AUTHOR_SHEET: Ci.nsIStyleSheetService.AUTHOR_SHEET, readCSS : {}, get disabled_list() { let obj = []; try { obj = this.prefs.getCharPref("disabled_list").split("|"); } catch(e) {} delete this.disabled_list; return this.disabled_list = obj; }, get prefs() { delete this.prefs; return this.prefs = Services.prefs.getBranch("UserCSSLoader.") }, get styleSheetServices(){ delete this.styleSheetServices; return this.styleSheetServices = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); }, get FOLDER() { let aFolder; try { // UserCSSLoader.FOLDER verwenden let folderPath = this.prefs.getCharPref("FOLDER"); aFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile) aFolder.initWithPath(folderPath); } catch (e) { aFolder = Services.dirsvc.get("UChrm", Ci.nsIFile); aFolder.appendRelativePath(cssFolder); } if (!aFolder.exists() || !aFolder.isDirectory()) { aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664); } delete this.FOLDER; return this.FOLDER = aFolder; }, get CHRMFOLDER() { let bFolder; try { // UserCSSLoader.CHRMFOLDER verwenden let CHRMfolderPath = this.prefs.getCharPref("CHRMFOLDER"); bFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile) bFolder.initWithPath(CHRMfolderPath); } catch (e) { bFolder = Services.dirsvc.get("UChrm", Ci.nsIFile); } if (!bFolder.exists() || !bFolder.isDirectory()) { bFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664); } delete this.CHRMFOLDER; return this.CHRMFOLDER = bFolder; }, getFocusedWindow: function() { let win = document.commandDispatcher.focusedWindow; if (!win || win == window) win = content; return win; }, init: function() { let cssmenu = $C("menu", { id: "usercssloader-menu", label: "CSS", tooltiptext: "UserCSSLoader\n\nLinksklick: Stylesheets anzeigen\nMittelklick: Styles importieren", accesskey: "C", onclick: "if (event.button == 1) UCL.rebuild()" }); let menupopup = $C("menupopup", { id: "usercssloader-menupopup" }); cssmenu.appendChild(menupopup); let menu = $C("menu", { label: "Style-Loader-Menü", id: "style-loader-menu", accesskey: "M" }); menupopup.appendChild(menu); menupopup.appendChild($C("menuseparator")); let mp = $C("menupopup", { id: "usercssloader-submenupopup" }); menu.appendChild(mp); mp.appendChild($C("menuitem", { label: "Styles importieren", accesskey: "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();" })); if (showChrome == 1) { mp.appendChild($C("menuitem", { label: "Chrome Ordner öffnen", accesskey: "O", 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", hidden: false, 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(XULNS, 'toolbaritem'); toolbaritem.id = 'usercssloader-menu-item'; toolbaritem.className = 'chromeclass-toolbar-additional'; return toolbaritem; } }); $('usercssloader-menu-item').appendChild(cssmenu); if (position == 1) { let refNode = $('helpMenu'); refNode.parentNode.insertBefore(cssmenu, refNode.nextSibling); } $("mainKeyset").appendChild($C("key", { id: "usercssloader-rebuild-key", oncommand: "UCL.rebuild();", key: "R", modifiers: "alt", })); this.rebuild(); this.initialized = true; if (UCL.USE_UC) { setTimeout(function() { UCL.UCcreateMenuitem(); }, 1000); } window.addEventListener("unload", this, false); }, uninit: function() { const dis = []; for (let x of Object.keys(this.readCSS)) { if (!this.readCSS[x].enabled) dis.push(x); } this.prefs.setCharPref("disabled_list", dis.join("|")); window.removeEventListener("unload", this, false); }, destroy: function() { var i = document.getElementById("usercssloader-menu"); if (i) i.parentNode.removeChild(i); var i = document.getElementById("usercssloader-rebuild-key"); if (i) i.parentNode.removeChild(i); this.uninit(); }, handleEvent: function(event) { switch(event.type){ case "unload": this.uninit(); break; } }, rebuild: function() { let ext = /\.css$/i; let not = /\.uc\.css/i; let files = this.FOLDER.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator); while (files.hasMoreElements()) { let file = files.getNext().QueryInterface(Ci.nsIFile); if (!ext.test(file.leafName) || not.test(file.leafName)) continue; let CSS = this.loadCSS(file); CSS.flag = true; } for (let leafName of Object.keys(this.readCSS)) { const CSS = this.readCSS[leafName]; if (!CSS.flag) { CSS.enabled = false; delete this.readCSS[leafName]; } delete CSS.flag; this.rebuildMenu(leafName); } if (this.initialized) { if (typeof(StatusPanel) !== "undefined") StatusPanel._label = "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", oncommand : "UCL.toggle('"+ aLeafName +"');", onclick : "UCL.itemClick(event);", onmouseup : "if (event.button == 1) event.preventDefault();", tooltiptext : "Linksklick: an/aus, Menü schließt\nMittelklick: an/aus, Menü bleibt offen\nRechtsklick: bearbeiten\nStrg+Linksklick: im Dateimanager anzeigen" }); document.getElementById("usercssloader-menupopup").appendChild(menuitem); } menuitem.setAttribute("checked", CSS.enabled); }, toggle: function(aLeafName) { var CSS = this.readCSS[aLeafName]; if (!CSS || event.ctrlKey) return; CSS.enabled = !CSS.enabled; this.rebuildMenu(aLeafName); }, itemClick: function(event) { let label = event.currentTarget.getAttribute("label"); if (event.button == 0) { if (event.ctrlKey) { event.preventDefault(); event.stopPropagation(); UCL.openFolder (label); } else {return; } } event.preventDefault(); event.stopPropagation(); if (event.button == 1) { this.toggle(label); } else if (event.button == 2) { // closeMenus(event.target); this.edit(this.getFileFromLeafName(label)); } }, getFileFromLeafName: function(aLeafName) { let f = this.FOLDER.clone(); f.QueryInterface(Ci.nsIFile); // use appendRelativePath f.appendRelativePath(aLeafName); return f; }, 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(label){ if (label) { var target= this.FOLDER.path + "\\" + label } else { var target= this.FOLDER.path } if (this.vFileManager.length != 0) { var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); var args=[this.vFMParameter,target]; file.initWithPath(this.vFileManager); process.init(file); // Verzeichnis mit anderem Dateimanager öffnen process.run(false, args, args.length); } else { // Verzeichnis mit Dateimanager des Systems öffnen this.FOLDER.launch(); } }, openCHRMFolder:function(){ if (this.vFileManager.length != 0) { 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", oncommand : "if (!event.ctrlKey) {this.setAttribute('checked', !(this.css.disabled = !this.css.disabled));}", onclick : "UCL.UCItemClick(event);" }); m.css = css; popup.appendChild(m); }); }, UCItemClick: function(event) { if (event.button == 0) return; event.preventDefault(); event.stopPropagation(); if (event.button == 1) { event.target.doCommand(); } else if (event.button == 2) { // closeMenus(event.target); let fileURL = event.currentTarget.getAttribute("tooltiptext"); let file = Services.io.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler).getURLSpecFromActualFile(fileURL); this.edit(file); } }, }; function CSSEntry(aFile) { this.path = aFile.path; this.leafName = aFile.leafName; this.lastModifiedTime = 1; this.SHEET = /^xul-|\.as\.css$/i.test(this.leafName) ? Ci.nsIStyleSheetService.AGENT_SHEET: /\.author\.css$/i.test(this.leafName)? Ci.nsIStyleSheetService.AUTHOR_SHEET: Ci.nsIStyleSheetService.USER_SHEET; } CSSEntry.prototype = { sss: Components.classes["@mozilla.org/content/style-sheet-service;1"] .getService(Components.interfaces.nsIStyleSheetService), _enabled: false, get enabled() { return this._enabled; }, set enabled(isEnable) { var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile) aFile.initWithPath(this.path); var isExists = aFile.exists(); // true, wenn die Datei existiert var lastModifiedTime = isExists ? aFile.lastModifiedTime : 0; var isForced = this.lastModifiedTime != lastModifiedTime; // true, wenn es eine Änderung in der Datei gibt var fileURL = Services.io.getProtocolHandler("file").QueryInterface(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"||"https") === 0 ? "@-moz-document domain(" + this.win.location.host + ") {\n\n\n\n}": "@-moz-document url(" + this.win.location.href + ") {\n\n\n\n}"; this.textbox.value = code; this.dialog.addEventListener("unload", this, false); this.previewButton.addEventListener("click", this, false); this.saveButton.addEventListener("click", this, false); this.closeButton.addEventListener("click", this, false); this.textbox.focus(); let p = this.textbox.value.length - 3; this.textbox.setSelectionRange(p, p); break; case "unload": this.destroy(); this.callback(this); break; } }, preview: function() { var code = this.textbox.value; if (!code || !/\:/.test(code)) return; code = "data:text/css;charset=utf-8," + encodeURIComponent(this.textbox.value); if (code == this.preview_code) return; this.preview_end(); var uri = Services.io.newURI(code, null, null); this.sss.loadAndRegisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET); this.preview_code = code; this.log("Preview"); }, preview_end: function() { if (this.preview_code) { let uri = Services.io.newURI(this.preview_code, null, null); this.sss.unregisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET); this.preview_code = ""; } }, save: function() { var data = this.textbox.value; if (!data) return; var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); fp.init(window, "", Ci.nsIFilePicker.modeSave); fp.appendFilter("CSS Files","*.css"); fp.defaultExtension = "css"; if (window.UCL) fp.displayDirectory = UCL.FOLDER; var res = fp.show(); if (res != fp.returnOK && res != fp.returnReplace) return; var suConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); suConverter.charset = "UTF-8"; data = suConverter.ConvertFromUnicode(data); var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); foStream.init(fp.file, 0x02 | 0x08 | 0x20, 0664, 0); foStream.write(data, data.length); foStream.close(); this.saved = true; }, log: function() { this.logField.textContent = dateFormat(new Date(), "%H:%M:%S") + ": " + $A(arguments); } }; UCL.init(); function $(id) { return document.getElementById(id); } function $A(arr) { return Array.slice(arr); } function $C(name, attr) { 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.getDay()).substr(-2)); format = format.replace("%H", ("0" + date.getHours()).substr(-2)); format = format.replace("%M", ("0" + date.getMinutes()).substr(-2)); format = format.replace("%S", ("0" + date.getSeconds()).substr(-2)); return format; } function log() { Application.console.log(Array.slice(arguments)); } })(); -
Hier ein Beispiel, das aborix mal erstellt hat. Es schließt alle Tabs.
JavaScript
Alles anzeigen// ==UserScript== // key.CloseAllTabs_aborix.uc.js // https://www.camp-firefox.de/forum/viewtopic.php?p=1099118#p1099118 // ==/UserScript== (function() { setTimeout(function() { var browser_chrome = 'chrome://browser/content/browser.xhtml'; if (location != browser_chrome) return; let key = document.createXULElement('key'); key.id = 'key_closeAllTabs'; key.setAttribute('key', 'W'); // key.setAttribute('keycode', 'VK_F1') key.setAttribute('modifiers', 'alt'); key.setAttribute('oncommand', 'gBrowser.removeAllTabsBut(gBrowser.selectedTab); gBrowser.removeTab(gBrowser.selectedTab);'); document.getElementById('mainKeyset').appendChild(key); }, 6000); })();Der timout-Wert am Ende muss angepasst werden.
-
.DeJaVu upward(1) funktioniert nicht, weil, wie schon geschrieben, die URL weiter als ein Element weit verschachtelt ist. :upward() mit einer Zahl muss immer genau die Verschachtelungstiefe bezeichnen, daher anfällig für jede Veränderung des Layout.
Nachdem ich aber auf deinen Hinweis hin bei der Suche nach :has und :upward das gefunden habe https://www.reddit.com/r/uBlockOrigin…asx_or_xupward/
habe ich jetzt diese Variante:
Die funktioniert erst dann nicht mehr, wenn die CLASS des obersten Elements geändert wird.
-
Alles anzeigen
Geht einfacher:
startpage.com##a[href^="https://www.exefiles.com"]:upward(1)
upward ist das Stichwort.
Info für alle:
Zitatsubject:nth-ancestor(n)
Do not use.
Deprecated in favor of
upward
Die URL kommt in dem zu versteckenden Block zwei mal vor und ist mehrere Ebenen tief verschachtelt. Daher scheint mir im konkreten Fall meine Lösung einfacher und weniger anfällig bei Änderungen zu sein.
Die Tipps von dir zeigen mir, dass in uBlock Origin viel mehr steckt, als ich wusste.

Edit: Die Vereinfachung des Hostnamens ist hilfreich!
-
Sören Hentzschel Dankeschön für die Erklärung. Wär auch zu schön gewesen.
Nein, bisher nutze ich Skripte nur für Firefox-Funktionen.Durch den Hinweis von .DeJaVu (Dankeschön auch dafür) bin ich auf diese Beschreibung gestoßen https://github.com/gorhill/uBlock…osmetic-filters und damit funktioniert es tatsächlich. So lange bis es mit CSS geht also eine Möglichkeit ohne Skript.
Beispiel:
-
Hallo,
ich blende in den Duckduckgo-Suchergebnissen Ergebnisse von für mich uninteressanten Seiten aus. Das geht, weil im ersten div-Element gleich die Domain enthalten ist.
Bei Startpage kommt die Domain aber erst in einem verschachtelten Element.
Also div.class div a[href^="domain"]
So wird zwar dieses Element ausgeblendet, aber nicht der ganzen Kasten des Suchergebnisses. CSS müsste also ausgehend von dem Element mit der URL rückwirkend auf ein übergeordnetes Element wirken. Geht sowas? Ich befürchte nicht.
Falls nicht, wie müsste ein Skript dafür aussehen?
-
Nun aber ist diese Änderung seit Version 96 aktiv!
Danke für den Hinweis!
-
Nur überflogen, #113 und andere. Es geht um den zusätzlichen Button, der als Trigger was in Firefox auslöst, was derzeit nicht bekannt ist, so ähnlich hatte Sören das auch geschrieben. Und das schon seit einem Jahr, mit entsprechenden Folgen. Die Frage, die sich mir stellt: ob ihr weiterhin mit einem fehlerhaften Script arbeiten wollt, falls der Schalter aus #113 nicht helfen sollte, ob eure Daten so unwichtig sind. Oder sich einer eine Testkonfiguration zurechtlegt und tüftelt und alle anderen so lange warten. Es geht doch nur um zwei lausige Klicks, oder? Rein pragmatisch gedacht.
? Deine letzten Antworten bringen keine Hilfe zur gestellten Frage und entspechen auch nicht den Tatsachen.
Wie aus meiner Antwort (hoffentlich) hervorgeht, funktioniert das Skript mit dem entsprechenden Schalter. Das von FuchsFan beschriebene Verhalten liegt bei mir daran, was ich vorher beim Speichern ohne das Skript gemacht habe und ist in meinen Augen kein Fehler..
-
Erst nachdem ich in der handlers.json den Wert {"defaultHandlersVersion":{"de":4},"mimeTypes":{"application/pdf":{"action":0,"extensions":["pdf"],"ask":true}, von 4 auf 0 geändert habe, ist es wieder vorbei.
Neuerdings sind nach den vielen Updates die Werte in der handlers.json wieder automatisch umgestellt worden. Hatte das schon vor einiger Zeit bemerkt, aber es als einmalige Sache abgehakt.
Nun habe ich mal rein geschaut, durchweg die werte auf 1 gestellt, somit öffnen sich die Dateien automatisch nach dem Download mit dem verknüpften Programm. Ärgerlich!
Alles wieder auf Null eingerichtet, nun ist wieder Ruhe.
Wurde das bei euch auch schon bemerkt?
Ich war verreist, deshalb erst jetzt eine Reaktion.
Hängt es vielleicht damit zusammen?:
Bei mir macht das Skript mit einem Dateityp das, was ich vorher mit dem normalen Fx-Download-Dialog mit dem Dateityp gemacht habe.
Speichere ich eine Datei, tut das auch das Skript, ohne sie anzuzeigen und sie wird nicht gelöscht nach einem Neustart.
Lasse ich die Datei mit Firefox oder einem anderen Programm anzeigen, zeigt auch das Skript die Datei nach dem Download an und sie wird nach einem Neustart gelöscht.(aus #111)
Das Löschen wurde ja mit user_pref("browser.helperApps.deleteTempFileOnExit", false); gelöst.
-
Aber die Scripts in Thunderbird lassen sich nicht verschieben.
Die sollten sich auch verschieben lassen. Bei mir tun die beiden Skripte das, vorausgesetzt, du hast das Anpassen-Fenster geöffnet.
Wie sehen die bei dir aus? Ich habe das in TB nie hingekriegt und irgendwann den Hinweis bekommen, dass CustomizableUI.createWidget in TB nicht verfügbar sei. Vielleicht können wir das im TB-Forum weiterführen.
-
Und ich weiß auch nicht, warum du ignorierst, dass die anderen, die sich hier zu Wort gemeldet haben, das ebenfalls für unmöglich halten.
Lies meinen Beitrag noch mal. Das Gegenteil ist der Fall.
-
... Es gibt nichts außer treechildren. Die einzelnen Selektoren müssten darunter sein. Da gibt es aber nichts...
Danke, milupo und alle anderen, die genauso hartnäckig dran bleiben wie ich.
Ich bleibe deswegen so hartnäckig, weil, was du schreibst, nicht ganz stimmt. Das hier ist ein Auszug aus der folderpane.css aus der omni.ja von Thunderbird.
ZitatAlles anzeigen/* ..... Local folders ..... */
.tabmail-tab[type="folder"][IsServer="true"][ServerType="none"],
treechildren::-moz-tree-image(folderNameCol, isServer-true, serverType-none) {
list-style-image: url("chrome://messenger/skin/icons/folder-local.svg");
fill: var(--primary);
}
/* ..... Secure mail server ..... */
.tabmail-tab[type="folder"][IsServer="true"][ServerType="imap"][IsSecure="true"],
.tabmail-tab[type="folder"][IsServer="true"][ServerType="pop3"][IsSecure="true"],
treechildren::-moz-tree-image(folderNameCol, isServer-true, serverType-pop3, isSecure-true),
treechildren::-moz-tree-image(folderNameCol, isServer-true, serverType-imap, isSecure-true) {
list-style-image: url("chrome://messenger/skin/icons/message-secure.svg");
fill: var(--primary);
}
Die treechildren haben also eine ganze Menge Eigenschaften, die sich alle per CSS ansprechen lassen. Sowohl die Erweiterung "Phoenity Icons" als auch edvoldi und ich nutzen eine geänderte folderpane.css um die Ordnersymbole zu ändern:
Thunderbird 78 - Hässliche Icons - Thunderbird Mail DEUm Rückfragen vorzubeugen, bitten wir um folgende Angaben:Thunderbird-Version (konkrete Versionsnummer 78.0 Betriebssystem + Version: Windows 7 Pro - 64bit…www.thunderbird-mail.deDie Eigenschaften IsServer und ServerType finden sich auch in der folderpane.js.
Mir fehlt noch eine einzige Eigenschaft, nämlich der Kontoname. Der wird natürlich auch in der folderpane.js verarbeitet, aber ich kann keine passende CSS-Eigenschaft erkennen.
Und an dem Punkt magst du recht haben, dass die tatsächlich nicht existiert, obwohl Thunderbird es schafft, den richtigen Kontonamen dem jeweiligen Konto zuzuordnen, auch wenn die Kontenreihenfolge verändert wird.
Um das herauszufinden und eine generelle Antwort zum Untersuchen der Seitenleiste zu bekommen, habe ich nachgefragt und wie es aussieht, lautet die Antwort auf beides: Geht nicht.
Deshalb bleibt wohl nur, wie .DeJaVu 2002Andreas zitiert, im Einzelfall die omni.ja zu durchforsten und zu hoffen, dass diese Konstruktion wieder geändert wird, wie Sören Hentzschel schreibt.
Also nochmal danke an alle, die sich hier beteiligt haben.

-
Ich bin dankbar für die Tipps, wie ich mit meiner Fragestellung in Thunderbird weiterkomme, aber da das hier das Firefox-Forum ist, möchte ich nochmal meine Ausgangsfrage stellen, die auch den Firefox betrifft:
Wie kann man die Selektoren und Eigenschaften der Elemente in der Seitenleiste, also der treechildren, herausfinden?
-
Ich habe auch schon diverse js-Dateien im TB-Code durchforstet, dort werden natürlich auch Konto- und Servernamen angesprochen, aber wie die CSS-Eigenschaft heißt, war für mich nicht ersichtlich.
Nochmal: Es ist nicht möglich die Konten per CSS einzeln anzusprechen. Es gibt keine spezifischen Selektoren, sondern eben nur treechildren und dafür nur eine Klasse, die für alle Konten gilt. Die Konten einzeln anzusprechen ist offensichtlich nur per Skript möglich. Ein solches Skript muss sozusagen eigene Selektoren mitbringen. Warte mal, bis sich aborix meldet.
Aber die Kontonamen stehen doch im Ordnerbaum. Dann muss es doch mindestens eine Eigenschaft wie label oder ähnlich geben.
-
die einzelnen Elemente in der Seitenleiste
Die Browser-Werkzeuge öffnen.
Dann darin die Sidebar erst aktivieren
Dankeschön! Das ist tatsächlich ein Schritt weiter, aber weiter als bis treechildren komme ich damit noch nicht. Irgendwie muss Firefox die Elemente doch auch ansprechen. Ich finde HTML und besonders Javascript zwar schwierig, wenn's ans Eingemachte geht, aber Zauberei ist es dann doch nicht.

In der Thunderbird-Erweiterung "Phoenity Icons" gibt es CSS-Dateien, die die Symbole ansprechen, aber nicht per Konto, sondern nur per Ordner-Typ. Es gibt also die Selektoren, aber wie findet man die heraus? Warum ist die Seitenleiste auch beim Firefox nicht per Inspektor untersuchbar? Gibt es dafür einen anderen Weg?
Er möchte in TB jedem Konto eine eigene Farbe zuweisen. Das hat er früher mit der Erweiterung Account Colors gemacht, die es aber nicht als Webextension gibt.
bege: Muss denn der ganze Bereich eingefärbt sein, so wie im Screenshot der Erweiterung auf der Erweiterungs-Seite von Thunderbird zu sehen? Denn wenn es reicht, die Icons einzufärben: Das ist ein Standard-Feature von Thunderbird seit Version 78. Nur als Alternative, falls es auch ein bisschen weniger sein darf, weil das auch ohne Anpassung funktioniert.
Danke euch beiden. Ideal wäre tatsächlich, den ganzen Hintergrund je Konto einzufärben, weil ich per CSS die klassischen Ordnersymbole nutze, die sind für mich immer noch am übersichtlichsten. Es würde auch reichen, die Hintergründe der Kontobezeichnungen einzufärben, dafür gibt es sogar den Code im TB-Forum, aber wie bei den Ordnern nur für alle Konten, nicht per Konto. Dafür brauche ich eine Eigenschaft, die das Konto bezeichnet. Mit dem Inspektor ist das bei allen anderen Elementen ja kein Problem, nur eben in der Seitenleiste.
Ich habe auch schon diverse js-Dateien im TB-Code durchforstet, dort werden natürlich auch Konto- und Servernamen angesprochen, aber wie die CSS-Eigenschaft heißt, war für mich nicht ersichtlich.
-
Hallo,
mit dem Inspektor kann ich die einzelnen Elemente in der Seitenleiste z.B. Lesezeichen nicht untersuchen. Das gilt genauso für Thunderbird 91. Ich brauche das gerade für Thunderbird, komme damit aber nicht weiter. Da es das gleiche Problem im Firefox gibt, hoffe ich hier auf Hilfe.
Gibt es eine Möglichkeit, die Selektoren und Eigenschaften der Elemente herauszufinden?
-
Es ist auch immer furchtbar mit Kommas, Semikola und Klammern. Wenn man da nicht aufpasst, hat man einen Syntaxfehler.
Das kann ich aus eigener stundenlanger Erfahrung nur bestätigen.

-
Alles anzeigen
Hallo,
mit dem Originalen Script gibt es die Auswahl:
Linksklick = Neustart
Rechtsklick = Neustart + Cache löschen.
Wird bei Hover angezeigt.
Und diese Doppelauswahl nur mit dem Button im Hamburger, wäre der Hit.
Der Teil dieses Skripts fürs Hamburger-Menü mit dieser Funktion sieht bei mir so aus:
JavaScript
Alles anzeigen(function() { if (location != 'chrome://browser/content/browser.xhtml') return; /* App (Hamburger) Menu */ var menuitem = document.createXULElement('toolbarbutton'); menuitem.id = 'restartfirefox-appMenu'; menuitem.classList.add('subviewbutton', 'subviewbutton-iconic'); menuitem.setAttribute('label' , 'Neustart'); menuitem.setAttribute('tooltiptext' , 'Neustart (mit Rechts- und Mittelklick wird userChrome.js-Cache geleert)'); menuitem.style.listStyleImage= 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAEZ0FNQQAAsY58%2B1GTAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAN8SURBVHjaVJFNTBxlAIafb2Z29gd2l4VdYCkokAUt1AJplQRTrVqjUWMPPWHSCzb21IOn9qIHY2xMahoTTb00NmkUm5qAjdpUI61VaCxCpCVYixt%2ByvKzCwu7LDs7zMw3HmhM%2Bt6fJ0%2FyCp69wiOzZBCPcqSmIXg0HPHuC4R8nkLWyOXyYiIzfuVHzMIA%2BZsLtH18EApntUdhpzUSD5577nDLi%2FGWKjx%2BHVfR8HpFwNwsxTMzza%2BOXJ1%2B58Ev2sVEV%2ByEawXqxf8FllNWEQ9ePXzsqQOecIDU8jampSAVD76Al2BIIx4Dv2Nz7%2FYq%2B5%2BP8sNXE6WdAhdQlOM9rzUdaGiN8M9UjnKvQjzuA0UjV3AxDIcHywqRoEbXoVrKgyBtKXYEUvprmiN9oaoyvr9wl62NHJbtJeDzOo17YmprVzWOppLO2RRNwf1FSOzSUAXsCIR4QdP13UPfjhUde2mjuBXUjcXNEabOnJmq7Y4Nd7z1fu%2BJ%2FR2Jpgrm0jauAI8GlnSlBi4I0bO6sLBWHc9esxRdmjOZf5n%2B5CLWzCzOvsbKupBZ1xgmElUoC%2BgoKtRGQfNomoaND8P8XS%2Bby1olO7O6GHTl1DejGDOrNB%2BvpO7I%2Ba31%2FDP9Z28YUmqoqhCKcG2EYD6ZMUTojZ8WHmsqD%2BI6wnWFajugCkuuZaV%2FZS47wp99R7E3LbxPV6rtr7dV1pmyuBWs3hr7dZ380LC2tzseffvUHm86C1JC2A%2FrGcn509cn%2BPvTk9ibc1R06qL91Ms1CadF000ll9rVS2VykLzVr0lHOgtpuJ9yUFyXxqhKZjbH2nJRI9IZwyw2kXjvXV%2FIOWgaBcc2a%2BtjdVXR1J3iBDx8QUpQUJAuJJclseogxz441H5vrPO72cm0VSyVPJq27ZaHm8ST3Y0M9d9Kkr19A1A1x4VIObTGBfNrsJ5XmE9b6KqgvrOGhr1Vns2sgeNIkXiigvHf1liZuHWZYjINSEXRVLewZjN6bYmYbvN4rcDvVzFKLnOpErMLBpvbklClznyyyPDA6DjTX3wJWICr%2Bnb3ffjXSGpl5Nxnn88uh2ORUCBaHfVQU%2BsjVuGhKqJT5lFYShr8fGH4j42bH53EnJ4EtgEEPQOTzHx9mqXLl9AT9TS82RvreOmVcMTXVh4JhIr5kp3LFu6u3Lk%2ByMylQazU3ENYAvw3AFUTimFqj5i7AAAAAElFTkSuQmCC)', menuitem.setAttribute('onclick', 'if (event.button == 0) { \ Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit); \ }; \ if (event.button == 1 || event.button == 2) { \ Services.appinfo.invalidateCachesOnRestart(); \ Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit); \ };'); var refItem = document.getElementById('appMenu-viewCache').content.getElementById('appMenu-quit-button2'); refItem.parentNode.insertBefore(menuitem, refItem); })();Falls es bei dir wie gewünscht funktioniert, gebührt der Dank diesem Forum.
Ich weiß nicht mehr, woher ich diesen Code habe, wahrscheinlich aus all den Tipps hier zusammengebastelt. 
-
Gerade probiert, da fehlt immer noch }; vor der letzten Zeile.
Auweia. Und ich dachte, es wäre davor schon peinlich genug. Jetzt auch bei mir nochmals korrigiert, Harff182 hatte es aber gleich korrekt gepostet.
Es ist ja eher beruhigend zu sehen, dass auch andere über solche Sachen stolpern.
