Beiträge von Horstmann
-
-
So sieht das hier aus, wenn das Icon nicht vorhanden ist, bzw. nicht gefunden wurde:
Nur der Hintergrund ändert sich dann hier bei hover
Ohne jetzt tief zu recherchieren, meiner Erinnerung nach benutzt Fx teilweise color als Button Hintergrundfarbe bei hover, bzw. daraus abgeleitet einen Mix mit currentColor, da muss man etwas aufpassen.
Möglicherweise haben Mira und Fuchsfan woanders weiteren CSS Code, der das anders festlegt.
Könnte evtl. mehr Sinn machen statt wie in #27 .style.color = 'red'; => .style.fill = 'red'; zu benutzen; wobei JS Styles gerne mal von so ziemlich allem anderen CSS überschrieben werden.
Oder mal in der userChrome.css #profilefolder-ToolBarButton {fill: red !important;} probieren, oder sowas in der Art.
Edit: bei mir im Testprofil färbt .style.color = 'red' sowohl das Icon als auch den hover Hintergrund.
.style.fill = 'red' funktioniert wie erwartet nur für das Icon. -
Davon abgesehen, was spricht dagegen den Fallback Code nach unten zu setzen?
Wenn der Code für den Fallback aus der Funktion onBuild: function(aDocument) { genommen wird,
funktioniert das Skript gar nicht mehr und dem Button, den es ja dennoch gibt, fehlt die Grafik!Also der komplette Code von hier funktioniert bei dir nicht (in Zeile 39 bzw 40 halt dein eigenes Icon)?
Der Fallback Code muss generell angepasst werden beim runterkopieren, s. Zeilen 47 und 52, oder halt wie beschrieben in #14.
In deinem Code von #7 gibt es da auch eine Klammer in Zeile 24, die mir Rätsel aufgibt; aber nach meinem Schema hatte ich deinen Code auch zum Laufen gebracht, nur halt immer schön die Klammern und Satzzeichen beachten. -
Danke
Wohl möglich, ein Mac-spezifisches Problem?
Dann kümmere ich mich jetzt erst einmal um die anderen Skripte.Was mir aber nicht klar ist, welche Script Version hat denn wer jetzt wie getestet?
Bei mir etwa funktioniert dein Script aus #7 nicht mit Szenario aus #18.
Kann aber tatsächlich ein Mac Problem sein, ich glaub's aber nicht.Davon abgesehen, was spricht dagegen den Fallback Code nach unten zu setzen?
-
Horstmann Habe so eben noch einmal den Elchtest mit ButtonProfilordner.uc.js gemacht!
Habe die Ausfallroutine aktiviert, neues Fenster geöffnet, und auch da ist das Symbol (die Grafik) sichtbar!
Auch ist die Funktion gegeben.Also: Erstes Fenster ist Fenster A, dann neues Fenster B öffnen.
Dann Fenster A schliessen, dann zusätzlich zu Fenster B noch ein Fenster C öffnen --> Fenster C hat Buttonfunktion, weil die Funktion nach unten bewegt wurde; Icons hat Fenster C keine, weil diese beiden Funktionen (Icon und Fallback) nicht bewegt wurden.
Ist evtl. Problem #3 wegen dem extra nötigen Schritt in Windows, aber das gleiche Prinzip. -
Das erhoffte Ergebnis:
Mist, die CSS Datei wird doppelt geladen; wenn man in den Browser Werkzeugen unter Stilbearbeitung schaut, findet man profilesbutton_external.css doppelt gelistet; physisch existiert die Datei nur einmal....
-
Besser sie sind fertig nutzbar.
Habe mal nur einfach Links gesetzt!
Wenn ich nicht weiter komme, kann ich ja das betreffende Skript
mit einer Anfrage in einem neuen Thread posten.# ----------------------------------------------------------------------------------------------------------- #
.....
Soll ja kein Sammelthread werden.
Für viele Scripts gibt's ja auch schon eigene Threads.
Alternative Lösungen, bzw. welche für anders aufgebaute Codes, mit Beispielen oder Links zu Lösungen wären natürlich prima.Es gibt ja auch noch verwandte Problematiken wie hier oder hier.
-
...wie müsste der Ablauf z.B. für about:about, oder auch Konsole aussehen, bekomme es nicht gebacken.
Ja, das schon, aber ich war immer der Meinung, dass meine Scripte funktionieren, leider nicht.
Deine Scripts funktionieren schon, nur halt mit einem mE kleinen Fehler, den viele User oft gar nicht wahrnehmen.
Weil ich am Mac bin und 2 Monitore habe, kommt der Fehler bei mir häufig vor.Bzgl. about:about, das könnste mal probieren:
JavaScript
Alles anzeigen// aboutabout-button.uc.js V3 Mai 2025 // Fallback Icon Fix von Mira_Belle // Eigenes Icon erwartet in Profilordner/chrome/icons , icons Ordner falls noetig erstellen (function() { if (location != 'chrome://browser/content/browser.xhtml') return; try { CustomizableUI.createWidget({ id: 'aboutabout_Button', type: 'custom', defaultArea: CustomizableUI.AREA_NAVBAR, onBuild: function(aDocument) { var toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton'); var props = { id: 'aboutabout_Button', class: 'toolbarbutton-1 chromeclass-toolbar-additional', label: 'About:About', tooltiptext: 'About:About', }; for (var p in props) toolbaritem.setAttribute(p, props[p]); return toolbaritem; } }); } catch(e) { } document.getElementById('aboutabout_Button').addEventListener('click', event => { if (event.button === 0) { openTrustedLinkIn("about:about", "tab"); } }); // Fallback Icon // Pfad zum Profilordner let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/"); // Pfad in den entsprechenden Unterordner let IconPath = '/chrome/icons/'; // Name & Dateiendung des anzuzeigenden Symbols! let ButtonIcon = "Letters_A-1.png"; // 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 aboutabout_Button.style.listStyleImage = 'url("' + ("file:" + ProfilePath + IconPath + ButtonIcon) + '")'; }; img.onerror = function() { // Wenn die Grafik nicht geladen werden kann, verwende das Fallback-Icon aboutabout_Button.style.listStyleImage = 'url("chrome://browser/skin/fxa/avatar-empty.svg")'; }; })();
Der Ablauf ist für diese Art von Scriptaufbau einfach:
Wenn du dir das Beispielscript in #1 anschaust, du nimmst den hier oft gesehenen Fix #1 kompletten Codeblock, inkl. aller Satzzeichen, und setzt ihn unter } catch(e) { }.
Dann ersetzt du in diesem Fall toolbaritem mit document.getElementById('aboutabout_Button'), weil du den Button an der Stelle neu aufrufen musst.
aboutabout_Button ist einfach die weiter oben festgelegt ID des Buttons.
An der Stelle der Tip, für ID, class etc. keine Bindestriche zu benutzen, also aboutabout_Button statt aboutabout-Button, weil man dann diese ID je nach Zusammenhang direkt und ohne document.getElementById benutzen kann (s. Fallback Code).Noch ein Nachtrag: die Lösungen, wenn sie denn auch für alle funktionieren, basieren auf vielen Diskussionen und Codevarianten aus diesem Forum; allen voran viele Beiträge von BrokenHeart zu diesem Thema.
-
Moment mal.
Ich in #2, und Mira_Belle in #10 benutzen ->
var toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
2002Andreas in #9 benutzt aber var toolbaritem = aDocument.createXULElement('toolbarbutton');
Wie vermutlich viele von uns, kopiere ich solche Sachen idR aus alten Scripts in neue, ohne gross nachzudenken, solange es funktioniert.Gedanken dazu?
Könnte das mit Fremdtoolbarleisten ein Problem erzeugen, oder generell?Hier #2 und #9 nochmal zum Vergleich; Zeile 39 bzw. 15:
JavaScript
Alles anzeigen/* aboutabout_ToolbarButton.uc.js */ // aboutabout-button.uc.js (function() { var css =` #aboutabout-ToolBarButton > image { display: none !important; } #aboutabout-ToolBarButton > label { display: flex !important; background-color: lightgreen !important; color: red !important; outline: 1px solid red !important; outline-offset: -1px !important; } #aboutabout-ToolBarButton:hover > label { background-color: green !important; color: cyan !important; outline: 1px solid purple !important; outline-offset: -1px !important; } `; var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService); var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(css)); sss.loadAndRegisterSheet(uri, sss.AUTHOR_SHEET); if (location != 'chrome://browser/content/browser.xhtml') return; try { CustomizableUI.createWidget({ id: 'aboutabout-ToolBarButton', type: 'custom', defaultArea: CustomizableUI.AREA_NAVBAR, onBuild: function(aDocument) { var toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton'); var props = { id: 'aboutabout-ToolBarButton', class: 'toolbarbutton-1 chromeclass-toolbar-additional', label: 'About:About', tooltiptext: 'About:About', /* style: 'list-style-image: ', */ //onclick: 'if (event.button == 0) { \ // openTrustedLinkIn("about:about", "tab");\ // }; ' }; for (var p in props) toolbaritem.setAttribute(p, props[p]); return toolbaritem; } }); } catch(e) { }; document.getElementById('aboutabout-ToolBarButton').addEventListener('click', event => { if (event.button === 0) { openTrustedLinkIn("about:about", "tab"); } }); })();
JavaScript
Alles anzeigen(function() { if (!window.gBrowser){ return; } try { CustomizableUI.createWidget({ id: 'about-button', type: 'custom', defaultArea: CustomizableUI.AREA_NAVBAR, onBuild: function(aDocument) { var currentProfileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/"); var buttonicon = "A.png"; var toolbaritem = aDocument.createXULElement('toolbarbutton'); var props = { id: 'about-button', class: 'toolbarbutton-1 chromeclass-toolbar-additional', removable: 'true', label: 'about:about', accesskey: '', tooltiptext: 'about:about', style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");' }; for (var p in props) toolbaritem.setAttribute(p, props[p]); return toolbaritem; } }); CustomizableUI.registerToolbarNode(tb); } catch(e) { }; document.getElementById('about-button').addEventListener('click', event => { if (event.button === 0) { openTrustedLinkIn('about:about',"tab"); } }); })();
-
Sobald ich die Versionen in die Statusleiste aus Beitrag #25 verlege habe ich zwar Buttons, aber keine Funktion.
Ich habe dabei das Problem, dass diese Statusleiste bei mir nicht funktioniert, aber uU wegen meinem alten Firefox...
-
Es ist eine überarbeitete Version, die sowohl den Fix von Horstmann enthält als auch den Fallbackfix!Ahem, nur leidet der Fallback Fix unter Problem #1
- der Code dafür müste auch nach unten, etwa so:
JavaScript
Alles anzeigen// ButtonProfilordner.uc.js // Öffnen des "Profilordners" (function() { if (location != "chrome://browser/content/browser.xhtml") return; try { CustomizableUI.createWidget({ id: 'profilefolder-ToolBarButton', type: 'custom', onBuild: function(aDocument) { let toolbaritem = aDocument.createXULElement('toolbarbutton'); let props = { id: 'profilefolder-ToolBarButton', class: 'toolbarbutton-1 chromeclass-toolbar-additional', label: 'Profil-Ordner', tooltiptext: 'Profil-Ordner öffnen', }; for (var p in props) { toolbaritem.setAttribute(p, props[p]); } return toolbaritem; } }); } catch(e){} document.getElementById('profilefolder-ToolBarButton').addEventListener('click', event => { if (event.button === 0) { Services.dirsvc.get("ProfD", Ci.nsIFile).launch(); } }); // Pfad zum Profilordner let ProfilePath = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/"); // Pfad in den entsprechenden Unterordner let IconPath = '/chrome/icons/'; // Name & Dateiendung des anzuzeigenden Symbols! //let ButtonIcon = "prof.png"; let ButtonIcon = "LettersP-1m.png"; // 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 document.getElementById('profilefolder-ToolBarButton').style.listStyleImage = 'url("' + ("file:" + ProfilePath + IconPath + ButtonIcon) + '")'; }; img.onerror = function() { // Wenn die Grafik nicht geladen werden kann, verwende das Fallback-Icon document.getElementById('profilefolder-ToolBarButton').style.listStyleImage = 'url("chrome://browser/skin/fxa/avatar-empty.svg")'; }; })();
-
Für die Dateipfade zu den Icons besser so etwas nutzen!
Es ist da auch schon ein Fallback "eingebaut" falls irgendetwas klemmt.Danke!
Ich Schlaumeier hab mein einziges Script mit diesem Dateipfad - der bei mir am Mac nichtmal geht - als Beispiel benutzt, und dann auch noch FuchsFan deswegen angemeckert... -
Nicht bei mir
Stimmt, das habe ich nicht in der richtigen Reihenfolge gemacht.
Dann habe ich dieses noch, ist im Aufbau fast deinem ähnlich. Kannst ja mal probieren.
Dankeschön, aber gleiches Spiel; sowohl Problem #1 als auch #2.
Und noch eine Kleinigkeit: die Dateipfade für die Icons url("file:///C:/... funktionieren vermutlich auf Windows, aber nicht hier am Mac, also nicht perfekt für Kompatibilität. -
Nicht bei mir, Problem #1, wie beschrieben.
Erstes Fenster A schliessen, dann in Fenster B probieren.ist damit gleichzeitig auch dieses Problem gelöst?
An Deinem Smily sehe ich, dass Du die Antwort schon kennst. Das war aber auch nicht das Thema in dieser Kommunikation.
Nein, an dem Grübel Smiley siehst du dass ich die Antwort nicht kannte, daher die Frage.
Ich weiss immer noch nicht was das Script machen soll, also auch nicht wie ich es selber testen könnte.Das Thema ist aber sehr wohl die allgemeine, nicht eingeschränkte Nutzbarkeit, egal mit welcher Lösung, worauf sich dein Beitrag bezog - inklusive zitiertem Text zu eben der von mir nachgefragten Problematik.
Du hast selber beides verbunden.Aber Semantik und Empfindlichkeiten beiseite, die Fragestellung hört sich interessant an, aber was ist sie eigentlich?
Ist es sowas: der Button soll für alle geöffneten Fenstern das gleiche bewirken, egal in welchem Fenster er aktiviert wird, und idealerweise dann auch noch bei: Problem #1, wie beschrieben. Erstes Fenster A schliessen, dann in Fenster B probieren.?Falls ja, ich habe Buttons die genauso funktionieren, und die benutzen das gleiche Prinzip wie das von Speravir in #4443, aber mit anderen und einfacheren Funktionen.
-
Dadurch, dass man mit Hilfe des Skriptes eine Einstellung im Firefox ändert, die im gesamten Profil gültig ist, lässt sich letzteres meines Wissens nach nicht verhindern.
Kleine Anmerkung:
Das Script aus RE: userChrome.js Scripte für den Fuchs (Diskussion) funktioniert wie erwartet (Änderung der Animation sowie des Icons ausschließlich im aktiven Fenster).Nur aus Neugierde, ist damit gleichzeitig auch dieses Problem gelöst?
-
funktionstüchtig in allen Fenstern
Nicht bei mir, Problem #1, wie beschrieben.
Erstes Fenster A schliessen, dann in Fenster B probieren. -
Es gibt hier eine Menge Scripts für Buttons, die nach einem ähnlichen Schema aufgebaut sind, siehe Beispiel unten.
Wiederkehrende Probleme mit vielen davon sind Folgendes:
#1:
- Firefox öffnen, das Programm öffnet mit einem Browser Fenster (Fenster A).
- Script Button funktioniert; jetzt neues Fenster B öffnen, dann das Fenster A - das erste beim Start geöffnete Fenster - schliessen.
- Script Button funktioniert nicht mehr in Fenster B oder anderen Fenstern, sobald Fenster A geschlossen wurde.#2:
- Firefox öffnen, das Programm öffnet mit einem Browser Fenster (Fenster A).
- Script Button funktioniert; jetzt neues Fenster B öffnen, dann den Button in Fenster B klicken.
- Button führt das Script aus - aber in Fenster A, nicht im aktiven Fenster B.Dazu eine kleine Linksammlung, mehr oder weniger relevant:
Die problematischen Scripts benutzen Fix #1, vorgeschlagene Lösung (Fix #2), hier als Code Beispiel:
JavaScript
Alles anzeigen// aboutconfig-button.uc.js Test #3 (function() { if (location != 'chrome://browser/content/browser.xhtml') return; try { CustomizableUI.createWidget({ id: 'aboutconfig_button', type: 'custom', defaultArea: CustomizableUI.AREA_NAVBAR, onBuild: function(aDocument) { let currentProfileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile).path.replace(/\\/g, "/"); let buttonicon = "LettersC-1.png" let toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton'); var props = { id: 'aboutconfig_button', class: 'toolbarbutton-1 chromeclass-toolbar-additional', label: 'About:Config', tooltiptext: 'About:Config', style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");' // alte Version obsolet //onclick: 'if (event.button == 0) { \ // openTrustedLinkIn("about:config", "tab");\ // }; ' // alte Version Ende }; for (var p in props) toolbaritem.setAttribute(p, props[p]); // Fix #1 // toolbaritem.addEventListener('click', event => { // if (event.button == 0) { // openTrustedLinkIn("about:config", "tab"); //} //}); // Fix #1 Ende return toolbaritem; } }); } catch(e) { }; // Fix #2 document.getElementById('aboutconfig_button').addEventListener('click', event => { if (event.button === 0) { openTrustedLinkIn("about:config", "tab"); } }); // Fix #2 Ende })();
Warum?
ZitatEs 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.
Warum nicht?
Die Lösung kommt von einem Amateur (mir), und könnte unvorhergesehene, aber von mir noch nicht beobachtete Probleme verursachen.
Warum nicht nicht?
99,99% aller User, oder nur du selber, benutzen nie mehr als ein Browserfenster. Kein Argument für Code der publik gemacht wird.
Ausserdem kommt Fix #1 aus der selben Quelle. -
Wie schon gesagt, das Skript funktioniert, allerdings gefallen mir die Zeilenabstände nicht und dafür ist wohl Zeile 60-63 (inklusive der davor geöffneten { in Zeile 59) verantwortlich. Wenn ich den Teil lösche ist es so wie ich es haben möchte. Allerdings würde ich es statt löschen lieber auskommentieren, nur bin ich leider zu doof dazu das richtig hin zu bekommen. Kann mir das jemand sagen wie ich das korrekt mache?
So geht das; um den Code den du kommentieren willst /* und */ setzen.
-
Hmm, ich hab da mal weiter gegoogelt, und bin darauf gestossen.
Und das ganze habe ich mal - eher unelegant - in ein einfaches Script gewürgt.
Das erhoffte Ergebnis: die .zip Datei runterladen, das enthaltene Script und Ordner in den chrome Ordner packen, Restart mit Cache löschen, wie immer bei Script Installationen, und fertig.
Enthalten sind JS Script, CSS und Icon, keine Anpassungen nötig.
Benutztes Script:
JavaScript
Alles anzeigen//profile-button tester icons separates CSS (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 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', }; 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"); } }); // Create references to APIs we'll use let ss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); let io = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); let ds = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties); // Get the chrome directory in the current profile let chromepath = ds.get("UChrm", Ci.nsIFile); // Specific file: Subfolder / userChrome.css or userContent.css chromepath.append("profilesbutton_style"); chromepath.append("profilesbutton_external.css"); // Morph to a file URI let chromefile = io.newFileURI(chromepath); // Load the sheet ss.loadAndRegisterSheet(chromefile, ss.USER_SHEET); })();
Benutztes CSS:
Alles zusammen als Paket:
-
Und die CSS-Dateien werden dann via JavaScript geladen, ohne das Laden der gesamten Website zu verzögern. Das kombiniert alle Vorteile. So hat man weiter alle Vorteile externer CSS-Dateien, blockiert aber nicht den Rendering-Vorgang und muss gleichzeitig für das, was man sofort sieht, nicht auf das Laden der CSS-Dateien warten.
Hättest du dafür einen Tip, oder simple Lösung?
Ich hab schon gesucht, aber stosse da an meine Grenzen...Sagen wir mal wir haben DasScript.us.js , was im Profil/chrome Ordner liegt, und eine extra CSS Datei DasScript.css, im gleichen Ordner.
Wüsstest du eine schlanke Lösung, idealerweise mit relativem Dateipfad, um die CSS Datei via das Script zu laden?Ich dachte schon öfter an ein Paket mit JS Script, CSS Datei und Icon, das der User nur in den chrome Ordner kopieren muss, und es läuft sofort.
Man kann auch einfach über die userChrome.css das CSS importieren, aber dann müssen die User halt wieder anfangen im Code rumzuschreiben.