为多功能框触发的内容脚本

时间:2012-03-27 00:32:24

标签: google-chrome-extension

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

chrome.extension.onRequest.addListener(
  function (request, sender, callback) {…}
);

我注意到,当我开始输入多功能框时,这些事件会被触发 - 甚至在我按Enter键加载目标页面之前。

情景:

  • 启动Chrome
  • 开始输入多功能框。实际上,只要多功能框具有焦点,我的chrome.extension.onRequest.addListener()事件处理程序[background.html]就会被触发。

奇怪的是sender.tab.index值为-1,因此它不会映射到“真实”选项卡。此外,当我继续将焦点从多功能框切换回来时,事件继续发射。每次sender.tab.index为-1,但sender.tab.id增加2(43,45,47,...)。这种行为很容易重现。

然后,当我通过在多功能框中点击Enter来实际选择一个URL(比如example.com),然后在浏览器/选项卡中加载页面时,我又得到另一个事件。但是,这次sender.tab.index是非负的 - 它代表实际的浏览器选项卡,我的内容脚本处理程序可以完成它的工作。

这种行为 - 内容脚本是否被注入到多功能行为操作的“幻像”页面中 - 已知,是否记录在任何地方?我的事件处理程序处理这个问题的正确方法是什么?假设我的内容脚本处理程序需要操作网页。我应该检查sender.tab.index,只在sender.tab.index != -1

进行工作

3 个答案:

答案 0 :(得分:1)

没有发生的那么多。预渲染页面的行为是预期的,但这应该不那么频繁。在这些情况下,您可以在内容脚本中使用Page Visibility API,除非页面可见,否则不会向背景页面发送消息。

您还应该为内容脚本注入的极端数量的“标签”提交bug report

答案 1 :(得分:1)

您所描述的行为称为“Chrome即搜即得”搜索,它涉及Chrome准备隐藏搜索结果标签,然后将其更换为可见标签,以便更快地感知搜索结果。 Chrome有时会“预渲染”其他网页,以加快感知页面加载速度。

是的,标签ID为-1表示该标签当前是幻像标签(用户无法访问)。

我还没有在任何地方找到幻像(预渲染)标签的任何详细文档,但是当Chrome用预渲染标签替换普通标签时,有两个事件被触发,他们的文档确实提到了预渲染和Chrome即时消息:

答案 2 :(得分:0)

Google扩展程序的API未完整记录,并且存在大量未记录的行为。从多功能框发射的这些事件并不新鲜,也没有记录。

我建议不要自动注入内容脚本,而是以编程方式执行,作为对chrome.tabs.onUpdated事件的响应。

http://code.google.com/chrome/extensions/tabs.html#event-onUpdated

它将触发每个网址的标签更改。您应该在background.html中收听它,然后使用chrome.tabs.executeScript执行内容脚本。

http://code.google.com/chrome/extensions/tabs.html#method-executeScript

通过这种方式,您可以在执行内容脚本之前验证选项卡的ID和URL。

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