Google chrome extension 已为omnibox触发内容脚本

Google chrome extension 已为omnibox触发内容脚本,google-chrome-extension,Google Chrome Extension,我的Chrome扩展将内容脚本注入每个页面(“匹配项”:[“http://*/*”,“https://*/*”])。内容脚本将向后台页面触发一条消息(chrome.extension.sendRequest),后台页面注册一个事件处理程序: chrome.extension.onRequest.addListener( function (request, sender, callback) {…} ); 我注意到这些事件是在我开始在omnibox中输入时触发的,甚至在我点击Enter加载

我的Chrome扩展将内容脚本注入每个页面(
“匹配项”:[“http://*/*”,“https://*/*”]
)。内容脚本将向后台页面触发一条消息(
chrome.extension.sendRequest
),后台页面注册一个事件处理程序:

chrome.extension.onRequest.addListener(
  function (request, sender, callback) {…}
);
我注意到这些事件是在我开始在omnibox中输入时触发的,甚至在我点击Enter加载目标页面之前

情景:

  • 发射铬
  • 开始在omnibox中输入。事实上,一旦omnibox有了焦点,我的
    chrome.extension.onRequest.addListener()
    event handler[background.html]就会启动
奇怪的是,sender.tab.index的值是-1,所以它没有映射到“真实”选项卡。此外,当我继续将焦点从omnibox切换到omnibox时,事件不断发生。每次,sender.tab.index都是-1,但sender.tab.id会增加2(43,45,47,…)。这种行为很容易复制

然后,当我在omnibox中按Enter键选择URL(比如example.com)并在browser/tab中加载页面时,我会得到另一个事件。但是,这次sender.tab.index是非负的–它表示实际的浏览器选项卡,我的内容脚本处理程序可以完成它的工作


这种行为——内容脚本被注入omnibox操作的“幻影”页面——已知吗?它在任何地方都有记录吗?我的事件处理程序处理这个问题的正确方法是什么?假设我的内容脚本处理程序需要操纵网页。我是否应该检查sender.tab.index,并且仅在
sender.tab.index!=-1

Google extension的API没有完整的文档记录,并且有很多未记录的行为。从omnibox触发的这些事件并不是什么新鲜事,也没有文档记录

我建议不要自动插入您的内容脚本,而是通过编程方式,作为对chrome.tabs.onUpdate事件的响应

它将在每个url的选项卡更改时触发。您应该在background.html中收听,然后使用chrome.tabs.executeScript执行内容脚本

通过这种方式,您将能够在执行内容脚本之前验证选项卡的id和url


顺便说一句,我假设您的匹配模式是http://*/*

没有发生的那么多。预呈现页面会出现这种行为,但这种情况应该少很多。在这些情况下,您可以在内容脚本中使用,除非页面可见,否则不会向后台页面发送消息


您还应该为内容脚本注入的极端数量的“选项卡”提交一份文件。

您描述的行为称为“Chrome即时”搜索,它涉及Chrome准备不可见的搜索结果选项卡,然后将它们替换为可见的选项卡,以更快地感知搜索结果。Chrome有时还“预呈现”其他网页,以更快地感知页面加载

是的,选项卡ID为-1表示该选项卡当前是虚拟选项卡(用户无法访问)

我还没有在任何地方找到任何关于幻影(预渲染)选项卡的完整文档,但当Chrome用预渲染选项卡替换普通选项卡时,会触发两个事件,他们的文档确实提到预渲染和Chrome Instant:

模式匹配中的“是”(消息编辑器必须已删除星号。)