Отладка расширения Firefox. Как просмотреть все файлы JS и XUL, содержащиеся в XPI?

StackOverflow https://stackoverflow.com//questions/24054407

Вопрос

Я пытаюсь отладить расширение 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, здесь используются некоторые детали реализации, которые могут измениться в любое время.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top