From 4115291bff1628f72ed0029941de46213103112b Mon Sep 17 00:00:00 2001 From: kuaifan Date: Wed, 30 Sep 2026 23:16:37 +0000 Subject: [PATCH] =?UTF-8?q?fix(electron):=20=E6=A0=87=E7=AD=BE=E9=A1=B5?= =?UTF-8?q?=E5=86=85=E6=89=93=E5=BC=80=E5=90=8C=E5=9F=9F=E5=90=8D=E9=93=BE?= =?UTF-8?q?=E6=8E=A5=E6=97=B6=E8=BF=BD=E5=8A=A0=E7=94=A8=E6=88=B7=E8=BA=AB?= =?UTF-8?q?=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Excel 预览等通过 openWindow 打开的 tab 模式窗口,其 setWindowOpenHandler 直接以原始 URL 创建新标签,未经过页面的 __onBeforeOpenWindow / userUrl, 客户端使用本地页面时新标签读不到登录态,/single/file/xxx 分享链接提示 "请登录后继续..." 或 "身份已失效"。 - web-tab-manager:tab 模式先交给 onBeforeOpenWindow 判断,同域名链接 经 userUrl 追加身份;页面要求默认浏览器打开的交给系统;页面无该能力 (如外站)时仍直接新开标签 - utils.onBeforeOpenWindow:透传页面返回值,以区分"要求默认浏览器打开" 与"页面没有 __onBeforeOpenWindow",原调用方行为不变 --- electron/lib/utils.js | 4 ++-- electron/lib/web-tab-manager.js | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/electron/lib/utils.js b/electron/lib/utils.js index 774bd406a..6eddf06a5 100644 --- a/electron/lib/utils.js +++ b/electron/lib/utils.js @@ -332,14 +332,14 @@ const utils = { * 新窗口打开事件 * @param webContents * @param url - * @returns {Promise} + * @returns {Promise} 页面未接管时 resolve;resolve(false) 表示页面明确要求用默认浏览器打开,resolve(undefined) 表示页面没有 __onBeforeOpenWindow */ onBeforeOpenWindow(webContents, url) { return new Promise(resolve => { const dataStr = JSON.stringify({url: url}) webContents.executeJavaScript(`if(typeof window.__onBeforeOpenWindow === 'function'){window.__onBeforeOpenWindow(${dataStr})}`, true).then(options => { if (options !== true) { - resolve() + resolve(options) } }).catch(_ => { resolve() diff --git a/electron/lib/web-tab-manager.js b/electron/lib/web-tab-manager.js index ca05e0703..052481190 100644 --- a/electron/lib/web-tab-manager.js +++ b/electron/lib/web-tab-manager.js @@ -745,8 +745,16 @@ function createWebTabView(windowId, args) { renderer.openExternal(url).catch(() => {}) }) } else if (url && url !== 'about:blank') { - // tab 模式下创建新标签 - createWebTabWindow({ url, afterId: browserView.webContents.id, windowId: browserView.webTabWindowId }) + // tab 模式下交给页面判断(同域名链接会追加用户身份后再打开),页面无此能力时直接创建新标签 + const afterId = browserView.webContents.id + const windowId = browserView.webTabWindowId + utils.onBeforeOpenWindow(browserView.webContents, url).then(handled => { + if (handled === false) { + renderer.openExternal(url).catch(() => {}) + } else { + createWebTabWindow({ url, afterId, windowId }) + } + }) } return { action: 'deny' } })