14 pontos por GN⁺ 2024-08-27 | 2 comentários | Compartilhar no WhatsApp
  • 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

 
huiya 2024-08-27

Incrível.

 
GN⁺ 2024-08-27
Opinião do Hacker News
  • Experiência trabalhando na base de código do Chromium

    • Usa o Sublime Text para trabalhar no código como texto puro
    • Com o VS Code, é possível usar recursos como ir para a definição ou declaração de funções
    • Recomenda seu artigo para quem quer criar um navegador baseado em Chromium
  • Problemas com a extensão C++ do VS Code

    • A extensão C++ do VS Code não funciona direito por causa do tamanho da base de código
    • Ocorre um problema em que os núcleos da CPU ficam travados em 100%
    • A ferramenta Chromium Code Search é útil
  • Experiência com um bug do Chrome

    • No Linux, ocorre um bug em navegadores baseados em Chrome em que é digitado "±±±±±±+..."
    • Não acontece em outros aplicativos
    • Quer reproduzir e corrigir o bug
  • Primeira experiência com a base de código do Chromium

    • Explorar a base de código do Chromium pela primeira vez não foi difícil
    • Consultou o código do Chrome para corrigir um bug de colar imagem no Windows
  • Requisitos de build do Chrome

    • Os requisitos de build do Chrome são muito altos
    • É necessária uma workstation de alto desempenho
    • O Firefox também leva muito tempo para compilar
  • Depuração com printf

    • Não há motivo para ter vergonha de usar depuração com printf
    • A depuração com printf é muito eficaz
  • Recomendação de usar um navegador de código online

    • Recomenda explorar o código por meio de um navegador de código online
    • O URL cs.chromium.org é fácil de lembrar
  • Diferença entre WorkletGlobalScope e WorkerGlobalScope

    • Leva tempo para entender a diferença entre os dois termos
    • A convenção de nomenclatura não é boa
  • Sugestão para corrigir bugs no Chromium

    • Recomenda corrigir bugs do Chromium
    • Como o Chrome é atualizado rapidamente, o bug pode ser corrigido em 4–6 semanas
    • Quer encontrar pessoas para contribuir com correções de bugs
  • Experiência com bug ao copiar imagens

    • Ao copiar uma imagem para a área de transferência em um navegador baseado em Chrome, a interface trava
    • Isso acontece por causa de um problema na codificação PNG
    • Resolveu o problema mudando o nível de compressão para 0
    • O Firefox não apresenta atraso e coloca o arquivo de imagem original na área de transferência