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-checkfile:// 协议 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-checkfile:// 与 http:// 双协议 0 error 0 warn- 数据总线 dataBus 排查确认所有 localStorage 访问点已在 try/catch 中,无需改动
复用要点
后续所有插件在初始化/渲染期访问 localStorage(含间接经其他插件方法访问)都必须走安全封装,验收以 console-check 双协议 0 报错为准。