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. Horstmann

Beiträge von Horstmann

  • Diskussion über neues Unterforum nur für Skripte

    • Horstmann
    • 9. Mai 2025 um 00:10
    Zitat von BrokenHeart
    Zitat von Mira_Belle

    Ein nicht öffentlicher Unterbereich?

    Die Unterscheidung in Entwickler/Helfer und "normalem" Anwender halte ich für falsch. Keiner von uns ist wirklich überall zu Hause und jeder, der sich mit individuellen Anpassungen beschäftigt, tut das oft auch auf Code-Ebene und wenn es auch nur das Ändern des Farbcodes oder bestimmter Größenangaben bei einem CSS-Code oder Skript ist. Außerdem ist ein reiner Nutzer eines Skriptes ein sehr wichtiger Aspekt der Entwicklung, weil ja hier die Anforderungen definiert werden und das Skript letztendlich getestet wird.

    Zitat von Mira_Belle

    Es muss, es soll ja auch nicht ein eigenes Unterforum sein, es kann ja auch ein Unterunterforum sein, halt extra nur für
    einzelne Skripte und nicht so ein Durch einander wie bisher, dass in einem Thread dutzende Skript besprochen werden.

    Aber das haben wir doch schon und zwar in Form einer professionellen Versionsverwaltung, die genau für solche Dinge geschaffen wurde:

    https://github.com/Endor8/userChrome.js

    Zitat von Horstmann

    Es wäre aber vermutlich trotzdem hilfreich, sowas wie ein Coding Basics Subforum zu haben, für allgemeine und aktuell nötige Diskussionen zu generellen Lösungsansätzen, wie oben schon erwähnt.

    Dem stimme ich zu, obwohl ich mir die Frage stelle, ob nicht jeweils ein eigener Thread für Lösungsansätze zu einem generellen Problem ausreichend ist? :/

    Weil ja hier auch immer von Wiederverwertung und Standardisierung bestimmter Lösungen gesprochen wird:

    Alles anzeigen

    - Einen privaten Bereich halte ich auch für kontraproduktiv, v.a. auch wegen der von dir erwähnten wichtigen User Kommentare zu Funktion, gewünschten Features und Nutzbarkeit.
    Es sollte sich auch niemand bewerben müssen um in einen Sub beitragen zu können, va potentielle Experten die einsteigen wollen.

    - Endor macht einen fantastischen Job, aber ein repository ist mE nicht Teil dieser Diskussion; dort werden Dateien bereitgestellt, nicht diskutiert. Wegen mir sollten die Einzelthemen zu spezifischen Scripts/CSS auch unbedingt im Anpassungsforum bleiben.

    - Ein Anpassungen/Subforum hätte den einen Vorteil, die Threads zur Wiederverwertung und Standardisierung - exakt der Punkt - vom Anpassungsforum räumlich zu separieren, um solche Threads leichter überblicken zu können, ohne wie gesagt sie anzupinnen oder dass sie vom täglichen Themenflow hin und her geschoben zu werden.

    Falls in der Form realisiert, könnte das schliesslich als knowledge base dienen; die Forensuche kannste einfach knicken dafür.

    Fakt ist, dass für mich ein Grossteil der wichtigsten Infos und Entwicklungen hier im Forum mühsam zusammengesucht werden müssen, indem man jedes einzelne Topic nach möglichen Perlen durchkämmt.

  • Skript VerticalToolbar.uc.js funktioniert in neu erstellten Profilen nicht mehr richtig

    • Horstmann
    • 8. Mai 2025 um 23:35
    Zitat von grisu2099

    Der Übeltäter war eine (in Worten: 1) bei der Überarbeitung meines CSS vergessene Zeile. Kaum ist die wieder eingefügt, spielt auch die Leiste wieder brav mit... :D

    Ist das Script von #1 jetzt mit korrigierter CSS? :/

  • Diskussion über neues Unterforum nur für Skripte

    • Horstmann
    • 8. Mai 2025 um 22:47
    Zitat von bege
    Zitat von Horstmann

    Und nur mal 2 Beispiele:

    Diese schon öfters erwähnte Thread ist gepackt voll mit super Infos zu der addEventListener Geschichte, aber immens aufgebläht durch die Einzelscript Diskussionen.

    Hier haben wir wichtige Infos zu eval etc., die in einem Script spezifischen Thread versteckt sind.

    Das sind für mich 2 typische Beispiele: Die Themen wurden erstellt, weil Skripte nach Firefox-Updates nicht mehr funktionierten. Das ist nach meiner Beobachtung die Regel. Im Verlauf der Diskussion wurden die nötigen Änderungen herausgefunden und in die Skripte integriert. Dass in dem Thema auch für die folgenden Firefox-Versionen grundsätzliche Informationen stehen, weiß man beim Erstellen des Themas noch nicht. Um solche Themen übersichtlich in einem Unterforum darzustellen, müsste also ein Moderator die Themen durchforsten und dann umbenennen und - oft nur zum Teil - verschieben. Und nach diversen Firefox-Updates ist manches schon wieder anders.

    Die weniger aufwändige Möglichkeit, mit der Tendenz des Lebens zum Chaos umzugehen, ist wie bisher mit vertretbarem Zeitaufwand die Forensuche zu nutzen.

    Mit einem bestehenden Unterforum könnte man die allgemeine Diskussion in Einzelthemen vermeiden, indem die relevanten Beiträge nicht dort, sondern bei bestehendem Bedarf als Thread in eben diesem Unterforum diskutiert werden.

    Die Forensuche hilft nicht, wenn man über eine Problematik nichts erfahren hat - weil sie in Einzelthemen versteckt ist - was dann zu vielfach wiederholten gleichen Fragen in weiteren Einzelthemen führt, und unkoordinierten Antworten.
    Die Forensuche leidet zudem darunter, dass nicht ausgeklappte Codes das Suchen sehr erschweren.

    Moderatoren müssen keinen Extraaufwand betreiben wie von dir beschrieben, wenn eine Problematik in ihrem eigenen Thread diskutiert wird, das ist ja die Idee dahinter.
    Bestehende Beiträge kann man ja immer noch als User zitieren und verlinken.

    In den genannten Beispielen ist es mir und anderen recht schnell aufgefallen, dass das vorliegende Problem übergreifende Auswirkungen hat oder haben könnte.

    Was wir als User machen müssten, wäre diese generellen Themen nicht in dem Ausgangsthema (wie hier) zu besprechen, sondern bei Bedarf zeitnah einen neuen Thread in dem Subforum erstellen, und von dort aus weiter zu arbeiten.

    Das funktioniert durchaus in vielen Foren, muss man nur etablieren.

  • Diskussion über neues Unterforum nur für Skripte

    • Horstmann
    • 8. Mai 2025 um 20:28

    Ich bin da geteilter Meinung: zum einen ja zu einem Subforum rein für Basiskonzepte und -Lösungen, zum anderen häufen sich spezifische Anfragen oft nur wenn ein Fx Update grundlegende Probleme für bestehenden Code in JS oder CSS verursacht, was nicht immer der Fall ist.:/

    Es wäre aber vermutlich trotzdem hilfreich, sowas wie ein Coding Basics Subforum zu haben, für allgemeine und aktuell nötige Diskussionen zu generellen Lösungsansätzen, wie oben schon erwähnt.

    Viele dieser Ansätze gehen oft unter in, oder verteilen sich auf diverse Threads, und Themen anzupinnen hat ja auch seine Grenzen, wenn man das Anpassungen Forum nicht damit überfluten will.

    Den zusätzlichen Aufwand für das einrichten und verwalten/moderieren eines zusätzlichen Subforums kann ich allerdings nicht einschätzen, das ist natürlich auch ein wichtiger Aspekt.


    Und nur mal 2 Beispiele:

    Diese schon öfters erwähnte Thread ist gepackt voll mit super Infos zu der addEventListener Geschichte, aber immens aufgebläht durch die Einzelscript Diskussionen.

    Hier haben wir wichtige Infos zu eval etc., die in einem Script spezifischen Thread versteckt sind.

  • Einbindung von Icons in Skripts

    • Horstmann
    • 8. Mai 2025 um 18:27

    Für mich stellt sich bei dem Thema im Eigentlichen die Frage, wie man generell, als Skript Author, Icons am besten einbindet.

    Generell, für diverse existierende Skript-Layouts(?), nicht für jedes einzelne Skript.

    Das Ziel wäre mE den einfachen Zugang zur Benutzung von Skripts zu erhalten, indem man ein Basisicon in irgendeiner Form integriert, und auch eine einfache Lösung zur Benutzung eigener Icons bereitzustellen.

    Wie schon erwähnt, momentan gibt es halt die base64 Icons<X;) in vielen Scripts, oder die Dateipfad Varianten für die Nutzung von eigenen Icons.
    Die Fallback Geschichte könnte ein Zwischending sein, das beide Eventualitäten bedient.

    Wobei ich mich nach einigen Versuchen jetzt doch frage, ob man damit mit Kanonen auf Spatzen schiesst. ;)

  • Einige Skripte funktionieren seit ff 138 nicht mehr

    • Horstmann
    • 8. Mai 2025 um 14:44
    Zitat von 2002Andreas

    Ich habe die OT Beiträge mal verschoben nach:

    Beitrag

    Einbindung von Icons in Skripts

    […]

    In diesem Fall denke ich, kaum jemand wird sich beide Skripte gleichzeitig installieren.:/

    Zumindest wäre dieser Weg eine Lösung für weg von base64. Möchte dann jemand ein anderes Icon, dann kann er es ja austauschen, oder eben hier im Forum nachfragen wie er das machen müsste.
    2002Andreas
    7. Mai 2025 um 19:02

    Dankeschön! :):thumbup:

  • Einbindung von Icons in Skripts

    • Horstmann
    • 8. Mai 2025 um 13:45
    Zitat von 2002Andreas
    Zitat von Horstmann

    evtl. mal ran und verschieben.

    Das kann ich machen wenn du mir sagst, ab welchem Beitrag und welchen Titel der Thread dann haben soll.

    Mein Vorschlag, ab #48, dann geht kein Thread spezifischer Code verloren.

    Titel könnte etwa sein: Einbindung von Icons in Skripts.

  • Einbindung von Icons in Skripts

    • Horstmann
    • 8. Mai 2025 um 13:14
    Zitat von Mira_Belle

    Wir sollten aber für DIESE Diskussion, so finde ich, ein eigenes Thema aufmachen, oder?

    Das macht Sinn; da könnte 2002Andreas evtl. mal ran und verschieben.

    Und, Test:

    JavaScript
    //profile-button.uc.js tester icons Mira 1b
    
      (function() {
    
       if (location.href !== 'chrome://browser/content/browser.xhtml')
        return;
    
        try {
            CustomizableUI.createWidget({
                id: 'Profiles_button',
                type: 'custom',
                defaultArea: CustomizableUI.AREA_NAVBAR,
                onBuild: function(aDocument) {
                    //let currentProfileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
                    //let buttonicon = "LettersP-1.png";
    
    
                    let toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
                        let props = {
                        id: 'Profiles_button',
                        class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                        label: 'Profiles',
                        tooltiptext: 'about:profiles',
                        //style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");',
                    };
                    for (var p in props)
                        toolbaritem.setAttribute(p, props[p]);
                    return toolbaritem;
                }
            });
        } catch(e) { }
    
          document.getElementById('Profiles_button').addEventListener('click', event => {
            if (event.button === 0) {
              openTrustedLinkIn("about:profiles", "tab");
            }
          });
    
          let currentProfileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
          let buttonicon = "LettersP-1.png";
    
          let img = new Image();
          img.src = "file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon;
          img.onload = function() {
            Profiles_button.style.listStyleImage = 'url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '")';
          };
          img.onerror = function() {
            Profiles_button.style.listStyleImage = 'url("chrome://browser/skin/translations.svg")';
          };
    })();
    Alles anzeigen
  • Einbindung von Icons in Skripts

    • Horstmann
    • 8. Mai 2025 um 00:40
    Zitat von Mira_Belle

    So, mit Fallback.
    Als Muster für andere Skripte.

    JavaScript
    // ------------------------------------------------------------------------------------------------
    	// Pfad zum Profilordner
    	let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
    	// Pfad in den entsprechenden Unterordner
    	let IconPath = '/chrome/icons/'; // Pfad in den entsprechenden Unterordner
    	// Name & Dateiendung des anzuzeigenden Symbols!
    	let ButtonIcon = "Google.svg";
    
    	// Erstelle ein img-Element, um zu überprüfen, ob die Grafik geladen werden kann
    	let img = new Image();
    	img.src = "file:" + ProfilePath + IconPath + ButtonIcon;
    
    	img.onload = function() {
    		// Wenn die Grafik geladen werden kann, setze das listStyleImage
    		menuitem.style.listStyleImage = 'url("' + ("file:" + ProfilePath + IconPath + ButtonIcon) + '")';
    	};
    
    	img.onerror = function() {
    		// Wenn die Grafik nicht geladen werden kann, verwende das Fallback-Icon
    		menuitem.style.listStyleImage = 'url("chrome://browser/skin/translations.svg")';
    	};
    // ------------------------------------------------------------------------------------------------
    Alles anzeigen

    Mira, wenn wir dich nicht hätten, und die kleinen Kartoffeln - vielen Dank! :):thumbup:

    Kleiner Schönheitsfehler nur auf meiner Seite; das ist nur ein schneller erster Test, und dein Code etwas umgebaut um meinen existierenden Code nicht komplett anzupassen zu müssen - aber die Einbindung ist bei mir noch etwas grob.

    Das alte Problem mit dem zweiten Fenster : ich muss den Code nach unten schieben, raus aus dem oberen Codeblock/Loop(?), und ein paar Variablen wiederholen, damit er auch im Elchtest funktioniert.;)

    A propos, was ist eigentlich der Grund für den ganzen props Code, hier Zeile 29-39?
    Kann man die Attribute nicht direkt einfügen?
    Ich denke da kommt das Problem her.

    Kein Drama, aber halt nicht sehr elegant:

    JavaScript
    //profile-button.uc.js tester icons Mira
    
      (function() {
    
       if (location.href !== 'chrome://browser/content/browser.xhtml')
        return;
    
        try {
            CustomizableUI.createWidget({
                id: 'Profiles_button',
                type: 'custom',
                defaultArea: CustomizableUI.AREA_NAVBAR,
                onBuild: function(aDocument) {
                    let currentProfileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
                    let buttonicon = "LettersP-1.png";
    
                    // let img = new Image();
                    // img.src = "file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon;
                    //
                    // img.onload = function() {
                    //   toolbaritem.style.listStyleImage = 'url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '")';
                    //     };
                    //
                    // img.onerror = function() {
                    // toolbaritem.style.listStyleImage = 'url("chrome://browser/skin/translations.svg")';
                    //    };
    
                    let toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
                        let props = {
                        id: 'Profiles_button',
                        class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                        label: 'Profiles',
                        tooltiptext: 'about:profiles',
                        style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");',
                    };
                    for (var p in props)
                        toolbaritem.setAttribute(p, props[p]);
                    return toolbaritem;
                }
            });
        } catch(e) { }
    
        document.getElementById('Profiles_button').addEventListener('click', event => {
          if (event.button === 0) {
            openTrustedLinkIn("about:profiles", "tab");
          }
        });
    
        let currentProfileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
        let buttonicon = "LettersP-1.png";
    
        let img = new Image();
        img.src = "file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon;
    
        img.onload = function() {
          document.getElementById('Profiles_button').style.listStyleImage = 'url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '")';
            };
    
        img.onerror = function() {
        document.getElementById('Profiles_button').style.listStyleImage = 'url("chrome://browser/skin/translations.svg")';
           };
    
    })();
    Alles anzeigen
  • Einbindung von Icons in Skripts

    • Horstmann
    • 7. Mai 2025 um 22:57
    Zitat von milupo
    Zitat von Horstmann

    Wie sowas, was aber auch kein Fortschritt ist zu meinem ersten Versuch in #59, nur hässlicher im Code.

    Es müsste auch Kommentar am Skript-Anfang stehen, was es in diesem Fall mit den Zeilen 21 und 23 auf sich hat.

    Das versteht sich, die Frage ist nur ob man diesen (kl)einen Schritt Leuten zumuten kann.;)
    Der Vorteil von den fest integrierten Icons ist ja, dass niemand den JS Code auch nur öffnen muss - der Nachteil, ohne Eigeninitiative in entweder JS oder CSS: kein eigenes Icon.8|

    Persönlich denke ich ja, Javascript Benutzer sollten den Schritt machen können; aber wir reden hier - wie so oft - eigentlich nur über User die komplett fertige Lösungen wollen oder brauchen, was ich auf eine Art auch verstehen kann. :/

  • Einbindung von Icons in Skripts

    • Horstmann
    • 7. Mai 2025 um 22:09
    Zitat von milupo
    Zitat von Horstmann

    Wenn es jetzt noch möglich wäre, einen automatischen Fallback einzurichten.

    Eventuell zwei Zeilen, die erste ist von Anfang an aktiv und gibt den Pfad zur chrome://-Datei an und einen entsprechenden Kommentar. Und die zweite erst einmal auskommentierte Zeile mit einem Beispielpfad, wo der Kommentar angibt, dass man da eine eigen Datei angeben kann und dass man die Kommentarzeichen vor dieser Zeile entfernen und vor die erste Zeile setzen muss. Aber diese Zusammenbau-Variante verkompliziert das meiner Meinung nach.

    Deshalb wäre eben ein Fallback wie in CSS perfekt, das kapiere ich aber nicht in JS.:/

    Ansonsten, egal wie ein alternatives Icon angeboten würde, ob von Firefox oder über Endor's Seite - gleiches Prinzip, nur Zusatzarbeit für Endor - bräuchte es halt einen manuell zu schaltenden//kommentierenden Code.

    Wie sowas, was aber auch kein Fortschritt ist zu meinem ersten Versuch in #59, nur hässlicher im Code.

    JavaScript
    //profile-button.uc.js tester icons
    
      (function() {
    
    
    
       if (location.href !== 'chrome://browser/content/browser.xhtml')
        return;
    
        try {
            CustomizableUI.createWidget({
                id: 'Profiles_button',
                type: 'custom',
                defaultArea: CustomizableUI.AREA_NAVBAR,
                onBuild: function(aDocument) {
                    let currentProfileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
                    let buttonicon = "LettersP-1.png";
    
                    // tester
                    //eigenes icon
                    //let styler = 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");';
                    //Firefox icon
                    let styler = 'list-style-image: url("chrome://browser/skin/translations.svg");';
    
                    let toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
                        let props = {
                        id: 'Profiles_button',
                        class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                        label: 'Profiles',
                        tooltiptext: 'about:profiles',
                        // original
                        //style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");',
    
                        // tester
                        style: styler
                    };
    
                    for (var p in props)
                        toolbaritem.setAttribute(p, props[p]);
                    return toolbaritem;
                }
            });
        } catch(e) { }
    
        document.getElementById('Profiles_button').addEventListener('click', event => {
          if (event.button === 0) {
            openTrustedLinkIn("about:profiles", "tab");
          }
        });
    })();
    Alles anzeigen
  • Einbindung von Icons in Skripts

    • Horstmann
    • 7. Mai 2025 um 21:20
    Zitat von Mira_Belle

    Z.B. so etwas:

    JavaScript
    // ------------------------------------------------------------------------------------------------
    	// Pfad zum Profilordner
    	let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
    	// Pfad in den entsprechenden Unterordner
    	let IconPath = '/chrome/icons/'; // Pfad in den entsprechenden Unterordner
    	// Name & Dateiendung des anzuzeigenden Symbols!
    	let ButtonIcon = "Google.svg";
    	menuitem.style.listStyleImage = 'url("' + ("file:" + ProfilePath + IconPath + ButtonIcon) + '")';
    // ------------------------------------------------------------------------------------------------

    Und dann eine Erklärung für "Beginners", was sie damit anfangen sollen!

    Wenn es jetzt noch möglich wäre, einen automatischen Fallback einzurichten.:/

    Wenn ein eigenes Icon - hier Google.svg - nicht gefunden wird/existiert, wird ein Firefox Icon benutzt - wie etwa chrome://browser/skin/translations.svg - aber nur dann.

    Damit hätten Anfänger sowohl ein sofort sichtbares Icon, als auch die Möglichkeit ein eigenes Icon in chrome/icons zu benutzen, ohne den JS Code verändern zu müssen.

    Ich habe mich mal danach umgeschaut, aber noch keine Lösung gefunden.?(
    Das Ganze sollte dann auch nicht die Leistung negativ beeinflussen.

    Oder halt sowas, da muss nur eine Zeile manuell geändert werden, um zwischen beiden Varianten umzuschalten.

  • Einbindung von Icons in Skripts

    • Horstmann
    • 7. Mai 2025 um 20:17
    Zitat von milupo

    Vielleicht wäre es möglich, wenn Endor durchgehend chrome://-Grafiken angeben könnte. Diese würden wie Base64-Grafiken sofort funktionieren. Und im Kommentar schreibt man dann, dass gesonderte Grafiken mit file:/// angegeben werden sollen, dabei könnte man ein Beispiel angeben. Dabei sollten m. E. nur absolute Pfade angegeben werden, mal davon abgesehen, dass die relativen Pfade nicht immer funktionieren. Aber wenn da ein Nutzer irgendetwas verschiebt, wird die Grafik dann immer noch gefunden.

    Prima Idee!

    Was Dateipfade angeht, haben wir da nicht schon verschiedene Versionen für einen quasi automatisierten Pfad in den jeweiligen Profilordner/chrome/icons?
    V.a. Mira_Belle hat dazu schon öfters diverse Lösungen geliefert.

    Zum Beispiel:

    JavaScript
    //  Browser-Konsole Button Test #3xy
    
      (function() {
       if (location != 'chrome://browser/content/browser.xhtml') return;
        try {
            CustomizableUI.createWidget({
                id: 'consoler_button',
                type: 'custom',
                defaultArea: CustomizableUI.AREA_NAVBAR,
                onBuild: function(aDocument) {
                let currentProfileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/");
                var buttonicon = "LettersK-1.png"
                let toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
                    var props = {
                        id: 'consoler_button',
                        class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                        label: 'Browser-Konsole',
                        tooltiptext: 'Browser-Konsole',
                        style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");'
                        //style: 'list-style-image: url("chrome://browser/skin/translations.svg");'
    
                    };
                    for (var p in props)
                        toolbaritem.setAttribute(p, props[p]);
                    return toolbaritem;
                }
            });
        } catch(e) { };
    
        document.getElementById('consoler_button').addEventListener('click', event => {
        if (event.button === 0) {
             konsolero();
            }
        });
    
        function konsolero() {
            var document = event.target.ownerDocument;
            if (!document.getElementById('menu_browserConsole')) {
                let { require } = ChromeUtils.importESModule("resource://devtools/shared/loader/Loader.sys.mjs", {});
                require("devtools/client/framework/devtools-browser");
            };
            document.getElementById('menu_browserConsole').click();
        };
    
    })();
    Alles anzeigen

    In Zeile 12 gibt man den Namen des eigenen Icons an (in Chrome/icons); man müsste dann nur noch den style Eintrag in Zeile 19/20 auswählen.

    Edit: besseres Code Beispiel

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

    • Horstmann
    • 6. Mai 2025 um 22:07
    Zitat von milupo
    Zitat von Horstmann

    Das, und base64 Dingens (Fachbegriff) Icons, va die aus den 90ern...

    Base64-Grafiken sind aber universell. Für Übersichtsseiten wie die Github-Site von Endor ist das besser. Nach Installation des Skripts hat jeder sofort ein Symbol, das funktioniert.

    Sehr guter Punkt, aber dafür kann man auch eine Grafik benutzen die keine 300 Zeilen im Code einnimmt, zB einen .svg 3 Zeiler.
    Oder noch besser, einfach ein beliebiges Fx internes Icon als Platzhalter benutzen.

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

    • Horstmann
    • 6. Mai 2025 um 21:06
    Zitat von Speravir
    Zitat von Horstmann

    Generell hänge ich einfach den addEventlistener unten an, mit der ID des Buttons, und ausserhalb des oberen Codeabschnitts

    Wenn mir niemand zuvorkommt, werde ich das ausprobieren.

    Müsste die Funktion an sich dann nicht auch nach unten?
    Nicht daß ich Ahnung davon hätte, du bist der Experte. :)
    Aber ich habe keine Idee was dieses Script überhaupt bewirken soll, also wüsste ich nicht wie ich das testen und einen Code vorschlagen könnte.:/

    Zitat von BrokenHeart

    Habe das mal geändert:

    Was man wirklich generell ändern sollte: eine Funktion onClick zu nennen, oder sonstwas das derart kriminell irreführend ist. ;)
    Das, und base64 Dingens (Fachbegriff) Icons, va die aus den 90ern... <X

  • Einige Skripte funktionieren seit ff 138 nicht mehr

    • Horstmann
    • 5. Mai 2025 um 00:22
    Zitat von Zitronella

    Auf jeden Fall konnte ich jetzt auch meine anderen Skripte anpassen, da ja quasi nur eine Zeile auskommentiert und durch eine andere ersetzt werden musste.

    Prima! :)
    Nicht bei allen Scripts funktioniert das gleiche Schema, aber einfach fragen wenn was hängt.

  • Einige Skripte funktionieren seit ff 138 nicht mehr

    • Horstmann
    • 4. Mai 2025 um 23:14
    Zitat von Zitronella

    Ich möchte kein neuen Post aufmachen, daher schreibe ich hier weiter, weil mir gerade auffiel dass noch andere Skripte nicht mehr funktionieren. Vielleicht gibts dafür auch ne Lösung?

    Nur grob getestet:

    JavaScript
    (function() {
    
       if (location != 'chrome://browser/content/browser.xhtml')
          return;
    
       try {
          CustomizableUI.createWidget({
             id: 'quick-media-codec-button',
             type: 'custom',
             defaultArea: CustomizableUI.AREA_NAVBAR,
             onBuild: function(aDocument) {
                var button = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
                var attributes = {
                   id: 'quick-media-codec-button',
                   class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                   removable: 'true',
                   label: 'Quick Media Codec',
                   tooltiptext: Services.prefs.getBoolPref('media.play-stand-alone') ?
                      'Quick Media Codec is playing' : 'Quick Media Codec is stopped',
                   //oncommand: '(' + onCommand.toString() + ')()'
                };
                for (var a in attributes) {
                   button.setAttribute(a, attributes[a]);
                   button.addEventListener('click', onCommand );
                };
                function onCommand() {
                   var isEnabled = !Services.prefs.getBoolPref('media.play-stand-alone');
                   Services.prefs.setBoolPref('media.play-stand-alone', isEnabled);
                   var windows = Services.wm.getEnumerator('navigator:browser');
                   while (windows.hasMoreElements()) {
                      let button = windows.getNext().document.getElementById('quick-media-codec-button');
                      if (isEnabled)
                         button.setAttribute('tooltiptext', 'Quick Media Codec is playing')
                      else
                         button.setAttribute('tooltiptext', 'Quick Media Codec is stopped');
                   };
                };
                return button;
             }
          });
       } catch(e) { };
    
       var css =
          '#quick-media-codec-button[tooltiptext="Quick Media Codec is playing"] {list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QgVCgMdA8c0JwAAAw1JREFUOMttk71LK3kYhZ/JTExGQswXuopfZC1uo+til8JGqxXELfJRWWhpsRYG8SqKippL/gUjbhUTuwXBJojmD/ALtsoqEi0yIZqQhFEmv5kt7kbYZU99nsOB874S/2hra4vt7W329vaClmWtWpY1aVlWEECSpAdJkq4kSfq2vr7+0PYCSABfv35lf3+fzc3NlBBioVKpEAgE8Hg8ANRqNcrlMn6/H1mWj3Z2dhbbjBSPx0kmk6ytrd1Uq9Wf+vv7mZ2dxe/3oygKlmVhGAaVSoWzszOKxSIej+f24OBgPB6Pf28Qj8dT1Wp1IRQKMTMzg9PpRFVVTNMEQAjBx8cH9Xqdi4sL8vk8Xq/3KJlMLkrLy8tBIcRfgUCApaUlOjs7UVWVdDpNNBrFZrNhWRZCCHRdp1arcXx8jKZpyLL8o63Vaq1qmkY4HMbpdNLR0QHA3d0dKysr3N7eIkkSiqKgqioul4u5uTk0TaPVaq3aDMOY7O3txePxYLfbsdlsALy9vVEqldjY2CCRSGCaJrIs43A48Hq99PX1YRjGpM0wjKDP58M0TSzLQpKkz4DX11eazSb5fJ75+Xmur6+x2+3Isozf78cwjKAihMCyLP6ry8tL6vU6qqoyNDSEqqqf4W0JIVBM03zQNO2LEIJ2mCRJeDwe3G43QgimpqZIJBLYbDbe398xTZNSqYRpmg+KaZpXj4+PX6rVKi6Xi46ODhRFobu7G7vdzu7uLqFQ6F9z1mo1CoUCPp/vSh4bG/tTUZTfXl5eGB8fR1EUHA4HxWKRw8NDBgcHP2Fd12k2m6RSKRqNBrIsR+T7+/u30dHRwaenp5/tdjsDAwMIIZienkYIgWmaGIaBrus0Gg3Oz8/J5XKoqnqUTqd/l2OxGCcnJ39MTEz8enNz88Pz8zPDw8OfdXVdR9d1yuUyqVSKXC5HV1fXbSaT+SUWi30/5Wg0SiaTIRKJpIQQC7VajZGREXp6egAolUoUCgXcbjeKohxls9nFNvO5SyQSIZvNEg6Hg8D/vjPw7fT09KHtBfgbw8eNC0eG6lMAAAAASUVORK5CYII=)} ' +
          '#quick-media-codec-button[tooltiptext="Quick Media Codec is stopped"] {list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QgVCgI2tmD8JgAAAutJREFUOMttk71LK2kYxX+TmXxMMHFCIm78WCHX4jayu9hZ+AesIG5hDNhppTY2QVRQlKhcUltG3EoTuwXBJgj6D3hJaa4iKpKE6AwTjXF8593iXlN56nN4DuecR+EX1tfX2djYYGtrKyGlXJJSjkopEwCKolwpinKmKMq31dXVqw8ugAKwsrLC9vY2a2trOSHETL1eJxaLYRgGAJZlUavViEajqKq6t7m5OfuhUdLpNNlsluXl5QvTNP/o6+tjfHycaDSKpmlIKXEch3q9zvHxMbe3txiG8X1nZ+fPdDr900E6nc6ZpjkzMjLC2NgYuq6jaRoejwcAIQStVgvbtjk9PeX8/JxIJLKXzWZnlcXFxYQQ4kcsFmNhYQFd1wkGg3wG27axLIv9/X2q1Sqqqn7R3t/fl2q1GnNzcwQCAYLBIJlMhkajgWmaNJtNpJS0Wi3y+TxCCCYmJshkMnR1dS1pjuOMxuNxDMPA6/UC4Lour6+v2LZNo9Fo5wDg9/uJRCL09PTw8vIyqjmOk+jt7cV1XaSUANzf3/P29sbT0xOWZaGqKkIIAFRVRVVVotEolmUlNCFEW/iBUqnE4+MjDw8PSCmJx+N0dHTwaxNtnhACzXXdq2q1+lUI0b4SCoWQUuLxeJBSEg6H8fv9bZHrulQqFVzXvfK4rnt2fX2NaZq8vr4C4PP5CAQChEIhwuEwuq7j8/kAaLVaWJZFuVzGdd0zZXp6OuE4zo9EIsH8/DyGYRAKhT6tsdFoYNs2u7u7XF5e4vV6v6ilUulpaGjo95ubm7+8Xi/9/f3tQKWUuK6L4zg8Pz/TaDQ4OTmhWCyi6/rewcHBv2oqleLw8PC/4eHhfy4uLn67u7tjYGCgbbfZbNJsNqnVauRyOYrFIp2dnd/z+fzfqVTq55SnpqbI5/Mkk8mcEGLGsiwGBwfp7u4GoFKpUC6XCYfDaJq2VygUZj807U6SySSFQoHJyckE8Ok7A9+Ojo6uPrgA/wO0dY4EG2coXQAAAABJRU5ErkJggg==)} ';
       var stylesheet = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"');
       document.insertBefore(stylesheet, document.documentElement);
    
    })();
    Alles anzeigen
    JavaScript
    // ContextTranslate.uc.js
    
    (function () {
    	if (location != 'chrome://browser/content/browser.xhtml')
    		return;
    	let translate = function () {
    		let browserMM = gBrowser.selectedBrowser.messageManager;
    		browserMM.addMessageListener('getSelection', function listener(message) {
    			let t = (message.data !== '');
    			let e = (document.charset || document.characterSet);
    			if (t) {
    					openWebLinkIn('https://translate.google.com/?sl=auto&tl=de&text=' + encodeURIComponent(message.data), 'tab');
    			} else {
    				openWebLinkIn('https://translate.google.com/translate?u=' + encodeURIComponent(gBrowser.currentURI.spec) + '&hl=de-DE&ie=' + e + '&sl=auto&tl=de-DE', 'tab');
    			};
    			browserMM.removeMessageListener('getSelection', listener, true);
    		});
    		browserMM.loadFrameScript('data:,sendAsyncMessage("getSelection", content.document.getSelection().toString())', true);
    	}
    	let menuitem = document.createXULElement('menuitem');
    	menuitem.id = 'context-googletranslate';
    	menuitem.setAttribute('label', 'gTranslate->de');
    	menuitem.setAttribute('tooltiptext', 'Mit GoogleTranslate übersetzen');
    	//menuitem.setAttribute('oncommand', '(' + translate.toString() + ')()');
    	menuitem.classList.add('menuitem-iconic');
    	menuitem.addEventListener('command', translate );
    	//Wer kein Icon möchte kann die nächsten beiden Zeilen auskommentieren/löschen
    	//menuitem.style.listStyleImage = 'url("https://translate.google.com/favicon.ico")';
    	menuitem.style.listStyleImage = ' url("data:image/png;base64,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")';
    	let refItem = document.getElementById('context-inspect');
    	refItem.parentNode.insertBefore(menuitem, refItem);
    })();
    Alles anzeigen

    Zitat von Zitronella

    okay, ich hoffe jemand findet noch ne Lösung. Derweil schreibe ich hier mal noch welche rein, die nicht mehr funktionieren:

    Dafür auch ein Vorschlag; bei allen diesen Scripts hier bin ich mir nur teils sicher was sie eigentlich machen sollen, also schwer zu testen.

    JavaScript
    (function() {
    
       if (location != 'chrome://browser/content/browser.xhtml')
          return;
    
       try {
          CustomizableUI.createWidget({
             id: 'accessibility-blockautorefresh-button',
             type: 'custom',
             defaultArea: CustomizableUI.AREA_NAVBAR,
             onBuild: function(aDocument) {
                var button = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
                var attributes = {
                   id: 'accessibility-blockautorefresh-button',
                   class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                   removable: 'true',
                   label: 'accessibility.blockautorefresh',
                   tooltiptext: Services.prefs.getBoolPref('accessibility.blockautorefresh') ?
                      'Weiterleitung ist deaktiviert' : 'Weiterleitung ist aktiviert',
                   //oncommand: '(' + onCommand.toString() + ')()'
                };
                for (var a in attributes) {
                   button.setAttribute(a, attributes[a]);
    							 button.addEventListener('click', onCommand );
                };
                function onCommand() {
                   var isEnabled = !Services.prefs.getBoolPref('accessibility.blockautorefresh');
                   Services.prefs.setBoolPref('accessibility.blockautorefresh', isEnabled);
                   var windows = Services.wm.getEnumerator('navigator:browser');
                   while (windows.hasMoreElements()) {
                      let button = windows.getNext().document.getElementById('accessibility-blockautorefresh-button');
                      if (isEnabled)
                         button.setAttribute('tooltiptext', 'Weiterleitung ist deaktiviert')
                      else
                         button.setAttribute('tooltiptext', 'Weiterleitung ist aktiviert');
                   };
                };
                return button;
             }
          });
       } catch(e) { };
    
       var css =
          '#accessibility-blockautorefresh-button[tooltiptext="Weiterleitung ist aktiviert"] {list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACdklEQVR4nJVSW0iUQRj9Zvd3V3d/3VbR8LJJkraCmZobqQViEF0t3DakBzMTKXvqQQgMpB56jC5kN6nMyjJ0wS4YFCUhKBvUGhQmGhopXiqytZ3559ZD/bK6RnVeZuYbzvnmO2cA/oA1+bnGP92FwrBY8dTFo1WbS9fX/osACj2szslCh+rKjuUUOY73+0YffJ76/kRKAZRxPvnp22B/34fuF909ZFGBwg1rlYN1O86vWBVfwwQFJigwySB0/2VydrjXO17VdPZOd9gI2XkrCxwZtgrCMRCO5cI1SH+AMYYuz92t3t+7352r8+aMetnXP2pVEl6lONVt0siiqNCkxogkHEvCMMIcI8wwokDMyMSXBT5GtE5MTEgldJ7G082PAoE9mzbuS/X6n07dfNs7fplxDtboyKg8T8wlSworpFxDpiRaZLfbbQDwdZ4AAMCNpjYfwWXFqs3s7Op6PKzX1SXuGpNNrhMSISkULoQgcyZW15ZnFRRnVnEpQEgGPV3DZ1qut47o5JNXDje8fjZ2re22d3RhQwUAgGCqZrqWHtHdlgrLsCdVXCAEc2REEOtQtpYcSK6MiHSX3rra/iYsxvz8vIj6c553apySxiRDTFDJBEVMUEm5hjSuSY1rKDCDp/0ds57mxvbn81IYGxsXcTHJA6nZ0R4OmqIJDWmcAGYYEYYBsyDCDAM1EIslkW2JDqa1vB8YnJ0Xo6/XP6Qak/ossYYco5Um/I7tV4QMS8yCaGZamxzqVCo77nb6w36iDpfLZUpMiU+32syJEqQBIQSOEnZCIB4/8tBcfq/V61vI+SuqG7bX73LvTP9vog5npjPspTp+Ah8eSZ/sO5KDAAAAAElFTkSuQmCC)} ' +
          '#accessibility-blockautorefresh-button[tooltiptext="Weiterleitung ist deaktiviert"] {list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACd0lEQVR4nJVSW0hUURTd585LTRMdk1F0akJtKiMfjVl9mBGhI1nUGFEQ4oeIPz0++qhA7NeP6CPKogIVplDR3iMUjWSB+BE9IMQHKtHMWD5SvHfuvWef3Y8j6ijV+jnn7MNa+5y1NsA6KMrLNax3txzSWsWWC8dqTu7Nqf8XAbb8ULAzhzW4ndcO27TGviA8D8n0GgQCFwLH5mHo3fhC79v3/eqaAiV7dhkbj9hvFSWptcR1ANQAUIfInlCHQNg0em/SXtPk7emN+oIrO33f7nj5HGkKgCYTaQqQphDoMpCuEuoIVqY66q1jz2o97vwIb8moD19HJig992Phht8VZhGOJV0lwTVCFMQRGBcS40JijMBikcA+SCneUChEKzwAAKirKnddzhzv6pyytb0JGu8iImyMNcfW24LNWcaF/SgYm0XT3KXhlC1+v3/GuFrgTvurAeWE+2CyBZy+npejkbr11NFaq0ErJmJMAKAQsrpk4nnPodyyrIQaEhxAIHR8j7n54FH3eITcXneg4Wko4WFrl29idUMjAECYU3yJVb5IqAFwHSyo5DjOlt7WVAUNkgTbTLPuKxnT1XGessrmDt+XqBhdBXkmb0XitzSTshW4zgg1AtQZISdEYigYoWBsmpt/NU9trrrx2OdfkcKPQFDE2XcMFsfPVBkwbCSuMcERODKmCwkWEwCJKM5hlMt/phW2Dg4NL6yIse/z8Iiekd9vMyh5iaClcpQYR4k4SkxfXAN6zOT9OUe1t/vFp6hJXBool8tsT03KTo6R0ghAYoyBJyF0nRFsapnPPN3W+WRgNeevaDpTetVzvDL7v4kRbHc6o14awR8IFzD9TbnyZAAAAABJRU5ErkJggg==)} ';
       var stylesheet = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"');
       document.insertBefore(stylesheet, document.documentElement);
    
    })();
    Alles anzeigen
  • Selektor für kleinen Pfeil in CSS-Code zum extra-config-menü.uc.js ab v139

    • Horstmann
    • 4. Mai 2025 um 12:18
    Zitat von FuchsFan

    Das sehe ich auch so, aber so funktioniert es nun mal nicht. Einen weiteren Code gibt es nur für das Bereitstellen der Icons, ansonsten keine weiteren Anpassungen. Ich betone nochmals, der Code aus #1 funktioniert bis v138 ohne Probleme, deshalb kann es nur an Änderungen in den folgenden Versionen liegen.

    Nochmal die Frage: an welchem Punkt ist das Problem aufgetreten?
    Gleich nach dem Umstellen von .menu-right auf menu::after, oder #ExtraConfigMenu-popup [id^="submenu-"]:hover::after etc.

    Und ist das Problem das Hovern über dem Sub Popup, nachdem man die Maus aus dem ersten (Haupt) Popup herausbewegt schliesst sich der Sub ohne dort etwas anzuklicken?

    Und: der aktuelle, komplette CSS Code?;)

  • Selektor für kleinen Pfeil in CSS-Code zum extra-config-menü.uc.js ab v139

    • Horstmann
    • 3. Mai 2025 um 23:28
    Zitat von FuchsFan
    Zitat von Horstmann

    Wenn du Laune hast, probier mal das hier, würd mich interessieren ob's a) geht und b) die Pause entfernt:

    Beide Codes funktionieren, Verzögerung ganz gering noch, ich sage dazu normal.:)

    Edit:

    Aber die Popups schließen sofort bei Berührung.:rolleyes:

    Das kann aber eigentlich nichts mit diesem CSS zu tun haben, ist ja nur zum stylen der Pfeile. :/

    Falls sich das trotzdem dadurch geändert hat, müsste man mal deinen kompletten CSS Code sehen; falls es generell vorher schon ein Problem war, wirds schwieriger.

    An welchem Punkt, bzw. mit welchem CSS Code, hat sich das Problem (schliesst bei hover? eingestellt, falls es ein CSS Code war?

  • Selektor für kleinen Pfeil in CSS-Code zum extra-config-menü.uc.js ab v139

    • Horstmann
    • 3. Mai 2025 um 22:26
    Zitat von FuchsFan
    Zitat von Horstmann

    eine kurze Verzögerung zwischen hover Status (keine Funktion) und dem Moment in dem ein Popup dann aufgeht

    Ja, ist mir sofort aufgefallen, aber ist ja nur ein Päuschen.

    Wenn du Laune hast, probier mal das hier, würd mich interessieren ob's a) geht und b) die Pause entfernt:

    CSS
    #ExtraConfigMenu-popup [id^="submenu-"]:is(:hover,[open])::after { Code hier }

    Ansonsten sollten auch beide Funktionen klappen (keine Verzögerung) mit dem hier:

    CSS
    #ExtraConfigMenu-popup [id^="submenu-"]:hover::after,
    #ExtraConfigMenu-popup [id^="submenu-"][open]::after { Code hier }

    Bei dem Script ist es scheint's nicht nötig, aber vermutlich nur weil hier jedes [id^="submenu-"] Element versucht ein Submenu/Popup zu öffnen, auch wenn keines da ist.

Unterstütze uns!

Jährlich (2025)

92,9 %

92,9% (604,17 von 650 EUR)

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