- Contribuyó por primera vez a un proyecto grande de código abierto corrigiendo un bug en el navegador web Chromium/Google Chrome.
- Fue una experiencia única, muy distinta a trabajos previos en código abierto.
- Documentó todo el proceso para ayudar a otros desarrolladores que quieran intentar hacer algo similar.
El bug
- El bug corregido era un problema de integración entre Chromium DevTools y las solicitudes de red de worklets como
AudioWorklet, que se ejecutan fuera del hilo principal.
- Las solicitudes de red creadas por el worklet no aparecían en absoluto en la pestaña de red de DevTools.
- La opción "Disable Cache" era ignorada, por lo que durante el desarrollo el código antiguo no se eliminaba del caché.
- Este problema ocurría de forma constante en varios proyectos y coincidía con al menos tres reportes de errores.
- La reproducción mínima era sencilla, y se podía recrear usando un script con encabezados de caché configurados para crear un
AudioWorkletProcessor y recargando la página.
Descarga y compilación del código de Chromium
- El primer paso para corregir realmente el bug fue compilar Chromium desde cero.
- Por suerte, había documentación detallada sobre cómo compilarlo en los principales sistemas operativos.
- Aunque usó una computadora potente, la primera compilación tardó más de 45 minutos, requirió más de 50 GB de RAM y más de 100 GB de espacio en disco.
- Las compilaciones incrementales se completaban rápidamente, en menos de 10 segundos.
- Aunque compilar toma tiempo, una vez instalados todos los requisitos previos, era una tarea cómoda que avanzaba de forma automática.
Encontrar y corregir el bug
- Una vez que el entorno de compilación estuvo funcionando, comenzó a explorar el código.
- La base de código de Chromium es enorme, y resultaba difícil entender su estructura general.
- La gran cantidad de referencias indirectas y modularización dentro del código dificultaba la exploración, y el despacho dinámico se usaba ampliamente.
- Usó depuración con
printf para seguir la ruta desde donde se iniciaba una solicitud de red hasta el momento en que la solicitud realmente se creaba o se recuperaba del caché.
- El problema ocurría porque
InspectorNetworkAgent no se generaba para los objetivos worklet.
- Para corregirlo, cambió
InspectorNetworkAgent para que aceptara WorkerOrWorkletGlobalScope en lugar de WorkerGlobalScope.
- Sin embargo, esa corrección no fue suficiente, y después de revisar además el código TypeScript del frontend de DevTools, descubrió que faltaba
Capability.Networking para Type.Worklet.
- Después de agregarlo, el problema quedó completamente resuelto.
Pruebas y revisión de código
- Después de limpiar los logs de depuración y revisar por última vez el diff, exploró el proceso para revisar y fusionar el código.
- Creó una cuenta en el sitio de revisión de código
Chromium Gerrit y firmó el CLA.
- Seleccionó revisores, revisó el código que había escrito y agregó las pruebas necesarias.
- Escribió nuevas pruebas consultando varias pruebas JavaScript que verifican la función de inspección de red de DevTools.
- Finalmente, obtuvo la aprobación "LGTM" en la revisión de código y el PR fue fusionado.
Segundo CL
- Escribió otro CL para el cambio en el repositorio
devtools_frontend que agregaba Capability.Network al objetivo worklet de DevTools.
- Avanzó de forma similar al primer PR y fue fusionado automáticamente después de que las pruebas de CI pasaran.
Lanzamiento
- Esperó hasta que se publicara una versión con la corrección incluida en Chrome Canary.
- Chrome Canary se actualiza dos veces al día, y finalmente confirmó el cambio corregido.
- Completar la corrección tomó más de un mes, y estaba previsto que se incluyera en el canal de lanzamiento estable en Chrome 130.
Resultados y reflexión
- Corregir el bug tomó tiempo y mucho esfuerzo, pero fue una experiencia muy singular.
- Pudo experimentar cómo se desarrolla software a la escala de Chromium.
- En lo personal, le resultó muy motivador saber que su código estaría incluido en cientos de millones (o incluso miles de millones) de dispositivos en todo el mundo.
- Gracias a esta experiencia aprendió cómo contribuir a Chromium, y planea seguir intentando corregir más bugs en el futuro.
2 comentarios
Impresionante.
Opinión de Hacker News
Experiencia trabajando con la base de código de Chromium
Problemas con la extensión de C++ de VS Code
Experiencia con un bug de Chrome
Primera experiencia con la base de código de Chromium
Requisitos de compilación de Chrome
Depuración con printf
Recomendación de usar un navegador de código en línea
Diferencia entre WorkletGlobalScope y WorkerGlobalScope
Sugerencia de corregir bugs en Chromium
Experiencia con un bug al copiar imágenes