1 Punkte von GN⁺ 2 시간 전 | 1 Kommentare | Auf WhatsApp teilen
  • Ladybird hat im April 333 PRs von 35 Mitwirkenden gemergt und neue Spenden über 50.000 US-Dollar von der Human Rights Foundation sowie 1.000 US-Dollar von Jakub Stęplowski erhalten
  • Mit einem integrierten PDF-Viewer, einer auf dem Verlauf basierenden Autovervollständigung der Adressleiste, einem GTK4/libadwaita-Linux-Frontend und einer Verwaltungsoberfläche für about:bookmarks wurden Browsing-Funktionen und Desktop-UI erweitert
  • Der HTML-Parser parst Response-Bodies schrittweise, ein Spekulations-Parser lädt Ressourcen vorab, und die Top-Level-Kompilierung von JavaScript wurde in einen Hintergrund-Thread verlagert, was beim Laden von YouTube rund 200 ms Main-Thread-Zeit spart
  • Die JavaScript-Engine verbessert mit for-in-Cache, einem O(1)-Register-Allocator, Zero-Copy-Identifier-Sharing, lazy JS::Substring und einem verbesserten Typed-Array-View-Cache die Performance in Speedometer und beim Laden realer Websites
  • Enthalten sind Cache/CacheStorage, image-set(), CSS Anchor Positioning, asynchrones DNS, dmabuf-basiertes GPU-Painting, mimalloc als Standard und Rust als Pflicht; der WPT-Score stieg von 2.003.537 auf 2.067.263

Entwicklungsumfang und Unterstützung

  • Im April hat Ladybird 333 PRs von 35 Mitwirkenden gemergt, darunter 7 Personen mit ihrem ersten Commit zu Ladybird
  • Als neue Förderer spendeten die Human Rights Foundation über das Programm „AI for Individual Rights“ 50.000 US-Dollar und Jakub Stęplowski 1.000 US-Dollar
  • Ladybird wird vollständig durch Spenden von Unternehmen und Privatpersonen finanziert, die das offene Web unterstützen

Browsing-Funktionen und Frontends

  • Integrierter PDF-Viewer

    • PDFs werden über den gebündelten pdf.js-Viewer inline gerendert (#9132)
    • pdf.js ist ein PDF-Viewer, der ausschließlich mit JavaScript, HTML und CSS geschrieben wurde, und bietet Seitennavigation, Textauswahl, Zoom und Suche im Dokument
    • Beim Laden des Intel ISA Manual mit pdf.js zeigten sich Verbesserungsmöglichkeiten beim Typed-Array-View-Cache und der :has()-Invalidierung
  • Verlauf und Autovervollständigung der Adressleiste

    • Bei Eingaben in die Adressleiste werden umfangreiche, auf dem Verlauf basierende Vorschläge angezeigt, darunter Favicons und Titel zuvor besuchter Seiten, Suchmaschinen-Shortcuts und normale URL-Vervollständigung (#8933)
    • Das SQLite-basierte HistoryStore speichert für alle Navigationen Titel, Favicon, Besuchszahl und den Zeitpunkt des letzten Besuchs
    • Auf der Datenschutz-Einstellungsseite wurde „Clear browsing history“ angebunden, und sowohl die Qt- als auch die AppKit-UI rendern nun die neuen Rich Rows
  • GTK4 / libadwaita-Frontend

    • Für Ladybird wurde ein neues Linux-Frontend auf Basis von GTK4 und libadwaita hinzugefügt, das parallel zum bestehenden Qt-Frontend bereitsteht (#8691)
    • Es ist von GNOME Web (Epiphany) inspiriert und verwendet gemäß den GNOME-Designrichtlinien statt einer Menüleiste ein Hamburger-Menü und AdwTabView-Tabs
    • Es bietet URL-Leisten-Autovervollständigung und Sicherheits-Icons, Seitensuche, Vollbild, Kontextmenüs, Dialoge für alert/confirm/prompt/color/file, Clipboard, mehrere Fenster, helle/dunkle Themes und DPR-Skalierung
    • Es befindet sich noch in einem frühen Stadium und hat noch keine Funktionsparität mit den Qt- und AppKit-Frontends erreicht
  • Lesezeichen

    • Die im letzten Monat hinzugefügten Lesezeichen haben nun eine Verwaltungsoberfläche erhalten
    • Auf der Seite about:bookmarks lassen sich Lesezeichen und Ordner verwalten (#8825)
    • Die neue Seite unterstützt den Import und Export von Lesezeichen (#8938)
    • Es wurden Kontextmenüs zum Bearbeiten von Lesezeichen und Ordnern hinzugefügt (#8715)
    • Für alle Lesezeichen und Ordner wurde ein date_added-Zeitstempel ergänzt (#8867)
    • Die Lesezeichenleiste unterstützt nun das Öffnen in einem neuen Tab, URL-Kopieren sowie das Öffnen in einem neuen Tab per Mittelklick und Ctrl/Cmd+Klick (#8758)
    • Die HTML5-Drag-and-Drop-API wurde angebunden; about:bookmarks nutzt sie für die Neuordnung, und sie funktioniert auch auf normalen Webseiten (#8783)

HTML-Parsing, Skriptausführung, Rendering-Pipeline

  • Spekulatives und inkrementelles HTML-Parsing

    • Der HTML-Parser wurde so umgestellt, dass er den Response-Body inkrementell verarbeitet (#9151)
    • Bytes laufen durch einen Streaming-Textdecoder und werden dann in Chunks an den Tokenizer übergeben; bei fehlender Eingabe stoppt der Tokenizer und setzt die Verarbeitung fort, sobald mehr Daten eintreffen
    • Damit wird das bisherige Modell ersetzt, das erst nach Empfang des vollständigen Bodys mit dem Parsing begann
    • Ein spekulativer HTML-Parser wurde ebenfalls implementiert (#9114)
    • Wenn der Hauptparser durch ein synchrones externes Skript blockiert ist, scannt ein separater Tokenizer die noch nicht geparsten Eingaben vorab und stößt spekulative Fetches für Ressourcen aus <script src>, <link rel=stylesheet|preload> und <img src> an
    • Er verfolgt <base href> und überspringt Inhalte innerhalb von Templates und Foreign Content korrekt
    • Der spekulative Parser ist mit der Preload-Map des Dokuments verbunden, sodass spekulativ gefundene Ressourcen mit späteren Fetches des normalen Parsers dedupliziert werden (#9164)
  • JavaScript-Kompilierung abseits des Hauptthreads

    • Die Bytecode-Erzeugung für Top-Level-Code geladener Skripte läuft in einem Hintergrund-Thread-Pool (#9118)
    • Worker-Threads erzeugen den Bytecode und die für die Erstellung von Executable nötigen Daten, während Arbeiten, die VM oder GC-Heap berühren, auf dem Hauptthread bleiben
    • Verarbeitet klassische Skripte, Module und Top-Level-IIFEs; allein das Laden von YouTube verschiebt etwa 200 ms Hauptthread-Zeit in Hintergrund-Threads
  • Rasterisierung pro Navigable

    • Jedes Navigable wird nun unabhängig in seinem eigenen Thread rasterisiert (#8793)
    • Zuvor wurden iframes als verschachtelte Display-Lists innerhalb der Display-List des Elternteils synchron gezeichnet, sodass nur der Rendering-Thread des obersten Traversables aktiv war
    • Die Display-List des Elternteils referenziert nun die rasterisierte Ausgabe jedes iframe über ExternalContentSource, sodass eine Invalidierung des iframe kein Neuschreiben des Elternteils mehr erfordert
    • Neben der Parallelisierung ist dies auch Vorarbeit dafür, iframes in separate Sandbox-Prozesse zu verlagern
  • GPU-Painting auf Linux auf Basis von dmabuf

    • In Linux-Vulkan-Builds zeichnete WebContent zwar auf eine GPU-gestützte Skia-Surface, der mit dem UI-Prozess geteilte Buffer war jedoch eine CPU-Bitmap, sodass bei jedem Flush ein GPU-zu-CPU-Readback stattfand
    • SharedImage kann nun Linux-dmabuf-Handles enthalten, wodurch Front-/Back-Buffer bis in den UI-Prozess hinein auf der GPU verbleiben (#8917, #8920)

Leistung und Kompatibilität der JavaScript-Engine

  • Optimierung von JS-zu-JS-Aufrufen

    • Mehrere PRs sorgen dafür, dass Call-, Return- und End-Instruktionen im Normalfall innerhalb des AsmInt-Assembly-Interpreters bleiben (#8891, #8909, #8912)
    • Für das Sichern/Wiederherstellen von Registern werden manuell abgestimmte ARM64 paired load/store-Operationen (ldp/stp) verwendet
    • Auch native function-Aufrufe werden nun direkt aus AsmInt dispatcht, über eine neue RawNativeFunction-Variante mit gewöhnlichen Funktionszeigern statt AK::Function (#8922)
  • O(1)-Bytecode-Register-Allocator

    • Generator::allocate_register war so aufgebaut, dass es den verfügbaren Pool durchsuchte, um das Register mit der kleinsten Nummer zu finden; allein diese Funktion verbrauchte beim Laden von x.com rund 800 ms
    • Nach dem Ende der Äquivalenzphase der C++/Rust-Pipeline wurde der Allocator auf einen einfachen LIFO-Stack umgestellt (#9007)
  • Gecachte for-in-Iteration

    • Die Position von for (key in obj) cached einen abgeflachten Snapshot der enumerable keys und verwendet ihn wieder, solange Shape, indexed storage und prototype chain des Receivers unverändert bleiben (#8856)
    • Speedometer 2 steigt von 67.7 → 73.6, Speedometer 3 von 4.11 → 4.22
  • Weitere Verbesserungen an der Engine

    • Der Parser teilt Bezeichnernamen per Zero-Copy über Lexer, Parser und Scope Collector hinweg, wodurch das Parsing auf einem Website-JS-Korpus 1,14-mal schneller wird und der RSS um 282 MB sinkt (#8801)
    • Bei kurzer String-Konkatenation wird die Rope-Repräsentation übersprungen, wenn das Ergebnis ohnehin als flat string beobachtet wird; in dichten a + b-Schleifen ergibt das einen 2,13-fachen Geschwindigkeitsgewinn (#9184)
    • Lexical-this arrow functions allokieren nicht bei jedem Aufruf eine function environment, was in Microbenchmarks eine 2,13-fache Verbesserung bringt (#9192)
    • Sparse Arrays verursachen nicht sofort Kosten für holes, und Array(20_000_000) bleibt größtenteils Metadaten statt proportional zu 20 Millionen virtuellen Elementen Arbeit auszulösen (#8847)
    • Der neue lazy-Typ JS::Substring bildet die Grundlage für regexp capture sowie String-Builtins wie slice, split und indexed access und verbessert den Octane-Regexp-Benchmark um 1,066-fach (#8863)
    • In der Bytecode-source map bleiben source positions durchgängig erhalten, was auf x.com etwa 250 ms einspart (#9027)
    • Zero-Copy-TransferArrayBuffer spart beim Laden von YouTube etwa 130 ms (#9088)
    • Die gecachte typed-array view wurde von WeakHashSet auf eine intrusive list umgestellt, was beim Laden des Intel-ISA-PDFs in pdf.js etwa 250 ms einspart (#9180)
    • Statt dass jedes Promise zwei PromiseResolvingFunction-Zellen mit nicht-capturenden AK::Function-Closures allokiert, werden nun statische Funktionen verwendet, die über ein Kind-Enum dispatcht werden, wodurch Allokationen pro Resolver entfallen (#9188)
    • Durch das Überspringen des Property-Table-Markings für non-dictionary shapes sinkt die GC-Zeit beim Laden von maptiler.com um 1,3 Sekunden (#9044)
    • Ein Fast Path für Array.prototype.indexOf bei packed arrays wurde hinzugefügt (#9123)
    • Array.prototype.sort verwendet gecachtes UTF-16 wieder, statt bei jedem Vergleich neu zu transkodieren (#9036)
    • Imports von WASM, JSON und CSS modules wurden hinzugefügt (#6029)
    • Die Unterstützung für den ShadowRealm-Vorschlag wurde entfernt, da dessen Standardisierungsprozess ins Stocken geraten ist (#8753)

Webplattform-APIs und CSS

  • Cache und CacheStorage

    • Cache und CacheStorage wurden End-to-End implementiert (#8745)
    • Neun Methoden, darunter open, has, delete, keys, match, matchAll, add, addAll und put, funktionieren auf Basis eines temporären In-Memory-Speichers
  • CSS-Funktionen und Rendering-Korrekturen

    • Grundlegende Unterstützung für die Standardform und die -webkit--Präfixform von image-set() wurde hinzugefügt; beim Paint wird der am besten zur Device Pixel Ratio passende Auflösungskandidat ausgewählt, und nicht unterstützte MIME-Typen werden übersprungen (#9090)
    • Durch die Unterstützung von image-set() wird das Header-Bild auf gocomics.com angezeigt
    • Erste Unterstützung für position-anchor und CSS Anchor Positioning wurde hinzugefügt, wodurch die Position von Hand und Pistole auf cssdoom.wtf korrigiert wurde (#8686)
    • Die Farbinterpolation wurde gemäß css-color-4 neu geschrieben: Statt in u8 wird in Float-Werten interpoliert, und missing/powerless components, out-of-gamut sRGB sowie der Alpha-Multiplikator werden konsistent behandelt (#8934)
    • Legacy-HTML-Attribute zur Darstellung wie align und bgcolor schreiben nicht mehr direkt in cascaded properties, sondern durchlaufen die Cascade wie normale Author-Declarations, sodass var()-Substitution und invalid-at-computed-value-time-Fallback korrekt funktionieren (#9176)
    • Durch die Änderung der Presentational-Hint-Cascade wurde ein Absturz auf html.spec.whatwg.org behoben
    • <thead>, <tbody>, <tfoot> und <tr> berücksichtigen nun das presentational align-Attribut, wodurch die Anordnung der Buttons auf bricklink.com korrigiert wurde (#9177)
    • Durch stroke-dasharray-Interpolation werden SVG-Strichelungen weich animiert (#9133)
    • Elemente mit dem autofocus-Attribut erhalten beim Laden der Seite nun tatsächlich den Fokus (#9016)
    • List Marker in RTL-Text werden rechts platziert, wodurch das Rendering von Listen in der arabischen Wikipedia korrigiert wurde (#9099)
    • Die Baseline von Inline-Flex-/Grid-Containern wird nicht mehr aus der letzten umbrochenen Zeile, sondern aus der ersten Line-Box des Child-Elements abgeleitet, wodurch die Ausrichtung von Link-Text und Icons auf nos.nl korrigiert wurde (#9183)

Networking und Stil-Invalidierung

  • Networking

    • getaddrinfo blockiert nicht länger den Event Loop
    • LibDNS führt Lookups im Thread-Pool aus, sendet A- und AAAA-Queries parallel und führt gleichzeitige Lookups für denselben Namen zusammen(#9109)
    • Der Preconnect-Pfad von RequestServer wurde so korrigiert, dass er statt des Umgehens des Resolvers über denselben DNS-Pool-Pfad geleitet wird, da der threaded resolver von libcurl im Main Thread pthread_join auslöste(#9109)
    • Das Drainen der queued response data in RequestServer war O(n²), wenn WebContent langsamer als das Netzwerk war, und verbrauchte beim Öffnen von YouTube-Videos etwa 30 Sekunden in memcpy und 3 Sekunden in Vector::remove
    • AllocatingMemoryStream wurde auf eine einfach verkettete Chunk-Liste umgestellt, wodurch der Verbrauch O(1) wird(#9028)
    • Der Accept-Header für Bildanfragen bewirbt nun AVIF und WebP und wurde damit an andere Engines angeglichen; einige CDNs entscheiden anhand dieses Headers, ob moderne Formate ausgeliefert oder auf JPEG zurückgefallen wird(#9046)
  • Stil-Invalidierung

    • Die bisherige Selector-Invalidierung war einfach, weil sie davon ausging, dass Selectors nur nach unten schauen; durch :host und :has() können Änderungen an Descendants jedoch das :has()-Ergebnis von Ancestors verändern, weshalb nun ein nach oben gerichteter Walk nötig ist
    • Bei Stylesheet-Mutationen werden nicht mehr alle Style-Scope-Caches neu aufgebaut, wenn nur ein einzelner Scope verändert wurde; dadurch sank der Neuaufbau des Reddit-Rule-Cache von 13,2 Sekunden auf 3,2 Sekunden(#9138)
    • Sibling-Structural-Invalidierung breitet sich nicht mehr auf Descendants aus, die keine Position beobachten, wodurch bei Reddit Infinite Scroll unnötige Neuberechnungen um 11 % reduziert wurden(#9155)
    • Die Mutations-Invalidierung für :has() überspringt nicht betroffene Anchors; auf azure.com wurde eine deutliche Verringerung gemessen(#9168)
    • Im Intel-ISA-PDF wurden Child-List-Besuche für :has() von 71k auf 1,6k reduziert, was beim Laden von pdf.js rund 650 ms einspart(#9179)
    • Ein neues Bündel an Structural-Invalidation-Tests deckte mehrere fehlende Invalidierungen auf, die anschließend behoben wurden(#9095)
    • Enthalten sind außerdem kleinere Verbesserungen rund um Hover, Stylesheet-Mutation-Scopes, Custom-Property-Maps und Computed-Style-Diffing(#9077, #9049, #9079, #9080, #9141)

Speicherzuweisung und Build-System

  • mimalloc als Standard-Allocator

    • C++- und Rust-Code teilen sich eine einzelne Allocator-Instanz von mimalloc v2, ohne jeweils über den System-Allocator zu gehen(#8752)
    • Da malloc() nicht systemweit überschrieben wird, behalten Third-Party-Bibliotheken ihren jeweiligen Allocator-Vertrag bei
    • JS-Benchmarks verbessern sich insgesamt
  • Rust wird verpflichtend und Bereinigung des Build-Systems

    • Die Build-Option ENABLE_RUST wurde entfernt, Rust ist damit verpflichtend(#8742)
    • Das GN-Build-System wurde vollständig entfernt, CMake bleibt als einzige Referenz übrig(#8931)
  • Änderungen bei GC und Speicher

    • Es wird mit -ftrivial-auto-var-init=zero kompiliert, sodass alte GC-Pointer beim Eintritt in Funktionen mit 0 überschrieben werden und der konservative Stack-Scanner sie seltener findet(#9171)
    • Die selten genutzte Property UsedValues wurde hinter einen Lazy Pointer verschoben, wodurch die Struct-Größe von 424 Byte auf 176 Byte sank; beim Laden von sainsburys.co.uk reduzierte sich LayoutState::populate_node_from() von 139 ms auf 65 ms(#9104)
    • Fetch-Body-Chunks durchlaufen nicht länger den Pull-Promise-Pfad, der pro Chunk sieben GC-Objekte allokierte, sondern gehen nun direkt in den Byte-Stream-Controller(#9169)

Verbessertes Verhalten auf Websites

  • Reddit

    • Die Bildergalerie-Karussells von Reddit funktionieren nun, und zwei voneinander unabhängige Layout-Bugs rund um ::slotted()-Matching sowie absolut positionierte Descendants von gesplittetem Inline-Content wurden behoben (#9148)
    • Dank TextDecoderStream verschluckt die SPA Link-Klicks nicht mehr, sodass sich Kommentare öffnen lassen
    • Auch Infinite Scroll profitierte von der Arbeit an structural invalidation
  • YouTube

    • YouTube profitiert von Off-Thread-Kompilierung von Top-Level-JS, Off-Thread-WOFF2-Dekomprimierung, weniger @font-face-Fetch-Fanout, einem Fix für RequestServer memory churn und Zero-Copy-TransferArrayBuffer
    • Die Off-Thread-WOFF2-Dekomprimierung spart auch bei Gmail rund 170 ms (#8976)
    • Beim initialen Laden wurde das @font-face-Fetch-Fanout von 177 auf etwa 9 reduziert (#9032)
  • Sonstige Websites

    • Auf gocomics.com werden dank image-set() Header-Bilder angezeigt
    • Auf yandex.com/maps funktioniert durch WebGL-Fixes einschließlich der Erweiterung WEBGL_debug_renderer_info das WebGL-Rendering von Vector Tiles (#9043)
    • Bei strava.com funktioniert der Login nun, weil Navigator.getBattery statt eines eigenen Fehlers den von der Spezifikation vorgeschriebenen Fehlertyp auslöst (#8770)
    • GitHub Insights lädt dank Selector-Cache für Element.matches() und .closest() rund 100 ms schneller (#8987)
    • Die Notebook-Vergleichsseite von tweakers.net ist durch indexed HTMLFormElement property name lookup etwa 31 % schneller (#9009)
    • neon.com stürzt nicht mehr ab (#8812)
    • Auf channel4.com wurde durch einen Fix bei der Auflösung von Flex-Auto-Margins das Problem mit der vertikalen Ausrichtung des Kategorietexts behoben (#9050)
    • Cloudflare Turnstile wird zwar noch nicht bestanden, scheitert aber dank Auth-Scheme-Handling, Array.prototype.shift()-Optimierung und einer Härtung der UA-Event-Handler für <input>-Range- und Number-Elemente deutlich schneller (#9063)

WPT und weitere Plattformänderungen

  • Web Platform Tests

    • Der WPT-Score stieg von 2.003.537 auf 2.067.263, was in diesem Monat einem Zuwachs von 63.726 Subtests entspricht
    • Allerdings hat WPT mit test262 die offizielle ECMAScript-Conformance-Suite upstream übernommen, wodurch 53.207 JavaScript-Subtests hinzugekommen sind
    • Ladybird führt test262 bereits seit Jahren separat aus, und da die LibJS-Conformance in gutem Zustand ist, werden davon 52.045, also 97,8 %, bestanden
    • Von dem Zuwachs um 63,7k stammen etwa 52k aus dem test262-Import, während die übrigen rund 11,7k den tatsächlichen Fortschritt der Browserplattform darstellen
    • Durch den test262-Import misst WPT nun JavaScript-Conformance zusammen mit dem Rest der Plattform
  • Text, Layout, Prozesse und UI

    • Selection und Hit-Testing für Text mit Ligaturen wurden von einer Struktur, die pro Glyph von einer Code Unit ausging, auf ein Verfahren umgestellt, das Grapheme-Cluster durchläuft und den Glyph-Advance auf diese Grapheme verteilt (#8829)
    • Das Setzen von innerHTML auf einem Shadow Root invalidiert nicht mehr den Layout-Baum des gesamten Dokuments; auf pomax.github.io/bezierinfo sinkt dadurch die Zeit für Layout und Paint um 21 % (#9191)
    • Wenn ein Popup-Tab zu einer anderen Website navigiert, wird der WebContent-Prozess des Parents nicht mehr beendet (#8730)
    • In der Qt-UI kann mit Ctrl+Tab und Ctrl+Shift+Tab durch geöffnete Tabs gewechselt werden (#8704)
    • Mit gedrückter mittlerer Maustaste kann zum Scrollen gezogen oder per Klick an Ort und Stelle in den Autoscroll-Modus gewechselt werden (#8881, #8928)
    • Wenn die Eingabe in der Adressleiste nicht zu einer URL oder Suchanfrage bereinigt werden kann, wird statt eines stillen Verwerfens nun eine passende Fehlerseite angezeigt (#9072)
    • TextDecoderStream, das Streaming-Gegenstück zu TextDecoder, wurde implementiert und hält partielles UTF-8 an Chunk-Grenzen zurück, wodurch das Bearbeiten von Reddit-Kommentaren möglich wird (#9143)
    • Prozessübergreifende BroadcastChannel-Nachrichten werden nun per IPC zwischen WebContent- und WebWorker-Prozessen geroutet, sodass Listener unabhängig vom Prozess wie in anderen Browsern funktionieren (#8865)

1 Kommentare

 
GN⁺ 2 시간 전
Hacker-News-Kommentare
  • Wenn man einen Browser ohne JavaScript nutzen möchte, wird auch der Browser-Prototyp von Dioxus ziemlich gut
    Das Rust-GUI-Framework Dioxus entwickelt ihn als Teil eines nativen Renderers; die Richtung ist, ähnlich wie Flutter selbst eine Skia-Alternative zu bauen, aber statt wie Flutter Web nur Canvas zu verwenden, arbeitet er im Web mit HTML/CSS-Standards
    Er hängt nicht von bestehendem Browser-Code wie Chromium, Gecko oder WebKit ab und ist eher eine nahezu von Grund auf neu geschriebene Implementierung, die Rust-Crates wie stylo und taffy aus Servo nutzt: https://github.com/DioxusLabs/blitz (/apps/browser)
  • Der schwierigste Teil der Browser-Entwicklung war immer die künstliche Web-Kompatibilität
    Viele Websites blockieren das Laden bestimmter Browser absichtlich und erlauben nur Chromium; genau das wird die Realität sein, mit der Ladybird konfrontiert wird, und es ist ein großer Faktor, der neue Browser-Konkurrenz verhindert
    DRM Widevine ist für neue Browser ebenfalls sehr schwer zu bekommen, und selbst Zen Browser mit 10 Millionen Nutzern hat es nicht geschafft
    • Leider hat die neue Generation die Lektion von IE nicht gelernt und ist die erste, die sich beschwert, wenn andere nicht dem Wind der Chrome-OS-Plattform folgen
    • Ich weiß nicht, wie häufig solche Blockaden in der Praxis wirklich sind
      Ich nutze seit 20 Jahren nur Firefox, habe aber noch nie eine Website gesehen, die mich aus Kompatibilitätsgründen zum Wechsel auf Chromium aufgefordert hätte
    • Wenn diese künstlichen Hürden die Interoperabilität so stark beeinflussen, dann sind bereits 99 % der Hindernisse überwunden, und das meiste lässt sich durch User-Agent-Spoofing umgehen
      Widevine ist tatsächlich eine echte Hürde, aber realistisch verhindert es vor allem 4K-Wiedergabe auf einigen Streaming-Seiten wie Netflix oder Disney
      Dass Zen auch ohne Widevine 10 Millionen Nutzer gewonnen hat, spricht dafür, dass es nicht ganz so entscheidend ist
    • Ladybird meldet sich genau aus diesem Grund neuerdings als Chrome
    • Für Kompatibilitätstests kann man den User-Agent nachahmen
      Wenn man den Browser selbst kontrolliert, ist abgesehen von DRM-bezogenen Problemen fast nichts unmöglich
  • Es scheint ziemlich brauchbar zu werden
    Solche Beiträge erinnern mich an den Spaß beim Lesen von Updates zu Spiele-Emulatoren
    So nach dem Motto: „Bug X wurde behoben, dadurch funktioniert Y korrekt, und deshalb läuft jetzt Spiel Z“; einer der diesmal behobenen Punkte war CSS Doom, daher gibt es auch gewisse Überschneidungen mit Spielen
    • Das ist ein treffender Vergleich
      Ich habe Andreas mehrmals sagen hören, dass Browser bauen wie Emulatoren bauen ist
      Jede Website nutzt unterschiedliche Features auf unterschiedliche Weise, und er vergleicht Websites mit ROMs
  • Ladybird macht wirklich große Fortschritte
    Ich bin langjähriger Firefox-Nutzer, aber sobald Ladybird in eine sehr frühe Alpha geht und vorkompilierte Builds erscheinen, werde ich es definitiv früh ausprobieren
    • Wenn du es in diesem Stadium einmal ausprobieren willst: Ein lokaler Build ist einfach, ein paar Befehle zum Installieren der Abhängigkeiten und zum Ausführen des Build-Skripts reichen: https://github.com/LadybirdBrowser/ladybird/blob/master/Docu...
    • Mozilla braucht zumindest einen kräftigen Anstoß
    • Selbst zu kompilieren ist ziemlich einfach, besonders wenn man Claude Code darum bittet
  • GTK4 / libadwaita frontend klingt gut
    Ich bevorzuge GTK UI/UX gegenüber Qt, daher freue ich mich auf die Fortschritte auf dieser Seite
  • strava.com : Login works now that Navigator.getBattery throws the spec-mandated error type instead of one of our own (#8770).
    Warum will Strava meinen Batteriestand wissen?
    • Höchstwahrscheinlich zur Erzeugung eines eindeutigen Fingerprints für Tracking
    • Vielleicht wird die Battery API auch als Heuristik verwendet, um eine stromsparendere Version der Website auszuwählen
      Es könnte eine reine Web-Version für Entwicklungsländer geben, oder bei niedrigem Akkustand soll vielleicht die Häufigkeit von Standortabfragen gesenkt werden, um Strom zu sparen
      Das ist reine Spekulation, aber dass eine Seite wie Strava Batterieinformationen anfragt, ist nicht völlig absurd, wirkt insgesamt jedoch etwas verdächtig
    • Strava ist ein Dienst zur Streckenverfolgung
      Wenn man annimmt, dass er auch über die Website genutzt werden kann, ist es gut möglich, dass die Häufigkeit der Standortabfrage angepasst werden soll, um zwischen Genauigkeit und Stromverbrauch abzuwägen
    • Bots, die versuchen, Accounts per Brute Force zu knacken, implementieren diese API möglicherweise nicht wie echte Geräte
  • Vorheriger Beitrag: https://news.ycombinator.com/item?id=47985497
  • Mir gefällt die Ausrichtung von SerenityOS sehr, und ich hoffe, dass Ladybird Browser diese Fokussierung beibehält
  • Glückwunsch
    Allerdings sieht der Screenshot mit den Listenmarkierungen bei RTL-Text für mich gleich aus
    In beiden Fällen stehen die Listenmarkierungen links
  • https://ladybird.org/assets/img/newsletter-apr-2026-reddit-g...
    Ich habe großen Respekt vor der Person, die für den Ladybird-Reddit-Test Evangelion r/unixporn verwendet hat
    Ich habe Evangelion nicht sehr oft gesehen, aber unzählige Erklär-Dokumentationen dazu geschaut und mochte es genug, um es eine Zeit lang sogar als Hintergrundbild zu nutzen
    Entscheidend ist, dass Reddit in Ladybird funktioniert, und das ist enorm
    Ich weiß nicht, ob YouTube funktioniert, aber ich hoffe, dass auch das läuft; es fühlt sich so an, als würde Ladybird wirklich alltagstauglich werden
    Danke auch an https://jakubsteplow.ski/, der Ladybird unterstützt hat
    Ich würde Menschen, die an Open-Source-Projekte spenden, gern aktiv sichtbarer machen als etwa Google-Werbung, und ich wünsche Jakub nur das Beste; außerdem hoffe ich, dass auch andere unabhängig Projekte wie Ladybird unterstützen
    Danke auch an die Human Rights Foundation https://hrf.org/program/ai-for-individual-rights/
    Dass Browser fast in einem einzelnen oder gemeinsamen Oligopol steckten und eine Person es bis hierher gebracht hat, ist erstaunlich und wirklich inspirierend
    • Ich mag EVA, würde es aber mit Vorsicht empfehlen
      Es hat im Wesentlichen zwei Seiten: zum einen Mecha-/Alien-/Monster-SF mit starker Ästhetik, zum anderen ein persönliches Drama über Selbsthass und Einsamkeit
      Für die meisten dürfte die erste Seite anziehender sein, aber was bis heute nachwirkt, ist die zweite
      Falls man es schauen will, sollte man auf die Reihenfolge achten
      Es gibt die Zeitleiste aus der originalen TV-Serie und dem Film „End of Evangelion“ sowie separat die Filmreihe „Rebuild of Eva“, die als vollständiger Reboot beginnt und irgendwie zum finalen Reboot/Remake/Nachfolger des Originals wird
    • https://ladybird.org/#about
      Auf die Frage „Wie viele Menschen arbeiten heute an Browsern?“ lautet die Antwort, dass Ladybird derzeit 8 bezahlte Vollzeit-Ingenieure sowie eine große Community freiwilliger Mitwirkender hat
    • YouTube funktioniert in Ladybird
      Das meiste andere auch, aber abgesehen von der Geschwindigkeit ist das größte Problem, dass viele „Bist du ein Mensch?“-Prüfungen in Ladybird nicht richtig funktionieren