允许 Electron 托管的 webapp 调用 window.open 并像使用常规 Chrome window 一样使用结果

Allowing an Electron-hosted webapp to call window.open and to use the result as if it were a regular Chrome window

我在 Electron 的 webview 标签中托管的网络应用调用 window.open。但是,since window.open 无法从 Electron 中的 iframe 内部调用,我不得不重写 window.open,以便它向托管 webapp 的渲染器进程发送消息并告诉它调用 window.open 并发回结果。

来自我的渲染器:webContents.send("my-channel", myWindow);

但是,我似乎无法简单地将整个 window 发送回网络应用程序。发送到 webapp 的 window 没有 BrowserWindowProxy 应该具有的任何功能(例如 close)。我想如果它确实有一个 close,那将是 st运行ge,因为 close 需要知道逃脱 webapp(通过某种方式)并提醒 Electron 的 renderer/main 一个 window 需要关闭的进程。

我希望发送到 webapp 的 window 表现得或多或少像常规 Chrome window(即,我希望它具有相同的 public api)。所以,我的第一个问题是如何将这样的 window 应用到 webapp。

我想到的解决方案如下。我仍然在渲染器进程中调用 window.open,但我没有传回结果 window,而是传回一个具有 windowId 属性 的对象,该对象设置为window 的 ID。当该对象到达 webapp 时,它会通过一个小中介来查看 window 对象并设置一些属性(如 closefocus),这些属性在内部向渲染器进程发送消息执行相关操作(通过预加载脚本公开的函数)。类似于:

myWindow = {
    windowId: 1,
    close: function() {
        sendActionFromWebviewToMain("close", this.windowId);
    }
}

我 运行 遇到的下一个问题是 Electron 的 window.open 返回的 window 与 new BrowserWindow(...) 返回的不同,它似乎没有 ID . source code 引用了一个 guestId,但我无法访问它。

如何使用 window.open 创建 Web 应用程序可以与之交互的 window?我是否被迫使用 BrowserWindow 构造函数创建 window?

此问题已得到解决。

我现在需要做的就是在我的 webview 标签上设置 nativeWindowOpenallowpopups 属性,然后我就可以使用原生的 window.open.

<webview webpreferences="nativeWindowOpen=yes" allowpopups />