Pergunta

Estou tentando depurar uma extensão do Firefox, usando o Firefox 28.0.

Eu configurei o ambiente de desenvolvimento conforme sugerido em https://developer.mozilla.org/en-US/Add-ons/Setting_up_extension_development_environment (na verdade, eu apenas peguei o caminho preguiçoso e instalei a extensão DevPrefs para definir todos os about:configs necessários)

Em seguida, abro o Firefox e entro no ambiente de depuração (Ferramentas > Desenvolvedor Web > Caixa de ferramentas do navegador).

Em seguida, vou para a guia Depurador.

No entanto, no painel Fontes, na minha extensão (por exemplo,chrome://myextension), vejo apenas alguns dos arquivos JS e XUL contidos em minha extensão XPI.

Como posso "carregar arquivos" manualmente no depurador, para poder definir um ponto de interrupção e rastrear o tempo de execução da minha extensão?

Foi útil?

Solução

O depurador não possui nenhuma funcionalidade que permita carregar arquivos "manualmente". Em vez disso, ele mostrará todos os arquivos atualmente carregados pelo mecanismo JavaScript.Se você se aprofundar nos detalhes, isso significa que sempre que o mecanismo JavaScript compila um novo script, o depurador é notificado e adiciona o arquivo correspondente à sua lista.Normalmente, tudo o que você precisa fazer é abrir uma página ou caixa de diálogo que use esse script e ele ficará visível no depurador.Digo "normalmente" porque em meus testes isso não pareceu funcionar de maneira confiável - parece haver algum bug que faz o depurador perder alguns scripts, talvez tenha sido isso que motivou sua pergunta.

Agora, é claro, você pode considerar falsificar a notificação para forçar o depurador a carregar um arquivo específico - por exemplo.se você deseja definir pontos de interrupção antes que o arquivo seja realmente carregado.Eu tentei e é realmente possível, mas exige que você mexa nos componentes internos do Firefox e depende de uma série de detalhes de implementação que podem mudar em versões futuras do Firefox.Em particular, você precisa obter o DebuggerServer instância usada para se comunicar com o depurador.Embora o depurador em processo sempre use a mesma instância, o que é trivial de obter, uma nova instância é criada para cada depurador remoto.Pelo que sei, chegar a essa instância só é possível com as mudanças implementadas em erro 993029 o que significa que só funcionará com o Firefox 32 (atualmente disponível no Canal Aurora do Firefox) e acima.

O problema é que o DebuggerServer instância está sendo criada pelo BrowserToolboxProcess classe declarada em Caixa de ferramentasProcess.jsm.Antes das mudanças introduzidas pelo bug 993029 a BrowserToolboxProcess objeto seria criado e nenhuma referência a ele seria mantida - o que significa que seria impossível acessá-lo e à conexão correspondente após o fato.Começando com o Firefox 32, tudo criado BrowserToolboxProcess objetos são armazenados no processes definir e pode ser enumerado.

Este código pode ser usado para falsificar um Chamada Debugger.onNewScript() que será encaminhado para o depurador remoto:

(function()
{
  // Iterate over existing processes
  const {processes} = Cu.import("resource:///modules/devtools/ToolboxProcess.jsm", null);
  for (var process of processes)
  {
    // Iterate over connections associated with each process
    var debuggerServer = process.debuggerServer;
    for (var connID in debuggerServer._connections)
    {
      if (!debuggerServer._connections.hasOwnProperty(connID))
        continue;
      var conn = debuggerServer._connections[connID];

      // Get ChromeDebuggerActor instance for the connection
      var chromeDebugger = conn._getOrCreateActor(conn.rootActor._extraActors.chromeDebugger.actorID);

      // Fake new script call
      chromeDebugger.onNewScript({
        url: "chrome://myextension/content/script.js", // CHANGE THAT LINE
        source: {text:""},
        getChildScripts: () => []
      });
    }
  }
})();

Como mencionado acima, este código só deve funcionar a partir do Firefox 32, testei no Firefox 33.0a1.Você pode executá-lo no Scratchpad, certifique-se de mude o ambiente para "Navegador".Não há nenhuma garantia de que continuará funcionando em versões futuras do Firefox, existem vários detalhes de implementação usados ​​aqui que podem mudar a qualquer momento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top