Nö, ich auch (dann wären wir schon zu dritt).
Oh, doch 50% mehr Nutzer, als vermutet... 
Eine Lsg. bei diesem doch komplizierten Script wäre schön...
Funktioniert das angepasste Script aus #91 bei dir nicht? 
 
															
		Nö, ich auch (dann wären wir schon zu dritt).
Oh, doch 50% mehr Nutzer, als vermutet... 
Eine Lsg. bei diesem doch komplizierten Script wäre schön...
Funktioniert das angepasste Script aus #91 bei dir nicht? 
Wegen der Funktion an den Anfang oder das Ende einer Page zu scrollen,
nutze ich dieses Skript:
//SkipToTopAndBottom.uc.js
(function() {
    let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");  // Pfadangabe zum Profilordner
    let up = "arrow-up.svg";
    let menuitem = document.createXULElement('menuitem');
        menuitem.id = 'context-to-top';
        menuitem.classList.add('menuitem-iconic');
        menuitem.setAttribute('tooltiptext' , 'Zum Seitenanfang springen');
    //    menuitem.style.listStyleImage='url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAiElEQVR42mNkoBAw4pFjAuIWIP4NxA1A/J8UA0Ca5wFxPJQ/C4gzsBnCSIRmBnyGMBKpGachjCRoxmoII4maMQyBGVAOxB1EaoaBEiDuxRaI4kD8AocmCSB+iS8QRw2AAHYgfgXEfGjin4BYDIh/EjIABNyBuAyIuaD8b0DcBcQ70RXiy41EAQBJ/SQRxtinwAAAAABJRU5ErkJggg==")';
        menuitem.style.listStyleImage = 'url("' + ("file:" + ProfilePath + "/chrome/icons/" + up) + '")';
    //    menuitem.setAttribute('oncommand' , "ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo(0,0) ' , false);");
        menuitem.setAttribute('oncommand' , "ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo({ top: 0, left: 0, behavior: \"smooth\" }) ' , false);");
    let refItem = document.getElementById('context-reload');
    refItem.parentNode.insertBefore(menuitem, refItem);
     
    })();
    
    (function() {
    let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");  // Pfadangabe zum Profilordner
    let down = "arrow-down.svg";
    
    let menuitem = document.createXULElement('menuitem');
        menuitem.id = 'context-to-bottom';
        menuitem.classList.add('menuitem-iconic');
        menuitem.setAttribute('tooltiptext' , 'Zum Seitenende springen');
    //    menuitem.style.listStyleImage='url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAhUlEQVR42mNkoBAw4hB3B+IyIOaC8r8BcRcQ7yTGAHYgfgXEfGjin4BYDIh/EjJAHIhf4HCZBBC/HDUAuwHFQNzDQBqoAOJORiSDZgBxGpGaFwJxEhD/Q/YCsYbANWMLA0KGoGjGFYi4DMHQjMsAbIZg1YzPAJhcAxCzAnENNs2EDCAKAADTlCMRQhQlFQAAAABJRU5ErkJggg==")';
        menuitem.style.listStyleImage = 'url("' + ("file:" + ProfilePath + "/chrome/icons/" + down) + '")';
    //    menuitem.setAttribute('oncommand' , "ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo(0,100000) ' , false);");
        menuitem.setAttribute('oncommand' , "ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo({ top: 100000, left: 0, behavior: \"smooth\" }) ' , false);");
    let refItem = document.getElementById('context-reload');
    refItem.parentNode.insertBefore(menuitem, refItem);
     
    })();Wie immer Symbole und eventuell den Pfad ändern!
Ach, Mensch, grisu2099. Zu spät. Aber Firefox brauchte bei mir gerade eine Ewigkeit, um die Forumsseite nach einem Neustart wieder zu laden.
Funktioniert das angepasste Script aus #91 bei dir nicht?
Habe leider kein Nightly zum testen...
Mal bitte diese Version testen...
Funktioniert hier...
Wegen der Funktion an den Anfang oder das Ende einer Page zu scrollen,
nutze ich dieses Skript:
Funktioniert nicht, da in dem Skript menuitem.setAttribute('oncommand', [...] genutzt wird.
Habe leider kein Nightly zum testen...
Brauchst du auch gar nicht. Wenn du das angepasste Skript in der Release-Version testest und es genau das macht, was das Skript vorher gemacht hat, dann wird es auch in der Nightly funktionieren.
Funktioniert hier...
Wenn ich, wie hier in diesem Script, abschreiben kann, kann ich auch Java-Script.... 

Wieder eins weniger in der Liste...
Ich hab hier noch eins, wo du schon mal dran warst. Kriegst du das jetzt auch wieder hin?
// ==UserScript==
// @name           newTabButtonUndoTabList.uc.js
// @description    Bei Rechtsklick auf die Neuen Tab Schaltfläche, wird im Kontextmenü
// @description    der Eintrag zum Wiederherstellen des zuletzt geschlossenen Tabs angezeigt.
// @description    Von BrokenHeart - camp-firefox.de wieder lauffähig gemacht
// @adresse        https://www.camp-firefox.de/forum/thema/112673-userchrome-js-scripte-f%C3%BCr-den-fuchs-diskussion/?postID=1223749#post1223749
// @include        main
// ==/UserScript==
(function () {
    if (!window.gBrowser){
        return;
    }
    
    gBrowser.tabContainer.addEventListener('click', function (e) {
        if (e.originalTarget.id != 'tabs-newtab-button') return;
        switch (e.button) {
            case 1:
                undoCloseTab(0);
                break;
            case 2:
                UCT.makePopup(e);
                event.preventDefault();
                break;
        }
    }, false);
})();
var UCT = {
    init: function () {
        var mp = document.createXULElement("menupopup");
        mp.id = "undo-close-tab-list";
        mp.setAttribute("onpopupshowing", "UCT.onpopupshowing(event);");
        mp.setAttribute("placespopup", true);
        mp.setAttribute("tooltip", "bhTooltip");
        mp.setAttribute("popupsinherittooltip", true);
        document?.getElementById("mainPopupSet")?.appendChild(mp);
    },
    makePopup: function (e) {
        if (SessionStore.getClosedTabCountForWindow(window) != 0) {
            document.getElementById("undo-close-tab-list").openPopupAtScreen(e.screenX +2, e.screenY +2, false);
        }
        else
        {
            console.log("--- Es gibt keinen Tab, der wiederhergestellt werden kann ---");
        }
    },
    onpopupshowing: function (e) {
        var popup = e.target;
        while (popup.hasChildNodes())
            popup.removeChild(popup.firstChild);
        let undoItems = SessionStore.getClosedTabDataForWindow(window);
        undoItems.map(function (item, id) {
            var m = document.createXULElement('menuitem');
            m.setAttribute('label', item.title);
            m.setAttribute('image', item.image );
            m.setAttribute('class', 'menuitem-iconic bookmark-item');
            m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
            popup.appendChild(m);
        });
        popup.appendChild(document.createXULElement("menuseparator"));
        m = document.createXULElement("menuitem");
        m.setAttribute("label", "Chronik in der Sidebar öffnen");
        m.setAttribute("image", "chrome://browser/skin/history.svg");
        m.setAttribute("class", "menuitem-iconic");
        m.setAttribute("oncommand", "SidebarUI.toggle('viewHistorySidebar');");
        popup.appendChild(m);
    },
};
setTimeout(function() {
      UCT.init();
  },250);	BrokenHeart Im Skript aus Beitrag #91 ist in Zeile 55 noch ein schwerer Fall von ondblclick.  Ansonsten funktioniert das Skript wohl offenbar. Das Symbol sehe ich nicht, ist wohl bei mir nicht vorhanden.
 Ansonsten funktioniert das Skript wohl offenbar. Das Symbol sehe ich nicht, ist wohl bei mir nicht vorhanden.
Brauchst du auch gar nicht. Wenn du das angepasste Skript in der Release-Version testest und es genau das macht, was das Skript vorher gemacht hat, dann wird es auch in der Nightly funktionieren.
Getestet in Release und funzt!
Danke!!
Im Skript aus Beitrag #91 ist in Zeile 55 noch ein schwerer Fall von ondblclick.
Stimmt, danke für den Hinweis . Schau ich mir morgen an. Auf die Schnelle funktioniert hier der Doppelklick auf das Icon nicht. Öffnet 'about:config' schon bei einem einfachen Klick mit der rechten Maustaste. Daher eigentlich auch überflüssig, oder?
. Schau ich mir morgen an. Auf die Schnelle funktioniert hier der Doppelklick auf das Icon nicht. Öffnet 'about:config' schon bei einem einfachen Klick mit der rechten Maustaste. Daher eigentlich auch überflüssig, oder?
Ich hab hier noch eins, wo du schon mal dran warst. Kriegst du das jetzt auch wieder hin?
Das müsste eigentlich funktionieren, tut es aber (bei mir) nicht  . Keine Ahnung, was da im Argen liegt
. Keine Ahnung, was da im Argen liegt  . Schau ich mir morgen nochmal an.
. Schau ich mir morgen nochmal an.
// ==UserScript==
// @name           newTabButtonUndoTabList.uc.js
// @description    Bei Rechtsklick auf die Neuen Tab Schaltfläche, wird im Kontextmenü
// @description    der Eintrag zum Wiederherstellen des zuletzt geschlossenen Tabs angezeigt.
// @description    Von BrokenHeart - camp-firefox.de wieder lauffähig gemacht
// @adresse        https://www.camp-firefox.de/forum/thema/112673-userchrome-js-scripte-f%C3%BCr-den-fuchs-diskussion/?postID=1223749#post1223749
// @include        main
// ==/UserScript==
(function () {
    if (!window.gBrowser){
        return;
    }
    
    gBrowser.tabContainer.addEventListener('click', function (e) {
        if (e.originalTarget.id != 'tabs-newtab-button') return;
        switch (e.button) {
            case 1:
                undoCloseTab(0);
                break;
            case 2:
                UCT.makePopup(e);
                event.preventDefault();
                break;
        }
    }, false);
})();
var UCT = {
    init: function () {
        var mp = document.createXULElement("menupopup");
        mp.id = "undo-close-tab-list";
        //mp.setAttribute("onpopupshowing", "UCT.onpopupshowing(event);");
		mp.addEventListener('popupshowing', function(event) {
				UCT.onpopupshowing(event);
			}, true);
		
        mp.setAttribute("placespopup", true);
        mp.setAttribute("tooltip", "bhTooltip");
        mp.setAttribute("popupsinherittooltip", true);
        document?.getElementById("mainPopupSet")?.appendChild(mp);
    },
    makePopup: function (e) {
        if (SessionStore.getClosedTabCountForWindow(window) != 0) {
            document.getElementById("undo-close-tab-list").openPopupAtScreen(e.screenX +2, e.screenY +2, false);
        }
        else
        {
            console.log("--- Es gibt keinen Tab, der wiederhergestellt werden kann ---");
        }
    },
    onpopupshowing: function (e) {
        var popup = e.target;
        while (popup.hasChildNodes())
            popup.removeChild(popup.firstChild);
        let undoItems = SessionStore.getClosedTabDataForWindow(window);
        undoItems.map(function (item, id) {
            var m = document.createXULElement('menuitem');
            m.setAttribute('label', item.title);
            m.setAttribute('image', item.image );
            m.setAttribute('class', 'menuitem-iconic bookmark-item');
            //m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
			m.addEventListener('command', function(event) {
				undoCloseTab(' + id + ');
			}, true);
            popup.appendChild(m);
        });
        popup.appendChild(document.createXULElement("menuseparator"));
        m = document.createXULElement("menuitem");
        m.setAttribute("label", "Chronik in der Sidebar öffnen");
        m.setAttribute("image", "chrome://browser/skin/history.svg");
        m.setAttribute("class", "menuitem-iconic");
        //m.setAttribute("oncommand", "SidebarUI.toggle('viewHistorySidebar');");
		m.addEventListener('command', function(event) {
			SidebarUI.toggle('viewHistorySidebar');
		}, true);
		
        popup.appendChild(m);
    },
};
setTimeout(function() {
      UCT.init();
  },250);Mitleser Die Inline-Eventhandler sind ja schon lange nur eine Altlast nebenher, die Variante mit addEventListener und seinem Gegenstück removeEventListener gibt es ja schon seit einer Ewigkeit.
Keine Ahnung, was da im Argen liegt
In Zeile 55 ist noch der Inline-Eventhandler onpopupshowing, auf den in Zeile 36 wohl Bezug genommen wird.
Das müsste eigentlich funktionieren, tut es aber (bei mir) nicht
Hier läuft es... Danke dafür! 
In Zeile 55 ist noch der Inline-Eventhandler onpopupshowing, auf den in Zeile 36 wohl Bezug genommen wird.
Nein. onpopupshowing ist kein Inline-Eventhandler sondern ein vom Autor des Skripts gewählter Name für eine Funktion, wie bei OnCommand und OnCreated . Er hat sich halt nicht an eine etwaige Mozilla-Namenskonvention gehalten, falls es die überhaupt für Objekt-Eigenschaftsnamen gibt  .
.
Hier läuft es... Danke dafür!
Gerne  .
.
Ja, jetzt läuft es hier auch. Ich hatte sehr viele Tabs offen und dann wird der '+'-Button außerhalb des Scrollbereichs für die Tabs dargestellt und dann funktioniert es nicht mehr. Sollte man natürlich auch mal anpassen...
Mitleser Die Inline-Eventhandler sind ja schon lange nur eine Altlast nebenher, die Variante mit addEventListener und seinem Gegenstück removeEventListener gibt es ja schon seit einer Ewigkeit.
Ach so  , Danke!,
, Danke!,
	BrokenHeart Jep!
Habe mir die 136.0a1 parallel installiert und meine Skripts alle durch getestet!
Es sind acht an der Zahl, die nicht mehr funktionieren. 
/* 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_appmenu = document.createXULElement("toolbarbutton");
	  restartitem_appmenu.setAttribute("label", button_label);
	  restartitem_appmenu.setAttribute("id","appMenu-restart-button");
	  restartitem_appmenu.setAttribute("class","subviewbutton");
	  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();// ==UserScript== 
// @name           
// @description    Tab schließen + Kontextmenü auch in dem Einstellungsfenster
// @charset        UTF-8
// @author         @aborix
// @version        v2024.09.10
// @note           Vorlage Script von @aborix (+ Änderungen von @milupo aus dem Fuchsforum 1.10.24)
// @note           Zeile 32 Anpassung von @milupo ( 08.10.2024 ab Fx 132 > tabbrowser-tabbox statt appcontent)
// Zeile 29        https://www.camp-firefox.de/forum/thema/112673/?postID=1247653#post1247653
// Zeile 32        https://www.camp-firefox.de/forum/thema/138429/?postID=1257843#post1257843
// Source          https://www.camp-firefox.de/forum/thema/131567/?postID=1158359#post1158359
// Weitere Url     https://www.camp-firefox.de/forum/thema/138429/?postID=1257796#post1257796
// Weitere Url     https://www.camp-firefox.de/forum/thema/138429/?postID=1257854#post1257854
// Weitere Url     https://www.camp-firefox.de/forum/thema/112673/?postID=1247653#post1247653
(function() {
  if (!window.gBrowser)
    return;
  var contextMenu = document.getElementById('contentAreaContextMenu');
  var menuseparator = document.createXULElement('menuseparator');
  menuseparator.id = 'context-sep-closetab';
  contextMenu.append(menuseparator);
  var menuitem = document.createXULElement('menuitem');
  menuitem.id = 'context-closetab';
  menuitem.setAttribute('label', 'Tab schließen');
  menuitem.setAttribute('oncommand', 'BrowserCommands.closeTabOrWindow();');
  contextMenu.append(menuitem);
  var appcontent = document.getElementById('tabbrowser-tabbox');
  appcontent.addEventListener('contextmenu', event => { 
    setTimeout(() => {
      if (gContextMenu && !gContextMenu.shouldDisplay) {
        for (let string of 'back forward reload bookmarkpage'.split(' ')) {
          document.getElementById('context-' + string).removeAttribute('hidden');
        }
        document.getElementById('context-stop').setAttribute('hidden', 'true');
        const A = 'navigation sep-navigation savepage sep-paste selectall sep-viewsource viewsource viewinfo sep-bidi inspect-a11y inspect sep-closetab closetab'.split(' ');
        for (let node of contextMenu.childNodes) {
          if (A.includes(node.id.substring(8)))
            node.removeAttribute('hidden');
          else
            node.setAttribute('hidden', 'true');
        }
        contextMenu.openPopupAtScreen(event.screenX, event.screenY, true, event);
      }
    }, 50);
  });
})();// Translate_DeepL.uc.js
// https://github.com/ardiman/userChrome.js/tree/master/contexttranslate
// ex ContextTranslate.uc.js///
// modifiziert by universum 123, Umlaute geändert by 2002Andreas
// https://www.camp-firefox.de/forum/thema/126100/?postID=1107070#post1107070
(function () {
	if (location.href !== 'chrome://browser/content/browser.xhtml') return;
	let translate = function () {
		let browserMM = gBrowser.selectedBrowser.messageManager;
		browserMM.addMessageListener('getSelection', function listener(message) {
			let t = (message.data !== '');
			let e = (document.charset || document.characterSet);
			if (t) {
				openWebLinkIn('https://www.deepl.com/translator#en/de/' + encodeURIComponent(message.data), 'tab');
			} else {
				openWebLinkIn('https://www.deepl.com/translate?u=' + encodeURIComponent(gBrowser.currentURI.spec) + '&hl=de-DE&ie=' + e + '&sl=auto&tl=de-DE', 'tab');
			};
			browserMM.removeMessageListener('getSelection', listener, true);
		});
		browserMM.loadFrameScript('data:,sendAsyncMessage("getSelection", content.document.getSelection().toString())', true);
	}
	let menuitem = document.createXULElement('menuitem');
		menuitem.id = 'context-DeepLtranslate';
		menuitem.setAttribute('label', '\u00dcbersetzen (DeepL)');
		menuitem.setAttribute('oncommand', '(' + translate.toString() + ')()');
		menuitem.classList.add('menuitem-iconic');
	let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
	let ButtonIcon = "DeepL_2.png";
		menuitem.style.listStyleImage = 'url("' + ("file:" + ProfilePath + "/chrome/icons/" + ButtonIcon) + '")';
	let refItem = document.getElementById('context-inspect');
	refItem.parentNode.insertBefore(menuitem, refItem);
})();Das hier ist dem Vorherigen sehr ähnlich, nur dass per Google übersetzt wird!
// ContextTranslate_Google.uc.js
// https://github.com/ardiman/userChrome.js/tree/master/contexttranslate
// ex ContextTranslate.uc.js///
// modifiziert by universum 123, Umlaute geändert by 2002Andreas
// https://www.camp-firefox.de/forum/thema/126100/?postID=1107070#post1107070
(function () {
	if (location != 'chrome://browser/content/browser.xhtml')
		return;
	let translate = function () {
		let browserMM = gBrowser.selectedBrowser.messageManager;
		browserMM.addMessageListener('getSelection', function listener(message) {
			let t = (message.data !== '');
			let e = (document.charset || document.characterSet);
			if (t) {
                openWebLinkIn('https://translate.google.com/?sl=en&tl=de&text=' + encodeURIComponent(message.data), 'tab');
			} else {
				openWebLinkIn('https://translate.google.com/translate?u=' + encodeURIComponent(gBrowser.currentURI.spec) + '&hl=de-DE&ie=' + e + '&sl=auto&tl=de-DE', 'tab');
			};
			browserMM.removeMessageListener('getSelection', listener, true);
		});
		browserMM.loadFrameScript('data:,sendAsyncMessage("getSelection", content.document.getSelection().toString())', true);
	}
	let menuitem = document.createXULElement('menuitem');
	menuitem.id = 'context-googletranslate';
	menuitem.setAttribute('label', '\u00dcbersetzen (Google)');
	menuitem.setAttribute('oncommand', '(' + translate.toString() + ')()');
	menuitem.classList.add('menuitem-iconic');
	let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
	let ButtonIcon = "Google.svg";
	menuitem.style.listStyleImage = 'url("' + ("file:" + ProfilePath + "/chrome/icons/" + ButtonIcon) + '")';
    let refItem = document.getElementById('context-inspect');
	refItem.parentNode.insertBefore(menuitem, refItem);
})();// newTabButtonUndoTabList.uc.js
"use strict";
/* ******************************************************************************************************** */
/* Beschreibung                                                                                             */
/* Bei Rechtsklick auf die Neuen Tab Schaltfläche, wird im Kontextmenü,                                     */
/* der Eintrag zum Wiederherstellen des zuletzt geschlossenen Tabs angezeigt.                               */
/* Customized by BrokenHeart                                                                                */
/*                                                                                                          */
/* https://www.camp-firefox.de/forum/thema/112673/?postID=1223733#post1223733                               */
/* https://www.camp-firefox.de/forum/thema/112673/?postID=1228286#post1228286                               */
/*                                                                                                          */
/* ******************************************************************************************************** */
(function () {
    if (!window.gBrowser){
        return;
    }
    
    gBrowser.tabContainer.addEventListener('click', function (e) {
        if (e.originalTarget.id != 'tabs-newtab-button') return;
        switch (e.button) {
            case 1:
                undoCloseTab(0);
                break;
            case 2:
                UCT.makePopup(e);
                event.preventDefault();
                break;
        }
    }, false);
})();
var UCT = {
    init: function () {
        var mp = document.createXULElement("menupopup");
        mp.id = "undo-close-tab-list";
        mp.setAttribute("onpopupshowing", "UCT.onpopupshowing(event);");
        mp.setAttribute("placespopup", true);
        mp.setAttribute("tooltip", "bhTooltip");
        mp.setAttribute("popupsinherittooltip", true);
        document?.getElementById("mainPopupSet")?.appendChild(mp);
    },
    makePopup: function (e) {
        if (SessionStore.getClosedTabCountForWindow(window) != 0) {            
            document.getElementById("undo-close-tab-list").openPopupAtScreen(e.screenX +2, e.screenY +2, false);
        }
        else
        {
            console.log("--- Es gibt keinen Tab, der wiederhergestellt werden kann ---");
        }
    },
    onpopupshowing: function (e) {
        var popup = e.target;
        while (popup.hasChildNodes())
            popup.removeChild(popup.firstChild);
        let undoItems = SessionStore.getClosedTabDataForWindow(window);
        undoItems.map(function (item, id) {
            var m = document.createXULElement('menuitem');
            m.setAttribute('label', item.title);
            m.setAttribute('image', item.image );
            m.setAttribute('class', 'menuitem-iconic bookmark-item');
            m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
            popup.appendChild(m);
        });
    },
};
setTimeout(function() {
      UCT.init();
  },250);Das hatte ich schon mal gepostet, funktioniert aber nicht!
//SkipToTopAndBottom.uc.js
(function() {
    let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");  // Pfadangabe zum Profilordner
    let up = "arrow-up.svg";
    let menuitem = document.createXULElement('menuitem');
        menuitem.id = 'context-to-top';
        menuitem.classList.add('menuitem-iconic');
        menuitem.setAttribute('tooltiptext' , 'Zum Seitenanfang springen');
        menuitem.style.listStyleImage = 'url("' + ("file:" + ProfilePath + "/chrome/icons/" + up) + '")';
        menuitem.setAttribute('oncommand' , "ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo({ top: 0, left: 0, behavior: \"smooth\" }) ' , false);");
    let refItem = document.getElementById('context-reload');
    refItem.parentNode.insertBefore(menuitem, refItem);
     
    })();
    
    (function() {
    let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");  // Pfadangabe zum Profilordner
    let down = "arrow-down.svg";
    
    let menuitem = document.createXULElement('menuitem');
        menuitem.id = 'context-to-bottom';
        menuitem.classList.add('menuitem-iconic');
        menuitem.setAttribute('tooltiptext' , 'Zum Seitenende springen');
        menuitem.style.listStyleImage = 'url("' + ("file:" + ProfilePath + "/chrome/icons/" + down) + '")';
        menuitem.setAttribute('oncommand' , "ownerGlobal.gBrowser.selectedBrowser.messageManager.loadFrameScript(' data: , content.scrollTo({ top: 100000, left: 0, behavior: \"smooth\" }) ' , false);");
    let refItem = document.getElementById('context-reload');
    refItem.parentNode.insertBefore(menuitem, refItem);
     
    })();// ==UserScript==
// @name           UndoListInTabmenuToo.uc.js
// @namespace      http://space.geocities.yahoo.co.jp/gl/alice0775
// @description    Kürzlich geschlossene Tabsliste in Tab-Kontext und Hauptkontextmenü einfügen.
// @include        main
// @compatibility  Firefox 117
// @author         Alice0775
// @version        2023/07/02 Einträge für Fenster entfernt
// @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 Tab-Verlauf im Tooltip anzeigen
// @Note           Fügt die UndoClose-Tab-Liste zu Tabs und Kontextmenüs hinzu
// @OriginalCode   Orginalcode aus browser.js für populateUndoSubmenu verwenden
// @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 Mittelklick-Handhabung
// @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 Fx3.0.4pre Mittelklick-Popupmenü wurde nicht geschlossen und andere Korrekturen
// @version        2007/10/05 10:00
var UndoListInTabmenu = {
// -- config --
  TABCONTEXTMENU : false , //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 =`
      #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 Tabs
    const LABELTEXT = "Kürzlich geschlossene Tabs";    //create menu
    menu = document.createXULElement("menu");
    menu.setAttribute("label", LABELTEXT);
    menu.setAttribute("accesskey", "T");
    if (id)
      menu.setAttribute("id", id);
    var menupopup = document.createXULElement("menupopup");
    menupopup.setAttribute("onpopupshowing", "UndoListInTabmenu.populateUndoSubmenu(this);");
    menu.appendChild(menupopup);
    popup.insertBefore(menu, refItem);
    //Eventlistener hinzufügen
    popup.addEventListener('popupshowing',function(event) {
      UndoListInTabmenu.toggleRecentlyClosedWindows();
      if (UndoListInTabmenu._ss.getClosedTabCount(window) == 0) {
        menu.setAttribute("disabled", true);
        return;
      }
      menu.removeAttribute("disabled");
    },false);
  },
  
   /* Befüllen, wenn das Chronik-Menü geöffnet ist (Fx3.6) */
   
  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);
        undoPopup.firstChild.setAttribute("accesskey", "R");
        var m = undoPopup.insertBefore(document.createXULElement("menuitem"), undoPopup.childNodes[0]);
        m.setAttribute("label", "Letzten geschlossenen Tab wieder öffnen (s)");
        m.setAttribute("oncommand", "undoCloseTab()");
        m.setAttribute("accesskey", "o");
    undoPopup.insertBefore(document.createXULElement(""), undoPopup.childNodes[2]); 
  
    // populate tab historis for tooltip
    var undoItems = UndoListInTabmenu._ss.getClosedTabDataForWindow(window);
    for (var i = 0; i < undoItems.length; i++) {
      var entries = undoItems[i].state.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(""));
    m = undoPopup.appendChild(document.createXULElement("menuitem"));
    m.setAttribute("label", "Liste der letzten Tabs l\u00F6schen");
    m.setAttribute("accesskey", "h");
    m.addEventListener("command", function() {
      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() {
    // enable/disable the Recently Closed Windows sub menu
    let undoPopup = this.historyUndoWindowPopup3;
    // no restorable windows, so disable menu
    if (this._ss.getClosedWindowCount() == 0)
      this.historyUndoWindowPopup3.parentNode.setAttribute("disabled", true);
    else
      this.historyUndoWindowPopup3.parentNode.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");
    undoPopup.insertBefore(document.createXULElement(""), undoPopup.childNodes[1]);
    } 
};
// Wir sollten die Weiterleitung nur starten, wenn das Browserfenster den Startprozess abgeschlossen hat
// Ansonsten sollten wir warten, bis der Start 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");
    }Und das Letzte ist zu groß (lang), als dass ich es hier posten könnte.
Deshalb als ZIP
Ich hätte dies:
Translate_DeepL.uc.js
16_deepl_logo_moz.svg
// JavaScript Document
// M_Translate_DeepL.uc.js
// Das Script erstellt einen neuen Menüeintrag. Beim Klick auf den Eintrag öffnet die Seite https://www.deepl.com/...in einem neuen Tab und der vorher markierte Text wird übernommen.
// Bug: Sprache erkennen funktioniert nicht.
// Das .svg-Icon kann - je nach Hover-Zustand - mit zwei unterschiedlichen Farben gefüllt werden [fill]. Beim Überfahren des Menuitems vergrößert sich das Icon [scale: 1.1].
// Das Menü für den Menüeintrag kann selektiert werden (Seitenkontextmenü oder Tabkontextmenü).
// Die Position des Menüeintrags innerhalb des Menüs kann bestimmt werden.
// Darstellung des Menüeintrags mit/ohne Icon kann gewählt werden.
// Für das mitgelieferte Icon als .svg-Datei mit [moz-context-properties] ändert das Script - bei gewählter Iconanzeige [const isIcon = 1;] -  die Einstellung [svg.context-properties.content.enabled] in about:config auf 'true'.
(function() {
  if (!window.gBrowser)
	return;
// ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
const id = 'contextDeepletranslate'; // ID des neuen menuitems
const label = 'Deepl Translate'; // Bezeichnung des neuen menuitems
const tooltiptext = 'Mit DeeplTranslate übersetzen'; 
// Icon-------------------------------------------------------
const isIcon = 1;
// const isIcon = 1; mit Icon 
// const isIcon = 0; ohne Icon; die Konstanten icon, iconPath, iconColOu und iconColOv haben dann keine Funktion und sollten unberührt bleiben
const icon = '16_deepl_logo_moz.svg';  // [Name.Dateiendung] des anzuzeigenden Symbols
const iconPath = '/chrome/icons/'; // Pfad zum Ordner der das Icon beinhaltet
const iconColOu = 'steelblue';  // Farbe des Icons (nur .svg-Datei mit [moz-context-properties], bei anderen Icons hat const iconColOu keine Funktion)
const iconColOv = 'currentColor';  // Farbe des Icons beim Überfahren des Items (nur .svg-Datei mit [moz-context-properties], bei anderen Icons hat const iconColOv keine Funktion)
// Menü-------------------------------------------------------
const isMenu = 1; 
// const isMenu = 1; für Seitenkontextmenü; 
// const isMenu = 2; für Tabkontextmenü'; 
const isPos = 'context-translate-selection'; 
// Option A: 
// const isPos = 12; [Zahlen von -5 bis 20] 
// Menuitem an einer bestimmten Position im Menü einfügen 
// wie in CSS: [order:12!important;] 
// Option B: 
// const isPos = 'context-translate-selection'; [String] 
// Menuitem auf diesen Menüpunkt folgend einfügen 
// wie in CSS: [#context-translate-selection] 
// ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
const curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));
const cl = 'image';
const menu1 = document.getElementById('contentAreaContextMenu');
const menu2 = document.getElementById('tabContextMenu');
const menuitem = document.createXULElement('menuitem');
      menuitem.id = id;
      menuitem.setAttribute('label', label);
      menuitem.setAttribute('tooltiptext', tooltiptext);
//mit Icon	  
if (isIcon === 1) {
//----
	if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) {
		Services.prefs.setBoolPref('svg.context-properties.content.enabled', true );
	}
//----   
	  menuitem.classList.add('menuitem-iconic');
	  menuitem.style.MozContextProperties = 'fill';
	  menuitem.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")';
//Icon start
switch (isMenu) {
	case 1:
	menu1.addEventListener('popupshowing', () => {
	menuitem.querySelector(cl).style.fill = iconColOu;
});
	break;
	case 2:
	menu2.addEventListener('popupshowing', () => {
	menuitem.querySelector(cl).style.fill = iconColOu;
});
	break;
}
//Icon over
menuitem.addEventListener('mouseover', () => {
	  menuitem.querySelector(cl).setAttribute('style','fill:'+iconColOv+';scale: 1.1;transition: scale 0.2s ease-in-out 0.0s;');
});
//Icon out
menuitem.addEventListener('mouseout', () => {
	  menuitem.querySelector(cl).setAttribute('style','fill:'+iconColOu+';scale: 1.0;transition: scale 0.2s ease-in-out 0.0s;');
});
}
//Icon end
//click
menuitem.addEventListener('click', () => {
	if (event.button == 0) {
       	 translate();
            }
});
//Position order
if (isPos > -6 && isPos < 21) {
	if (isMenu === 1) {
		  menu1.append(menuitem);
	} 
	else
	if (isMenu === 2) {
	  	  menu2.append(menuitem);
	}
menuitem.style.order = isPos;
}
//Position reference
else {
const refItem = document.getElementById(isPos); 
 	  refItem.parentNode.insertBefore(menuitem, refItem.nextSibling);
}
//----
function translate() {
const browserMM = gBrowser.selectedBrowser.messageManager;
	  browserMM.addMessageListener('getSelection', function listener(message) {
const t = (message.data !== '');
const e = (document.charset || document.characterSet);
	if (t) {
		openTrustedLinkIn('https://www.deepl.com/translator#en/de/' + encodeURIComponent(message.data), 'tab');
	} 
	else {
		openTrustedLinkIn('https://www.deepl.com/translate?u=' + encodeURIComponent(gBrowser.currentURI.spec) + '&hl=de-DE&ie=' + e + '&sl=auto&tl=de-DE', 'tab');
	};
		browserMM.removeMessageListener('getSelection', listener, true);
		});
		browserMM.loadFrameScript('data:,sendAsyncMessage("getSelection", content.document.getSelection().toString())', true);
};
//----
})();/* Restart item script for Firefox 89+ by Aris
Du hattest doch schon ein anderes Restart-Script hier gepostet... 
// newTabButtonUndoTabList.uc.js
Siehe #109
//SkipToTopAndBottom.uc.js
Siehe #100
zu1. 
Oh, ehrlich? Dann muss ich noch mal schauen.
zu2. Habe ich übersehen! Sorry.
 Habe ich übersehen! Sorry.
zu3.
Danke, habe ich nach diesem "Muster" korrigiert.
Nachtrag!
zu2.
        let undoItems = SessionStore.getClosedTabDataForWindow(window);
        undoItems.map(function (item, id) {
            var m = document.createXULElement('menuitem');
            m.setAttribute('label', item.title);
            m.setAttribute('image', item.image );
            m.setAttribute('class', 'menuitem-iconic bookmark-item');
        //    m.setAttribute('oncommand', 'undoCloseTab(' + id + ')');
            m.addEventListener('command', function(event) {
				undoCloseTab(' + id + ');
			}, true);
            popup.appendChild(m);
        });will einfach nicht! Why?
 Nachtrag II
Nachtrag II
Ich Hirni  ! Zeile 40 vergessen. Jetzt funktioniert es.
! Zeile 40 vergessen. Jetzt funktioniert es.
Letzter Nachtrag!
zu1.
Ja, aber es funktioniert wohl ganz anders und ich habe jenes gar nicht in Benutzung,
sondern habe nur jenes von FuchsFan angepasst!
"Mein" Skript generiert einen verschiebbaren Button.
Kann man für einzelne Skripts nicht ein Unterforum aufmachen
Oder eine Liste, in denen die Skripte verlinkt werden. Das kann aber immer nur einer bearbeiten (plus Admin und Moderator).
Das stört mich quasi schon von Anfang an. Ich hatte mal ein ergänzendes Wiki vorgeschlagen. Der Vorteil wäre, dass dort mehr als eine Person editieren könnten.
Hallo,
funktioniert bei mir auch nicht. 
(function() {
// Add "Restart" to menu > file
var menuitem = document.createXULElement('menuitem');
menuitem.id = 'uc_menu_Restart';
menuitem.setAttribute('label' , 'Neustarten');
menuitem.setAttribute('oncommand' , "Services.appinfo.invalidateCachesOnRestart() || Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);");
var refItem = document.getElementById('menu_FileQuitItem');
refItem.parentNode.insertBefore(menuitem, refItem);
})();Mal bitte diese Version testen...
	grisu2099  Funktioniert perfekt, danke: 

