Отладка расширения Firefox. Как просмотреть все файлы JS и XUL, содержащиеся в XPI?
-
21-12-2019 - |
Вопрос
Я пытаюсь отладить расширение Firefox, используя Firefox 28.0.
Я настроил среду разработки, как предложено в https://developer.mozilla.org/en-US/Add-ons/Setting_up_extension_development_environment (на самом деле я просто пошел ленивым путем и установил расширение DevPrefs, чтобы установить все необходимое about:configs)
Затем я открываю Firefox и перехожу в среду отладки (Инструменты > Веб-разработчик > Панель инструментов браузера).
Затем я перехожу на вкладку «Отладчик».
Однако на панели «Источники» под моим расширением (например,chrome://myextension), я вижу только некоторые файлы JS и XUL, содержащиеся в моем расширении XPI.
Как я могу вручную «загружать файлы» в отладчик, чтобы установить точку останова и отслеживать время выполнения моего расширения?
Решение
Отладчик не имеет каких-либо функций, позволяющих загружать файлы «вручную», вместо этого он покажет вам каждый файл, который в данный момент загружается движком JavaScript.Если вникнуть в подробности, это означает, что всякий раз, когда движок JavaScript компилирует новый скрипт, отладчик уведомляется об этом и добавляет соответствующий файл в свой список.Поэтому обычно все, что вам нужно сделать, это открыть страницу или диалоговое окно, использующее этот сценарий, и он станет видимым в отладчике.Я говорю «обычно», потому что в моих тестах это работало ненадежно — похоже, есть какая-то ошибка, из-за которой отладчик пропускает некоторые сценарии, возможно, именно это и послужило причиной вашего вопроса.
Теперь, конечно, вы можете рассмотреть возможность подделки уведомления, чтобы заставить отладчик загрузить определенный файл - например.если вы хотите установить точки останова до фактической загрузки файла.Я попробовал, и это действительно возможно, но это требует от вас работы с внутренними компонентами Firefox и зависит от ряда деталей реализации, которые могут измениться в будущих версиях Firefox.В частности, вам необходимо получить DebuggerServer
экземпляр, используемый для связи с отладчиком.Хотя внутрипроцессный отладчик всегда использует один и тот же экземпляр, который легко получить, для каждого удаленного отладчика создается новый экземпляр.Насколько я могу судить, добраться до этого экземпляра можно только с изменениями, реализованными в ошибка 993029 это означает, что он будет работать только с Firefox 32 (в настоящее время доступен на сайте Канал Firefox Аврора) и выше.
Проблема в том, что DebuggerServer
экземпляр создается BrowserToolboxProcess
класс, объявленный в ToolboxProcess.jsm.До изменений, внесенных ошибкой 993029 a BrowserToolboxProcess
объект будет создан, и ссылка на него не будет сохранена, а это означает, что будет невозможно получить доступ к нему и соответствующему соединению постфактум.Начиная с Firefox 32 все создано BrowserToolboxProcess
объекты хранятся в processes
набор и их можно перечислить.
Этот код можно использовать для подделки Вызов Debugger.onNewScript() который будет перенаправлен удаленному отладчику:
(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: () => []
});
}
}
})();
Как упоминалось выше, этот код должен работать только начиная с Firefox 32, я тестировал его на Firefox 33.0a1.Вы можете запустить его из Scratchpad, обязательно переключите среду на «Браузер».Нет никакой гарантии, что он продолжит работать в будущих версиях Firefox, здесь используются некоторые детали реализации, которые могут измениться в любое время.