Kein Wunder. Das Script in Beitrag #5 ist ja auch ganz offensichtlich für Thunderbird, u.a. an „messenger.xhtml“ und „mail-toolbox“ zu sehen.
Schande, Schande über mein Haupt!
Das habe ich übersehen!
Kein Wunder. Das Script in Beitrag #5 ist ja auch ganz offensichtlich für Thunderbird, u.a. an „messenger.xhtml“ und „mail-toolbox“ zu sehen.
Schande, Schande über mein Haupt!
Das habe ich übersehen!
In Zeile 174 steht noch onclick. Darüber wird der Button erzeugt.
Schon, und egal was ich da bisher ausprobiert habe, ich hatte keinen Button!
Bei Endor sind die Skripte doch nach Firefoxversionen sortiert!
GermanFreme82 Lösch' den Code wieder aus der "userChrome.css" !
Ich weiß nicht weiter, warte auf 2002Andreas eventuell weiß er Rat.
Du sollst erst einmal Deine Daten vom alten Rechner sichern!
Das wäre der Odner "Mozilla Firefox" im Installationsverzeichnis!
Wahrscheinlich "C:\Program Files\Mozilla Firefox".
Danach das Profil, bzw. gleich den ganzen Zweig!
Also "Mozilla"
Wahrscheinlich "C:\Users\DEIN_BENUTZERNAMEN\AppData\Roaming\Mozilla"
Auf dem neuen Rechner installiert Du Dir ganz normal den Firefox.
Wenn das abgeschlossen ist, es macht nichts, wenn er jetzt dennoch startet, einfach beenden.
Jetzt gehst Du wieder zu "C:\Program Files\" suchst den Ordner "Mozilla Firefox" löschst den
und kopierst direkt im Anschluss aus Deiner Sicherung den Ordner "Mozilla Firefox" wieder da hinein.
Sofort danach gehst Du zu "C:\Users\DEIN_BENUTZERNAMEN\AppData\Roaming\" suchst hier den Ordner "Mozilla",
diesen löschst Du und ersetzt ihn sofort durch Deinen gesicherten Ordner "Mozilla".
Wenn Du es genau so machst, ....
Dann fehlt ihm die Vorbereitung für die Scripte.
Wenn er es auf dem alten Rechner schon eingerichtet hatte, und er nun die Installation auf dem neuen Rechner genau wie beschrieben ersetzt, dann nicht.
Und natürlich soll er, wenn alles gemacht wurde auch sofort das Update machen.
Du hast den Firefox installiert!
Befolge doch ganz einfach das, was ich geschrieben habe.
Das geht! Selbst schon so gemacht.
Trage den Code doch mal in die "userChrome.css" ein.
Speichern und den Firefox neu starten.
Das Script baut mir hier keinen Button.
Sorry, da komme ich nicht weiter.
Eigentlich findet man die Skripte doch da => https://github.com/Endor8/userChrome.js
und da => https://github.com/alice0775/userChrome.js
Und wenn man im Suchfeld den Namen eingibt, kann man auch immer die neueste Version finden.
Und auch hier findet man recht gute Skripte!
Hinten steht, wann sie aktualisiert, bzw. erstellt wurden!
Und suchen kann man hier ebenso.
Auch hier kann das eine oder andere Skript gesucht und gefunden werden.
Und wer wissen möchte, woher noch das eine oder andere Skript herkommt
schaut mal hier.
Auf dem alten Rechner ganz einfach
%ProgramFiles%\
und den ganzen Installationsordner sichern!
Sollte "Mozilla Firefox" sein.
Dann
%appdata%\
und den kompletten Ordner "Mozilla" sichern.
Einfach mit Zip oder WinRAR packen.
Auf dem neuen Rechen dann, wenn Firefox installiert ist,
Erst den Installationsordner löschen und dann durch die gesicherte Version ersetzen.ACHTUNG
Den Firefox auf gar keinen Fall starten.
Als nächstes ersetzt Du den kompletten Profilordner. ("Mozilla")
Jetzt kannst Du den Firefox starten.
Es sollte alles so sein, wie auf dem alten Rechner.
Denke aber daran, auch das Update zu machen, wenn alles so ist, wie Du erwartest.
Mit CSS kommst Du klar?
/*--------------------------------------------*/
/**** Tabbar nach unten verschieben ****/
/*--------------------------------------------*/
#navigator-toolbox {
position: relative !important;
/* padding-bottom: calc( var(--tab-min-height) + 8px ); */ /* 44px */
padding-bottom: 42px !important;
}
#TabsToolbar {
position: absolute !important;
display: block !important;
}
Alles anzeigen
Und nun?
// ==UserScript==
// @name AddOnLister.uc.js
// @compatibility 138.*
// @include main
// @version 1.0.20250501
// ==/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\\Inet\\Documents\\Fx-Export\\",
//Dateinamen ohne(!) Erweiterung eingeben - diese wird weiter unten im Wert "fileext" pro Ausgabeformat definiert
EXPORTFILE: "addonlisterdaily",
// Ausgabeformat bbcode, html oder custom
FORMAT: "html",
// 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ügig angepasst.</p>',
'userchromejs':'<p id="fxcuclisteintro">Durch die Erweiterung userChromeJS eingebundene Skripte ergä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: Cu.import("resource://gre/modules/FileUtils.jsm").FileUtils,
FILEUTILS: ChromeUtils.importESModule('resource://gre/modules/FileUtils.sys.mjs').FileUtils,
init: function() {
// legt verschiebbaren Button und Menü unter Extras an
// Button
if (location != 'chrome://messenger/content/messenger.xhtml') return;
var toolbarbutton = document.createXULElement('toolbarbutton');
// var currentProfileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
var attributes = {
id: 'adonli-button',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
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) toolbarbutton.setAttribute(a, attributes[a]);
var toolbox = document.getElementById("mail-toolbox");
toolbox.palette.appendChild(toolbarbutton);
var toolbar = document.getElementById("tabbar-toolbar");
toolbar.insertItem("adonli-button", toolbar.lastChild);
// 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("taskPopup", "menu", {
id: "menu_ucjsAddonLister",
accesskey: "L",
label: "AddonLister",
class: "menu-iconic",
style: "list-style-image: url(" + ADONLI.ICON_URL + ")"
});
document.getElementById("taskPopup")
.insertBefore(document.getElementById("menu_ucjsAddonLister"),
document.getElementById("addonsManager").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"
});
var menuItem = 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"
});
// Event-Listener für das 'command'-Event hinzufügen
menuItem.addEventListener("command", function() {
ADONLI.launch(0, 'bbcode');
});
var menuItem = 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"
});
// Event-Listener für das 'command'-Event hinzufügen
menuItem.addEventListener("command", function() {
ADONLI.launch(1, 'bbcode');
});
var menuItem = 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"
});
// Event-Listener für das 'command'-Event hinzufügen
menuItem.addEventListener("command", function() {
ADONLI.launch(2, 'bbcode');
});
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"
});
var menuItem = 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"
});
// Event-Listener für das 'command'-Event hinzufügen
menuItem.addEventListener("command", function() {
ADONLI.launch(0, 'html');
});
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"
});
// Event-Listener für das 'command'-Event hinzufügen
menuItem.addEventListener("command", function() {
ADONLI.launch(1, 'html');
});
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"
});
// Event-Listener für das 'command'-Event hinzufügen
menuItem.addEventListener("command", function() {
ADONLI.launch(2, 'html');
});
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"
});
// Event-Listener für das 'command'-Event hinzufügen
menuItem.addEventListener("command", function() {
ADONLI.launch(0, 'custom');
});
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"
});
// Event-Listener für das 'command'-Event hinzufügen
menuItem.addEventListener("command", function() {
ADONLI.launch(1, 'custom');
});
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"
});
// Event-Listener für das 'command'-Event hinzufügen
menuItem.addEventListener("command", function() {
ADONLI.launch(2, 'custom');
});
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"
});
// Event-Listener für das 'command'-Event hinzufügen
menuItem.addEventListener("command", function() {
ADONLI.launch(0, ADONLI.FORMAT);
});
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"
});
// Event-Listener für das 'command'-Event hinzufügen
menuItem.addEventListener("command", function() {
ADONLI.launch(1, ADONLI.FORMAT);
});
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"
});
// Event-Listener für das 'command'-Event hinzufügen
menuItem.addEventListener("command", function() {
ADONLI.launch(2, ADONLI.FORMAT);
});
},
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/ardiman/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,'&'));
}
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 = OS.File.writeAtomic(file, myarray);
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
?
Komisch, als ich hier Antwortete, war oben noch kein Code zu sehen!
Bitte teste dieses hier:
// ==UserScript==
// @name AddOnLister.uc.js
// @compatibility Thunderbird Beta
// @include main
// @version 1.0.20230520
// ==/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: "D:\\Addonlister\\",
//Dateinamen ohne(!) Erweiterung eingeben - diese wird weiter unten im Wert "fileext" pro Ausgabeformat definiert
EXPORTFILE: "addonlisterdaily",
// Ausgabeformat bbcode, html oder custom
FORMAT: "html",
// 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 : 'D:\\Programme\\Notepad++-8.4.8\\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ügig angepasst.</p>',
'userchromejs':'<p id="fxcuclisteintro">Durch die Erweiterung userChromeJS eingebundene Skripte ergä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: Cu.import("resource://gre/modules/FileUtils.jsm").FileUtils,
FILEUTILS: ChromeUtils.importESModule('resource://gre/modules/FileUtils.sys.mjs').FileUtils,
init: function() {
// legt verschiebbaren Button und Menü unter Extras an
// Button
if (location != 'chrome://messenger/content/messenger.xhtml') return;
var toolbarbutton = document.createXULElement('toolbarbutton');
// var currentProfileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
var attributes = {
id: 'adonli-button',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
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) toolbarbutton.setAttribute(a, attributes[a]);
var toolbox = document.getElementById("mail-toolbox");
toolbox.palette.appendChild(toolbarbutton);
var toolbar = document.getElementById("tabbar-toolbar");
toolbar.insertItem("adonli-button", toolbar.lastChild);
// 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("taskPopup", "menu", {
id: "menu_ucjsAddonLister",
accesskey: "L",
label: "AddonLister",
class: "menu-iconic",
style: "list-style-image: url(" + ADONLI.ICON_URL + ")"
});
document.getElementById("taskPopup")
.insertBefore(document.getElementById("menu_ucjsAddonLister"),
document.getElementById("addonsManager").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/ardiman/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,'&'));
}
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 = OS.File.writeAtomic(file, myarray);
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
Und was genau soll es machen, welche Funktionen stellt es bereit?
Oder, dieses hier!
Ich war so frei und habe beides zusammengeführt.
// ==UserScript==
// @name MultiRowTabLiteforFx.uc.js
// @namespace Based on Alice0775's zzzz-MultiRowTab_LiteforFx48.uc.js
// @description Multi-Row tabs experimental version with embedded CSS, Lite version
// @include main
// @compatibility Firefox138+
// @version 2025/04/07 12:00
// ==/UserScript==
"use strict";
MultiRowTabLiteforFx();
function MultiRowTabLiteforFx() {
if (!window.gBrowser) { return; }
// -- Config --
// If you write similar CSS, “userChrome.css” will take priority
const // Multi-Row tab, On/Off Number of tabs in tab bar
MultiRowTab_OnOff_and_TabBar_Rows = -1 ,// [-1] = Multi-Row tab, On Unlimited number of columns
// 0 = Multi-Row tab Off
// 1 = Multi-Row tab On Normally, one tier is used and the second and subsequent tiers are displayed up to the specified number of tiers when the tab bar is moused over. *Specify the number of rows with “TabBar_Rows_on_MouseOver”.
// 2~ = Multi-Row tab On Specify the number of columns
TabBar_Rows_on_MouseOver = 3 ,// Specify the number of tiers you want to display when you mouse over the tab bar, usually one tier. Prerequisite: “MultiRowTab_OnOff_and_TabBar_Rows” is set to “1”.
TabBar_DisplayTime_on_MouseOver = 1 ,// You can set the display time (in seconds) when the second and subsequent rows are displayed on mouse-over. The display will return to the first Row after displaying the set number of seconds.
// Tab bar position
TabBar_Position = 0 ,// [0] = Above Toolbar Default
// 1 = Under the toolbar
// 2 = Under Site Content
// For people who want to swap the position of the tab bar and bookmark toolbar after setting the tab bar position below the toolbar.
// Prerequisite: “TabBar_Position” is set to “1”.
Bookmark_Toolbar_Position = true ,// [true] = Menu bar, navigation bar, bookmark bar, tab bar
// false = Menu bar, navigation bar, tab bar, bookmark bar
// Tab Height UI Density
UI_Density_Compact = 29 ,// Default 29px, Compact
UI_Density_Normal = 36 ,// Default 36px, Normal (set here your own Tab Height)
UI_Density_Touch = 41 ,// Default 41px, Touch
// Tab Width
Tab_Min_Width = 212 ,// Default 76px, Min.
Tab_Max_Width = 212 ,// Default 225px, Max.
// If both values are the same, the width will be fixed.
// Close Tab button
Tab_Close_Button = 0 ,// [0] = Default
// 1 = Hidden
// 2 = Show in all tabs
// 3 = Display tabs with mouse over
// 4 = Active tabs are always visible, inactive tabs are shown on mouse-over *Default for vertical tab mode.
// Tab Appearance ProtonUI
Proton_Margins = true ,// [true] = ProtonUI Default
// false = Make it look like it did when “browser.proton.enabled” was set to “false” in the Firefox 90 or earlier settings.
// The space around the tabs is set to 0 and the UI density height is set to 0, so the tabs are 4px wider horizontally and 8px lower in height than the default.
// Borders next to tabs
Tab_Separators = false ,// [false] = Do not show
// true = Show
// The CSS of the border that could be displayed when “browser.proton.enabled” was set to “false” in Firefox 90 or earlier is extracted and adjusted.
// Hide the title bar button [-□×] and use the wider width of the tab bar for it.
// Prerequisite: “TabBar_Position” is set to “0”.
TitleBar_Button_Autohide = false ,// [false] = Not used
// true = Use Normally, the outer frame of the title bar button [-□×] is made small and transparent; if you want to display it, return the trigger area (36px x 6px) in the upper right corner of the tab bar to its original size with a mouseover to remove transparency.
TitleBar_Button_DisplayTime = 0.6 ,// You can set the display time (in seconds) after the transparency is released by returning it to its original size on mouse over. The image will be displayed for the set number of seconds before it is hidden.
// Set the tab bar to the height of the specified number of columns from the beginning.
// Prerequisite: “MultiRowTab_OnOff_and_TabBar_Rows” is set to “2” or higher.
Set_the_TabBar_to_the_Specified_Height = false ,// [false] = Not used
// true = Use The tab bar is set to the height of the specified number of columns from the beginning, and tabs are lined up as usual, starting from the upper left corner.
// Replacement of “.tabDropIndicator” that displays tabs during drag & drop movement
// Prerequisite: Set “MultiRowTab_OnOff_and_TabBar_Rows” to something other than “0”.
Tab_Drop_Indicator = false ,// [false] = No Pin icon Default
// true = Red line icon(2px×29px)
// Pinning tab position
// Prerequisite: Set “MultiRowTab_OnOff_and_TabBar_Rows” to something other than “0”.
Separate_Tabs_and_PinnedTabs = false ,// [false] = Default
// true = Move pinned tabs to a line that can be separated from and above the row of tabs.
// Adjust width of pinned tabs
// Prerequisite: Set “Separate_Tabs_and_PinnedTabs” to “true”.
PinnedTab_Width = false ,// [false] = Not default
// true = The width of the pinned tabs can be adjusted to match the width of the tabs.
PinnedTab_Min_Width = 76 ,// Default 76px Min.
PinnedTab_Max_Width = 225 ,// Default 225px Max.
// If both values are the same, the width will be fixed.
// Pinned tabs Close tab button
// Prerequisite: Set “Separate_Tabs_and_PinnedTabs” to “true”.
PinnedTab_Close_Button = 0 ,// [0] = Default
// 1 = Show in all tabs
// 2 = Show tabs on mouse over
// 3 = Active tabs are always visible, inactive tabs are shown on mouse-over *Vertical tab mode is the default.
// Drag area on tab bar
Left_Drag_Area = 0 ,// Default 40px left drag area
Right_Drag_Area = 0 ,// Default 40px right drag area
Maximize_Left_Drag_Area = false ,// [false] = Default
// true = When the window is maximized, the left drag area, which is hidden, can be displayed.
Fullscreen_Drag_Area = false ,// [false] = Default
// true = The left and right drag areas that are hidden when in full-screen mode can be displayed.
// When the title bar is displayed, “.titlebar-spacer” does not function as a drag area.
// -- 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
GermanFreme82 Es gibt keine NEUE Version des Skriptes!
Und wenn Du die ersten Zeilen im Skript lesen kannst, wirst Du lesen können, dass es schon 6 Jahre auf dem Buckel hat.
Es ist immer wieder angepasst worden, neue Funktionen kamen hinzu.
ES ist ein "Monster" geworden und kein Mensch blickt da noch richtig durch.
Und dann kommt noch hinzu, dass es für Dich auch immer mal wieder auf Dich zugeschnittene Anpassungen gab.
Verstehe, dieses Skript wird Dir niemand mehr zum Laufen bringen.
Du musst schon auf eine andere Möglichkeit setzten!
Und wenn es ganz blöd für Dich läuft, Dich damit auseinandersetzen, dass es keine mehrzeilige Tableiste mehr gibt.
GermanFreme82 Nein, das Skript ist nicht UpToDate!
Es wurde zwar für Dich modifiziert, was bedeutet, dass nur das CSS, also das Layout geändert wurde.
Der JavaScript-Code wurde aber gar nicht angefasst!
Und wie immer, Mozilla hat im Firefox was geändert und Funktionen in JavaScript funktionieren nicht mehr.
Das Script ist von BrokenHeart und hier noch einmal seine Antwort:Wichtig: Dieses Skript wird nicht mehr weiterentwickelt. Die letzte Firefox-Version, die noch unterstützt wird ist 137.
Horstmann Webmark mag keine Scherze, schon gar nicht, wenn es um ihn geht.
Is so, deshalb habe ich meinen Scherz wieder gelöscht.
Besser wäre natürlich immer, die Skripte anzupassen, da gebe ich dir recht.
Nur darum geht es mir hauptsächlich!
Das Problem das sich aus dem "Schalter" zusätzlich ergibt,
es würden dann noch mehr Skripte hier im Board herumschwirren.
Die einen, die NUR mit diesem "Schalter" funktionieren und die anderen,
die auch ohne funktionieren.
Muss man dann in Zukunft immer fragen, hast die den Wert
security.allow_unsafe_dangerous_privileged_evil_eval auf true oder false stehen?
Der neue Eintrag für die config wurde extra von Mozilla für Nutzer von Skripten ab Fx Version 139 erst erstellt.
Und ob das auch so bleibt?
Es braucht diese "Lücke" dann ja nur von pösen Buben mal angegriffen und ausgenutzt zu werden.
Oder sie kommen einfach doch auf die Idee, dass das zu unsicher ist.