| Index: chrome/browser/autocomplete/autocomplete.cc
|
| ===================================================================
|
| --- chrome/browser/autocomplete/autocomplete.cc (revision 104960)
|
| +++ chrome/browser/autocomplete/autocomplete.cc (working copy)
|
| @@ -324,13 +324,9 @@
|
| // thus mean this can't be navigated to (e.g. "1.2.3.4:garbage"), and we save
|
| // handling legal port numbers until after the "IP address" determination
|
| // below.
|
| - if (parts->port.is_nonempty()) {
|
| - int port;
|
| - if (!base::StringToInt(text.substr(parts->port.begin, parts->port.len),
|
| - &port) ||
|
| - (port < 0) || (port > 65535))
|
| - return QUERY;
|
| - }
|
| + if (url_parse::ParsePort(text.c_str(), parts->port) ==
|
| + url_parse::PORT_INVALID)
|
| + return QUERY;
|
|
|
| // Now that we've ruled out all schemes other than http or https and done a
|
| // little more sanity checking, the presence of a scheme means this is likely
|
| @@ -339,19 +335,21 @@
|
| return URL;
|
|
|
| // See if the host is an IP address.
|
| - if (host_info.family == url_canon::CanonHostInfo::IPV4) {
|
| - // If the user originally typed a host that looks like an IP address (a
|
| - // dotted quad), they probably want to open it. If the original input was
|
| - // something else (like a single number), they probably wanted to search for
|
| - // it, unless they explicitly typed a scheme. This is true even if the URL
|
| - // appears to have a path: "1.2/45" is more likely a search (for the answer
|
| - // to a math problem) than a URL.
|
| - if (host_info.num_ipv4_components == 4)
|
| - return URL;
|
| - return desired_tld.empty() ? UNKNOWN : REQUESTED_URL;
|
| - }
|
| if (host_info.family == url_canon::CanonHostInfo::IPV6)
|
| return URL;
|
| + // If the user originally typed a host that looks like an IP address (a
|
| + // dotted quad), they probably want to open it. If the original input was
|
| + // something else (like a single number), they probably wanted to search for
|
| + // it, unless they explicitly typed a scheme. This is true even if the URL
|
| + // appears to have a path: "1.2/45" is more likely a search (for the answer
|
| + // to a math problem) than a URL. However, if there are more non-host
|
| + // components, then maybe this really was intended to be a navigation. For
|
| + // this reason we only check the dotted-quad case here, and save the "other
|
| + // IP addresses" case for after we check the number of non-host components
|
| + // below.
|
| + if ((host_info.family == url_canon::CanonHostInfo::IPV4) &&
|
| + (host_info.num_ipv4_components == 4))
|
| + return URL;
|
|
|
| // Presence of a password means this is likely a URL. Note that unless the
|
| // user has typed an explicit "http://" or similar, we'll probably think that
|
| @@ -364,27 +362,36 @@
|
| if (parts->path.len == 1)
|
| return URL;
|
|
|
| - // If we reach here with a username, but no port or path, our input looks like
|
| - // "user@host". Because there is no scheme explicitly specified, we think
|
| - // this is more likely an email address than an HTTP auth attempt. Hence, we
|
| - // search by default and let users correct us on a case-by-case basis.
|
| - if (parts->username.is_nonempty() && !parts->port.is_nonempty() &&
|
| - !parts->path.is_nonempty())
|
| - return UNKNOWN;
|
| -
|
| - // If the host has a known TLD, it's probably a URL. Also special-case
|
| - // "localhost" as a known hostname.
|
| - if ((registry_length != 0) || (host == ASCIIToUTF16("localhost")))
|
| + // If there is more than one recognized non-host component, this is likely to
|
| + // be a URL, even if the TLD is unknown (in which case this is likely an
|
| + // intranet URL).
|
| + if (NumNonHostComponents(*parts) > 1)
|
| return URL;
|
|
|
| + // If the host has a known TLD, it's probably a URL, with the following
|
| + // exceptions:
|
| + // * Any "IP addresses" that make it here are more likely searches
|
| + // (see above).
|
| + // * If we reach here with a username, our input looks like "user@host[.tld]".
|
| + // Because there is no scheme explicitly specified, we think this is more
|
| + // likely an email address than an HTTP auth attempt. Hence, we search by
|
| + // default and let users correct us on a case-by-case basis.
|
| + // Note that we special-case "localhost" as a known hostname.
|
| + if ((host_info.family != url_canon::CanonHostInfo::IPV4) &&
|
| + ((registry_length != 0) || (host == ASCIIToUTF16("localhost"))))
|
| + return parts->username.is_nonempty() ? UNKNOWN : URL;
|
| +
|
| // If we reach this point, we know there's no known TLD on the input, so if
|
| // the user wishes to add a desired_tld, the fixup code will oblige; thus this
|
| // is a URL.
|
| if (!desired_tld.empty())
|
| return REQUESTED_URL;
|
|
|
| - // No scheme, username, password, port, path, and no known TLD on the host.
|
| + // No scheme, password, port, path, and no known TLD on the host.
|
| // This could be:
|
| + // * An "incomplete IP address"; likely a search (see above).
|
| + // * An email-like input like "user@host", where "host" has no known TLD.
|
| + // It's not clear what the user means here and searching seems reasonable.
|
| // * A single word "foo"; possibly an intranet site, but more likely a search.
|
| // This is ideally an UNKNOWN, and we can let the Alternate Nav URL code
|
| // catch our mistakes.
|
| @@ -456,6 +463,26 @@
|
| formatted_url : url_with_path;
|
| }
|
|
|
| +// static
|
| +int AutocompleteInput::NumNonHostComponents(const url_parse::Parsed& parts) {
|
| + int num_nonhost_components = 0;
|
| + if (parts.scheme.is_nonempty())
|
| + ++num_nonhost_components;
|
| + if (parts.username.is_nonempty())
|
| + ++num_nonhost_components;
|
| + if (parts.password.is_nonempty())
|
| + ++num_nonhost_components;
|
| + if (parts.port.is_nonempty())
|
| + ++num_nonhost_components;
|
| + if (parts.path.is_nonempty())
|
| + ++num_nonhost_components;
|
| + if (parts.query.is_nonempty())
|
| + ++num_nonhost_components;
|
| + if (parts.ref.is_nonempty())
|
| + ++num_nonhost_components;
|
| + return num_nonhost_components;
|
| +}
|
| +
|
| void AutocompleteInput::UpdateText(const string16& text,
|
| const url_parse::Parsed& parts) {
|
| text_ = text;
|
|
|