我正在尝试学习如何使用 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 客户端时犯了一个非常简单的错误,或者需要进行一个我不知道的明显更改。
我通过阅读 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。