Firefox/URL Bar Algorithm: Difference between revisions

From MozillaWiki
Jump to navigation Jump to search
Line 36: Line 36:
==Network==
==Network==


...
# Since the <code>keyword.enabled</code> 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 <tt>keyword.URL</tt>.
# If the above step did not produce a <code>nsIURI</code> and either DNS lookup failed or the network access failed with <code>NS_ERROR_NET_RESET</code> (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 <code>browser.fixup.alternate.enabled</code> preference defaults to true we try to construct an alternate hostname.  The steps for this are in <code>nsDefaultURIFixup::MakeAlternateURI</code> and are as follows:
## Get the prefix to use from the <code>browser.fixup.alternate.prefix</code> preference; default is "www.".  Some locales set this preference.
## Get the suffix to use from the <code>browser.fixup.alternate.suffix</code> preference; default is ".com".  Some locales set this preference.
## 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 <tt>foo</tt> will become <tt>www.foo.com</tt>, as will <tt>foo.com</tt> and <tt>www.foo</tt>.  <tt>foo.org</tt> will become <tt>www.foo.org</tt>.  <tt>web.foo</tt> and <tt>x.y.foo</tt> won't be changed.
# If either of the two steps above produced a URI different from the URI whose load failed, load that new URI.

Revision as of 05:52, 29 October 2011

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

with search results limited to some subset of those sources if requested, according to this algorithm.

When Enter Is Pressed

(Adding a Ctrl or Shift modifier changes the behaviour; the below is the unmodified algorithm.)

Before Network

Function getShortCutOrURI in 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.

...

  • 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.
  • 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. foo.org will become www.foo.org. 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.