如何使用 Firefox 远程调试协议?

问题描述 投票:0回答:1

我正在尝试学习如何使用 Firefox 远程调试协议,但有线协议似乎记录很少,而且我似乎无法运行节点示例。

这是我的第一次尝试,使用

nc
根据文档给出命令:

# Terminal 1
firefox --start-debugger-server

# Terminal 2
nc 127.0.0.1 6000
# Output:
# 226:{"from":"root","applicationType":"browser","testConnectionPrefix":"server1.conn1.","traits":{"networkMonitor":true,"resources":{"extensions-backgroundscript-status":true}  ,"workerConsoleApiMessagesDispatchedToMainThread":true}}
# Input:
{ "to":"root", "type":"listTabs" }
# Output: No response.

这是我的第二次尝试,使用 client API 示例。 Firefox 的启动方式与上面相同。我创建了一个名为 Play.js 的文件,其中的内容是从示例中逐字复制的。

const { DevToolsServer } = require("devtools/server/devtools-server");
const { DevToolsClient } = require("devtools/client/devtools-client");

function start() {
  // Start the server.
  DevToolsServer.init();
  DevToolsServer.registerAllActors();

  // Listen to an nsIPipe
  let transport = DevToolsServer.connectPipe();

  // Start the client.
  client = new DevToolsClient(transport);

  client.connect((type, traits) => {
    // Now the client is connected to the server.
    debugTab();
  });
}

然后我安装后执行了

devtools

npm install devtools
node Play.js

我收到以下错误:

internal/modules/cjs/loader.js:638
    throw err;
    ^

Error: Cannot find module 'devtools/server/devtools-server'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
    at Function.Module._load (internal/modules/cjs/loader.js:562:25)
    at Module.require (internal/modules/cjs/loader.js:692:17)
    at require (internal/modules/cjs/helpers.js:25:18)
    at Object.<anonymous> (/home/hq6/Code/FirefoxDebuggerPlay/Play.js:1:28)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)

通过远程调试接口与 Firefox 对话的正确方法是什么?

我的目标是学习有线协议,这样我就可以用我更熟悉的语言实现我自己的客户端。 但是,我也对描述如何让节点客户端工作的答案感兴趣,因为如果需要,我可以使用客户端对协议进行逆向工程。

我对 Node 不熟悉,所以很可能我在尝试运行 Node 客户端时犯了一个非常简单的错误,或者需要进行一个我不知道的明显更改。

node.js firefox remote-debugging
1个回答
0
投票

我通过阅读 VSCode Extension 的源代码弄清楚了协议。

它似乎是长度前缀的 JSON 消息,因此通过 netcat 发送以下内容是可行的:

34:{ "to":"root", "type":"listTabs" }

但是,只有当我在看到输入后立即键入它而不需要额外的换行符时,这才有效,因为协议不会丢弃意外的空格。因此,在终端中,文本如下所示:

226:{"from":"root","applicationType":"browser","testConnectionPrefix":"server1.conn2.","traits":{"networkMonitor":true,"resources":{"extensions-backgroundscript-status":true},"workerConsoleApiMessagesDispatchedToMainThread":true}}34:{ "to":"root", "type":"listTabs" }250:{"tabs":[{"actor":"server1.conn2.tabDescriptor1","browserId":2,"browsingContextID":3,"isZombieTab":false,"outerWindowID":6,"selected":true,"title":"New Tab","traits":{"watcher":true,"supportsReloadDescriptor":true},"url":"about:home"}],"from":"root"}

此外,为了发送多个消息,我必须确保在第一条消息后也没有添加换行符,这意味着我无法添加换行符来强制 nc 发送字节,而是使用 Control -D 触发 EOF

© www.soinside.com 2019 - 2024. All rights reserved.