Javascript Chrome<;所有URL>;内容脚本注入权限
我不确定这是错误还是清单文件配置错误,但Javascript Chrome<;所有URL>;内容脚本注入权限,javascript,google-chrome-extension,content-script,Javascript,Google Chrome Extension,Content Script,我不确定这是错误还是清单文件配置错误,但权限不适用于内容脚本注入。下面是一个导致错误的简单示例 manifest.json: { "manifest_version": 2, "name": "Bug?", "version": "1", "description": "This seems to be a bug", "minimum_chrome_version": "50", "background": { "scripts": ["background.j
权限不适用于内容脚本注入。下面是一个导致错误的简单示例
manifest.json:
{
"manifest_version": 2,
"name": "Bug?",
"version": "1",
"description": "This seems to be a bug",
"minimum_chrome_version": "50",
"background": {
"scripts": ["background.js"],
"persistent": false
},
"permissions": [
"<all_urls>",
"tabs",
"webNavigation"
]
}
我的目标
我希望我的内容脚本在浏览器处理页面及其所有子框架中的任何html之前运行。我知道我可以在清单文件中指定我的内容脚本。但是,这不允许我选择为根帧和子帧运行不同的内容脚本。因此,上面的代码是一个很好的玩具示例,说明了我最终的代码可能是什么样子
到底发生了什么
对于每个帧,内容脚本无法执行,出现以下错误:
无法访问url“”的内容。扩展清单必须请求访问此主机的权限。
什么<代码>并不意味着所有URL
是什么让它起作用的?
如果我将chrome.webNavigation.onbeforeavigation
更改为chrome.webNavigation.onCommitted
,则注入将按预期工作(除了about:blank
页面,可以轻松修复)。但是,这并不保证在处理任何html之前运行我的内容脚本
有什么想法吗?你在这里遇到了一大堆时间问题 如果在
onCommitted
发生之前尝试注入,则实际上是在尝试注入旧文档,因为它尚未更改
这是一个有根据的猜测,但可能发生的是一个竞争条件,当您对旧URL的权限进行评估时,但当注入实际发生时,导航生效,并且来源现在不同
“文档开始”处运行的事件的webNavigation
/选项卡的时间安排不好。只有在清单(或declarativeContent
API的实验性内容脚本操作)中指定它时,它才能有效地发挥作用
现在,说到你的问题:
但是,这不允许我选择为根帧和子帧运行不同的内容脚本
那根本不是真的。您可以将逻辑分支为:
因此,对于“document\u start”
脚本,您应该依赖清单注入,并且您可以同步地为子帧实现不同的逻辑。您在这里遇到了一系列糟糕的时间问题
如果在onCommitted
发生之前尝试注入,则实际上是在尝试注入旧文档,因为它尚未更改
这是一个有根据的猜测,但可能发生的是一个竞争条件,当您对旧URL的权限进行评估时,但当注入实际发生时,导航生效,并且来源现在不同
“文档开始”
处运行的事件的webNavigation
/选项卡的时间安排不好。只有在清单(或declarativeContent
API的实验性内容脚本操作)中指定它时,它才能有效地发挥作用
现在,说到你的问题:
但是,这不允许我选择为根帧和子帧运行不同的内容脚本
那根本不是真的。您可以将逻辑分支为:
因此,对于“document\u start”
脚本,您应该依赖清单注入,并且您可以同步地为子帧实现不同的逻辑。
并不意味着所有URL,而是所有支持的URL。你能举一个失败的URL的例子吗?
不是指所有的URL,而是指所有支持的URL。你能举一个失败的URL的例子吗?
chrome.webNavigation.onBeforeNavigate.addListener(info => {
chrome.tabs.executeScript(info.tabId, {
frameId: info.frameId,
code: 'console.log("works")',
runAt: 'document_start'
}, () => {
if(chrome.runtime.lastError)
console.error(chrome.runtime.lastError.message)
})
})
if (window.parent != window) {
// Subframe
} else {
// Main frame
}