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

Chrome扩展中chrome.action.setIcon失效及CSP报错求助

问题:Chrome扩展切换图标功能失效并触发CSP报错

开发一款低电量警告Chrome扩展(暂未实现电量相关功能),尝试通过按钮切换扩展图标(后续用于实现闪烁警告效果),但功能无法正常运行,同时出现如下报错:

Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self' blob: filesystem:". Either the 'unsafe-inline' keyword, a hash ('sha256-mqcqEU/uq+7l/09r6PQ1PMjli3dMmm7Zm0fA+SedCWI='), or a nonce ('nonce-...') is required to enable inline execution.

相关代码

HTML

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="/scripts/main.css">
        <script src="scripts/main.js"></script>
    </head>
    <body>
        <button id="testRED" onclick="iconRED()">RED</button>
        <button id="testGREEN">GREEN</button>
    </body>
</html>

JS

function iconRED() {
    chrome.action.setIcon.setIcon({path: "icons/iconRED.png"});
}
function iconGREEN() {
    chrome.action.setIcon.setIcon({path: "icons/iconGREEN.png"});
}

Manifest

{
    "name": "Battery Warning",
    "description": "Battery Warning",
    "version": "1.0",
    "permissions": [
      "background",
      "storage"
    ],
    "background": {
      "service_worker": "scripts/background.js"
    },
    "browser_action": {
      "default_popup": "popup.html",
      "default_title": "Battery Warning",
      "default_icon": {
        "16": "/icons/icon.png",
        "32": "/icons/icon.png",
        "48": "/icons/icon.png",
        "128": "/icons/icon.png"
      }
    },
    "manifest_version": 2,
    "icons": {
      "16": "/icons/icon.png",
      "32": "/icons/icon.png",
      "48": "/icons/icon.png",
      "128": "/icons/icon.png"
    }
  }

解决方案

1. 修复CSP内联脚本错误

Chrome扩展默认禁止内联脚本,需移除HTML中的onclick属性,改用JS添加事件监听器:

<button id="testRED">RED</button>
<button id="testGREEN">GREEN</button>

2. 修正API调用错误

你当前使用Manifest V2,chrome.action是Manifest V3的API,需改用chrome.browserAction,同时修复重复调用的错误:

document.addEventListener('DOMContentLoaded', () => {
    document.getElementById('testRED').addEventListener('click', iconRED);
    document.getElementById('testGREEN').addEventListener('click', iconGREEN);
});

function iconRED() {
    chrome.browserAction.setIcon({path: "icons/iconRED.png"});
}
function iconGREEN() {
    chrome.browserAction.setIcon({path: "icons/iconGREEN.png"});
}

3. 修正HTML脚本路径错误

原HTML中<script scr="scripts/main/js"></script>存在拼写错误,需改为src="scripts/main.js"(已在上述修改中修正)。

4. 可选:升级到Manifest V3

若打算适配最新扩展标准,可修改Manifest为V3版本:

{
    "name": "Battery Warning",
    "description": "Battery Warning",
    "version": "1.0",
    "permissions": ["storage"],
    "background": {
      "service_worker": "scripts/background.js"
    },
    "action": {
      "default_popup": "popup.html",
      "default_title": "Battery Warning",
      "default_icon": {
        "16": "/icons/icon.png",
        "32": "/icons/icon.png",
        "48": "/icons/icon.png",
        "128": "/icons/icon.png"
      }
    },
    "manifest_version": 3,
    "icons": {
      "16": "/icons/icon.png",
      "32": "/icons/icon.png",
      "48": "/icons/icon.png",
      "128": "/icons/icon.png"
    }
  }

此时JS中的API调用改为chrome.action.setIcon即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:45:35