Danke Mira!
Klappt das auch im aktuellen Nightly bei dir?
Ja! Habe nur ein Skript, das sich so verhält, wie von Dir beschrieben.
Nutze 40.
Danke Mira!
Klappt das auch im aktuellen Nightly bei dir?
Ja! Habe nur ein Skript, das sich so verhält, wie von Dir beschrieben.
Nutze 40.
milupo Danke für die Erklärung.
Moin, willkommen im Forum!
Was soll das Script machen?
Die Frage stelle ich mir auch gerade?
Also, wenn man mit mehren Browserfenster arbeitet, würde sich ein solches Skript anbieten.
Das funktioniert egal, aus welchem Fester aus es gestartet wird.
// Browser-Werkzeuge.uc.js
// Author @aborix
// https://www.camp-firefox.de/forum/thema/135383/?postID=1210514#post1210514
(function() {
if (location.href !== 'chrome://browser/content/browser.xhtml') return;
try {
CustomizableUI.createWidget({
id: 'browser-toolbox-button',
defaultArea: CustomizableUI.AREA_NAVBAR,
label: 'Browser-Werkzeuge',
tooltiptext: 'Browser-Werkzeuge',
onCommand: function (event) {
let document = event.target.ownerDocument;
if (!document.getElementById('menu_browserToolbox')) {
let { require } = ChromeUtils.importESModule("resource://devtools/shared/loader/Loader.sys.mjs", {});
let { BrowserToolboxLauncher } = require('resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs');
BrowserToolboxLauncher.init();
}
document.getElementById('menu_browserToolbox').click();
}
});
} catch(e) {
return;
}
let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons')); // Pfad zum Profilordner und gleich in den entsprechenden Unterordner
let ButtonIcon = "window-dev-tools.svg"; // Name & Dateiendung des anzuzeigenden Symbols!
let sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
let uri = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
#browser-toolbox-button { list-style-image: url("${ProfilePath}/${ButtonIcon}") }
#browser-toolbox-button.toolbarbutton-1.chromeclass-toolbar-additional image.toolbarbutton-icon {
width: 28px !important;
height: 28px !important;
fill: #83ee1a !important;
fill-opacity: 1 !important;
}
`), null, null);
sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
})();
Alles anzeigen
Bitte den eigenen Bedürfnissen anpassen!
ot. Irgendwie geht das, so finde ich, an der eigentlichen Kritik der Unübersichtlichkeit vorbei.
Und im Besonderen, wenn mehrere Skripte oder Fragen gleichzeitig behandelt werden.
Von daher wäre es wirklich gut gewesen, die Funktion des Zitates oder eben des Verlinkens zu nutzen.
Aber das Sehen einige hier anders, weil sie halt die Zeit haben und am Ball sind.
Aber ist jetzt eh absolut egal, es lässt sich ja nun im Nachhinein nicht mehr ändern,
und ob ich, oder andere, hier noch irgendwas nachvollziehen können, scheint auch völlig Banane zu sein.
Wenn ich noch Fragen habe, muss ich halt einen neuen Thread aufmachen und die "Uhr" wieder auf Null stellen.
Wäre vielleicht ganz gut, wenn ein paar Nutzer des Skripts mal ihre Version hier posten würden.
Oh, ich nutze da zwei verschiedene und von mir angepasste Skripte.
Einmal eines, welches eine Schaltfläche im Hamburgermenü erzeugt
und eines, welches einen Button erstellt.
/* Restart item script for Firefox 89+ by Aris
- left-click on restart item: normal restart
- middle-click on restart item: restart + clear caches
- right-click on restart item: no special function
- option: display restart icon in menubars 'File' menu
- option: display restart icon in main menus popup
- based on 'addRestartButton.uc.js' script by Alice0775
- restart code from Classic Theme Restorer add-on
- invalidate caches from Session Saver add-on
https://github.com/Aris-t2/CustomJSforFx/blob/master/scripts/restart_item_in_menu.uc.js
*/
var appversion = parseInt(Services.appinfo.version);
var menuicon = false;
var appmenuicon = false;
var RestartMenuFileAppItems = {
init: function() {
var button_label = "Neustart";
/*
try {
restartitem_filemenu = document.createXULElement("menuitem");
if(menuicon) restartitem_filemenu.setAttribute("class","menuitem-iconic");
restartitem_filemenu.setAttribute("label", button_label);
restartitem_filemenu.setAttribute("id","fileMenu-restart-item");
restartitem_filemenu.setAttribute("accesskey", "R");
restartitem_filemenu.setAttribute("acceltext", "R");
restartitem_filemenu.setAttribute("insertbefore", "menu_FileQuitItem");
restartitem_filemenu.setAttribute("onclick", "if (event.button == 0) {RestartMenuFileAppItems.restartApp(false);} else if (event.button == 1) {RestartMenuFileAppItems.restartApp(true)};");
restartitem_filemenu.setAttribute("oncommand", "RestartMenuFileAppItems.restartApp(false);");
if(document.getElementById("menu_FileQuitItem").previousSibling.id != "fileMenu-restart-item" )
document.getElementById("menu_FileQuitItem").parentNode.insertBefore(restartitem_filemenu,document.getElementById("menu_FileQuitItem"));
} catch(e) {}
*/
try {
restartitem_appmenu = document.createXULElement("toolbarbutton");
restartitem_appmenu.setAttribute("label", button_label);
restartitem_appmenu.setAttribute("id","appMenu-restart-button");
// if(appmenuicon) restartitem_appmenu.setAttribute("class","subviewbutton subviewbutton-iconic");
// else
restartitem_appmenu.setAttribute("class","subviewbutton");
// restartitem_appmenu.setAttribute("accesskey", "R");
// restartitem_appmenu.setAttribute("shortcut", "Alt+R");
restartitem_appmenu.setAttribute("insertbefore", "appMenu-quit-button2");
restartitem_appmenu.setAttribute("onclick", "if (event.button == 0) {RestartMenuFileAppItems.restartApp(false);} else if (event.button == 1) {RestartMenuFileAppItems.restartApp(true)};");
restartitem_appmenu.setAttribute("oncommand", "RestartMenuFileAppItems.restartApp(false);");
var AMObserver = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if(document.querySelector("#appMenu-restart-button") == null ) document.querySelector("#appMenu-quit-button2").parentNode.insertBefore(restartitem_appmenu,document.getElementById("appMenu-quit-button2"));
});
});
AMObserver.observe(document.querySelector("#PanelUI-menu-button"), { attributes: true, attributeFilter: ['open'] });
} catch(e) {}
let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons')); // Pfad zum Profilordner und gleich in den entsprechenden Unterordner
let ButtonIcon = "restart.svg"; // Name & Dateiendung des anzuzeigenden Symbols!
let sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
let uri = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
#appMenu-restart-button { list-style-image: url("${ProfilePath}/${ButtonIcon}") }
#appMenu-restart-button > .toolbarbutton-icon {
margin-inline-end: 6px !important;
width: 19px !important;
height: 19px !important;
}
#appMenu-restart-button > image:nth-child(1) {
margin-left: -2px !important;
}
`), null, null);
sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
},
restartApp: function(clearcaches) {
var cancelQuit = Components.classes["@mozilla.org/supports-PRBool;1"].createInstance(Components.interfaces.nsISupportsPRBool);
var observerSvc = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
if(clearcaches) {
Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).invalidateCachesOnRestart();
}
observerSvc.notifyObservers(cancelQuit, "quit-application-requested", "restart");
if(cancelQuit.data) return false;
Services.startup.quit(Services.startup.eRestart | Services.startup.eAttemptQuit);
}
}
RestartMenuFileAppItems.init();
Alles anzeigen
// Restart_Firefox.uc.js
// RestartFirefoxButtonM.uc.js
// v. 0.6
// Source file https://www.camp-firefox.de/forum/thema/126132/?postID=1093563#post1093563
(function() {
if (location.href !== 'chrome://browser/content/browser.xhtml') return;
try {
CustomizableUI.createWidget({
id: 'restart-button2a',
type: 'custom',
defaultArea: CustomizableUI.AREA_NAVBAR,
onBuild: function(aDocument) {
var toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
let props = {
id: 'restart-button2a',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
label: 'Neustart',
tooltiptext: 'Neustart (der userChrome.js-Cache wird geleert)',
};
for (let p in props)
toolbaritem.setAttribute(p, props[p]);
toolbaritem.addEventListener('click', event => {
if (event.button == 1) {
Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);
}
if (event.button == 0 || event.button == 2) {
event.preventDefault();
Services.appinfo.invalidateCachesOnRestart();
Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);
}
});
return toolbaritem;
}
});
} catch(e) { };
let ProfilePath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons')); // Pfad zum Profilordner und gleich in den entsprechenden Unterordner
let ButtonIcon = "restart.svg"; // Name & Dateiendung des anzuzeigenden Symbols!
let sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
let uri = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(`
#restart-button2a { list-style-image: url("${ProfilePath}/${ButtonIcon}") }
#restart-button2a.toolbarbutton-1.chromeclass-toolbar-additional image.toolbarbutton-icon {
width: 32px !important;
height: 32px !important;
fill: #f60000 !important;
fill-opacity: 1 !important;
}
`), null, null);
sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
})();
Alles anzeigen
Ulf3000 Alles i.O.
Mir ging es lediglich um die Übersichtlichkeit!
Es stellt sich mir dann aber auch die Frage, wo für ein Forum in einzelne Bereiche unterteilt wird,
und wofür diese wiederum einzelne Threads haben. Kann man ja immer alles in einem Sammelthread unterbringen.
Ich hoffe, es kommt rüber, was ich damit sagen will!
offtoppic: Ich nutze auch VScode, welche Add-ons wären das und sind diese Kostenpflichtig?
Mh. Also ich finde auch, dass dieser Thread mittlerweile etwas unübersichtlich geworden ist!
Mag ja sein, dass User, die eine Frage stellen und zig spätere Beiträge dann eine Antwort erhalten,
damit zurechtkommen.
Aber wenn man hier immer nur von Zeit zu Zeit reinschaut, gar nicht direkt betroffen ist, war,
sieht man nur noch ein heilloses Durcheinander!
Selbst wenn ich versuche eine bestimmte "Besprechung" eines Skriptes zu folgen, kann es ganz schnell passieren,
dass ich den Faden verliere.
Und ich frage mich, warum es nicht möglich ist, wenigstens hin und wieder,
mal auf den anfänglichen Beitrag, also die Fragestellung, zu verweisen!
Das Board hat hier für doch so viele Möglichkeiten!
Es geht mir also nicht darum, dass beteiligte User wissen, worum es geht, sondern dass andere es auch nachvollziehen können.
Aber jetzt ist es gut mit Kritik und Anmerkungen! Ich bitte der Übersichtlichkeit einfach mal die Möglichkeit des Zitats zu nutzen,
wenn die Frage oder der Bezug zig Beiträge davor sich befindet.
Und wenn betreffender Beitrag noch "älter" ist, schadet auch ein #XXX Link nicht. lichen Dank.
Ich hätte da mal eine Verständnisfrage!
Warum solche Monster!
Ist da der Wurm drinnen, kann das einen ganzen Rattenschwanz an Auswirkungen haben.
Nutze ich für jeden Button ein eigenes Skript inkl. CSS, sehe ich doch sofort an welchem Skript es hakt
und die Fehlersuche gestaltet sich viel einfacher.
Ist aber nur meine pers. Meinung.
Er hat doch schön öfters bekundet, dass der Inspector oder Browser-Werkzeuge nicht sein Ding sind. Muss man da jetzt so doll drauf rumreiten? Es sollte jedoch möglich sein, das CSS in der eigenen Sammlung zu finden und für diesen Punkt zu erweitern, dass die gleiche Optik vorhanden ist.
Also von mir ist es wirklich nicht böse gemeint und auch kein drauf rumreiten!
Und ich kann mir auch beim besten Willen nicht vorstellen, dass Andy ihm da irgendwas Schlechtes will.
Er möchte es doch einfach noch einmal versuchen, und wenn es doch nicht so klappt,
einfach fragen, Andreas, aber auch ich, aber womöglich auch viele andere werden ihm mit Sicherheit weiterhelfen.
Hi lenny2
Versuche einmal CSS in das Skript zu basteln!
Dann kannst Du bestimmen, wie breit das Submenü und die "Texte" sein sollen!
Schau Dir mein angepasstes Skript an.
// ==UserScript==
// @name UndoListInTabmenuToo
// @namespace http://space.geocities.yahoo.co.jp/gl/alice0775
// @description UndoListInTabmenuToo.uc.js
// @include main
// @compatibility Firefox 135
// @author Alice0775
// @version 2025/01/19 width of the submenu adjusted via CSS, by Mira Bellenbaum
// @version 2025/01/18 fix bug via CSS thanks 2002Andreas
// @version 2025/01/15 fix bug by Mira Bellenbaum (Tooltips deleted because incorrect)
// @version 2025/01/05 remove redundant menuitems
// @version 2025/01/05 fix bug
// @version 2024/12/22 fix Bug 1936336 - Disallow inline event handlers
// @version 2024/08/23 Bug 1690613 - Allow access to url/title/favIconUrl without "tabs" permission in session API
// @version 2023/06/16 08:00 Bug 1819675 - Expand recently closed tabs to include all Windows
// @version 2022/05/10 fix ref to context-media-eme-separator
// @version 2021/12/09 remove JSON.parse (Bug 1733425)
// @version 2021/04/25 fix 1689378
// @version 2019/11/14 remove eval
// @version 2019/06/30 10:00 Bug 1555060 Convert <tabs> to a custom element
// @version 2019/06/24 23:00 wait for gBrowser initialized
// @version 2019/05/21 08:30 fix 69.0a1 Bug 1551320 - Replace all createElement calls in XUL documents with createXULElement
// @version 2018/05/10 60
// @version 2017/11/18 nsIPrefBranch to nsIPrefBranch
// @version 2010/09/18 00:00 4.0b7pre
// @version 2009/02/03 13:00 Tooltip zeigt jetzt den Verlauf in Tabs an
// @Note Fügt die UndoClose Tab List für Tabs und Kontextmenüs hinzu
// @OriginalCode Orginalcode aus browser.js für populateUndoSubmenu verwendet
// @version 2018/05/09 15:00 61
// ==/UserScript==
// @version 2010/03/26 13:00 Minefield/3.7a4pre Bug 554991 - allow tab context menu to be modified by normal XUL overlays
// @version 2010/03/15 00:00 Minefield/3.7a4pre Bug 347930 - Tab strip should be a toolbar instead
// @version 2009/09/09 15:00 Mittlere Klickverarbeitung
// @version 2009/09/03 22:00 Firefox3.7a1pre Funktion wurde wieder hergestellt.(Bug 489925. getElementById should not return anonymous nodes)
// @version 2009/08/22 00:00 Firefox3.6 Ändern des stringbandle
// @version 2009/04/24 00:00 #394759 [Firefox:Session Restore]-Add undo close window feature
// @version 2008/10/12 18:00 FFx3.0.4pre Mittelklick-Popupmenü wurde nicht geschlossen und andere Korrekturen
// @version 2007/10/05 10:00
var UndoListInTabmenu = {
// -- config --
TABCONTEXTMENU : true , //Im Tabkontextmenü: anzeigen: true, nicht anzeigen: false
CONTEXTMENU : false, //Im Hauptkontextmenü: anzeigen: true , nicht anzeigen: false
// -- config end--
ss: null,
get tabContext() {
return document.getElementById("tabContextMenu");
},
get navigatorBundle() {
return Services.strings.createBundle(
"chrome://browser/locale/browser.properties"
);
},
init: function(){
var css =`
.restoreallitem {
order: -1 !important;
}
#tabContextUndoList :is(menu,menuitem),
#ContextUndoList :is(menu,menuitem) {
min-height: 20px !important;
padding-top: 0 !important;
padding-bottom: 0 !important;
}
#tabContextUndoList > menupopup:nth-child(4) {
min-width: 500px !important;
}
#tabContextUndoList :is(menu, menuitem) {
min-width: 550px !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.AUTHOR_SHEET);
if (this.TABCONTEXTMENU){
//Tabkontextmenü
var tabContext = this.tabContext;
this.makePopup(tabContext, null, "tabContextUndoList");
}
if (this.CONTEXTMENU){
//Hauptkontextmenü
var contextMenu = document.getElementById("contentAreaContextMenu");
var refItem = document.getElementById("context-media-eme-separator");
this.makePopup(contextMenu, refItem, "ContextUndoList");
}
// Geschlossene Tabs dem NS-Sitzungsspeicher entnehmen
this._ss = SessionStore;
},
makePopup: function(popup, refItem, id){
var menu;
//label
const locale = "de";
// "Liste Kürzlich geschlossener Fenster"
menu = document.createXULElement("menu");
menu.setAttribute("id", "historyUndoWindowMenu3");
menu.setAttribute("label", "K\u00FCrzlich geschlossene Fenster");
menu.setAttribute("accesskey", "F");
menu.setAttribute("disabled", "true");
popup.insertBefore(menu, refItem);
menupopup = document.createXULElement("menupopup");
menu.appendChild(menupopup);
menupopup.setAttribute("id", "historyUndoWindowPopup3");
//menu.setAttribute("onpopupshowing", "UndoListInTabmenu.populateUndoWindowSubmenu(this);");
menupopup.addEventListener("popupshowing", (event) => UndoListInTabmenu.populateUndoWindowSubmenu(event.currentTarget));
//Liste kürzlich geschosener Tabs
const LABELTEXT = "K\u00FCrzlich geschlossene Tabs"; //create menu
menu = document.createXULElement("menu");
menu.setAttribute("label", LABELTEXT);
menu.setAttribute("accesskey", "K");
if (id)
menu.setAttribute("id", id);
//menu.setAttribute("disabled", true);
var menupopup = document.createXULElement("menupopup");
menupopup.addEventListener("popupshowing", () => UndoListInTabmenu.populateUndoSubmenu(menupopup));
//menupopup.setAttribute("onpopupshowing", "UndoListInTabmenu.populateUndoSubmenu(this);");
menu.appendChild(menupopup);
popup.insertBefore(menu, refItem);
//Eventlistener hinzufügen
popup.addEventListener('popupshowing',function(event) {
UndoListInTabmenu.toggleRecentlyClosedWindows(document.getElementById("historyUndoWindowMenu3"));
// no restorable tabs, so make sure menu is disabled, and return
if (UndoListInTabmenu._ss.getClosedTabCount(window) === 0) {
menu.setAttribute("disabled", true);
//menu.setAttribute("hidden", true);
return;
}
menu.removeAttribute("disabled");
//menu.setAttribute("hidden", false);
},false);
},
/**
* Auffüllen, wenn das Chronik-Menü geöffnet wird
*/
populateUndoSubmenu: function(undoPopup) {
while (undoPopup.hasChildNodes()) {
undoPopup.removeChild(undoPopup.firstChild);
}
var utils = RecentlyClosedTabsAndWindowsMenuUtils;
var tabsFragment = utils.getTabsFragment(
window,
"menuitem",
/* aPrefixRestoreAll = */ true,
"menu-history-reopen-all-tabs"
);
undoPopup.appendChild(tabsFragment);
// Erstelle einen Separator unter dem Eintrag "Alle Tabs wieder öffnen"
let separator = document.createXULElement("menuseparator");
separator.classList.add("restoreall-separator");
undoPopup.insertBefore(separator, undoPopup.children[0]); // Direkt nach dem ersten Eintrag ("Alle Tabs wieder öffnen")
// populate tab historis for tooltip
// var undoItems = UndoListInTabmenu._ss.getClosedTabDataForWindow(window);
// for (var i = 0; i < undoItems.length; i++) {
// var entries = undoItems[i].state ? undoItems[i].state.entries : undoItems[i].entries;
// var tooltiptext = "";
// for (var j = entries.length - 1; j > -1; j--){
// if (j != entries.length - 1)
// tooltiptext += "\n";
// tooltiptext += parseInt(j + 1, 10) + ". " + entries[j].title;
// }
// undoPopup.childNodes[i + 2/*restore all, sep*/].setAttribute("tooltiptext", tooltiptext);
// }
// "Append Clear undo close tb list"
//undoPopup.appendChild(document.createXULElement("menuseparator"));
// "Liste der letzten Tabs löschen"-Eintrag hinzufügen
let clearListItem = undoPopup.appendChild(document.createXULElement("menuitem"));
clearListItem.setAttribute("label", "Liste der letzten Tabs l\u00F6schen");
clearListItem.setAttribute("accesskey", "C");
clearListItem.addEventListener("command", () => {
let prefs = Services.prefs;
let max_undo = prefs.getIntPref("browser.sessionstore.max_tabs_undo");
prefs.setIntPref("browser.sessionstore.max_tabs_undo", 0);
prefs.setIntPref("browser.sessionstore.max_tabs_undo", max_undo);
}, false);
},
toggleRecentlyClosedWindows: function PHM_toggleRecentlyClosedWindows(menu) {
// enable/disable the Recently Closed Windows sub menu
// no restorable windows, so disable menu
if (this._ss.getClosedWindowCount() === 0)
menu.setAttribute("disabled", true);
else
menu.removeAttribute("disabled");
},
/**
* Populate when the history menu is opened
*/
populateUndoWindowSubmenu: function PHM_populateUndoWindowSubmenu(undoPopup) {
while (undoPopup.hasChildNodes()) {
undoPopup.removeChild(undoPopup.firstChild);
}
let utils = RecentlyClosedTabsAndWindowsMenuUtils;
let windowsFragment = utils.getWindowsFragment(
window,
"menuitem",
/* aPrefixRestoreAll = */ true,
"menu-history-reopen-all-windows"
);
undoPopup.appendChild(windowsFragment);
undoPopup.firstChild.setAttribute("accesskey", "R");
// "Append Clear undo close window list"
undoPopup.appendChild(document.createXULElement("menuseparator"));
m = undoPopup.appendChild(document.createXULElement("menuitem"));
m.setAttribute("label", "Liste der kürzlich geschlossenen Fenster l\u00F6schen");
m.setAttribute("accesskey", "C");
m.addEventListener("command", () => {
for (let i = SessionStore.getClosedWindowCount() -1; i >= 0; i--)
SessionStore.forgetClosedWindow(i);
}, false);
}
};
// Wir sollten die Umleitung nur starten, wenn das Browser-Fenster den Startvorgang abgeschlossen hat.
// Andernfalls sollten wir warten, bis der Startvorgang abgeschlossen ist.
if (gBrowserInit.delayedStartupFinished) {
UndoListInTabmenu.init();
} else {
let delayedStartupFinished = (subject, topic) => {
if (topic == "browser-delayed-startup-finished" &&
subject == window) {
Services.obs.removeObserver(delayedStartupFinished, topic);
UndoListInTabmenu.init();
}
};
Services.obs.addObserver(delayedStartupFinished,
"browser-delayed-startup-finished");
}
Alles anzeigen
Boersenfeger Hey, selbst ich Blondinchen komme damit so einigermaßen zurecht.
Sei ein ganzer Mann, trau Dich.
Wer sich das Skript anschauen möchte:
Such darin nach \u00FC und ersetze es durch ü sowie nach \u00F6 und ersetze dies durch ö (gibts jeweils 2x) – im Skript sind jetzt schon Umlaute enthalten., so dass die Kodierung keinen Vorteil bringt.
Gar net! Sind gar keine Buchstabenkodierungen enthalten, net eine.
// ==UserScript==
// @name Appmenu.uc.js
// @namespace Appmenu@gmail.com
// @description Basiert auf dem Script externalFuncButtonM.uc.js, Wiederherstellung der Orangenen FF-Menü Schaltfläche
// @include main
// @version update for Firefox 68+ by aborix
// @author defpt
// @charset UTF-8
// @version 2019.08.04
// @version 2020.05.27
// @version 2020.07.13 Weitere Menüs und Funktionen ergänzt by bege
// @version 2024.08.10 alle Einstellungen im Abschnitt Konfiguration vornehmen
// @version 2024.08.18 einige Veränderungen am Skript, Symbole, Funktionen & Menüs by Mira Bellenbaum
// @version 2025.01.15 EventListener korrigiert und angepasst, by Mira Bellenbaum
// ==/UserScript==
// Definiere den Profilpfad
let ProfilePath = PathUtils.toFileURI(
PathUtils.join(PathUtils.profileDir, "chrome", "icons")
);
var Appmenu = {
// Beginn der Konfiguration ------------------
// Editor mit angegebenem Pfad verwenden
// editor: 'C:\\Program Files\\Notepad++\\notepad++.exe',
editor: "C:\\Program Files\\Microsoft VS Code\\Code.exe",
// oder
// in 'view_source.editor.path' eingetragenen Editor verwenden
editor: Services.prefs.getCharPref("view_source.editor.path"),
// Dateimanager mit angegebenem Pfad verwenden oder leer ('') wenn System-Dateimanager verwenden
//fileManager: 'C:\\Program files\\FreeCommander XE\\FreeCommander.exe',
fileManager: "",
// Parameter für Dateimanager oder leer ('')
//FMParameter: '/T',
FMParameter: "",
// Submenüs ohne Inhalt im Hauptmenü automatisch ausblenden
autohideEmptySubDirs: true,
// Submenüs im Hauptmenü nach unten verschieben
moveSubDirstoBottom: false,
// Ort und Aussehen des Menü-Buttons einstellen
// isUrlbar: 1, // 0: TabsToolbar; 1: navbar,
isUrlbar: 2, // 0: TabsToolbar; 1: navbar; 2: toolbar-menubar
isButton: 0, // 0: Hamburger,klein; 1: Firefox,groß,
// Hotkey zum Öffnen des Appmenüs oder leer ('')
hotkey: "x",
hotkeyModifier: "alt",
// Ende der Konfiguration --------------------
// Submenüs im Hauptmenü nach unten verschieben
subdirPopupHash: [],
subdirMenuHash: [],
toolbar: {
// Submenüs des Hauptmenüs definieren; Separator einfügen mit {name: 'separator'}
subdirs: [
{
name: "Firefox Verzeichnisse",
image: `${ProfilePath}/folder_currentColor.svg`, // Der Pfad wird direkt verwendet, ohne `url()`
},
{
name: "Firefox Funktionen",
image: `${ProfilePath}/settings_currentColor.svg`, // Der Pfad wird direkt verwendet, ohne `url()`
},
{
name: "separator",
},
],
apps: [
// Untermenü Firefox Verzeichnisse
{
name: 'Profil-Verzeichniss',
id: "AMProfil",
root: 'ProfD',
path: '\\',
subdir: 'Firefox Verzeichnisse',
},
{
name: 'Chrome-Ordner',
id: "AMchrome",
root: 'ProfD',
path: '\\chrome',
subdir: 'Firefox Verzeichnisse',
},
{
name: 'CSS-Ordner',
id: "AMCSS",
root: 'ProfD',
path: '\\chrome\\css',
subdir: 'Firefox Verzeichnisse',
},
{
name: 'JS-Ordner',
id: "AMJS",
root: 'ProfD',
path: '\\chrome\\scripts',
subdir: 'Firefox Verzeichnisse',
},
{
name: 'Addon-Verzeichniss',
id: "AMAddons",
root: 'ProfD',
path: '\\extensions',
subdir: 'Firefox Verzeichnisse',
},
{
name: 'Programm-Verzeichniss',
id: "AMProgramm",
root: 'CurProcD',
path: '\\',
subdir: 'Firefox Verzeichnisse',
},
{
name: 'Startup-Cache',
id: "AMCache",
root: 'ProfLD',
path: '\\startupCache',
subdir: 'Firefox Verzeichnisse',
},
],
configs: [
// Untermenü Firefox Funktionen
{
name: 'Anpassen',
id: "AMAnpassen",
command: "gCustomizeMode.enter()",
subdir: 'Firefox Funktionen',
},
{
name: "Neustart im abgesicherten Modus",
id: "AMModus",
command: "safeModeRestart();",
subdir: "Firefox Funktionen",
},
{
name: "Browser-Konsole",
id: "AMKonsole",
command:
"var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {});\
var { BrowserConsoleManager } = require('resource://devtools/client/webconsole/browser-console-manager');\
BrowserConsoleManager.openBrowserConsoleOrFocus();",
subdir: "Firefox Funktionen",
},
{
name: "Browser-Werkzeuge",
id: "AMWerkzeuge",
command:
"var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {});\
var { BrowserToolboxLauncher } = require('resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs');\
BrowserToolboxLauncher.init();",
subdir: "Firefox Funktionen",
},
{
name: "Web-Entwickler",
id: "AMEntwickler",
command:
"var { require } = ChromeUtils.importESModule('resource://devtools/shared/loader/Loader.sys.mjs', {});\
var { gDevToolsBrowser } = require('resource://devtools/client/framework/devtools-browser');\
gDevToolsBrowser.toggleToolboxCommand(window.gBrowser, Cu.now());",
subdir: "Firefox Funktionen",
},
{
name: "Firefox synchronisieren",
id: "AMsynchron",
command: "gSync.openPrefs('menubar');",
subdir: "Firefox Funktionen",
},
{
name: "Zugangsdaten und Passwörter",
id: "AMdaten",
command:
"LoginHelper.openPasswordManager(window, { entryPoint: 'mainmenu' })",
tooltiptext: "about:logins",
subdir: "Firefox Funktionen",
},
{
name: "Task Manager",
id: "AMManager",
command: "switchToTabHavingURI('about:processes', true)",
tooltiptext: "about:processes",
subdir: "Firefox Funktionen",
},
{
name: "Offline arbeiten",
id: "AMOffline",
command: "BrowserOffline.toggleOfflineStatus();",
subdir: "Firefox Funktionen",
},
/*
{
name: 'separator',
},
*/
{
name: 'Neustart',
id: 'AMreboot',
tooltiptext: 'userChrome.js-Cache wird geleert',
command:"Services.appinfo.invalidateCachesOnRestart(); \
Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);",
},
{
name: 'Beenden',
id: 'AMquit',
command: "goQuitApplication(event);",
},
]
},
_externalAppPopup: null,
_isready: false,
init: function() {
this.handleRelativePath(this.toolbar.apps);
const XULNS = 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul';
var ExternalAppBtn = document.createElementNS(XULNS, 'toolbarbutton');
ExternalAppBtn.id = "AppMenuButton";
ExternalAppBtn.setAttribute("label", "AppButton");
//ExternalAppBtn.setAttribute("onclick", "event.preventDefault();event.stopPropagation();");
ExternalAppBtn.addEventListener('click', event => {
event.preventDefault();
event.stopPropagation();
});
ExternalAppBtn.setAttribute("tooltiptext", "Firefox Menü");
ExternalAppBtn.setAttribute("type", "menu");
ExternalAppBtn.setAttribute("removable", "true");
// Definiere den Profilpfad
let ProfilePath = PathUtils.toFileURI(
PathUtils.join(PathUtils.profileDir, "chrome", "image")
);
// Symbole
let DefaultIcon = "Button_groß.png";
let AlternateIcon = "Button_klein-plus.png";
if (Appmenu.isButton) {
ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${DefaultIcon}')`; // Großes Symbol
ExternalAppBtn.style.width = "94px"; // Feste Breite für großes Symbol
ExternalAppBtn.style.height = "24px"; // Feste Höhe für großes Symbol
} else {
ExternalAppBtn.style.listStyleImage = `url('${ProfilePath}/${AlternateIcon}')`; // Kleines Symbol
ExternalAppBtn.style.width = "16px"; // Feste Breite für kleines Symbol
ExternalAppBtn.style.height = "21px"; // Feste Höhe für kleines Symbol
}
if (Appmenu.isUrlbar === 1) {
var navBar = document.getElementById("nav-bar-customization-target");
navBar.insertBefore(ExternalAppBtn, navBar.firstChild);
} else if (Appmenu.isUrlbar === 2) {
var menubar = document.getElementById("toolbar-menubar");
menubar.insertBefore(ExternalAppBtn, menubar.firstChild);
} else {
var TabsToolbar = document.getElementById("TabsToolbar");
TabsToolbar.insertBefore(ExternalAppBtn, TabsToolbar.firstChild);
}
var ExternalAppPopup = document.createElementNS(XULNS, 'menupopup');
//ExternalAppPopup.setAttribute('onpopupshowing', 'event.stopPropagation(); Appmenu.onpopupshowing();');
ExternalAppPopup.addEventListener('click', event => {
event.stopPropagation();
});
ExternalAppPopup.setAttribute('id', 'AMpopup');
this._externalAppPopup = ExternalAppPopup;
ExternalAppBtn.appendChild(ExternalAppPopup);
Appmenu.onpopupshowing();
// Menü mit Tastaturkürzel öffnen
if (Appmenu.hotkey) {
let key = document.createXULElement('key');
key.id = 'key_AppMenuPopup';
key.setAttribute('key', Appmenu.hotkey);
if (Appmenu.hotkeyModifier)
key.setAttribute('modifiers', Appmenu.hotkeyModifier);
key.setAttribute('oncommand', 'document.getElementById("AMpopup").openPopup();');
document.getElementById('mainKeyset').appendChild(key);
}
},
onpopupshowing: function() {
if (this._isready) return;
if (this._externalAppPopup === null) return;
var ExternalAppPopup = this._externalAppPopup;
for (let subdir of this.toolbar.subdirs) {
if (subdir.name == 'separator') {
ExternalAppPopup.appendChild(document.createXULElement('menuseparator'));
} else {
var subdirItem = ExternalAppPopup.appendChild(document.createXULElement('menu'));
var subdirItemPopup = subdirItem.appendChild(document.createXULElement('menupopup'));
subdirItem.setAttribute('class', 'menu-iconic');
subdirItem.setAttribute('label', subdir.name);
subdirItem.setAttribute('image', subdir.image);
Appmenu.subdirPopupHash[subdir.name] = subdirItemPopup;
Appmenu.subdirMenuHash[subdir.name] = subdirItem;
}
}
for (let app of this.toolbar.apps) {
var appItem;
if (app.name == 'separator') {
appItem = document.createXULElement('menuseparator');
} else {
appItem = document.createXULElement('menuitem');
appItem.setAttribute('class', 'menuitem-iconic');
appItem.setAttribute('label', app.name);
appItem.setAttribute('image', app.image);
//appItem.setAttribute('oncommand', "Appmenu.exec(this.path, this.args);");
appItem.addEventListener('command', function () {
Appmenu.exec(this.path, this.args);
});
appItem.setAttribute('tooltiptext', app.name);
appItem.path = app.path;
appItem.args = app.args;
}
if (app.subdir && Appmenu.subdirPopupHash[app.subdir])
Appmenu.subdirPopupHash[app.subdir].appendChild(appItem);
else ExternalAppPopup.appendChild(appItem);
}
for (let config of this.toolbar.configs) {
var configItem;
if (config.name == 'separator') {
configItem = document.createXULElement('menuseparator');
} else {
configItem = ExternalAppPopup.appendChild(document.createXULElement('menuitem'));
configItem.setAttribute('class', 'menuitem-iconic');
configItem.setAttribute('label', config.name);
configItem.setAttribute('image', config.image);
//configItem.setAttribute('oncommand', config.command);
configItem.addEventListener('command', () => {
eval(config.command);
});
if (config.tooltiptext) {
configItem.setAttribute('tooltiptext', config.tooltiptext);
} else {
configItem.setAttribute('tooltiptext', config.name);
}
configItem.setAttribute('id', config.id);
}
if (config.subdir && Appmenu.subdirPopupHash[config.subdir]) {
Appmenu.subdirPopupHash[config.subdir].appendChild(configItem);
} else {
ExternalAppPopup.appendChild(configItem);
}
}
if (this.autohideEmptySubDirs) {
for (let i = 0; i < Appmenu.subdirPopupHash.length; i++) {
if (Appmenu.subdirPopupHash[i].hasChildNodes()) {
continue;
} else {
Appmenu.subdirMenuHash[i].setAttribute("hidden", "true");
}
}
}
if (this.moveSubDirstoBottom) {
let i = ExternalAppPopup.childNodes.length;
while (ExternalAppPopup.firstChild.getAttribute('class') != 'menuitem-iconic' && i-- != 0) {
ExternalAppPopup.appendChild(ExternalAppPopup.firstChild);
}
}
this._isready = true;
},
handleRelativePath: function(apps) {
for (let app of apps) {
if (app.path) {
app.path = app.path.replace(/\//g, '\\');
var ffdir = Cc['@mozilla.org/file/directory_service;1'].getService(Ci.nsIProperties).get(app.root, Ci.nsIFile).path;
if (/^(\\)/.test(app.path)) {
app.path = ffdir + app.path;
}
}
}
},
exec: function(path, args) {
args = args || [];
var args_t = args.slice(0);
for (let arg of args_t) {
arg = arg.replace(/%u/g, gBrowser.currentURI.spec);
}
var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
file.initWithPath(path);
if (!file.exists()) {
//Cu.reportError('Datei nicht gefunden: ' + path);
alert('Datei nicht gefunden: ' + path);
return;
}
if (file.isExecutable() && !path.endsWith('.js')) {
var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
process.init(file);
process.run(false, args_t, args_t.length);
} else if (file.isFile()) {
if (this.editor) {
let UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
UI.charset = window.navigator.platform.toLowerCase().includes('win') ? 'Shift_JIS' : 'UTF-8';
let path = UI.ConvertFromUnicode(file.path);
let app = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
app.initWithPath(this.editor);
let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
process.init(app);
process.run(false, [path], 1);
} else {
file.launch();
}
} else if (file.isDirectory()) {
if (this.fileManager) {
let args=[this.FMParameter,path];
let app = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
app.initWithPath(this.fileManager);
let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
process.init(app);
process.run(false, args, args.length);
} else {
file.launch();
}
}
},
};
(function () {
// Definiere den Profilpfad für die Symbole
let ProfilePath = PathUtils.toFileURI(
PathUtils.join(PathUtils.profileDir, "chrome", "icons")
);
// Standard-Symbol-Dateiname
let ButtonIcon01 = "restart.svg";
let ButtonIcon02 = "quit.svg";
let Icon01 = "profile.svg";
let Icon02 = "chrome.svg";
let Icon03 = "css3.svg";
let Icon04 = "js.svg";
let Icon05 = "addons.svg";
let Icon06 = "folder.svg";
let Icon07 = "folder-1.svg";
let Icon11 = "Themes.svg";
let Icon12 = "debugging-workers.svg";
let Icon13 = "command-console.svg";
let Icon14 = "window-dev-tools.svg";
let Icon15 = "developer.svg";
let Icon16 = "sync.svg";
let Icon17 = "passwords.svg";
let Icon18 = "performance.svg";
let Icon19 = "plug-disconnected.svg";
// StyleSheetService zum Hinzufügen der CSS-Regeln
let sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
let uri = Services.io.newURI(
"data:text/css;charset=utf-8," +
encodeURIComponent(`
menuitem[label="Profil-Verzeichniss"] { background-image: url('${ProfilePath}/${Icon01}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important; /* Größe des Symbols anpassen */
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
menuitem[label="Chrome-Ordner"] { background-image: url('${ProfilePath}/${Icon02}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important; /* Größe des Symbols anpassen */
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
menuitem[label="CSS-Ordner"] { background-image: url('${ProfilePath}/${Icon03}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important; /* Größe des Symbols anpassen */
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
menuitem[label="JS-Ordner"] { background-image: url('${ProfilePath}/${Icon04}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important; /* Größe des Symbols anpassen */
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
menuitem[label="Addon-Verzeichniss"] { background-image: url('${ProfilePath}/${Icon05}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16pxx !important; /* Größe des Symbols anpassen */
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
menuitem[label="Programm-Verzeichniss"] { background-image: url('${ProfilePath}/${Icon06}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important; /* Größe des Symbols anpassen */
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
menuitem[label="Startup-Cache"] { background-image: url('${ProfilePath}/${Icon07}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important; /* Größe des Symbols anpassen */
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMAnpassen { background-image: url('${ProfilePath}/${Icon11}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMModus { background-image: url('${ProfilePath}/${Icon12}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMKonsole { background-image: url('${ProfilePath}/${Icon13}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMWerkzeuge { background-image: url('${ProfilePath}/${Icon14}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMEntwickler { background-image: url('${ProfilePath}/${Icon15}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMsynchron { background-image: url('${ProfilePath}/${Icon16}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMdaten { background-image: url('${ProfilePath}/${Icon17}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMManager { background-image: url('${ProfilePath}/${Icon18}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
#AMOffline { background-image: url('${ProfilePath}/${Icon19}');
background-repeat: no-repeat !important;
background-position: 11px 3px !important;
background-size: 16px 16px !important;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
}
/* Neustart-Button */
#AMreboot {
background-image: url('${ProfilePath}/${ButtonIcon01}');
background-repeat: no-repeat !important;
background-position: 10px 2px !important;
background-size: 20px 20px !important; /* Größe des Symbols anpassen */
padding-left: 10px !important; /* Platz für das Symbol lassen */
-moz-context-properties: fill, fill-opacity !important;
fill: #fbc96e !important;
}
/* Beenden-Button */
#AMquit {
background-image: url('${ProfilePath}/${ButtonIcon02}');
background-repeat: no-repeat !important;
background-position: 12px 3px !important;
background-size: 16px 16px !important; /* Größe des Symbols anpassen */
padding-left: 10px !important; /* Platz für das Symbol lassen */
-moz-context-properties: fill, fill-opacity !important;
fill: red !important;
}
`),
null,
null
);
// CSS-Regeln registrieren
sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET);
})();
if (window.gBrowser) Appmenu.init();
Alles anzeigen
2002Andreas Also nochmals vielen Dank.
Ich habe das Skript noch einmal überarbeitet und konnte einen "echten" Separator per JavaScript platzieren.
So schaut das ganze dann etwas schöner aus.
Aber Dein CSS war richtig Gold wert
Wer sich das Skript anschauen möchte:
// ==UserScript==
// @name UndoListInTabmenuToo
// @namespace http://space.geocities.yahoo.co.jp/gl/alice0775
// @description UndoListInTabmenuToo.uc.js
// @include main
// @compatibility Firefox 135
// @author Alice0775
// @version 2025/01/18 fix bug via CSS thanks 2002Andreas
// @version 2025/01/15 fix bug by Mira Bellenbaum (Tooltips deleted because incorrect)
// @version 2025/01/05 remove redundant menuitems
// @version 2025/01/05 fix bug
// @version 2024/12/22 fix Bug 1936336 - Disallow inline event handlers
// @version 2024/08/23 Bug 1690613 - Allow access to url/title/favIconUrl without "tabs" permission in session API
// @version 2023/06/16 08:00 Bug 1819675 - Expand recently closed tabs to include all Windows
// @version 2022/05/10 fix ref to context-media-eme-separator
// @version 2021/12/09 remove JSON.parse (Bug 1733425)
// @version 2021/04/25 fix 1689378
// @version 2019/11/14 remove eval
// @version 2019/06/30 10:00 Bug 1555060 Convert <tabs> to a custom element
// @version 2019/06/24 23:00 wait for gBrowser initialized
// @version 2019/05/21 08:30 fix 69.0a1 Bug 1551320 - Replace all createElement calls in XUL documents with createXULElement
// @version 2018/05/10 60
// @version 2017/11/18 nsIPrefBranch to nsIPrefBranch
// @version 2010/09/18 00:00 4.0b7pre
// @version 2009/02/03 13:00 Tooltip zeigt jetzt den Verlauf in Tabs an
// @Note Fügt die UndoClose Tab List für Tabs und Kontextmenüs hinzu
// @OriginalCode Orginalcode aus browser.js für populateUndoSubmenu verwendet
// @version 2018/05/09 15:00 61
// ==/UserScript==
// @version 2010/03/26 13:00 Minefield/3.7a4pre Bug 554991 - allow tab context menu to be modified by normal XUL overlays
// @version 2010/03/15 00:00 Minefield/3.7a4pre Bug 347930 - Tab strip should be a toolbar instead
// @version 2009/09/09 15:00 Mittlere Klickverarbeitung
// @version 2009/09/03 22:00 Firefox3.7a1pre Funktion wurde wieder hergestellt.(Bug 489925. getElementById should not return anonymous nodes)
// @version 2009/08/22 00:00 Firefox3.6 Ändern des stringbandle
// @version 2009/04/24 00:00 #394759 [Firefox:Session Restore]-Add undo close window feature
// @version 2008/10/12 18:00 FFx3.0.4pre Mittelklick-Popupmenü wurde nicht geschlossen und andere Korrekturen
// @version 2007/10/05 10:00
var UndoListInTabmenu = {
// -- config --
TABCONTEXTMENU : true , //Im Tabkontextmenü: anzeigen: true, nicht anzeigen: false
CONTEXTMENU : false, //Im Hauptkontextmenü: anzeigen: true , nicht anzeigen: false
// -- config end--
ss: null,
get tabContext() {
return document.getElementById("tabContextMenu");
},
get navigatorBundle() {
return Services.strings.createBundle(
"chrome://browser/locale/browser.properties"
);
},
init: function(){
var css =`
.restoreallitem {
order: -1 !important;
}
#tabContextUndoList :is(menu,menuitem),
#ContextUndoList :is(menu,menuitem) {
min-height: 20px !important;
padding-top: 0 !important;
padding-bottom: 0 !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.AUTHOR_SHEET);
if (this.TABCONTEXTMENU){
//Tabkontextmenü
var tabContext = this.tabContext;
this.makePopup(tabContext, null, "tabContextUndoList");
}
if (this.CONTEXTMENU){
//Hauptkontextmenü
var contextMenu = document.getElementById("contentAreaContextMenu");
var refItem = document.getElementById("context-media-eme-separator");
this.makePopup(contextMenu, refItem, "ContextUndoList");
}
// Geschlossene Tabs dem NS-Sitzungsspeicher entnehmen
this._ss = SessionStore;
},
makePopup: function(popup, refItem, id){
var menu;
//label
const locale = "de";
// "Liste Kürzlich geschlossener Fenster"
menu = document.createXULElement("menu");
menu.setAttribute("id", "historyUndoWindowMenu3");
menu.setAttribute("label", "K\u00FCrzlich geschlossene Fenster");
menu.setAttribute("accesskey", "F");
menu.setAttribute("disabled", "true");
popup.insertBefore(menu, refItem);
menupopup = document.createXULElement("menupopup");
menu.appendChild(menupopup);
menupopup.setAttribute("id", "historyUndoWindowPopup3");
//menu.setAttribute("onpopupshowing", "UndoListInTabmenu.populateUndoWindowSubmenu(this);");
menupopup.addEventListener("popupshowing", (event) => UndoListInTabmenu.populateUndoWindowSubmenu(event.currentTarget));
//Liste kürzlich geschosener Tabs
const LABELTEXT = "K\u00FCrzlich geschlossene Tabs"; //create menu
menu = document.createXULElement("menu");
menu.setAttribute("label", LABELTEXT);
menu.setAttribute("accesskey", "K");
if (id)
menu.setAttribute("id", id);
//menu.setAttribute("disabled", true);
var menupopup = document.createXULElement("menupopup");
menupopup.addEventListener("popupshowing", () => UndoListInTabmenu.populateUndoSubmenu(menupopup));
//menupopup.setAttribute("onpopupshowing", "UndoListInTabmenu.populateUndoSubmenu(this);");
menu.appendChild(menupopup);
popup.insertBefore(menu, refItem);
//Eventlistener hinzufügen
popup.addEventListener('popupshowing',function(event) {
UndoListInTabmenu.toggleRecentlyClosedWindows(document.getElementById("historyUndoWindowMenu3"));
// no restorable tabs, so make sure menu is disabled, and return
if (UndoListInTabmenu._ss.getClosedTabCount(window) === 0) {
menu.setAttribute("disabled", true);
//menu.setAttribute("hidden", true);
return;
}
menu.removeAttribute("disabled");
//menu.setAttribute("hidden", false);
},false);
},
/**
* Auffüllen, wenn das Chronik-Menü geöffnet wird
*/
populateUndoSubmenu: function(undoPopup) {
while (undoPopup.hasChildNodes()) {
undoPopup.removeChild(undoPopup.firstChild);
}
var utils = RecentlyClosedTabsAndWindowsMenuUtils;
var tabsFragment = utils.getTabsFragment(
window,
"menuitem",
/* aPrefixRestoreAll = */ true,
"menu-history-reopen-all-tabs"
);
undoPopup.appendChild(tabsFragment);
// Erstelle einen Separator unter dem Eintrag "Alle Tabs wieder öffnen"
let separator = document.createXULElement("menuseparator");
separator.classList.add("restoreall-separator");
undoPopup.insertBefore(separator, undoPopup.children[0]); // Direkt nach dem ersten Eintrag ("Alle Tabs wieder öffnen")
// populate tab historis for tooltip
// var undoItems = UndoListInTabmenu._ss.getClosedTabDataForWindow(window);
// for (var i = 0; i < undoItems.length; i++) {
// var entries = undoItems[i].state ? undoItems[i].state.entries : undoItems[i].entries;
// var tooltiptext = "";
// for (var j = entries.length - 1; j > -1; j--){
// if (j != entries.length - 1)
// tooltiptext += "\n";
// tooltiptext += parseInt(j + 1, 10) + ". " + entries[j].title;
// }
// undoPopup.childNodes[i + 2/*restore all, sep*/].setAttribute("tooltiptext", tooltiptext);
// }
// "Append Clear undo close tb list"
//undoPopup.appendChild(document.createXULElement("menuseparator"));
// "Liste der letzten Tabs löschen"-Eintrag hinzufügen
let clearListItem = undoPopup.appendChild(document.createXULElement("menuitem"));
clearListItem.setAttribute("label", "Liste der letzten Tabs l\u00F6schen");
clearListItem.setAttribute("accesskey", "C");
clearListItem.addEventListener("command", () => {
let prefs = Services.prefs;
let max_undo = prefs.getIntPref("browser.sessionstore.max_tabs_undo");
prefs.setIntPref("browser.sessionstore.max_tabs_undo", 0);
prefs.setIntPref("browser.sessionstore.max_tabs_undo", max_undo);
}, false);
},
toggleRecentlyClosedWindows: function PHM_toggleRecentlyClosedWindows(menu) {
// enable/disable the Recently Closed Windows sub menu
// no restorable windows, so disable menu
if (this._ss.getClosedWindowCount() === 0)
menu.setAttribute("disabled", true);
else
menu.removeAttribute("disabled");
},
/**
* Populate when the history menu is opened
*/
populateUndoWindowSubmenu: function PHM_populateUndoWindowSubmenu(undoPopup) {
while (undoPopup.hasChildNodes()) {
undoPopup.removeChild(undoPopup.firstChild);
}
let utils = RecentlyClosedTabsAndWindowsMenuUtils;
let windowsFragment = utils.getWindowsFragment(
window,
"menuitem",
/* aPrefixRestoreAll = */ true,
"menu-history-reopen-all-windows"
);
undoPopup.appendChild(windowsFragment);
undoPopup.firstChild.setAttribute("accesskey", "R");
// "Append Clear undo close window list"
undoPopup.appendChild(document.createXULElement("menuseparator"));
m = undoPopup.appendChild(document.createXULElement("menuitem"));
m.setAttribute("label", "Liste der kürzlich geschlossenen Fenster l\u00F6schen");
m.setAttribute("accesskey", "C");
m.addEventListener("command", () => {
for (let i = SessionStore.getClosedWindowCount() -1; i >= 0; i--)
SessionStore.forgetClosedWindow(i);
}, false);
}
};
// Wir sollten die Umleitung nur starten, wenn das Browser-Fenster den Startvorgang abgeschlossen hat.
// Andernfalls sollten wir warten, bis der Startvorgang abgeschlossen ist.
if (gBrowserInit.delayedStartupFinished) {
UndoListInTabmenu.init();
} else {
let delayedStartupFinished = (subject, topic) => {
if (topic == "browser-delayed-startup-finished" &&
subject == window) {
Services.obs.removeObserver(delayedStartupFinished, topic);
UndoListInTabmenu.init();
}
};
Services.obs.addObserver(delayedStartupFinished,
"browser-delayed-startup-finished");
}
Alles anzeigen
Ins Skript integriert!
var css =`
.restoreallitem {
order: -1 !important;
border-bottom: 1px solid #808080 !important;
margin: 2px 1em;
}
`;
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.AUTHOR_SHEET);
2002Andreas Danke, mit dem Deaktivieren der Zeile 150 ist einer der Separatoren weg.
Mit dem CSS ist der Eintrag "Alle Tabs wieder öffnen" ganz oben.
Nun fehlt nur noch ein Separator nach diesem Eintrag,
um die Liste "abzutrennen".
2002Andreas funktioniert leider nicht.
Kann aber auch gar nicht, denn je nachdem wieviele Einträge die Liste hat,
ändert sich "menuseparator:nth-child(X)".
Bei meinem Test, stand da z.B. 26.
Werde mal testen, ob es nicht im Skript direkt irgendwie geht.
Aber danke.
Bei mir ist die Schaltfläche "Alle Tabs wieder öffnen" oberhalb der Liste, auch in einem neuen Profil...
Quelle:
https://github.com/Endor8/userChr…abmenuToo.uc.js
Selbst ohne CSS und ohne andere Skripts ist der Eintrag bei mir unten, nach der Liste!
Damit ich besser vergleichen kann, wärst Du so nett und verlinkst die Beiträge?
Jene ohne Übersetzungsschwächen (bzw. ohne Fehler). Bitte, Danke.Upps. OK, bei der Menge der Antworten kann man den Überblick verlieren. Und ich glaube, mir geht das selbst so:
- Version 1 : 15. Januar 2025 um 23:04
- Version 2: 16. Januar 2025 um 10:29
V. 1 scheint mir die bessere zu sein, obwohl Du sie anscheinend zuerst gepostet hast. ( Endor bitte mal abgleichen.)
Ich hatte weiter oben geschrieben, dass jemand Alice informieren sollte. Der jemand war jetzt ich:
Error with UndoListInTabmenuToo.uc.js · Issue #91 · alice0775/userChrome.js
Danke.
Da das Skript bei mir so generell nicht so will, wie ich mir das vorstelle, mach ich erst einmal nichts mehr.
Und auch das Appmenü will nicht mehr!
Meine angepasste Version hat seit heute auch Macken!
Die Aufrufe zu den Verzeichnissen (Ordner) tun es nicht mehr.
wie diese Schaltfläche ganz noch oben verschoben werden kann?
Meinst du das so?
...
Ja, super, danke.
Nun sind aber unten zwei Separatoren.
Hast Du dazu auch noch eine Idee?
Diese Schaltfläche, Separator, die Liste, Separator, letzter Menüpunkt (Liste der letzten Tabs löschen)
wegen des Kontextmenüs?
Sollte ich dich falsch verstanden haben, dann sorry.
...
Man, ich bin blöd!
Ich habe was anderes gemeint!
Kürzlich geschlossene Tabs > Alle Tabs wieder öffnen
Diese Schaltfläche "Alle Tabs wieder öffnen" steht unten im Menü!
Sie wird generiert!
Hat jemand eine Idee, wie diese Schaltfläche ganz noch oben verschoben werden kann?
Bzw. wie der betreffende Code umgeschrieben werden kann, damit zwar die Liste generiert wird,
aber nicht die diese Schaltfläche "Alle Tabs wieder öffnen"!
Dann könnte man so eine Schaltfläche auch "hardcoded" ganz oben platzieren.