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

chrome.declarativeContent的RequestContentScript权限浏览器重启后不生效问题

核心原因

chrome.declarativeContent 注册的页面规则不会被浏览器持久化存储,浏览器重启、扩展重载后所有已注册的规则会被清空。你的代码仅在用户主动触发权限申请的回调中执行规则注册逻辑,扩展后台脚本在重启后重新加载时,没有触发规则重新注册的逻辑,因此即使权限仍处于授权状态,也没有匹配的规则执行脚本注入。

排查验证步骤

  • 打开扩展的后台服务 worker 控制台,执行以下代码查看当前注册的规则:
    chrome.declarativeContent.onPageChanged.getRules(console.log)
    如果重启浏览器后输出为空数组,即可确认是规则丢失导致的问题。
  • 执行以下代码确认权限仍在有效期:
    chrome.permissions.getAll(console.log)
    确认返回结果中包含 declarativeContent 权限和对应站点的origin权限。

修复方案

将规则注册逻辑抽离为公共函数,在两个时机触发注册:1. 首次权限申请成功时;2. 后台脚本初始化、检测到已有对应权限时。

修改后的示例代码如下:

// 抽离公共的规则注册函数
function registerInjectRules() {
  const conditions = [
    new chrome.declarativeContent.PageStateMatcher({
      pageUrl: { hostEquals: 'www.amazon.fr', schemes: ['https'] },
      css: ['div'],
    })
  ]
  const injectRule = {
    conditions,
    actions: [
      new chrome.declarativeContent.RequestContentScript({ 
        js: ['page_injects/index.js'], 
        css: ['page_injects/index.css'] 
      })
    ]
  }
  chrome.declarativeContent.onPageChanged.removeRules(undefined, () => {
    chrome.declarativeContent.onPageChanged.addRules([injectRule], () => {
      console.log('注入规则注册完成')
    })
  })
}

// 后台脚本初始化时检查已有权限,存在则直接注册规则
chrome.permissions.contains({
  permissions: ['declarativeContent'],
  origins: ['https://www.amazon.fr/']
}, (hasPermission) => {
  if (hasPermission) {
    registerInjectRules()
  }
})

// 原有的权限申请逻辑,申请成功后调用注册函数
function requestAmazonPermission() {
  chrome.permissions.request({
    permissions: ['declarativeContent'],
    origins:['https://www.amazon.fr/'],
  }, (granted) => {
    console.log({ granted })
    if (granted) {
      registerInjectRules()
    }
  })
}

内容的提问来源于stack exchange,提问作者AnandShiva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:48:04