Index: chrome/browser/autocomplete/autocomplete_result.h |
diff --git a/chrome/browser/autocomplete/autocomplete_result.h b/chrome/browser/autocomplete/autocomplete_result.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1d69b094752b3a49f512daf169ce6c4adf9a921c |
--- /dev/null |
+++ b/chrome/browser/autocomplete/autocomplete_result.h |
@@ -0,0 +1,162 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_RESULT_H_ |
+#define CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_RESULT_H_ |
+#pragma once |
+ |
+#include <stddef.h> |
+ |
+#include <map> |
+ |
+#include "base/basictypes.h" |
+#include "chrome/browser/autocomplete/autocomplete_types.h" |
+#include "googleurl/src/gurl.h" |
+ |
+class AutocompleteInput; |
+struct AutocompleteMatch; |
+class AutocompleteProvider; |
+ |
+// All matches from all providers for a particular query. This also tracks |
+// what the default match should be if the user doesn't manually select another |
+// match. |
+class AutocompleteResult { |
+ public: |
+ typedef ACMatches::const_iterator const_iterator; |
+ typedef ACMatches::iterator iterator; |
+ |
+ // The "Selection" struct is the information we need to select the same match |
+ // in one result set that was selected in another. |
+ struct Selection { |
+ Selection() |
+ : provider_affinity(NULL), |
+ is_history_what_you_typed_match(false) { |
+ } |
+ |
+ // Clear the selection entirely. |
+ void Clear(); |
+ |
+ // True when the selection is empty. |
+ bool empty() const { |
+ return destination_url.is_empty() && !provider_affinity && |
+ !is_history_what_you_typed_match; |
+ } |
+ |
+ // The desired destination URL. |
+ GURL destination_url; |
+ |
+ // The desired provider. If we can't find a match with the specified |
+ // |destination_url|, we'll use the best match from this provider. |
+ const AutocompleteProvider* provider_affinity; |
+ |
+ // True when this is the HistoryURLProvider's "what you typed" match. This |
+ // can't be tracked using |destination_url| because its URL changes on every |
+ // keystroke, so if this is set, we'll preserve the selection by simply |
+ // choosing the new "what you typed" entry and ignoring |destination_url|. |
+ bool is_history_what_you_typed_match; |
+ }; |
+ |
+ // Max number of matches we'll show from the various providers. |
+ static const size_t kMaxMatches; |
+ |
+ // The lowest score a match can have and still potentially become the default |
+ // match for the result set. |
+ static const int kLowestDefaultScore; |
+ |
+ AutocompleteResult(); |
+ ~AutocompleteResult(); |
+ |
+ // operator=() by another name. |
+ void CopyFrom(const AutocompleteResult& rhs); |
+ |
+ // Copies matches from |old_matches| to provide a consistant result set. See |
+ // comments in code for specifics. |
+ void CopyOldMatches(const AutocompleteInput& input, |
+ const AutocompleteResult& old_matches); |
+ |
+ // Adds a single match. The match is inserted at the appropriate position |
+ // based on relevancy and display order. This is ONLY for use after |
+ // SortAndCull() has been invoked, and preserves default_match_. |
+ void AddMatch(const AutocompleteMatch& match); |
+ |
+ // Adds a new set of matches to the result set. Does not re-sort. |
+ void AppendMatches(const ACMatches& matches); |
+ |
+ // Removes duplicates, puts the list in sorted order and culls to leave only |
+ // the best kMaxMatches matches. Sets the default match to the best match |
+ // and updates the alternate nav URL. |
+ void SortAndCull(const AutocompleteInput& input); |
+ |
+ // Returns true if at least one match was copied from the last result. |
+ bool HasCopiedMatches() const; |
+ |
+ // Vector-style accessors/operators. |
+ size_t size() const; |
+ bool empty() const; |
+ const_iterator begin() const; |
+ iterator begin(); |
+ const_iterator end() const; |
+ iterator end(); |
+ |
+ // Returns the match at the given index. |
+ const AutocompleteMatch& match_at(size_t index) const; |
+ AutocompleteMatch* match_at(size_t index); |
+ |
+ // Get the default match for the query (not necessarily the first). Returns |
+ // end() if there is no default match. |
+ const_iterator default_match() const { return default_match_; } |
+ |
+ const GURL& alternate_nav_url() const { return alternate_nav_url_; } |
+ |
+ // Clears the matches for this result set. |
+ void Reset(); |
+ |
+ void Swap(AutocompleteResult* other); |
+ |
+#ifndef NDEBUG |
+ // Does a data integrity check on this result. |
+ void Validate() const; |
+#endif |
+ |
+ private: |
+ typedef std::map<AutocompleteProvider*, ACMatches> ProviderToMatches; |
+ |
+#if defined(OS_ANDROID) |
+ // iterator::difference_type is not defined in the STL that we compile with on |
+ // Android. |
+ typedef int matches_difference_type; |
+#else |
+ typedef ACMatches::iterator::difference_type matches_difference_type; |
+#endif |
+ |
+ // Populates |provider_to_matches| from |matches_|. |
+ void BuildProviderToMatches(ProviderToMatches* provider_to_matches) const; |
+ |
+ // Returns true if |matches| contains a match with the same destination as |
+ // |match|. |
+ static bool HasMatchByDestination(const AutocompleteMatch& match, |
+ const ACMatches& matches); |
+ |
+ // Copies matches into this result. |old_matches| gives the matches from the |
+ // last result, and |new_matches| the results from this result. |
+ void MergeMatchesByProvider(const ACMatches& old_matches, |
+ const ACMatches& new_matches); |
+ |
+ ACMatches matches_; |
+ |
+ const_iterator default_match_; |
+ |
+ // The "alternate navigation URL", if any, for this result set. This is a URL |
+ // to try offering as a navigational option in case the user navigated to the |
+ // URL of the default match but intended something else. For example, if the |
+ // user's local intranet contains site "foo", and the user types "foo", we |
+ // default to searching for "foo" when the user may have meant to navigate |
+ // there. In cases like this, the default match will point to the "search for |
+ // 'foo'" result, and this will contain "http://foo/". |
+ GURL alternate_nav_url_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AutocompleteResult); |
+}; |
+ |
+#endif // CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_RESULT_H_ |