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
}