- 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
C’est impressionnant.
Avis Hacker News
Expérience de travail sur la base de code Chromium
Problèmes avec l’extension C++ de VS Code
Expérience avec un bug de Chrome
Première expérience avec la base de code Chromium
Exigences de build de Chrome
Débogage avec printf
Recommandation d’utiliser un navigateur de code en ligne
Différence entre WorkletGlobalScope et WorkerGlobalScope
Suggestion de corriger des bugs Chromium
Expérience avec un bug de copie d’image