Debug di firefox Extension - Come vedere tutti i file JS e Xul contenuti nel XPI?
-
21-12-2019 - |
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?
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.