Firefox扩展调用browser.windows.get()无响应报can't access dead object如何解决
错误含义
can't access dead object 是Firefox平台的特有报错,代表你当前持有browser.windows对象引用对应的浏览器原生宿主对象已经被垃圾回收销毁,所以调用相关方法时既不会抛出同步错误,返回的Promise也永远不会进入resolved/rejected状态,导致await逻辑直接阻塞。
常见触发原因
- API调用的上下文已经被销毁:最常见的情况是你在popup页面、临时侧边栏这类关闭就会被销毁的非持久化上下文里,把
browser.windows的调用放到了延迟回调(比如setTimeout、异步接口回调)中,回调执行前页面已经被关闭,上下文持有的所有浏览器API对象都会变成dead object。 - 调试时引用了旧上下文的对象:扩展重载后,之前在调试控制台保存的
browser相关对象引用会失效,继续调用就会触发该报错。 - 低版本Firefox的API实现异常:你使用的Firefox 94属于较老版本,存在部分扩展API的已知实现问题。
修复方案
- 优先把
browser.windows相关逻辑放到扩展的后台脚本中执行,后台脚本属于持久化上下文,不会随popup等页面关闭被销毁。如果使用Manifest V3的后台Service Worker,注意不要在休眠触发后调用之前缓存的API对象引用。 - 如果必须在popup等临时上下文调用API,确保调用逻辑在上下文活跃期间同步执行,不要放在延迟回调中执行,避免上下文提前销毁。
- 调试时如果重载过扩展,需要重新打开调试控制台执行代码,不要复用之前保存的API对象引用。
- 如果调用
browser.windows.get时需要获取窗口内的标签页信息,需要在manifest.json的permissions字段中添加tabs权限,低版本Firefox可能因权限缺失导致API对象初始化异常。 - 可以升级到最新的Firefox ESR版本测试,排除浏览器自身的API实现bug。
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

