14 points par GN⁺ 2024-08-27 | 2 commentaires | Partager sur WhatsApp
  • Première contribution à un grand projet open source en corrigeant un bug du navigateur web Chromium/Google Chrome.
  • Une expérience singulière, très différente des précédents travaux en open source.
  • L’ensemble du processus a été documenté pour aider les développeurs qui voudraient tenter un travail similaire.

Le bug

  • Le bug corrigé concernait un problème d’intégration entre les DevTools de Chromium et les requêtes réseau de worklets comme AudioWorklet, exécutés en dehors du thread principal.
  • Les requêtes réseau créées par les worklets n’apparaissaient pas du tout dans l’onglet réseau des DevTools.
  • L’option "Disable Cache" était ignorée, si bien que du code obsolète n’était pas évincé du cache pendant le développement.
  • Le problème survenait régulièrement dans plusieurs projets et correspondait à au moins trois rapports d’erreur.
  • La reproduction minimale était simple : il suffisait d’utiliser un script avec des en-têtes de cache pour créer un AudioWorkletProcessor, puis de recharger la page.

Télécharger et compiler le code de Chromium

  • La première étape pour corriger réellement le bug a été de compiler Chromium depuis zéro.
  • Heureusement, une documentation détaillée expliquait comment le compiler sur les principaux systèmes d’exploitation.
  • Malgré l’utilisation d’une machine puissante, la première compilation a pris plus de 45 minutes, avec plus de 50 Go de RAM utilisés et plus de 100 Go d’espace disque nécessaires.
  • Les compilations incrémentales se terminaient rapidement, en moins de 10 secondes.
  • Même si la compilation prenait du temps, l’opération restait pratique et largement automatisée une fois tous les prérequis installés.

Trouver et corriger le bug

  • Une fois l’environnement de build opérationnel, l’exploration du code a commencé.
  • La base de code de Chromium est immense, et il était difficile d’en saisir la structure d’ensemble.
  • Les nombreuses indirections et la modularisation du code rendaient la navigation difficile, avec un recours étendu au dynamic dispatch.
  • Le débogage par printf a été utilisé pour suivre les requêtes réseau depuis leur point de départ jusqu’au moment où elles étaient réellement créées ou récupérées depuis le cache.
  • Le problème venait du fait que InspectorNetworkAgent n’était pas créé pour les cibles worklet.
  • Pour corriger cela, le code a été modifié afin que InspectorNetworkAgent accepte WorkerOrWorkletGlobalScope au lieu de WorkerGlobalScope.
  • Mais cette correction ne suffisait pas : après vérification du code TypeScript du frontend des DevTools, il a aussi été constaté que Capability.Networking manquait pour Type.Worklet.
  • Après cet ajout, le problème a été entièrement résolu.

Tests et revue de code

  • Après avoir nettoyé les logs de débogage et vérifié le diff final, le processus de revue et de fusion du code a été exploré.
  • Un compte a été créé sur le site de revue de code Chromium Gerrit, et la CLA a été signée.
  • Un reviewer a été choisi, puis le code écrit a été revu pour ajouter les tests nécessaires.
  • Un nouveau test a été rédigé en s’appuyant sur plusieurs tests JavaScript existants qui vérifiaient les fonctions d’inspection réseau des DevTools.
  • Au final, la revue de code a reçu l’approbation "LGTM", et la PR a été fusionnée.

Deuxième CL

  • Une autre CL a été rédigée dans le dépôt devtools_frontend afin d’ajouter Capability.Network aux cibles DevTools de type worklet.
  • Le déroulement a été similaire à celui de la première PR, et la fusion a eu lieu automatiquement après le passage des tests CI.

Publication

  • Il a ensuite fallu attendre qu’une version de Chrome Canary intégrant la correction soit publiée.
  • Chrome Canary étant mis à jour deux fois par jour, la correction a fini par être confirmée.
  • La correction complète a pris plus d’un mois et devait être intégrée au canal stable avec Chrome 130.

Résultat et rétrospective

  • Corriger ce bug a demandé du temps et beaucoup d’efforts, mais l’expérience a été vraiment unique.
  • Cela a permis de voir comment le logiciel est développé à l’échelle de Chromium.
  • Le fait que ce code soit intégré à des centaines de millions, voire des milliards d’appareils dans le monde, a constitué une forte motivation personnelle.
  • Cette expérience a permis d’apprendre à contribuer à Chromium, et d’autres corrections de bugs devraient être tentées à l’avenir.

2 commentaires

 
huiya 2024-08-27

C’est impressionnant.

 
GN⁺ 2024-08-27
Avis Hacker News
  • Expérience de travail sur la base de code Chromium

    • Utilise Sublime Text pour travailler sur le code comme du texte brut
    • Avec VS Code, il est possible d’utiliser des fonctionnalités comme aller à la définition ou à la déclaration d’une fonction
    • Recommande son article à ceux qui veulent créer un navigateur basé sur Chromium
  • Problèmes avec l’extension C++ de VS Code

    • L’extension C++ de VS Code ne fonctionne pas correctement à cause de la taille de la base de code
    • Problème où les cœurs CPU restent bloqués à 100 %
    • L’outil Chromium Code Search est utile
  • Expérience avec un bug de Chrome

    • Sur Linux, un bug provoque la saisie de « ±±±±±±+... » dans les navigateurs basés sur Chrome
    • Cela ne se produit pas dans les autres applications
    • Souhaite reproduire et corriger le bug
  • Première expérience avec la base de code Chromium

    • Explorer la base de code Chromium pour la première fois n’a pas été difficile
    • S’est référé au code de Chrome pour corriger un bug de collage d’image sous Windows
  • Exigences de build de Chrome

    • Les exigences de build de Chrome sont très élevées
    • Un poste de travail hautes performances est nécessaire
    • Firefox aussi demande beaucoup de temps de build
  • Débogage avec printf

    • Il n’y a pas de honte à utiliser le débogage avec printf
    • Le débogage avec printf est très efficace
  • Recommandation d’utiliser un navigateur de code en ligne

    • Recommande d’explorer le code via un navigateur de code en ligne
    • L’URL cs.chromium.org est facile à retenir
  • Différence entre WorkletGlobalScope et WorkerGlobalScope

    • Il a fallu du temps pour comprendre la différence entre ces deux termes
    • La convention de nommage n’est pas bonne
  • Suggestion de corriger des bugs Chromium

    • Recommande de corriger des bugs Chromium
    • Chrome se met à jour rapidement, donc un bug peut être corrigé en 4 à 6 semaines
    • Souhaite trouver des personnes prêtes à contribuer à la correction de bugs
  • Expérience avec un bug de copie d’image

    • Dans les navigateurs basés sur Chrome, l’interface se fige lors de la copie d’images vers le presse-papiers
    • Cela est dû à un problème d’encodage PNG
    • Le problème a été résolu en passant le niveau de compression à 0
    • Firefox n’a pas ce délai et place le fichier image d’origine dans le presse-papiers