Skip to content

fix: keep contextBridge login methods callable instead of proxying them - #3

Merged
koi128bit merged 2 commits into
koi128bit:mainfrom
z91300:fix/contextbridge-login-proxy
Oct 26, 2026
Merged

koi128bit merged 2 commits into
koi128bit:mainfrom
z91300:fix/contextbridge-login-proxy

Conversation

@z91300

@z91300 z91300 commented Oct 26, 2026

Copy link
Copy Markdown
Contributor

现象

点击「添加账号」时按钮无反应,页面顶部出现错误:

'get' on proxy: property 'startLogin' is a read-only and non-configurable data property
on the proxy target but the proxy did not return its actual value
(expected 'function () { [native code] }' but got '(...r)=>t[n](...r,e)')

根因

src/providers.ts 的 apiFor() 用 new Proxy(window.workbuddy, …) 按地区改写方法。而 contextBridge.exposeInMainWorld 暴露的属性是**自身、不可写(writable: false)、不可配置(configurable: false)**的数据属性:

Object.getOwnPropertyDescriptor(window.workbuddy, "startLogin")
// { writable: false, configurable: false, value: f () { [native code] } }

按规范,当 target 上的该属性既不可写又不可配置时,get trap 必须返回属性本身的值。get trap 对 loginMethods 中的方法返回了新包装函数((...args) => target[key](...args, provider)),于是 V8 在调用前就抛错——请求根本没有进入主进程。

npm run test:ui 不会暴露该问题,因为浏览器测试注入的 mock bridge 是普通对象(属性可配置)。

影响面

命中 loginMethods 与 workbuddy-global 分支的方法全部不可用:

  • 各国 / 各客户端「添加账号」→ startLogin,以及登录弹窗的 pollLogin / openLogin / cancelLogin
  • workbuddy-global 的 refreshQuotas、switchAccount、capture 等(走 workbuddyScope)与「仅国内版」拦截提示

修复

不再用 Proxy 拦截,而是把 bridge 的方法表拷贝成普通对象(Object.getOwnPropertyNames + 描述符),再在副本上覆盖按地区改写的方法;对外行为、缓存与 workbuddyScope 转发逻辑保持不变。preload 与主进程无需改动。

验证

  • 新增 tests/providers.test.mjs(6 项):用与 contextBridge 相同形状(不可写 + 不可配置)的对象作 target,覆盖登录方法转发 provider、国际版 workbuddyScope 路由、仅国内版方法拦截、未改写方法保持原引用、bridge 替换后缓存失效。修复前 6 项全部因同一 TypeError 失败,修复后全部通过。
  • npm test:206 项,204 通过,0 失败,2 跳过(原有)。
  • npm run typecheck、npm run build 通过。
  • 本机真实应用验证(Windows + Electron 44.9.3,构建后的渲染层 + 真实 preload / IPC):修复前点「添加账号」得到与上面完全一致的报错、不弹窗;修复后正常打开「网页登录添加账号」弹窗。国内版与国际版的登录弹窗、以及国际版「刷新」均无报错。

@koi128bit
koi128bit merged commit 417431c into koi128bit:main Oct 26, 2026
3 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants