You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:33:21