La depuración de extensiones de Firefox - ¿Cómo puedo ver todos los JS y XUL archivos contenidos en el XPI?
-
21-12-2019 - |
Pregunta
Estoy tratando de depurar una extensión de Firefox, el uso de Firefox 28.0.
He configurado el entorno dev como se sugiere en https://developer.mozilla.org/en-US/Add-ons/Setting_up_extension_development_environment (en realidad, yo sólo tomó el camino del perezoso e instalado el DevPrefs extensión para establecer todo lo necesario acerca de:configs)
A continuación, abro Firefox y entrar en el entorno de depuración (Herramientas > Desarrollador Web > Browser caja de herramientas).
Yo, a continuación, vaya al Depurador ficha.
Sin embargo, en el panel Fuentes, bajo mi extensión (por ejemplo,chrome://myextension), solo puedo ver algunos de los JS y XUL archivos que están contenidos en mi extensión XPI.
¿Cómo puedo manualmente "carga de archivos" en el depurador, para que yo pueda establecer un punto de interrupción y traza el tiempo de ejecución de mi extensión?
Solución
El depurador no tiene ninguna funcionalidad que permita la carga de archivos "manualmente", sino que le muestra todos los archivos que se cargan actualmente por el motor de JavaScript.Si cavar en los detalles, esto significa que cada vez que el motor de JavaScript compila una nueva secuencia de comandos del depurador es notificado y se le agrega el archivo correspondiente a su lista.Así que, normalmente, todo lo que necesitas hacer es abrir una página o cuadro de diálogo que utiliza la secuencia de comandos y se hará visible en el depurador.Digo "normalmente" porque en mis pruebas, esto no parece funcionar de forma fiable - no parece ser un bug que hace que el depurador pierdas algunas secuencias de comandos, tal vez eso es lo que impulsó a su pregunta.
Ahora, por supuesto, usted puede considerar la posibilidad de simular la notificación a la fuerza el depurador para cargar un archivo en particular - por ejemplo,si desea establecer puntos de interrupción antes de que el archivo de carga.Lo he probado y de hecho, es posible, pero requiere de usted para meterse con Firefox internos y se basa en una serie de detalles de implementación que podría cambiar en futuras versiones de Firefox.En particular, usted necesita para obtener la DebuggerServer
ejemplo utiliza para comunicarse con el depurador.Mientras que el proceso depurador siempre utiliza la misma instancia que es trivial para obtener una nueva instancia es creada para cada depurador remoto.Por lo que puedo decir, llegar a esa instancia sólo es posible con los cambios implementados en error 993029 lo que significa que sólo funciona con Firefox 32 (actualmente disponible desde el Firefox Aurora canal y encima.
El problema es que la DebuggerServer
la instancia está siendo creado por el BrowserToolboxProcess
clase declarada en ToolboxProcess.jsm.Antes de los cambios introducidos por error 993029 un BrowserToolboxProcess
objeto se crea y no se hace referencia a ella mantuvo el sentido de que sería imposible acceder a ella y la conexión correspondiente después del hecho.Empezando con Firefox 32, todos creados BrowserToolboxProcess
los objetos se almacenan en el processes
conjunto y pueden ser enumerados.
Este código puede ser utilizado para simular una Depurador.onNewScript() la llamada que se enviará al 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 se mencionó anteriormente, este código sólo debería de empezar a trabajar con Firefox 32, he probado en Firefox 33.0a1.Se puede ejecutar desde el bloc de notas, asegúrese de interruptor de medio ambiente para "Navegador".No hay garantía alguna de que se continuará trabajando en las futuras versiones de Firefox, hay varios detalles de implementación utilizada aquí, que puede cambiar en cualquier momento.