Wechseln zwischen Browser-Schrift und Webpage-Schrift: Ausnahmen definieren

  • dass es diese Funktion seitenspezifisch einfach in keiner Weise mehr gibt.

    Nie gab. Aber ich habe ja einen Weg beschrieben, der funktionieren sollte. Ich habe mal gerade in den Quellcode der alten Erweiterung Document Font Toggle geschaut und die hat tatsächlich genau das gemacht, was ich beschrieben habe. Eine WebExtension kann genau das Gleiche machen.

  • Vielleicht kann ja jemand mal anhand eines Code-Beispiels erklären, wieso das Ignorieren des vorgesehenen Fonts überhaupt zu einem Scriptfehler führt?

    Ich habe das Beispiel aus diesem Thread jetzt untersucht:

    Weshalb beeinflusst "browser.display.use_document_fonts" dynamische Elemente?

    Dazu habe ich die Seite lokal gespeichert, die Datei main.js de-minimiert und den Code debuggt. Dabei ist der folgende Code aufgefallen:

    JavaScript
    var o = t(document), a = {mq: "mq.estatico"}, s = o.find("head"), l = s.find("title"), u = s.css("font-family"), c = l.css("font-family"), p = i(u), h = i(c)

    Der Fehler geschieht beim Lesen der font-family des title-Elements. Was an sich ja schon vollkommener Schwachsinn ist, denn der Inhalt wird im Tab angezeigt und kann keine definierte Schriftart haben. Jedenfalls ist im CSS tatsächlich eine Schrift dafür definiert. Der Wert ist genauso Schwachsinn, weil er mit einer Schrift überhaupt nichts zu tun hat:

    CSS
    title {
      font-family: '{"name":"large","value":"1679px"}';
    }

    Das CSS ist in beiden Fällen natürlich das Gleiche. Spannend wird es jetzt im "Berechnet"-Panel des Inspektors.

    browser.display.use_document_fonts => 1:
    "{"name":"large","value":"1679px"}"

    browser.display.use_document_fonts => 0:

    serif, "{"name":"large","value":"1679px"}"

    Man beachte das "serif, " zu Beginn. So funktioniert nämlich dieses Feature: Indem "serif, " an den Beginn der Font-Deklaration gesetzt wird.

    Nun passiert später Folgendes im Code:

    JavaScript
    J.parseJSON = function (t) {
      return JSON.parse(t + "")
    }

    Das heißt, der Inhalt wird versucht, als JSON zu parsen. Und durch das "serif, " zu Beginn ist das kein gültiges JSON und folgerichtig wird ein Fehler geworfen:

    Zitat

    SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data


    Und durch den JavaScript-Fehler kommt es zur Nicht-Funktionalität der Website.

    Das ist in dem Fall also definitiv kein Fehler von Firefox, sondern die Folge einer selten abenteuerlichen Zweckentfremdung durch den Website-Entwicker. Ich entwickle seit sicher schon 15 Jahren Websites und habe schon einiges gesehen. Aber so etwas habe ich tatsächlich noch nie gesehen.

  • Hallo Sören,

    ich kann verstehe das nicht vollständig, z.B. ist mir daraus nicht klar, weshalb das nur dann passiert, wenn browser.display.use_document_fonts = 0 gesetzt ist.

    Das macht aber nichts. Ich vertraue dir da, keine Frage. Ich möchte mich auf jeden Fall bedanken, dass du dir die Mühe gemacht hast.

  • Wie gesagt wird, sobald browser.display.use_document_fonts auf 0 gesetzt wird, im berechneten CSS vor jede Schrift-Deklaration serif, gesetzt. Genau das ist die Funktionalität dieses Schalters. Die Website hat die Schrift-Deklaration jedoch für etwas völlig anderes missbraucht und erwartet an dieser Stelle einen JSON-Inhalt. Durch das serif, am Beginn ist das aber kein gültiges JSON mehr. Bleibt browser.display.use_document_fonts auf 1, wird am berechneten CSS nichts verändert, dementsprechend bleibt der Inhalt gültiges JSON und es kommt zu keinem Fehler.

  • Zitat

    ... es gibt keine Firefox-Schnittstelle, um das Verhalten pro Seite zu steuern, ...

    Zitat

    Nie gab.

    Zitat

    Im Prinzip könnte eine Erweiterung aber schon eine Ausnahmeliste pflegen und dann auf den aktiven Tab reagieren, indem je nach aktivem Tab die globale Einstellung aktiv oder inaktiv gesetzt wird.

    Zitat

    Ich habe mal gerade in den Quellcode der alten Erweiterung Document Font Toggle geschaut und die hat tatsächlich genau das gemacht, was ich beschrieben habe. Eine WebExtension kann genau das Gleiche machen.

    Danke Sören! Jetzt habe ich den vollen Durchblick! :)

    Zitat

    Ich habe das Beispiel aus diesem Thread jetzt untersucht

    Vielen Dank auch von mir für Deine Bemühung. :thumbup: