Skip to content

[UX/Proposal] 桌面端超时锁定后,网页点击密码框无条件自动弹出客户端,建议改为行内点击手动唤醒 #5

Description

@kali-xinian

问题描述 (Description)

目前,当桌面端超时锁定(或未启动/已锁状态)时,用户在浏览器中点击任意网页的密码输入框,浏览器插件会自动调用唤起协议,强行弹出并置顶桌面端窗口(Electron 窗口)要求解锁。

对于用户而言,如果是在一个新的没有保存过密码的界面,或者用户此时只想手动输入,点击输入框却会被突然弹出的桌面客户端强行抢占焦点,打断操作,体验不够友好。

复现步骤 (Reproduction Steps)

  1. 运行 BearPassword 桌面端,使其超时锁定(或保持锁定状态)。
  2. 在浏览器中打开任意包含密码框的网页(例如一个全新的、从未在 BearPassword 中保存过凭据的网站)。
  3. 用鼠标左键点击页面上的密码输入框。
  4. 现象:桌面客户端的主窗口瞬间弹出到最前,打断浏览器输入操作。

预期行为 (Expected Behavior)

当客户端超时锁定时,点击密码输入框应该只展示行内选择器(Inline Picker)并提示“桌面端未就绪/已锁定”,不应该无条件地强制弹出桌面端窗口。
只有当用户显式点击行内选择器中的提示时,才去触发唤醒桌面端,从而给用户以自主选择权。

初步排查 (Possible Cause)

初步观察代码,发现可能是以下原因:

  • bear-password-extension/src/content/index.ts 中的 openPickerForInput 函数:
    if (!desktopUnlocked) {
      void wakeDesktopFromPage() // 这里只要未解锁就会无条件、自动执行唤醒
      showDesktopWakePicker(input)
      return
    }
    在点击输入框触发该逻辑时,无论是否有匹配账号,均会自动调用 wakeDesktopFromPage

建议修复方案 (Proposed Solution)

  1. 取消自动唤醒:在 openPickerForInput 中,当检测到 !desktopUnlocked 时,只调用 showDesktopWakePicker(input) 展示行内提示,不再自动执行 wakeDesktopFromPage()
  2. 支持行内手动唤醒
    • 改造 bear-password-extension/src/content/inlinePicker.ts,为 InlinePickerOptions 增加 onEmptyClick?: () => void 回调。
    • credentials 为空且存在该回调时,为行内选择器的空提示元素(.bear-picker-empty)增加点击事件,并在点击时触发 onEmptyClick
    • showDesktopWakePicker 中传入该回调,用户点击行内选择器的提示时才执行 wakeDesktopFromPage()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions