- Firefox-Version
- 144.0
- Betriebssystem
- Win11
Das originale Script ist hier zu finden:
Ich habe eine Übersetzung versucht, damit wenigstens ein kleiner Überblick vorhanden ist. Es wird in dem Script auch erklärt was beim Einsatz eines eigenen Editors zu machen ist. Das habe ich in Zeile 231 eingetragen, aber beim Aufruf einer Datei (z.B. user,js) passiert nichts. Was habe ich nicht beachtet, bitte helfen?
JavaScript
// ==UserScript==
// @name ExtrasConfigMenuPlus.uc.js
// @include main
// @charset UTF-8
// @note extras_config_menu.uc.js / Funktionsreduktion von +α
// @note Klicken Sie mit der rechten Maustaste auf die Schaltfläche, um neu zu starten, und klicken Sie mit der
// mittleren Maustaste, um about:config zu öffnen
// @note Der Code zum Aktivieren/Deaktivieren des Skripts wurde von rebuild_userChrome.uc.js von alice0775 ausgeliehen.
// @version 2.0.13 Fx143+
// @version 2.0.12 Fx142+
// @version 2.0.11 Fx139+ / Weitere Korrekturen Erläuterung hinzugefügt
// @version 2.0.10 Fx136+
// @version 2.0.9 toggle / Unterstützt das Umschalten ganzzahliger Werte zwischen 0 und 1 mit Funktionen
// @version 2.0.8 Fx115+
// @version 2.0.7 Entwicklungsmenü
// @version 2.0.6 Es wurde ein Problem behoben, bei dem „Neustart“ per Rechtsklick auf die Schaltfläche nicht funktionierte.
// @version 2.0.5 Fx72beta
// ==/UserScript==
/*
■ createME Über Funktionen
createME('Menütyp', 'Anzeigeetikett', 'Ausführbare Befehle und Funktionen', 'Name zur Angabe des Symbols', 'ID'));
Der Name zur Angabe des Symbols kann beliebig sein, muss aber innerhalb der setIcon-Funktion übereinstimmen.
Sie können die Entsprechung erkennen, indem Sie sich das Standardbeispielmenü und die Funktion setIcon ansehen.
Wenn nicht angegeben, wird das Standard-Favicon angezeigt.
■ edit & open Über Funktionen
Use the 'edit' function to edit files
Use the 'open' function to open a file or folder
Verwenden Sie die Funktion „Umschalten“, um zwischen wahren und falschen Werten zu wechseln (das Umschalten zwischen ganzzahligen Werten von 0 und 1 wird ebenfalls unterstützt).
Das erste Argument jeder Funktion gibt den Basisordner an.
0 = chrome
1 = profile
2 = C:\WINDOWS
3 = C:\Program Files oder C:\Program Files (x86)
4 = Beim Schreiben des vollständigen Pfads im zweiten Argument *Setzen Sie das Pfadtrennzeichen auf \\\\
'C' = Laufwerk C
'D' = Laufwerk D
Das zweite Argument gibt den Datei- oder Ordnernamen im im ersten Argument angegebenen Basisordner an.
Vergessen Sie nicht, es in [] und den Dateinamen (Ordner) in '' einzuschließen.
■ Beispiel für die Bearbeitung von prefs.js im Profilordner
ECM.edit(1, ['prefs.js'])
■ Beispiel für das Öffnen des Chrome-Ordners
ECM.open(0)
■ Beispiel für den Start von Firefox (der dritte Argumentparameter kann weggelassen werden)
ECM.open(3, ['Mozilla Firefox', 'firefox.exe'], '-no-remote')
■ Beispiel für die Aktivierung/Deaktivierung von Javascript
ECM.toggle('javascript.enabled')
■ Informationen zum Ein-/Ausschalten und Bearbeiten des Userchrome-Skripts
Klicken Sie mit der mittleren Maustaste auf ein Skript, um es zu aktivieren oder zu deaktivieren
Bearbeiten Sie das Skript, indem Sie mit der rechten Maustaste klicken
*/
(function () {
'use strict'
const { Preferences } = ChromeUtils.importESModule('resource://gre/modules/Preferences.sys.mjs');
window.ECM = {
editor: 1,
// 1 = Editor in view_source.editor.path festgelegt
// Wenn Sie den vollständigen Pfad zu einem Editor angeben, wird dieser Editor verwendet. *Schließen Sie den Pfad in '' ein und ersetzen Sie \ durch \\.
itemLength: null,
init: function () {
try {
CustomizableUI.createWidget({
id: 'ExtrasConfigMenu',
type: 'custom',
onBuild: function(aDocument) {
const toolbaritem = aDocument.createXULElement('toolbarbutton');
const attributes = {
id: 'ExtrasConfigMenu',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
type: 'menu',
label: 'Extras Config Menu',
image: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACnElEQVR4Xm2RzYtbZRSHn/fr3pvJzTB3qiNM2k2pMBUGhEHaqsUqdeFGQalCobgREaFu/B/cqCtxVSjoQhBEQRBmIfWDKgNGJUPt0Nhah9JJ4iSd5E6+bu5972tAO4SS5/DjXZ1znsMrNiq1eikMQqYYJCmjxNH5+zdW777L0J5KKl9VPmnf+ut9KWkwhbheuzNcOVYOmGKc5iRO0r1ykeXCx0h7kt4fC3z5wfqbQnAJwQHa5S7jAZSRuJ0mkf81cheobhBXZa+ri1uptQjHAZoZCEC1PiPgDuwxCfwerBU7b73zXn//3usCcdt4HkZ7SGZg431U51NUCgwlO3cV/bVXhR/6p9ut+nP9QYeNn7/n8qUPZxvQ/Q6VVWHk4ZqWRvlJjpx9hcGfW2wO95N2q8m3618A2WwDt/0RplSAXsBed57eyossHl5GYdHacG3zGpADM06wjQ1UUIN+CLHPvfAxojPnKLiE+bDE1R9+5GatAmgPeGCAteQ7l5GBhGSyuROyd/gFouUyWkqEErR2mwXAAA8BRS0AgMQBjSra30ZkEeDzz9Dn4ZcvMO51SMcJcTdGChmA0ABA6cAgzyG3I8jLEBylV4fWoaeIc0V7t0Uv7pFbC+CA+28mp/8+SwXKnMVmz1O9HpE+eobMZdjcoY1GIHD/NwIdoH1fBaNguzlg88pVyoUi4vTbFI8eJxsNAIfSkrliESllH/L0v0jktNNomFGv1TFrL3Fo9QSMR3jaEEXzLC09gjaKp595No0WjyCEB4zRclICUMDxtRMce/wJ1MIi2SglXShhfI/cOjxPoZRmbq4gXzt/gVrtBrdvbiG+Wf+p/mvll1BpiVAGhCDPxuAUDotz4HKHlIJON6bRbL4hhPjcMx5mkn8BBLEUrsVZbq0AAAAASUVORK5CYII=',
tooltiptext: 'Extras Config Menu',
oncontextmenu: 'return false'
};
for (var a in attributes) {
toolbaritem.setAttribute(a, attributes[a]);
};
return toolbaritem;
},
onCreated: function(toolbaritem) {
}
});
} catch (e) {};
wait();
ECM.init2();
this.addPrefListener(ECM.readLaterPrefListener);
window.addEventListener('unload', this, false);
let sb = window.userChrome_js?.sb;
if (!sb) {
sb = Cu.Sandbox(window, {
sandboxPrototype: window,
sameZoneAs: window,
});
Cu.evalInSandbox(`
Function.prototype.toSource = window.Function.prototype.toSource;
Object.defineProperty(Function.prototype, 'toSource', {enumerable : false})
Object.prototype.toSource = window.Object.prototype.toSource;
Object.defineProperty(Object.prototype, 'toSource', {enumerable : false})
Array.prototype.toSource = window.Array.prototype.toSource;
Object.defineProperty(Array.prototype, 'toSource', {enumerable : false})
`, sb);
window.addEventListener('unload', () => {
setTimeout(() => {
Cu.nukeSandbox(sb);
}, 0);
}, { once: true });
}
this.sb = sb;
},
init2: function (btn) {
var btn = $('ExtrasConfigMenu');
if (!btn) {
wait();
ECM.init2();
}
btn.addEventListener('click', (event) => ECM.onClick(event));
const mp = btn.appendChild(this.createME('menupopup', 0, 0, 0, 'ecm-popup'));
mp.addEventListener('click', (event) => { event.preventDefault(); event.stopPropagation(); });
mp.addEventListener('popupshowing', (event) => ECM.onpopup(event));
/* ==================== Von hier aus eingestellt ==================== */
//Menü „Werkzeuge“.
mp.appendChild($('tools-menu'));
//Browser-Tools
mp.appendChild($('browserToolsMenu'));
//Freier Browserspeicher
mp.appendChild(this.createME('menuitem', 'Speicher löschen', () => {
const os = Services.obs;
const gMgr = Cc['@mozilla.org/memory-reporter-manager;1'].getService(Ci.nsIMemoryReporterManager);
const parentWindow = Services.wm.getMostRecentWindow('navigator:browser');
os.notifyObservers(null, 'child-gc-request', null);
Cu.forceGC();
os.notifyObservers(null, 'child-cc-request', null);
parentWindow.windowUtils.cycleCollect();
os.notifyObservers(null, 'child-mmu-request', null);
gMgr.minimizeMemoryUsage(() => '');
}));
mp.appendChild(this.createME('menuitem', 'D: Ordner Software leeren', 'ECM.open(4, "D:\\\\Software\\\\löschen.ps1")', '', 0));
mp.appendChild(document.createXULElement('menuseparator'));
//Passwort-Manager
mp.appendChild(this.createME('menuitem', 'Passwort-Manager', 'openTrustedLinkIn("about:logins", "tab");', 'password', 0));
mp.appendChild(document.createXULElement('menuseparator'));
mp.appendChild(this.createME('menuitem', 'Javascript On/Off', 'ECM.toggle("javascript.enabled")', 'pref', 0));
mp.appendChild(this.createME('menuitem', 'Standortintelligenz On/Off', 'ECM.toggle("geo.enabled")', 'pref', 0));
mp.appendChild(this.createME('menuitem', 'Geben Sie den auf der Webseite angegebenen Schriftarten Vorrang', 'ECM.toggle("browser.display.use_document_fonts")', 'pref', 0));
mp.appendChild(document.createXULElement('menuseparator'));
mp.appendChild(this.createME('menuitem', 'userChrome.css', 'ECM.edit(0, ["userChrome.css"])', 'edit', 0));
mp.appendChild(this.createME('menuitem', 'userContent.css', 'ECM.edit(0, ["userContent.css"])', 'edit', 0));
mp.appendChild(document.createXULElement('menuseparator'));
mp.appendChild(this.createME('menuitem', 'prefs.js', 'ECM.edit(1, ["prefs.js"])', 'js', 0));
mp.appendChild(this.createME('menuitem', 'user.js', 'ECM.edit(1, ["user.js"])', 'js', 0));
mp.appendChild(this.createME('menuitem', '_keychanger.js', 'ECM.edit(0, ["_keychanger.js"])', 'edit', 0));
mp.appendChild(document.createXULElement('menuseparator'));
mp.appendChild(this.createME('menuitem', 'Ordner chrome', 'ECM.open(0)', 'folder', 0));
mp.appendChild(this.createME('menuitem', 'Profilordner', 'ECM.open(1)', 'folder', 0));
mp.appendChild(this.createME('menuitem', 'Ordner Scripte', 'ECM.open(0, ["Scripte"])', 'folder', 0));
mp.appendChild(this.createME('menuitem', 'Ordner CSS', 'ECM.open(0, ["CSS"])', 'folder', 0));
//mp.appendChild(this.createME('menuitem', 'UserScriptLoader', 'ECM.open(0, ["UserScriptLoader"])', 'folder', 0));
mp.appendChild(this.createME('menuitem', 'Installationsordner', 'ECM.open(3, ["Mozilla Firefox"])', 'folder', 0));
mp.appendChild(document.createXULElement('menuseparator'));
mp.appendChild(this.createME('menuitem', 'Firefox Update-Bestätigung', 'openAboutDialog();', 'info', 0));
/* ==================== Bisherige Einstellungen ==================== */
this.itemLength = mp.childNodes.length;
},
handleEvent: function (event) {
if (event.type === 'unload') {
window.removeEventListener('unload', this, false);
this.removePrefListener(ECM.readLaterPrefListener);
this.itemLength = null;
}
},
onClick: function (event) {
if (event.button === 1) {
gBrowser.selectedTab = gBrowser.addTrustedTab('about:config');
} else if (event.button === 2) {
event.preventDefault();
Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);
} else {
return;
}
},
edit: function (key, pathArray) {
const path = this.getPath(key, pathArray);
if (this.editor === 1) {
//this.launch(Services.prefs.getCharPref('view_source.editor.path'), path);
this.launch(Services.prefs.getCharPref('C:\\notepad++\\notepad++.exe'), path);
} else {
this.launch(this.editor, path);
}
},
open: function (key, pathArray, arg) {
const path = this.getPath(key, pathArray);
this.launch(path, arg);
},
launch: function (path, arg) {
arg = [arg] || [];
const file = new FileUtils.File(path);
if (!file.exists()) {
return;
}
if (!file.isDirectory()) {
const process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
process.init(file);
process.run(false, arg, arg.length);
} else {
file.reveal();
}
},
getDir: function (key, pathArray) {
let dir;
if (key.indexOf('\\') !== -1) {
dir = new FileUtils.File(key);
} else {
dir = Services.dirsvc.get(key, Ci.nsIFile);
}
if (pathArray != null) {
for (let i = 0, len = pathArray.length; i < len; ++i) {
dir.append(pathArray[i]);
}
}
return dir.path;
},
getPath: function (key, pathArray) {
pathArray = pathArray || [];
let path = '';
switch (key) {
case 0:
path = this.getDir('UChrm', pathArray);
break;
case 1:
path = this.getDir('ProfD', pathArray);
break;
case 2:
path = this.getDir('WinD', pathArray);
break;
case 3:
path = this.getDir('ProgF', pathArray);
break;
case 4:
path = pathArray;
break;
case 'C':
path = this.getDir('C:\\', pathArray);
break;
case 'D':
path = this.getDir('D:\\', pathArray);
break;
}
return path;
},
toggle: function (prefName) {
var pref = Preferences.get(prefName);
var prefType = Services.prefs.getPrefType(prefName);
if (prefType === Ci.nsIPrefBranch.PREF_BOOL) {
Preferences.set(prefName, !pref);
} else if (prefType === Ci.nsIPrefBranch.PREF_INT) {
Preferences.set(prefName, (pref == 1) ? 0 : 1);
}
},
onpopup: function (event) {
var mp = event.target;
if (mp !== event.currentTarget) {
return;
}
for (let i = this.itemLength, len = mp.childNodes.length; i < len; i++) {
mp.removeChild(mp.lastChild);
}
var sep = document.createXULElement('menuseparator');
mp.appendChild(sep);
for (let j = 0, lenj = userChrome_js.arrSubdir.length; j < lenj; j++) {
var dirName = (userChrome_js.arrSubdir[j] == '') ? 'root' : userChrome_js.arrSubdir[j];
var flg = false;
for (var i = 0, len = userChrome_js.scripts.length; i < len; i++) {
var script = userChrome_js.scripts[i];
if (script.dir !== dirName) continue;
flg = true;
break;
}
if (!flg) continue;
var menu = mp.appendChild(document.createXULElement('menu'));
menu.setAttribute('label', 'chrome/' + (dirName == 'root' ? '' : dirName));
menu.dirName = dirName;
var mp = menu.appendChild(document.createXULElement('menupopup'));
// mp.addEventListener('click', event => {event.stopPropagation();});
var flg = false;
for (let i = 0, len = userChrome_js.scripts.length; i < len; i++) {
var script = userChrome_js.scripts[i];
if (script.dir != dirName) continue;
flg = true;
var mi = mp.appendChild(document.createXULElement('menuitem'));
mi.setAttribute('label', script.filename.replace(/\.uc\.js$|\.uc\.xul$/g, ''));
mi.setAttribute('closemenu', 'none');
mi.setAttribute('type', 'checkbox');
mi.setAttribute('autocheck','false');
mi.setAttribute('checked', !userChrome_js.scriptDisable[script.filename]);
if (script.description) {
mi.setAttribute('tooltiptext', script.description);
}
mi.script = script;
mi.addEventListener('command', () => ECM.chgScriptStat(this.script.filename));
mi.addEventListener('click', (event) => ECM.clickScriptMenu(event));
mi.addEventListener('mouseup', (event) => {if (event.button == 1) event.preventDefault()});
}
mp = event.target;
}
},
clickScriptMenu: function (event) {
var target = event.target;
var script = target.script;
var fileURL = Services.io.getProtocolHandler('file').QueryInterface(Ci.nsIFileProtocolHandler).getFileFromURLSpec(script.url);
if (event.button === 1) {
event.stopPropagation();
event.preventDefault();
ECM.chgScriptStat(script.filename);
target.setAttribute('checked', !userChrome_js.scriptDisable[script.filename]);
} else if (event.button === 2) {
event.stopPropagation();
event.preventDefault();
this.edit(4, fileURL.path);
} else { return; }
},
chgScriptStat: function (afilename) {
var s = ECM.getPref('userChrome.disable.script', 'str', '');
if (!userChrome_js.scriptDisable[afilename]) {
s = (s + ',').replace(afilename + ',', '') + afilename + ',';
} else {
s = (s + ',').replace(afilename + ',', '');
}
s = s.replace(/,,/g, ',').replace(/^,/, '');
ECM.setPref('userChrome.disable.script', 'str', s);
userChrome_js.scriptDisable = this.restoreState(s.split(','));
},
restoreState: function (arr) {
var disable = [];
for (var i = 0, len = arr.length; i < len; i++) {
disable[arr[i]] = true;
}
return disable;
},
getPref: function(aPrefString, aPrefType, aDefault){
var xpPref = Services.prefs;
try {
switch (aPrefType){
case 'complex':
return xpPref.getComplexValue(aPrefString, Ci.nsIFile); break;
case 'str':
return unescape(xpPref.getCharPref(aPrefString).toString()); break;
case 'int':
return xpPref.getIntPref(aPrefString); break;
case 'bool':
default:
return xpPref.getBoolPref(aPrefString); break;
}
} catch(e) {}
return aDefault;
},
setPref: function(aPrefString, aPrefType, aValue){
var xpPref = Services.prefs;
try {
switch (aPrefType){
case 'complex':
return xpPref.setComplexValue(aPrefString, Components.interfaces.nsIFile, aValue); break;
case 'str':
return xpPref.setCharPref(aPrefString, escape(aValue)); break;
case 'int':
aValue = parseInt(aValue);
return xpPref.setIntPref(aPrefString, aValue); break;
case 'bool':
default:
return xpPref.setBoolPref(aPrefString, aValue); break;
}
} catch(e) {}
return null;
},
addPrefListener: function (aObserver) {
try {
let pbi = Services.prefs;
pbi.addObserver(aObserver.domain, aObserver, false);
} catch(e) {}
},
removePrefListener: function (aObserver) {
try {
let pbi = Services.prefs;
pbi.removeObserver(aObserver.domain, aObserver);
} catch(e) {}
},
readLaterPrefListener: {
domain: 'userChrome.disable',
observe: function (aSubject, aTopic, aPrefstring) {
if (aTopic === 'nsPref:changed') {
setTimeout(() => {
let s = ECM.getPref('userChrome.disable.script', 'str', s);
userChrome_js.scriptDisable = ECM.restoreState(s.split(','));
}, 0);
}
}
},
setIcon: function(type) {
let icon = '';
switch (type) {
case 'edit':
icon = 'chrome://global/skin/icons/edit.svg';
break;
case 'folder':
icon = 'chrome://global/skin/icons/folder.svg';
break;
case 'password':
icon = 'chrome://browser/skin/login.svg';
break;t
case 'pref':
icon = 'chrome://global/skin/icons/settings.svg';
break;
case 'info':
icon = 'chrome://global/skin/icons/info.svg';
break;
case 'js':
icon = 'moz-icon://.js?size=16';
break;
case 'bat':
icon = 'moz-icon://.bat?size=16';
break;
case 'vbs':
icon = 'moz-icon://.vbs?size=16';
break;
default:
icon = 'chrome://global/skin/icons/defaultFavicon.svg';
break;
}
return icon;
},
createME: function(sTyp, sLabel, sCommand, sImage, sId) {
const ele = document.createXULElement(sTyp);
switch (sTyp) {
case 'menuitem':
ele.setAttribute('label', sLabel);
ele.setAttribute('class', 'menuitem-iconic');
ele.setAttribute('image', encodeURI(this.setIcon(sImage)));
const func = typeof sCommand === 'string' ? (() => {
if (sCommand.trim().startsWith('function')) {
return '(' + sCommand + ').call(this, event)';
}
return sCommand;
})() : '(' + sCommand.toString() + ').call(this, event)';
ele.addEventListener('command', (event) => { Cu.evalInSandbox(func, ECM.sb); }, false);
// if (sClass) ele.classList.add(sClass);
break;
case 'menu':
ele.setAttribute('label', sLabel);
ele.setAttribute('id', sId);
break;
case 'menupopup':
ele.setAttribute('id', sId);
break;
}
return ele;
}
};
window.ECM.init();
function $(id) {
let ele = {};
if (ele[id] == null) {
ele[id] = document.getElementById(id);
}
return ele[id];
}
function wait() {
let start = new Date();
new Date() - start < 1000;
}
}());
Alles anzeigen