问题描述 (Description)
目前,当桌面端超时锁定(或未启动/已锁状态)时,用户在浏览器中点击任意网页的密码输入框,浏览器插件会自动调用唤起协议,强行弹出并置顶桌面端窗口(Electron 窗口)要求解锁。
对于用户而言,如果是在一个新的没有保存过密码的界面,或者用户此时只想手动输入,点击输入框却会被突然弹出的桌面客户端强行抢占焦点,打断操作,体验不够友好。
复现步骤 (Reproduction Steps)
- 运行 BearPassword 桌面端,使其超时锁定(或保持锁定状态)。
- 在浏览器中打开任意包含密码框的网页(例如一个全新的、从未在 BearPassword 中保存过凭据的网站)。
- 用鼠标左键点击页面上的密码输入框。
- 现象:桌面客户端的主窗口瞬间弹出到最前,打断浏览器输入操作。
预期行为 (Expected Behavior)
当客户端超时锁定时,点击密码输入框应该只展示行内选择器(Inline Picker)并提示“桌面端未就绪/已锁定”,不应该无条件地强制弹出桌面端窗口。
只有当用户显式点击行内选择器中的提示时,才去触发唤醒桌面端,从而给用户以自主选择权。
初步排查 (Possible Cause)
初步观察代码,发现可能是以下原因:
- bear-password-extension/src/content/index.ts 中的
openPickerForInput 函数:
if (!desktopUnlocked) {
void wakeDesktopFromPage() // 这里只要未解锁就会无条件、自动执行唤醒
showDesktopWakePicker(input)
return
}
在点击输入框触发该逻辑时,无论是否有匹配账号,均会自动调用 wakeDesktopFromPage。
建议修复方案 (Proposed Solution)
- 取消自动唤醒:在
openPickerForInput 中,当检测到 !desktopUnlocked 时,只调用 showDesktopWakePicker(input) 展示行内提示,不再自动执行 wakeDesktopFromPage()。
- 支持行内手动唤醒:
- 改造 bear-password-extension/src/content/inlinePicker.ts,为
InlinePickerOptions 增加 onEmptyClick?: () => void 回调。
- 当
credentials 为空且存在该回调时,为行内选择器的空提示元素(.bear-picker-empty)增加点击事件,并在点击时触发 onEmptyClick。
- 在
showDesktopWakePicker 中传入该回调,用户点击行内选择器的提示时才执行 wakeDesktopFromPage()。
问题描述 (Description)
目前,当桌面端超时锁定(或未启动/已锁状态)时,用户在浏览器中点击任意网页的密码输入框,浏览器插件会自动调用唤起协议,强行弹出并置顶桌面端窗口(Electron 窗口)要求解锁。
对于用户而言,如果是在一个新的没有保存过密码的界面,或者用户此时只想手动输入,点击输入框却会被突然弹出的桌面客户端强行抢占焦点,打断操作,体验不够友好。
复现步骤 (Reproduction Steps)
预期行为 (Expected Behavior)
当客户端超时锁定时,点击密码输入框应该只展示行内选择器(Inline Picker)并提示“桌面端未就绪/已锁定”,不应该无条件地强制弹出桌面端窗口。
只有当用户显式点击行内选择器中的提示时,才去触发唤醒桌面端,从而给用户以自主选择权。
初步排查 (Possible Cause)
初步观察代码,发现可能是以下原因:
openPickerForInput函数:wakeDesktopFromPage。建议修复方案 (Proposed Solution)
openPickerForInput中,当检测到!desktopUnlocked时,只调用showDesktopWakePicker(input)展示行内提示,不再自动执行wakeDesktopFromPage()。InlinePickerOptions增加onEmptyClick?: () => void回调。credentials为空且存在该回调时,为行内选择器的空提示元素(.bear-picker-empty)增加点击事件,并在点击时触发onEmptyClick。showDesktopWakePicker中传入该回调,用户点击行内选择器的提示时才执行wakeDesktopFromPage()。