坑所属项目 ↗2026-09-17

file:// 下 localStorage opaque origin 报错与安全封装修复

插件初始化期访问 localStorage,在 file:// 协议(opaque origin)下抛 SecurityError 致控制台报错;用 _lsAvailable/_safeLsGet/_apiSafeEnabled 三安全封装降级修复,console-check 双协议 0 报错。

  • localStorage
  • file协议
  • 安全封装
  • console-check

坑

  • plugins/extract.js 初始化/渲染期调用 aideepseek.getEnabled(),其内部 lsGet() 直接访问 localStorage.getItem
  • 浏览器 file:// 协议下页面属于 opaque origin,localStorage 访问抛 SecurityError
  • window.onerror 捕获到 1 个控制台错误 → console-check file:// 协议 FAIL(http:// 协议正常,所以此前未暴露)

修复

新增 3 个安全封装方法(extract.js v2.1.1):

  • _lsAvailable():特性检测——getItem('___probe___') 抛 SecurityError 即判定 localStorage 不可用,返回 false
  • _safeLsGet(k):try/catch 包裹 getItem,不可用返回 null
  • _apiSafeEnabled():先查 _lsAvailable(),不可用直接返回 false(按钮 B 不渲染、AI 直连降级);可用才安全读取键值(等价 getEnabled() 但不抛错)

改造 2 处调用点:render 初始化/渲染期 + 按钮点击期,均走 _apiSafeEnabled()。

验证

  • selftest 新增 12 条 opaque origin 模拟用例(makeOpaqueLs():getItem/setItem/removeItem 均抛 SecurityError),断言初始化不抛错、按钮 B 不渲染、本地兜底不降级、恢复可用后正常
  • console-check file:// 与 http:// 双协议 0 error 0 warn
  • 数据总线 dataBus 排查确认所有 localStorage 访问点已在 try/catch 中,无需改动

复用要点

后续所有插件在初始化/渲染期访问 localStorage(含间接经其他插件方法访问)都必须走安全封装,验收以 console-check 双协议 0 报错为准。