Domanda

Sto cercando di eseguire il debug di un'estensione di firefox, usando Firefox 28.0.

Ho creato l'ambiente Dev come suggerito in https:// sviluppatore.mozilla.org/en-us/add-ons/setting_up_eting_eting_eting_environment (in realtà ho appena preso il pigro in uscita e installato l'estensione Devprefs per impostare tutto il necessario: configurazioni)

Apri i Firefox e vai nell'ambiente di debug (Strumenti> Strumenti Web> Bowser Toolbox).

Io vado alla scheda Debugger.

Tuttavia, sotto il riquadro delle fonti, sotto la mia estensione (ad esempio Chrome: // MySextension), vedo solo alcuni dei file JS e XUL contenuti nella mia estensione XPI.

Come posso "caricare i file" manualmente nel debugger, in modo che possa impostare un punto di interruzione e rintracciare il runtime della mia estensione?

È stato utile?

Soluzione

Il debugger non ha alcuna funzionalità che consentirebbe il caricamento dei file "manualmente", invece ti mostrerà ogni file attualmente caricato dal motore JavaScript. Se si scava in dettaglio, ciò significa che ogni volta che il motore JavaScript compila un nuovo script, il debugger viene notificato e aggiunge il file corrispondente all'elenco. Quindi, normalmente tutto ciò che devi fare è aprire una pagina o una finestra di dialogo che utilizza questo script e diventerà visibile nel debugger. Dico "Normalmente" perché nei miei test questo non sembrava funzionare in modo affidabile - sembra esserci un po 'di bug che rende il debugger perdere alcuni script, forse è quello che ha spinto la tua domanda.

Ora, naturalmente, è possibile considerare la finta della notifica per forzare il debugger per caricare un particolare file - ad esempio Se si desidera impostare i punti di blocco prima che il file carichi effettivamente. L'ho provato ed è davvero possibile, ma richiede di scherzare con gli interni di Firefox e si basa su una serie di dettagli di implementazione che potrebbero cambiare nelle future versioni di Firefox. In particolare, è necessario ottenere l'istanza DebuggerServer utilizzata per comunicare con il debugger. Mentre il debugger in-process utilizza sempre la stessa istanza che è banale per ottenere, viene creata una nuova istanza per ciascun debugger remoto. Da ciò che posso dire, arrivare a quell'istanza è possibile solo con le modifiche implementate in Bug 993029 < / a> Il che significa che funzionerà solo con Firefox 32 (attualmente disponibile da Firefox Aurora Channel < / a>) e sopra.

Il problema è che l'istanza DebuggerServer viene creata dalla classe BrowserToolboxProcess dichiarata in toolboxprocess.jsm . Prima che le modifiche introdotte da Bug 993029 vennero creati un oggetto BrowserToolboxProcess e nessun riferimento a ciò tenuto - il che significa che sarebbe impossibile accedervi e la connessione corrispondente dopo il fatto. A partire da Firefox 32 Tutti gli oggetti creati BrowserToolboxProcess vengono memorizzati nel processes Imposta e può essere enumerato.

Questo codice può essere utilizzato per falsificare un Debugger.onnewscript () Chiama che verrà inoltrato al debugger 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: () => []
      });
    }
  }
})();
.

Come menzionato sopra, questo codice dovrebbe funzionare solo a partire da Firefox 32, l'ho testato su Firefox 33.0a1. Puoi eseguirlo da Ventagpad, assicurati di Switch Environment to "Browser" . Non vi è alcuna garanzia che continuerà a lavorare nelle future versioni di Firefox, ci sono diversi dettagli di implementazione utilizzati qui che possono cambiare in qualsiasi momento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top