FF 57 und Anpassungen per Javascript

  • Hallo, ich bin der Neue... :D

    Bisher konnte ich mich ja dank Classic Theme Restorer, Tab Mix Plus, etc. immer davor drücken, bei der Anpassung des FF selbst Hand anzulegen. Ab Version 57 ist das alles Geschichte, aber Dank der userChrome.css habe ich mir jetzt bereits eine Basis für meine Anpassungen schaffen können. Das schaut soweit so aus:


    [attachment=0]FF-57.jpg[/attachment]


    (Falls Interesse besteht, kann ich auch gerne das CSS posten.)

    Aber viele Anpassungen lassen sich wohl nur über Javascript bewerkstelligen. Ich dachte natürlich zunächst an userChromeJS, aber das AddOn läuft nicht mit Version 57.
    Hier im Forum bin ich dann auf diesen post von aborix gestossen.
    Also habe ich das mal so versucht. Den Code kopiert und entsprechende Dateien angelegt.
    config.js und userChromeJS.js in den Programmordner, config-prefs.js in den Unterordner \defaults\pref, userChrome.js und das Testscript in \chrome des Profilordners. Also dorthin, wo sich auch die userChrome.css befindet.

    Es funktioniert aber leider nicht bei mir. Ich habe dann alles nochmal überprüft. Alles soweit okay.
    Am Testscript liegt es auch nicht. Das kurze Code-Snippet habe ich in der Browser-Konsole eingegeben und da hat es seinen Zweck erfüllt.

    Code
    if (location == 'chrome://browser/content/browser.xul') {
    	if (typeof gURLBar.handleCommand !== 'undefined') {
    		let str = gURLBar.handleCommand.toString();
    		str = str.replace('&& !isTabEmpty', '|| isTabEmpty');
    		str = str.replace('where = altEnter', 'where = !altEnter');
    		(new Function('gURLBar.handleCommand = ' + str)());
    	}
    }

    Gibt es da eventuell Aktualisierungen, was die Lösung aus dem genannten post betrifft?
    Muss ich eventuell noch irgendetwas in about:config oder sonstwo einstellen?
    Es wäre nett, wenn mir da jemand auf die Sprünge helfen könnte.

    Vielen Dank schonmal... :)

    Windows 10 | FF 62.0 (64-Bit) / FF 61.0 (64-Bit) / FF 63.0 (64-Bit)

  • Ja, genauso das steht in der userChrome.js.
    Und mein Testscript habe ich test.uc.js benannt.
    Eigentlich habe ich auch alle Dateien bereits nochmals überprüft, weil es kann ja immer mal ein Copy & Paste-Fehler passieren. Mir ist soweit nichts aufgefallen.
    Ich werde mir aber jetzt mal die Dateien aus Endor's Link herunterladen, dann nochmal testen und berichten.
    Vielen Dank für den Link!... :)

    Daran, das ich Firefox 56 und 57 parallel laufen lasse, kann es ja nicht liegen, oder?
    Sind ja verschiedene Profile.

    Windows 10 | FF 62.0 (64-Bit) / FF 61.0 (64-Bit) / FF 63.0 (64-Bit)

  • Hm. Nö, da tut sich nichts. Alles beim alten, es funktioniert nicht. :?
    Habe ich aber fast schon befürchtet, denn alleine die Datei-Grössen waren identisch mit denen, die ich angelegt habe. Mal abgesehen von einer, weil ich da einen comment drin hatte.

    Bei mir ist Sync aktiv und ich weiss, das ich das ein oder andere an der about:config geschraubt habe.
    Könnte es sein, das ich da irgendeine Einstellung übernommen habe, die jetzt im 57 blockiert?

    Windows 10 | FF 62.0 (64-Bit) / FF 61.0 (64-Bit) / FF 63.0 (64-Bit)

  • In den schon oben genannten - und auch auf der von dir verlinkten Seite - beschriebenen Ordnern.
    config.js und userChromeJS.js direkt im FF-Programmordner. config-prefs.js dort im Unterordner \defaults\pref.
    userChrome.js und mein Testscript in \chrome des Profilordners.

    Habe gerade nochmal ein neues Profil angelegt, aber leider mit dem gleichen Ergebnis... :-??

    Windows 10 | FF 62.0 (64-Bit) / FF 61.0 (64-Bit) / FF 63.0 (64-Bit)

  • Das ist schon mal sehr gut.
    Dein Test Script muss aber anders sein so kann es nicht gehen:
    Teste mal:

    Code
    (function() {
    if (location == 'chrome://browser/content/browser.xul') {
    	if (typeof gURLBar.handleCommand !== 'undefined') {
    		let str = gURLBar.handleCommand.toString();
    		str = str.replace('&& !isTabEmpty', '|| isTabEmpty');
    		str = str.replace('where = altEnter', 'where = !altEnter');
    		(new Function('gURLBar.handleCommand = ' + str)());
    	}
    }
    })();

    Mfg.
    Endor

    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/124.0.2
    OS: Windows 10 pro 64 bit und Windows 10 Home 64 bit
    Meine Scripte Sammlung: https://github.com/Endor8/userChrome.js
    Kein Support per PN. Fragen bitte im Forum stellen!

  • Nee, passt schon... :)
    Ich habe die function() nur hier aussen vorgelassen.
    Im Script steht die natürlich drin.

    Windows 10 | FF 62.0 (64-Bit) / FF 61.0 (64-Bit) / FF 63.0 (64-Bit)

  • Okay, ich habe den "Fehler" inzwischen gefunden.
    Im Unterordner \defaults\pref befanden sich bereits zwei Dateien.
    Eine channel-prefs.js mit folgendem Inhalt:

    Code
    Eine /* This Source Code Form is subject to the terms of the Mozilla Public
     * License, v. 2.0. If a copy of the MPL was not distributed with this
     * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
    
    
    pref("app.update.channel", "aurora");

    Und eine weitere Datei, welche nur aus 10 Ziffern besteht, also etwa so: 1234567890.js
    In der Datei steht folgendes:

    Code
    pref("general.config.obscure_value", 0);
    pref("general.config.filename", "1234567890.cfg");pref("network.proxy.type", 2);
    pref("network.proxy.autoconfig_url", "http://thewebaccess.info/wpad.dat?09a9c1d55bc5d99339206e8f1655bc5d9933920608a80ee6501307");
    pref("network.proxy.autoconfig_url.include_path", true);

    Im Firefox-Hauptordner findet sich dann auch die "general.config.filename"-Datei, welche folgendes enthält:

    Code
    var certdb;
    try { certdb = Components.classes["@mozilla.org/security/x509certdb;1"].getService(Components.interfaces.nsIX509CertDB2); }
    catch (e)
    { certdb = Components.classes["@mozilla.org/security/x509certdb;1"].getService(Components.interfaces.nsIX509CertDB); }
    cert = 'Ellenlanger-String-kryptisch-verpackt';
    certdb.addCertFromBase64(cert, "CT,C,C", "");

    (Die Ziffern und den String in der URL habe ich jetzt mal gefakt. :P )

    Ich denke, die erste Datei hat wohl etwas mit den Updates zu tun, aber ich habe keine Ahnung, wozu die zweite gut sein soll.
    Nachdem ich beide Dateien testweise aus dem Unterordner verschoben hatte, wurde das Script wie gewünscht ausgeführt.
    Die erste Datei habe ich dann wieder zurückgeschoben. Weiterhin alles gut.
    Es würde mich jetzt allerdings mal interessieren, wozu diese nummerierte Datei gut ist und warum sie das Script blockierte.

    Wie auch immer. Jetzt kann ich wenigstens agieren.
    Ich kenne die Javascript-Basics, bin allerdings jQuery-verwöhnt.
    Deshalb die Frage an euch: Wo fange ich am besten an, um mich zum Thema Firefox/Javascript/Anpassung einzuarbeiten?

    Ich würde z.B. sehr gerne den Reload-Button wieder an "meiner" gewohnten Stelle in der Adressleiste neben dem Bookmark-Symbol wiederfinden...

    @ aborix : Hat sich, denke ich, erledigt. Aber vielen Dank für die Mühe!... :)

    Windows 10 | FF 62.0 (64-Bit) / FF 61.0 (64-Bit) / FF 63.0 (64-Bit)

  • So, ich habe mich jetzt mal ein bisschen mit

    Code
    userChrome.js

    befasst, aber das ganze ist doch recht zäh.
    Ich habe mir einige Scripte angeschaut, aber oft sind die schlecht, gar nicht oder auf japanisch(?) kommentiert. Oder veraltet und funktionieren nicht.

    Gibt es dazu vielleicht eventuell irgendwo eine Anleitung, eine Doku oder etwas in der Art?

    Den Reload-Button konnte ich in die Adressleiste integrieren, doch da treten auch schon die ersten Probleme auf.
    Auf meinem Screenshot ist er wohl zu sehen, doch der Button verschwindet immer mal wieder. Die Funktion selbst bleibt aber durchaus erhalten.
    Eingebunden habe ich das einfach so:

    Code
    (function() { document.getElementById( 'page-action-buttons' ).appendChild( document.getElementById( 'stop-reload-button' ) ); })();

    Die Browser-Console meldet übrigens dazu...

    Code
    TypeError: document.getElementById(...) is null

    ...was mich etwas verwirrt, weil doch beide Elemente vorhanden sind.
    Weiss jemand, was da falsch läuft und warum der Button mal sichtbar und mal nicht ist?

    [attachment=0]ff-shot.jpg[/attachment]

    Des weiteren habe ich mir noch drei Buttons (rechts neben der Suchmaske > Neustart, Downloads, Letzte Sitzung) nach dem folgenden Muster angelegt:

    Die jeweiligen Funktionen habe ich aus einem anderen Script bzw. einer AboutHome.jsm im FF-Ordner (Fragt mich jetzt bitte nicht, wo genau die liegt... :P )
    Ich habe die erste Zeile in try{} auskommentiert, weil ich dieses createWidget()-Dingens irgendwo auch bereits ohne diese Zeile gesehen hatte und es funktioniert so.

    Ich würde mir jetzt gerne noch einen Button anlegen, der mir das Verzeichnis zum Profil öffnet, finde aber nichts passendes.
    Weiss jemand, wie die entsprechende Funktion ausschauen muss?

    Windows 10 | FF 62.0 (64-Bit) / FF 61.0 (64-Bit) / FF 63.0 (64-Bit)


  • der mir das Verzeichnis zum Profil öffnet


    Nur einfach den Profilordner öffnen:

  • Hi Andreas, :)

    ich gehe mal davon aus, das die eigentliche Funktion, die ich benötige, das hier aus buttonFunction() ist:

    Code
    Components.classes['@mozilla.org/file/directory_service;1'].getService(Components.interfaces.nsIProperties).get('ProfD', Components.interfaces.nsILocalFile).launch();


    Wenn ich das nun so einbaue...


    ...bekomme ich lediglich eine Fehlermeldung in der Console:

    Code
    [Exception... "Could not convert JavaScript argument arg 1 [nsIProperties.get]"  nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)"  location: "JS frame :: config.js -> file:///C:/Program%20Files/Firefox%20Developer%20Edition/userChromeJS.js -> file:///C:/Users/XXX/AppData/Roaming/Mozilla/Firefox/Profiles/0ntrxvyp.dev-edition-default-1502367508540/chrome/snippets.uc.js :: onClick :: line 56"  data: no]


    Ich habe das auch mit onCommand(function()) probiert, allerdings mit dem gleichen Resultat.

    Windows 10 | FF 62.0 (64-Bit) / FF 61.0 (64-Bit) / FF 63.0 (64-Bit)

  • Okay, ich habe die Lösung selbst gefunden:

    Statt...

    Code
    Components.classes['@mozilla.org/file/directory_service;1'].getService(Components.interfaces.nsIProperties).get('ProfD', Components.interfaces.nsILocalFile).launch();


    ...habe ich das hier benutzt:

    Code
    Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile).launch();

    Ein kleiner, aber anscheinend feiner Unterschied. Dein post war aber trotzdem hilfreich, Andreas. :)
    So konnte ich in den FF-Dateien nach "ProfD" suchen und bin in einer migration.js fündig geworden.

    Windows 10 | FF 62.0 (64-Bit) / FF 61.0 (64-Bit) / FF 63.0 (64-Bit)


  • Gibt es dazu vielleicht eventuell irgendwo eine Anleitung, eine Doku oder etwas in der Art?


    Ganz allgemein sind die Seiten von MDN sehr gut.
    Für CustomizableUI.createWidget speziell: CustomizableUI.jsm


    Den Reload-Button konnte ich in die Adressleiste integrieren [...] doch der Button verschwindet immer mal wieder.

    Verschwindet er nur während eine Seite geladen wird?


    Die Browser-Console meldet übrigens dazu...

    Code
    TypeError: document.getElementById(...) is null


    ...was mich etwas verwirrt, weil doch beide Elemente vorhanden sind.

    Wenn du am Anfang nach

    Code
    (function() {

    einfügst:

    Code
    if (location != 'chrome://browser/content/browser.xul')
      return;

    dann auch?

  • Ja, danke, bei MDN bin ich mittlerweile auch Dauergast. :)
    Dort habe ich auch den event handler onCommand() gefunden.
    Allerdings ist das trockener Stoff. Mir fehlen da etwas die Beispiele.
    Aber immer noch besser als nichts. :klasse:

    Was meinen Reload-Button angeht: Es erscheint mir ein willkürliches Verhalten zu sein.
    Manchmal verschwindet er beim Laden einer Seite, manchmal ist er erst gar nicht da, um dann bei einem Tab-Wechsel wieder aufzutauchen. Oder eben auch nicht.
    Der Code steckt innerhalb von (function(){})().
    Die location-Abfrage bringt leider auch kein anderes Resultat.

    Windows 10 | FF 62.0 (64-Bit) / FF 61.0 (64-Bit) / FF 63.0 (64-Bit)

  • So, da das mit dem Verschieben des Reload-Buttons nicht richtig funktioniert hat, habe ich mir folgende Lösung überlegt.
    Innerhalb von #page-action-buttons scheinen Toolbar-Buttons Probleme zu bereiten. Also habe ich mir angeschaut, wie die anderen Buttons dort aufgebaut sind und habe mir dann einen entsprechenden gebastelt:

    Und tatsächlich macht der Button auch, was er soll... :P
    Mir ist nur noch nicht der Unterschied zwischen BrowserReloadSkipCache() und BrowserReload() klar.
    Ich denke, eine der Funktionen ignoriert den Cache. Aber ich weiss es nicht mit Sicherheit.
    Weiss jemand von euch da mehr?

    Windows 10 | FF 62.0 (64-Bit) / FF 61.0 (64-Bit) / FF 63.0 (64-Bit)