- Contribuição para um grande projeto de código aberto ao corrigir pela primeira vez um bug no navegador Chromium/Google Chrome.
- Foi uma experiência única, muito diferente de trabalhos anteriores com código aberto.
- Todo o processo foi documentado para ajudar desenvolvedores que queiram tentar fazer algo parecido.
O bug
- O bug corrigido era um problema de integração entre o Chromium Devtools e requisições de rede de worklets como
AudioWorklet, executados fora da thread principal.
- As requisições de rede criadas pelo worklet não apareciam de forma alguma na aba de rede do Devtools.
- A opção "Disable Cache" era ignorada, então durante o desenvolvimento o código antigo não era removido do cache.
- Esse problema ocorria de forma recorrente em vários projetos e correspondia a pelo menos três relatórios de erro.
- A reprodução mínima era simples: usar um script com cabeçalhos de cache definidos para criar um
AudioWorkletProcessor e recarregar a página para reproduzir o problema.
Baixando e compilando o código do Chromium
- O primeiro passo para corrigir o bug de fato foi compilar o Chromium do zero.
- Felizmente, havia documentação detalhada sobre como compilar nos principais sistemas operacionais.
- Mesmo usando um computador potente, a primeira compilação levou mais de 45 minutos, com uso de mais de 50 GB de RAM e mais de 100 GB de espaço em disco.
- As compilações incrementais eram concluídas rapidamente, em menos de 10 segundos.
- Embora a compilação leve tempo, depois de instalar todos os pré-requisitos necessários, o processo era conveniente e em grande parte automatizado.
Encontrando e corrigindo o bug
- Depois que o ambiente de build passou a funcionar, começou a exploração do código.
- A base de código do Chromium é extremamente grande, e era difícil entender sua estrutura geral.
- As muitas referências indiretas e a modularização do código dificultavam a navegação, e o despacho dinâmico era amplamente usado.
- Foi usado debugging com
printf para rastrear as requisições de rede desde o ponto em que eram iniciadas até o momento em que eram realmente criadas ou recuperadas do cache.
- O problema acontecia porque o
InspectorNetworkAgent não era criado para o alvo do worklet.
- Para corrigir isso, foi alterado para que
InspectorNetworkAgent aceitasse WorkerOrWorkletGlobalScope em vez de WorkerGlobalScope.
- Porém, essa correção não foi suficiente; após verificar também o código TypeScript do frontend do Devtools, foi descoberto que
Capability.Networking estava ausente para Type.Worklet.
- Depois de adicionar isso, o problema foi completamente resolvido.
Testes e revisão de código
- Depois de limpar os logs de depuração e revisar o diff final, começou a exploração do processo de revisão e merge do código.
- Foi criada uma conta no site de revisão de código
Chromium Gerrit e o CLA foi assinado.
- Um revisor foi escolhido, o código escrito foi analisado e os testes necessários foram adicionados.
- Um novo teste foi escrito com referência a vários testes JavaScript que validavam a funcionalidade de inspeção de rede do Devtools.
- No fim, o código recebeu aprovação "LGTM" na revisão e o PR foi mesclado.
Segundo CL
- Outro CL foi escrito para a alteração que adicionava
Capability.Network ao alvo de Devtools de worklet no repositório devtools_frontend.
- O processo foi semelhante ao do primeiro PR, e depois que os testes de CI passaram, ele foi mesclado automaticamente.
Lançamento
- Foi preciso esperar até que uma versão com a correção fosse lançada no Chrome Canary.
- O Chrome Canary é atualizado duas vezes por dia, e por fim foi possível confirmar a correção.
- Levaram mais de um mês para concluir a correção, e ela estava prevista para entrar no canal estável na versão Chrome 130.
Resultado e retrospectiva
- Corrigir o bug levou tempo e exigiu muito esforço, mas foi uma experiência muito única.
- Foi possível vivenciar como o software é desenvolvido na escala do Chromium.
- Pessoalmente, o fato de o código passar a fazer parte de centenas de milhões (ou até bilhões) de dispositivos no mundo todo foi uma grande motivação.
- Com essa experiência, foi aprendido como contribuir com o Chromium, e a intenção é continuar tentando corrigir mais bugs no futuro.
2 comentários
Incrível.
Opinião do Hacker News
Experiência trabalhando na base de código do Chromium
Problemas com a extensão C++ do VS Code
Experiência com um bug do Chrome
Primeira experiência com a base de código do Chromium
Requisitos de build do Chrome
Depuração com printf
Recomendação de usar um navegador de código online
Diferença entre WorkletGlobalScope e WorkerGlobalScope
Sugestão para corrigir bugs no Chromium
Experiência com bug ao copiar imagens