Google chrome extension Google Chrome扩展中使用远程调试协议的问题

Google chrome extension Google Chrome扩展中使用远程调试协议的问题,google-chrome-extension,Google Chrome Extension,我正在为类似GWT的框架开发自己的DevMode实现。此DevMode用于 像GWT的旧DevMode一样工作,它将被弃用,因为GWT teavm不想这样做 支持浏览器插件。另一个原因是NPAPI已从最新版本的Google Chrome中删除。 因此,我的DevMode实现有自己的GoogleChrome扩展,它完全是用中文编写的 JavaScript并通过WebSocket与服务器通信 DevMode的主要目标是在javaide中调试Java代码。它运行Java代码 在JVM中,当JVM试图执

我正在为类似GWT的框架开发自己的DevMode实现。此DevMode用于 像GWT的旧DevMode一样工作,它将被弃用,因为GWT teavm不想这样做 支持浏览器插件。另一个原因是NPAPI已从最新版本的Google Chrome中删除。 因此,我的DevMode实现有自己的GoogleChrome扩展,它完全是用中文编写的 JavaScript并通过WebSocket与服务器通信

DevMode的主要目标是在javaide中调试Java代码。它运行Java代码 在JVM中,当JVM试图执行JavaScript代码时,它会将代码远程传输到浏览器 扩展,它执行JavaScript并将结果发送回。然而,事情稍微复杂一些 实际上很难,因为JVM可以将回调传递给JavaScript,所以存在双向性 JVM和浏览器扩展之间的消息流,在任何嵌套深度。考虑以下事项 乒乓球:

public class PingPong {
    public native void ping(int count) /*-{
        console.log("Before ping %d", count);
        this.pong(count - 1);
        console.log("After ping %d", count);
    -}*/;
    public void pong(int count) {
        System.out.println("Before pong " + count);
        ping(count - 1);
        System.out.println("After pong " + count);
    }
}
ping
调用
pong
时,它应该等待JVM收到消息,处理它并发送响应 返回此外,JVM再次调用
ping
,以此类推。但是,WebSocket API是异步的。 此外,我们不能在JVM响应之前阻塞,因为JVM可能会再次调用JavaScript

所以我在扩展中使用了远程调试协议。 当扩展收到调用JavaScript方法的命令时, 它将
Runtime.callFunctionOn
命令发送到调试器API。当Java将回调传递给 扩展,它创建以下代理函数:

function() {
    var params = [];
    for (var i = 0; i < arguments.length; ++i) {
        params.push(arguments[i]);
    }
    return sendMessage({
        type : "invoke-method",
        methodName : methodName,
        args : params
    });
}
此外,扩展还侦听调试器暂停通知。收到通知时, 扩展将消息发送到JVM并等待响应。收到回复后, 扩展设置接收的消息,清除发送的消息并发送调试器。恢复调试器

不幸的是,我有两个主要问题。首先,我打电话的时候

element.addEventListener("click", callback)
从JVM,然后单击元素,
Debugger.paused
按预期出现。 但是当我通过RDP阅读
sentMessage
时,我得到的
objectId
与我传递给它的不同
addEventListener
。Google Chrome调试器API中的对象ID是否持久

第二个问题是速度。RDP往返每次呼叫需要10-20毫秒。还有别的吗 使用Google Chrome扩展API阻止脚本执行的方法?而且,我不仅想要
阻止,但进入嵌套的事件循环,因为JVM回调可能会再次调用JavaScript。

您提到事件侦听器和objectId,但您的代码片段不包含关于它们是什么的线索。事件侦听器是我从JVM传递到浏览器扩展的某个函数。为了使这个函数可以从JavaScript调用,我创建了一个代理函数,如前所述
objectId
是类型为
RemoteObjectId
的属性,它通常出现在RDP中,描述的JavaScript值不是原语值。例如,要通过RDP调用方法,我将其名称和对象的
objectId
作为
this
传递给threat。此外,当此方法返回非原语值时,它的格式为
{objectId:“实际id”}
element.addEventListener("click", callback)