Eine Info aus aktuellem Anlass
Danke für die Info. Da hatte ich ja Glück, dass ich meine riesige Lesezeichensammlung vor ein paar Wochen mit der Erweiterung durchleuchtet habe.
Eine Info aus aktuellem Anlass
Danke für die Info. Da hatte ich ja Glück, dass ich meine riesige Lesezeichensammlung vor ein paar Wochen mit der Erweiterung durchleuchtet habe.
Ich war verreist und habe jetzt erst dieses Thema kurz überflogen. Ich weiß nicht, ob meine Version des Skriptes noch gebraucht wird, ich poste sie hier mal.
Ich habe alle Skripte im Unterordner "JS" (der muss natürlich auch in der userchrome.js stehen) und die CSS-Dateien im Unterordner "CSS".
In der Konfiguration des Skripts am Anfang kann man den Skript-Unterordner einstellen (Zeile 19) und drei CSS-Unterordner (ab Zeile 34).
Ich nutze im Moment nur einige der möglichen Funktionen, deshalb kann ich nicht sagen, ob alle in v115 funktionieren. Also die Konfiguration genau durchgehen und ausprobieren. Ich nutze es im aktuellen Fx 115.0.2 unter Windows 10.
// ==UserScript==
// @name extras_config_menu.uc.js
// @compatibility Firefox ab 92
// @include main
// @version........1.0.20180914 Aktualisierung von aborix für Firefox 62+
// @version 1.0.20190504 überarbeitet von bege
// ==/UserScript==
var uProfMenu = {
// Beginn der Konfiguration
// In der folgenden Zeile den Pfad zum Texteditor eintragen (unter Ubuntu 10.04 z.B.: '/usr/bin/gedit'). Bei Fehleintrag wird view_source.editor.path ausgelesen:
TextOpenExe: 'C:\\Program Files\\Notepad++\\notepad++.exe',
// Falls gewuenscht, in der Zeile nach den Beispielen einen Dateimanager eintragen (komplett leer lassen fuer Dateimanager des Systems) Beispiele:
// vFileManager: 'E:\\Total Commander\\Totalcmd.exe',
// vFileManager: 'C:\\Program Files (x86)\\FreeCommander\\FreeCommander.exe'
vFileManager: 'C:\\Program Files\\FreeCommander XE\\FreeCommander.exe',
// Falls die JavaScript-Scripte nicht im chrome-Verzeichnis, sondern einem Unterverzeichnis sind,
// in der folgenden Zeile das Unterverzeichnis eintragen, sonst '':
jsSubfolder: 'JS',
// Im Folgenden bei "warmenuto" 'menu' eintragen, damit es in der Menueleiste erscheint, sonst die id des gewuenschten
// Elements *nach* dem der Button erscheinen soll (z.B. 'urlbar', 'searchbar', 'undoclosetab-button','abp-toolbarbutton')
// Bitte nicht so etwas wie die Menue- oder Navigationsleiste (sondern einen Menuepunkt oder einen Button mit id auf diesen Leisten) eintragen:
warpmenuto: 'menu',
// Für die Einstellung 'menu' wird hier der Ort festgelegt, wo das Menü angezeigt werden soll.
// (0: in der Menueleiste, 1: im Extras-Menue)
menuLocation: 0,
// Unter Linux sollte/kann versucht werden, die userChromeJS-Skripte zu sortieren, unter Windows ist das evtl. nicht noetig (die Sortierung wird Gross- und Kleinschreibung *nicht* beruecksichtigen - dazu wird die sort()-Funktion entsprechend mit einer Vergleichsfunktion aufgerufen)
sortScripts: 0, // 1 zum Erzwingen der Sortierung
// Einbindung GM-Skripte-Ordner (0: nein, 1: Greasemonkey [Profil-Verzeichnis], 2: UserScriptLoader [Chrome-Verzeichnis], 3: Scriptish [Profil-Verzeichnis]):
gmOrdner: 0,
// Einbindung CSS-Ordner (0: nein, 1: ja, Chrome-Unterordner, 2: ja, anderer Pfad):
cssOrdner: 0,
// Wenn cssOrdner = 1 oder 2, hier entweder Chrome-Unterordner (z.B. 'CSS') oder andere vollständige Pfade (z.B. 'C:\\Dropbox\\Chrome\\Thunderbird\\CSS-Ordner\\css-dateien') entragen, sonst '':
cssLocation1: 'CSS',
cssLocation2: '',
cssLocation3: '',
//Anzeigenamen für die CSS-Ordner
cssLocation1Name: 'CSS-Ordner',
cssLocation2Name: 'CSS-Ordner2',
cssLocation3Name: 'CSS-Ordner3',
// In einer der folgenden Zeilen gueltige about:Adressen eintragen, die ebenfalls aufgerufen werden sollen.
// - Zum Ausblenden: abouts: [],
// - Damit die about:-Seiten nicht als Untermenue, sondern direkt als Menuepunkte aufgefuehrt werden, muss das erste Element '0' sein:
// abouts: ['0','about:config','about:about','about:cache','about:certificate','about:checkerboard','about:crashes','about:debugging','about:devtools','about:memory','about:networking','about:performance','about:policies','about:profiles','about:serviceworkers','about:support','about:telemetry','about:url-classifier','about:webrtc'],
// abouts: ['about:config','about:about','about:cache','about:certificate','about:checkerboard','about:crashes','about:debugging','about:devtools','about:memory','about:networking','about:performance','about:policies','about:profiles','about:serviceworkers','about:support','about:telemetry','about:url-classifier','about:webrtc'],
abouts: [],
// Einbindung config-Dateien wie user.js etc. (0: nein, 1: ja)
configFiles: 0,
// Die Firefox-Ordner anzeigen (0: nein, 1: ja):
firefoxOrdner: 0,
// Die normalen Firefox-Einstellungen auch zur Verfuegung stellen (0: nein, 1: ja):
showNormalPrefs: 0,
// Stellt "Skriptliste in Zwischenablage" zur Verfuegung (1: ja, 2: mit getrennter Nummerierung, 3: mit gemeinsamer Nummerierung) oder nicht (0):
enableScriptsToClip: 1,
// Den Eintrag "Neustart" anzeigen (0: nein, 1: ja):
enableRestart: 0,
// Ende der Konfiguration
init: function() {
if (this.warpmenuto.toLowerCase() == 'menu') {
// aufgrund des gewaehlten warpmenuto als Menue anlegen
if (this.menuLocation) {
var zielmenu = document.getElementById('appMenu-toolsView');
} else {
var zielmenu = document.getElementById('main-menubar');
}
if (zielmenu==null) {
userChrome.log("extras_config_menu.uc.js findet Zielmenue nicht, evtl. weil ein anderes Fenster als das Hauptfenster " +
"geoeffnet wurde. Falls dieser Fehler auch im Hauptfenster auftritt, bitte die vorgehende Definition " +
"von 'zielmenu' kontrollieren.");
return;
}
var menu = zielmenu.appendChild(this.createME("menu","Config-Menü",0,0,"ExtraConfigMenu"));
menu.setAttribute("class","menu-iconic");
menu.setAttribute("ondblclick","openTrustedLinkIn('about:config', 'tab');");
menu.setAttribute("tooltiptext","Doppelklick öffnet about:config");
} else {
// als Button nach dem per warpmenuto gewaehlten Element anlegen (s. Kommentar ueber warpmenuto im Konfigurationsabschnitt)
var zielmenu = document.getElementById(this.warpmenuto);
if (zielmenu==null) {
userChrome.log("extras_config_menu.uc.js findet Zielpunkt '"+this.warpmenuto+"' nicht, evtl. weil ein anderes Fenster als das Hauptfenster " +
"geoeffnet wurde. Falls dieser Fehler auch im Hauptfenster auftritt, bitte die vorgehende Definition " +
"von 'warpmenuto' kontrollieren.");
return;
}
var menu = zielmenu.parentNode.insertBefore(document.createXULElement('toolbarbutton'), zielmenu.nextSibling);
menu.setAttribute("id", "ExtraConfigMenu-button");
menu.setAttribute("class", "toolbarbutton-1");
menu.setAttribute("type", "menu");
menu.setAttribute("tooltiptext", "Extra Config Menü\nMittelklick \öffnet about:config");
menu.setAttribute("onclick", "if (event.button === 1 && !this.open) {openTrustedLinkIn('about:config','tab')};");
}
//ab hier ist alles gleich, egal ob Button oder Menue
var css = " \
/* #ExtraConfigMenu, */ #ExtraConfigMenu-button { \
background: 12px no-repeat url(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=) \
} \
// #ExtraConfigMenu .menubar-text { \
// margin-inline-start: 34px !important;\
// }\
#ExtraConfigMenu-button > dropmarker, #ExtraConfigMenu-button > hbox > .toolbarbutton-menu-dropmarker { \
display: none !important; \
}";
var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(css));
sss.loadAndRegisterSheet(uri,sss.AGENT_SHEET);
menu.setAttribute("onpopupshowing","uProfMenu.getScripts(0)");
var menupopup = menu.appendChild(this.createME("menupopup",0,0,0,"ExtraConfigMenu-popup"));
// Anlegen von Untermenues fuer die userChromeJS-Skripte (befuellt werden sie spaeter)
var submenu=menupopup.appendChild(this.createME("menu","uc.js",0,0,"submenu-ucjs"));
var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-ucjs-items"));
// var submenu=menupopup.appendChild(this.createME("menu","uc.xul",0,0,"submenu-ucxul"));
// var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-ucxul-items"));
menupopup.appendChild(this.createME("menuitem","us.js-Datei erstellen","uProfMenu.createJSfile()","uProfMenu_createJSfile",0));
if (this.enableScriptsToClip) menupopup.appendChild(this.createME("menuitem","Skriptliste in Zwischenablage","uProfMenu.getScripts(1)","uProfMenu_clipboard",0));
// Ende Anlegen von Untermenues fuer die userChromeJS-Skripte
if (this.configFiles) menupopup.appendChild(document.createXULElement('menuseparator'));
// Einbindung von Konfigdateien
if (this.configFiles) {
menupopup.appendChild(this.createME("menuitem","userChrome.js","uProfMenu.edit(3,'userChrome.js');","uProfMenu_edit",0));
menupopup.appendChild(this.createME("menuitem","userChrome.css","uProfMenu.edit(3,'userChrome.css');","uProfMenu_edit",0));
menupopup.appendChild(this.createME("menuitem","userContent.css","uProfMenu.edit(3,'userContent.css');","uProfMenu_edit",0));
menupopup.appendChild(this.createME("menuitem","prefs.js","uProfMenu.edit(1,'prefs.js');","uProfMenu_edit",0));
menupopup.appendChild(this.createME("menuitem","user.js","uProfMenu.edit(1,'user.js');","uProfMenu_edit"),0);
};
// Ende Einbindung von Konfigdateien
if (this.gmOrdner || this.cssOrdner) menupopup.appendChild(document.createXULElement('menuseparator'));
// Einbindung von Ordnern
switch (this.gmOrdner) {
case 1:
menupopup.appendChild(this.createME("menuitem","GM-Skripte","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'gm_scripts');","uProfMenu_folder"),0);
break;
case 2:
menupopup.appendChild(this.createME("menuitem","USL-Skripte","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'UserScriptLoader');","uProfMenu_folder"),0);
break;
case 3:
menupopup.appendChild(this.createME("menuitem","Scriptish-Skripte","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'scriptish_scripts');","uProfMenu_folder"),0);
break;
}
if (this.cssOrdner) {
if (this.cssOrdner == 1) {
menupopup.appendChild(this.createME("menuitem",this.cssLocation1Name,"uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+uProfMenu.cssLocation1);","uProfMenu_folder"),0);
if (this.cssLocation2.length>0) {
menupopup.appendChild(this.createME("menuitem",this.cssLocation2Name,"uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+uProfMenu.cssLocation2);","uProfMenu_folder"),0);
};
if (this.cssLocation3.length>0) {
menupopup.appendChild(this.createME("menuitem",this.cssLocation3Name,"uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+uProfMenu.cssLocation2);","uProfMenu_folder"),0);
};
} else {menupopup.appendChild(this.createME("menuitem",this.cssLocation1Name,"uProfMenu.dirOpen(uProfMenu.cssLocation1);","uProfMenu_folder"),0);
if (this.cssLocation2.length>0) {
menupopup.appendChild(this.createME("menuitem",this.cssLocation2Name,"uProfMenu.dirOpen(uProfMenu.cssLocation2);","uProfMenu_folder"),0);
};
if (this.cssLocation3.length>0) {
menupopup.appendChild(this.createME("menuitem",this.cssLocation3Name,"uProfMenu.dirOpen(uProfMenu.cssLocation3);","uProfMenu_folder"),0);
};
}
}
if (this.firefoxOrdner) menupopup.appendChild(document.createXULElement('menuseparator'));
if (this.firefoxOrdner) {
menupopup.appendChild(this.createME("menuitem","Chromeordner","uProfMenu.prefDirOpen('UChrm');","uProfMenu_folder"),0);
menupopup.appendChild(this.createME("menuitem","Profilordner","uProfMenu.prefDirOpen('ProfD');","uProfMenu_folder"),0);
menupopup.appendChild(this.createME("menuitem","Addonordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'extensions');","uProfMenu_folder"),0);
menupopup.appendChild(this.createME("menuitem","Installationsordner","uProfMenu.prefDirOpen('CurProcD');","uProfMenu_folder"),0);
menupopup.appendChild(this.createME("menuitem","Startup-Cacheordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfLD')+uProfMenu.getDirSep()+'startupCache');","uProfMenu_folder"),0);
}
// Ende Einbindung von Ordnern
if (this.abouts.length>0 || this.showNormalPrefs) menupopup.appendChild(document.createXULElement('menuseparator'));
// Einbindung von abouts
if (this.abouts.length>0) {
// falls der erste Eintrag des arrays ='0' ist, dann kein Untermenue anlegen, sondern direkt als Menuepunkte einbinden
if (this.abouts[0]=='0') {
for (var i = 1; i < this.abouts.length; i++) {
menupopup.appendChild(this.createME("menuitem",this.abouts[i],"openTrustedLinkIn('"+this.abouts[i]+"','tab')","uProfMenu_about"),0);
}
} else {
// der erste Eintrag des arrays ist ungleich '0', deshalb als Untermenue einrichten
var submenu=menupopup.appendChild(this.createME("menu","uc.js",0,0,"submenu-about"));
var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-about-items"));
this.fillMenu("submenu-about","submenu-about-items", "about:",this.abouts,"uProfMenu_about",1);
}
};
// Ende Einbindung von abouts
// Falls gewuenscht (s. Konfigurationsabschnitt), Zugriff auf die normalen Einstellungen
if (this.showNormalPrefs) menupopup.appendChild(this.createME("menuitem","Einstellungen","try{openOptionsDialog();}catch(e){openPreferences();}","uProfMenu_prefs"),0);
if (this.enableRestart) menupopup.appendChild(document.createXULElement('menuseparator'));
// Falls enableRestart = 1, Neustart-Menuepunkt zur Verfügung stellen
if(this.enableRestart) menupopup.appendChild(this.createME("menuitem","Neustart",
"Services.appinfo.invalidateCachesOnRestart(); Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit,0);"));
},
getDirSep:function() {
// Betriebssystem nach https://developer.mozilla.org/en/Code_snippets/Miscellaneous ermitteln
var osString = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS;
var dirsep="/";
switch(osString) {
case "WINNT":
dirsep="\\";
break;
case "Linux":
dirsep="/";
break;
case "Darwin":
dirsep="/";
break;
}
return dirsep;
},
edit:function(OpenMode,Filename){
var Path = "";
var dSep = this.getDirSep(); // die Trennzeichen zwischen Ordnern abhaengig vom Betriebssystem machen
switch (OpenMode){
//Current is Chrome Directory or Subfolder
case 0:
if (this.jsSubfolder.length != 0) {
var Path = this.getPrefDirectoryPath("UChrm") + dSep + this.jsSubfolder + dSep + Filename;
} else {
var Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename;
}
break;
//Current is Profile Directory
case 1:
var Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename;
break;
//Current is Root
case 2:
var Path = Filename;
break;
//Current is Chrome Directory
case 3:
var Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename;
break;
}
this.launch(this.TextOpenExe,Path);
},
dirOpen:function(Path){
if (this.vFileManager.length != 0) {
var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
var args=[Path];
file.initWithPath(this.vFileManager);
process.init(file);
// Verzeichnis mit anderem Dateimanager oeffnen
process.run(false, args, args.length);
} else {
// Verzeichnis mit Dateimanager des Systems oeffnen
var dir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
dir.initWithPath(Path);
dir.launch();
}
},
prefDirOpen:function(prefDir){
Path = this.getPrefDirectoryPath(prefDir);
this.dirOpen(Path);
},
getPrefDirectoryPath:function(str){
// get profile directory
var file = Components.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties)
.get(str, Components.interfaces.nsIFile);
// folgende 3 Zeilen nur für Firefox, nicht für Thunderbird
if (str == 'CurProcD') {
file = file.parent;
};
return file.path;
},
launch:function(RanPath,OpenPath){
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
var proc = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
var args = [OpenPath];
file.initWithPath(RanPath);
// falls der im Konfigurationsabschnitt definierte Editor nicht gefunden wird, auf Einstellung in about:config ausweichen:
if (!file.exists()) {
var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
RanPath=pref.getCharPref("view_source.editor.path");
file.initWithPath(RanPath);
}
proc.init(file);
proc.run(false, args, args.length);
},
stringComparison:function(a, b){
a = a.toLowerCase();
a = a.replace(/ä/g,"a");
a = a.replace(/ö/g,"o");
a = a.replace(/ü/g,"u");
a = a.replace(/ß/g,"s");
b = b.toLowerCase();
b = b.replace(/ä/g,"a");
b = b.replace(/ö/g,"o");
b = b.replace(/ü/g,"u");
b = b.replace(/ß/g,"s");
return(a==b)?0:(a>b)?1:-1;
},
getScripts:function(iType) {
// Arrays (jeweils ein Array fuer uc.js und uc.xul) nehmen Namen der gefundenen Skripte auf
let ucJsScripts = [];
// let ucXulScripts = [];
// Suchmuster, also die Dateierweiterungen uc.js und uc.xul
let extjs = /\.uc\.js$/i;
// let extxul= /\.uc\.xul$/i;
let aFolder = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
if (this.jsSubfolder.length != 0) {
aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path+uProfMenu.getDirSep()+this.jsSubfolder);
} else {
aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path);
};
// files mit Eintraegen im Chrome-Ordner befuellen
let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
// Ordner bzw. files durchlaufen und kontrollieren, ob gesuchte Dateien dabei sind
while (files.hasMoreElements()) {
let file = files.getNext().QueryInterface(Ci.nsIFile);
// keine gewuenschte Datei, deshalb continue
if (!extjs.test(file.leafName) /* && !extxul.test(file.leafName) */) continue;
// uc.js gefunden -> im Array ablegen
if (extjs.test(file.leafName)) ucJsScripts.push(file.leafName);
// uc.xul gefunden -> im Array ablegen
// if (extxul.test(file.leafName)) ucXulScripts.push(file.leafName);
}
if (this.sortScripts) {
ucJsScripts.sort(this.stringComparison);
// ucXulScripts.sort(this.stringComparison);
}
// Aufruf der naechsten Methoden um die beiden Untermenues oder die Zwischenablage zu befuellen
if (iType==0) {
this.fillMenu("submenu-ucjs","submenu-ucjs-items", "uc.js",ucJsScripts,"uProfMenu_ucjs",0);
// this.fillMenu("submenu-ucxul","submenu-ucxul-items", "uc.xul",ucXulScripts,"uProfMenu_ucxul",0);
} else {
var result=this.fillClipboardValue(ucJsScripts/* ,ucXulScripts */);
Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(result);
}
},
fillMenu:function(whichsubmenu, whichsubmenuitems, strlabel, scriptArray,sClass,sTyp) {
// Beschriftung des Untermenues mit Anzahl der gefundenen Dateien ergaenzen
var e = document.getElementById(whichsubmenu);
e.setAttribute('label',strlabel + ' (' + scriptArray.length + ')');
var popup = document.getElementById(whichsubmenuitems);
// zunaechst Untermenue zuruecksetzen
while(popup.hasChildNodes()){
popup.removeChild(popup.firstChild);
}
// Untermenue endlich befuellen
for (var i = scriptArray.length-1; i > -1; i--) {
// bisher nur eine Typunterscheidung (userChromeJS-Skript oder about:)
if (sTyp==0){
var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(0,'"+scriptArray[i]+"')",sClass,0);
mitem.setAttribute("onclick","uProfMenu.openAtGithub(event,'"+scriptArray[i]+"')");
mitem.setAttribute("tooltiptext"," Linksklick: Bearbeiten,\n Mittelklick: https://github.com/.../"+this.cleanFileName(scriptArray[i])+" oeffnen,\n Rechtsklick: Suche auf GitHub");
} else {
var mitem = this.createME("menuitem",scriptArray[i],"openTrustedLinkIn('"+scriptArray[i]+"','tab')",sClass,0);
}
popup.insertBefore(mitem, popup.firstChild);
}
},
fillClipboardValue:function(sArray/* ,xArray */) {
var retValue;
var s = 0;
// var x = 0;
s = sArray.length;
// x = xArray.length;
switch(this.enableScriptsToClip) {
case 1:
retValue = "userChromeJS/uc.js ("+s+"):\n------------------------\n"+sArray.join("\n");
// "\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------\n"+xArray.join("\n");
break;
default:
retValue = "userChromeJS/uc.js ("+s+"):\n------------------------";
for (var i = 0; i < s ; i++) {
j = i + 1;
retValue = retValue + "\n" + j + ". " + sArray[i];
}
// retValue = retValue + "\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------";
// if (this.enableScriptsToClip==2) s = 0;
// for (var i = 0; i < x ; i++) {
// j = i + s + 1;
// retValue = retValue + "\n" + j + ". " + xArray[i];
// }
break;
}
return retValue;
},
createME:function(sTyp,sLabel,sCommand,sClass,sId) {
// Anlegen von menuitem, menu oder menupop - fuer bestimmte Typen nicht eingesetzte Parameter werden als 0 uebergeben
const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
var m = document.createElementNS(XUL_NS, sTyp);
switch (sTyp) {
case "menuitem":
// this.createME("menuitem","Label des Items","ZuzuweisenderCodeFueroncommand","GewuenschteKlasseDesItems",0)
m.setAttribute('label', sLabel);
m.setAttribute('oncommand',sCommand);
m.setAttribute('class',sClass);
break;
case "menu":
// this.createME("menu","Label des Menues",0,0,"GewuenschteIdDesMenues")
m.setAttribute('label', sLabel);
m.setAttribute('id', sId);
break;
case "menupopup":
//this.createME("menupopup",0,0,0,"GewuenschteIdDesMenupopups");
m.setAttribute('id', sId);
break;
}
return m;
},
openAtGithub:function(e,sScript) {
if (e.button==1){
// Mittelklick - Seite auf GitHub oeffnen (funktioniert nur, wenn Ordner- und bereinigter Dateiname [ohne Erweiterung] uebereinstimmen):
e.preventDefault();
var sUrl="https://github.com/Endor8/userChrome.js/tree/master/"+this.cleanFileName(sScript);
openWebLinkIn(sUrl, 'tab');
}
if (e.button==2){
// Rechtsklick - Suche auf GitHub starten (funktioniert nur, wenn der Dateiname im Code hinterlegt ist):
e.preventDefault();
var sUrl="https://github.com/search?langOverride=&language=&q="+this.cleanFileName(sScript)+"&repo=&start_value=1&type=Code";
openWebLinkIn(sUrl, 'tab');
}
},
createJSfile: function(Filename) {
if (!Filename) Filename = prompt("Name des Skripts", "skriptName");
if (Filename) Filename = Filename.replace(/\s+/g, " ").replace(/[\\/:*?\"<>|]/g, "");
if (!Filename || !/\S/.test(Filename)) return;
if (!/\.uc.js$/.test(Filename)) Filename += ".uc.js";
this.edit(0, Filename);
},
cleanFileName:function(sName) {
sName=sName.toLowerCase();
/* Das folgende Array enthaelt regulaere Ausdruecke, um ungueltige Zeichenfolgen entfernen:
/Datei-Erweiterungen am Ende/, /"ucjs_" am Anfang/, /"_"gefolgtVonZahlUndDanachBeliebigenZeichen/
/ "_fx"gefolgtVonZahl(en)/, /"-" oder "+" oder "."/, /"_v"gefolgtVonZahlen
*/
var regs=[/\.uc\.js$/,/\.uc\.xul$/,/^ucjs_/,/_\d.+/,/_fx\d+/,/[-+\.]/g,/_v\d+/];
for (var i = 0; i < regs.length; i++) {
sName=sName.replace(regs[i],"");
}
return sName;
}
};
uProfMenu.init();
Alles anzeigen
Ich würde die Listen nicht dauerhaft deaktivieren. Im fortgeschrittenen Modus von uBlock (Einstellungen, ganz unten) kann man für jede Domain die Blockierungen detaillierter ein- und ausschalten. Damit kriege ich solche Probleme meist in den Griff.
Dass eine Seite gar nicht angezeigt wird, liegt hier manchmal auch am Filter bzw. der eigenen Erweiterung "I don't care about Cookies". Die muss ich dann für die Seite deaktivieren.
Hallo,
seit ein paar Tagen haben wir auf unseren Familien-PC's das Problem, dass manche websites gar nicht oder nur teilweise geöffnet werden oder es dauert extrem lange bis sie vollständig dargestellt werden. Das ist aber nicht bei allen websites so. Wir haben auf allen PC's den Cache und die Cookies gelöscht. Einen Speedcheck der Internetverbindung zeigt volle Geschwindigkeit (100 up, 40 down, ping 13ms). Kopiere ich die url wenn Firefox endlos lange benötigt und öffne sie z.B. in Chrome oder edge wird die Seite dort umgehend geladen während FF immer noch rödelt. Klickt man dann auf das X zum Abbruch des Ladens und danach auf Neuladen kann es sein, dass die Seite sofort aufgebaut wird oder eben wieder in die Warteschleife geht. Ich kann also keinen nachvollziehbaren Grund finden.
Gibt es die Probleme nur bei uns oder hat jemand dasselbe Problem?
Bei mir tritt das schon lange vor der Version 111 auf, ich habe nur die Windows-eigene Firewall und Virenschutz. Ich gehe davon aus, dass es an einer Fx-eigenen Datenschutzfunktion, einer oder mehreren Erweiterungen oder Kombinationen davon liegt. Ausführlich durchgetestet habe ich das bisher nicht.
aborix hatte mir ein Skript geschrieben, mit dem allen Menüeinträgen wieder die Class .menu-iconic oder .menuitem-iconic zugewiesen wurde.
Das Skript würde ich gerne mal testen...
setTimeout(function() {
var ucjsAC = {
init : function () {
const menu = document.querySelectorAll('menu');
menu.forEach(query => query.classList.add('menu-iconic'));
const menuitem = document.querySelectorAll('menuitem');
menuitem.forEach(query => query.classList.add('menuitem-iconic'));
},
}
ucjsAC.init();
}, 5000);
Alles anzeigen
Das funktioniert nur für Menüeinträge, die beim Start des Fx vorhanden sind. Vereinzelt erstellen Erweiterungen sie erst später, da funktioniert es nicht.
Den Code habe ich mal etwas angepasst, und bemerke keinerlei Probleme mit der :is Version.
CSS Alles anzeigenmenupopup menuitem.menuitem-iconic { margin-left: -6px; } menupopup :is(menu,menuitem):not(menuitem.menuitem-iconic):before { color: transparent !important; content: -moz-label-content; height:16px; width:16px; margin-right: 6px; margin-left: -4px; } #context-openlinkintab:before, #context-inspect-a11y:before, #context-inspect:before, #context-bookmarklink:before { background-image: url("file:///C:/Users/Andi/Icons%20Firefox/mosaic.png"); background-position: -430px -144px; } #context-viewimage:before { background-image: url("file:///C:/Users/Andi/Icons%20Firefox/mosaic.png"); background-position: -96px -144px; } #context-copylink:before { background-image: url("file:///C:/Users/Andi/Icons%20Firefox/mosaic.png"); background-position: -80px -144px; } #context-saveimage:before { background-image: url("file:///C:/Users/Andi/Icons%20Firefox/mosaic.png"); background-position: -130px -144px; }
Evtl. kann Sören ja genaueres dazu sagen, ob das per :is keine gute Lösung in diesem Fall ist.
Das macht mich auf einen Unterschied zu meinem bisherigen Code aufmerksam. aborix hatte mir ein Skript geschrieben, mit dem allen Menüeinträgen wieder die Class .menu-iconic oder .menuitem-iconic zugewiesen wurde. Dadurch habe ich nur list-style-image und -moz-image-region im CSS-Code benötigt, kein background und :before oder sonst etwas.
Jetzt bleibt also nur entweder das komplett umzubauen, oder eben doch die mosaic.png in einzelne Dateien aufzuspalten.
zusammenfassen kann
Z.B. so:
CSS Alles anzeigen:is(menu,menuitem):before { color: transparent !important; content: -moz-label-content; height:16px; width:16px; margin-right: 6px; margin-left: -8px; } #context-bookmarklink:before { background-image: url("file:///C:/Users/Andi/Icons%20Firefox/mosaic.png"); background-position: -430px -144px; } #context-viewimage:before { background-image: url("file:///C:/Users/Andi/Icons%20Firefox/mosaic.png"); background-position: -96px -144px; } #context-copylink:before { background-image: url("file:///C:/Users/Andi/Icons%20Firefox/mosaic.png"); background-position: -80px -144px; } #context-saveimage:before { background-image: url("file:///C:/Users/Andi/Icons%20Firefox/mosaic.png"); background-position: -130px -144px; }
Großartig, vielen Dank.
Z.B. so:
Genau. Wobei hier vermutlich statt menu,menuitem besser mit den IDs der Kontextemenüeinträge zu hantieren wäre.
Auch dir vielen Dank für die Vorarbeit. Wenn ich den CSS-Code der alten CuteMenus-Erweiterung nutze, wäre das ansprechen jeder ID wegen der vielen IDs nicht umsetzbar. Ich werde mir das mit etwas Muße mal anschauen und dann sehen, welcher Weg der einfachste ist.
Alles anzeigenNaja, anpassen musst du jetzt so oder so, auf die eine oder die andere Weise.
Ab voraussichtliich Anfang Juli nicht mehr.
Bei dem Beispiel kann ich leider nicht direkt helfen. Da geht es um ein Kontextmenü und ich nutze macOS. Auf macOS werden die nativen Kontextmenüs des Betriebssystems genutzt, die können nicht via CSS angepasst werden. Aber um das mal etwas zu skizzieren:
Mit einer Einzelgrafik kannst du einfach list-style-image überschreiben und die Zeile mit -moz-image-region entfernen. Fertig. Du musst dir null Gedanken über irgendwelche Koordinaten machen.
Für ein Image Sprite musst du zusätzlich dazu, list-style-image und -moz-image-region zu entfernen, background-image definieren, background-size mit der Größe des Bildes und background-position mit den Start-Koordinaten, die anders angegeben werden als bei -moz-image-region. Möglicherweise brauchst du noch background-repeat. Im einfachsten Fall musst du noch width und height mit den Abmessungen der einzelnen Grafik angeben. Nur kann es je nach Element sein, dass du dieses damit verkleinerst, was unerwünscht wäre. Dann müsste man einen Teil des Codes in ein Pseudoelement (::before oder ::after) geben, welches man dann vermutlich absolut positionieren würde, was wiederum über ein halbes Dutzend weiterer Zeilen CSS bringt.
Der Vorteil von Image Sprites ist eigentlich nur, dass man Dateigröße und die Anzahl benötigter Anfragen einsparen kann. Ein Gewinn der Dateigröße existiert aber halt auch nur, wenn man wirklich zumindest annähernd alle Icons verwendet. Und die Anzahl an Anfragen spielt heute im Web keine große Rolle mehr und im Kontext der Browseroberfläche sowieso nicht.
Wenn man sowieso nur zwei Grafiken kombiniert (beispielsweise normal und :hover), kann ein Image Sprite eine elegante Lösung sein, auch weil der Aufwand überschaubar bleibt. Im :hover-Beispiel vermeidet man damit außerdem ein Flackern, wenn die :hover-Grafik noch nicht im Cache ist, wofür man sonst einen Workaround bräuchte, der wiederum mehr Zeilen CSS benötigt. Aber in diesem Fall glaube ich wirklich, dass man sich mit den Einzelgrafiken einen größeren Gefallen tut, weil die Bilddatei erstens so viel Unbenutztes beinhaltet und damit unnötig Ressourcen beansprucht, zweitens weil die Anpassung sehr viel einfacher ist und man nicht für jede Grafik einzeln die Position abmessen muss.
Vielen Dank. 👍 Na, dann kann ich mich ja an die Arbeit machen.
Das ist richtig. Das macht es von der Anpassung her aber auch wesentlich komplizierter, weil du mehr CSS benötigst und ganz andere Positionsangaben benötigst. Die Grafik zurechtzuschneiden und einzubinden, ist da definitiv einfacher. Ich wollte mit meiner Aussage auch nur darauf hinaus, dass es technisch kein Muss ist, Einzelgrafiken zu erstellen. Der bessere Weg ist das nicht unbedingt, vor allem wenn das Image Sprite wie in diesem Fall aus mehreren hundert (!) Icons besteht, von denen sehr wahrscheinlich nur wenige überhaupt benutzt werden. Die Anwendungsfälle, bei denen Mozilla auf background-image umgestellt hat, waren bei weitem nicht so komplex.
Ich nutze für die Symbole immer noch den CSS-Code der Uralt-Erweiterung CuteMenus, die tatsächlich viel mehr Code und Grafiken enthält, als benötigt werden. Nur erspart mir das eine Menge Arbeit, weil ich nicht selbst für jeden Menüeintrag den Code erstellen muss. Und in Thunderbird funktioniert es auch noch. Wenn ich das Image Sprite aufteile, habe ich auch eine Menge Arbeit, um den Code anzupassen.
Könntest du mir für obiges Beispiel den Code angeben, wenn ich das Image Sprite behalten will? Dann kann ich sehen, welche Änderung weniger Arbeit macht.
Z.B. so:
CSS Alles anzeigen#context-viewimage::before { background: url("file:///C:/Users/Andi/Icons%20Firefox/4.jpg")!important; margin-right: 8px !important; margin-left: -6px !important; content: '' !important; display: block !important; width: 16px !important; height: 16px !important; background-repeat: no-repeat !important; background-position: 0px 0px !important; }
D.h., du musst jetzt ein einzelnes Icon dafür nehmen.
Das habe ich kapiert. Aber diese Aussage von Soeren
ZitatDie andere Option, Einzelgrafiken aus solchen Mehrfachgrafiken zu machen, wie Aris es getan hat, geht natürlich auch, ist aber auch nicht zwingend notwendig
aus RE: Entwicklung Firefox verstehe ich so, dass ich weiterhin die große Datei verwenden kann.
wie ich -moz-image-region ersetzen muss
Dazu gibt es schon einen Thread incl. Beispielen und Erklärungen:
BeitragRE: -moz-image-region entfällt
[…]
[…]
Um keine Missverständnisse aufkommen zu lassen: list-style-image kann sehr wohl weiterhin genutzt werden, nur ab Firefox 112 nicht mehr mit sogenannten Sprite-Grafiken, das sind diese Grafiken, die aus mehreren Teilbildern bestehen (für die Suchmaschine: „CSS sprites“; im SelfHTML-Wiki: Sprites-Tutorial).
Aris hat für seine Sammlung CustomCSSforFx genau die Lösung gewählt, die Sprites in ihre Teilgrafiken zu zerlegen und letztere jetzt einzeln anzusprechen.
[…]
Ohne es mir im Detail…
Speravir2. März 2023 um 23:56
Dankeschön. Ich habe beide Threads gelesen und verstehen immer noch nicht, wie ich den obigen Code mit background-image und background-position ersetzten kann. Kannst du mir das an dem obigen Beispiel zeigen?
Ein konkretes Beispiel würde es einfacher machen. Den Selektor finde ich im Quellcode von Firefox nicht und die Grafik bitte auch anhängen.
Zweiter Versuch:
(Grafik in neuem Tab öffenen)
Weil hier und auch im GitHub-Issue clip-path erwähnt wurde: Der Zusammenhang zu -moz-image-region ist vor allem, dass auf dessen MDN-Seite erwähnt wird, dass die Syntax ähnlich zu clip ist, was wiederum zu Gunsten von clip-path nicht länger verwendet werden soll. Der naheliegende Ersatz für -moz-image-region, weil viel unkomplizierter, ist in vielen Fällen aber ganz einfach die Umsetzung als background. So hat es Mozilla beispielsweise hier gemacht:
https://hg.mozilla.org/mozilla-central/rev/d8e1a8bee539
Die andere Option, Einzelgrafiken aus solchen Mehrfachgrafiken zu machen, wie Aris es getan hat, geht natürlich auch, ist aber auch nicht zwingend notwendig und hat nach seinen eigenen Angaben die Dateigröße um 40 Prozent vergrößert, was ich für einen ziemlich starken Anstieg halte, falls das wirklich nur darauf zurückzuführen ist (womit die Gesamtgröße natürlich immer noch überschaubar ist und das kein Problem oder dergleichen darstellt, also alles gut). Die Austauschbarkeit ist bei Einzelgrafiken sicherlich einfacher. Die Wartbarkeit höher als die Dateigröße zu gewichten, ist auch vollkommen legitim.
Ich habe noch nicht verstanden, wie ich -moz-image-region ersetzen muss, wenn ich eine Datei mit vielen Symbolen nicht in einzelne Dateien aufspalten will. Wie muss dann der neue Code für dieses Beispiel aussehen?
Man ersetze alle collapsed durch hidden, dann sollte es wieder funktionieren.
Funktioniert. Danke.
Habe Dich verewigt und einen Link hierher gesetzt.
Danke allen, die daran beteiligt waren.
Wenn ich ein Schlagwort eingeben will, wird nach dem ersten Buchstaben das erste vorhandene Schlagwort mit diesem Anfangsbuchstaben eingefügt und hervorgehoben. Das führt dazu, dass mit dem zweiten eingegebenen Buchstaben der erste wieder weg ist.
Lösche ich alles und gebe nochmal den ersten Buchstaben ein, werden nur die folgenden Buchstaben hervorgehoben und man bekommt immer die passenden vorhandenen Schlagwörter angezeigt. So sollte es gleich zu Beginn sein.
Wie muss das Skript geändert werden, damit es gleich beim ersten Tippen richtig funktionert?
Edit:
In Aris' Version https://github.com/Aris-t2/Custom…_expanded.uc.js funktioniert das Schlagwörter-Feld, aber es fehlt das Schlüsselwort-Feld. Beim Vergleichen der Skripte schwirrt mir der Kopf, ich hoffe, jemand von euch findet den Haken.
Sorry, wenn ich mich hier mein "einklinke" - Wer bestimmt eigentlich die Reihenfolge in dem Erweiterungsmenü und die Anzahl der angezeigten Erweiterungen?
Bei mir stehen oben diejenigen, die ich vorher im Überhangmenü hatte, darunter alle anderen alphabetisch.
Wer bestimmt eigentlich die Reihenfolge
Mozilla
In Zukunft werden die aber verschiebbar sein.
Wenigstens etwas, das zur Übersichtlichkeit beiträgt.
Alles anzeigenHabe ich etwas übersehen oder falsch verstanden
Die sind jetzt alle in dem neuen Button oben rechts für Erweiterungen.
Wenn nicht, sieh mal im Anpassenfenster nach.
das Überhangmenü tatsächlich nicht mehr für Addon-Buttons verwendet werden
Richtig.
Siehe bitte auch mal hier:
BeitragAddons-icon verstecken/entfernen
kann ich dieses "puzzleteil" icon, das zum anzeigen und verwalten der addons hinzugefügt wurde, irgendwie los werden?
Es gibt ka schon im Anwendungsmenü den Bereich Addons und themes, über den ich alles machen kann, dieses neue icon finde ich komplett unnötig. Ich kann es über "Symbolleiste anpassen" aber leider nicht verschieben. Gibt es es vielleicht eine Möglichkeit über about:config ?
Thaliel18. Januar 2023 um 03:31 So sieht das dann für die Zukunft aus:
Danke für die prompte Antwort.
Jetzt habe ich also zwei "Überhangmenüs", eins für Firefox-Funktionen und eines für Addons und kann nicht nur die Addon-Buttons darin anzeigen lassen, die ich ab und zu brauche, sondern muss durch alle nicht angezeigten Addon-Buttons scrollen. Schade, finde ich sehr umständlich.
Hallo,
nach dem Update auf Fx109.0 sind alle Addon-Button aus dem Erweiterungsmenü verschwunden und auch im Pool von "Symbolleiste anpassen" gibt es keine Addon-Button mehr und es können auch keine mehr dorthin verschoben werden. Das Hinzufügen geht nur über den neuen Addon-Button. Die vorhandenen Buttons können auch nicht mehr ins Überhangmenü verschoben werden, sondern nur noch per Klick auf "an Symbolleiste anheften" entfernt werden.
Habe ich etwas übersehen oder falsch verstanden, oder kann das Überhangmenü tatsächlich nicht mehr für Addon-Buttons verwendet werden, die man nicht so oft braucht? Das würde bedeuten, dass ich alle Buttons in einer Symbolleiste anzeigen muss, was Platzverschwendung und unübersichtlich wäre.
Ich hatte damit schon länger noch ein anderes Problem. Wenn ich ein Stichwort eingeben wollte, sprang der Cursor nach dem ersten Buchstaben in das Feld für den Namen des Lesezeichens und löschte mit dem zweiten eingegebenen Buchstaben den dortigen Inhalt.
Deshalb sage ich erstmal vielen Dank für die Hilfe und überlege weiter.
Ich nutze die Erweiterung auch und ich weiß keine Lösung für deine Frage. Aber die Erweiterung setzt doch ein Symbol in die Adressleiste, das genau diese Funktion hat: Ein Klick und die Seite ist gespeichert. Hat es einen bestimmten Grund, dass du das über das Kontextmenü und nicht über dieses Symbol machen willst?