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

UserCSSLoader (2025)
-
Speravir -
16. Januar 2025 um 01:15 -
Erledigt
-
-
Das nutze ich nicht...
habe auch gar kein Icon vom Popupmenü dazu.
Den Chromeordner öffne ich via ExtraConfigMenu.uc.jsIst denn deine Version aus #4647 nun schon komplett? Der Beitrag wurde ja 2 x editiert.
-
Nein. Was fehlt steht ja im erwähnten Beitrag .
Ansonsten funktioniert das Script einwandfrei.
Funktioniert das Script extraconfigmenu.uc.js bei Dir
ohne CSP zu deaktivieren noch? Weil bei mir wird alles angezeigt
aber bei klick tut sich nichts. Egal ob mit oder ohne CSP.Mfg.
Endor -
Funktioniert das Script extraconfigmenu.uc.js
Bin zwar nicht gemeint, aber hier funktioniert es mit dieser Änderung in der config:
security.allow_unsafe_dangerous_privileged_evil_eval
auf: true
-
Hallo 2002Andreas.
Vielen Dank!!!
Damit funktioniert es hier auch wieder.
Klasse!!!
Mfg.
Endor -
Damit funktioniert es hier auch wieder.
ergänzend dazu:
BeitragRE: extras_config_menu.uc.js in Fx 139 keine Funktion mehr
Ich denke, das Thema hat sich erledigt, da Mozilla für Nutzer von Scripts eine Ausnahme implementiert:
https://bugzilla.mozilla.org/show_bug.cgi?id=1958232Sören Hentzschel3. April 2025 um 15:48 -
So hatte ich das im April auch eingestellt.
Endor Ich teste mal dein Script und gucke, ob mir was daran fehlt. Immerhin wäre es dann auf dem neuesten Stand.
In Zeile 376 steht let sep = $("usercssloader-ucsepalator");
Ist das korrekt oder muss es ucseparator heißen?
-
Ich habe jetzt einfach mal meinen Code aus dem alten Script in Endors hineinkopiert und es funktioniert alles wie vorher.
Das ist dann Zeile 38 - 51
JavaScript
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 141+ // @charset UTF-8 // @version 0.0.4r4 // @note 0.0.4r4 prevent close menu when middleclick // @note 0.0.4r3 Fx92: getURLSpecFromFile() -> getURLSpecFromActualFile() // @note 0.0.4r2 AUTHOR_SHEET-Unterstützung hinzugefügt, wichtig: Dateiendung muss .author.css sein! // @note 0.0.4 Remove E4X // @note CSS Entry-Klasse erstellt // @note Style-Test-Funktion überarbeitet // @note Wenn die Datei gelöscht wurde, CSS beim Neu-Erstellen und Löschen des Menüs abbrechen // @note uc einlesen .uc.css temporäre Korrespondenz zum erneuten Lesen // ==/UserScript== /****** Bedienungsanleitung ****** CSS-Ordner im Chrome-Ordner erstellen, CSS-Dateien dort ablegen - speichern. Diejenigen, deren Dateiname mit "xul-" beginnen, diejenigen, die mit ".as.css" enden, sind AGENT_SHEET, alle anderen außer USER_SHEET werden gelesen. Da der Inhalt der Datei nicht überprüft wird, darauf achten, die Angabe von @namespace nicht zu vergessen! Schaltfläche wird in Navigationsleiste eingefügt Linksklick auf Stil, zum aktivieren/deaktivieren Mittelklick auf Stil zum aktivieren/deaktivieren, ohne Menü zu schließen Rechtsklick auf Stil zum Öffnen im Editor Strg+Linksklick zum Anzeigen im Dateimanager Verwenden des in "view_source.editor.path" angegebenen Editors Dateiordner kann in Konfiguration geändert werden **** Anleitung Ende ****/ /* Konfiguration */ // Position: als Menü anzeigen = 1, als frei verschiebbare-Schaltfläche = 0 let position = 0; // alternativer Dateimanager, Bsp.: // let filemanager = "C:\\Programme\\totalcmd\\TOTALCMD.EXE"; let filemanager = "H:\\TotalCommander\\TOTALCMD64.EXE"; // eventuelle Parameter für den alternativen Dateimanager, sonst filemanagerParam = ""; //let filemanagerParam = "/O /T";//Totalcommander let filemanagerParam = ""; // Unterordner für die CSS-Dateien: let cssFolder = "CSS"; // zusätzlich Chrome-Ordner im Untermenü anzeigen: 1 = ja, 0 = nein let showChrome = 1; /* Konfiguration Ende */ (function(){ let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; // Wenn beim Start ein weiteres Fenster (zweites Fenster) vorhanden ist, beenden let list = Services.wm.getEnumerator("navigator:browser"); while(list.hasMoreElements()){ if(list.getNext() != window) return; } if (window.UCL) { window.UCL.destroy(); delete window.UCL; } const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; window.UCL = { USE_UC : "UC" in window, AGENT_SHEET : Ci.nsIStyleSheetService.AGENT_SHEET, USER_SHEET : Ci.nsIStyleSheetService.USER_SHEET, AUTHOR_SHEET: Ci.nsIStyleSheetService.AUTHOR_SHEET, readCSS : {}, get disabled_list() { let obj = []; try { obj = decodeURIComponent(this.prefs.getCharPref("disabled_list")).split("|"); } catch(e) {} delete this.disabled_list; return this.disabled_list = obj; }, get prefs() { delete this.prefs; return this.prefs = Services.prefs.getBranch("UserCSSLoader.") }, get styleSheetServices(){ delete this.styleSheetServices; return this.styleSheetServices = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); }, get FOLDER() { let aFolder; try { // UserCSSLoader.FOLDER verwenden let folderPath = this.prefs.getCharPref("FOLDER"); aFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile) aFolder.initWithPath(folderPath); } catch (e) { aFolder = Services.dirsvc.get("UChrm", Ci.nsIFile); aFolder.appendRelativePath("CSS"); } if (!aFolder.exists() || !aFolder.isDirectory()) { aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664); } delete this.FOLDER; return this.FOLDER = aFolder; }, getFocusedWindow: function() { let win = document.commandDispatcher.focusedWindow; if (!win || win == window) win = content; return win; }, init: function() { const cssmenu = $C("menu", { id: "usercssloader-menu", tooltiptext: "UserCSSLoader\n\nLinksklick: Stylesheets anzeigen\nMittelklick: Styles importieren", label: "CSS", accesskey: "C" }); const menupopup = $C("menupopup", { id: "usercssloader-menupopup" }); cssmenu.appendChild(menupopup); let menu = $C("menu", { label: "Style-Loader-Menü", id: "style-loader-menu", accesskey: "y" }); menupopup.appendChild(menu); let mp = $C("menupopup", { id: "usercssloader-submenupopup" }); menu.appendChild(mp); let rebuildItem = $C("menuitem", { label: "Styles importieren", accesskey: "R", acceltext: "Alt + R", }); rebuildItem.addEventListener("command", () => UCL.rebuild()); mp.appendChild(rebuildItem); mp.appendChild($C("menuseparator")); let createCSS = $C("menuitem", { label: "CSS-Datei erstellen", accesskey: "E", }); createCSS.addEventListener("command", () => UCL.create()); mp.appendChild(createCSS); let openFolder = $C("menuitem", { label: "CSS-Ordner öffnen", accesskey: "O", }); openFolder.addEventListener("command", () => UCL.openFolder()); mp.appendChild(openFolder); let editChromeItem = $C("menuitem", { label: "userChrome.css bearbeiten", //hidden: false, }); editChromeItem.addEventListener("command", () => UCL.editUserCSS("userChrome.css")); mp.appendChild(editChromeItem); let editContentItem = $C("menuitem", { label: "userContent.css bearbeiten", //hidden: false, }); editContentItem.addEventListener("command", () => UCL.editUserCSS("userContent.css")); mp.appendChild(editContentItem); let styleTestChrome = $C("menuitem", { label: "Stil Testen (Chrome)", id: "usercssloader-test-chrome", hidden: true, accesskey: "C", }); styleTestChrome.addEventListener("command", () => UCL.styleTest("window")); mp.appendChild(styleTestChrome); let styleTest = $C("menuitem", { label: "Stil Testen(Webseiten)", id: "usercssloader-test-content", hidden: true, accesskey: "W", }); menu = $C("menu", { label: ".uc.css", accesskey: "U", hidden: !UCL.USE_UC }); menupopup.appendChild(menu); mp = $C("menupopup", { id: "usercssloader-ucmenupopup" }); menu.appendChild(mp); let UCrebuild = $C("menuitem", { label: "Importieren(.uc.js)", }); UCrebuild.addEventListener("command", () => UCL.UCrebuild()); mp.appendChild(UCrebuild); mp.appendChild($C("menuseparator", { id: "usercssloader-ucsepalator" })); CustomizableUI.createWidget({ id: 'usercssloader-menu-item', type: 'custom', defaultArea: CustomizableUI.AREA_NAVBAR, onBuild: function(aDocument) { let toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbaritem'); toolbaritem.id = 'usercssloader-menu-item'; toolbaritem.className = 'chromeclass-toolbar-additional'; return toolbaritem; } }); $('usercssloader-menu-item').appendChild(cssmenu); let key = $C("key", { id: "usercssloader-rebuild-key", key: "R", modifiers: "alt", }); key.addEventListener("command", () => UCL.rebuild()); $("mainKeyset").appendChild(key); this.rebuild(); this.initialized = true; if (UCL.USE_UC) { setTimeout(function() { UCL.UCcreateMenuitem(); }, 1000); } window.addEventListener("unload", this, false); }, uninit: function() { const dis = []; for (let x of Object.keys(this.readCSS)) { if (!this.readCSS[x].enabled) dis.push(x); } this.prefs.setCharPref("disabled_list", encodeURIComponent(dis.join("|"))); window.removeEventListener("unload", this, false); }, destroy: function() { var i = document.getElementById("usercssloader-menu"); if (i) i.parentNode.removeChild(i); var i = document.getElementById("usercssloader-rebuild-key"); if (i) i.parentNode.removeChild(i); this.uninit(); }, handleEvent: function(event) { switch(event.type){ case "unload": this.uninit(); break; } }, rebuild: function() { let ext = /\.css$/i; let not = /\.uc\.css/i; let files = this.FOLDER.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator); while (files.hasMoreElements()) { let file = files.getNext().QueryInterface(Ci.nsIFile); if (!ext.test(file.leafName) || not.test(file.leafName)) continue; let CSS = this.loadCSS(file); CSS.flag = true; } for (let leafName of Object.keys(this.readCSS)) { const CSS = this.readCSS[leafName]; if (!CSS.flag) { CSS.enabled = false; delete this.readCSS[leafName]; } delete CSS.flag; this.rebuildMenu(leafName); } if (this.initialized) { if (typeof(StatusPanel) !== "undefined") StatusPanel._label = "Styles importiert"; else XULBrowserWindow.statusTextField.label = "Styles importiert"; } }, loadCSS: function(aFile) { var CSS = this.readCSS[aFile.leafName]; if (!CSS) { CSS = this.readCSS[aFile.leafName] = new CSSEntry(aFile); if (this.disabled_list.indexOf(CSS.leafName) === -1) { CSS.enabled = true; } } else if (CSS.enabled) { CSS.enabled = true; } return CSS; }, rebuildMenu: function(aLeafName) { var CSS = this.readCSS[aLeafName]; var menuitem = document.getElementById("usercssloader-" + aLeafName); if (!CSS) { if (menuitem) menuitem.parentNode.removeChild(menuitem); return; } if (!menuitem) { menuitem = $C("menuitem", { label : aLeafName, id : "usercssloader-" + aLeafName, class : "usercssloader-item " + (CSS.SHEET == this.AGENT_SHEET? "AGENT_SHEET" : CSS.SHEET == this.AUTHOR_SHEET? "AUTHOR_SHEET": "USER_SHEET"), type : "checkbox", autocheck : "false", }); menuitem.addEventListener("command", () => { UCL.toggle(aLeafName); }); menuitem.addEventListener("mouseup", (event) => { if (event.button === 1) event.preventDefault(); }); menuitem.addEventListener("click", (event) => { UCL.itemClick(event); }); document.getElementById("usercssloader-menupopup").appendChild(menuitem); } menuitem.setAttribute("checked", CSS.enabled); }, toggle: function(aLeafName) { var CSS = this.readCSS[aLeafName]; if (!CSS) return; CSS.enabled = !CSS.enabled; this.rebuildMenu(aLeafName); }, itemClick: function(event) { if (event.button == 0) return; event.preventDefault(); event.stopPropagation(); let label = event.currentTarget.getAttribute("label"); if (event.button == 1) { this.toggle(label); } else if (event.button == 2) { closeMenus(event.target); this.edit(this.getFileFromLeafName(label)); } }, getFileFromLeafName: function(aLeafName) { let f = this.FOLDER.clone(); f.QueryInterface(Ci.nsIFile); // use appendRelativePath f.appendRelativePath(aLeafName); return f; }, styleTest: function(aWindow) { aWindow || (aWindow = this.getFocusedWindow()); new CSSTester(aWindow, function(tester){ if (tester.saved) UCL.rebuild(); }); }, openFolder: function() { this.FOLDER.launch(); }, editUserCSS: function(aLeafName) { let file = Services.dirsvc.get("UChrm", Ci.nsIFile); file.appendRelativePath(aLeafName); this.edit(file); }, edit: function(aFile) { var editor = Services.prefs.getCharPref("view_source.editor.path"); if (!editor) return alert("Unter about:config den vorhandenen Schalter:\n view_source.editor.path mit dem Editorpfad ergänzen"); try { var UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8"; var path = UI.ConvertFromUnicode(aFile.path); var app = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); app.initWithPath(editor); var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); process.init(app); process.run(false, [path], 1); } catch (e) {} }, create: function(aLeafName) { if (!aLeafName) aLeafName = prompt("Name des Styles", dateFormat(new Date(), "%Y_%m%d_%H%M%S")); if (aLeafName) aLeafName = aLeafName.replace(/\s+/g, " ").replace(/[\\/:*?\"<>|]/g, ""); if (!aLeafName || !/\S/.test(aLeafName)) return; if (!/\.css$/.test(aLeafName)) aLeafName += ".css"; let file = this.getFileFromLeafName(aLeafName); this.edit(file); }, UCrebuild: function() { let re = /^file:.*\.uc\.css(?:\?\d+)?$/i; let query = "?" + new Date().getTime(); Array.slice(document.styleSheets).forEach(function(css){ if (!re.test(css.href)) return; if (css.ownerNode) { css.ownerNode.parentNode.removeChild(css.ownerNode); } let pi = document.createProcessingInstruction('xml-stylesheet','type="text/css" href="'+ css.href.replace(/\?.*/, '') + query +'"'); document.insertBefore(pi, document.documentElement); }); UCL.UCcreateMenuitem(); }, UCcreateMenuitem: function() { let sep = $("usercssloader-ucsepalator"); let popup = sep.parentNode; if (sep.nextSibling) { let range = document.createRange(); range.setStartAfter(sep); range.setEndAfter(popup.lastChild); range.deleteContents(); range.detach(); } let re = /^file:.*\.uc\.css(?:\?\d+)?$/i; Array.slice(document.styleSheets).forEach(function(css) { if (!re.test(css.href)) return; let fileURL = decodeURIComponent(css.href).split("?")[0]; let aLeafName = fileURL.split("/").pop(); let m = $C("menuitem", { label : aLeafName, tooltiptext : fileURL, id : "usercssloader-" + aLeafName, type : "checkbox", autocheck : "false", checked : "true", }); m.css = css; m.addEventListener("command", function() { this.setAttribute("checked", !(this.css.disabled = !this.css.disabled)); }); m.addEventListener("mouseup", function(event) { if (event.button === 1) event.preventDefault(); }); m.addEventListener("click", function(event) { UCL.UCItemClick(event); }); popup.appendChild(m); }); }, UCItemClick: function(event) { if (event.button == 0) return; event.preventDefault(); event.stopPropagation(); if (event.button == 1) { event.target.doCommand(); } else if (event.button == 2) { closeMenus(event.target); let fileURL = event.currentTarget.getAttribute("tooltiptext"); let file = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getFileFromURLSpec(fileURL); this.edit(file); } }, }; function CSSEntry(aFile) { this.path = aFile.path; this.leafName = aFile.leafName; this.lastModifiedTime = 1; this.SHEET = /^xul-|\.as\.css$/i.test(this.leafName) ? Ci.nsIStyleSheetService.AGENT_SHEET: /\.author\.css$/i.test(this.leafName)? Ci.nsIStyleSheetService.AUTHOR_SHEET: Ci.nsIStyleSheetService.USER_SHEET; } CSSEntry.prototype = { sss: Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService), _enabled: false, get enabled() { return this._enabled; }, set enabled(isEnable) { var aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile) aFile.initWithPath(this.path); var isExists = aFile.exists(); // true, wenn die Datei bereits existiert var lastModifiedTime = isExists ? aFile.lastModifiedTime : 0; var isForced = this.lastModifiedTime != lastModifiedTime; //true, wenn es eine Änderung in der Datei gibt var fileURL = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getURLSpecFromActualFile(aFile); var uri = Services.io.newURI(fileURL, null, null); if (this.sss.sheetRegistered(uri, this.SHEET)) { // Wenn diese Datei bereits gelesen wurde if (!isEnable || !isExists) { this.sss.unregisterSheet(uri, this.SHEET); } else if (isForced) { // Nach Stornierung erneut einlesen this.sss.unregisterSheet(uri, this.SHEET); this.sss.loadAndRegisterSheet(uri, this.SHEET); } } else { // Datei wurde nicht gelesen if (isEnable && isExists) { this.sss.loadAndRegisterSheet(uri, this.SHEET); } } if (this.lastModifiedTime !== 1 && isEnable && isForced) { log(this.leafName + " wurde aktualisiert"); } this.lastModifiedTime = lastModifiedTime; return this._enabled = isEnable; }, }; function CSSTester(aWindow, aCallback) { this.win = aWindow || window; this.doc = this.win.document; this.callback = aCallback; this.init(); } CSSTester.prototype = { sss: Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService), preview_code: "", saved: false, init: function() { this.dialog = openDialog( "data:text/html;charset=utf8,"+encodeURIComponent('<!DOCTYPE HTML><html lang="ja"><head><title>CSSTester</title></head><body></body></html>'), "", "width=550,height=400,dialog=no"); this.dialog.addEventListener("load", this, false); }, destroy: function() { this.preview_end(); this.dialog.removeEventListener("unload", this, false); this.previewButton.removeEventListener("click", this, false); this.saveButton.removeEventListener("click", this, false); this.closeButton.removeEventListener("click", this, false); }, handleEvent: function(event) { switch(event.type) { case "click": if (event.button != 0) return; if (this.previewButton == event.currentTarget) { this.preview(); } else if (this.saveButton == event.currentTarget) { this.save(); } else if (this.closeButton == event.currentTarget) { this.dialog.close(); } break; case "load": var doc = this.dialog.document; doc.body.innerHTML = '\ <style type="text/css">\ :not(input):not(select) { padding: 0px; margin: 0px; }\ table { border-spacing: 0px; }\ body, html, #main, #textarea { width: 100%; height: 100%; }\ #textarea { font-family: monospace; }\ </style>\ <table id="main">\ <tr height="100%">\ <td colspan="4"><textarea id="textarea"></textarea></td>\ </tr>\ <tr height="40">\ <td><input type="button" value="Preview" /></td>\ <td><input type="button" value="Save" /></td>\ <td width="80%"><span class="log"></span></td>\ <td><input type="button" value="Close" /></td>\ </tr>\ </table>\ '; this.textbox = doc.querySelector("textarea"); this.previewButton = doc.querySelector('input[value="Preview"]'); this.saveButton = doc.querySelector('input[value="Save"]'); this.closeButton = doc.querySelector('input[value="Close"]'); this.logField = doc.querySelector('.log'); var code = "@namespace url(" + this.doc.documentElement.namespaceURI + ");\n"; code += this.win.location.protocol.indexOf("http") === 0? "@-moz-document domain(" + this.win.location.host + ") {\n\n\n\n}": "@-moz-document url(" + this.win.location.href + ") {\n\n\n\n}"; this.textbox.value = code; this.dialog.addEventListener("unload", this, false); this.previewButton.addEventListener("click", this, false); this.saveButton.addEventListener("click", this, false); this.closeButton.addEventListener("click", this, false); this.textbox.focus(); let p = this.textbox.value.length - 3; this.textbox.setSelectionRange(p, p); break; case "unload": this.destroy(); this.callback(this); break; } }, preview: function() { var code = this.textbox.value; if (!code || !/\:/.test(code)) return; code = "data:text/css;charset=utf-8," + encodeURIComponent(this.textbox.value); if (code == this.preview_code) return; this.preview_end(); var uri = Services.io.newURI(code, null, null); this.sss.loadAndRegisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET); this.preview_code = code; this.log("Preview"); }, preview_end: function() { if (this.preview_code) { let uri = Services.io.newURI(this.preview_code, null, null); this.sss.unregisterSheet(uri, Ci.nsIStyleSheetService.AGENT_SHEET); this.preview_code = ""; } }, save: function() { var data = this.textbox.value; if (!data) return; var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); fp.init(window, "", Ci.nsIFilePicker.modeSave); fp.appendFilter("CSS Files","*.css"); fp.defaultExtension = "css"; if (window.UCL) fp.displayDirectory = UCL.FOLDER; var res = fp.show(); if (res != fp.returnOK && res != fp.returnReplace) return; var suConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); suConverter.charset = "UTF-8"; data = suConverter.ConvertFromUnicode(data); var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); foStream.init(fp.file, 0x02 | 0x08 | 0x20, 0664, 0); foStream.write(data, data.length); foStream.close(); this.saved = true; }, log: function() { this.logField.textContent = dateFormat(new Date(), "%H:%M:%S") + ": " + $A(arguments); } }; UCL.init(); function $(id) { return document.getElementById(id); } function $A(arr) { return Array.slice(arr); } function $C(name, attr) { const el = document.createElementNS(XULNS, name); if (attr) Object.keys(attr).forEach(function(n) { el.setAttribute(n, attr[n]) }); return el; } function dateFormat(date, format) { format = format.replace("%Y", ("000" + date.getFullYear()).substr(-4)); format = format.replace("%m", ("0" + (date.getMonth()+1)).substr(-2)); format = format.replace("%d", ("0" + date.getDate()).substr(-2)); format = format.replace("%H", ("0" + date.getHours()).substr(-2)); format = format.replace("%M", ("0" + date.getMinutes()).substr(-2)); format = format.replace("%S", ("0" + date.getSeconds()).substr(-2)); return format; } function log(mes) { console.log(mes); } })();
Meine CSS-Datei dafür
CSS
Alles anzeigen/* UserStyles Loader Button */ #usercssloader-menu { margin-right: 0 !important; margin-left: 0 !important; content: '' !important; display: block !important; width: 20px !important; height: 20px !important; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAABRUlEQVQ4jaXSLW/CUBTG8YdMTmxijiY1M62A8w2omZ1jlhA0mC6ZJTiSKewsDgesohgICWLjQ0DCkvJOPeGZGG3Xji50O8kvueeKv7kX+JorAFkAuRh3AATADYALnJjsfD5nHMuySJKFQuHxGElFA7nFYsE4XoAkdV1/AHAdjeRWqxXjtNttfp9MJnMP4DIUWK/XjDMYDBgdALehwHa7ZZzpdMrhcMhut0vbtmnbNgEYocBut2MSx9cJAq7rMokgYI6ZMt/+BOaYgDnmy7vr8+ac3Q80RhuWOw5JstxxfL/tjdEmCNT7SxZbM5JksTULid55e72/DALVnsN8c0KSzDcnP0TvSbLac4LA0+uHz5vo+dTuB/7F+wf7/Z5J+P9ARAxFUSqHw4FJKIpSEREDImJomlZSVbWWTqefz6Gqak3TtJKIGJ86u+Qm3Nb2fAAAAABJRU5ErkJggg==") !important; background-repeat: no-repeat !important; background-position: 1px 5px !important; background-size: 15px 15px !important; } #usercssloader-menu > .menu-text, #usercssloader-menu > .menu-right { display: none !important; } #usercssloader-menu:hover { margin-right: 0 !important; margin-left: 0 !important; content: '' !important; display: block !important; width: 20px !important; height: 20px !important; background: lightgrey !important; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAABRUlEQVQ4jaXSLW/CUBTG8YdMTmxijiY1M62A8w2omZ1jlhA0mC6ZJTiSKewsDgesohgICWLjQ0DCkvJOPeGZGG3Xji50O8kvueeKv7kX+JorAFkAuRh3AATADYALnJjsfD5nHMuySJKFQuHxGElFA7nFYsE4XoAkdV1/AHAdjeRWqxXjtNttfp9MJnMP4DIUWK/XjDMYDBgdALehwHa7ZZzpdMrhcMhut0vbtmnbNgEYocBut2MSx9cJAq7rMokgYI6ZMt/+BOaYgDnmy7vr8+ac3Q80RhuWOw5JstxxfL/tjdEmCNT7SxZbM5JksTULid55e72/DALVnsN8c0KSzDcnP0TvSbLac4LA0+uHz5vo+dTuB/7F+wf7/Z5J+P9ARAxFUSqHw4FJKIpSEREDImJomlZSVbWWTqefz6Gqak3TtJKIGJ86u+Qm3Nb2fAAAAABJRU5ErkJggg==") !important; background-repeat: no-repeat !important; background-position: 1px 5px !important; background-size: 15px 15px !important; } #usercssloader-menu > .menu-text, #usercssloader-menu > .menu-right { display: none !important; } #usercssloader-menupopup > menuitem, #usercssloader-menupopup > menu, #usercssloader-submenupopup > menuitem, #usercssloader-submenupopup > menu { min-height: 24px !important; /* Höhe in px anpassbar */ max-height: 24px !important; }
-
Wenn es eine Version gibt, die i. O. ist,
brauch ich mich ja nicht abmühen.
-
Kann gar nicht sein, denn er hat nur oben den Konfigurationsteil eingebaut.
Die dazu gehörenden Funktionen aber nicht. Wie soll es dann gehen?
Mfg.
Endor -
-
Speravir
22. August 2025 um 00:09 Hat den Titel des Themas von „UserCSSLoader (Anfang 2025)“ zu „UserCSSLoader (2025)“ geändert. -
Habe eine funktionierende Version vom usercssloader.uc.js auf Basis einer
Version aus den asiatischen Tiefen gemacht.Oh …
Ich hab die Änderungen aus der vorigen Version (UserCSSLoader.uc.js bei Endor) wieder eingebaut inklusive des Konfigurationsteils und einigen Fehlerkorrekturen (an einer Stelle fehlte sicher eine Semikolon, in einer anderen kann man es weglassen, glaube ich, es ist aber besser, es zu setzen; plus Rechtschreib-/Tippfehler, zum Teil von mir selber aus der Vorgängerversion).
Im Moment fehlt noch der Eintrag zum öffnen des Chromeordners
und die Möglichkeit zur Verwendung eines alternativen Dateimanagers.
Also anstelle vom Explorer zbs. den Totalcomander.Bei mir funktioniert es. (Bis auf das:) Wenn ich mich aber recht erinnere, ging schon beim letzten Mal die Sache mit den Dateimanagerparametern nicht, vielleicht will sich BrokenHeart das mal ansehen? Ich nutze daher eine Windows-Verknüpfung (.LNK-Datei), in Linux und MacOS würde man wohl eine Shell-Datei einsetzen. Eine Tastenkombi musste auch wieder eingefügt, dabei aber geändert werden, bei einer anderen war mir nicht aufgefallen, dass meine Änderung schon vergeben war, Details bei Anfrage und vielleicht fällt anderen eine weitere Kollision auf.
Den CSS-Tester und alle dazugehörigen Codeteile habe ich wieder herausgeworfen: Erstens ist das in der Skript-Vorlage sowieso standardmäßig deaktiviert und zweitens erhielt ich nach Aktivierung nur leere Fenster ohne Inhalt, was aber, sofern ich die Fehlerkonsole nicht missverstehe, an meinen Schutzeinstellungen im Firefox liegen könnte.
JavaScript: UserCSSLoader_2025-08
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 141+ // @charset UTF-8 // @version 0.0.4r4 // @note 0.0.4r4 prevent close menu when middleclick // @note Aktualisierungen von BrokenHeart (mit 0.0.4r4 obsolet) und Speravir - www.camp-firefox.de // @note 0.0.4r3 Fx92: getURLSpecFromFile() -> getURLSpecFromActualFile() // @note 0.0.4r2 AUTHOR_SHEET-Unterstützung hinzugefügt, wichtig: Dateiendung muss .author.css sein! // @note Version 0.0.4.g ermöglicht "Styles importieren" per Mittelklick und Verwendung // @note eines anderen Dateimanagers (siehe in Konfiguration), ergänzt um einen // @note Parameter für den Dateimanager (vFMParameter in der Konfiguration) von aborix // @note Frei verschiebbare Schaltfläche eingebaut von aborix // @note 0.0.4 Remove E4X // @note CSS-Entry-Klasse erstellt // @note Style-Test-Funktion überarbeitet // @note Wenn die Datei gelöscht wurde, CSS beim Neu-Erstellen und Löschen des Menüs abbrechen // @note uc einlesen .uc.css temporäre Korrespondenz zum erneuten Lesen // ==/UserScript== /****** Bedienungsanleitung ****** CSS-Ordner im Chrome-Ordner erstellen, CSS-Dateien dort ablegen - speichern. Diejenigen, deren Dateiname mit "xul-" beginnen, diejenigen, die mit ".as.css" enden, sind AGENT_SHEET, alle anderen außer USER_SHEET werden gelesen. Da der Inhalt der Datei nicht überprüft wird, darauf achten, die Angabe von @namespace nicht zu vergessen! Schaltfläche wird in Navigationsleiste eingefügt (konfigurierbar, siehe Variable "position") Linksklick auf Stil, zum Aktivieren/Deaktivieren Mittelklick auf Stil zum Aktivieren/Deaktivieren, ohne Menü zu schließen Rechtsklick auf Stil zum Öffnen im Editor Strg+Linksklick zum Anzeigen im Dateimanager Die Tastenkombinationen können im Menü eingeblendet werden, dazu nach "acceltext" suchen und den Zeilenkommentar "//" entfernen bzw. einfügen. Verwenden des in "view_source.editor.path" angegebenen Editors. Dateiordner kann in Konfiguration geändert werden. **** Anleitung Ende ****/ (function(){ /***** Konfiguration *****/ // Position: als frei verschiebbare-Schaltfläche = 0, als Menü anzeigen = 1 let position = 0;//1 // alternativer Dateimanager, Bsp.: // let filemanager = "C:\\Programme\\totalcmd\\TOTALCMD.EXE"; let filemanager = ""; // eventuelle Parameter für den alternativen Dateimanager, sonst filemanagerParam = ""; //let filemanagerParam = "/O /T";//Totalcommander let filemanagerParam = ""; // Unterordner für die CSS-Dateien: let cssFolder = "CSS"; // Menüeintrag zum Bearbeiten der userChrome.css verstecken (true) oder anzeigen (false) let hideUserChromeCSS = false; // Menüeintrag zum Bearbeiten der userContent.css verstecken (true) oder anzeigen (false) let hideUserContentCSS = false; // zusätzlich Chrome-Ordner im Untermenü anzeigen: 1 = ja, 0 = nein let showChrome = 1; /***** Ende Konfiguration *****/ ChromeUtils.importESModule("resource://gre/modules/AppConstants.sys.mjs"); let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; // Wenn beim Start ein weiteres Fenster (zweites Fenster) vorhanden ist, beenden let list = Services.wm.getEnumerator("navigator:browser"); while(list.hasMoreElements()){ if(list.getNext() != window) return; } if (window.UCL) { window.UCL.destroy(); delete window.UCL; } 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 = 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(cssFolder); } if (!aFolder.exists() || !aFolder.isDirectory()) { aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664); } delete this.FOLDER; return this.FOLDER = aFolder; }, get CHRMFOLDER() { let bFolder; try { // UserCSSLoader.CHRMFOLDER verwenden let CHRMfolderPath = this.prefs.getCharPref("CHRMFOLDER"); bFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); bFolder.initWithPath(CHRMfolderPath); } catch (e) { bFolder = Services.dirsvc.get("UChrm", Ci.nsIFile); } if (!bFolder.exists() || !bFolder.isDirectory()) { bFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664); } delete this.CHRMFOLDER; return this.CHRMFOLDER = bFolder; }, getFocusedWindow: function() { let win = document.commandDispatcher.focusedWindow; if (!win || win == window) win = content; return win; }, init: function() { const cssmenu = $C("menu", { id: "usercssloader-menu", label: "CSS", tooltiptext: "UserCSSLoader\n\nLinksklick: Stylesheets anzeigen\nMittelklick: Styles importieren", accesskey: "Y" }); cssmenu.addEventListener("mouseup", (event) => { if (event.button === 1) event.preventDefault(); }); cssmenu.addEventListener("command", () => UCL.rebuild()); const menupopup = $C("menupopup", { id: "usercssloader-menupopup" }); cssmenu.appendChild(menupopup); let menu = $C("menu", { label: "Style-Loader-Menü", id: "style-loader-menu", accesskey: "M", //acceltext: "Alt + M" }); menupopup.appendChild(menu); menupopup.appendChild($C("menuseparator")); let mp = $C("menupopup", { id: "usercssloader-submenupopup" }); menu.appendChild(mp); let rebuildItem = $C("menuitem", { label: "Styles importieren", accesskey: "I", //acceltext: "Alt + I" }); rebuildItem.addEventListener("command", () => UCL.rebuild()); mp.appendChild(rebuildItem); mp.appendChild($C("menuseparator")); let createCSS = $C("menuitem", { label: "CSS-Datei erstellen", accesskey: "E", //acceltext: "Alt + E" }); createCSS.addEventListener("command", () => UCL.create()); mp.appendChild(createCSS); let openFolder = $C("menuitem", { label: "CSS-Ordner öffnen", accesskey: "O", //acceltext: "Alt + O" }); openFolder.addEventListener("command", () => UCL.openFolder()); mp.appendChild(openFolder); if (showChrome === 1) { let openChromeFolder = $C("menuitem", { label: "Chrome-Ordner öffnen", accesskey: "X", //acceltext: "Alt + X" }); openChromeFolder.addEventListener("command", () => UCL.openCHRMFolder()); mp.appendChild(openChromeFolder); } mp.appendChild($C('menuseparator')); let editChromeItem = $C("menuitem", { label: "userChrome.css bearbeiten", hidden: hideUserChromeCSS, }); editChromeItem.addEventListener("command", () => UCL.editUserCSS("userChrome.css")); mp.appendChild(editChromeItem); let editContentItem = $C("menuitem", { label: "userContent.css bearbeiten", hidden: hideUserContentCSS, }); editContentItem.addEventListener("command", () => UCL.editUserCSS("userContent.css")); mp.appendChild(editContentItem); menu = $C("menu", { label: ".uc.css", accesskey: "U", //acceltext: "Alt + U", hidden: !UCL.USE_UC }); menupopup.appendChild(menu); mp = $C("menupopup", { id: "usercssloader-ucmenupopup" }); menu.appendChild(mp); let UCrebuild = $C("menuitem", { label: "Importieren(.uc.js)", }); UCrebuild.addEventListener("command", () => UCL.UCrebuild()); mp.appendChild(UCrebuild); mp.appendChild($C("menuseparator", { id: "usercssloader-ucseparator" })); CustomizableUI.createWidget({ id: 'usercssloader-menu-item', type: 'custom', defaultArea: CustomizableUI.AREA_NAVBAR, onBuild: function(aDocument) { let toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbaritem'); toolbaritem.id = 'usercssloader-menu-item'; toolbaritem.className = 'chromeclass-toolbar-additional'; return toolbaritem; } }); $('usercssloader-menu-item').appendChild(cssmenu); if (position === 1) { let refNode = $('helpMenu'); refNode.parentNode.insertBefore(cssmenu, refNode.nextSibling); } let key = $C("key", { id: "usercssloader-rebuild-key", key: "R", modifiers: "alt", }); key.addEventListener("command", () => UCL.rebuild()); $("mainKeyset").appendChild(key); this.rebuild(); this.initialized = true; if (UCL.USE_UC) { setTimeout(function() { UCL.UCcreateMenuitem(); }, 1000); } window.addEventListener("unload", this, false); }, uninit: function() { const dis = []; for (let x of Object.keys(this.readCSS)) { if (!this.readCSS[x].enabled) dis.push(x); } this.prefs.setCharPref("disabled_list", encodeURIComponent(dis.join("|"))); window.removeEventListener("unload", this, false); }, destroy: function() { var i = document.getElementById("usercssloader-menu"); if (i) i.parentNode.removeChild(i); var i = document.getElementById("usercssloader-rebuild-key"); if (i) i.parentNode.removeChild(i); this.uninit(); }, handleEvent: function(event) { switch(event.type){ case "unload": this.uninit(); break; } }, rebuild: function() { let ext = /\.css$/i; let not = /\.uc\.css/i; let files = this.FOLDER.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator); while (files.hasMoreElements()) { let file = files.getNext().QueryInterface(Ci.nsIFile); if (!ext.test(file.leafName) || not.test(file.leafName)) continue; let CSS = this.loadCSS(file); CSS.flag = true; } for (let leafName of Object.keys(this.readCSS)) { const CSS = this.readCSS[leafName]; if (!CSS.flag) { CSS.enabled = false; delete this.readCSS[leafName]; } delete CSS.flag; this.rebuildMenu(leafName); } if (this.initialized) { if (typeof(StatusPanel) !== "undefined") StatusPanel._label = "Styles importiert"; else XULBrowserWindow.statusTextField.label = "Styles importiert"; } }, loadCSS: function(aFile) { let CSS = this.readCSS[aFile.leafName]; if (!CSS) { CSS = this.readCSS[aFile.leafName] = new CSSEntry(aFile); if (this.disabled_list.indexOf(CSS.leafName) === -1) { CSS.enabled = true; } } else if (CSS.enabled) { CSS.enabled = true; } return CSS; }, rebuildMenu: function(aLeafName) { let CSS = this.readCSS[aLeafName]; let menuitem = document.getElementById("usercssloader-" + aLeafName); if (!CSS) { if (menuitem) menuitem.parentNode.removeChild(menuitem); return; } if (!menuitem) { menuitem = $C("menuitem", { label : aLeafName, id : "usercssloader-" + aLeafName, class : "usercssloader-item " + (CSS.SHEET == this.AGENT_SHEET? "AGENT_SHEET" : CSS.SHEET == this.AUTHOR_SHEET? "AUTHOR_SHEET": "USER_SHEET"), type : "checkbox", autocheck : "false", tooltiptext : "Linksklick: an/aus, Menü schließt\nMittelklick: an/aus, Menü bleibt offen\nRechtsklick: bearbeiten\nStrg+Rechtsklick: im Dateimanager anzeigen" }); menuitem.addEventListener("command", () => UCL.toggle(aLeafName)); menuitem.addEventListener("click", (event) => UCL.itemClick(event)); menuitem.addEventListener("mouseup", (event) => { if (event.button === 1) event.preventDefault(); }); document.getElementById("usercssloader-menupopup").appendChild(menuitem); } menuitem.setAttribute("checked", CSS.enabled); }, toggle: function(aLeafName) { let CSS = this.readCSS[aLeafName]; if (!CSS || event.ctrlKey) return; CSS.enabled = !CSS.enabled; this.rebuildMenu(aLeafName); }, itemClick: function(event) { let label = event.currentTarget.getAttribute("label"); event.preventDefault(); event.stopPropagation(); if (event.button === 0) { return; } else if (event.button === 1) { this.toggle(label); } else if (event.button === 2) { if (event.ctrlKey) { UCL.openFolder(label); } else { closeMenus(event.target); this.edit(this.getFileFromLeafName(label)); } } }, getFileFromLeafName: function(aLeafName) { let f = this.FOLDER.clone(); f.QueryInterface(Ci.nsIFile); // use appendRelativePath f.appendRelativePath(aLeafName); return f; }, openFolder: function(label) { const PathSep = AppConstants.platform === "win" ? "\\" : "/"; let target= this.FOLDER.path + PathSep + label; if (this.vFileManager.length !== 0) { let file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); let args = [this.vFMParameter,target]; file.initWithPath(this.vFileManager); process.init(file); // Verzeichnis mit anderem Dateimanager öffnen process.run(false, args, args.length); } else { // Verzeichnis mit Dateimanager des Systems öffnen this.FOLDER.launch(); } }, openCHRMFolder:function(){ if (this.vFileManager.length !== 0) { let file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); let args = [this.vFMParameter,this.CHRMFOLDER.path]; file.initWithPath(this.vFileManager); process.init(file); // Verzeichnis mit anderem Dateimanager öffnen process.run(false, args, args.length); } else { // Verzeichnis mit Dateimanager des Systems öffnen this.CHRMFOLDER.launch(); } }, editUserCSS: function(aLeafName) { let file = Services.dirsvc.get("UChrm", Ci.nsIFile); file.appendRelativePath(aLeafName); this.edit(file); }, edit: function(aFile) { let editor = Services.prefs.getCharPref("view_source.editor.path"); if (!editor) return alert('Unter about:config den vorhandenen Schalter\n "view_source.editor.path" mit dem Editorpfad ergänzen'); try { let UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8"; let path = UI.ConvertFromUnicode(aFile.path); let app = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); app.initWithPath(editor); let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); process.init(app); process.run(false, [path], 1); } catch (e) {} }, create: function(aLeafName) { if (!aLeafName) aLeafName = prompt("Name des Styles", dateFormat(new Date(), "%Y_%m%d_%H%M%S")); if (aLeafName) aLeafName = aLeafName.replace(/\s+/g, " ").replace(/[\\/:*?\"<>|]/g, ""); if (!aLeafName || !/\S/.test(aLeafName)) return; if (!/\.css$/.test(aLeafName)) aLeafName += ".css"; let file = this.getFileFromLeafName(aLeafName); this.edit(file); }, UCrebuild: function() { let re = /^file:.*\.uc\.css(?:\?\d+)?$/i; let query = "?" + new Date().getTime(); Array.slice(document.styleSheets).forEach(function(css){ if (!re.test(css.href)) return; if (css.ownerNode) { css.ownerNode.parentNode.removeChild(css.ownerNode); } let pi = document.createProcessingInstruction('xml-stylesheet','type="text/css" href="'+ css.href.replace(/\?.*/, '') + query +'"'); document.insertBefore(pi, document.documentElement); }); UCL.UCcreateMenuitem(); }, UCcreateMenuitem: function() { let sep = $("usercssloader-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; m.addEventListener("command", function() { if (!event.ctrlKey) {this.setAttribute("checked", !(this.css.disabled = !this.css.disabled));} }); m.addEventListener("mouseup", function(event) { if (event.button === 1) event.preventDefault(); }); m.addEventListener("click", function(event) { UCL.UCItemClick(event); }); popup.appendChild(m); }); }, UCItemClick: function(event) { if (event.button === 0) return; event.preventDefault(); event.stopPropagation(); if (event.button === 1) { event.target.doCommand(); } else if (event.button === 2) { closeMenus(event.target); let fileURL = event.currentTarget.getAttribute("tooltiptext"); let file = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getFileFromURLSpec(fileURL); this.edit(file); } }, }; function CSSEntry(aFile) { this.path = aFile.path; this.leafName = aFile.leafName; this.lastModifiedTime = 1; this.SHEET = /^xul-|\.as\.css$/i.test(this.leafName) ? Ci.nsIStyleSheetService.AGENT_SHEET: /\.author\.css$/i.test(this.leafName)? Ci.nsIStyleSheetService.AUTHOR_SHEET: Ci.nsIStyleSheetService.USER_SHEET; } CSSEntry.prototype = { sss: Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService), _enabled: false, get enabled() { return this._enabled; }, set enabled(isEnable) { let aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile) aFile.initWithPath(this.path); let isExists = aFile.exists(); // true, wenn die Datei bereits existiert let lastModifiedTime = isExists ? aFile.lastModifiedTime : 0; let isForced = this.lastModifiedTime != lastModifiedTime; //true, wenn es eine Änderung in der Datei gibt let fileURL = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getURLSpecFromActualFile(aFile); let uri = Services.io.newURI(fileURL, null, null); if (this.sss.sheetRegistered(uri, this.SHEET)) { // Wenn diese Datei bereits gelesen wurde if (!isEnable || !isExists) { this.sss.unregisterSheet(uri, this.SHEET); } else if (isForced) { // Nach Stornierung erneut einlesen this.sss.unregisterSheet(uri, this.SHEET); this.sss.loadAndRegisterSheet(uri, this.SHEET); } } else { // Datei wurde nicht gelesen if (isEnable && isExists) { this.sss.loadAndRegisterSheet(uri, this.SHEET); } } if (this.lastModifiedTime !== 1 && isEnable && isForced) { log(this.leafName + " wurde aktualisiert"); } this.lastModifiedTime = lastModifiedTime; return this._enabled = isEnable; }, }; UCL.init(); function $(id) { return document.getElementById(id); } function $A(arr) { return Array.slice(arr); } function $C(name, attr) { const el = document.createElementNS(XULNS, name); if (attr) Object.keys(attr).forEach(function(n) { el.setAttribute(n, attr[n]) }); return el; } function dateFormat(date, format) { format = format.replace("%Y", ("000" + date.getFullYear()).substr(-4)); format = format.replace("%m", ("0" + (date.getMonth()+1)).substr(-2)); format = format.replace("%d", ("0" + date.getDate()).substr(-2)); format = format.replace("%H", ("0" + date.getHours()).substr(-2)); format = format.replace("%M", ("0" + date.getMinutes()).substr(-2)); format = format.replace("%S", ("0" + date.getSeconds()).substr(-2)); return format; } function log(mes) { console.log(mes); } })();
BrokenHeart , die Bemerkung, dass Deine Änderung obsolet sei, bezieht sich auf diese von Januar dieses Jahres, wo Du die benötigten Eventlistener über eine Funktion eingebaut hast. Das ist in der aktuellen Version nicht mehr notwendig.
In Zeile 376 steht let sep = $("usercssloader-ucsepalator");
Ist das korrekt oder muss es ucseparator heißen?
Ja, das ist ein Tippfehler, der mir ebenso auffiel und den ich auch geändert habe. Es betrifft hier aber eine ID und die könnte irgendeinen auch völlig kryptischen Namen erhalten, solange sie eindeutig ist, was hier der Fall ist (diese ID mit Tippfehler wird bereits weiter vorn erzeugt/zugeordnet, in Z. 179).
-
Speravir Wow, toll das Du dich dem Skript angenommen hast.
Denn ich beschäftige mich auch schon länger damit und steige da nicht wirklich durch,
bzw. weiß einfach nicht wie ich die enthaltenen Fehler korrigieren kann und soll.Aber auch in Deiner überarbieteten Version sind leider noch einige dieser Bugs und auch "Codeleichen" enthalten!
So werden die Variablen "Cu" und "Cr" niemals aufgerufen, sind aber definiert.
Und auch mit const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; komme ich nicht so wirklich zurecht,
XUL mag eventuell noch gehen, wird aber so nach und nach ersetzt.
XML User Interface Language – WikipediaWas ich auch nicht in den Griff bekommen habe, bzw, wo ich nicht weiter weiß, es sollte eigentlich ein neues Menü "CSS"
in der Menüleiste erzeugt werden. Tut es aber nicht!!
Hängt wahrscheinlich mit der der veralteten Schnittstelle zusammen (XUL).Aus dem Menü hast Du ja zwei "Eintrage" rausgeschmissen, gut, denn ich wusste nicht, ob ich das machen sollte oder nicht.
function CSSEntry(aFile) {
" "CSSEntry" ist deklariert, aber der zugehörige Wert wird nie gelesen."
Aus :
JavaScriptfunction 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; }
habe ich
JavaScript
Alles anzeigenclass CSSEntry { constructor(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; } }
gemacht, weil VS-Code gemault hat!
Ob das richtig ist, ganz ehrlich, ich weiß es nicht!CSSTester hast Du ja ganz rausgeschmissen, da maulte VS-Code nämlich auch.
Und dann wäre da noch die Zahl 0664.
Wird im VS-Code als Fehler markiert!Oktale Literale sind nicht zulässig. Verwenden Sie die Syntax "0o664".
Wenn ich könnte, würde ich ja das Skript, bzw. dessen Funktion CSS ein und auszuschalten,
komplett neu machen und/oder den dafür nötigen Code isolieren und in ein anderes, meiner Meinung nach,
besseres Skript überführen!
Bei dem ich auch zurechtkomme, z.B. dem Appmenü-Skript oder eben irgendein anderes Skript,
welches eh schon ein Menü generiert.
Und was mich an diesem Skript auch stört, dass man auf die Funktionen nur per CSS irgendwie zugänglich machen kann.
Das ist m.M. eine Krücke. -
Hallo Speravir.
Dieser Tippfehler ist schon in der ersten Version dieses Scripts,
also vor 14 Jahren enthalten. Hatte sogar Aborix diesbezüglich
mal gefragt ob man das ändern müsste er sagte da spezifiziert nicht nötig.
Deine Version oben ist prima. Funktioniert soweit alles.
Eine Frage dazu noch, in unserem Original konnte man auch mit
Mittelklick auf die Schaltfläche die Stile importieren. Das geht weder
bei der von mir noch bei Deiner Version. Ließe sich das eventuell
noch einbauen. Das hatte Aborix seinerzeit auch eingefügt.Mfg.
Endor -
So werden die Variablen "Cu" und "Cr" niemals aufgerufen, sind aber definiert.
Das ist richtig. Man kann sogar die komplette Zeile weglassen, weil Cc, was im Script genutzt wird, standardmäßig von Firefox exportiert wird.
Und auch mit const XULNS = "http://www.mozilla.org/keymaster/gate…ere.is.only.xul"; komme ich nicht so wirklich zurecht,
XUL mag eventuell noch gehen, wird aber so nach und nach ersetzt.
XML User Interface Language – WikipediaNicht für alls gibt es eine Entsprechung in HTML. Wenn XUL-Elemente erzeugt werden sollen - und das Script erzeugt eindeutig XUL-Elemente, menupopup und menuseparator gibt es in HTML nicht -, muss auch der entsprechende Namespace genutzt werden. Man könnte statt document.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul') einfach document.createXULElement() verwenden, aber das ist genau das Gleiche. Da steckt das XUL halt schon im Namen der Methode.
Was ich auch nicht in den Griff bekommen habe, bzw, wo ich nicht weiter weiß, es sollte eigentlich ein neues Menü "CSS"
in der Menüleiste erzeugt werden. Tut es aber nicht!!
Hängt wahrscheinlich mit der der veralteten Schnittstelle zusammen (XUL).Gegenfrage: Wie möchtest du das ohne diese „veraltete Schnittstelle“ machen?
" "CSSEntry" ist deklariert, aber der zugehörige Wert wird nie gelesen."
Im Script von Speravir? Doch, da wird CSSEntry verwendet.
gemacht, weil VS-Code gemault hat!
Ob das richtig ist, ganz ehrlich, ich weiß es nicht!Du hast halt eine Klasse daraus gemacht. Das war weder notwendig noch schadet es.
Und dann wäre da noch die Zahl 0664.
Wird im VS-Code als Fehler markiert!Oktale Literale sind nicht zulässig. Verwenden Sie die Syntax "0o664".
Stimmt. Mit 0o als Präfix wäre auch die Syntax, die im Firefox im eigenen JavaScript-Code verwendet, nur mit 0 gibt es nur im C++-Code von Firefox. Die Rechte werden dementsprechend nicht so vergeben, wie es im Script vorgesehen ist. Das habe ich auch geprüft: Die Rechte sind nach dem Anlegen des Ordners nicht 664, sondern 644. Ob das in der Praxis für diesen konkreten Anwendungsfall überhaupt notwendig ist, die Rechte auf 664 zu setzen, weiß ich nicht. In jedem Fall ist der Aufruf falsch.
-
Sören Hentzschel Danke für Deine Erläuterungen.
Hilft mir leider nur wenig, weil ich einfach zu wenig JS kann.Aber es könnte anderen helfen, die etwas besser in JS sind.
Meine Idee ist aber immer noch, den Code für die Funktion (CSSLoad) zu exportieren,
und in einem anderen, einfacher aufgebautem Skript zu nutzen.Gegenfrage: Wie möchtest du das ohne diese „veraltete Schnittstelle“ machen?
Ich habe keine Ahnung, und diese Erklärung war ja von meiner Seite auch nur ein Schuss ins Blaue.
Deiner Aussage entnehme ich, dass dieser Fehler dann wohl andere Gründe hat. -