搜索生命周期

当在地址栏中输入字符或地址栏获得焦点时,我们将启动搜索。以下是搜索生命周期的简化版本,描述了返回已输入字符串结果的管道。为了清晰起见,本文档有意省略了查询生命周期的一些部分。

本文档中描述的搜索是地址栏内部的搜索。它不是在您按下 Enter 键时发送到默认搜索引擎的搜索。如以下所述,此过程的部分内容通常会在每次击键时发生多次。

建议您首先阅读非技术概述,以便熟悉本文档中的术语。本文档截至 2023 年 4 月为最新版本。

  1. 用户在UrlbarInput <input> DOM 元素中输入查询(例如,“我附近的咖啡馆”)。该 DOM 元素告知UrlbarInput正在输入文本。

  2. UrlbarInput 启动搜索。它创建一个UrlbarQueryContext将其传递给 UrlbarController。查询上下文是一个将在查询期间存在的对象,它也是我们跟踪要显示哪些结果的方式。它包含诸如允许哪些类型的结果、搜索字符串(在本例中为“我附近的咖啡馆”)以及有关 Urlbar 状态的其他信息。每次输入文本更改时,都会创建一个新的UrlbarQueryContext

  3. UrlbarController 告知 UrlbarProvidersManager提供程序应获取结果。

  4. UrlbarProvidersManager 通过调用其 isActive 方法告知每个提供程序是否要为该查询提供结果。提供程序可以决定它是否将对此查询处于活动状态。某些提供程序很少处于活动状态:例如,如果用户已输入搜索字符串,则UrlbarProviderTopSites 将不会处于活动状态

  5. 然后,UrlbarProvidersManager 通过调用其 startQuery 方法告知活动提供程序获取结果。

  6. 提供程序异步获取查询结果。每个提供程序都以不同的方式获取结果。例如,如果默认搜索引擎是 Google,则UrlbarProviderSearchSuggestions 会将字符串“我附近的咖啡馆”发送到 Google。Google 将返回建议列表,UrlbarProviderSearchSuggestions 将为每个建议创建一个UrlbarResult

  7. 提供程序将其结果发送回UrlbarProvidersManager。它们通过调用传递给 startQuery 的 addCallback 回调一次返回一个结果。UrlbarProvidersManager 获取所有提供程序的所有结果,并将其放入未排序结果列表中

    由于提供程序的异步和并行特性,此步骤和后续步骤可能在每次搜索中发生多次。某些提供程序可能比其他提供程序花费更长的时间才能返回其结果。在显示结果之前,我们不想等待缓慢的提供程序。为了处理缓慢的提供程序,UrlbarProvidersManager 以“块”的形式从提供程序中收集结果。一个内部定时器会触发。每次定时器触发时,我们都会获取来自活动提供程序的任何结果(结果的“块”)并执行以下步骤。

  8. UrlbarProvidersManager 要求UrlbarMuxer对未排序的结果进行排序。

  9. UrlbarMuxer 选择将显示给用户的结果。它对结果进行分组和排序以确定结果的显示顺序。此过程通常涉及丢弃不相关和重复的结果。我们还将结果限制在browser.urlbar.maxRichResults偏好设置中定义的限制内。

  10. 结果排序后,UrlbarProvidersManager 告知 UrlbarController结果已准备好显示。

  11. UrlbarController 发出通知,指示结果已准备好显示。UrlbarView 正在监听该通知。视图收到通知后,它调用 #updateResults为每个UrlbarResult创建DOM 节点,并将其插入到视图的 DOM 元素中。

    如上所述,我们可能在每次搜索中多次到达此步骤。这意味着我们可能在每次击键时多次更新视图。在单个击键后多次发生明显变化的视图会被用户认为是“闪烁”。因此,我们尝试限制视图需要更新的次数。

    A chart with boxes representing the various components of the address bar. An arrow moves between the boxes to illustrate a query moving through the components.