javascript - 调试 Firefox 扩展 - 如何查看 XPI 中包含的所有 JS 和 XUL 文件?

标签 javascript debugging firefox firefox-addon xpi

我正在尝试使用 Firefox 28.0 调试 Firefox 扩展。

我已经按照 https://developer.mozilla.org/en-US/Add-ons/Setting_up_extension_development_environment 中的建议设置了开发环境(实际上我只是采取了偷懒的方式并安装了 DevPrefs 扩展来设置所有必要的 about:configs)

然后我打开 Firefox 并进入调试环境(工具 > Web 开发人员 > 浏览器工具箱)。

然后我转到“调试器”选项卡。

但是,在“源” Pane 下的扩展程序(例如 chrome://myextension)下,我只能看到扩展程序 XPI 中包含的一些 JS 和 XUL 文件。

如何在调试器中手动“加载文件”,以便设置断点并跟踪扩展的运行时?

最佳答案

调试器没有任何允许“手动”加载文件的功能,而是会显示 JavaScript 引擎当前加载的每个文件。如果您深入研究细节,这意味着每当 JavaScript 引擎编译新脚本时,调试器都会收到通知并将相应的文件添加到其列表中。因此,通常您需要做的就是打开使用该脚本的页面或对话框,它将在调试器中变得可见。我说“正常”是因为在我的测试中这似乎工作不可靠 - 似乎存在一些错误使调试器错过了一些脚本,也许这就是引发您问题的原因。

现在您当然可以考虑伪造通知以强制调试器加载特定文件 - 例如如果您想在文件实际加载之前设置断点。我尝试过,确实可行,但它需要你搞乱 Firefox 的内部结构,并且它依赖于许多实现细节,这些细节可能会在未来的 Firefox 版本中发生变化。特别是,您需要获取用于与调试器通信的 DebuggerServer 实例。虽然进程内调试器始终使用相同的实例(这很容易获得),但会为每个远程调试器创建一个新实例。据我所知,只有通过 bug 993029 中实现的更改才能到达该实例。这意味着它仅适用于 Firefox 32(当前可从 Firefox Aurora channel 获得)及更高版本。

问题是 DebuggerServer 实例是由 ToolboxProcess.jsm 中声明的 BrowserToolboxProcess 类创建的。 。在 bug 993029 引入的更改之前,将创建一个 BrowserToolboxProcess 对象,并且不会保留对其的引用 - 这意味着事后无法访问它以及相应的连接。从 Firefox 32 开始,所有创建的 BrowserToolboxProcess 对象都存储在 processes set 中。并且可以枚举。

此代码可用于伪造 Debugger.onNewScript() call将被转发到远程调试器:

(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 上进行了测试。您可以从暂存器运行它,请确保 switch environment to "Browser" 。无法保证它会在未来的 Firefox 版本中继续工作,这里使用的几个实现细节可能随时更改。

关于javascript - 调试 Firefox 扩展 - 如何查看 XPI 中包含的所有 JS 和 XUL 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24054407/

相关文章:

javascript - 将用户文本输入添加到 url

javascript - 使用 jQuery/Javascript 打开“保存图像”对话框?

javascript - 如何通过 style.position 改变元素的位置?

MetroGridHelper 的 Android 替代品

eclipse - 在一个项目中开发和调试 Eclipse Web 应用程序

javascript - jGravity(jQuery 插件)在 Firefox 中无法拖动

javascript - 新元素的CSS过渡

javascript - JSF h :outputScript ordering and PrimeFaces jQuery

css - FireFox 特定的 CSS

c# - Visual Studio 2012/C# 中断代码执行,未设置断点