bis auf Cookies nichts bewirkt, und dafür habe ich schon was anderes.
OT: Was nutzt du?
diese Erweiterung steinalt ist weil re-signed, da wurde in den letzten 5 Jahren nichts dran verändert.
Ich nutze das hier, ist "erst" 4 Jahre alt.
bis auf Cookies nichts bewirkt, und dafür habe ich schon was anderes.
OT: Was nutzt du?
diese Erweiterung steinalt ist weil re-signed, da wurde in den letzten 5 Jahren nichts dran verändert.
Ich nutze das hier, ist "erst" 4 Jahre alt.
Wärst Du so lieb und würdest noch einmal testen?
Hast du es selber getestet? Jetzt wird im Hilfemenü alles drei mal geöffnet.
Du hast jetzt wohl eine Kombination aus den zwei Versionen des AppMenu_edit gemacht, damit die beiden Menüs vollständig sind. Damit werden die Menüs aus Skripten nicht automatisch mit verschoben. Das Menü von extra-config-menu ist ganz verschwunden. Die Firefox-Menüs werden jetzt nicht kopiert, sondern verschoben. Bis auf die Menüs aus Skripten ist die Menüleiste leer und die Alt-Taste zum anzeigen der Menüleiste funktioniert nicht mehr.
Mir ist das zu umständlich. In meiner Version funktioniert alles, was ich brauche. Wenn Jizz (wer ist das?) bereit ist, die Fehler zu überarbeiten, bin ich gern bereit, nochmal zu testen. Für uns "Bastler" scheint mir das zu kompliziert.
Meine Version sieht so aus, davon gibt es aber noch andere Versionen in diesem Forum. Bei Endor wird es sicher auch eine Version geben.
// ==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: 3,
// 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
Das Menü des Skripts "extra-config-menu.us.js" funktioniert nicht mehr.
Das funktioniert hier einwandfrei.
Ich habe es als Menü in der Menüleiste und verschiebe es auch mit AppMenu_edit ins AppMenu. Dort funktioniert es nicht mehr.
Und hier das zweite, um die Menüs der Menüleiste zu spiegeln (klonen):
Danke für deine Nachricht. Zwar ist jetzt das Untermenü "Ansicht/Symbolleisten" vollständig, aber es treten diese Probleme auf:
Bei mir ist mit diesem Skript das Hilfemenü unvollständig ("Seitenproblem melden" und "Betrügerische Website melden" fehlen). Das gleiche gilt für das Menü "Extras" und dessen Untermenü "Browser-Werkzeuge".
Im Hilfemenü wird alles doppelt geöffnet.
Das Menü des Skripts "extra-config-menu.us.js" funktioniert nicht mehr.
Wenn du auf dem ublock-Button allerdings das Auge ausge-x-t siehst, dann sind solche kosmetischen Filter nicht wirksam.
Au Mann, das wars! Echt peinlich, dass ich das nicht gefunden habe. 🙈Zum Glück habe ich nicht noch Stunden lang weiter gesucht, sondern hier gefragt. Vielen Dank!
Nachtrag - auch der Filter bei DDG funktioniert bei mir, allerdings solltest du nicht dieses Tag nehmen, sondern jenes:
duckduckgo.com##a[href*="camp-firefox.de"]:upward(li[data-layout="organic"])
Warum meinst du das?
Ich nutze schon lange uBlock Origin, um Suchergebnisse von nervigen Websites auf duckduckgo.com und startpage.com auszublenden.
Das hat so lange funktioniert, bis dort die class-Namen geändert wurden. Das habe ich jetzt wieder angepasst, aber jetzt funktioniert es nur noch auf duckduckgo.com und nicht mehr auf startpage.com.
Hier zwei Beispiele aus dem Tab "Meine Filter":
duckduckgo.com##a[href*="file.net"]:upward(.wLL07_0Xnd1QZpzpfR4W)
startpage.com##a[href*="file.net"]:upward(.result)
Ich habe alles mögliche probiert: eu.startpage.com, weil ich diese URL nutze, mit den zwei classes experimentiert, die dem Suchergebnis-div zugeordnet sind - hat alles nichts genützt.
Wo liegt der Fehler?
Beim Verschieben des Menüs "Ansicht"
in das mit Appmenu.uc.js erstellte Firefox-Menü RE: userChrome.js Scripte für den Fuchs (Diskussion) verschwinden im Untermenü "Symbolleisten" die ersten beiden Menüeinträge.
Mir ist aufgefallen, dass diese beiden Einträge das Attribut toolbarId haben, was die anderen Menüeinträge auch anderer Menüs nicht haben. Hängt das damit zusammen?
menuitem label="Menüleiste" id="toggle_toolbar-menubar" toolbarId="toolbar-menubar"
menu label="Lesezeichen-Symbolleiste" id="toggle_PersonalToolbar" toolbarId="PersonalToolbar"
Fällt dir ein Workaround ein, um diese Menüeinträge auch im verschobenen Menü angezeigt zu bekommen?
Edit: Diese beiden Einträge werden in "https://searchfox.org/mozilla-centra…menubar.inc#125 im Ansicht-Menü gar nicht definiert! Sie tauchen auch an an anderen Stellen in der Benutzeroberfläche mit der gleichen ID auf. Und die IDs scheinen auch nicht fest definiert zu sein, sondern z.B. in einer solchen Codezeile https://searchfox.org/mozilla-centra…-places.js#1463
Ich konnte nicht herausfinden, wo und wie diese Menüeinträge und ihre IDs definiert werden.
Hm, da fällt mir nichts ein. Hier funktioniert alles, bis auf Ansicht/Symbolleiten. Da fehlen nach dem Verschieben die ersten zwei Einträge, das war mir noch nicht aufgefallen. Das könnte allerdings auch ein älterer Fehler sein, weil ich das Menü kaum nutze.
Du hast das browser-menubar.uc.js mit den drei Änderungen genommen? Hast du ins Log geschaut, ob es geladen wird und keinen Fehler hat?
Kannst Du bitte mal auf das oder die Skripte verlinken? Besonders jenes, welches es fertigbringt, alle Menüs aus der Menüleiste in das Appmenü zu verschieben. Bitte.
Das Skript zum Verschieben kennst du schon. Und das zusätzliche, das die verschobenen Menüs wieder funktionsfähig macht, ist hier RE: userChrome.js Scripte für den Fuchs (Diskussion)
(Chronik und Lesezeichen verschiebe ich nicht, die öffne ich über Buttons.)
Wie würdet Ihr Euch so ein zusätzliches Menü vorstellen und welche Funktionen sollte es präsentieren?
Ich nutze das "alte" aktualisierte AppMenu.uc.js wie im anderen Thema besprochen und es enthält das, was ich so nutze. Nachdem das Verschieben der Menüs aus der Menüleiste in dieses Menü nun auch wieder klappt, brauche ich nichts anderes.
...
Das ist eine Folge dieser Änderung:
https://bugzilla.mozilla.org/show_bug.cgi?id=1893068
Vielleicht geht es schöner, aber das Einfachste ist, wir duplizieren etwas Code. Füge im zweiten Script in Zeile 33 (also da, wo jetzt eine leere Zeile ist) Folgendes ein:
...
Nochmal Danke für diesen Tipp. Ohne den wäre ich aufgeschmissen gewesen.
Wenn nach einem Update etwas mehr nicht funktioniert, ist es für mich einfacher das ganze Skript zu kopieren, anstatt es in einem der Skripte "AppMenu.uc.js oder "AppMenu_edit.uc.js" nachzubauen und nach Änderungen zu suchen. Deshalb habe ich das Skript als eigenes uc.js-Skript angelegt.
Das Skript ist hier zu finden:
browser-menubar.js - mozsearch
Ich habe nur die Zeilen 8 und 117 hinzugefügt und die Zeile 12 geändert. Die andere Arbeit überlasse ich lieber weiterhin den Mozilla-Entwicklern. 😉
Es sieht jetzt so aus:
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* eslint-env mozilla/browser-window */
(function () { // ZUGEFÜGT!
document.addEventListener(
"DOMContentLoaded",
() => {
let mainMenuBar = document.getElementById("AMpopup"); // GEÄNDERT!
mainMenuBar.addEventListener("command", event => {
switch (event.target.id) {
// == edit-menu ==
case "menu_preferences":
openPreferences(undefined);
break;
// == view-menu ==
case "menu_pageStyleNoStyle":
gPageStyleMenu.disableStyle();
break;
case "menu_pageStylePersistentOnly":
gPageStyleMenu.switchStyleSheet(null);
break;
case "repair-text-encoding":
BrowserCommands.forceEncodingDetection();
break;
case "documentDirection-swap":
gBrowser.selectedBrowser.sendMessageToActor(
"SwitchDocumentDirection",
{},
"SwitchDocumentDirection",
"roots"
);
break;
// == history-menu ==
case "sync-tabs-menuitem":
gSync.openSyncedTabsPanel();
break;
case "hiddenTabsMenu":
gTabsPanel.showHiddenTabsPanel(event, "hidden-tabs-menuitem");
break;
case "sync-setup":
gSync.openPrefs("menubar");
break;
case "sync-enable":
gSync.openPrefs("menubar");
break;
case "sync-unverifieditem":
gSync.openPrefs("menubar");
break;
case "sync-syncnowitem":
gSync.doSync(event);
break;
case "sync-reauthitem":
gSync.openSignInAgainPage("menubar");
break;
case "menu_openFirefoxView":
FirefoxViewHandler.openTab();
break;
// == menu_HelpPopup ==
// (Duplicated in PanelUI._onHelpCommand)
case "menu_openHelp":
openHelpLink("firefox-help");
break;
case "menu_layout_debugger":
toOpenWindowByType(
"mozapp:layoutdebug",
"chrome://layoutdebug/content/layoutdebug.xhtml"
);
break;
case "feedbackPage":
openFeedbackPage();
break;
case "helpSafeMode":
safeModeRestart();
break;
case "troubleShooting":
openTroubleshootingPage();
break;
case "help_reportSiteIssue":
ReportSiteIssue();
break;
case "menu_HelpPopup_reportPhishingtoolmenu":
openUILink(gSafeBrowsing.getReportURL("Phish"), event, {
triggeringPrincipal:
Services.scriptSecurityManager.createNullPrincipal({}),
});
break;
case "menu_HelpPopup_reportPhishingErrortoolmenu":
ReportFalseDeceptiveSite();
break;
case "helpSwitchDevice":
openSwitchingDevicesPage();
break;
case "aboutName":
openAboutDialog();
break;
case "helpPolicySupport":
openTrustedLinkIn(Services.policies.getSupportMenu().URL.href, "tab");
break;
}
});
document
.getElementById("menu_EditPopup")
.addEventListener("popuphidden", () => {
updateEditUIVisibility();
});
},
{ once: true }
);
}) (); // ZUGEFÜGT!
Alles anzeigen
Weiß irgendjemand zufällig, wie man in einem Untermenü (subdir) einen Separator erstellt?
Und wie schaut es mit einem Untermenü in einem Untermenü aus? Wie geht das?
Meinst du im Skript Appmenu.uc.js? Da sind Separatoren drin. Einfach abgucken. Da funktioniert es anders als in "normalen" Skripten, wie es Endor geschrieben hat.
Nur, verrate mir, uns, doch wie Du dem Code auf die Schliche gekommen bist. Bitte.
Hm, blindes Huhn findet auch mal'n Korn. Mal schauen, ob ich es noch rekonstruieren kann.
Ich habe auch im Firefox Quellcode https://searchfox.org/mozilla-central/source nach den Pfaden gesucht, die in den Variablen angegeben sind, aber das mich in diesem Fall nicht viel weiter gebracht.
Edit: Doch was im Quellcode gefunden, nämlich dass innerhalb der Datei devtools/client/framework/devtools-browser.js der Befehl toggleToolboxCommand heißt. Also habe ich vermutet, dass ich entsprechend dem Code für die Browser-Konsole den Teil davor als Variable definieren muss.
Aber wie gesagt, blindes Huhn ..., oder ein Bastler braucht halt im Unterschied zu einem Programmierer viel Zeit und Glück.
Ich habe auch etwas gebastelt, aber immer noch ohne appmenu_edit.uc.js. Es ist eine Notlösung. Ich habe einfach die Hilfe-Einträge in der appmenu.uc.js angelegt. Nutzt sie oder nutzt sie nicht.
Ja, da besteht mit AppMenu_edit.uc.js das gleiche Problem, dass der Klick auf einen Menüeintrag imitiert wird, anstatt dass der zugrunde liegende Befehl aufgerufen wird.
Jetzt muss ich aber ins Bett. Gute Nacht
Puh! Gefunden.
So lautet der direkte Befehl, der nicht vom Klick auf den Menüeintrag abhängig ist. Damit funktioniert's auch mit AppMenu_edit.uc.js. Hier der ganze Abschnitt für das Skript:
{
name: 'Entwickler-Werkzeuge',
command: "var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {});\
var { gDevToolsBrowser } = require('devtools/client/framework/devtools-browser');\
gDevToolsBrowser.toggleToolboxCommand(window.gBrowser, Cu.now());",
subdir: 'Firefox Funktionen',
image:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAqJJREFUeNp0k11IU2EYx593Q0RDL1wOmheihBCoiNHFrIYgYSBDKoRMIWgwduGFjTiIdRHiQIw+iBAS6qKUrJsVlRGsC2vWRUFzEclmxMZKXWzObe377PR/cLOB64Xfzt7zPv/f+8URAwMDVNoUReGHGeRAGITy+bwfbIB0JpMhWZZ369X19fXGqqqqbgR1wJPNZrngK9jAf11bW9vRlpaWE5FI5EAikVBDEkJdblfg8/m6nU7nXeDa3NxcTiaTVFlZyQVRCHyBQEBjsVguGI3G0zU1NQ0ej0eg5gcmyEBGahTq7Ha7a3JycsjtdtcGg8FliIgH0+l0DmRTqZS2tbX1mE6nO9TU1LTf4XAEcrmcF5AKguder3d6eHh4HjMNYUsSD/j9ftre3qZoNPoLYj+vDHJqbGzUx+NxLY9xX1Xcy9ra2rTJZJofGRkZ0mq1Eh/U+vo6bW1txVQqlZb7fIDYVkUsFmPaIac9rbm5WcKWVjo6OqTjtbX7Ojs7pcXFxRW9Xn+dbweysaWlJZ9GozHX1dX1ULmGfUoLkvTWWV3tdptMQe6XDLezJBwOK4XrLttO3Sf6o0xNKfaKisCMEIdXhSALKLQeluB5sFz4PHDNdnUpqJBD/f0RhJ99E+KSC4KZf5Ky7Qr4YjAYeHnJk0QTL4k+xc1mBeEXn4WQPkBw8z8SPqTVvr4+DqeA9Sx+nhLZ7JAkR0cVhF+9F2LsDQRPMHamJHwLfB8cHORwBtzmlyxAmIttjyHJjI8rCDscQlxmwXwhfAf4zVhm4QOaK1qLAoTpISQPIJEnJhSE3y0QXS0KflutVg7LJdI9AoQJN2O7BwnfzizRR0B8GhfBDfAInCuGr/Wq6UiDoMRPhWKvZUrjXXZniTbM1ivvbHvurwADAH3gYJeBXh2yAAAAAElFTkSuQmCC',
},
Endor Magst du das auf Github noch ändern?
Möglicherweise wegen diesem Befehl document.getElementById('menu_devToolbox').click()
Die ID menu_devToolbox stammt aus dem Extras-Menü, und das wird von dem anderen Skript "geklaut" und funktioniert deshalb vielleicht nicht mehr. Wir bräuchten also statt dem click auf einen Menüeintrag den zugrunde liegenden Befehl. Das ist mir bis heute leider ein Rätsel, wie ich sowas finden kann. milupo kannst du da weiterhelfen?
Edit: Lösung im nächsten Beitrag.
Hier funktioniert es einwandfrei.
Ob unten angeheftet, oder als eigenes Fenster, je nach Einstellung.Edit: Verwendest Du das Zusatzscript: Appmenu_edit.uc.js, ich nicht.
Denn damit funktioniert es anscheinend nicht.
Das ist es. Sehr mysteriös. Mit dem Skript gab es ja nur Probleme mit den orignalen Firefox-Menüs. Das hier ist aber ein eigener Eintrag im Appmenu-Skript.
Hoffentlich kann Sören Hentzschel auch dieses Rätsel lösen.
Edit: Lösung zwei Beiträge weiter unten.
EndorDas Öffnen der Entwickler-Werkzeuge funktioniert nicht. Wenn man sich den Befehlsaufbau von deinem Eintrag und dem darunter von der Browser-Toolbox anschaut, sind die unterschiedlich. Ich habe es nicht zum Laufen gekriegt
Das macht das Skript in Zukunft ziemlich wartungsaufwändig, weil man nach jedem Update prüfen muss, ob sich ein Menü verändert hat und alle Einträge noch funktionieren, oder ob das Skript ergänzt werden muss.
Das gilt doch sowieso grundsätzlich für jedes Script, weil Scripts auf Firefox-Interna zugreifen oder diese gar überschreiben, für die es keinerlei Kompatibilitätsversprechen gibt. Auf der Plus-Seite steht zumindest, dass sich die Menüpunkte nicht unbedingt monatlich verändern.
Ja klar, aber bisher wurden einfach funktionierende Menüs verschoben, jetzt muss jeder Menüeintrag erst wieder funktionsfähig gemacht werden. Besteht keine Möglichkeit, wie von mir gefragt?
Nein weiter nichts. Hier habe ich den Button in der Tabbar.
Das habe ich eben bei Github auf 1 navbar geändert.
Siehe mein "Edit" oben.
Gleiches Skript, nur "neue" Buttons und erweitert, damit das Menü auch in der Menüleiste angezeigt werden kann.
Bei mir sitzen die Buttons zu hoch und die Bilder sind verschwommen.