Chrome扩展:线上可操作window对象,本地mht/html文件失效
Manifest V3 Chrome扩展本地文件异常解决方案
本地纯.html文件加载错误(ERR_BLOCKED_BY_CLIENT)
这个错误是Chrome默认限制了扩展资源在file://协议下的跨源加载,哪怕加了file://*的matches规则也没用。解决办法:
- 放弃通过
content.js动态引入扩展内的write.js,改用chrome.scripting.executeScript直接注入:- 先在
manifest.json里补全权限:{ "permissions": ["scripting"], "host_permissions": ["file:///*"] } - 用后台服务工作者触发注入(替代原来的content script逻辑):
或者在需要的时候主动调用注入:// service-worker.js chrome.runtime.onInstalled.addListener(() => { chrome.declarativeContent.onPageChanged.removeRules(undefined, () => { const pageRule = { conditions: [ new chrome.declarativeContent.PageStateMatcher({ pageUrl: { schemes: ['file'] } }) ], actions: [new chrome.declarativeContent.RequestContentScript({ js: ['write.js'] })] }; chrome.declarativeContent.onPageChanged.addRules([pageRule]); }); });chrome.scripting.executeScript({ target: { tabId: 目标标签ID }, files: ['write.js'] });
- 先在
- 另外,检查Chrome隐私设置里的“阻止第三方Cookie和网站数据”,如果开启可能会影响加载,临时关闭测试(优先用上面的注入方案,不建议长期关这个设置)。
.mht文件脚本被sandbox阻止的问题
Chrome打开MHT文件时会强制启用sandbox,且默认不带allow-scripts权限,常规注入方式根本绕不开,给你几个可行方向:
- 修改Chrome启动参数(适合开发测试):
右键Chrome快捷方式→属性,在目标栏末尾加--allow-sandbox-debugging --no-sandbox(注意前面有空格),重启Chrome后再打开MHT文件,sandbox限制会被解除,脚本就能正常运行。但这个是全局生效,安全性会降低,别用于日常浏览。 - 转换MHT为HTML文件:
把MHT解压成普通HTML(用本地工具或解压软件就行),再用上面解决本地HTML的方法处理,彻底避开MHT的sandbox限制。 - 实验性API(不推荐正式用):
开启Chrome的chrome://flags/#allow-insecure-localhost或chrome://flags/#sandbox-writable-storage,但这些功能随时可能被移除,只适合临时测试。
补充
你之前用的内联脚本方法对MHT无效,是因为MHT的sandbox完全禁止了任何外部和内联脚本执行,只有解除sandbox限制或者转换文件格式才能解决。
内容的提问来源于stack exchange,提问作者user2875404
相关产品推荐
相关产品推荐

