1. Nachrichten
  2. Forum
    1. Unerledigte Themen
    2. Forenregeln
  3. Spenden
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. camp-firefox.de
  2. Endor

Beiträge von Endor

  • AddOnLister.uc.js funktioniert in Fx 138 nicht mehr.

    • Endor
    • 4. Mai 2025 um 20:48

    Hallo milupo und Mira_Belle .
    Vielen Dank nochmals und habe ich schon erledigt:

    userChrome.js/Firefox 138/AddOnLister.uc.js at master · Endor8/userChrome.js
    Skripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.
    github.com

    Mira_Belle
    Danke für das Einfügen der neuen Versionsnummer.
    :thumbup:

    Mfg.
    Endor

  • AddOnLister.uc.js funktioniert in Fx 138 nicht mehr.

    • Endor
    • 4. Mai 2025 um 19:59

    Hallo milupo.
    Vielen Dank funktioniert wieder bestens.
    Habe es in Firefox 138.0.1 und 139.0b3 getestet.
    Alles funktioniert wie es soll.
    :thumbup:

    Mfg.
    Endor

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • Endor
    • 1. Mai 2025 um 19:33

    Hallo GermanFreme82
    Ne das schaff ich nicht. Ich brauche auch immer Hilfe....
    Ändere in Zeile 35 bei TabBar_Position die 0 auf 1, starte Firefox neu mit Cache leeren
    dann müsste die Tableiste wieder unten sein.
    Mfg.
    Endor

  • AddOnLister.uc.js funktioniert in Fx 138 nicht mehr.

    • Endor
    • 1. Mai 2025 um 17:32

    Das wäre die Version für Firefox.
    Das Script hat seinerzeit Mithrandir gemacht.

    HTML
    // ==UserScript==
    // @name           AddOnLister.uc.js
    // @compatibility  Firefox 36.*, 37.*, 60.*, 63.*,113.*
    // @include        main
    // @version        1.0.20230519
    // ==/UserScript==
    
    var ADONLI = {
    
    // ----- Start Konfiguration
    	// folgende Add-ons nicht auflisten Beispiel: ["InfoLister","AddOnLister.uc.js"]
    	BLACKLIST:			[],
    	// einige Tests der Konfiguration durchführen (true oder false)?
    	CHECKCONFIG:		true,
    	// ans eigene System anpassen - Pfad mit Verzeichnistrenner abschliessen. Unter Windows den \ bitte verdoppeln
    	EXPORTPATH:			"C:\\Users\\Paulmichl\\Documents\\Firefox\\",
    	//Dateinamen ohne(!) Erweiterung eingeben - diese wird weiter unten im Wert "fileext" pro Ausgabeformat definiert
    	EXPORTFILE:			"addonlister",
    	// Ausgabeformat bbcode, html oder custom
    	FORMAT:				"bbcode",
    	// Erstellungsdatum anzeigen (true oder false)
    	SHOWDATE:			true,
    	// Useragent anzeigen (true oder false)
    	SHOWUSERAGENT:		true,
    	// Versuche folgende userChromeJS-Skripte *nicht* mit GitHub zu verlinken, weil nicht gewünscht oder möglich. ["*"] für gar keine Verlinkung
    	GITHUBBLACKLIST:	["about-config.uc.js", "about-plugins.uc.js" ,"AddonsSidebar.uc.xul", "autopopupablepatch1.uc.js", "autopopupablepatch3.uc.js", "Chronik-Lesezeichen.uc.js", "Close-other-tabs.uc.js", "ContextHistory.uc.xul", "CustomAppMenu.uc.js", "Download-button.uc.js", "Einstellungen-Customize.uc.js", "element_inspector.uc.js", "Entwickler-Werkzeug.uc.js", "expandsidebar40.uc.js", "favicon-about-plugins.uc.js", "feedbutton-urlbar.uc.js",	"Fehlerkonsole.uc.js", "Link-per-Email.uc.js", "liste-leeren.uc.js", "memorymonitor.uc.js", "open-folder.uc.js", "OpenDownloadFolderButtonM.uc.js", "OpenLibraryContextMenu.uc.xul", "Preferences.uc.js", "RestartFirefox_plus.uc.js", "savefoldermodoki.uc.xul", "scrollTotop-bottom.uc.js", "searchplugin-4-aboutconfig.uc.js", "speedupErrorConsole.uc.js", "Statusbar-Date.uc.js", "Stylish-Fenster-Sidebar.uc.js", "Tabmixplus-Einstelungen-in-Tabkontext.uc.js", "Tabmixplus-Options.uc.js", "ucjs_PrivateToolMenus-APP.uc.js", "ucjs_statusbar_zoom_panel_1.3.uc.js", "WebDeveloper-Menu.uc.js"],
    	// In der folgenden Zeile  den Pfad zum Texteditor eintragen (unter Ubuntu 10.04 z.B.: '/usr/bin/gedit'). Bei Fehleintrag wird view_source.editor.path ausgelesen:
    	TEXTOPENEXE :		'C:\\Program Files\\Notepad++\\notepad++.exe',
    	// Aufzulistende Add-On-Typen festlegen - möglich sind: ["extension","theme","plugin","dictionary","service","userstyle","greasemonkey-user-script","userchromejs"]
    	WHICHTYPES:			["extension","theme","plugin","dictionary","userchromejs"],
    // ----- Ende Konfiguration
    
    // ----- Start Expertenkonfiguration
    	ICON_URL:	"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACGUlEQVR42mL8//8/AzJYtWy+G5ByB2IrINaECl8H4mNAvDMsKnEXsnqAAGIEGXDv1nmGM2cuKAD5OUCcAcTcDNjBVyCeAcRTTEwMHiipGTIABBALSBSquRmIY5iZmT8ICvI/FxQU4OHm5mID6/r67df79x++vH//kfPv37/FQCFxoJ5aoAEPAAKIBWoyyOYYdnb2Z9LSkqxCQgKSyNby8/OxAzEvH9+H10+fPn/28+fPGKDwSyAuAQggZi01eZCfu4E2f5OVlWYAahaFaTx95jyDnaM3Ax8fL4OhgS4DJycHNysr649Pnz7/Bnrd/OrlC2cAAogJGmDcQGd/Q9YMAv8YORmSkpIY+Hh54GIgNSC10HByBwggFmhoMwD9LIgeYrKSAgz+Ps4MOtqaKOIgtW/evAMxrQACiAkWVcAAY0JWBHQmg7d/ONgb6ABJrSZAADHhiC6G3Xv2gw1xdXFgwAcAAogJmkhAUfUPWeL+w8cMamoqDDLSUgxMbKi+Q1J7HSCAmKApjAEYz++RFV2/fouBg52dYeXqDQzHj+xGMQBJ7TGAAAIZsBNkKDCRcL179+E1TJGXpysDCysbw4dPPxjMzUzgmkFqQGqhqXInQACBkzIw/fcAOcVICUkUm39BmoEJ6TcwIUkBub3AfFECEECwlDgFlDxBKezhw8cfPn36hC8pgwxfAtXDABBAFGcmgABipDQ7AwQYAOqo3UvZE3l2AAAAAElFTkSuQmCC",
    	MYTPLS:{
    		'html':	//für Darstellung als vollständiges html5-Dokument
    			{
    			'fileext':'html',
    			'opendatauri': false,
    			'intro':'<!DOCTYPE html>\n<html>\n<head>\n<meta charset="UTF-8">\n'
    				+'<title>Meine Firefox-Informationen</title>\n</head>\n<body>\n<h1>Meine Firefox-Informationen</h1>\n',
    			'tpllastupd':'<div>\nLetzte Aktualisierung: %%lastupd%%\n</div>',
    			'tpluseragent':'<div>\nUser Agent: %%useragent%%\n</div>',
    			'tpladdongrp_title':{
    								'extension':'<div id="extensions">\n<h2>Erweiterungen <small>(aktiviert: %%countactive%%, deaktiviert: %%countinactive%%, gesamt: %%count%%)</small></h2>',
    								'theme':'<div id="themes">\n<h2>Themes <small>(%%count%%)</small></h2>',
    								'plugin':'<div id="plugins">\n<h2>Plugins <small>(%%count%%)</small></h2>',
    								'dictionary':'<div id="dictionaries">\n<h2>Wörterbücher <small>(%%count%%)</small></h2>',
    								'service':'<div id="services">\n<h2>Dienste <small>(%%count%%)</small></h2>',
    								'userstyle':'<div id="userstyles">\n<h2>Userstyles <small>(%%count%%)</small></h2>',
    								'greasemonkey-user-script':'<div id="gmscripts">\n<h2>Greasemonkey <small>(aktiviert: %%countactive%%, deaktiviert: %%countinactive%%, gesamt: %%count%%)</small></h2>',
    								'userchromejs':'<div id="userchromejs">\n<h2>userChromeJS <small>(%%count%%)</small></h2>'
    								},
    			'tpladdongrp_intro':{
    								'default':'',
    								'greasemonkey-user-script':'<p>Greasemonkey-Skripte können Webseiten um diverse Funktionen erweitern.</p>',
    								'userchromejs':'<p>Durch die Erweiterung <a href="http://userchromejs.mozdev.org/">userChromeJS</a> eingebundene Skripte ergänzen den Firefox um diverse Funktionen.</p>'
    								},
    			'tpladdongrp_list_intro':{
    								'default':'<ul>'
    								},
    			'tpladdon':'<li class="%%class%%"><a href="%%homepageURL%%">%%name%%</a> %%version%%: %%description%%%%disabled%%</li>\n',
    			'tpladdon_without_url':'<li class="%%class%%">%%name%% %%version%%: %%description%%%%disabled%%</li>\n',
    			'activeclass':'addonactive',
    			'inactiveclass':'addoninactive',
    			'disabledtext':'<small><span style="color:#ff0000;">[deaktiviert]</span></small>',
    			'tpladdongrp_list_outro':'</ul>\n',
    			'tpladdongrp_outro':'</div>\n\n',
    			'outro':'</body>\n</html>'
    			},
    		'bbcode':	//für Postings in Foren, die bbcode unterstützen
    			{
    			'fileext':'txt',
    			'opendatauri': true,
    			'intro':'Meine Firefox-Informationen\n\n',
    			'tpllastupd':'Letzte Aktualisierung: %%lastupd%%',
    			'tpluseragent':'User Agent: %%useragent%%\n',
    			'tpladdongrp_title':{
    								'extension':'[b]Erweiterungen[/b] (aktiviert: %%countactive%%, deaktiviert: %%countinactive%%, gesamt: %%count%%)',
    								'theme':'[b]Themes[/b] (%%count%%)',
    								'plugin':'[b]Plugins[/b] (%%count%%)',
    								'dictionary':'[b]Wörterbücher[/b] (%%count%%)',
    								'service':'[b]Dienste[/b] (%%count%%)',
    								'userstyle':'[b]Userstyles[/b] (%%count%%)',
    								'greasemonkey-user-script':'[b]Greasemonkey[/b] (aktiviert: %%countactive%%, deaktiviert: %%countinactive%%, gesamt: %%count%%)',
    								'userchromejs':'[b]userChromeJS[/b] (%%count%%)'
    								},
    			'tpladdongrp_intro':{
    								'default':'',
    								'greasemonkey-user-script':'Greasemonkey-Skripte können Webseiten um diverse Funktionen erweitern.',
    								'userchromejs':'Durch die Erweiterung [url=http://userchromejs.mozdev.org/]userChromeJS[/url] eingebundene Skripte ergänzen den Firefox um diverse Funktionen.'
    								},
    			'tpladdongrp_list_intro':{
    								'default':'[list]'
    								},
    			'tpladdon':'[*][url=%%homepageURL%%]%%name%%[/url] %%version%%: %%description%%%%disabled%%\n',
    			'tpladdon_without_url':'[*]%%name%% %%version%%: %%description%%%%disabled%%\n',
    			'activeclass':'addonactive',
    			'inactiveclass':'addoninactive',
    			'disabledtext':' [color=red][deaktiviert][/color]',
    			'tpladdongrp_list_outro':'[/list]\n',
    			'tpladdongrp_outro':'\n',
    			'outro':''
    			},
    		'custom':	//Beispiel - für Darstellung als "include" in einem anderen (x)html-Dokument
    			{
    			'fileext':'txt',
    			'opendatauri': true,
    			'intro':'<p id="bsbuttons">\n'
    				+'<a class="tab active" href="http://www.ardiman.de/sonstiges/fxconfig.html?mode=windows">Windows 7</a>\n'
    				+'<a class="tab" href="http://www.ardiman.de/sonstiges/fxconfig.html?mode=ubuntu">XUbuntu</a>\n'
    				+'</p>\n'
    				+'<div id="buttons">\n'
    				+'<a class="tab" href="http://www.ardiman.de/sonstiges/fxconfig.html#extensions">Erweiterungen</a>\n'
    				+'<a class="tab" href="http://www.ardiman.de/sonstiges/fxconfig.html#themes">Themes</a>\n'
    				+'<a class="tab" href="http://www.ardiman.de/sonstiges/fxconfig.html#plugins">Plugins</a>\n'
    				//+'<a class="tab" href="http://www.ardiman.de/sonstiges/fxconfig.html#dictionaries">Wörterbücher</a>\n'
    				//+'<a class="tab" href="http://www.ardiman.de/sonstiges/fxconfig.html#services">Dienste</a>\n'
    				//+'<a class="tab" href="http://www.ardiman.de/sonstiges/fxconfig.html#userstyles">Userstyles</a>\n'
    				+'<a class="tab" href="http://www.ardiman.de/sonstiges/fxconfig.html#gmscripts">Greasemonkey</a>\n'
    				+'<a class="tab" href="http://www.ardiman.de/sonstiges/fxconfig.html#userchromejs">userChromeJS</a>\n'
    				+'<br/></div>\n',
    			'tpllastupd':'<div class="lastupd">\nLetzte Aktualisierung: %%lastupd%%\n</div>',
    			'tpluseragent':'<div class="useragent">\nUser Agent: %%useragent%%\n</div>',
    			'tpladdongrp_title':{
    								'extension':'<div id="extensions" class="tab-element">\n<h2><img alt="" style="float: right; margin: 0.5ex 1ex 0 0;" width="16" height="16" src="/assets/images/fx_extensions.png" />Erweiterungen <small>(aktiviert: %%countactive%%, deaktiviert: %%countinactive%%, gesamt: %%count%%)</small></h2>',
    								'theme':'<div id="themes" class="tab-element">\n<h2><img alt="" style="float: right; margin: 0.5ex 1ex 0 0;" width="16" height="16" src="/assets/images/fx_themes.png" />Themes <small>(%%count%%)</small></h2>',
    								'plugin':'<div id="plugins" class="tab-element">\n<h2><img alt="" style="float: right; margin: 0.5ex 1ex 0 0;" width="16" height="16" src="/assets/images/fx_plugins.gif" />Plugins <small>(%%count%%)</small></h2>',
    								'dictionary':'<div id="dictionaries" class="tab-element">\n<h2><img alt="" style="float: right; margin: 0.5ex 1ex 0 0;" width="16" height="16" src="/assets/images/fx_dictionaries.png" />Wörterbücher <small>(%%count%%)</small></h2>',
    								'service':'<div id="services" class="tab-element">\n<h2><img alt="" style="float: right; margin: 0.5ex 1ex 0 0;" width="16" height="16" src="/assets/images/fx_services.png" />Dienste <small>(%%count%%)</small></h2>',
    								'userstyle':'<div id="userstyles" class="tab-element">\n<h2><img alt="" style="float: right; margin: 0.5ex 1ex 0 0;" width="16" height="16" src="/assets/images/fx_styles.png" />Userstyles <small>(%%count%%)</small></h2>',
    								'greasemonkey-user-script':'<div id="gmscripts" class="tab-element">\n<h2><img alt="" style="float: right; margin: 0.5ex 1ex 0 0;" width="16" height="16" src="/assets/images/fx_monkey.png" />Greasemonkey <small>(aktiviert: %%countactive%%, deaktiviert: %%countinactive%%, gesamt: %%count%%)</small></h2>',
    								'userchromejs':'<div id="userchromejs" class="tab-element">\n<h2><img alt="" style="float: right; margin: 0.5ex 1ex 0 0;" width="16" height="16" src="/assets/images/fx_javascript.gif" />userChromeJS <small>(%%count%%)</small></h2>'
    								},
    			'tpladdongrp_intro':{
    								'default':'',
    								'greasemonkey-user-script':'<p>Einige Skripte stammen direkt von mir (s. auch <a href="http://www.ardiman.de/sonstiges/fxconfig/gmskripte.html">Greasemonkey-Skripte</a> bzw. <a class="extlink" href="https://openuserjs.org/users/ardiman/scripts" rel="nofollow">https://openuserjs.org/users/ardiman/scripts</a>), andere wurden nur geringf&uuml;gig angepasst.</p>',
    								'userchromejs':'<p id="fxcuclisteintro">Durch die Erweiterung userChromeJS eingebundene Skripte erg&auml;nzen den Firefox um diverse Funktionen.</p>'
    								},
    			'tpladdongrp_list_intro':{
    								'default':'<ul>',
    								'userchromejs':'<ul id="fxcucliste">'
    								},
    			'tpladdon':'<li class="%%class%%"><a href="%%homepageURL%%" rel="nofollow" class="extlink">%%name%%</a> %%version%%: %%description%%%%disabled%%</li>\n',
    			'tpladdon_without_url':'<li class="%%class%%">%%name%% %%version%%: %%description%%%%disabled%%</li>\n',
    			'activeclass':'addonactive',
    			'inactiveclass':'addoninactive',
    			'disabledtext':' <small>[deaktiviert]</small>',
    			'tpladdongrp_list_outro':'</ul>\n',
    			'tpladdongrp_outro':'</div>\n\n',
    			'outro':''
    			}
    	},
    // ----- Ende Expertenkonfiguration
    
    	MYSTOR: {},
        FILEUTILS: ChromeUtils.importESModule('resource://gre/modules/FileUtils.sys.mjs').FileUtils,
    
    	init: function() {
    		// legt verschiebbaren Button und Menü unter Extras an
    		// Button
    		if (location != "chrome://browser/content/browser.xhtml") return;
    		try {
    			CustomizableUI.createWidget({
    				id: 'adonli-button',
    				type: 'custom',
    				// defaultArea: CustomizableUI.AREA_NAVBAR,
    				onBuild: function(aDocument) {
    					var toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
    					var attributes = {
    						id: 'adonli-button',
    						class: 'toolbarbutton-1 chromeclass-toolbar-additional',
    						removable: 'true',
    						label: 'AddonLister',
    						tooltiptext: 'AddOnLister starten (Erstellung im Format »'+ADONLI.FORMAT+'«):\nLinksklick öffnet Ergebnis im Editor\nMittelklick öffnet Ergebnis als Tab im Browser\nRechtsklick exportiert die Liste ohne Anzeige im Editor oder Browser',
    						style: 'list-style-image: url(' + ADONLI.ICON_URL + ')',
    						onclick: 'event.preventDefault(); return ADONLI.launch(event.button, \"' + ADONLI.FORMAT +'\");'
    					};
    				for (var a in attributes)
    					toolbaritem.setAttribute(a, attributes[a]);
    					return toolbaritem;
    				}
    			});
    		} catch(e) { };
    		// Menü
    		function addNode(parentId, type, attributes) {
    			let node = document.createXULElement(type);
    			for (let a in attributes) {
    				node.setAttribute(a, attributes[a]);
    			};
    			document.getElementById(parentId).appendChild(node);
    		};
    		addNode("menu_ToolsPopup", "menu", {
    			id: "menu_ucjsAddonLister",
    			accesskey: "L",
    			label: "AddonLister",
    			class: "menu-iconic",
    			style: "list-style-image: url(" + ADONLI.ICON_URL + ")"
    		});
    		document.getElementById("menu_ToolsPopup")
    			.insertBefore(document.getElementById("menu_ucjsAddonLister"),
    			              document.getElementById("menu_openAddons").nextSibling);
    		addNode("menu_ucjsAddonLister", "menupopup", {
    			id: "menu_ucjsAddonLister-popup"
    		});
    		addNode("menu_ucjsAddonLister-popup", "menu", {
    			id: "menu_ucjsAddonLister-bbcode",
    			accesskey: "B",
    			label: "BBCODE",
    			class: "menu-iconic"
    		});
    		addNode("menu_ucjsAddonLister-bbcode", "menupopup", {
    			id: "menu_ucjsAddonLister-popup-bbcode"
    		});
    		addNode("menu_ucjsAddonLister-popup-bbcode", "menuitem", {
    			id: "menu_ucjsAddonLister_editor-bbcode",
    			class: "menAddonLister_item",
    			oncommand: "ADONLI.launch(0,\'bbcode\')",
    			accesskey: "E",
    			label: "Liste erstellen und im Editor anzeigen"
    		});
    		addNode("menu_ucjsAddonLister-popup-bbcode", "menuitem", {
    			id: "menu_ucjsAddonLister_browser-bbcode",
    			class: "menAddonLister_item",
    			oncommand: "ADONLI.launch(1,\'bbcode\')",
    			accesskey: "A",
    			label: "Liste erstellen und im Browser anzeigen"
    		});
    		addNode("menu_ucjsAddonLister-popup-bbcode", "menuitem", {
    			id: "menu_ucjsAddonLister_write-bbcode",
    			class: "menAddonLister_item",
    			oncommand: "ADONLI.launch(2,\'bbcode\')",
    			accesskey: "o",
    			label: "Liste erstellen ohne Anzeige"
    		});
    		addNode("menu_ucjsAddonLister-popup", "menu", {
    			id: "menu_ucjsAddonLister-html",
    			accesskey: "H",
    			label: "HTML",
    			class: "menu-iconic"
    		});
    		addNode("menu_ucjsAddonLister-html", "menupopup", {
    			id: "menu_ucjsAddonLister-popup-html"
    		});
    		addNode("menu_ucjsAddonLister-popup-html", "menuitem", {
    			id: "menu_ucjsAddonLister_editor-html",
    			class: "menAddonLister_item",
    			oncommand: "ADONLI.launch(0,\'html\')",
    			accesskey: "E",
    			label: "Liste erstellen und im Editor anzeigen"
    		});
    		addNode("menu_ucjsAddonLister-popup-html", "menuitem", {
    			id: "menu_ucjsAddonLister_browser-html",
    			class: "menAddonLister_item",
    			oncommand: "ADONLI.launch(1,\'html\')",
    			accesskey: "A",
    			label: "Liste erstellen und im Browser anzeigen"
    		});
    		addNode("menu_ucjsAddonLister-popup-html", "menuitem", {
    			id: "menu_ucjsAddonLister_write-html",
    			class: "menAddonLister_item",
    			oncommand: "ADONLI.launch(2,\'html\')",
    			accesskey: "o",
    			label: "Liste erstellen ohne Anzeige"
    		});
    		addNode("menu_ucjsAddonLister-popup", "menu", {
    			id: "menu_ucjsAddonLister-custom",
    			accesskey: "C",
    			label: "Custom",
    			class: "menu-iconic"
    		});
    		addNode("menu_ucjsAddonLister-custom", "menupopup", {
    			id: "menu_ucjsAddonLister-popup-custom"
    		});
    		addNode("menu_ucjsAddonLister-popup-custom", "menuitem", {
    			id: "menu_ucjsAddonLister_editor-custom",
    			class: "menAddonLister_item",
    			oncommand: "ADONLI.launch(0,\'custom\')",
    			accesskey: "E",
    			label: "Liste erstellen und im Editor anzeigen"
    		});
    		addNode("menu_ucjsAddonLister-popup-custom", "menuitem", {
    			id: "menu_ucjsAddonLister_browser-custom",
    			class: "menAddonLister_item",
    			oncommand: "ADONLI.launch(1,\'custom\')",
    			accesskey: "A",
    			label: "Liste erstellen und im Browser anzeigen"
    		});
    		addNode("menu_ucjsAddonLister-popup-custom", "menuitem", {
    			id: "menu_ucjsAddonLister_write-custom",
    			class: "menAddonLister_item",
    			oncommand: "ADONLI.launch(2,\'custom\')",
    			accesskey: "o",
    			label: "Liste erstellen ohne Anzeige"
    		});
    		addNode("menu_ucjsAddonLister-popup", "menuitem", {
    			tooltiptext: "Erstellung im Format »" + ADONLI.FORMAT + "«",
    			id: "menu_ucjsAddonLister_editor",
    			class: "menAddonLister_item",
    			oncommand: "ADONLI.launch(0,\'" + ADONLI.FORMAT + "\')",
    			accesskey: "E",
    			label: "Liste erstellen und im Editor anzeigen"
    		});
    		addNode("menu_ucjsAddonLister-popup", "menuitem", {
    			tooltiptext: "Erstellung im Format »" + ADONLI.FORMAT + "«",
    			id: "menu_ucjsAddonLister_browser",
    			class: "menAddonLister_item",
    			oncommand: "ADONLI.launch(1,\'" + ADONLI.FORMAT + "\')",
    			accesskey: "A",
    			label: "Liste erstellen und im Browser anzeigen"
    		});
    		addNode("menu_ucjsAddonLister-popup", "menuitem", {
    			tooltiptext: "Erstellung im Format »" + ADONLI.FORMAT + "«",
    			id: "menu_ucjsAddonLister_write",
    			class: "menAddonLister_item",
    			oncommand: "ADONLI.launch(2,\'" + ADONLI.FORMAT + "\')",
    			accesskey: "o",
    			label: "Liste erstellen ohne Anzeige"
    		});
    	},
    
    	launch: function(e,format) {
    		// ruft alle noetigen Funktionen nach Klick auf Toolbarbutton auf
    		var ctrlConf = "";
    		if (this.CHECKCONFIG) ctrlConf = this.configCheck();
    		if (ctrlConf === "") {
    			var expfile =  this.EXPORTPATH + this.EXPORTFILE + "." + this.MYTPLS[format].fileext;
    			this.getOtherValues();
    			this.resetStor();
    			this.getAddons();
    			if (this.WHICHTYPES.indexOf('userchromejs') !== -1) this.getScripts();
    			var result = this.writeAddons(expfile,format);
    			this.showAddons(e,this.TEXTOPENEXE,expfile,format,result);
    		} else {
    			alert ("Lt. Konfigurationstest des AddonListers muss folgendes kontrolliert werden:\n" + ctrlConf);
    		}
    	},
    
    	configCheck: function() {
    		var fehler = "";
    		// Kontrolle des Pfades
    		if (this.EXPORTPATH.substr(-1) !== "\\" && this.EXPORTPATH.substr(-1) !== "/") fehler += "\n - Der Pfad in EXPORTPATH endet nicht mit einem Verzeichnistrenner.";
    		if (!this.fileExists(this.EXPORTPATH)) fehler += "\n - Der Pfad »" + this.EXPORTPATH + "« in EXPORTPATH existiert nicht.";
    		// Kontrolle des Dateinamens
    		if (this.EXPORTFILE.indexOf(".") !== -1) fehler += "\n - Der Dateiname in EXPORTFILE sollte keinen Punkt enthalten (ohne Erweiterung sein).";
    		if (this.EXPORTFILE.length === 0) fehler += "\n - Es wurde kein Dateiname in EXPORTFILE hinterlegt.";
    		// Kontrolle des Formates
    		var formate = ["bbcode", "custom", "html"];
    		if (formate.indexOf(this.FORMAT) === -1) fehler += "\n - Ungültiges FORMAT »" + this.FORMAT + "«.";
    		// Kontrolle des Editors
    		if (!this.fileExists(this.TEXTOPENEXE)) {
    			var pref = Cc["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
    			if (!this.fileExists(pref.getCharPref("view_source.editor.path"))) {
    				fehler += "\n - Der in TEXTOPENEXE und about:config [view_source.editor.path] hinterlegte Editor kann nicht gefunden werden.";
    			}
    		}
    		// Kontrolle der gewünschten Addon-Typen, folgende sind momentan gültig:
    		var addontypes = ["extension","theme","plugin","dictionary","service","userstyle","greasemonkey-user-script","userchromejs"];
    		var w;
    		for (w = 0; w < this.WHICHTYPES.length; w++) {
    			if (addontypes.indexOf(this.WHICHTYPES[w]) === -1) {
    				fehler += "\n - In WHICHTYPES wurden ein oder mehrere unbekannte Add-on-Typen (z.B. »" + this.WHICHTYPES[w] + "«) gewählt.";
    				break;
    			}
    		}
    		return fehler;
    	},
    
    	fileExists: function(mypath) {
    		// kontrolliert, ob Pfad oder Datei gültig/vorhanden ist
    		var file = new this.FILEUTILS.File(mypath);
    		return file.exists();
    	},
    
    	resetStor: function() {
    		// setzt das JSON-Object (bzw. die "Listen" darin) zurueck
    		var h;
    		for (h = 0; h < this.WHICHTYPES.length; h++) {
    			this.MYSTOR[this.WHICHTYPES[h]] = [];
    		}
    	},
    
    	getOtherValues: function() {
    		// speichert momentan Auswertungsdatum und useragent im JSON-Object
    		var options;
    		options = {weekday: "long", year: "numeric", month: "long", day: "numeric", hour: "numeric", minute: "numeric", second: "numeric", hour12: false};
    		if (this.SHOWDATE) this.MYSTOR["lastupd"] = new Date().toLocaleDateString("de-DE", options);
    		if (this.SHOWUSERAGENT) this.MYSTOR["useragent"] = window.navigator.userAgent;
    	},
    
    	getAddons: function() {
    		// speichert die gewaehlten Addons (s. WHICHTYPES) im JSON-Object
    		var i, x, j, iAo, Addons, added, storedItems;
    		AddonManager.getAddonsByTypes(this.WHICHTYPES).then(function(addonlist) {
    			Addons = addonlist;
    		});
    		var thread = Cc['@mozilla.org/thread-manager;1'].getService().mainThread;
    		while (Addons === void(0)) {
    			thread.processNextEvent(true);
    		}
    		// Schleife ueber Addons
    		for (i = 0; i < Addons.length; i++) {
    			iAo = Addons[i];
    			added = false;
    			storedItems = this.MYSTOR[iAo.type].length;
    			// nächste Aktionen nur, wenn Addon *nicht* in BLACKLIST steht
    			if (this.BLACKLIST.indexOf(iAo.name) === -1) {
    				// Ablage gleich sortiert vornehmen
    				for (j = 0; j < storedItems; j++) {
    					if (iAo.name.toLowerCase() < this.MYSTOR[iAo.type][j].name.toLowerCase()) {
    						this.MYSTOR[iAo.type].splice(j,0,{ 'name': iAo.name, 'version': iAo.version, 'active': iAo.isActive, 'homepage': iAo.homepageURL});
    						added = true;
    						break;
    					}
    				}
    				if (!added) this.MYSTOR[iAo.type].push({ 'name': iAo.name, 'version': iAo.version, 'active': iAo.isActive, 'homepage': iAo.homepageURL});
    			}
    		}
    	},
    
    	getScripts: function() {
    		// speichert ggf. im Chrome-Ordner vorhandene uc.js und uc.xul-Dateien im JSON-Object
    		var hp, j, storedItems, added;
    		// Suchmuster, also die Dateierweiterungen uc.js und uc.xul
    		let extjs = /\.uc\.js$/i;
    		let extxul = /\.uc\.xul$/i;
    		let aFolder = Cc["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("UChrm", Components.interfaces.nsIFile);
    		// files mit Eintraegen im Chrome-Ordner befuellen
    		let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
    		// Ordner bzw. Dateien durchlaufen und kontrollieren, ob gesuchte Dateien dabei sind
    		while (files.hasMoreElements()) {
    			let file = files.getNext().QueryInterface(Ci.nsIFile);
    			// keine gewuenschte Datei, deshalb continue
    			if ((!extjs.test(file.leafName) && !extxul.test(file.leafName)) || this.BLACKLIST.indexOf(file.leafName) !== -1) continue;
    			// uc.js bzw. uc.xul gefunden, die nicht in der Blacklist stehen -> Ablage sortiert (unter Linux erforderlich) im JSON vornehmen
    			hp = this.githubLink(file.leafName);
    			added = false;
    			storedItems = this.MYSTOR.userchromejs.length;
    			for (j = 0; j < storedItems; j++) {
    				if (file.leafName.toLowerCase() < this.MYSTOR.userchromejs[j].name.toLowerCase()) {
    					this.MYSTOR.userchromejs.splice(j,0,{'name': file.leafName, 'version': undefined, 'active': true, 'description': undefined, 'homepage': hp});
    					added = true;
    					break;
    				}
    			}
    			if (!added) this.MYSTOR.userchromejs.push({'name': file.leafName, 'version': undefined, 'active': true, 'description': undefined, 'homepage': hp});
    		}
    	},
    
    	githubLink: function(sName) {
    		// übergibt für gegebenen Skriptnamen den Link zu github
    		// früher Ausstieg, da Skript nicht verlinkt werden soll
    		if (this.GITHUBBLACKLIST.indexOf(sName) !== -1 || this.GITHUBBLACKLIST.indexOf("*") !== -1) return null;
    		sName = sName.toLowerCase();
    		/* Das folgende Array enthaelt regulaere Ausdruecke, um ungueltige Zeichenfolgen entfernen:
    		/Datei-Erweiterungen am Ende/, /"ucjs_" am Anfang/, /"_"gefolgtVonZahlUndDanachBeliebigenZeichen/
    		/ "_fx"gefolgtVonZahl(en)/, /"-" oder "+" oder "."/, /"_v"gefolgtVonZahlen
    		*/
    		var regs = [/\.uc\.js$/,/\.uc\.xul$/,/^ucjs_/,/_\d.+/,/_fx\d+/,/[-+\.]/g,/_v\d+/];
    		for (var i = 0; i < regs.length; i++) {
    			sName = sName.replace(regs[i],"");
    		}
    		return "https://github.com/endor8/userChrome.js/tree/master/" + sName;
    	},
    
    	writeAddons: function(file,format){
    		var a, t, c, n, d, atype, aout, thisaddon;
    		var output = "";
    		var addontpl = "";
    		var addontplwithouturl = "";
    		//Cu.import("resource://gre/modules/osfile.jsm");
    
    		addontpl = this.MYTPLS[format].tpladdon;
    		addontplwithouturl = this.MYTPLS[format].tpladdon_without_url;
    		output += this.MYTPLS[format].intro;
    
    		if (this.SHOWDATE) output +=  this.MYTPLS[format].tpllastupd.replace(/%%lastupd%%/g,this.MYSTOR.lastupd)+"\n";
    		if (this.SHOWUSERAGENT) output +=  this.MYTPLS[format].tpluseragent.replace(/%%useragent%%/g,this.MYSTOR.useragent)+"\n";
    
    		for (t = 0; t < this.WHICHTYPES.length; t++) {
    			atype = this.WHICHTYPES[t];
    			c = this.MYSTOR[atype].length;
    			n = 0;
    			d = 0;
    			output += this.MYTPLS[format].tpladdongrp_title[atype].replace(/%%count%%/g,c)+"\n";
    			if (this.MYTPLS[format].tpladdongrp_intro[atype] == undefined) {
    				output += this.MYTPLS[format].tpladdongrp_intro.default + (this.MYTPLS[format].tpladdongrp_intro.default.length > 0 ? "\n" : "");
    			} else {
    				output += this.MYTPLS[format].tpladdongrp_intro[atype] + (this.MYTPLS[format].tpladdongrp_intro[atype].length > 0 ? "\n" : "");
    			}
    			if (this.MYTPLS[format].tpladdongrp_list_intro[atype] == undefined) {
    				output += this.MYTPLS[format].tpladdongrp_list_intro.default+"\n";
    			} else {
    				output += this.MYTPLS[format].tpladdongrp_list_intro[atype]+"\n";
    			}
    			for (a = 0; a < c; a++) {
    				thisaddon =  this.MYSTOR[atype][a];
    				// console.log(atype + " " + thisaddon.name + " " + thisaddon.active);
    				if (thisaddon.homepage == undefined) {
    					aout = addontplwithouturl;
    				} else {
    					aout = addontpl;
    					aout = aout.replace(/%%homepageURL%%/g,thisaddon.homepage.replace(/&(?!amp;)/g,'&amp;'));
    				}
    				aout = aout.replace(/%%name%%/g,thisaddon.name);
    				if (thisaddon.version == undefined) {
    					if (thisaddon.description != undefined) {
    						aout = aout.replace(/ %%version%%: /g,": ");
    					} else {
    						aout = aout.replace(/ %%version%%: /g,"");
    					}
    				}
    				aout = aout.replace(/%%version%%/g,thisaddon.version);
    				if (thisaddon.description != undefined) {
    					aout = aout.replace(/%%description%%/g,thisaddon.description);
    				} else {
    					aout = aout.replace(/%%description%%/g,"");
    				}
    				if (thisaddon.active !== true) {
    					aout = aout.replace(/%%class%%/g,this.MYTPLS[format].inactiveclass);
    					aout = aout.replace(/%%disabled%%/g,this.MYTPLS[format].disabledtext);
    					d++;
    				} else {
    					aout = aout.replace(/%%class%%/g,this.MYTPLS[format].activeclass);
    					aout = aout.replace(/%%disabled%%/g,"");
    					n++;
    				}
    				output += aout;
    			}
    			output = output.replace(/%%countactive%%/g,n).replace(/%%countinactive%%/g,d);
    			output += this.MYTPLS[format].tpladdongrp_list_outro;
    			output += this.MYTPLS[format].tpladdongrp_outro;
    		}
    		output += this.MYTPLS[format].outro+"\n";
    		let encoder = new TextEncoder();
    		let myarray = encoder.encode(output);
    		let promise = IOUtils.write(file, myarray);
    		return output;
    	},
    
    	showAddons: function(e,RanPath,OpenPath,format,myoutput) {
    		// zeigt das EXPORTFILE im Editor oder im Browser (Mittelklick) an
    		switch (e) {
    			case 0:
    				var file = new this.FILEUTILS.File(RanPath);
    				var proc = Cc["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
    				var args = [OpenPath];
    				// falls der im Konfigurationsabschnitt definierte Editor nicht gefunden wird, auf Einstellung in about:config ausweichen:
    				if (!this.fileExists(RanPath)) {
    					console.log("AddonLister meldet: Editor nicht gefunden, ausweichen auf about:config.");
    					var pref = Cc["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
    					RanPath = pref.getCharPref("view_source.editor.path");
    					file = new this.FILEUTILS.File(RanPath);
    				}
    				proc.init(file);
    				proc.run(false, args, args.length);
    				break;
    			case 1:
    				if (this.MYTPLS[format].opendatauri) {
    					var datastring = myoutput.replace(/\n/g,"%0A").replace(/#/g,"%23");
    					// getBrowser().selectedTab = getBrowser().addTrustedTab('data:text/plain;charset=utf-8,' + datastring);
    					openTrustedLinkIn('data:text/plain;charset=utf-8,' + datastring, "tab");
    					XULBrowserWindow.statusTextField.label = "Export nach  »"+ OpenPath + "« ist erfolgt.";
    				} else {
    					// alert sorgt ein wenig dafür, dem OS Zeit fürs Speichern der Datei zu geben ...
    					alert("Export nach »"+ OpenPath + "« ("+ format + "-format) ist erfolgt.");
    					openTrustedLinkIn(OpenPath, "tab");
    					//getBrowser().selectedTab = getBrowser().addTrustedTab(OpenPath);
    				}
    				break;
    			default:
    				XULBrowserWindow.statusTextField.label = "Export nach  »"+ OpenPath + "« ist erfolgt.";
    				break;
    		}
    	}
    
    };
    
    ADONLI.init();
    Alles anzeigen

    Funktioniert natürlich nicht mehr ab Firefox 138.
    Schaltfläche wird angezeigt, und unter Extras der Menüeintrag mit Untermenüs usw.
    Nur bei klick auf was auch immer tut sich nichts.
    Mfg.
    Endor

  • Skripte funktionieren nicht mehr

    • Endor
    • 1. Mai 2025 um 17:05

    Schön wäre es.
    Arbeiten, liegengebliebenes aufräumen und und und und.
    Mein Vater braucht mich auch praktisch immer usw.

    Dir ein schönes langes erholsames WE.

    Mfg.
    Endor

  • Skripte funktionieren nicht mehr

    • Endor
    • 1. Mai 2025 um 16:56

    Hallo .DeJaVu .
    Ja bei mir hat es leider bei Firefox 135 aufgehört.
    Hatte keinerlei Zeit mehr zum kümmern.
    Habe für Firefox 139 schon mal den Ordner erstellt.
    Scripte fehlen noch.

    MultiRowTabLiteforFx.uc.js habe ich heute endlich die Deutsche Version hoch geladen.

    userChrome.js/Multirowtabs/Firefox 138/MultiRowTabLiteforFx.uc.js at master · Endor8/userChrome.js
    Skripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.
    github.com

    Beruf und RL nehmen mich zur Zeit ganz in Anspruch.
    Mfg.
    Endor

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • Endor
    • 1. Mai 2025 um 16:26

    So die aktuelle Version des Scriptes auf Deutsch ist jetzt verfügbar:

    userChrome.js/Multirowtabs/Firefox 138/MultiRowTabLiteforFx.uc.js at master · Endor8/userChrome.js
    Skripte für die Firefox-Erweiterung userChromeJS. Contribute to Endor8/userChrome.js development by creating an account on GitHub.
    github.com

    Mfg.
    Endor

  • Skripte funktionieren nicht mehr

    • Endor
    • 29. April 2025 um 13:58

    seipe

    Teste diese Version mal:

    JavaScript
        //      RestartFirefox_plus.uc.js   2
    
        (function() {
    
           if (location != 'chrome://browser/content/browser.xhtml') return;
           
           try {
              CustomizableUI.createWidget({
                 id: 'restart-button',
                 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-button',
                       class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                       removable: false,
                       label: 'Neustart',
                       tooltiptext: 'Neustart (mit Rechts- und Mittelklick wird userChrome.js-Cache geleert)',
                       style: 'list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAEZ0FNQQAAsY58%2B1GTAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAN8SURBVHjaVJFNTBxlAIafb2Z29gd2l4VdYCkokAUt1AJplQRTrVqjUWMPPWHSCzb21IOn9qIHY2xMahoTTb00NmkUm5qAjdpUI61VaCxCpCVYixt%2ByvKzCwu7LDs7zMw3HmhM%2Bt6fJ0%2FyCp69wiOzZBCPcqSmIXg0HPHuC4R8nkLWyOXyYiIzfuVHzMIA%2BZsLtH18EApntUdhpzUSD5577nDLi%2FGWKjx%2BHVfR8HpFwNwsxTMzza%2BOXJ1%2B58Ev2sVEV%2ByEawXqxf8FllNWEQ9ePXzsqQOecIDU8jampSAVD76Al2BIIx4Dv2Nz7%2FYq%2B5%2BP8sNXE6WdAhdQlOM9rzUdaGiN8M9UjnKvQjzuA0UjV3AxDIcHywqRoEbXoVrKgyBtKXYEUvprmiN9oaoyvr9wl62NHJbtJeDzOo17YmprVzWOppLO2RRNwf1FSOzSUAXsCIR4QdP13UPfjhUde2mjuBXUjcXNEabOnJmq7Y4Nd7z1fu%2BJ%2FR2Jpgrm0jauAI8GlnSlBi4I0bO6sLBWHc9esxRdmjOZf5n%2B5CLWzCzOvsbKupBZ1xgmElUoC%2BgoKtRGQfNomoaND8P8XS%2Bby1olO7O6GHTl1DejGDOrNB%2BvpO7I%2Ba31%2FDP9Z28YUmqoqhCKcG2EYD6ZMUTojZ8WHmsqD%2BI6wnWFajugCkuuZaV%2FZS47wp99R7E3LbxPV6rtr7dV1pmyuBWs3hr7dZ380LC2tzseffvUHm86C1JC2A%2FrGcn509cn%2BPvTk9ibc1R06qL91Ms1CadF000ll9rVS2VykLzVr0lHOgtpuJ9yUFyXxqhKZjbH2nJRI9IZwyw2kXjvXV%2FIOWgaBcc2a%2BtjdVXR1J3iBDx8QUpQUJAuJJclseogxz441H5vrPO72cm0VSyVPJq27ZaHm8ST3Y0M9d9Kkr19A1A1x4VIObTGBfNrsJ5XmE9b6KqgvrOGhr1Vns2sgeNIkXiigvHf1liZuHWZYjINSEXRVLewZjN6bYmYbvN4rcDvVzFKLnOpErMLBpvbklClznyyyPDA6DjTX3wJWICr%2Bnb3ffjXSGpl5Nxnn88uh2ORUCBaHfVQU%2BsjVuGhKqJT5lFYShr8fGH4j42bH53EnJ4EtgEEPQOTzHx9mqXLl9AT9TS82RvreOmVcMTXVh4JhIr5kp3LFu6u3Lk%2ByMylQazU3ENYAvw3AFUTimFqj5i7AAAAAElFTkSuQmCC)',
                       /* onclick: 'if (event.button == 0) { \
                                      Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit); \
                                  }; \
                                  if (event.button == 1 || event.button == 2) { \
                                      Services.appinfo.invalidateCachesOnRestart(); \
                                      Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit); \
                                  };' */
                    };            
                    for (var 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) { };   
    	         
           var menuitem = document.createXULElement('menuitem');   
           var props = {
              id: 'restartfirefox-fileMenu2',
              label: 'Neustart',
    	   tooltiptext: 'Neustart (mit Rechts- und Mittelklick wird userChrome.js-Cache geleert)',         
           };
    
    			 menuitem.addEventListener('click', event => {
    						if (event.button == 0) { 
                                      Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit); 
                                  }
                                  if (event.button == 1 || event.button == 2) { 
                                      Services.appinfo.invalidateCachesOnRestart(); 
                                      Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);
                                  }							  
    					});            
           for (var p in props)
              menuitem.setAttribute(p, props[p]);      
           document.getElementById('menu_FilePopup').insertBefore(menuitem, 
    	   document.getElementById('menu_FileQuitItem'));
    
           var menuitem = document.createXULElement('toolbarbutton');
    menuitem.id = 'restartfirefox-fileMenu';
    menuitem.classList.add('subviewbutton', 'subviewbutton-iconic');
    menuitem.setAttribute('label' , 'Neustart');
    menuitem.setAttribute('tooltiptext' , 'Neustart');
    menuitem.style.listStyleImage= 'url(\'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAEZ0FNQQAAsY58%2B1GTAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAN8SURBVHjaVJFNTBxlAIafb2Z29gd2l4VdYCkokAUt1AJplQRTrVqjUWMPPWHSCzb21IOn9qIHY2xMahoTTb00NmkUm5qAjdpUI61VaCxCpCVYixt%2ByvKzCwu7LDs7zMw3HmhM%2Bt6fJ0%2FyCp69wiOzZBCPcqSmIXg0HPHuC4R8nkLWyOXyYiIzfuVHzMIA%2BZsLtH18EApntUdhpzUSD5577nDLi%2FGWKjx%2BHVfR8HpFwNwsxTMzza%2BOXJ1%2B58Ev2sVEV%2ByEawXqxf8FllNWEQ9ePXzsqQOecIDU8jampSAVD76Al2BIIx4Dv2Nz7%2FYq%2B5%2BP8sNXE6WdAhdQlOM9rzUdaGiN8M9UjnKvQjzuA0UjV3AxDIcHywqRoEbXoVrKgyBtKXYEUvprmiN9oaoyvr9wl62NHJbtJeDzOo17YmprVzWOppLO2RRNwf1FSOzSUAXsCIR4QdP13UPfjhUde2mjuBXUjcXNEabOnJmq7Y4Nd7z1fu%2BJ%2FR2Jpgrm0jauAI8GlnSlBi4I0bO6sLBWHc9esxRdmjOZf5n%2B5CLWzCzOvsbKupBZ1xgmElUoC%2BgoKtRGQfNomoaND8P8XS%2Bby1olO7O6GHTl1DejGDOrNB%2BvpO7I%2Ba31%2FDP9Z28YUmqoqhCKcG2EYD6ZMUTojZ8WHmsqD%2BI6wnWFajugCkuuZaV%2FZS47wp99R7E3LbxPV6rtr7dV1pmyuBWs3hr7dZ380LC2tzseffvUHm86C1JC2A%2FrGcn509cn%2BPvTk9ibc1R06qL91Ms1CadF000ll9rVS2VykLzVr0lHOgtpuJ9yUFyXxqhKZjbH2nJRI9IZwyw2kXjvXV%2FIOWgaBcc2a%2BtjdVXR1J3iBDx8QUpQUJAuJJclseogxz441H5vrPO72cm0VSyVPJq27ZaHm8ST3Y0M9d9Kkr19A1A1x4VIObTGBfNrsJ5XmE9b6KqgvrOGhr1Vns2sgeNIkXiigvHf1liZuHWZYjINSEXRVLewZjN6bYmYbvN4rcDvVzFKLnOpErMLBpvbklClznyyyPDA6DjTX3wJWICr%2Bnb3ffjXSGpl5Nxnn88uh2ORUCBaHfVQU%2BsjVuGhKqJT5lFYShr8fGH4j42bH53EnJ4EtgEEPQOTzHx9mqXLl9AT9TS82RvreOmVcMTXVh4JhIr5kp3LFu6u3Lk%2ByMylQazU3ENYAvw3AFUTimFqj5i7AAAAAElFTkSuQmCC\')';
    menuitem.addEventListener('click', event => {
    						if (event.button == 0) { 
                                      Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit); 
                                  }
                                  if (event.button == 1 || event.button == 2) { 
                                      Services.appinfo.invalidateCachesOnRestart(); 
                                      Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);
                                  }							  
    					});
    var refItem = document.getElementById('appMenu-viewCache').content.getElementById('appMenu-quit-button2');
    refItem.parentNode.insertBefore(menuitem, refItem);
    })();
    Alles anzeigen

    Mfg.
    Endor

  • Installations Skript zur Vorbereitung des FF zur Nutzung von JavaScript. [ps1 verfügbar]

    • Endor
    • 26. April 2025 um 14:16

    Hallo Mira_Belle .
    Kann die Dateien gerne ins Zip Archiv integrieren.
    Sag mir Bescheid wenn ich das machen soll.
    Mfg.
    Endor

  • In memoriam

    • Endor
    • 25. April 2025 um 19:30

    Tv Ikone aus Österreich Peter Rapp ist tot.

    TV-Ikone Peter Rapp ist tot
    In Österreich hat Peter Rapp nahezu Legendenstatus. Doch auch dem deutschen TV-Publikum wird er in den 70er-Jahren bekannt, etwa durch die Kindersendung…
    www.n-tv.de

    R.I.P.
    Mfg.
    Endor

  • Der Glückwunsch-Thread

    • Endor
    • 11. April 2025 um 14:08

    Hallo Büssen .

    Auch von mir alles alles Gute zum Geburtstag. Vor allem viel Gesundheit aber auch viel Glück und Wohlergehen wünsche ich dir von ganzem Herzen bleibt gesund.

    Viele Grüße

    Endor

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • Endor
    • 7. April 2025 um 13:20

    Hallo BrokenHeart

    Der Autor hat was neues:

    CSS
    // ==UserScript==
    // @name           MultiRowTabLiteforFx.uc.js
    // @namespace      Based on Alice0775's zzzz-MultiRowTab_LiteforFx48.uc.js
    // @description    多段タブもどき実験版 CSS入れ替えまくりLiteバージョン
    // @include        main
    // @compatibility  Firefox138+
    // @version        2025/04/07 12:00
    // ==/UserScript==
    "use strict";
    
    MultiRowTabLiteforFx();
    function MultiRowTabLiteforFx() {
    if (!window.gBrowser) { return; }
    
        // -- Config --
        // 同じ様なCSSを書いた場合「userChrome.css」が優先されます。
    
        const                                   	    	 // 多段タブOn/Off タブバーの段数
        MultiRowTab_OnOff_and_TabBar_Rows =     	-1   	,// [-1]  = 多段タブOn 段数無制限
                                                	    	 //  0    = 多段タブOff
                                                	    	 //  1    = 多段タブOn 通常は1段にしてタブバーをマウスオーバーした際に2段目以降を指定した段数まで表示する。 ※「TabBar_Rows_on_MouseOver」で段数を指定します。
                                                	    	 //  2~  = 多段タブOn 段数を指定
        TabBar_Rows_on_MouseOver =              	3   	,// 通常は1段にしてタブバーをマウスオーバーした際に表示したい段数を指定する。 前提条件:「MultiRowTab_OnOff_and_TabBar_Rows」を「1」に設定する。
        TabBar_DisplayTime_on_MouseOver =       	1   	,// マウスオーバーで2段目以降を表示した際の表示時間(秒)が設定出来ます。設定した数値分(秒)表示してから1段に戻ります。
    
                                                	    	 // タブバーの位置
        TabBar_Position =                       	0   	,// [0] = ツールバーの上 デフォルト
                                                	    	 //  1  = ツールバーの下
                                                	    	 //  2  = サイトコンテンツの下
    
                                                	    	 // タブバーの位置をツールバーの下に設定した上でタブバーとブックマークツールバーの位置を入れ替えたい人用
                                                	    	 // 前提条件:「TabBar_Position」を「1」に設定する。
        Bookmark_Toolbar_Position =             	true	,// [true] = メニューバー、ナビゲーションツールバー、ブックマークツールバー、タブバー
                                                	    	 //  false = メニューバー、ナビゲーションツールバー、タブバー、ブックマークツールバー
    
                                                	    	 // タブの高さ UI密度
        UI_Density_Compact =                    	29   	,// デフォルト29px コンパクト
        UI_Density_Normal =                     	36   	,// デフォルト36px 通常
        UI_Density_Touch =                      	41   	,// デフォルト41px タッチ
    
                                                	    	 // タブの横幅
        Tab_Min_Width =                         	76   	,// デフォルト76px  最小値
        Tab_Max_Width =                         	225   	,// デフォルト225px 最大値
                                                	    	 // 指定する数値を両方同じにすると横幅が固定化します。
    
                                                	    	 // タブを閉じるボタン
        Tab_Close_Button =                      	0   	,// [0] = デフォルト
                                                	    	 //  1  = 非表示
                                                	    	 //  2  = すべてのタブに表示
                                                	    	 //  3  = タブをマウスオーバーで表示
                                                	    	 //  4  = アクティブタブは常に表示、非アクティブタブはマウスオーバーで表示 ※垂直タブモードのデフォルトです。
    
                                                	    	 // タブの見た目 ProtonUI
        Proton_Margins =                        	true	,// [true] = ProtonUI、デフォルト
                                                	    	 //  false = Firefox90以前の設定で「browser.proton.enabled」を「false」にした時の見た目にする。
                                                	    	 //          タブの周囲にある空白を0にしてUI密度の高さに設定するのでデフォルトより横に4px広がって高さが8px低くなります。
    
                                                	    	 // タブの横に境界線
        Tab_Separators  =                       	false	,// [false] = 表示しない
                                                	    	 //  true   = 表示する
                                                	    	 // Firefox90以前の設定で「browser.proton.enabled」を「false」にすると表示出来ていた境界線のCSSを抽出して調整しています。
    
                                                	    	 // タイトルバーボタン[-□×]を隠くしてその分タブバーの横幅を広く使う。
                                                	    	 // 前提条件:「TabBar_Position」を「0」に設定する。
        TitleBar_Button_Autohide =              	false	,// [false] = 使用しない
                                                	    	 //  true   = 使用する 普段はタイトルバーボタン[-□×]の外枠を小さくして透明化、表示したい場合はタブバーの右上にあるトリガー領域(36px×6px)をマウスオーバーで元のサイズに戻して透明化を解除。
        TitleBar_Button_DisplayTime =           	0.6   	,// マウスオーバーで元のサイズに戻して透明化を解除した後の表示時間(秒)が設定出来ます。設定した数値分(秒)表示してから隠れます。
    
                                                	    	 // タブバーを初めから指定した段数の高さにする。
                                                	    	 // 前提条件:「MultiRowTab_OnOff_and_TabBar_Rows」を「2」以上に設定する。
        Set_the_TabBar_to_the_Specified_Height =	false	,// [false] = 使用しない
                                                	    	 //  true   = 使用する  タブバーを初めから指定した段数の高さにしてタブは左上から通常通り並ぶ感じになります。
    
                                                	    	 // タブをドラッグ&ドロップの移動中に表示する「.tabDropIndicator」の差し替え
                                                	    	 // 前提条件:「MultiRowTab_OnOff_and_TabBar_Rows」を「0」以外に設定する。
        Tab_Drop_Indicator =                    	false	,// [false] = しない ピン📍アイコン デフォルト
                                                	    	 //  true   = する   赤線アイコン(2px×29px)
    
                                                	    	 // ピン留めタブの位置
                                                	    	 // 前提条件:「MultiRowTab_OnOff_and_TabBar_Rows」を「0」以外に設定する。
        Separate_Tabs_and_PinnedTabs =          	false	,// [false] = デフォルト
                                                	    	 //  true   = ピン留めタブをタブの行から分離して上に出来る行へ移動する。
    
                                                	    	 // ピン留めタブの横幅を調整
                                                	    	 // 前提条件:「Separate_Tabs_and_PinnedTabs」を「true」に設定する。
        PinnedTab_Width =                       	false	,// [false] = しない デフォルト
                                                	    	 //  true   = する   ピン留めタブの横幅をタブの横幅と同じ様に調整出来ます。
        PinnedTab_Min_Width =                   	76   	,// デフォルト76px  最小値
        PinnedTab_Max_Width =                   	225   	,// デフォルト225px 最大値
                                                	    	 // 指定する数値を両方同じにすると横幅が固定化します。
    
                                                	    	 // ピン留めタブ タブを閉じるボタン
                                                	    	 // 前提条件:「Separate_Tabs_and_PinnedTabs」を「true」に設定する。
        PinnedTab_Close_Button =                	0   	,// [0] = デフォルト
                                                	    	 //  1  = すべてのタブに表示
                                                	    	 //  2  = タブをマウスオーバーで表示
                                                	    	 //  3  = アクティブタブは常に表示、非アクティブタブはマウスオーバーで表示 ※垂直タブモードのデフォルトです。
    
                                                	    	 // タブバーのドラッグ領域
        Left_Drag_Area =                        	0   	,// デフォルト40px 左のドラッグ領域
        Right_Drag_Area =                       	0   	,// デフォルト40px 右のドラッグ領域
        Maximize_Left_Drag_Area =               	false	,// [false] = デフォルト
                                                	    	 //  true   = ウィンドウを最大化した時、非表示になる左のドラッグ領域が表示出来ます。
        Fullscreen_Drag_Area =                  	false	,// [false] = デフォルト
                                                	    	 //  true   = フルスクリーンにした時、非表示になる左右のドラッグ領域が表示出来ます。
                                                	    	 // タイトルバーを表示している場合「.titlebar-spacer」を表示してもドラッグ領域として機能しないので何もしない様にしました。
    
        // -- Config End --
    
        css = `
    
        #TabsToolbar:not([collapsed="true"]) {
    
          :root[uidensity="compact"] & {
            --tab-min-height: ${UI_Density_Compact}px;
          }
          :root:not([uidensity]) & {
            --tab-min-height: ${UI_Density_Normal}px;
          }
          :root[uidensity="touch"] & {
            --tab-min-height: ${UI_Density_Touch}px;
          }
    
          #tabbrowser-tabs {
            min-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px);
    
            ${MultiRowTab_OnOff_and_TabBar_Rows != 0 ? `
              &[overflow] {
                padding-inline: 0 !important;
                & > #tabbrowser-arrowscrollbox {
                  & > .tabbrowser-tab[pinned] {
                    display: flex;
                    margin-inline-start: 0 !important;
                    position: static !important;
                  }
                  &::part(scrollbox) {
                    padding-inline: 0;
                  }
                }
                & + #new-tab-button {
                  display: none;
                }
              }
    
              ${Tab_Drop_Indicator ? `
                & > .tab-drop-indicator {
                  background: url(
                    data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAdCAIAAAAPVCo9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASSURBVBhXY3growJEQ5+SUQEAOb1EM8kwskcAAAAASUVORK5CYII=
                  ) no-repeat center;
                }
              ` : ``}
    
              #tabbrowser-arrowscrollbox {
                &::part(scrollbox) {
                  & > slot {
                    flex-wrap: wrap;
                  }
    
                  ${MultiRowTab_OnOff_and_TabBar_Rows != -1 ? `
                    ${MultiRowTab_OnOff_and_TabBar_Rows == 1 ? `
                      ${TabBar_Rows_on_MouseOver == 0 || TabBar_Rows_on_MouseOver == 1 ? `
                        max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * 2);
                      ` : `
                        max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${TabBar_Rows_on_MouseOver});
                      `}
                      &:not(:hover) {
                        max-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) !important;
                        ${Proton_Margins ? `scrollbar-width: none;` : ``}
                        transition: all 0s ease-in-out ${TabBar_DisplayTime_on_MouseOver}s;
                      }
                    ` : `
                      ${Set_the_TabBar_to_the_Specified_Height ? `
                        min-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${MultiRowTab_OnOff_and_TabBar_Rows});
                        & > slot {
                          max-height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px);
                        }
                      ` : `
                        max-height: calc((var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px) * ${MultiRowTab_OnOff_and_TabBar_Rows});
                      `}
                    `}
    
                    overflow: hidden auto;
                    & scrollbar {
                      -moz-window-dragging: no-drag;
                    }
                  ` : ``}
    
                }
                &::part(overflow-start-indicator),
                &::part(overflow-end-indicator),
                &::part(scrollbutton-up),
                &::part(scrollbutton-down) {
                  display: none;
                }
    
                ${Separate_Tabs_and_PinnedTabs ? `
                  &:has(> .tabbrowser-tab[fadein][pinned]) {
                    &::part(scrollbox) {
                      & > slot::after {
                        display: flow-root list-item;
                        content: "";
                        flex-basis: -moz-available;
                        height: 0;
                        overflow: hidden;
                      }
                    }
                  }
                  .tabbrowser-tab[fadein] {
                    &:not([pinned]) {
                      #tabbrowser-tabs[haspinnedtabs] & {
                        &, & + :not(#tabs-newtab-button) {
                          order: 1;
                        }
                      }
                    }
                    &[pinned] {
                      .tab-background:after {
                        content: "📌";
                        font-size: 11px;
                        right: -2px;
                        position: absolute;
                        top: -2px;
                      }
    
                      ${PinnedTab_Width ? `
                        flex: 100 100;
                        max-width: ${PinnedTab_Max_Width}px;
                        min-width: ${PinnedTab_Min_Width}px;
                        .tab-throbber, .tab-icon-pending, .tab-icon-image, .tab-sharing-icon-overlay, .tab-icon-overlay {
                          margin-inline-end: 5.5px !important;
                        }
    
                        ${PinnedTab_Close_Button == 1 ? `
                          .tab-close-button {
                            display: flex;
                          }
                        ` : PinnedTab_Close_Button == 2 ? `
                          .tab-close-button {
                            display: none;
                          }
                          &:hover .tab-close-button {
                            display: flex;
                          }
                        ` : PinnedTab_Close_Button == 3 ? `
                          &:not([selected]):hover,
                          &[selected] {
                            .tab-close-button {
                              display: flex;
                            }
                          }
                        ` : ``}
    
                      ` : ``}
    
                    }
                  }
                ` : ``}
    
                #tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs]):not([orient="vertical"]) > & {
                  &  > .tabbrowser-tab:nth-child(1 of :not([pinned], [hidden])) {
                    margin-inline-start: 0 !important;
                  }
                }
    
              }
            ` : ``}
          }
    
          .tabbrowser-tab[fadein]:not([pinned]) {
            max-width: ${Tab_Max_Width}px;
            min-width: ${Tab_Min_Width}px;
    
            ${Tab_Close_Button == 1 ? `
              .tab-close-button {
                display: none;
              }
            ` : Tab_Close_Button == 2 ? `
              .tab-close-button {
                display: flex;
              }
            ` : Tab_Close_Button == 3 ? `
              .tab-close-button {
                display: none;
              }
              &:hover .tab-close-button {
                display: flex;
              }
            ` : Tab_Close_Button == 4 ? `
              &:not([selected]):hover {
                .tab-close-button {
                  display: flex;
                }
              }
            ` : ``}
    
          }
    
          ${Tab_Separators ? `
            .titlebar-spacer[type="pre-tabs"] {
              border-inline-end: 1px solid color-mix(in srgb, currentColor 20%, transparent);
            }
            .tabbrowser-tab {
              &::after,
              &::before {
                border-left: 1px solid color-mix(in srgb, currentColor 50%, transparent);
                height: calc(var(--tab-min-height) - 15%);
                margin-block: auto;
              }
              &:hover::after,
              &[multiselected]::after,
              #tabbrowser-tabs:not([movingtab]) &:has(+ .tabbrowser-tab:hover)::after,
              #tabbrowser-tabs:not([movingtab]) &:has(+ [multiselected])::after {
                height: 100%;
              }
              &::after,
              #tabbrowser-tabs[movingtab] &[visuallyselected]::before {
                display: flex;
                content: "";
              }
            }
          ` : ``}
    
          ${Proton_Margins ? `` : `
            .tabbrowser-tab,
            .toolbarbutton-1 {
              padding: 0;
            }
            .tabbrowser-tab,
            #tabs-newtab-button {
              height: var(--tab-min-height);
            }
            .tabbrowser-tab {
              .tab-background {
                box-shadow: none;
                margin-block: 0;
              }
              .tab-label-container {
                height: var(--tab-min-height);
                max-height: 24px;
              }
              .tab-close-button {
                height: 20px !important;
                padding-block: 3px !important;
              }
              &[usercontextid] > .tab-stack > .tab-background > .tab-context-line {
                margin-block-start: 1px !important;
              }
            }
          `}
    
        ${TabBar_Position == 0 ? `
          .titlebar-buttonbox-container {
            height: calc(var(--tab-min-height) + ${Proton_Margins ? 8 : 0}px);
          }
    
          ${TitleBar_Button_Autohide ? `
            & > .titlebar-buttonbox-container {
              background-color: color-mix(in srgb, currentColor 20%, transparent);
              position: fixed;
              right: 0;
              &:not(:hover) {
                height: 6px;
                .titlebar-button {
                  padding: 0;
                }
                &,& .titlebar-button {
                  opacity: 0;
                  transition: all 0s ease-in-out ${TitleBar_Button_DisplayTime}s;
                }
              }
            }
          ` : ``}
    
        }` : `
    
          ${TabBar_Position == 1 || TabBar_Position == 2 ? `
            & > .titlebar-buttonbox-container {
                display: none;
            }}
            #nav-bar {
              &:not(.browser-titlebar) {
                :root[customtitlebar] #toolbar-menubar[autohide="true"] ~ &,
                :root[inFullscreen] #toolbar-menubar ~ & {
                  & > .titlebar-buttonbox-container {
                    display: flex;
                  }
                }
              }
              .titlebar-button {
                padding-block: 0;
              }
            }
          ` : ``}
    
          body:has(> #navigator-toolbox:not([tabs-hidden])) {
            ${TabBar_Position == 1 ? `
              script, toolbar:not(#TabsToolbar ${Bookmark_Toolbar_Position ? `` : `, #PersonalToolbar`}) {
                order: -1;
              }
            ` : TabBar_Position == 2 ? `
              & > #fullscr-toggler[hidden] + tabbox,
              :root[inFullscreen] & > tabbox:hover {
                border-top: 0.01px solid var(--chrome-content-separator-color);
              }
              & > tabbox > #navigator-toolbox {
                border-block: none !important;
              }
              :root[inFullscreen] & {
                & > #navigator-toolbox {
                  transition: none;
                  &:has(~ tabbox:hover) {
                    margin-top: 0 !important;
                  }
                  &:hover ~ tabbox > #navigator-toolbox {
                    display: flex;
                  }
                }
                & > tabbox:not(:hover) {
                  border-top: 0.01px solid transparent;
                  & > #navigator-toolbox {
                    display: none;
                  }
                }
              }
            ` : ``}
          }
    
        `}
    
        toolbar[id$="bar"].browser-titlebar {
          .titlebar-spacer {
            &[type="pre-tabs"] {
              width: ${Left_Drag_Area}px;
            }
            &[type="post-tabs"] {
              width: ${Right_Drag_Area}px;
            }
            ${Maximize_Left_Drag_Area ? `
              :root[customtitlebar]:not([sizemode="normal"], [inFullscreen]) &[type="pre-tabs"] {
                display: flex;
              }
            ` : ``}
            ${Fullscreen_Drag_Area ? `
              :root[customtitlebar][inFullscreen] & {
                display: flex;
              }
            ` : ``}
          }
          #navigator-toolbox[tabs-hidden] & {
            #new-tab-button {
              display: none;
            }
          }
        }
    
        `,
        sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService),
        uri = Services.io.newURI("data:text/css;charset=UTF=8," + encodeURIComponent(css));
        ["0", "2", "dragend", "SSTabRestored", "TabAttrModified"].find(eventType => {
          if(!sss.sheetRegistered(uri, eventType)) sss.loadAndRegisterSheet(uri, eventType);
          if (MultiRowTab_OnOff_and_TabBar_Rows > 0) {
            gBrowser.tabContainer.addEventListener(eventType, (e) => {
              e.target.scrollIntoView({ behavior: "instant", block: "nearest" })
            })
          }
        })
    
        if (TabBar_Position == 2) {
          document.body.appendChild(
            document.createXULElement("tabbox")
          ).appendChild(
            document.importNode(document.getElementById("navigator-toolbox"))
          ).appendChild(
            document.adoptNode(document.getElementById("TabsToolbar"))
          )
        }
    
        gBrowser.tabContainer._getDropIndex = function(event) {
            let tabToDropAt = getTabFromEventTarget(event, false);
            const tabPos = gBrowser.tabContainer.getIndexOfItem(tabToDropAt);
    
            if (window.getComputedStyle(this).direction == "ltr") {
                let rect = tabToDropAt.getBoundingClientRect();
                if (event.clientX < rect.x + rect.width / 2)
                    return tabPos;
                else 
                    return tabPos + 1;
                
            } else {
                let rect = tabToDropAt.getBoundingClientRect();
                if (event.clientX > rect.x + rect.width / 2)
                    return tabPos;
                else
                    return tabPos + 1;
            }
        };
    
        // We set this to check if the listeners were added before
        let listenersActive = false;
    
        // This sets when to apply the fix (by default a new row starts after the 23th open tab, unless you changed the min-size of tabs)
        gBrowser.tabContainer.addEventListener("dragstart", () => {
            // Multiple tab select fix
            gBrowser.visibleTabs.forEach(t => t.style.transform = "");
    
            // Event handling
            if (!listenersActive) {
                gBrowser.tabContainer.getDropEffectForTabDrag = function(){};
                gBrowser.tabContainer._getDropEffectForTabDrag = function(){};
                gBrowser.tabContainer.on_dragover = (dragoverEvent) => performTabDragOver(dragoverEvent);
                gBrowser.tabContainer._onDragOver = (dragoverEvent) => performTabDragOver(dragoverEvent);
                gBrowser.tabContainer.ondrop = (dropEvent) => performTabDropEvent(dropEvent);
                listenersActive = true;
            }
        });
    }
    
    var lastKnownIndex = null;
    var lastGroupStart = null;
    var lastGroupEnd = null;
    
    /**
     * Gets the tab from the event target.
     * @param {*} event The event.
     * @returns The tab if it was part of the target or its parents, otherwise null
     */
    function getTabFromEventTarget(event, { ignoreTabSides = false } = {}) {
        let { target } = event;
        if (target.nodeType != Node.ELEMENT_NODE) {
            target = target.parentElement;
        }
        let tab = target?.closest("tab") || target?.closest("tab-group");
        const selectedTab = gBrowser.selectedTab;
        if (tab && ignoreTabSides) {
            let { width, height } = tab.getBoundingClientRect();
            if (
                event.screenX < tab.screenX + width * 0.25 ||
                event.screenX > tab.screenX + width * 0.75 ||
                ((event.screenY < tab.screenY + height * 0.25 ||
                    event.screenY > tab.screenY + height * 0.75) &&
                    gBrowser.tabContainer.verticalMode)
            ) {
                return selectedTab;
            }
        }
        if (!tab) {
            return selectedTab;
        }
        return tab;
    }
    
    /**
     * Performs the tab drag over event.
     * @param {*} event The drag over event.
     */
    function performTabDragOver(event) {
        event.preventDefault();
        event.stopPropagation();
    
        let ind = gBrowser.tabContainer._tabDropIndicator;
    
        let effects = orig_getDropEffectForTabDrag(event);
        let tab;
        if (effects == "link") {
            tab = getTabFromEventTarget(event, true);
            if (tab) {
                if (!gBrowser.tabContainer._dragTime)
                    gBrowser.tabContainer._dragTime = Date.now();
                if (!tab.hasAttribute("pendingicon") && // annoying fix
                    Date.now() >= gBrowser.tabContainer._dragTime + gBrowser.tabContainer._dragOverDelay)
                    gBrowser.tabContainer.selectedItem = tab;
                ind.hidden = true;
                return;
            }
        }
    
        if (!tab) {
            tab = getTabFromEventTarget(event, false);
        }
        
        let newIndex = gBrowser.tabContainer._getDropIndex(event);
        if (newIndex == null)
            return;
    
        // Update the last known index and group position
        lastKnownIndex = newIndex;
        
        if (tab.nodeName == "tab-group" && !lastGroupStart) {
            lastGroupStart = tab.querySelector("tab:first-of-type")._tPos;
            lastGroupEnd = tab.querySelector("tab:last-of-type")._tPos;
        }
    
        let tabs = document.querySelectorAll("tab");
        let ltr = (window.getComputedStyle(gBrowser.tabContainer).direction == "ltr");
        let rect = gBrowser.tabContainer.arrowScrollbox.getBoundingClientRect();
        let newMarginX, newMarginY;
        if (newIndex == tabs.length) {
            let tabRect = tabs[newIndex - 1].getBoundingClientRect();
            if (ltr)
                newMarginX = tabRect.right - rect.left;
            else
                newMarginX = rect.right - tabRect.left;
            newMarginY = tabRect.top + tabRect.height - rect.top - rect.height; // multirow fix
    
            if (CSS.supports("offset-anchor", "left bottom")) // Compatibility fix for FF72+
                newMarginY += rect.height / 2 - tabRect.height / 2;
            
        } else if (newIndex != null || newIndex != 0) {
            let tabRect = tabs[newIndex].getBoundingClientRect();
            if (ltr)
                newMarginX = tabRect.left - rect.left;
            else
                newMarginX = rect.right - tabRect.right;
            newMarginY = tabRect.top + tabRect.height - rect.top - rect.height; // multirow fix
    
            if (CSS.supports("offset-anchor", "left bottom")) // Compatibility fix for FF72+
                newMarginY += rect.height / 2 - tabRect.height / 2;
        }
    
        newMarginX += ind.clientWidth / 2;
        if (!ltr)
            newMarginX *= -1;
    
        ind.hidden = false;
    
        ind.style.transform = "translate(" + Math.round(newMarginX) + "px," + Math.round(newMarginY) + "px)"; // multirow fix
        ind.style.marginInlineStart = (-ind.clientWidth) + "px";
    }
    
    /**
     * Performs the tab drop event.
     * @param {*} event The drop event.
     */
    function performTabDropEvent(event) {
        let newIndex;
        let dt = event.dataTransfer;
        let dropEffect = dt.dropEffect;
        let draggedTab;
        if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
            draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
            if (!draggedTab) {
                return;
            }
        }
    
        if (draggedTab && dropEffect != "copy" && draggedTab.container == gBrowser.tabContainer) {
            newIndex = gBrowser.tabContainer._getDropIndex(event);
    
            /* fix for moving multiple selected tabs and tab groups */
            let selectedTabs = gBrowser.selectedTabs;
            if (lastGroupStart) {
                selectedTabs = [draggedTab?.closest("tab-group")];
                if (lastKnownIndex >= lastGroupStart && lastKnownIndex <= lastGroupEnd) {
                    newIndex = lastGroupStart;
                } else if (lastKnownIndex == lastGroupEnd + 1) {
                    newIndex = lastGroupStart + 1;
                }
            }
    
            if (selectedTabs[selectedTabs.length - 1] == null){
                newIndex = lastKnownIndex;
            } else if (newIndex > selectedTabs[selectedTabs.length - 1]._tPos + 1)
                newIndex--;
            else if (newIndex >= selectedTabs[0]._tPos)
                newIndex = -1;
    
            if (newIndex == -1) {
                newIndex = lastKnownIndex;
            }
            
            const tabToMoveAt = gBrowser.tabContainer.getItemAtIndex(newIndex);
            console.log("tabToMoveAt", tabToMoveAt);
            console.log("newIndex", newIndex);
            selectedTabs.forEach(t => gBrowser.moveTabBefore(t, tabToMoveAt));
    
            // Restart global vars
            lastKnownIndex = null;
            lastGroupStart = null;
            lastGroupEnd = null;
        }
    }
    
    // copy of the original and overrided _getDropEffectForTabDrag method
    function orig_getDropEffectForTabDrag(event) {
        let dt = event.dataTransfer;
    
        let isMovingTabs = dt.mozItemCount > 0;
        for (let i = 0; i < dt.mozItemCount; i++) {
            // tabs are always added as the first type
            let types = dt.mozTypesAt(0);
            if (types[0] != TAB_DROP_TYPE) {
                isMovingTabs = false;
                break;
            }
        }
    
        if (isMovingTabs) {
            let sourceNode = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
            if (XULElement.isInstance(sourceNode) &&
                sourceNode.localName == "tab" &&
                sourceNode.ownerGlobal.isChromeWindow &&
                sourceNode.ownerDocument.documentElement.getAttribute("windowtype") ==
                "navigator:browser" &&
                sourceNode.ownerGlobal.gBrowser.tabContainer == sourceNode.container) {
                // Do not allow transfering a private tab to a non-private window
                // and vice versa.
                if (PrivateBrowsingUtils.isWindowPrivate(window) !=
                    PrivateBrowsingUtils.isWindowPrivate(sourceNode.ownerGlobal))
                    return "none";
            
    
                if (window.gMultiProcessBrowser !=
                    sourceNode.ownerGlobal.gMultiProcessBrowser)
                    return "none";
            
    
                if (window.gFissionBrowser != sourceNode.ownerGlobal.gFissionBrowser)
                    return "none";
            
    
                return dt.dropEffect == "copy" ? "copy" : "move";
            }
        }
    
        if (Services.droppedLinkHandler.canDropLink(event, true)) 
            return "link";
    
        return "none";
    }
    Alles anzeigen

    Noch nicht übersetzt.
    Komme die Tage nicht dazu.
    Mache ich sobald wie möglich.
    Er hat sie ab Firefox 138+ frei gegeben.
    Mfg.
    Endor

  • AddBookmark here Script arbeitet nicht in Nightly

    • Endor
    • 30. März 2025 um 19:19

    Ja das hatte ich schon befürchtet.
    Hoffentlich kann jemand anderes etwas dazu sagen.
    Mfg.
    Endor

  • AddBookmark here Script arbeitet nicht in Nightly

    • Endor
    • 30. März 2025 um 14:56

    Hallo Boersenfeger .
    Teste mal diese etwas neuere Version ob die funktioniert.

    JavaScript
    // ==UserScript==
    // @name            Add Bookmark Here
    // @namespace       about:userchromejs/addbookmarkhere
    // @description     add "Add Bookmark Here" contextmenu in places menu
    // @compatibility   Firefox 68+
    // @include         chrome://browser/content/browser.xhtml
    // @include         chrome://browser/content/places/places.xhtml
    // @shutdown        window.AddBookmarkHere.uninit()
    // @author          Ryan, zbinlin
    // @homepage        http://mozcp.com
    // @version         0.0.4
    // ==/UserScript==
    
    /**
     * Klicken Sie auf das Menü und drücken Sie die Umschalttaste, um es oben im Ordner oder vor dem aktuellen Lesezeichen hinzuzufügen
     * ******************************** Changelog ********************************
     *  version: 0.0.4
     *  * Lesezeicheneintrag konnte durch rechtsklick nicht eingefügt werden. 
        * Ist behoben
     *  version: 0.0.3
     *  * Kompatibilitäts - Probleme mit neueren Firefox-Versionen behoben.
     *  * Achtung: nur in Firefox 100 getestet!
     * version: 0.0.2
     *  * Kompatibel mit Firefox 21+
     *
     * version: 0.0.1
     *  * Initialisierung
     * ***************************************************************************
     */
    
    "use strict";
    
    (function () {
        if (window.AddBookmarkHere) return;
        var AddBookmarkHere = {
            PARENT_NODE: "placesContext",
            ADD_REF_NODE: "placesContext_show_bookmark:info",
            init: function () {
                if (!location.href.startsWith('chrome://browser/content/browser.x')) return;
                var parentNode = document.getElementById(this.PARENT_NODE);
                if (!parentNode) return;
                var self = this;
                window.addEventListener("unload", function _(e) {
                    window.removeEventListener("unload", _, false);
                    self.uninit();
                }, false);
                var refNode;
                if (this.ADD_REF_NODE !== "") {
                    var refNode = document.getElementById(this.ADD_REF_NODE);
                }
                this.addContextMenu(parentNode, refNode);
            },
            addContextMenu: function (parentNode, refNode) {
                var menuitem = document.createXULElement("menuitem");
                menuitem.id = "placesContext_add:bookmark";
                menuitem.setAttribute("label", Services.locale.appLocaleAsBCP47.includes("de") ? "Lesezeichen hier hinzufügen" : "Add Bookmark Here");
                menuitem.setAttribute("accesskey", "h");
                menuitem.setAttribute("selection", "any");
                menuitem.setAttribute("class", "menuitem-iconic");
                menuitem.setAttribute("style", "list-style-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0iY29udGV4dC1maWxsIiBmaWxsLW9wYWNpdHk9ImNvbnRleHQtZmlsbC1vcGFjaXR5IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNOC44MDgwMiAyLjEwMTc5QzguNDc3ODkgMS40MzI4NyA3LjUyNDAzIDEuNDMyODcgNy4xOTM5IDIuMTAxNzlMNS42NzI4MSA1LjE4Mzg0TDIuMjcxNTYgNS42NzgwN0MxLjUzMzM2IDUuNzg1MzQgMS4yMzg2MSA2LjY5MjUxIDEuNzcyNzcgNy4yMTMyTDQuMjMzOTQgOS42MTIyNEwzLjY1Mjk0IDEyLjk5OTdDMy41MjY4NCAxMy43MzUgNC4yOTg1MyAxNC4yOTU2IDQuOTU4NzkgMTMuOTQ4NUw4LjAwMDk2IDEyLjM0OTFMOC40ODI5IDEyLjYwMjVDOC4xODU5NyAxMi4zMjg0IDggMTEuOTM1OSA4IDExLjVDOCAxMS40NDQ2IDguMDAzIDExLjM5IDguMDA4ODQgMTEuMzM2MkM3Ljg2MjM2IDExLjMzNDkgNy43MTU2NCAxMS4zNjk0IDcuNTgyMTUgMTEuNDM5NUw0LjY3MjggMTIuOTY5MUw1LjIyODQzIDkuNzI5NDdDNS4yNzg1MSA5LjQzNzUxIDUuMTgxNzEgOS4xMzk2MSA0Ljk2OTYgOC45MzI4NUwyLjYxNTg4IDYuNjM4NTRMNS44Njg2NCA2LjE2NTg5QzYuMTYxNzggNi4xMjMyOSA2LjQxNTE5IDUuOTM5MTggNi41NDYyOCA1LjY3MzU1TDguMDAwOTYgMi43MjYwNUw4LjczMzUxIDQuMjEwMzZDOC45NTc4MiA0LjA3Njc1IDkuMjE5OTUgNCA5LjUgNEg5Ljc0NDg1TDguODA4MDIgMi4xMDE3OVpNOS41IDVDOS4yMjM4NiA1IDkgNS4yMjM4NiA5IDUuNUM5IDUuNzc2MTQgOS4yMjM4NiA2IDkuNSA2SDE0LjVDMTQuNzc2MSA2IDE1IDUuNzc2MTQgMTUgNS41QzE1IDUuMjIzODYgMTQuNzc2MSA1IDE0LjUgNUg5LjVaTTkuNSA4QzkuMjIzODYgOCA5IDguMjIzODYgOSA4LjVDOSA4Ljc3NjE0IDkuMjIzODYgOSA5LjUgOUgxNC41QzE0Ljc3NjEgOSAxNSA4Ljc3NjE0IDE1IDguNUMxNSA4LjIyMzg2IDE0Ljc3NjEgOCAxNC41IDhIOS41Wk05LjUgMTFDOS4yMjM4NiAxMSA5IDExLjIyMzkgOSAxMS41QzkgMTEuNzc2MSA5LjIyMzg2IDEyIDkuNSAxMkgxNC41QzE0Ljc3NjEgMTIgMTUgMTEuNzc2MSAxNSAxMS41QzE1IDExLjIyMzkgMTQuNzc2MSAxMSAxNC41IDExSDkuNVoiLz4KPC9zdmc+Cg==)");
                menuitem.addEventListener("command", this.addBookMarkEvent, false);
                if (typeof refNode !== "undefined") {
                    parentNode.insertBefore(menuitem, refNode);
                } else {
                    parentNode.appendChild(menuitem);
                }
            },
            addBookMarkEvent: function (e) {
                var popupNode = PlacesUIUtils.lastContextMenuTriggerNode || document.popupNode;
                if (!popupNode) return;
                var view = PlacesUIUtils.getViewForNode(popupNode);
                if (!view) return;
                var bookmarks = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Ci.nsINavBookmarksService);
                var selectedNode = view.selectedNode;
                var iid, aid;
                if (selectedNode) {
                    if (PlacesUtils.nodeIsFolder(selectedNode) /* Firefox 21+ inkompatibel && !PlacesUtils.nodeIsLivemarkContainer(selectedNode) && !PlacesUtils.isReadonlyFolder(selectedNode) */) {
                        iid = selectedNode.itemId;
                        aid = e.shiftKey ? 0 : bookmarks.DEFAULT_INDEX;
                    } else {
                        iid = bookmarks.getFolderIdForItem(selectedNode.itemId);
                        var id = selectedNode.itemId;
                        aid = e.shiftKey ? id : id + 1;
                    }
                } else {
                    iid = view.result.root.folderItemId;
                    aid = e.shiftKey ? 0 : bookmarks.DEFAULT_INDEX;
                };
                var uri = Services.io.newURI(gBrowser.currentURI.spec, null, null);
                var title = gBrowser.contentTitle
                bookmarks.insertBookmark(iid, uri, aid, title);
            },
            uninit: function () {
                var self = this;
                try {
                    var menuitem = document.getElementById("placesContext_add:bookmark");
                    menuitem.removeEventListener("command", self.addBookMarkEvent, false);
                    menuitem.remove();
                    delete window.AddBookmarkHere;
                } catch (ex) {
                }
            }
        };
        AddBookmarkHere.init();
        window.AddBookmarkHere = AddBookmarkHere;
    })();
    Alles anzeigen

    Hoffe, die funktioniert.
    Ansonsten muss sich das jemand anderes anschauen.

    Mfg.
    Endor

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • Endor
    • 27. März 2025 um 19:23

    BrokenHeart
    Bis jetzt haben weder Alice noch der andere Autor von welchem ich immer
    die neueste Version übersetze und melde funktionierende Versionen im
    Angebot. Sobald sich was tut melde ich mich.
    Mfg.
    Endor

  • Der Glückwunsch-Thread

    • Endor
    • 27. März 2025 um 19:19

    Hallo ostsee .
    Schade dass Du gehst. Aber ich verstehe Dich. Werde dich sehr vermissen.
    Ein guter Freund und warme Seele, ich danke Dir für alles.
    Ich wünsche Dir für die Zukunft von Herzen alles Gute.
    Mfg.
    Endor

  • Code wird doppelt eingetragen in den Browser-Werkzeugen

    • Endor
    • 23. März 2025 um 19:58

    Gerne.
    :)
    Denke mal das könnte ein Fehler in Firefox sein.
    Vielleicht weiß Sören Hentzschel mehr darüber.
    Mfg.
    Endor

  • Code wird doppelt eingetragen in den Browser-Werkzeugen

    • Endor
    • 23. März 2025 um 19:56

    Ich kann das auch bestätigen.
    Strg+V nur einmal

    Rechtsklick + Einfügen doppelt.
    Komisch. Da ich CSS Codes meistens in Notepad++ bearbeite war
    mir das nicht aufgefallen.

    Mfg.
    Endor

  • In memoriam

    • Endor
    • 23. März 2025 um 13:28

    George Foreman der letzte der drei Großen.
    R.I.P.
    Ich saß morgens um 3 vor dem Fernseher zusammen mit meinem Vater
    um die Kämpfe zu sehen. Was für eine Zeit.
    R.I.P. George Foreman, Muhammad Ali, Joe Frazier.

    Mfg.
    Endor

  • userChrome.js Scripte für den Fuchs (Diskussion)

    • Endor
    • 20. März 2025 um 13:39

    Was das Script für die Lesezeichen betrifft, wäre das wohl die Quelle:

    CustomJSforFx/scripts/bookmarks_backup_restore_buttons.uc.js at master · Aris-t2/CustomJSforFx
    custom scripts. Contribute to Aris-t2/CustomJSforFx development by creating an account on GitHub.
    github.com

    Vielleicht sollte man ArisCTR mal informieren.
    mfg.
    Endor

Unterstütze uns!

Jährlich (2025)

82,4 %

82,4% (535,86 von 650 EUR)

Jetzt spenden
  1. Kontakt
  2. Datenschutz
  3. Impressum
Community-Software: WoltLab Suite™
Mastodon