aber nicht generell für alle Tabs.
Wenn ich diesen Mechanismus verwende, habe ich nicht bemerkt, dass er jemals versagt, er funktioniert immer "generell für alle Tabs".
aber nicht generell für alle Tabs.
Wenn ich diesen Mechanismus verwende, habe ich nicht bemerkt, dass er jemals versagt, er funktioniert immer "generell für alle Tabs".
sondern dass nach dem Schließen eines Tabs der zuvor aktive Tab aktiviert wird und nicht der Tab, der sich direkt neben dem geschlossenen Tab befindet.
Oder wird die Tab, von der aus die zu schließende Tab geöffnet wurde, aktiv?
browser.tabs.selectOwnerOnClose = true
Eine andere Möglichkeit, Firefox Portable zu erstellen, verwendet libportable. Aus dem portable_bin.7z-Archiv benötigen Sie nur eine Datei portable64.dll oder portable32.dll für Firefox 64-bit bzw. 32-bit. Außerdem müssen Sie kleinere Änderungen in zwei Textdateien vornehmen. Keine Probleme im Betrieb.
Links den Code eintragen, dann rechts auf das V für Vorschau klicken.
Zeilen 14-16
Ich nehme Änderungen an userContent.css vor, speichere, klicke auf die Schaltfläche "Vorschau" und die Änderungen werden nicht übernommen. Oder gibt es hier eine andere Logik?
An der Schrift habe ich, soweit ich weiß, nichts geändert.
Möglicherweise haben Sie den Zeilenabstand im Kontextmenü in userChrome.css geändert, und der von Ihnen verwendete Code enthält den Code zum Ändern des Zeilenabstands im Menü "hamburger". Der falsche Code für "hamburger" erzeugt also nur Zeilen, die sich überlappen, wie bei Ihnen. Der korrekte Code unterbricht die Zeilendarstellung der Schaltfläche "Unified Extensions" nicht:
Aber gerade in Bezug auf Firefox ist es bestenfalls nutzlos und im schlechtesten Fall schädlich und muss bei Datenverlust-Themen immer als potenzielle Ursache mit berücksichtigt werden.
CCleaner ist nicht an Firefox gebunden, sie sind gleichgültig gegenüber einander. Nicht ein einziges Byte ist in 5 Jahren der Nutzung verloren gegangen. CCleaner ist anders, Sie müssen Portable und ohne Telemetrie verwenden, Sie müssen nicht neue Versionen mit Müll gefüllt verwenden.
Button die Dateigröße ist dreimal kleiner.
Das tuts:
Wunderbar, jetzt weiß ich, wie ich hier ein lokales icon schreiben kann.
addonStartup.json.lz4, compatibility,
Diese beiden Dateien können problemlos gelöscht werden, beim Neustart werden sie ohne Schaden neu erstellt.
ExperimentStoreData.json webappsstore.sqlite-wal datum der letzten Änderung vor 10 Tagen.
Ich würde damit beginnen, die Erweiterungen eine nach der anderen oder alle zu deaktivieren. Übrigens benutze ich auch CCleaner, und es gibt keine negativen Auswirkungen.
Und woher stammt das Skript, eventuell gibt es da noch ein paar Informationen dazu,
also zum Skript?
Original source ist unbekannt, ich habe das Skript von einem anderen Studenten erhalten.
Änderungen in der userContent.css per Rechtsklick hier zumindest nicht.
Die rechte Schaltfläche prüfe ich auf CSS für Firefox View Next, es funktioniert, userContent.css wird neu geladen. Es ist durchaus möglich, dass etwas im Skript korrigiert werden muss, aber ich weiß es nicht.
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
Heißt das, ich ändere Code z.B. in der userChrome.css brauche ich nur auf dem Button mit der linken Maustaste klicken,
und die Änderungen werden ohne Neustart übernommen?
Und ändere ich etwas an der userContent.css, dasselbe Prozedere mit rechts?
Ja, das ist richtig, Änderungen an userChrome.css, den darin importierten .css-Dateien, userContent.css. Ohne Firefox neu zu starten. Es funktioniert wirklich.
Kannst noch kurz erklären, was der Sinn und Zweck dieses Skriptes ist?
Bitte,
Die Schaltfläche wird verwendet, um Änderungen an den Stilen userChrome.css (Links-klick) und userContent.css (Rechts-klick) zu aktivieren, ohne den Browser neu zu starten. Das Skript liest die Funktionalität aus der .txt-Datei in Zeile 8, die den Code für Custom Buttons.
Es gibt einen Fehler in Firefox v120.0beta6, der Kontextmenüpunkt [Copy Link Without Site Tracking] ist auf allen Links vorhanden, nicht nur auf Links mit Tracking. In der Adressleiste ist es dasselbe.
Ich habe es selbst herausgefunden, fügen Sie nach Zeile 17 diesen Code ein
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==");
Hallo
Diese Skript erstellt eine leere Schaltfläche namens Reload ohne Icon und ohne Funktionalität. Bitte fügen Sie den Code, um eine lokale oder Ressource-Symbol anzeigen, dann mein Wissen wird genug sein, um ein Symbol meiner Wahl zuweisen.
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.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
Vielen Dank für Ihre Hilfe
Wie ich weiter oben schon geschrieben hatte, ist es notwendig, dass in Zeile 4 die ID des Original-Buttons eingetragen wird. Dann sollte man noch, falls vorhanden, 'Label' und 'Tooltip' auf die gleichen Werte setzen.
Mit Hilfe Ihrer Anweisungen war es einfach, die Skriptschaltfläche extras_config_menu.uc.js beweglich zu machen, die vorher nicht beweglich war. Am Ende des Hauptcodes wurde zusätzlicher Code eingefügt.
Bitte wieder testen:
Superb! Jetzt ist alles bestens. Vielen Dank für Ihre Hilfe und Ihre Zeit.
und jetzt?
Geändert 8px zu 12px. Bitte beachten Sie die Hover, alle anderen Schaltflächen sind hintergrundbeleuchtet wie die auf der rechten Seite und die Schaltfläche unter Diskussion ist drastisch anders. Wenn die Schaltfläche auf der Navigationsleiste platziert ist, wenn schwebte, wird seine Hervorhebung nicht quadratisch wie alle anderen Schaltflächen, sondern rechteckig, wo die Höhe größer ist als die Breite.