Im Skript keine Änderung gemacht, nur den Wert in die config eingetragen und auf true.
Wenn ich das tue, öffnet sich mein Download-Fenster nicht mehr. Ich habe mich beruhigt.
Im Skript keine Änderung gemacht, nur den Wert in die config eingetragen und auf true.
Wenn ich das tue, öffnet sich mein Download-Fenster nicht mehr. Ich habe mich beruhigt.
Natürlich gibt es diese Standardeinstellungen in about:config nicht, man muss sie erstellen. Ich habe alle Optionen ausprobiert und ein negatives Ergebnis erhalten.
Vielleicht wäre es besser, das Ladefenster nicht automatisch zu schließen, sondern es zu schließen, wenn man daran vorbeiklickt. Aber anscheinend ist dies unmöglich zu implementieren, da es sich um ein eigenständiges Fenster und nicht um ein Popup handelt.
Das Download-Fenster wird nicht automatisch geschlossen. Jede Änderung an about:config oder an den angegebenen Zeilen im Skript führt dazu, dass das Download-Fenster nicht mehr automatisch geöffnet wird.
Du hast gelesen, was ich bezüglich DLL-Injections geschrieben hatte? Wenn schon eine portable Version, wieso nutzt man dann, obwohl man darüber aufgeklärt wurde, immer noch die schlechteste aller Möglichkeiten, obwohl es Alternativen gibt?
Ich bin nicht verwirrt durch das Wort "Injektion", wenn in diesem Fall die Injektion dieser Bibliothek eine Bedrohung wäre, würden alle Google und DuckDuckGo darüber schreiben. portable64.dll hat null Reaktion auf virustotal
Die Injektion wird zum Beispiel von jeder Software verwendet, die das Aussehen der Windows 10-11-Taskleiste ändert (SrartIsBack++, StarDock Start10, 7+TT vom deutschen Autor).
Vorteile: nativer Start von firefox.exe oder private_browsing.exe, nicht launcher.exe; daher keine Chance, eine entpackte Version anstelle einer portablen Version zu starten.
Haben Sie eine portable.ini-Datei mit einem bestimmten Inhalt erstellt und den Eintrag portable64.dll als erste Zeile zu dependentlibs.list hinzugefügt?
Ich verwende diese Portabilitätsmethode schon seit sehr langer Zeit ohne Probleme, seit FF v68.
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.