Firefox隐身模式下getViews无法获标签页及跨模式开标签的技术咨询
问题解决思路
一、在Firefox隐身窗口中打开非隐身标签
Firefox默认会让扩展从隐身窗口创建的标签继承隐私模式,要突破这个限制,需完成以下配置:
- 在扩展的
manifest.json中添加权限与隐私模式声明:
{ "permissions": ["tabs", "privateBrowsingAllowed"], "incognito": "spanning" }
incognito": "spanning":允许扩展同时在普通和隐身窗口运行,共享同一上下文privateBrowsingAllowed:授权扩展访问隐私浏览相关功能
配置完成后,调用tabs.create时指定普通窗口的windowId,即可在普通窗口打开标签:
// 先获取普通窗口ID(假设存在已打开的普通窗口) browser.windows.getAll({windowTypes: ["normal"]}).then(windows => { if (windows.length > 0) { browser.tabs.create({ url: viewTabUrl, windowId: windows[0].id // 指定在普通窗口创建标签 }).then(tab => { // 后续业务逻辑 }); } });
二、让getViews()能获取隐身标签页
若需在隐身窗口内操作,需确保扩展处于spanning模式(同上配置),此时同一扩展上下文可访问隐身窗口的标签视图。另外,你当前用setInterval轮询的方式可替换为监听tabs.onUpdated事件,效率更高:
browser.tabs.create({url: viewTabUrl}).then(tab => { const targetId = tab.id; const onUpdated = (tabId, changeInfo) => { if (tabId === targetId && changeInfo.status === "complete" && !isEditorUpdated) { browser.tabs.onUpdated.removeListener(onUpdated); const views = browser.extension.getViews({tabId: targetId}); if (views.length > 0) { views[0].myFunction(); } } }; browser.tabs.onUpdated.addListener(onUpdated); });
如果仍无法获取视图,推荐改用消息通信替代getViews,这种方式不受隐私模式隔离影响,稳定性更强:
- 在内容脚本中注册消息监听:
// content-script.js browser.runtime.onMessage.addListener((message) => { if (message.action === "runMyFunction") { myFunction(); } });
- 在后台脚本中,待标签加载完成后发送消息触发函数:
browser.tabs.create({url: viewTabUrl}).then(tab => { const targetId = tab.id; const onUpdated = (tabId, changeInfo) => { if (tabId === targetId && changeInfo.status === "complete" && !isEditorUpdated) { browser.tabs.onUpdated.removeListener(onUpdated); browser.tabs.sendMessage(targetId, {action: "runMyFunction"}); isEditorUpdated = true; } }; browser.tabs.onUpdated.addListener(onUpdated); });
注意事项
- Firefox对扩展隐私模式权限管控严格,
spanning模式需要用户在安装扩展时同意访问隐私窗口 - 消息通信是浏览器扩展跨上下文交互的推荐方案,比直接获取视图更符合安全模型
内容的提问来源于stack exchange,提问作者v3rtikal
相关产品推荐
相关产品推荐

