14 puntos por GN⁺ 2024-08-27 | 2 comentarios | Compartir por WhatsApp
  • 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

 
huiya 2024-08-27

Impresionante.

 
GN⁺ 2024-08-27
Opinión de Hacker News
  • Experiencia trabajando con la base de código de Chromium

    • Usa Sublime Text para trabajar con el código como texto plano
    • Con VS Code se pueden usar funciones como ir a la definición o declaración de una función
    • Recomienda su artículo a quienes quieran crear un navegador basado en Chromium
  • Problemas con la extensión de C++ de VS Code

    • La extensión de C++ de VS Code no funciona bien debido al gran tamaño de la base de código
    • Ocurre un problema donde los núcleos de CPU se quedan al 100%
    • La herramienta Chromium Code Search es útil
  • Experiencia con un bug de Chrome

    • En Linux ocurre un bug en navegadores basados en Chrome donde se escribe "±±±±±±+..."
    • No ocurre en otras aplicaciones
    • Quiere reproducir el bug y resolverlo
  • Primera experiencia con la base de código de Chromium

    • Explorar la base de código de Chromium por primera vez no fue difícil
    • Consultó el código de Chrome para resolver un bug al pegar imágenes en Windows
  • Requisitos de compilación de Chrome

    • Los requisitos de compilación de Chrome son muy altos
    • Se necesita una workstation de alto rendimiento
    • Firefox también tarda mucho en compilar
  • Depuración con printf

    • No hay que avergonzarse de usar depuración con printf
    • La depuración con printf es muy efectiva
  • Recomendación de usar un navegador de código en línea

    • Recomienda explorar el código mediante un navegador de código en línea
    • La URL cs.chromium.org es fácil de recordar
  • Diferencia entre WorkletGlobalScope y WorkerGlobalScope

    • Tomó tiempo entender la diferencia entre ambos términos
    • La convención de nombres no es buena
  • Sugerencia de corregir bugs en Chromium

    • Recomienda corregir bugs de Chromium
    • Chrome se actualiza rápido, así que un bug puede corregirse en 4 a 6 semanas
    • Quiere encontrar personas que contribuyan corrigiendo bugs
  • Experiencia con un bug al copiar imágenes

    • Al copiar imágenes al portapapeles en navegadores basados en Chrome, la UI se congela
    • Ocurre por un problema de codificación PNG
    • Lo resolvió cambiando el nivel de compresión a 0
    • Firefox no tiene esa demora y coloca el archivo de imagen original en el portapapeles