Hallo Mira_Belle !
Also im Menü oben siehst auch den Eintrag zum öffnen des CSS Ordners.
Darunter sollte auch der Eintrag zum öffnen des Chrome Ordners hin.
Hallo Mira_Belle !
Also im Menü oben siehst auch den Eintrag zum öffnen des CSS Ordners.
Darunter sollte auch der Eintrag zum öffnen des Chrome Ordners hin.
Hallo zusammen. Speravir , BrokenHeart , Mira_Belle, milupo , 2002Andreas
Habe eine funktionierende Version vom usercssloader.uc.js auf Basis einer
Version aus den asiatischen Tiefen gemacht.
Hat wie gehabt frei verschiebbare Schaltfläche usw. Funktioniert auch
in Firefox 143 unabhängig ob CSP aktiviert ist oder nicht.
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.
Ich habe es versucht einzubauen, durch einfügen der entsprechenden Teile
aus unserem Script, aber dann funktioniert es nicht mehr.
Vielleicht kann jemand von euch sich das mal anschauen:
// ==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 ****/
(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); }
})();
Alles anzeigen
Hoffe jemand von euch kann da weiter helfen.
CSS Code für Schaltfläche:
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
@-moz-document url(chrome://browser/content/browser.xhtml){
#usercssloader-menu {
appearance:none!important;
margin-right: 0px !important;
margin-left: 1px !important;
min-width: 18px !important;
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAADJklEQVR4Xi3Pb0yVdRjG8e%2Fze57ncDrAOWwRhDQ7xYAMlAgIBW2txaio5TvMzZa68oWtzRdKbXbIpWyOzcWLWqXkFjUtsIksW72wuTVx%2BEJHCxhkSCNoKLYDwuH8e66eNV98dr24t%2Fu%2BLwsAoKsucqg4tFS4kiTtge4PFAkRksADGdsyua4JXJ7ITH0yQw%2BABTB3sHGipGNjJX8MgzGw6oEBQi5kPYinQBYEbDDAX5PEulJXPhqn2bQE2Fayfa2S8THOfu%2FwzTkDzmOQV8nAkOHMoIFgmS9K3w%2Fi5DmP1fwqdrbRFIR6euqJ6btc2Y4jsGWM0emOWrU2FAtQRTSiid7n9EJtkQCVlebrUle9lnuLVA3v09%2FG8diLCFxp%2BDVprF2a2KHqsrACtqVbQy9L8T2qq4goaKOpz5uka22Kn1yn2gBHOPMSx9o3obJokbS8R%2Fp3txTfK918Q%2B2tjwrQYPcWaW6Xdj5fKkB9B2uks%2Bv1VICYSWXQjia4eWuB8z2%2F0%2F%2FpGMMD04yP3qFzfzXBoE3sszGmR27Tubuc3KDDsf4ZsME2iO4GjuqXQh1orxDwv1OxBsX2VQlQcWGObnzdog%2F3bhCg0uIHNPLFVqnf%2F8DlA2ctDSTgxNFnOHFgE7jAg7kQcjnS8TRgQcCiprGQzncrIZ0i%2Fu0so7lLODlgsh6QSMNCAix8BhJJNH6b5NwyFNhwLwWuB%2FNxEoemudi9wMT8Cq4LBrDwgLUULK%2FBPR9%2BjC4ytPUC17%2F8DR6CpYEplt%2BeJTX7OH9HbEL5NvKwjGvj4AHprC8DSZ%2B%2FzHJgI%2BuI%2BxdvbL9E%2BJRLJr%2BSr5LXKd8foqY8QjqN7fxzlzhaAy8LGYHnQTxJ3hNhFlptCi4XsP7PEoaD4mr4KlveeZjNG4qYvDbKyipJolCXOI70U630Y6uvRfrZzyuvSKOvavK9Kp2OFqv3zagWLzb7s21aubBZ519HFjzrg8NP8utbu2hWMIyyHpYBYwyOa2Hn2cwuJAiHAthp%2Be087s4n6e5LjwzeodECAKiAffk5PJLOkJKFACzLZ8B27jfMYgUM7mKSuzPwMcB%2F6Jh%2FV5xUni0AAAAASUVORK5CYII%3D") no-repeat !important;
background-position:1px 6px!important;
}
#usercssloader-menu:hover {
appearance:none !important;
margin-left: 1px !important;
margin-right: 0px !important;
background: #E3E3E3 url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAADJklEQVR4Xi3Pb0yVdRjG8e%2Fze57ncDrAOWwRhDQ7xYAMlAgIBW2txaio5TvMzZa68oWtzRdKbXbIpWyOzcWLWqXkFjUtsIksW72wuTVx%2BEJHCxhkSCNoKLYDwuH8e66eNV98dr24t%2Fu%2BLwsAoKsucqg4tFS4kiTtge4PFAkRksADGdsyua4JXJ7ITH0yQw%2BABTB3sHGipGNjJX8MgzGw6oEBQi5kPYinQBYEbDDAX5PEulJXPhqn2bQE2Fayfa2S8THOfu%2FwzTkDzmOQV8nAkOHMoIFgmS9K3w%2Fi5DmP1fwqdrbRFIR6euqJ6btc2Y4jsGWM0emOWrU2FAtQRTSiid7n9EJtkQCVlebrUle9lnuLVA3v09%2FG8diLCFxp%2BDVprF2a2KHqsrACtqVbQy9L8T2qq4goaKOpz5uka22Kn1yn2gBHOPMSx9o3obJokbS8R%2Fp3txTfK918Q%2B2tjwrQYPcWaW6Xdj5fKkB9B2uks%2Bv1VICYSWXQjia4eWuB8z2%2F0%2F%2FpGMMD04yP3qFzfzXBoE3sszGmR27Tubuc3KDDsf4ZsME2iO4GjuqXQh1orxDwv1OxBsX2VQlQcWGObnzdog%2F3bhCg0uIHNPLFVqnf%2F8DlA2ctDSTgxNFnOHFgE7jAg7kQcjnS8TRgQcCiprGQzncrIZ0i%2Fu0so7lLODlgsh6QSMNCAix8BhJJNH6b5NwyFNhwLwWuB%2FNxEoemudi9wMT8Cq4LBrDwgLUULK%2FBPR9%2BjC4ytPUC17%2F8DR6CpYEplt%2BeJTX7OH9HbEL5NvKwjGvj4AHprC8DSZ%2B%2FzHJgI%2BuI%2BxdvbL9E%2BJRLJr%2BSr5LXKd8foqY8QjqN7fxzlzhaAy8LGYHnQTxJ3hNhFlptCi4XsP7PEoaD4mr4KlveeZjNG4qYvDbKyipJolCXOI70U630Y6uvRfrZzyuvSKOvavK9Kp2OFqv3zagWLzb7s21aubBZ519HFjzrg8NP8utbu2hWMIyyHpYBYwyOa2Hn2cwuJAiHAthp%2Be087s4n6e5LjwzeodECAKiAffk5PJLOkJKFACzLZ8B27jfMYgUM7mKSuzPwMcB%2F6Jh%2FV5xUni0AAAAASUVORK5CYII%3D") no-repeat !important;
background-position:1px 6px!important;
}
#usercssloader-menu > .menu-text,
#usercssloader-menu > .menu-right {
display: none !important;
}
}
Alles anzeigen
Hallo milupo.
Auch von mir alles alles Gute zum Geburtstag!!!
Viel Gesundheit, Glück und Wohlergehen wünsche ich Dir
von ganzen Herzen. Bleib gesund und lass dich feiern.
Mfg.
Endor
Siehe meine edits oben.
Mfg.
Endor
Das Skript funktioniert nicht,
Funktioniert es überhaupt nicht oder nur nicht so wie du es möchtest?
Edit: habe es eben selbst getestet, ja leider funktioniert es nicht mehr.
Werde dem Autor mal Bescheid geben.
Edit2:
Erledigt:
Mfg.
Endor
Vielleicht das hier:
Mfg.
Endor
In Zeile 224 gab es 4 listStyleImage die habe ich umgeändert
in --menuitem-icon das war es schon.
Anderes Script wo ich nicht klar komme:
/* Firefox userChrome script
* Shortcut menu to modify about:config entries
* Tested on Firefox 132+
* Author: garywill (https://garywill.github.io)
*
*/
// ==UserScript==
// @include main
// @onlyonce
// ==/UserScript==
console.log("aboutconfig_menu.uc.js");
(() => {
const prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
ChromeUtils.importESModule("resource:///modules/CustomizableUI.sys.mjs")
const sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
// ---------------------------------------------------------------------------------------
const button_label = "about:config Kontextmenü";
const cssuri_icon = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
toolbarbutton#aboutconfig-button .toolbarbutton-icon {
list-style-image: url("data:image/svg+xml;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAgIC0gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogICAtIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiB2aWV3Qm94PSIwIDAgMTYgMTYiPjxwYXRoIGZpbGw9ImNvbnRleHQtZmlsbCIgZD0iTTEzLjkgOS44MWExLjIzIDEuMjMgMCAwIDAgMC0uMTd2LS4wOGE1LjY3IDUuNjcgMCAwIDAtMi40LTMuMzYgMS4xNyAxLjE3IDAgMCAxLS41Ni0uOTVWM2ExIDEgMCAwIDAtMS0xSDYuMDZhMSAxIDAgMCAwLTEgMXYyLjI1YTEuMTcgMS4xNyAwIDAgMS0uNTYgMSA1LjY2IDUuNjYgMCAwIDAtMi4zNSAzLjMzdi4xMmEuNTMuNTMgMCAwIDAgMCAuMTEgNS4zNSA1LjM1IDAgMCAwLS4xMSAxIDUuNjUgNS42NSAwIDAgMCAzLjI0IDUuMDkgMSAxIDAgMCAwIC40NC4xaDQuNTdhMSAxIDAgMCAwIC40NC0uMUE1LjY1IDUuNjUgMCAwIDAgMTQgMTAuODNhNS4zIDUuMyAwIDAgMC0uMS0xLjAyem0tOC4yNy0yYTMuMTggMy4xOCAwIDAgMCAxLjQzLTIuNlY0aDEuODh2MS4yNWEzLjE4IDMuMTggMCAwIDAgMS40MyAyLjYgMy42OCAzLjY4IDAgMCAxIDEuNTQgMi4yNHYuMjJhMi44MiAyLjgyIDAgMCAxLTMuNjgtLjU5QTMuNDggMy40OCAwIDAgMCA0LjU2IDlhMy43NiAzLjc2IDAgMCAxIDEuMDctMS4xNXoiPjwvcGF0aD48L3N2Zz4=");
}
toolbarbutton#aboutconfig-button .toolbarbutton-badge {
background-color: #009f00;
visibility: hidden;
}
`), null, null);
const cssuri_warnbadge = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
toolbarbutton#aboutconfig-button .toolbarbutton-badge {
background-color: red ;
visibility: unset;
}
`), null, null);
sss.loadAndRegisterSheet(cssuri_icon, sss.USER_SHEET);
var prefItems = [
{
name: "📼 Kein automatisches Popup beim Download",
type: prefs.PREF_BOOL,
pref: "browser.download.alwaysOpenPanel",
possibleVals: [
{ val: false },
{ val: true },
]
},
{
name: "🎞️ Beim Schließen vom letzten Tab den Browser nicht schließen",
type: prefs.PREF_BOOL,
pref: "browser.tabs.closeWindowWithLastTab",
possibleVals: [
{ val: false },
{ val: true },
]
},
"seperator",
{
name: "🔎 Suche aus Suchleiste im neuen Tab öffnen",
type: prefs.PREF_BOOL,
pref: "browser.search.openintab",
possibleVals: [
{ val: false },
{ val: true },
]
},
{
name: "📖 Lesezeichen im neuen Tab öffnen",
type: prefs.PREF_BOOL,
pref: "browser.tabs.loadBookmarksInTabs",
possibleVals: [
{ val: false },
{ val: true },
]
},
{
name: "📖 Link aus Adressleiste im neuen Tab öffnen",
type: prefs.PREF_BOOL,
pref: "browser.urlbar.openintab",
possibleVals: [
{ val: false },
{ val: true },
]
},
"seperator",
{
name: "🎊 Animations Modus",
type: prefs.PREF_STRING,
pref: "image.animation_mode",
possibleVals: [
{ name: "Einmal", val: "once" },
{ name: "Keine", val: "none" },
{ name: "Dauerhaft", val: "normal" },
]
},
"seperator",
{
name: "🔏 CSP aktivieren - deaktivieren",
type: prefs.PREF_BOOL,
pref: "security.browser_xhtml_csp.enabled",
possibleVals: [
{ val: false },
{ val: true },
]
},
{
name: "🔏 Urlbar Verhalten - deaktivieren",
type: prefs.PREF_BOOL,
pref: "browser.urlbar.scotchBonnet.enableOverride",
possibleVals: [
{ val: false },
{ val: true },
]
},
{
name: "🔏 eval erlauben - verbieten",
type: prefs.PREF_BOOL,
pref: "security.allow_unsafe_dangerous_privileged_evil_eval",
possibleVals: [
{ val: false },
{ name: "true ⚠️", val: true , sign: '‼️' },
]
},
{
name: "🌐 IPv6 ausschalten",
type: prefs.PREF_BOOL,
pref: "network.dns.disableIPv6",
possibleVals: [
{ val: false },
{ val: true },
]
},
{
name: "🔐 DNS Modus",
type: prefs.PREF_INT,
pref: "network.trr.mode",
possibleVals: [
{ name: "0 - Default" , val: 0 },
{ name: "2 - DoH, fallback Plain DNS" , val: 2 },
{ name: "3 - DoH only" , val: 3 },
{ name: "5 - Plain DNS" , val: 5 }
]
},
{
name: "🔐 DoH server",
type: prefs.PREF_STRING,
pref: "network.trr.uri",
possibleVals: [
{ name: "Cloudflare" , val: "https://mozilla.cloudflare-dns.com/dns-query" },
{ name: "NextDNS" , val: "https://firefox.dns.nextdns.io/" }
] // See buildin DoH at 'network.trr.resolvers'
},
{
name: "🔏 Veraltete TLS Version aktivieren",
type: prefs.PREF_BOOL,
pref: "security.tls.version.enable-deprecated",
possibleVals: [
{ val: false },
{ name: "true ⚠️", val: true , sign: '‼️'},
]
},
"seperator",
{
name: "🖱️ Mausrad-Y-Multiplikator",
type: prefs.PREF_INT,
pref: "mousewheel.default.delta_multiplier_y",
possibleVals: [
{ val: 150 },
]
},
{
name: "🖱️ Vertikaler Faktor des Systembildlaufes",
type: prefs.PREF_INT,
pref: "mousewheel.system_scroll_override.vertical.factor",
possibleVals: [
{ val: 250 },
]
},
"seperator",
{
name: "▶️ Autoplay Medien Standard",
type: prefs.PREF_INT,
pref: "media.autoplay.default",
possibleVals: [
{ val: 0, name: "0 - allow" },
{ val: 1, name: "1 - blockAudible 👍" },
{ val: 5, name: "5 - blockAll" },
]
},
{
name: "📺 Videos gesperrt - Videos frei",
type: prefs.PREF_BOOL,
pref: "media.mediasource.enabled",
possibleVals: [
{ val: false },
{ val: true },
]
},
{
name: "▶️ Media Autoplay ext bg",
type: prefs.PREF_BOOL,
pref: "media.autoplay.allow-extension-background-pages",
possibleVals: [
{ val: false },
{ val: true },
]
},
{
name: "▶️ Richtlinien zur Sperrung von Autoplay-Medien",
type: prefs.PREF_INT,
pref: "media.autoplay.blocking_policy",
possibleVals: [
{ val: 0, name: "0 - no block" },
{ val: 1, name: "1 - block 👍" },
{ val: 2, name: "2 - block more" },
// 0=sticky (default), 1=transient, 2=user
]
},
{
name: "▶️ InternetAudio",
type: prefs.PREF_BOOL,
pref: "dom.webaudio.enabled",
possibleVals: [
{ val: false },
{ val: true , sign: '‼️' , warnbadge: true},
]
},
"seperator",
{
name: "🔤 Benutzerdefinierte Web-Schriften zulassen",
type: prefs.PREF_INT,
pref: "browser.display.use_document_fonts",
possibleVals: [
{ name: "1 - Allow", val: 1 },
{ name: "0 - Disallow", val: 0 },
]
},
{
name: "💻 Keine Popup Anmeldung für Browser-Werkzeuge",
type: prefs.PREF_BOOL,
pref: "devtools.debugger.prompt-connection",
possibleVals: [
{ val: true },
{ name: "false ⚠️", val: false , sign: '‼️' },
]
},
{
name: "🔏 Tooltips aktivieren - deaktivieren",
type: prefs.PREF_BOOL,
pref: "browser.chrome.toolbar_tips",
possibleVals: [
{ val: false },
{ val: true },
]
},
"seperator",
{
name: "💻 Popups nicht automatisch schließen",
type: prefs.PREF_BOOL,
pref: "ui.popup.disable_autohide",
possibleVals: [
{ val: false },
{ val: true },
]
},
];
if (!window.gBrowser){
return;
}
CustomizableUI.createWidget({
id: 'aboutconfig-button', // button id
type: "custom",
defaultArea: CustomizableUI.AREA_NAVBAR,
removable: true,
onBuild: function (doc) {
let btn = doc.createXULElement('toolbarbutton');
btn.id = 'aboutconfig-button';
btn.label = button_label;
btn.tooltipText = button_label;
btn.type = 'menu';
btn.className = 'toolbarbutton-1 chromeclass-toolbar-additional';
btn.setAttribute("badged", "true");
btn.setAttribute("badge", "!");
let mp = doc.createXULElement("menupopup");
mp.id = 'aboutconfig-popup';
mp.onclick = function(event) { event.preventDefault() ;} ;
prefItems.forEach( function (item, items_i) { // loop every user defined pref
if (item === "seperator")
{
mp.appendChild(doc.createXULElement('menuseparator'));
return;
}
//var current_val = getItemCurrentVal(item) ;
var menu = doc.createXULElement("menu");
menu.label = item.name ? item.name : item.pref ;
menu.id = "aboutconfig_menu_" + items_i ;
menu.className = 'menuitem-iconic' ;
var menupopup = doc.createXULElement("menupopup");
menupopup.id = "aboutconfig_menupopup_" + items_i ;
menupopup.className = 'menuitem-iconic' ;
item.possibleVals.forEach( function (pv, i) { // loop every possible value
var display_val = prefPossibleValToDisplay(item, pv.val) ;
// Submenu item. One is one possible value
var menuitem = doc.createXULElement("menuitem");
menuitem.label = pv.name ? pv.name : display_val ;
menuitem.id = "aboutconfig_menu_" + items_i + "__" + i ;
menuitem.setAttribute('type', 'radio') ;
menuitem.className = 'menuitem-iconic' ;
menuitem.tooltipText = display_val ;
if (pv ['sign'])
menuitem.label += ' ' + pv['sign'];
menuitem.addEventListener('click', function(event) {
//console.log(this.id);
setItemPrefVal(item , pv.val);
} ) ;
menupopup.appendChild(menuitem);
});
var default_val = getItemDefaultVal(item);
var default_val_display = null;
var reset_label = "Zurücksetzen: ";
if (item.signWhenDefaultVal)
reset_label += item.signWhenDefaultVal + ' ' ;
if (default_val !== undefined && default_val !== null)
{
default_val_display = prefPossibleValToDisplay(item, default_val);
reset_label += default_val_display ;
}
else
reset_label += ' (delete in about:config)'
menupopup.appendChild(
doc.createXULElement('menuseparator')
);
// Submenu entry to reset a pref to default
var default_item = doc.createXULElement("menuitem");
default_item.id = "aboutconfig_menu_" + items_i + "__default" ;
default_item.className = 'menuitem-iconic';
default_item.label = reset_label;
default_item.tooltipText = default_val_display;
default_item.addEventListener('click', function(event) {
//console.log(this.id);
//setItemPrefVal(item , getItemDefaultVal(item) );
prefs.clearUserPref(item.pref);
} ) ;
menupopup.appendChild(default_item);
//------------
menu.appendChild(menupopup);
mp.appendChild(menu);
});
btn.appendChild(mp);
mp.addEventListener('popupshowing', function() {
//console.log(this);
evalPopulateMenu(this);
update_badge();
});
btn.onclick = function(event) {
if (event.button == 1) {
const win = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator)
.getMostRecentWindow("navigator:browser");
win.gBrowser.selectedTab = win.gBrowser.addTrustedTab('about:config');
}
update_badge();
};
return btn;
}
});
function getItemDefaultVal (item) {
var default_val = undefined;
try{
if ( item.type == prefs.PREF_BOOL )
default_val = prefs.getDefaultBranch(item.pref).getBoolPref('');
else if ( item.type == prefs.PREF_INT )
default_val = prefs.getDefaultBranch(item.pref).getIntPref('');
else if ( item.type == prefs.PREF_STRING )
default_val = prefs.getDefaultBranch(item.pref).getStringPref('');
}catch(err) { default_val = null }
return default_val;
}
function getItemCurrentVal (item) {
var current_val = null;
try{
if ( item.type == prefs.PREF_BOOL )
current_val = prefs.getBoolPref(item.pref);
else if ( item.type == prefs.PREF_INT )
current_val = prefs.getIntPref(item.pref);
else if ( item.type == prefs.PREF_STRING )
current_val = prefs.getStringPref(item.pref);
}catch(err){ }
return current_val ;
}
function if_pref_current_val_is (item, pv_index) {
var current_val = getItemCurrentVal(item) ;
if (current_val === null)
return false;
if ( current_val === item.possibleVals[pv_index].val )
return true;
else
return false;
}
function setItemPrefVal(item, newVal)
{
if ( item.type == prefs.PREF_BOOL )
prefs.setBoolPref(item.pref, newVal);
else if ( item.type == prefs.PREF_INT )
prefs.setIntPref(item.pref, newVal);
else if ( item.type == prefs.PREF_STRING )
prefs.setStringPref(item.pref, newVal);
update_badge();
}
function prefPossibleValToDisplay(item, possible_val ) {
if (possible_val === null)
return "null";
var display_val = possible_val.toString();
if (item.type == prefs.PREF_STRING)
display_val = `'${display_val}'`;
return display_val;
}
function evalPopulateMenu(popupmenu)
{
prefItems.forEach( function (item, items_i) {
if (item === "seperator")
return;
const menu = popupmenu.querySelector("#aboutconfig_menu_" + items_i);
menu.label = item.name ? item.name : item.pref ;
menu.style.fontWeight = "";
const default_val = getItemDefaultVal(item);
var current_val = getItemCurrentVal(item) ;
var current_val_display = prefPossibleValToDisplay(item, current_val);
menu.tooltipText = `Pref: ${item.pref}\nValue: ${current_val_display}`;
if (current_val !== null)
{
if (item.type == prefs.PREF_BOOL)
menu.label += ' [' + ( current_val?'T':'F' ) + ']';
else if (item.type == prefs.PREF_INT)
menu.label += ' [' + current_val + ']';
else if (item.type == prefs.PREF_STRING) {
var current_val_display_short;
if (current_val.length > 8)
current_val_display_short = current_val.substring(0, 6) + '..';
else
current_val_display_short = current_val;
menu.label += ' [' + current_val_display_short + ']';
}
}
if (current_val !== default_val)
menu.style.fontWeight = "bold";
if (current_val === default_val && item.signWhenDefaultVal)
menu.label += ' ' + item.signWhenDefaultVal;
item.possibleVals.forEach( function (pv, i) {
menuitem = popupmenu.querySelector("#aboutconfig_menu_" + items_i + "__" + i);
if ( if_pref_current_val_is(item, i) )
{
menuitem.setAttribute("checked",true);
if (pv ['sign'])
menu.label += ' ' + pv['sign'];
}
else
menuitem.setAttribute("checked",false);
});
});
}
function add_warnbadge()
{
if ( ! sss.sheetRegistered(cssuri_warnbadge, sss.USER_SHEET) )
sss.loadAndRegisterSheet(cssuri_warnbadge, sss.USER_SHEET);
}
function rm_warnbadge()
{
if ( sss.sheetRegistered(cssuri_warnbadge, sss.USER_SHEET) )
sss.unregisterSheet(cssuri_warnbadge, sss.USER_SHEET);
}
update_badge();
async function update_badge()
{
var show_warnbadge = false;
for (item of prefItems)
{
if (typeof(item) === "string")
continue;
const current_val = getItemCurrentVal(item) ;
if (
item.possibleVals.some ( function(ele) {
return ( ele ['val'] === current_val && ele ['warnbadge'] && ele ['warnbadge'] === true );
} )
)
{
show_warnbadge = true;
break;
}
}
if (show_warnbadge)
add_warnbadge();
else
rm_warnbadge();
}
})();
Alles anzeigen
Es fehlt nur das Hakensymbol im Untermenü. alles andere passt.
Das wird aber anscheinend schon länger nicht mehr angezeigt.
Ab Firefox 143 sind da nur noch Vierecke zu sehen.
Mfg.
Endor
Die da wären?
zbs.
// ==UserScript==
// @name Tab Context Menu Navigation
// @version 1.1.2a
// @author aminomancer
// @homepage https://github.com/aminomancer/uc.css.js
// @description Add some new menuitems to the tab context menu for navigating tabs. Includes Back, Forward, Reload, and Bookmark. The new menuitems look just like the navigation group at the top of the content area context menu. So they're oriented horizontally and have icons instead of labels. But functionally, they're a bit different. If you click the "Reload" button, for example, instead of reloading the current tab it will reload the tab you right-clicked to open the context menu. If you had multiple tabs selected and you right-clicked one of them, it will reload all of them. If you click the "Back" button, it will navigate the context tab(s) back by one. So this gives you some capabilities not already available in Firefox. In particular, you can navigate back/forward in tabs without opening them, since it operates on the context tab rather than the active tab. You can also navigate back/forward in multiple tabs at once. This script was made by request. It's not recommended on macOS, since the context menu items and functions are significantly different. It should be technically compatible but it might look weird depending on your settings.
// @downloadURL https://cdn.jsdelivr.net/gh/aminomancer/uc.css.js@master/JS/tabContextMenuNavigation.uc.js
// @updateURL https://cdn.jsdelivr.net/gh/aminomancer/uc.css.js@master/JS/tabContextMenuNavigation.uc.js
// @license This Source Code Form is subject to the terms of the Creative Commons Attribution-NonCommercial-ShareAlike International License, v. 4.0. If a copy of the CC BY-NC-SA 4.0 was not distributed with this file, You can obtain one at http://creativecommons.org/licenses/by-nc-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
// ==/UserScript==
class TabContextMenuNavigation {
static config = {
l10n: {
"Go Back (Single Tab)": "Eine Seite zurück",
"Go Back (Multiselected)": "Ausgewählte Tabs eine Seite zurück gehen",
"Go Back Access Key": "z",
"Go Forward (Single Tab)": "Eine Seite vor",
"Go Forward (Multiselected)": "Ausgewählte Tabs eine Seite vor gehen",
"Go Forward Access Key": "v",
"Reload (Single Tab)": "Aktuelle Seite neu laden",
"Reload (Multiselected)": "Ausgewählte Seiten neu laden",
"Reload Access Key": "n",
"Bookmark (Single Tab)": "Lesezeichen für Seite hinzufügen",
"Bookmark (Multiselected)": "Lesezeichen für ausgewählte Seiten hinzufügen",
"Bookmark Access Key": "L",
},
// firefox doesn't have localized strings for these menuitems, since it
// doesn't have any user-facing features like this where you can navigate
// tabs that aren't currently active/selected. nor does it have any ability
// to navigate multiple tabs at once. so you have to localize the tooltips
// yourself to match your browser language.
};
create(doc, tag, props, isHTML = false) {
let el = isHTML ? doc.createElement(tag) : doc.createXULElement(tag);
for (let prop in props) el.setAttribute(prop, props[prop]);
return el;
}
constructor() {
this.config = TabContextMenuNavigation.config;
let { l10n } = this.config;
document.documentElement.setAttribute(
"operatingsystem",
AppConstants.platform
);
this.loadStylesheet();
// menuitem group
this.contextNavigation = this.create(document, "menugroup", {
id: "tab-context-navigation",
});
this.contextNavSeparator = this.create(document, "menuseparator", {
id: "tab-context-sep-navigation",
});
this.tabContext.prepend(this.contextNavSeparator);
this.tabContext.prepend(this.contextNavigation);
// new menuitems
this.contextBack = this.contextNavigation.appendChild(
this.create(document, "menuitem", {
id: "tab-context-back",
class: "menuitem-iconic",
tooltiptext: l10n["Go Back (Single Tab)"],
accesskey: l10n["Go Back Access Key"]
})
);
this.contextForward = this.contextNavigation.appendChild(
this.create(document, "menuitem", {
id: "tab-context-forward",
class: "menuitem-iconic",
tooltiptext: l10n["Go Forward (Single Tab)"],
accesskey: l10n["Go Forward Access Key"]
})
);
this.contextReload = this.contextNavigation.appendChild(
this.create(document, "menuitem", {
id: "tab-context-reload",
class: "menuitem-iconic",
tooltiptext: l10n["Reload (Single Tab)"],
accesskey: l10n["Reload Access Key"]
})
);
this.contextBookmark = this.contextNavigation.appendChild(
this.create(document, "menuitem", {
id: "tab-context-bookmark",
class: "menuitem-iconic",
tooltiptext: l10n["Bookmark (Single Tab)"],
accesskey: l10n["Bookmark Access Key"]
})
);
document.getElementById('tab-context-back').addEventListener('command', () =>{
//menuitem.addEventListener('command', () =>{
tabContextMenuNavigation.goBack();
});
document.getElementById('tab-context-forward').addEventListener('command', function() {
//menuitem.addEventListener('command', () => {
tabContextMenuNavigation.goForward();
});
document.getElementById('tab-context-reload').addEventListener('command', function() {
//menuitem.addEventListener('command', () => {
tabContextMenuNavigation.reload();
});
document.getElementById('tab-context-bookmark').addEventListener('command', function() {
//menuitem.addEventListener('command', () => {
tabContextMenuNavigation.bookmark();
});
// remove the separator after "New Tab" menuitem,
// since it'll look awkward with the menugroup above it.
let newTab = this.tabContext.querySelector("#context_openANewTab");
if (newTab.nextElementSibling.tagName === "menuseparator") {
newTab.nextElementSibling.remove();
}
// set up listener to hide/disable menuitems
this.tabContext.addEventListener("popupshowing", this);
}
handleEvent(e) {
switch (e.type) {
case "popupshowing":
this.onPopupShowing(e);
break;
}
}
// we want to disable/enable the back & forward menuitems just like the
// back/forward buttons in the navbar. we also want to change the tooltips for
// all 4 menuitems based on whether more than 1 tab is selected.
onPopupShowing(e) {
if (e.target !== this.tabContext) return;
let { l10n } = this.config;
if (this.contextTab?.multiselected) {
this.contextBack.disabled = !gBrowser.selectedTabs.some(
tab => gBrowser.getBrowserForTab(tab).webNavigation.canGoBack
);
this.contextForward.disabled = !gBrowser.selectedTabs.some(
tab => gBrowser.getBrowserForTab(tab).webNavigation.canGoForward
);
this.contextBack.setAttribute(
"tooltiptext",
l10n["Go Back (Multiselected)"]
);
this.contextForward.setAttribute(
"tooltiptext",
l10n["Go Forward (Multiselected)"]
);
this.contextReload.setAttribute(
"tooltiptext",
l10n["Reload (Multiselected)"]
);
this.contextBookmark.setAttribute(
"tooltiptext",
l10n["Bookmark (Multiselected)"]
);
} else {
this.contextBack.disabled = !gBrowser.getBrowserForTab(this.contextTab)
.webNavigation.canGoBack;
this.contextForward.disabled = !gBrowser.getBrowserForTab(this.contextTab)
.webNavigation.canGoForward;
this.contextBack.setAttribute(
"tooltiptext",
l10n["Go Back (Single Tab)"]
);
this.contextForward.setAttribute(
"tooltiptext",
l10n["Go Forward (Single Tab)"]
);
this.contextReload.setAttribute(
"tooltiptext",
l10n["Reload (Single Tab)"]
);
this.contextBookmark.setAttribute(
"tooltiptext",
l10n["Bookmark (Single Tab)"]
);
}
}
goBack() {
if (this.contextTab?.multiselected) {
gBrowser.selectedTabs.forEach(tab => {
let browser = gBrowser.getBrowserForTab(tab);
if (browser.webNavigation.canGoBack) browser.goBack();
});
} else {
gBrowser.getBrowserForTab(this.contextTab).goBack();
}
}
goForward() {
if (this.contextTab?.multiselected) {
gBrowser.selectedTabs.forEach(tab => {
let browser = gBrowser.getBrowserForTab(tab);
if (browser.webNavigation.canGoForward) browser.goForward();
});
} else {
gBrowser.getBrowserForTab(this.contextTab).goForward();
}
}
reload() {
if (this.contextTab?.multiselected) gBrowser.reloadMultiSelectedTabs();
else gBrowser.reloadTab(this.contextTab);
}
bookmark() {
PlacesUIUtils.showBookmarkPagesDialog(
this.contextTab?.multiselected
? PlacesCommandHook.uniqueSelectedPages
: PlacesCommandHook.getUniquePages([this.contextTab])
);
}
loadStylesheet() {
// we're gonna use a <style> element instead of the usual stylesheet
// service, since this seems to be the only way to get media queries to work
// in an author sheet without saving the stylesheet to disk somewhere and
// loading it from a chrome:// url. this restricts us in some ways but it
// doesn't matter since these elements only appear in one place.
let style = document.createElement("style");
style.textContent = `#tab-context-navigation>.menuitem-iconic>.menu-iconic-text,#tab-context-navigation>.menuitem-iconic>.menu-accel-container{display:none;}#tab-context-navigation>.menuitem-iconic{-moz-box-flex:1;-moz-box-pack:center;-moz-box-align:center;}#tab-context-navigation>.menuitem-iconic>.menu-iconic-left{appearance:none;}#tab-context-navigation>.menuitem-iconic>.menu-iconic-left>.menu-iconic-icon{width:1.25em;height:auto;margin:7px;-moz-context-properties:fill;fill:currentColor;}#tab-context-back{list-style-image:url("chrome://browser/skin/back.svg");}#tab-context-forward{list-style-image:url("chrome://browser/skin/forward.svg");}#tab-context-reload{list-style-image:url("chrome://global/skin/icons/reload.svg");}#tab-context-bookmark{list-style-image:url("chrome://browser/skin/bookmark-hollow.svg");}#tab-context-back:-moz-locale-dir(rtl),#tab-context-forward:-moz-locale-dir(rtl),#tab-context-reload:-moz-locale-dir(rtl){transform:scaleX(-1);}#contentAreaContextMenu[touchmode]>#tab-context-navigation>menuitem{padding-block:7px;}#tab-context-navigation{background-color:menu;padding-bottom:4px;}#tab-context-sep-navigation{margin-inline-start:-28px;margin-top:-4px;}@media (-moz-windows-non-native-menus){#tab-context-navigation:not([hidden]){background-color:inherit;padding:0 0 4px;display:flex;flex-direction:row;--menuitem-min-width:calc(2em + 16px);min-width:calc(4 * var(--menuitem-min-width))}#tab-context-navigation>.menuitem-iconic{flex:1 0 auto}#tab-context-navigation>.menuitem-iconic[_moz-menuactive="true"]{background-color:transparent}#tab-context-navigation>.menuitem-iconic>.menu-iconic-left{margin:0;padding:0}#tab-context-navigation>.menuitem-iconic>.menu-iconic-left>.menu-iconic-icon{width:var(--menuitem-min-width);height:32px;padding:8px 1em;margin:0}#tab-context-navigation>.menuitem-iconic[_moz-menuactive="true"]:not([disabled="true"])>.menu-iconic-left>.menu-iconic-icon{background-color:var(--menuitem-hover-background-color)}#tab-context-navigation>.menuitem-iconic[_moz-menuactive="true"][disabled="true"]>.menu-iconic-left>.menu-iconic-icon{background-color:var(--menuitem-disabled-hover-background-color)}#tab-context-navigation>.menuitem-iconic:first-child{-moz-box-pack:start}#tab-context-navigation>.menuitem-iconic:last-child{-moz-box-pack:end}#tab-context-navigation>.menuitem-iconic:last-child,#tab-context-navigation>.menuitem-iconic:first-child{flex-grow:0;width:calc(var(--menuitem-min-width) + calc(100% - 4 * var(--menuitem-min-width)) / 6)}#tab-context-sep-navigation{margin-top:0;margin-inline:0}}:root[operatingsystem="linux"] #tab-context-navigation>.menuitem-iconic>.menu-iconic-left{padding-inline-end:0!important;margin-inline-end:0!important;}#context_reloadTab,#context_reloadSelectedTabs,#context_bookmarkTab,#context_bookmarkSelectedTabs{display:none!important;}`;
document.head.appendChild(style);
}
get tabContext() {
return (
this._tabContext ||
(this._tabContext = document.getElementById("tabContextMenu"))
);
}
get contextTab() {
return TabContextMenu.contextTab;
}
}
if (gBrowserInit.delayedStartupFinished) {
window.tabContextMenuNavigation = new TabContextMenuNavigation();
} else {
let delayedListener = (subject, topic) => {
if (topic == "browser-delayed-startup-finished" && subject == window) {
Services.obs.removeObserver(delayedListener, topic);
window.tabContextMenuNavigation = new TabContextMenuNavigation();
}
};
Services.obs.addObserver(delayedListener, "browser-delayed-startup-finished");
}
Alles anzeigen
Vielleicht kriegst Du das ja auch zum laufen.
Edit:
Hat sich erledigt. Habe es selbst hinbekommen.
Lag wohl an meiner dreckigen Brille......
Mfg.
Endor
Openwith verwende ich diese Version, da werden alle Symbole angezeigt.
// ==UserScript==
// @name OpenWith.uc.js
// @description Seiten, Links, Lesezeichen und Tabs in anderen Browsern öffnen
// @author ding
// @include main
// @version 2025.02.05
// @homepageURL https://bbs.kafan.cn/thread-2114879-1-1.html
// @startup window.OpenWithManager.init();
// @shutdown window.OpenWithManager.destroy();
// @note Anpassung für Firefox 136+
// @note Anpassung für Firefox57+
// ==/UserScript==
location.href.startsWith('chrome://browser/content/browser.x') && (function () {
const MENU_NAME = "In anderem Browser öffnen";
// Soll Menü im Kontextmenü angezeigt verwendet? true = ja, false= nein.
const USE_MENU_AREA = true; //Seiteninhalt
const USE_MENU_TAB = true; //Tab
const USE_MENU_PLACE = true; //Lesezeichen
function getFirefoxPath(){//Pfad zu firefox.exe
return OS.Constants.Path.libDir;
}
function getRootPath() {//Pfad auf der Festplatte zu Firefox
var path = getFirefoxPath();
var index = path.indexOf(":");
return path.substring(0,index+1);
}
// Nachdem Sie den Inhalt geändert haben, benennen Sie das Skript bitte um, um sicherzustellen, dass es auf dem neuesten Stand ist, oder verwenden Sie die nicht zwischengespeicherte userChrome.js
var browsers = {
Edge: {
enable: true,
name: "Edge",
path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
image: "data:image/png;base64,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"
},
Chrome: {
enable: false,
name: "Chrome",
path: "D:\\GoogleChromePortable64\\GoogleChromePortable.exe",
image: "data:image/png;base64,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"
},
FireFox: {
enable: true,
name: "FireFox",
path: "C:\\Program Files\\Mozilla Firefox\\firefox.exe",
image: "data:image/png;base64,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"
},
Firefoxbeta: {
enable: true,
name: "FireFox beta",
path: "F:\\Adaten\\Downloads\\Firefox\\Beta64bit\\BetaMultiLoader.exe",
image: "data:image/png;base64,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"
},
Firefoxnightly: {
enable: true,
name: "FireFox Nightly",
path: "F:\\Adaten\\Downloads\\Firefox\\firefox-22.0a1.en-US.win64-x86_64\\Fiefox-Test\\NightlyMultiLoader.exe",
image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAEZ0FNQQAAsY58+1GTAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYgSURBVHjalJZdbFxXEcd/5+Pe3bvrvV57Ha8TO01SJzEpSVwRhFSSVAHaCqQ+UBCFh1KpqgoSqMoDQjxAhYRAVSv1AdSntAoUJAQVLRCoIDUqQjQhpKQpkWnjfDu2k3Qdr9f23r1f597DwzppQp8YaXQ+NJq/Zkb/mRE//Nwyt4rrlTi7PMXB0z8lUy7oArhlKPrgFEB70F+Ep38OfmcdJoxQK01O7YepR8CJb/Mn+X9F5rBSQJ2+H6FHXsKuf5R4FBZ2gLQfMtf/+yFAKKFWLS0gfAT3gN2IECMI7ZDJCyyPVK09dx+UP4PjnyVb8yeUlUhpbgNwkw/eyujxuCcbnW5ffBWsjxCPgf02STKMMuAp0C7YApm7CMaHLBXI/EX8xUOY/gnc5m9A3AJgukEIK1j2ou+39Mq6S+3zDWnFgSyJt+neHob37SaSkvdPXAapQSioVsD0Qm4gTYfYfvhrXPjsp4iGXkOm4c2MPLvn2o37wPXC4oW8Wq6slJ100c+dhlpCbl1L3K9468AhkkhCuQ9sDzxZgG1TkIXdVIoMhIbpu59nZuHJG/XQ7ahxA2tLzRuuZF4fegBH1kCvWcdyHSZ/+RrJ9FWo1qFogASxWAXqWDsH1ll1YWFo5gkKHz+IdU6CRW/TO8hsjpF2f9tVNBWkQAKkOYQB2LFdVKo+spjRnlwkMwniyALO+ChGt7EiAutiUSBFgf6rT9ls6AuQo4YKHyG36X210vAzHQ/CMkQexKWuBiqnqYr0P7CJoV0u84fPkVuBvRrhOIrillGyfAWLQNgiIvcAsRnJy4hkQQ8VhyoV7X8+sx9EKVZPLLiOpMeNCA4d5crb75G2FHgWdIHolfMok9F7/zhtPUsiU7AFyAsOqvBVYfLv6XFv79pUyy1tCyLvqsxAW5DGUiwK3Kl3OfuzP0LfAHgliHNQCQhN8Ku3YXCY/m2jLLmLdLQBofEbYrwYCVej2QLcJXJQWVedHJaaC0xfu8bsq0cJ8wQ8DTbpFkelIBOQCpKQYHYa2b+HwQGYLwQEpYTaTP6gk+rHtSPtSJqbHmkddApOCiZMaNplvEoP7akzRMagPQ8TBUAIxSIoB4SEKMGZv0TYs5dkochaXzArl+kULHKgt0eVZCXbVB7/BLKwPgcyF1Z0Slhy8AfqDGzZzOL0GWwcUxisUdxQJ222sEkM1kDYwdtRp3jvOOkVRV3naAO5o0lPTLys9/R/+mxFqcllaz+pjcCNoOK51K3GhoKe4Tspff1btGyA2FQjG9E0Ts9y/kcvkMUpWdzG3zmGTCF0JDpSVBOXsGgbemz3MX2qVQ02lpf/vdEvkWbghtBTlNiiJNCwFK1Q7XXoGawzP7fEhT/8ldbUGcomx4QxcvMa1mzdSdgEKQWFWFFWHvnpqYnm8YlJ/dzFUe7py954upqZIJc6TyVeB4wLuQvLNuadiQN04hWCoEUWGpRyIM8o1Kus/8YTFJIiYhlKKVQiiSdzGn/b+sLs6xtQsI/Z6Nz17ZXy+jtK/q4ot4hMYEW3WRe8ErWRrZAZRBLjSE2pVqO+ezcbvvwwfu8gotWdM5XIUgsV5uTMv6YO7f8u9jACvgIYtlfu2PTjnc+caOWqL8whcQSBD0EFYh/i3i6rOyIh811yX2LyblsxQG6hFFtsMyW9PnfwzLs/eTxLAxSMA4pGkraSfOny3r6dXzRIbG5RRtwkn0hAZQJXanQq0AHoCNwIihGUA6jFArGSnJk4NPfI5fNrg9bCThQ8DKwBBnmv/dLkgGvPby7f9aCSrsqN7TozXQJq0yWwk4CbQCECL4ZKBAMJXJ468rs3//78l6ZnHrqWZR/FpHei4F4gBzSWSY42Xzx1NfL/+TF/bG+fLlezHGQKelUd0wVwEnBjiw4NnfeD8I3jf3n09WPfeWq++VYb9gPdFq5g3y3j+T9Ag0ud5MKR/M1flLxKpy7WjZWFqngIdAIqglIC1RREYFi43rj0+5OvPPbOzNxvc/uP1Tn+zZsA+sNrgwXKXDFXm8+tHPhBZaHx7EPD7bv7k70PjJYqG0e8DcXplYvx6U577mzr138+Nr/xeJBNJjC2uqTcvln8dwCI4cjEw4tuJAAAAABJRU5ErkJggg=="
},
others: {
enable: false,
name: "",
path: "",
image: ""
},
all: {
enable: true,
name: "Alle Browser",
image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACjElEQVQ4T21TXUgUURT+zswuZZruTBRRFJHOvgRR0EMRCQkVQWUEai9WD+LWjtpDQfVQLRQYPUSFd0xSCMJ+pCIMC1+rh+itzMC964MIRRYzu2WitjsnZqZ1t637cOGce8937ved7xJKli5SawA0MfE+AJvAnAXoPYhfECsPbLNmsriEFgIxVaFR5i6AegIK+eBCo7cx4yII0uGqZpgrpr1ccPGmXKSF+C2BNpa+iMGvnCmjDgnKgpkiluxQiJrtLLajw5jzATQr2UOg1tJivyvQ7cSNePFZRCSPEWGbE4/GqFKkalTwGBGUUgAX6IWrXlZCuXL7uPGx+FyzkvdzrJwnTchOIpz9X/d8LsdoyJjGo3wcsVLtBD4NoJ90IYeZ2CZWvoD45D8aMEYc0yho0/NpiZadHgawFYRR0kXyiW1GDy3tGo+GFXfsj9qjv3LYqYa5VnHJdEyjLg+sCfmQyJ/KjD8FTcinjmkcRICcIaJQsXCRrmRtui36cgHAkhMErPVjxnefgm0ae7w4YqWOKuyeADANoueuqz5Ot62fKKali5Rnsn4CVAa/I3+ECt3Iq1zZO6mH5mY7mHABjHmALjlfqzuRIDcPpIvUdRDvYuAZRbrlZmJqdeI1XudgXZss0xfP+hyDl/IQcuo5p716pAAi+7KqciUwkkjeYsa9v7gKOUiE/fkCF6hPx41BL64ScrcKNNqm0RJYuYfDek7ehkJXFwwzwKr2LeVxbWLm144Z3RHoJA8Q8yknVLEXsVUzhU+T4JC2fPwMK+6PdHllH46s/KlbsgHAAAgJAG/gogUKPtjL5jvRuGHeH2Opccq6x1aXuephJncLQE1gZDzDABiaU8N3ZmLrPhfX/AYp2hIKQjp+9wAAAABJRU5ErkJggg=="
}
};
if (window.OpenWithManager) {
window.OpenWithManager.destroy();
delete window.OpenWithManager;
}
function $(id) {
return document.getElementById(id);
}
window.OpenWithManager = {
useMenu: false,
getTypeDesc: function (type) {
switch (type) {
case "page":
return "Seite ";
case "link":
return "Link ";
//case "tab": return "Tab ";
//case "bm": return "Lesezeichen ";
}
return "";
},
buildMenuName: function (label, type) {
return this.getTypeDesc(type) + " in " + label + " öffnen";
},
attachNode: function (anchorNode, node) {
if (this.useMenu) {
anchorNode.appendChild(node);
} else {
anchorNode.parentNode.insertBefore(node, anchorNode);
}
},
createMenuPopup: function (anchorNode, type) {
let menu = document.createXULElement("menu");
menu.setAttribute("label", MENU_NAME);
menu.setAttribute("id", "openwith-menu-" + type);
menu.setAttribute("class", "menu-iconic openwith-menu open-" + type);
menu.setAttribute("image", browsers.all.image);
anchorNode.parentNode.insertBefore(menu, anchorNode);
let popup = document.createXULElement("menupopup");
popup.id = "openwith-popup-" + type;
menu.appendChild(popup);
return popup;
},
createMenuItem: function (anchorNode, id, browser, type) {
let menuitem = document.createXULElement("menuitem");
menuitem.id = "openwith-m-" + type + "-" + id;
menuitem.setAttribute("label", this.buildMenuName(browser.name, type));
menuitem.addEventListener("command", function() {
OpenWithManager.openWithOtherBrowser(this, id, type);
});
menuitem.setAttribute("class", "menuitem-iconic openwith-menuitem open-" + type);
if (browser.image) {
menuitem.setAttribute("image", browser.image);
}
this.attachNode(anchorNode, menuitem);
},
createBrowserMenu: function (anchorNode, type) {
for (let key in browsers) {
try {
if (browsers[key].enable) {
this.createMenuItem(anchorNode, key, browsers[key], type);
}
} catch (e) {
alert(e.message);
}
}
},
//contentAreaContextMenu
initContentAreaMenu: function () {
var inspos = $("inspect-separator");
let sep = document.createXULElement("menuseparator");
sep.setAttribute("class", "openwith-menuitem");
inspos.parentNode.insertBefore(sep, inspos);
this.useMenu = USE_MENU_AREA;
var anchorNode;
if (this.useMenu) {
anchorNode = this.createMenuPopup(inspos, "area");
} else {
anchorNode = inspos;
}
//Abschnitt Link
this.createBrowserMenu(anchorNode, "link");
let sepLink = document.createXULElement("menuseparator");
sepLink.setAttribute("class", "open-link openwith-menuitem");
this.attachNode(anchorNode, sepLink);
//Steuern der Anzeige des Links-Menüs
inspos.parentNode.addEventListener("popupshowing", this, false);
//Seitenabschnitt
this.createBrowserMenu(anchorNode, "page");
},
//tabContextMenu
initTabContextMenu: function () {
var inspos = $("context_closeTabOptions") || $("context_closeTabOptions")
let sep = document.createXULElement("menuseparator");
sep.setAttribute("class", "openwith-menuitem");
inspos.parentNode.insertBefore(sep, inspos.nextSibling);
this.useMenu = USE_MENU_TAB;
var anchorNode;
if (this.useMenu) {
anchorNode = this.createMenuPopup(sep.nextSibling, "tab");
} else {
anchorNode = sep.nextSibling;
}
this.createBrowserMenu(anchorNode, "tab");
},
//placesContext
initPlacesContextMenu: function () {
var inspos = $("placesContext_openSeparator");
//let sep = document.createXULElement("menuseparator");
//inspos.parentNode.insertBefore(sep, inspos);
this.useMenu = USE_MENU_PLACE;
var anchorNode;
if (this.useMenu) {
anchorNode = this.createMenuPopup(inspos, "place");
} else {
anchorNode = inspos;
}
this.createBrowserMenu(anchorNode, "place");
//Ordneranzeige
inspos.parentNode.addEventListener("popupshowing",this, false);
},
handleEvent: function (event) {
if(event.target.id=="placesContext"){
var isFloder = false;
try {
let selectedNode = PlacesUIUtils.getViewForNode(event.target.ownerDocument.popupNode).selectedNode;
isFloder = !selectedNode || selectedNode.hasChildren;
} catch (e) {
}
let menus = $("placesContext").querySelectorAll(".open-place");
for (let menu of menus) {
if (isFloder) {
menu.hidden = true;
} else {
menu.hidden = false;
menu.disabled = false;
}
}
}
if(event.target.id=="contentAreaContextMenu"){
let menus = $("contentAreaContextMenu").querySelectorAll(".open-link");
for (let menu of menus) {
if (gContextMenu.onLink) {
menu.hidden = false;
} else {
menu.hidden = true;
}
}
}
},
init: function () {
//contentAreaContextMenu
this.initContentAreaMenu();
//tabContextMenu
this.initTabContextMenu();
//placesContext
this.initPlacesContextMenu();
},
destroy:function () {
$("contentAreaContextMenu").removeEventListener("popupshowing", this, false);
$("placesContext_openSeparator").removeEventListener("popupshowing", this, false);
let menus = document.querySelectorAll(".openwith-menu"),
menuitems = document.querySelectorAll(".openwith-menuitem");
for(let menuitem of menuitems){
menuitem.parentNode.removeChild(menuitem);
}
for(let menu of menus){
menu.parentNode.removeChild(menu);
}
},
openWithBrowser: function (url, path) {
if (!path) {
alert("Browserpfad nicht angegeben ");
return;
}
if (path == "microsoft-edge") {
//Edge mit URL öffnen
var cmdUrl = path + ":" + url;
let win = window.openDialog(cmdUrl, "", "chrome");
win.close();
return;
}
let clientApp = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
clientApp.initWithPath(path);
if (!clientApp.exists()) {
alert("Browserpfadfehler: " + path);
return;
}
try {
let ss = Cc["@mozilla.org/browser/shell-service;1"]
.getService(Ci.nsIShellService);
ss.openApplicationWithURI(clientApp, url);
} catch (e) {
let p = Cc["@mozilla.org/process/util;1"]
.createInstance(Ci.nsIProcess);
p.init(clientApp);
p.run(false, [url], 1);
}
},
openWithOtherBrowser : function (obj, id, type) {
var url;
switch (type) {
case "page":
url = gBrowser.currentURI.spec;
break;
case "link":
url = gContextMenu.linkURL;
break;
case "tab": {
let tab = TabContextMenu.contextTab;
let bw = tab && tab.linkedBrowser;
url = bw && bw.currentURI.spec;
}
break;
case "place":
url = PlacesUIUtils.getViewForNode(PlacesUIUtils.lastContextMenuTriggerNode).selectedNode.uri;
break;
}
if (url) {
if (id == "all") {
for (let key in browsers) {
let browser = browsers[key];
if (browser.enable && key != "all" && browser.path) {
this.openWithBrowser(url, browser.path);
}
}
} else {
let browser = browsers[id];
this.openWithBrowser(url, browser.path);
}
}
}
};
OpenWithManager.init();
})();
Alles anzeigen
Browser und Pfade musst Du dann noch für dich anpassen.
Vielleicht hilft dir das ja etwas.
Mfg.
Endor
Hallo FuchsFan
Teste mal meine Version die funktioniert hier jetzt:
//ScrollTopAndBottom.uc.js
(function() {
let menuitem = document.createXULElement('menuitem');
menuitem.id = 'context-to-top';
menuitem.classList.add('menuitem-iconic');
menuitem.setAttribute('tooltiptext' , '');
menuitem.style.setProperty('--menuitem-icon', 'url("chrome://browser/skin/back.svg")');
//menuitem.style.listStyleImage='url("chrome://browser/skin/back.svg")';
let refItem = document.getElementById('context-reload');
refItem.parentNode.insertBefore(menuitem, refItem);
//click
menuitem.addEventListener('click', () => {
if (event.button == 0) {
ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo(0,0) ' , false);
}
});
})();
(function() {
let menuitem = document.createXULElement('menuitem');
menuitem.id = 'context-to-bottom';
menuitem.classList.add('menuitem-iconic');
menuitem.setAttribute('tooltiptext' , '');
menuitem.style.setProperty('--menuitem-icon', 'url("chrome://browser/skin/forward.svg")');
//menuitem.style.listStyleImage='url("chrome://browser/skin/forward.svg")';
let refItem = document.getElementById('context-reload');
refItem.parentNode.insertBefore(menuitem, refItem);
//click
menuitem.addEventListener('click', () => {
if (event.button == 0) {
ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo(0,100000) ' , false);
}
});
var css = '\
@-moz-document url("chrome://browser/content/browser.xhtml") { \
#context-to-top { \
--menuitem-icon: url("chrome://browser/skin/back.svg");\
transform:rotate(90deg)!important;\
color:#00cd00!important;\
}\
#context-to-top:hover { \
--menuitem-icon: url("chrome://browser/skin/back.svg");\
transform:rotate(90deg)!important;\
color:#008b00!important;\
}\
\
#context-to-bottom{\
--menuitem-icon: url("chrome://browser/skin/forward.svg");\
transform:rotate(90deg)!important;\
color:#00cd00!important;\
}\
#context-to-bottom:hover{\
--menuitem-icon: url("chrome://browser/skin/forward.svg");\
transform:rotate(90deg)!important;\
color:#008b00!important;\
}';
var cssUri = Services.io.newURI('data:text/css,' + encodeURIComponent(css), null, null);
var SSS = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
SSS.loadAndRegisterSheet(cssUri, SSS.AGENT_SHEET);
})();
Alles anzeigen
So geht es hier.
Mfg.
Endor
Hallo 2002Andreas
Ja ist hier auch so. Eben kontrolliert.
Bei manchen Scripten die Schaltflächen mit Symbolen einfügen
fehlt das Icon, aber nicht bei allen. Komisch?
Mfg.
Endor
Hallo Road-Runner .
Auch von mir alles alles Gute zum Geburtstag.
Vor allem viel Gesundheit wünsche ich Dir.
Mfg.
Endor
security.browser_xhtml_csp.enabled
Genau.
Ich habe hier in about:config die Einstellung für CSP auf false.
Daher läuft es wahrscheinlich bei mir.
Mfg.
Endor
Diese Version funktioniert hier einwandfrei.
// ==UserScript==
// @name newTabButtonUndoTabList.uc.js
// @description Bei Rechtsklick auf die Neuen Tab Schaltfläche, wird im Kontextmenü,
// @description der Eintrag zum Wiederherstellen des zuletzt geschlossenen Tabs angezeigt.
// @include main
// ==/UserScript==
(function () {
if (!window.gBrowser){
return;
}
gBrowser.tabContainer.addEventListener('click', function (e) {
if (e.originalTarget.id != 'tabs-newtab-button') return;
switch (e.button) {
case 1:
undoCloseTab(0);
break;
case 2:
UCT.makePopup(e);
event.preventDefault();
break;
}
}, false);
})();
var UCT = {
init: function () {
var mp = document.createXULElement("menupopup");
mp.id = "undo-close-tab-list";
mp.setAttribute("onpopupshowing", "UCT.onpopupshowing(event);");
mp.setAttribute("placespopup", true);
mp.setAttribute("tooltip", "bhTooltip");
mp.setAttribute("popupsinherittooltip", true);
document?.getElementById("mainPopupSet")?.appendChild(mp);
},
makePopup: function (e) {
if (SessionStore.getClosedTabCountForWindow(window) != 0) {
document.getElementById("undo-close-tab-list").openPopupAtScreen(e.screenX +2, e.screenY +2, false);
}
else
{
console.log("--- Es gibt keinen Tab, der wiederhergestellt werden kann ---");
}
},
onpopupshowing: function (e) {
var popup = e.target;
while (popup.hasChildNodes())
popup.removeChild(popup.firstChild);
let undoItems = SessionStore.getClosedTabDataForWindow(window);
undoItems.map(function (item, id) {
var m = document.createXULElement('menuitem');
m.setAttribute('label', item.title);
m.setAttribute('image', item.image );
m.setAttribute('class', 'menuitem-iconic bookmark-item');
m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
popup.appendChild(m);
});
popup.appendChild(document.createXULElement("menuseparator"));
m = document.createXULElement("menuitem");
m.setAttribute("label", "Chronik in der Sidebar öffnen");
m.setAttribute("image", "chrome://browser/skin/history.svg");
m.setAttribute("class", "menuitem-iconic");
m.setAttribute("oncommand", "SidebarController.toggle('viewHistorySidebar');");
popup.appendChild(m);
},
};
setTimeout(function() {
UCT.init();
},250);
Alles anzeigen
Teste mal.
Mfg.
Endor
Testet bitte mal diese Version.
Ist von BenzBrake. jizz
Er ist hier im Forum unter einem anderen Namen tätig.
Habe die von milupo erwähnte Zeile entsprechend geändert.
Das öffnen von geschlossenen Fenstern funktioniert hier damit aber nicht.
Tabs ja.
// ==UserScript==
// @name UndoCloseTabButtonN
// @description Kürzlich geschlossene Tabs, mit Klick auf Schaltfläche in der Navbar oder Mittelklick auf freie Stelle in Tableiste, wiederherstellen.
// @version 1.2.9
// @include main
// @sandbox true
// @charset UTF-8
// @note 2025/07/21 Fx141
// @note 2025/01/31 Fx136 fix Remove Cu.import, per Bug Bug 1881888, Bug 1937080 Block inline event handlers in Nightly and collect telemetry
// @note 2023/08/16 Fx117 fix this is undefined
// @note 2023/06/08 Fx115 SessionStore.getClosedTabData → SessionStore.getClosedTabDataForWindow
// @note 2022/11/12 Verhalten der linken, mittleren und rechten Taste ändern
// @note 2021/12/12 Fx95 SessionStore.getClosedTabData / getClosedWindowData Der Rückgabewert wurde von JSON in Array geändert.
// @note 2019/01/23 Fx66 Problem, bei dem das Klicken in die Tableiste nicht funktionierte - behoben
// @note 2019/07/04 Fx69
// @note 2019/09/03 Fx70
// @note 2019/12/09 Fx72
// ==/UserScript==
// Schaltfläche wird standardmäßig in die Tableiste eingefügt.
(function () {
"use strict";
const CONFIG = {
useTabbarMiddleClick: true, // Enable middle-click on tab bar to restore last closed tab
XULNS: "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
BUTTON_ID: "ucjs-undo-close-tab-button1",
LOCALE: Services.locale.appLocaleAsBCP47.includes("de"),
LABELS: {
closedTab: Services.locale.appLocaleAsBCP47.includes("de") ? "Geschlossene Tabs": "Geschlossene Tabs",
closedWindow: Services.locale.appLocaleAsBCP47.includes("de") ? "Geschlossenes Fenster" : "Geschlossenes Fenster",
tooltip: Services.locale.appLocaleAsBCP47.includes("de")
? "Geschlossene Tabs anzeigen\nMit der mittleren Maustaste schnell den letzten geschlossenen Tab öffnen"
: "Geschlossene Tabs\nMit der mittleren Maustaste klicken, um den letzten geschlossenen Tab wiederherzustellen"
}
};
if (typeof undoCloseTab === "undefined") {
window.undoCloseTab = function (aIndex, sourceWindowSSId) {
// the window we'll open the tab into
let targetWindow = window;
// the window the tab was closed from
let sourceWindow;
if (sourceWindowSSId) {
sourceWindow = SessionStore.getWindowById(sourceWindowSSId);
if (!sourceWindow) {
throw new Error(
"sourceWindowSSId argument to undoCloseTab didn't resolve to a window"
);
}
} else {
sourceWindow = window;
}
// wallpaper patch to prevent an unnecessary blank tab (bug 343895)
let blankTabToRemove = null;
if (
targetWindow.gBrowser.visibleTabs.length == 1 &&
targetWindow.gBrowser.selectedTab.isEmpty
) {
blankTabToRemove = targetWindow.gBrowser.selectedTab;
}
// We are specifically interested in the lastClosedTabCount for the source window.
// When aIndex is undefined, we restore all the lastClosedTabCount tabs.
let lastClosedTabCount = SessionStore.getLastClosedTabCount(sourceWindow);
let tab = null;
// aIndex is undefined if the function is called without a specific tab to restore.
let tabsToRemove =
aIndex !== undefined ? [aIndex] : new Array(lastClosedTabCount).fill(0);
let tabsRemoved = false;
for (let index of tabsToRemove) {
if (SessionStore.getClosedTabCountForWindow(sourceWindow) > index) {
tab = SessionStore.undoCloseTab(sourceWindow, index, targetWindow);
tabsRemoved = true;
}
}
if (tabsRemoved && blankTabToRemove) {
targetWindow.gBrowser.removeTab(blankTabToRemove);
}
return tab;
}
}
const UndoCloseTabService = {
prepareMenu (event) {
const doc = event.view?.document || document;
const menu = event.originalTarget;
this.clearMenu(menu);
// Populate closed tabs
const tabData = this.getClosedTabData();
this.addTabMenuItems(doc, menu, tabData);
// Populate closed windows
const windowData = this.getClosedWindowData();
if (windowData.length > 0) {
if (tabData.length > 0) {
menu.appendChild(this.createElement(doc, "menuseparator"));
}
menu.appendChild(this.createElement(doc, "menuitem", {
disabled: true,
label: CONFIG.LABELS.closedWindow
}));
this.addWindowMenuItems(doc, menu, windowData);
}
if (tabData.length + windowData.length === 0) {
event.preventDefault();
}
},
getClosedTabData () {
let data = "getClosedTabDataForWindow" in SessionStore
? SessionStore.getClosedTabDataForWindow(window)
: SessionStore.getClosedTabData(window);
return typeof data === "string" ? JSON.parse(data) : data;
},
getClosedWindowData () {
let data = SessionStore.getClosedWindowData(window);
return typeof data === "string" ? JSON.parse(data) : data;
},
addTabMenuItems (doc, menu, data) {
data.forEach((item, index) => {
const menuItem = this.createFaviconMenuitem(doc, item.title, item.image, index, this.undoTab);
const state = item.state;
let idx = state.index;
if (idx === 0) idx = state.entries.length;
if (--idx >= 0 && state.entries[idx]) {
menuItem.setAttribute("targetURI", state.entries[idx].url);
}
menu.appendChild(menuItem);
});
},
addWindowMenuItems (doc, menu, data) {
data.forEach((item, index) => {
let title = item.title;
const tabsCount = item.tabs.length - 1;
if (tabsCount > 0) title += ` (总计:${tabsCount})`;
const tab = item.tabs[item.selected - 1];
menu.appendChild(this.createFaviconMenuitem(doc, title, tab.image, index, this.undoWindow));
});
},
createFaviconMenuitem (doc, label, icon, value, command) {
const attrs = {
class: "menuitem-iconic bookmark-item menuitem-with-favicon",
label,
value
};
if (icon) {
attrs.image = /^https?:/.test(icon) ? `moz-anno:favicon:${icon}` : icon;
}
const menuItem = this.createElement(doc, "menuitem", attrs);
menuItem.addEventListener("command", command, false);
return menuItem;
},
undoTab (event) {
undoCloseTab(event.originalTarget.getAttribute("value"));
},
undoWindow (event) {
undoCloseWindow(event.originalTarget.getAttribute("value"));
},
clearMenu (element) {
const range = document.createRange();
range.selectNodeContents(element);
range.deleteContents();
},
onClick (event) {
if (event.button === 0 && event.target.id === CONFIG.BUTTON_ID) {
event.preventDefault();
event.stopPropagation();
undoCloseTab();
} else if (event.button === 1 && ["box", "scrollbox"].includes(event.originalTarget.localName)) {
event.preventDefault();
event.stopPropagation();
undoCloseTab();
} else if (event.button === 2 && event.target.id === CONFIG.BUTTON_ID) {
event.preventDefault();
event.stopPropagation();
const pos = (event.target.ownerGlobal.innerWidth / 2) > event.pageX
? { position: "after_position", x: 0, y: event.target.clientHeight }
: { position: "after_end", x: 0, y: 0 };
event.target.querySelector("menupopup").openPopup(event.target, pos.position, pos.x, pos.y);
}
},
createElement (doc, tag, attrs = {}) {
const element = doc.createElementNS(CONFIG.XULNS, tag);
Object.entries(attrs).forEach(([key, value]) => {
if (key.startsWith('on') && typeof value === 'function') {
element.addEventListener(key.slice(2).toLowerCase(), value, false);
} else {
element.setAttribute(key, value);
}
});
return element;
}
};
function initialize () {
if (CONFIG.useTabbarMiddleClick) {
gBrowser.tabContainer.addEventListener("click", UndoCloseTabService.onClick, true);
}
if (document.getElementById(CONFIG.BUTTON_ID)) return;
try {
const CustomizableUI = globalThis.CustomizableUI || ChromeUtils.importESModule("resource:///modules/CustomizableUI.sys.mjs");
CustomizableUI.createWidget({
id: CONFIG.BUTTON_ID,
defaultArea: CustomizableUI.AREA_NAVBAR,
type: "custom",
onBuild: doc => {
const button = UndoCloseTabService.createElement(doc, "toolbarbutton", {
id: CONFIG.BUTTON_ID,
class: "toolbarbutton-1 chromeclass-toolbar-additional",
type: "contextmenu",
anchor: "dropmarker",
label: CONFIG.LABELS.closedTab,
tooltiptext: CONFIG.LABELS.tooltip,
image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAADgUlEQVR42mL8//8/AyUAIIBYYIzVq1dLC4mIrvr08ZPV379/vjEzMwOZnycmxMV04DMAIIAYQC4A4dXr1oU+fvLk/5/fv/9//fzl/9ev3/6vWLnqK0weFwYIIBZ0A79//crw5+9fhh+//jBYWlhz1dc3fgIqZeDh4WHk4uaqysnKmoysHiCAwAbceHRD6uLdQ0kGunoMv9hYGX79/sPw7cdvhn///jNYWJjzgtRw8/AwvHz5smzutlbN4yeP/k8Pqeo11bW5BxBAjCBnFPbHd7EIMJRoiZgx8nBwMvz+85fhJ9CQf3//Mzx9+pQBFM483FwMQG8xMDL/ZXj46cZ/9v/sk6ZWriwACCCwC25eviprEKbGeOP/AYavb34wsHCwMPz9AzTg9z+GP7x/Gf7++ws07B/Djz+/GZiYGBhYBdgYrx68JwXUyggQQGADePgFfjD+ZGHgF+Bl+P7yHZDPycDGws2gKW7GIMAhwnDs4XaGJ1/uMPz+8Z2BnYOZ4fOnzwwsrMxfgVr/AwQQ2ABpGYkv/GLcDELSfEDn/2HgFeZh8JdLYfjw6SODvqw5g4KiPMOsMw0MDEDbOYWABrz5zsAtI/wJpBcggJhABD+P8MefX38x/AU6k+EvIwPHHx4GNgYuhuuPLzCcuL2f4QswZozEHBjYGDmAdjIw/Pn+l0FCVOoNSC9AAIENEBEQe/Pjy0+GP8CA42LgZ/BXTWb48OUdw6m7+xmm7W5hePTqLoOLaigD+28+hnfv3jN8ePMJaIDMc5BegAACGyApLPX82+fvDB/ev2f4/eU/Ax+bEMOLd08ZpITkGbTl9IHp4jfDsev7GL59/8Lw+9dvhp/ffjPISio+BekFCCCwAQpiyrdfPn3F8OrVa4bHr+8zXHxwioGbjY+hwq+PwVkzmCHYMpFBS84A6Pp/DP/+/2P4+/Mvg5Ks+gOQXoAAggSimNqTb59+/v7x7SfL289vGRccmMDAxyrEsO3sKmCC+sKw9+xmhicf7gLxfQZ2QSaG/38YfkvyyoPCgBEggMAGfPnyhV2eV6vzxs7LWr9//Gf+yPKS6f/fl8zAhMgISkX//11h+M/I+A/ohL/f2P7/1VA2uvb161cOkAMAAogRmp1Znz17xsrCwsL07ds3lu/fvzOD2D9+/GCCpXk2Nra/XFxc/4Bif7i5uf9ISUn9Bgr/BggwAMhljD12v/akAAAAAElFTkSuQmCC",
onclick: UndoCloseTabService.onClick
});
const menu = UndoCloseTabService.createElement(doc, "menupopup", {
tooltip: "bhTooltip",
popupsinherittooltip: "true",
oncontextmenu: event => event.preventDefault(),
onpopupshowing: event => UndoCloseTabService.prepareMenu(event)
});
button.appendChild(menu);
return button;
}
});
} catch (e) {
console.error("Failed to create widget:", e);
}
}
if (gBrowserInit.delayedStartupFinished) {
initialize();
} else {
const observer = (subject, topic) => {
if (topic === "browser-delayed-startup-finished" && subject === window) {
Services.obs.removeObserver(observer, topic);
initialize();
}
};
Services.obs.addObserver(observer, "browser-delayed-startup-finished");
}
})();
Alles anzeigen
Teste mal die von benzBrake:
Mfg.
Endor