Frage: Funktioniert das bei jemandem?
Bei mir passiert nix, wenn ich auf den Button drücke, nachdem ich ein importiertes .css geändert habe.
Frage: Funktioniert das bei jemandem?
Bei mir passiert nix, wenn ich auf den Button drücke, nachdem ich ein importiertes .css geändert habe.
Funktioniert das bei jemandem?
Bei mir nicht, da erscheint auch das Icon nicht
Bei mir bleibt der Button auch leer...
Das Problem liegt in den Zeilen 6 bis 12, in erster Linie in der Zeile 10, denn die Datei services.jsm gibt es nun schon seit einiger Zeit nicht mehr. Wie die Zeilen allerdings umgebaut werden müssen, weiß ich auch nicht.
Das Problem liegt
Dann verstehe ich das nicht
Es funktioniert wirklich.
So sieht ein Rechtsklick aus:
Ach entschuldigt, ich hatte das missverstanden. Ich dachte, der Button funktioniert nicht. Eigentlich sollte das Skript wegen der genannten Zeilen nicht funktionieren.
Ich dachte, der Button funktioniert nicht.
Das Icon wird nicht angezeigt, und eine Funktion vom Button gibt es auch nicht hier.
Du hast auch die Datei reload_userChrome.txt angelegt? Die muss es geben, dann erscheint das Symbol: zwei rote Pfeile, die in Uhrzeigerrichtung zeigen.
Du hast auch die Datei reload_userChrome.txt angelegt?
Ja, jetzt
Das hatte ich übersehen.
Das Icon ist nun da, aber keine Funktion.
Das Icon ist nun da, aber keine Funktion.
Wie schon gesagt, Zeilen 6 bis 12, insbesondere Zeile 10. Aber:
Du hast auch die Datei reload_userChrome.txt angelegt?
Ähhh...
Und wo gehört die hin?
Und was gehört da rein?
Und wo gehört die hin?
chrome Ordner
Einfach eine Textdatei mit dem Namen erstellen, sie hat keinen Inhalt.
Und wo gehört die hin?
Da in Zeile 8 des Skripts kein Pfad angegeben ist, einfach mit in den Ordner chrome, dort wo auch das Skript ist.
Und was gehört da rein?
Das kann lenny2 sagen. Ich habe da jetzt nur das Wort „test“ hineingeschrieben. Das Skript funktioniert sowieso noch nicht.
Das Skript funktioniert sowieso noch nicht.
Oder habe ich/wird das alles nur falsch verstanden
Diese Skript erstellt eine leere Schaltfläche namens Reload ohne Icon und ohne Funktionalität.
Oder habe ich/wird das alles nur falsch verstanden
Da habe ich wohl lenny2 falsch verstanden. Ich dachte, er bemängelt die fehlende Funktionalität. Aber was soll das, ein Symbol, das nichts tut?
Na dann warten wir mal ab, ob er uns das genauer erklären kann.
einfach mit in den Ordner chrome, dort wo auch das Skript ist.
Ahhh... bei mir also chrome/my_js/reload_userChrome.txt
Oder habe ich/wird das alles nur falsch verstanden
war für mich eigentlich eindeutig
Lassen wir uns mal überraschen...
Es wäre auch gut zu wissen, wo er das Skript her hat.
Die Dateien reload_userChrome.uc.js (das ist nur die Grafik Schaltfläche) und reload_userChrome.txt (Funktionalität) müssen sich im selben Ordner befinden, die Dateinamen können unterschiedlich sein, aber der Name der txt-Datei muss im Skriptcode angegeben werden. reload_userChrome.txt ist der alte Code für die Erweiterung Custom Buttons. Die Linksklick- und Rechtsklick-Funktionen funktionieren, die Rechtsklick-Funktion kann in reload_userChrome.txt deaktiviert werden.
Sicherlich können fortgeschrittene Experten dies verbessern.
// reload_userChrome.uc.js
// Applying changes to userChrome.css and userContent.css styles without restarting Firefox
// The file reload_userChrome.txt should be in the same folder with the script
window.__SSi == "window0" && CustomizableUI.createWidget({
id: "Reload_userChrome",
label: "Reload userChrome",
localized: false,
onCreated(btn) {
var u = Services.io.newURI;
var code = Cu.readUTF8URI(u(
u(Components.stack.filename).resolve("reload_userChrome.txt")
)).replace(
'Components.utils.import("resource://gre/modules/Services.jsm", {})',
"Cu.getGlobalForObject(Cu)"
);
var del = function() {
this.previousSibling.remove();
this.remove();
};
(this.onCreated = btn => {
btn.setAttribute("image", "data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABPElEQVQ4ja3TsU6UQRQF4G8D7jaS2EqhwMaYSGHnI1BQ+ATaUtqR0BJIDGjhMxhKKgLxEQStDFYmGpTKqC8grMdiZ80w4d/KSW5xM/ece2fuOTQnDMOL8D78DL/CSdgJd0vN7XAeDmrgbHgZRiEdcRk2w2rJ//QmYBxhpfB9wR4+4AaW8RQL1f1S3f151WU7Y1D7tEHYbacSlqqxt1tgAd8PayVOW4KtkpyFfgfBu44/Gc3iUal73eP3dQTYxy3MXOV1IDwIG2GuA/z/T7gZnoWh8Cp8buJTWJ9CMPm3Q1OEc9wBHoRvpWZLAzqt1nWvg2BnsoGw0BKk+GBwDbBfgf9pppfxOrgqz6/GUv6IER7iiWImvMHjHpf1BKvFKBdTzDQqU8zUox0Va86X/E7xxtvwI3wvStwNi+3T/gL+gPNd4cyuEQAAAABJRU5ErkJggg==");
btn.defaultContextId = "toolbar-context-menu";
var win = btn.ownerGlobal;
var wdp = new win.DOMParser();
var parser = class {
parseFromString(...args) {
var doc = wdp.parseFromSafeString(...args);
doc.documentElement.lastChild.appendChild = del;
return doc;
}
}
win.setTimeout(() => new win.Function("DOMParser", code).call(btn, parser), 50);
})(btn);
}
});
Alles anzeigen
// reload_userChrome.txt
// Applying changes to userChrome.css and userContent.css styles without restarting Firefox
// Place in the same folder as the reload_userChrome.uc.js script
// To deactivate the reload function of userContent.css, comment out lines 82-88, edit tooltiptext line 11
var c = msg => Services.console.logStringMessage(String(msg)), i = obj => inspectObject(obj), n = node => inspectDOMNode(node);
(obj => {
this.onclick = obj.click.bind(obj);
this.oncontextmenu = obj.contextmenu.bind(obj);
this.tooltipText = "L: Reload userChrome.css\nR: Reload userContent.css";
})({
async click(e) {
if (e.button == 1) return gShowPopup(self);
if (e.button || !this.chromeSheet) return;
await this.reload(this.chromeSheet);
this.restyle(0);
},
re: /^(?:web.*|file|extension|privilegedabout)$/,
get url() {
delete this.url;
return this.url = `chrome://extensions/content/dummy.x${
parseInt(Services.appinfo.platformVersion) >= 74 ? "htm" : "u"
}l`;
},
async contextmenu(e) {
if (e.ctrlKey || e.shiftKey || e.detail != 1 || !this.contentSheetURL) return;
e.preventDefault();
var count = Services.ppmm.childCount, one = count == 1;
var data = await this.reloadTab(this.url, one ? false : {});
if (one) this.reloadTab();
else if (data) {
var url = "data:," + encodeURIComponent(
self.Help + this.contentSheetURL + '", ' + JSON.stringify(data) + ");"
);
for(var ind = 0; ind < count; ind++) {
var child = Services.ppmm.getChildAt(ind);
var rt = child.remoteType;
rt && this.re.test(rt) && child.loadProcessScript(url, false);
}
}
this.restyle(250);
},
async reload(sheet, obj) {
try {var style = await (await fetch(sheet.href)).text();}
catch (ex) {return obj;}
InspectorUtils.parseStyleSheet(sheet, style);
if (obj) obj[sheet.href] = style;
for(var ind = 0, len = sheet.cssRules.length; ind < len; ind++) {
var rule = sheet.cssRules.item(ind);
rule.type == rule.IMPORT_RULE
&& rule.styleSheet.href.startsWith("file:///")
&& await this.reload(rule.styleSheet, obj);
}
return obj;
},
reloadTab(url, obj) {
var tab = gBrowser.addTab(url, {skipAnimation: true, triggeringPrincipal: document.nodePrincipal});
tab.style.setProperty("display", "none", "important");
return new Promise(resolve => {
var result, stop, destroy = () => {
if (!stop) resolve(result), gBrowser.removeTab(tab), stop = true;
}
setTimeout(destroy, 500);
try {
tab.linkedBrowser.addEventListener("DOMContentLoaded", async e => {
var sheet = this.getSheet(e.target, this.contentSheetURL);
if (sheet) result = await this.reload(sheet, obj);
destroy();
}, {once: true});
} catch(ex) {
destroy();
}
});
},
getSheet(doc, href) {
var sheets = InspectorUtils.getAllStyleSheets(doc);
return sheets.find(sheet => sheet.href == href);
},
get contentSheetURL() {
var file = Services.dirsvc.get("UChrm", Ci.nsIFile);
file.append("userContent.css");
if (!file.exists()) return null;
delete this.contentSheetURL;
return this.contentSheetURL = Services.io.newFileURI(file).spec;
},
get restyle() {
var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
var uri = Services.io.newURI("data:text/css,:root{}"), type = sss.USER_SHEET;
delete this.restyle; return this.restyle = delay => setTimeout(() => {
sss.loadAndRegisterSheet(uri, type);
sss.unregisterSheet(uri, type);
}, delay);
},
get chromeSheet() {
var file = Services.dirsvc.get("UChrm", Ci.nsIFile);
file.append("userChrome.css");
if (!file.exists()) return null;
var href = Services.io.newFileURI(file).spec;
var sheet = this.getSheet(document, href);
if (!sheet) return null;
delete this.chromeSheet; return this.chromeSheet = sheet;
}
});
Alles anzeigen
Möglicherweise stimmen die Zeilennummern nach der Veröffentlichung des Codes nicht mit denen in den lokalen Dateien in Notepad++ überein
Wow, es funktioniert
Jetzt habe ich ein neues "Spielzeug" zum Basteln.
Mir gefällt das mit dem Pfad zur reload_userChrome.txt nicht.
Und woher stammt das Skript, eventuell gibt es da noch ein paar Informationen dazu,
also zum Skript?