Safari扩展预览链接触发Cannot access contents错误的解决方法
Safari扩展按住链接预览时background.js报错的解决办法
问题根源
Safari的链接预览(快速查看)页面不属于常规活跃标签页,activeTab权限的生效前提是用户主动交互触发的当前活跃标签,而预览页是系统自动生成的临时页面,不满足这个触发条件,所以尝试访问页面内容时会触发权限错误。同时未处理的Promise拒绝会直接中断background.js的后续代码执行。
解决步骤
强制捕获Promise错误:所有涉及页面内容访问的API调用必须添加
.catch()处理异常,避免错误扩散终止整个脚本。示例:chrome.tabs.query({active: true, currentWindow: true}) .then(tabs => { return chrome.tabs.executeScript(tabs[0].id, {code: 'document.body.innerHTML'}); }) .catch(err => { if (err.message.includes('Cannot access contents of the page')) { console.log('跳过预览页面的内容访问'); // 直接执行新标签打开逻辑 chrome.tabs.create({url: targetLinkUrl}); } else { console.error('操作出错:', err); } });提前识别预览页面:Safari预览页有明显特征,比如
url为about:blank、title为空,或者标签类型特殊。可以通过chrome.tabs.get()获取标签信息,提前跳过内容访问:chrome.tabs.get(currentTabId, tab => { if (tab.url === 'about:blank' || !tab.title) { // 直接打开新标签,不处理内容 chrome.tabs.create({url: targetLinkUrl}); return; } // 正常标签页的业务逻辑 });权限补充(按需):如果你的扩展需要固定访问某些网站,除了
activeTab,可以在manifest里添加具体主机权限,比如:"permissions": [ "activeTab", "*://*.your-target-site.com/*" ]但注意这会扩大权限范围,仅必要时使用。
Safari版本与配置校验:确保你用的是Manifest V3(Safari 15.4+支持),
activeTab正确写在permissions数组里,同时在Safari扩展设置中确认扩展已被授予权限。
核心提醒
activeTab权限不覆盖Safari的特殊临时页面场景,别指望它能处理所有标签页访问。- 未处理的Promise拒绝是后续代码停摆的直接原因,所有异步操作必须加错误捕获。
内容的提问来源于stack exchange,提问作者user23266137
相关产品推荐
相关产品推荐

