1 points par GN⁺ 1 일 전 | 1 commentaires | Partager sur WhatsApp
  • En avril, Ladybird a fusionné 333 PR provenant de 35 contributeurs, et a reçu de nouveaux soutiens de 50 000 dollars de la Human Rights Foundation et de 1 000 dollars de Jakub Stęplowski
  • Un lecteur PDF intégré, l’autocomplétion de la barre d’adresse basée sur l’historique, un frontend Linux GTK4/libadwaita et une interface de gestion about:bookmarks ont été ajoutés, élargissant les fonctions de navigation et l’interface desktop
  • Le parseur HTML effectue désormais un parsing progressif du corps de réponse, un parseur spéculatif précharge les ressources, et la compilation de premier niveau de JavaScript a été déplacée vers un thread d’arrière-plan, réduisant d’environ 200 ms le temps du thread principal lors du chargement de YouTube
  • Le moteur JavaScript améliore les performances sur Speedometer et sur le chargement de sites réels grâce à un cache for-in, un allocateur de registres en O(1), le partage d’identifiants en zero-copy, JS::Substring lazy et des améliorations du cache des vues de typed arrays
  • Cache/CacheStorage, image-set(), le positionnement d’ancrage CSS, le DNS asynchrone, le rendu GPU basé sur dmabuf, l’adoption par défaut de mimalloc et l’obligation d’utiliser Rust ont été intégrés, et le score WPT est passé de 2 003 537 à 2 067 263

Taille du développement et soutiens

  • En avril, Ladybird a fusionné 333 PR provenant de 35 contributeurs, dont 7 ont effectué leur premier commit sur Ladybird
  • Parmi les nouveaux soutiens, la Human Rights Foundation a apporté 50 000 dollars via son programme « AI for Individual Rights », et Jakub Stęplowski a donné 1 000 dollars
  • Ladybird est entièrement financé par les soutiens d’entreprises et de particuliers qui défendent le web ouvert

Fonctions de navigation et frontends

  • Lecteur PDF intégré

    • Les PDF sont désormais rendus directement dans la page via le lecteur pdf.js embarqué (#9132)
    • pdf.js est un lecteur PDF écrit uniquement en JavaScript, HTML et CSS, qui offre la navigation entre pages, la sélection de texte, le zoom et la recherche dans le document
    • Le chargement du manuel ISA d’Intel avec pdf.js a mis en évidence des pistes d’amélioration dans le cache des vues de typed arrays et l’invalidation de :has()
  • Historique et autocomplétion de la barre d’adresse

    • Lors de la saisie dans la barre d’adresse, des suggestions enrichies basées sur l’historique s’affichent, incluant le favicon et le titre des pages déjà visitées, des raccourcis vers les moteurs de recherche et une complétion d’URL classique (#8933)
    • Le HistoryStore basé sur SQLite enregistre pour toute navigation le titre, le favicon, le nombre de visites et la date de la dernière visite
    • L’option « Clear browsing history » a été reliée à la page des paramètres de confidentialité, et les interfaces Qt comme AppKit affichent désormais les nouvelles lignes enrichies
  • Frontend GTK4 / libadwaita

    • Un nouveau frontend Linux basé sur GTK4 et libadwaita a été ajouté à Ladybird, proposé aux côtés du frontend Qt existant (#8691)
    • Il s’inspire de GNOME Web (Epiphany) et suit les directives de conception de GNOME, avec un menu hamburger et des onglets AdwTabView à la place d’une barre de menus
    • Il fournit l’autocomplétion de la barre d’URL et l’icône de sécurité, la recherche dans la page, le plein écran, les menus contextuels, les boîtes de dialogue alert/confirm/prompt/color/file, le presse-papiers, les fenêtres multiples, les thèmes clair/sombre et la mise à l’échelle DPR
    • Il reste à un stade précoce et n’a pas encore atteint la parité fonctionnelle avec les frontends Qt et AppKit
  • Favoris

    • Une interface de gestion a été ajoutée aux favoris introduits le mois dernier
    • Les favoris et dossiers peuvent être gérés depuis la page about:bookmarks (#8825)
    • La nouvelle page prend en charge l’import et l’export des favoris (#8938)
    • Des menus contextuels ont été ajoutés pour modifier les favoris et les dossiers (#8715)
    • Un horodatage date_added a été ajouté à tous les favoris et dossiers (#8867)
    • La barre des favoris prend en charge l’ouverture dans un nouvel onglet, la copie d’URL, le clic molette et l’ouverture dans un nouvel onglet via Ctrl/Cmd+clic (#8758)
    • L’API HTML5 de glisser-déposer a été reliée, about:bookmarks l’utilise pour le réordonnancement, et elle fonctionne aussi sur les pages web classiques (#8783)

Analyse HTML, exécution des scripts et pipeline de rendu

  • Parsing HTML spéculatif et progressif

    • Le parseur HTML a été modifié pour consommer progressivement le corps de la réponse (#9151)
    • Les octets passent par un décodeur de texte en streaming avant d’entrer dans le tokenizer par blocs, et lorsque l’entrée est insuffisante, le tokenizer s’arrête puis reprend quand davantage de données arrivent
    • Cela remplace l’ancien modèle qui attendait la réception du corps complet avant de commencer le parsing
    • Un parseur HTML spéculatif a également été implémenté (#9114)
    • Quand le parseur principal est bloqué par un script externe synchrone, un tokenizer séparé parcourt en avance l’entrée qui n’a pas encore été analysée et émet des récupérations spéculatives pour les ressources <script src>, <link rel=stylesheet|preload> et <img src>
    • Il suit <base href> et ignore correctement l’intérieur des templates ainsi que le foreign content
    • Le parseur spéculatif est relié à la preload map du document, de sorte que les ressources découvertes spéculativement sont dédupliquées avec les récupérations ultérieures du parseur normal (#9164)
  • Compilation JavaScript hors thread

    • La génération du bytecode du code de premier niveau des scripts récupérés s’exécute dans le pool de threads d’arrière-plan (#9118)
    • Les threads de travail produisent le bytecode et les données nécessaires à la création de Executable, tandis que les opérations touchant à la VM ou au tas du GC restent sur le thread principal
    • Cela prend en charge les classic scripts, les modules et les IIFE de premier niveau, et le seul chargement de YouTube déplace environ 200 ms de temps du thread principal vers des threads d’arrière-plan
  • Rastérisation par Navigable

    • Chaque Navigable est rastérisé indépendamment sur son propre thread (#8793)
    • Auparavant, les iframe étaient peints de manière synchrone comme des display lists imbriquées dans la display list du parent, ce qui n’activait que le thread de rendu du traversable de niveau supérieur
    • La display list du parent référence désormais la sortie rastérisée de chaque iframe via ExternalContentSource, de sorte que l’invalidation d’un iframe ne nécessite plus de réécriture du parent
    • Au-delà du parallélisme, c’est aussi un travail préparatoire pour déplacer les iframe vers des processus sandbox séparés
  • Peinture GPU basée sur dmabuf sous Linux

    • Sur les builds Linux Vulkan, WebContent peignait sur une surface Skia adossée au GPU, mais comme le tampon partagé avec le processus UI était un bitmap CPU, chaque flush entraînait un readback GPU-vers-CPU
    • SharedImage peut désormais contenir des handles Linux dmabuf, ce qui permet aux front/back buffers de rester sur le GPU jusqu’au processus UI (#8917, #8920)

Performances et compatibilité du moteur JavaScript

  • Optimisation des appels JS-vers-JS

    • Plusieurs PR ont été appliquées pour que les instructions Call, Return et End restent dans l’interpréteur assembleur AsmInt dans les cas courants (#8891, #8909, #8912)
    • La sauvegarde/restauration des registres utilise des paired load/store ARM64 (ldp/stp) ajustés manuellement
    • Les appels de fonctions natives sont aussi dispatchés directement depuis AsmInt via une nouvelle variante RawNativeFunction contenant un pointeur de fonction classique au lieu de AK::Function (#8922)
  • Allocateur de registres de bytecode en O(1)

    • Generator::allocate_register parcourait le pool disponible pour trouver le registre au plus petit numéro, et cette seule fonction consommait environ 800 ms pendant le chargement de x.com
    • Une fois la période d’équivalence du pipeline C++/Rust terminée, l’allocateur a été remplacé par une simple pile LIFO (#9007)
  • Itération for-in mise en cache

    • Les sites for (key in obj) mettent en cache un snapshot aplati des clés énumérables, réutilisé tant que la shape du receiver, le stockage indexé et la chaîne de prototypes restent inchangés (#8856)
    • Speedometer 2 passe de 67.7 à 73.6, et Speedometer 3 de 4.11 à 4.22
  • Autres améliorations du moteur

    • Le parseur partage désormais les noms d’identifiants en zero-copy à travers le lexer, le parseur et le collecteur de scopes, ce qui rend le parsing 1,14× plus rapide sur un corpus JS de sites web et réduit la RSS de 282 Mo (#8801)
    • Les concaténations de chaînes courtes sautent la représentation rope quand le résultat sera de toute façon observé comme une flat string, avec un gain de 2,13× dans des boucles serrées a + b (#9184)
    • Les arrow functions à lexical-this n’allouent pas d’environnement de fonction à chaque appel, ce qui apporte une amélioration de 2,13× en microbenchmark (#9192)
    • Les sparse arrays n’imposent pas de coût immédiat pour les holes, et Array(20_000_000) reste principalement sous forme de métadonnées au lieu d’un travail proportionnel à 20 millions d’éléments virtuels (#8847)
    • Un nouveau type lazy JS::Substring prend en charge les captures regexp ainsi que les builtin de chaînes comme slice, split et l’accès indexé, avec un gain de 1,066× sur le benchmark regexp d’Octane (#8863)
    • Les positions source sont désormais préservées de bout en bout dans la source map du bytecode, ce qui fait gagner environ 250 ms sur x.com (#9027)
    • Le TransferArrayBuffer en zero-copy fait gagner environ 130 ms au chargement de YouTube (#9088)
    • La vue de typed-array mise en cache est passée de WeakHashSet à une intrusive list, ce qui fait gagner environ 250 ms lors du chargement du PDF Intel ISA dans pdf.js (#9180)
    • Au lieu d’allouer pour chaque Promise deux cellules PromiseResolvingFunction avec des closures AK::Function non capturantes, le système utilise désormais des fonctions statiques dispatchées via un enum Kind, supprimant ainsi les allocations par resolver (#9188)
    • Le marquage de la table de propriétés des shapes non-dictionary est ignoré, ce qui réduit le temps de GC de 1,3 s pendant le chargement de maptiler.com (#9044)
    • Un fast path a été ajouté pour Array.prototype.indexOf sur les packed arrays (#9123)
    • Array.prototype.sort réutilise l’UTF-16 mis en cache au lieu de retranscoder à chaque comparaison (#9036)
    • Les imports de WASM, JSON et modules CSS ont été ajoutés (#6029)
    • La prise en charge de la proposition ShadowRealm a été supprimée, le processus de standardisation étant au point mort (#8753)

API de la plateforme web et CSS

  • Cache et CacheStorage

    • Cache et CacheStorage ont été implémentés de bout en bout (#8745)
    • 9 méthodes, dont open, has, delete, keys, match, matchAll, add, addAll et put, fonctionnent sur la base d’un stockage temporaire en mémoire
  • Fonctionnalités CSS et correctifs de rendu

    • Une prise en charge de base des formes standard et préfixées -webkit- de image-set() a été ajoutée ; au moment du paint, la résolution candidate la mieux adaptée au device pixel ratio est sélectionnée, et les types MIME non pris en charge sont ignorés (#9090)
    • Grâce à la prise en charge de image-set(), l’image d’en-tête de gocomics.com s’affiche
    • Une prise en charge initiale de position-anchor et du CSS anchor positioning a été ajoutée, corrigeant la position de la main et de l’arme sur cssdoom.wtf (#8686)
    • L’interpolation des couleurs a été réécrite pour se conformer à css-color-4 : elle se fait désormais en float plutôt qu’en u8, avec une gestion cohérente des missing/powerless components, du sRGB out-of-gamut et du multiplicateur alpha (#8934)
    • Les anciens attributs HTML de présentation comme align et bgcolor n’écrivent plus directement dans les propriétés déjà passées par la cascade ; ils passent désormais par la cascade comme des déclarations auteur classiques, ce qui permet à la substitution var() et au fallback invalid-at-computed-value-time de fonctionner correctement (#9176)
    • Ce changement dans la cascade des presentational hints a corrigé un crash sur html.spec.whatwg.org
    • <thead>, <tbody>, <tfoot> et <tr> prennent désormais en compte l’attribut de présentation align, corrigeant la disposition des boutons sur bricklink.com (#9177)
    • L’interpolation de stroke-dasharray permet désormais une animation fluide des tirets SVG (#9133)
    • Les éléments ayant l’attribut autofocus reçoivent effectivement le focus au chargement de la page (#9016)
    • Les marqueurs de liste des textes RTL sont placés à droite, ce qui corrige le rendu des listes sur la Wikipédia arabe (#9099)
    • La baseline des conteneurs inline flex/grid est désormais dérivée de la première line box de l’enfant, et non de la dernière ligne renvoyée à la ligne, ce qui corrige l’alignement du texte des liens et des icônes sur nos.nl (#9183)

Réseau et invalidation de style

  • Réseau

    • getaddrinfo ne bloque plus l’event loop
    • LibDNS exécute désormais les lookup dans un thread pool, émet les requêtes A et AAAA en parallèle et fusionne les lookup simultanés pour un même nom (#9109)
    • Le chemin de preconnect de RequestServer a été corrigé pour ne plus contourner le resolver, de sorte que le threaded resolver de libcurl, qui provoquait un pthread_join sur le main thread, passe désormais par le même chemin de pool DNS (#9109)
    • Quand WebContent était plus lent que le réseau, l’évacuation des données de réponse en file d’attente dans RequestServer était en O(n²), et l’ouverture d’une vidéo YouTube consommait environ 30 secondes dans memcpy et 3 secondes dans Vector::remove
    • AllocatingMemoryStream a été converti en liste chaînée simple de chunks, ce qui ramène la consommation à O(1) (#9028)
    • L’en-tête Accept des requêtes d’image annonce désormais AVIF et WebP pour s’aligner sur les autres moteurs, certains CDN utilisant cet en-tête pour décider de servir des formats modernes ou un fallback JPEG (#9046)
  • Invalidation de style

    • L’invalidation de sélecteur existante était simple en partant du principe qu’un sélecteur ne regarde que vers le bas, mais avec :host et :has(), une modification de descendant peut changer le résultat de :has() sur un ancêtre, ce qui nécessite désormais une traversée vers le haut
    • Les caches de tous les scopes de style ne sont plus reconstruits lorsqu’une mutation de stylesheet ne modifie qu’un seul scope, ce qui réduit la reconstruction du cache de règles sur Reddit de 13,2 s à 3,2 s (#9138)
    • L’invalidation structurelle entre siblings ne se propage plus aux descendants qui n’observent pas la position, ce qui réduit de 11 % les recomputations inutiles dans l’infinite scroll de Reddit (#9155)
    • L’invalidation sur mutation de :has() saute désormais les anchors non affectés, avec une forte baisse mesurée sur azure.com (#9168)
    • Dans le PDF Intel ISA, les visites de liste d’enfants pour :has() sont passées de 71k à 1,6k, ce qui économise environ 650 ms au chargement de pdf.js (#9179)
    • Une nouvelle batterie de tests d’invalidation structurelle a révélé plusieurs invalidations manquantes, désormais corrigées (#9095)
    • S’y ajoutent de petites améliorations autour de hover, du scope de mutation de stylesheet, de la map de custom properties et du diff des styles calculés (#9077, #9049, #9079, #9080, #9141)

Allocation mémoire et système de build

  • mimalloc comme allocateur par défaut

    • Le code C++ et Rust partage désormais une unique instance d’allocateur mimalloc v2, chacun sans passer par le system allocator (#8752)
    • Comme malloc() n’est pas surchargé à l’échelle du système, les bibliothèques tierces conservent leur propre contrat d’allocateur
    • Les benchmarks JS s’améliorent globalement
  • Rust devient obligatoire et nettoyage du système de build

    • L’option de build ENABLE_RUST a été supprimée, ce qui rend Rust obligatoire (#8742)
    • Le système de build GN a été entièrement supprimé, CMake restant comme référence unique (#8931)
  • Changements liés au GC et à la mémoire

    • La compilation utilise -ftrivial-auto-var-init=zero, ce qui écrase à 0 les anciens pointeurs GC à l’entrée des fonctions afin que le scanner conservatif de pile les retrouve moins souvent (#9171)
    • La propriété UsedValues, rarement utilisée, a été déplacée derrière un pointeur lazy, ce qui réduit la struct de 424 octets à 176 octets et fait passer LayoutState::populate_node_from() de 139 ms à 65 ms lors du chargement de sainsburys.co.uk (#9104)
    • Les chunks du corps fetch, qui allouaient 7 objets GC par chunk en passant par le chemin pull-promise, sont désormais injectés directement dans le byte stream controller (#9169)

Comportement amélioré des sites

  • Reddit

    • Le carrousel de galerie d’images de Reddit fonctionne désormais, et deux bugs de layout sans rapport ont été corrigés autour du matching ::slotted() et d’un descendant en position absolue dans une inline fragmentée (#9148)
    • Grâce à TextDecoderStream, la SPA n’intercepte plus les clics sur les liens, ce qui permet d’ouvrir les commentaires
    • L’infinite scroll bénéficie lui aussi du travail sur l’invalidation structurelle
  • YouTube

    • YouTube bénéficie de la compilation JS top-level hors thread, de la décompression WOFF2 hors thread, d’une réduction du fanout des fetch @font-face, d’une correction du memory churn de RequestServer et du TransferArrayBuffer zero-copy
    • La décompression WOFF2 hors thread fait aussi gagner environ 170 ms sur Gmail (#8976)
    • Au chargement initial, le fanout des fetch @font-face est passé de 177 à environ 9 (#9032)
  • Autres sites

    • Sur gocomics.com, l’image d’en-tête s’affiche grâce à image-set()
    • Sur yandex.com/maps, le rendu WebGL des vector tiles fonctionne grâce à des correctifs WebGL, dont l’extension WEBGL_debug_renderer_info (#9043)
    • Sur strava.com, la connexion fonctionne car Navigator.getBattery lève désormais le type d’erreur imposé par la spec au lieu de sa propre erreur (#8770)
    • GitHub Insights se charge environ 100 ms plus vite grâce au cache de sélecteurs de Element.matches() et .closest() (#8987)
    • La page de comparaison de portables de tweakers.net est environ 31 % plus rapide grâce à une recherche indexée des noms de propriétés de HTMLFormElement (#9009)
    • neon.com ne plante plus (#8812)
    • Sur channel4.com, un correctif de résolution des auto-margins en flex règle le problème d’alignement vertical du texte de catégorie (#9050)
    • Cloudflare Turnstile n’est toujours pas franchi, mais l’échec est bien plus rapide grâce à la gestion des auth schemes, à l’optimisation de Array.prototype.shift() et au durcissement des gestionnaires d’événements UA pour les éléments <input> de type range et number (#9063)

WPT et autres évolutions de la plateforme

  • Web Platform Tests

    • Le score WPT est passé de 2,003,537 à 2,067,263, soit une hausse de 63 726 subtests ce mois-ci
    • Cela dit, WPT a intégré en amont test262, la suite officielle de conformité ECMAScript, ce qui a ajouté 53 207 subtests JavaScript
    • Ladybird exécute test262 séparément depuis des années et la conformité de LibJS est déjà bonne, si bien qu’il en réussit 52 045, soit 97,8 %
    • Sur les 63,7k de hausse, environ 52k proviennent de l’import de test262, et les 11,7k restants correspondent à de réels progrès de la plateforme navigateur
    • Avec l’import de test262, WPT mesure désormais la conformité JavaScript en même temps que le reste de la plateforme
  • Texte, layout, processus et UI

    • La sélection et le hit testing du texte avec ligatures n’assument plus une code unit par glyphe, mais parcourent les grappes de graphèmes et répartissent l’avance des glyphes entre ces graphèmes (#8829)
    • Définir innerHTML sur une shadow root n’invalide plus tout l’arbre de layout du document, ce qui réduit de 21 % le temps de layout-and-paint sur pomax.github.io/bezierinfo (#9191)
    • Naviguer un onglet popup vers un autre site ne met plus fin au processus WebContent du parent (#8730)
    • Dans l’interface Qt, Ctrl+Tab et Ctrl+Shift+Tab permettent désormais de parcourir les onglets ouverts (#8704)
    • Il est possible de faire défiler en maintenant le bouton central de la souris enfoncé et en glissant, ou d’entrer en mode autoscroll par un clic sur place (#8881, #8928)
    • Quand la saisie dans la barre d’adresse ne peut pas être assainie en URL ou en requête de recherche, une page d’erreur appropriée s’affiche au lieu d’ignorer silencieusement l’entrée (#9072)
    • TextDecoderStream, pendant streaming de TextDecoder, a été implémenté, avec mise en attente des UTF-8 partiels aux frontières de chunks, ce qui permet désormais de modifier les commentaires sur Reddit (#9143)
    • Les messages BroadcastChannel inter-processus sont désormais routés par IPC entre les processus WebContent et WebWorker, de sorte que les listeners se comportent comme dans les autres navigateurs, quel que soit le processus où ils se trouvent (#8865)

1 commentaires

 
GN⁺ 1 일 전
Avis Hacker News
  • Si vous voulez un navigateur sans JavaScript, le prototype de navigateur développé par Dioxus devient lui aussi assez prometteur
    Dioxus, un framework GUI Rust, est en cours de développement comme composant de son moteur de rendu natif et suit une direction où il cherche à créer lui-même une alternative à Skia, comme Flutter, mais sur le web il fonctionne selon les standards HTML/CSS au lieu d’utiliser uniquement un canvas comme Flutter web
    Il ne dépend pas de bases de code de navigateurs existantes comme Chromium, Gecko ou WebKit, et s’apparente à une implémentation presque reconstruite depuis zéro en s’appuyant sur des crates Rust comme stylo et taffy utilisées par Servo : https://github.com/DioxusLabs/blitz (/apps/browser)
  • Dans le développement d’un navigateur, la partie la plus difficile a toujours été la compatibilité web artificielle
    De nombreux sites bloquent délibérément le chargement sur certains navigateurs et n’autorisent que Chromium, et c’est la réalité à laquelle Ladybird va se heurter, ainsi qu’un facteur majeur qui empêche l’arrivée de nouveaux concurrents
    Le DRM Widevine est lui aussi très difficile à obtenir pour un nouveau navigateur, et même Zen Browser, avec 10 millions d’utilisateurs, n’a pas réussi à l’obtenir
    • Malheureusement, la nouvelle génération n’a pas retenu la leçon d’IE, et devient la première à se plaindre dès que l’autre camp ne suit pas le mouvement de la plateforme Chrome OS
    • Je ne sais pas à quel point ce type de blocage est réellement fréquent
      J’utilise Firefox depuis 20 ans et je n’ai jamais vu un site me demander de passer à Chromium pour des raisons de compatibilité
    • Si ce type de barrière artificielle affecte suffisamment l’interopérabilité, alors 99 % des obstacles sont déjà franchis, et la plupart peuvent être contournés par l’usurpation de la chaîne User-Agent
      Widevine est bien une vraie barrière, mais en pratique cela bloque surtout la lecture 4K sur quelques sites de streaming comme Netflix ou Disney
      Le fait que Zen ait tout de même réuni 10 millions d’utilisateurs sans Widevine montre que ce n’est pas forcément si crucial
    • C’est précisément pour cette raison que Ladybird a récemment commencé à se déclarer comme Chrome
    • Pour des tests de compatibilité, on peut imiter le User-Agent
      Si l’on contrôle le navigateur lui-même, il n’y a quasiment rien d’impossible en dehors des problèmes liés au DRM
  • Cela a l’air de devenir vraiment utilisable
    Ce genre de billet me rappelle le plaisir de lire des mises à jour d’émulateurs de jeux
    Du style « on a corrigé le bug X, ce qui permet à Y de fonctionner correctement, et par conséquent le jeu Z se lance », sauf qu’ici l’un des correctifs concerne CSS Doom, donc il y a bien un certain chevauchement avec le jeu vidéo
    • C’est une comparaison juste
      J’ai déjà entendu Andreas dire à plusieurs reprises que créer un navigateur revenait à créer un émulateur
      Chaque site utilise des fonctionnalités différentes de façons différentes, et il compare les sites web à des ROM
  • Ladybird progresse vraiment très bien
    Je suis un utilisateur de longue date de Firefox, mais dès que Ladybird entrera dans une alpha très précoce et que des builds précompilés commenceront à sortir, je compte absolument l’essayer tôt
    • Si vous voulez déjà le faire tourner à ce stade, la compilation locale est simple, il suffit de quelques commandes pour installer les dépendances et lancer les scripts de build : https://github.com/LadybirdBrowser/ladybird/blob/master/Docu...
    • Mozilla a au moins besoin d’un sérieux électrochoc
    • Le compiler soi-même est assez facile aussi, surtout si vous demandez à Claude Code de le faire
  • GTK4 / libadwaita frontend, ça fait plaisir
    Je préfère l’UI/UX GTK à Qt, donc j’attends avec intérêt les progrès de ce côté
  • strava.com : Login works now that Navigator.getBattery throws the spec-mandated error type instead of one of our own (#8770).
    Pourquoi Strava voudrait connaître le niveau de ma batterie ?
    • Le plus probable est qu’ils essaient de l’utiliser pour générer une empreinte unique à des fins de suivi
    • Ils utilisent peut-être l’API Battery comme heuristique pour choisir une version basse consommation du site
      Il existe peut-être une version web destinée aux pays en développement, ou ils veulent réduire la fréquence des demandes de localisation si la batterie est faible pour économiser de l’énergie
      Ce n’est qu’une supposition, mais qu’un site comme Strava demande des informations sur la batterie n’est pas totalement absurde, même si, globalement, cela reste un peu suspect
    • Strava est un service de suivi de trajets
      En supposant qu’on puisse aussi l’utiliser via le site web, ils cherchent probablement à ajuster la fréquence des relevés de position pour trouver un compromis entre précision et consommation d’énergie
    • Les bots qui tentent de forcer des comptes n’implémentent peut-être pas cette API comme un vrai appareil
  • Article précédent : https://news.ycombinator.com/item?id=47985497
  • J’aime vraiment beaucoup la direction que prend SerenityOS, et j’espère que cette même concentration sera maintenue dans le navigateur Ladybird
  • Félicitations
    Cela dit, la capture d’écran des puces de liste en texte RTL semble identique
    Dans les deux cas, les puces sont à gauche
  • https://ladybird.org/assets/img/newsletter-apr-2026-reddit-g...
    J’ai énormément de respect pour la personne qui a utilisé Evangelion r/unixporn pour les tests Reddit de Ladybird
    Je n’ai pas tant regardé Evangelion que ça, mais j’ai vu d’innombrables documentaires explicatifs et je l’aime suffisamment pour l’avoir eu un temps en fond d’écran
    Le point essentiel, c’est que Reddit fonctionne dans Ladybird, ce qui est énorme
    Je ne sais pas si YouTube fonctionne, mais j’espère que oui, et on commence vraiment à sentir que Ladybird pourrait devenir utilisable au quotidien
    Merci aussi à https://jakubsteplow.ski/ pour son soutien à Ladybird
    J’aimerais qu’on mette davantage en avant, de manière proactive, les gens qui font des dons aux projets open source plutôt que des choses comme la publicité Google, et je souhaite le meilleur à Jakub, en espérant que d’autres soutiennent eux aussi indépendamment des projets comme Ladybird
    Merci aussi à la Human Rights Foundation et à son programme https://hrf.org/program/ai-for-individual-rights/
    Le fait qu’une seule personne ait pu aller aussi loin dans un monde des navigateurs proche d’un monopole ou d’un oligopole est impressionnant et vraiment inspirant
    • J’aime EVA, mais je la recommande avec prudence
      Il y a en gros deux aspects : d’un côté une SF mécha/extraterrestres/monstres avec une esthétique formidable, de l’autre un drame personnel centré sur la haine de soi et la solitude
      Pour la plupart des gens, le premier aspect sera sans doute le plus attirant, mais c’est le second qui continue de marquer durablement
      Si vous regardez, faites attention à l’ordre de visionnage
      Il y a la chronologie de la série TV originale suivie du film « End of Evangelion », et séparément la série de films « Rebuild of Eva », qui commence comme un reboot complet avant de devenir, d’une certaine manière, le reboot/remake/suite finale de l’œuvre originale
    • https://ladybird.org/#about
      À la question « combien de personnes travaillent aujourd’hui sur le navigateur ? », il est indiqué que Ladybird compte actuellement 8 ingénieurs salariés à temps plein, ainsi qu’une importante communauté de contributeurs bénévoles
    • YouTube fonctionne dans Ladybird
      La plupart des choses fonctionnent aussi, mais en dehors de la vitesse, le principal problème est que beaucoup de vérifications “êtes-vous humain ?” ne marchent pas correctement dans Ladybird