Firefox/URL Bar Algorithm

From MozillaWiki
Jump to: navigation, search

This page documents the steps Firefox takes as a user types some text into the URL bar, and when they press "Enter" or "Go".

While The User Is Typing

From the very first character typed, we dynamically search:

  • history titles and URLs
  • bookmark titles, URLs and tags
  • open tabs titles and URLs

The results are sorted in the following order:

  • Keywords: If the first search string matches a bookmark keyword, the first result will be the keyword search URL. Any subsequent search strings will be added to the URL in the result. For example, a Google keyword search will show a result for "google" of "http://www.google.com/search?q=", with the result for "google foo" being "http://www.google.com/search?q=foo".
  • Adaptive matching: The next set of results will be those for which the typed string matches a previous selection from the results for that same typed string. For example, if I often type "goo" and select http://www.google.com from the results, then that URL will quickly become the top matching result when I type "goo".
  • Frecency: The rest of the results are sorted according to the Places Frecency algorithm.

Search results can be limited to some subset of the possible sources, according to this algorithm. A slightly older description of this process is also available.

When Enter Is Pressed

Before Network

  • The command is handled by urlbarBindings.xml's "urlbar" binding's handleCommand method
    • It first calls _canonizeURL (urlbarBindings.xml), which handles Ctrl/Shift/Alt modifier suffix addition (e.g. Ctrl+Enter to add "www." and ".com")
    • _canonizeURL also calls getShortcutOrURI (browser.js)
      • If the string contains a space, split on the first space and examine the first token.
        • If it's a search engine keyword, expand using the relevant search URL.
        • If it's a user-defined keyword, expand that.
    • With the URL filtered through _canonizeURL, and the right tab/window obtained via handleCommand's modifier checking code, call nsDocShell::LoadURI with LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP

..

  • If it looks like a search according to this algorithm, insert it into the keyword.URL preference value to produce a search URL, since the keyword.enabled preference defaults to true in Firefox.
    • Note: "insert it into the keyword.URL preference" now means "perform a search using the default search engine", when keyword.URL's value is empty (the default in Firefox)
    • The algorithm says it's a search if it contains a space or a quote before the first dot, colon or question mark, or if it starts with a question mark.

...

  • If we're looking at something that does not have a scheme specified, prepend either "ftp://" or "http://" depending on whether nsDefaultURIFixup::IsLikelyFTP returns true.
  • Try to construct an nsIURI. If that fails, fall back on producing a search url from keyword.URL, since again keyword.enabled defaults to true.
  • Start the network load.

Network

  1. Since the keyword.enabled preference is true, if DNS lookup for the hostname failed and the URI scheme contains the string "http" and the hostname does not contain a '.' then plug the hostname (possibly after some decoding from punycode to UTF-8) into keyword.URL.
  2. If the above step did not produce a nsIURI and either DNS lookup failed or the network access failed with NS_ERROR_NET_RESET (typically means the server did not respond or dropped the connection immediately) and the protocol is "http" and the url does not contain a username or password then because the browser.fixup.alternate.enabled preference defaults to true we try to construct an alternate hostname. The steps for this are in nsDefaultURIFixup::MakeAlternateURI and are as follows:
    1. Get the prefix to use from the browser.fixup.alternate.prefix preference; default is "www.". Some locales set this preference.
    2. Get the suffix to use from the browser.fixup.alternate.suffix preference; default is ".com". Some locales set this preference.
    3. If the hostname includes no '.' characters, prepend the prefix and append the suffix. Else if it has a single '.' and the part ending on the '.' is equal to our prefix, append the suffix. Else if it has a single '.' and tour suffix is nonempty prepend the prefix. For the default pref values, this means the "foo" will become "www.foo.com", as will "foo.com" and "www.foo". Similarly, "foo.org" will become "www.foo.org". On the other hand, "web.foo" and "x.y.foo" won't be changed.
  3. If either of the two steps above produced a URI different from the URI whose load failed, load that new URI.