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

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

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

    • Horstmann
    • 3. Mai 2025 um 21:45
    Zitat von .DeJaVu

    Die 115 ESR ist eh dabei aussen vor, weil schlichtweg zu alt - falls noch genutzt.

    Ist noch genutzt, zwangsweise, hab aber eine Testmaschine mit aktuellem Fx für komplexe Fälle.
    Mit der Code Lingo halte ich mich aber auf dem Laufenden, keine Sorge. ;)

    Was ich meinte war :open als Pseudoklasse wie :hover und :active, meiner Erinnerung nach hat das noch nie gegriffen, kann mich aber täuschen.


    Zitat von milupo

    Weil es open als Pseudoklasse nun mal in CSS nicht gibt. Und wenn Mozilla sie erfände, müsste sie dann :-moz-open heißen, da sie dann proprietär wäre.

    Hmm... ;)
    Ok, erst seit 136 in FX, also - jetzt!

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

    • Horstmann
    • 3. Mai 2025 um 21:37
    Zitat von FuchsFan

    jetzt funktioniert es wie gewünscht, und zwar mit diesem String.

    #ExtraConfigMenu-popup :is([id^="submenu-"][open])::after {    

    Prima! :)

    Die hover Funktion hast du nur damit (und der Version von Sören) nicht mehr, aber das zeigt sich in diesem Fall/Script wohl nur durch eine kurze Verzögerung zwischen hover Status (keine Funktion) und dem Moment in dem ein Popup dann aufgeht (open Funktion).

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

    • Horstmann
    • 3. Mai 2025 um 21:30
    Zitat von .DeJaVu

    Ersteres ist ein Selektor, dann folgt noch ein (Unter-)Selektor., usw. Das Element, was genau alle Selektoren erfüllt, wird angesprochen.

    Denke du hast recht damit, mit den Attribut Selektoren tue ich ich mich manchmal schwer.
    Leider frisst Firefox :open anscheinend nicht als Pseudoklasse, dann wär's etwas einfacher.:/

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

    • Horstmann
    • 3. Mai 2025 um 19:41
    Zitat von Sören Hentzschel

    Das hat immer noch das überflüssige :is() mit drin. Kürzer:

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

    Ich glaube der Code ist so oder so etwas Murks, auch wenn er oberflächlich funktioniert.
    Wird [id^="submenu-"] überhaupt wahrgenommen in dem Zusammenhang, oder nur [open] (= Verkettung von Attributen, geht das überhaupt)?

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • Horstmann
    • 3. Mai 2025 um 17:32
    Zitat

    Wer Rechtschreib-, oder Grammatikfehler findet, darf sie gern behalten

    Ich bin reich! ;)

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

    • Horstmann
    • 3. Mai 2025 um 14:32
    Zitat von .DeJaVu

    Da ist jetzt noch nix mit hofer und after drin.

    Aber ich selbst würde :hover und ::after nicht zusammelegen wollen, weil mWn ::after nur für das :hover gilt, aber nicht ohne :hover. Also braucht es schon wieder zwei Definition.

    ::after
    :hover::after

    Man braucht aber eh eine Definition für sowohl mit als auch ohne :hover, da sparst du nix. :/
    Den Code zu straffen, nesten und zu minimieren ist was anderes, aber die beiden Zustände musst du so oder so getrennt angeben.

    In diesem Fall macht mE der Attribut Selektor von Sören eine Menge Sinn, schlank und einfach.

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

    • Horstmann
    • 3. Mai 2025 um 12:38
    Zitat von FuchsFan

    Bei Hover wird zwar das Icon angezeigt, das Submenü öffnet sich, aber sofern mit der Maus das Popup berührt wird verschwindet es .

    Ich bin so schwach...;)

    Ein [open] könnte man noch irgendwo mit reinquetschen; aber weil ich nicht meine Nightly Testmaschine anwerfen möchte, hier nur grob geraten, weiss nicht ob das mit ::after klappt:

    CSS
    #ExtraConfigMenu-popup [id^="submenu-"]:hover::after,
    #ExtraConfigMenu-popup :is([id^="submenu-"][open])::after {	}
  • userChrome.js Scripte für den Fuchs (Diskussion)

    • Horstmann
    • 2. Mai 2025 um 22:10
    Zitat von milupo
    Zitat von Horstmann

    Deine Version(en) funktionieren bei mir nur das für bzw. in dem bei Programmstart geöffneten Fenster, also das erste "Original" Fenster.

    Ich bin froh, dass ich Skripte halbwegs anpassen kann. Und mein Eindruck ist, dass doch sehr wenige die Skripte über mehrere Fenster hinweg verwenden. Zur Zeit sind es zwei, drei Nutzer.

    Mehr kann ich auch nicht, und bin genauso froh darum.;)
    Es ist nur ein minimaler Unterschied zwischen den beiden Varianten, und gleich einfach umzusetzen, also warum nicht die bessere Variante benutzen?

    Bei mir am Mac ist es sehr auffällig, weil hier Firefox nicht beendet wird beim Schliessen aller Fenster, also habe ich oft eine aktive, aber fensterlose Fx App im Dock; ich vermute sehr viele User stolpern eventuell mal über das Problem, ohne es zu melden oder nachvollziehen zu können.

    Nicht zu vergessen dass mehrere Fenster sehr wohl benutzt werden, gerade auch in einem Setup mit mehr als einem Monitor; in dem Fall kann es ganz schnell Ärger geben mit einem Script das nicht alle Fenster - wie im Einzelfall gewünscht - bedienen kann.

    Letztlich ist es aber auch einfach ein Fehler im Script, ich glaube dieser krummnasige Spacken fing damit an, und wurde dann korrigiert von diesem gutaussehenden Genie. 8)

    Edit:
    Zum Vergleich, hier nochmal ein Beispiel am aktuellen Script; die Fix #1 und Fix #2 Codeblöcke sind kinderleicht gegeneinander auszutauschen.
    Wie gesagt, das Ganze gilt nur für diese Art von Aufbau bzw. Buttonimplentierung.

    JavaScript
    (function() {
      if (location != 'chrome://browser/content/browser.xhtml') return;
        try {
                CustomizableUI.createWidget({
                id: 'Profilordner',
                type: 'custom',
                defaultArea: CustomizableUI.AREAS,
                onBuild: function(aDocument) {
                   var toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
                   var props = {
                        id: 'Profilordner',
                        class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                        removable: true,
                    // Name im AnpassungFenster
                        label: 'zum Aktuellen Profilordner',
                    // Name bei MausHover wenn in Symbolleiste
                       tooltiptext: 'zum Aktuellen Profilordner',
                         style: 'list-style-image: url(file:///C:/Users/DBI/AppData/Roaming/Mozilla/Firefox/Profiles/zvjpsewu.DBI/chrome/icon/userProfil.ico)',
    
                      //  Alte inline Version, obsolet
                      //  oncommand: "Services.dirsvc.get('ProfD', Ci.nsIFile).launch();"
                   };
                   for (var p in props)
                      toolbaritem.setAttribute(p, props[p]);
    
                      // Fix #1 nur für original Fenster
                      //toolbaritem.addEventListener('click', event => {
    					        //     if (event.button == 0) {
                      //          Services.dirsvc.get("ProfD", Ci.nsIFile).launch();
                      //               }
    			      //  	});
    			      // Fix #1 Ende
    
                   return toolbaritem;
                    }
                 });
              } catch(e) { };
    
               // Fix #2
               document.getElementById('Profilordner').addEventListener('click', event => {
                      if (event.button === 0) {
                          Services.dirsvc.get("ProfD", Ci.nsIFile).launch();
                   }
               });
               // Fix #2 Ende
    
    })();
    Alles anzeigen
  • userChrome.js Scripte für den Fuchs (Diskussion)

    • Horstmann
    • 2. Mai 2025 um 20:59
    Zitat von milupo

    Erst einmal zum Profilordner-Skript. Probiere mal diese Version:

    Ich wollte nur nochmal darauf hinweisen.
    Deine Version(en) funktionieren bei mir nur das für bzw. in dem bei Programmstart geöffneten Fenster, also das erste "Original" Fenster.

    ZB: Firefox starten, zweites Fenster öffnen, erstes "Original" Fenster schliessen -> kein Script mit dieser Methode (Fix 1 in den Scripts im Link) funktioniert dann mehr, zumindest hier, obwohl der Button erzeugt wird.

    Das gilt nur für Scripts mit diesem Aufbau.

  • Und noch ein kleines Script, was nicht mehr geht

    • Horstmann
    • 2. Mai 2025 um 18:57
    Zitat von mkpcxxl

    geht es jetzt

    Prima! :)

Unterstütze uns!

Jährlich (2025)

108,6 %

108,6% (705,72 von 650 EUR)

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