diff options
author | blundell <blundell@chromium.org> | 2015-06-16 03:47:08 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-06-16 10:47:38 +0000 |
commit | 0235a503e4c2580b85b11f42fc26b98b0e5e2e4d (patch) | |
tree | 34a90e33068a1b4a7d8438d078f293621385e9a5 /components | |
parent | 0ff8251c76b66e56f86c4f842f8aad34836c95bc (diff) | |
download | chromium_src-0235a503e4c2580b85b11f42fc26b98b0e5e2e4d.zip chromium_src-0235a503e4c2580b85b11f42fc26b98b0e5e2e4d.tar.gz chromium_src-0235a503e4c2580b85b11f42fc26b98b0e5e2e4d.tar.bz2 |
Componentize HistoryProvider.
BUG=371538
Review URL: https://codereview.chromium.org/1184783002
Cr-Commit-Position: refs/heads/master@{#334582}
Diffstat (limited to 'components')
-rw-r--r-- | components/omnibox.gypi | 3 | ||||
-rw-r--r-- | components/omnibox/BUILD.gn | 3 | ||||
-rw-r--r-- | components/omnibox/DEPS | 3 | ||||
-rw-r--r-- | components/omnibox/history_provider.cc | 105 | ||||
-rw-r--r-- | components/omnibox/history_provider.h | 52 |
5 files changed, 165 insertions, 1 deletions
diff --git a/components/omnibox.gypi b/components/omnibox.gypi index 1e1e1cf..61bd261 100644 --- a/components/omnibox.gypi +++ b/components/omnibox.gypi @@ -14,6 +14,7 @@ '../net/net.gyp:net', '../ui/base/ui_base.gyp:ui_base', '../url/url.gyp:url_lib', + 'bookmarks_browser', 'component_metrics_proto', 'components_resources.gyp:components_resources', 'components_strings.gyp:components_strings', @@ -48,6 +49,8 @@ 'omnibox/autocomplete_scheme_classifier.h', 'omnibox/base_search_provider.cc', 'omnibox/base_search_provider.h', + 'omnibox/history_provider.cc', + 'omnibox/history_provider.h', 'omnibox/in_memory_url_index_types.cc', 'omnibox/in_memory_url_index_types.h', 'omnibox/keyword_extensions_delegate.cc', diff --git a/components/omnibox/BUILD.gn b/components/omnibox/BUILD.gn index b5c3a32..d633d28 100644 --- a/components/omnibox/BUILD.gn +++ b/components/omnibox/BUILD.gn @@ -19,6 +19,8 @@ static_library("omnibox") { "autocomplete_scheme_classifier.h", "base_search_provider.cc", "base_search_provider.h", + "history_provider.cc", + "history_provider.h", "in_memory_url_index_types.cc", "in_memory_url_index_types.h", "keyword_extensions_delegate.cc", @@ -47,6 +49,7 @@ static_library("omnibox") { deps = [ "//base", "//base:i18n", + "//components/bookmarks/browser", "//components/history/core/browser", "//components/resources", "//components/search", diff --git a/components/omnibox/DEPS b/components/omnibox/DEPS index 7809f1f..6413f71 100644 --- a/components/omnibox/DEPS +++ b/components/omnibox/DEPS @@ -1,5 +1,6 @@ include_rules = [ - "+components/history", + "+components/bookmarks/browser", + "+components/history/core/browser", "+components/metrics/proto", "+components/search", "+components/search_engines", diff --git a/components/omnibox/history_provider.cc b/components/omnibox/history_provider.cc new file mode 100644 index 0000000..9c00f05 --- /dev/null +++ b/components/omnibox/history_provider.cc @@ -0,0 +1,105 @@ +// 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. + +#include "components/omnibox/history_provider.h" + +#include <string> + +#include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" +#include "components/bookmarks/browser/bookmark_model.h" +#include "components/history/core/browser/history_service.h" +#include "components/omnibox/autocomplete_input.h" +#include "components/omnibox/autocomplete_match.h" +#include "components/omnibox/in_memory_url_index_types.h" +#include "url/url_util.h" + +using bookmarks::BookmarkModel; + +void HistoryProvider::DeleteMatch(const AutocompleteMatch& match) { + DCHECK(done_); + DCHECK(client_); + DCHECK(match.deletable); + + history::HistoryService* const history_service = client_->HistoryService(); + + // Delete the underlying URL along with all its visits from the history DB. + // The resulting HISTORY_URLS_DELETED notification will also cause all caches + // and indices to drop any data they might have stored pertaining to the URL. + DCHECK(history_service); + DCHECK(match.destination_url.is_valid()); + history_service->DeleteURL(match.destination_url); + + DeleteMatchFromMatches(match); +} + +// static +bool HistoryProvider::PreventInlineAutocomplete( + const AutocompleteInput& input) { + return input.prevent_inline_autocomplete() || + (!input.text().empty() && + IsWhitespace(input.text()[input.text().length() - 1])); +} + +HistoryProvider::HistoryProvider(AutocompleteProvider::Type type, + AutocompleteProviderClient* client) + : AutocompleteProvider(type), client_(client) { +} + +HistoryProvider::~HistoryProvider() {} + +void HistoryProvider::DeleteMatchFromMatches(const AutocompleteMatch& match) { + bool found = false; + BookmarkModel* bookmark_model = client_->BookmarkModel(); + for (ACMatches::iterator i(matches_.begin()); i != matches_.end(); ++i) { + if (i->destination_url == match.destination_url && i->type == match.type) { + found = true; + if ((i->type == AutocompleteMatchType::URL_WHAT_YOU_TYPED) || + (bookmark_model && + bookmark_model->IsBookmarked(i->destination_url))) { + // We can't get rid of What-You-Typed or Bookmarked matches, + // but we can make them look like they have no backing data. + i->deletable = false; + i->description.clear(); + i->description_class.clear(); + } else { + matches_.erase(i); + } + break; + } + } + DCHECK(found) << "Asked to delete a URL that isn't in our set of matches"; +} + +// static +ACMatchClassifications HistoryProvider::SpansFromTermMatch( + const TermMatches& matches, + size_t text_length, + bool is_url) { + ACMatchClassification::Style url_style = + is_url ? ACMatchClassification::URL : ACMatchClassification::NONE; + ACMatchClassifications spans; + if (matches.empty()) { + if (text_length) + spans.push_back(ACMatchClassification(0, url_style)); + return spans; + } + if (matches[0].offset) + spans.push_back(ACMatchClassification(0, url_style)); + size_t match_count = matches.size(); + for (size_t i = 0; i < match_count;) { + size_t offset = matches[i].offset; + spans.push_back(ACMatchClassification(offset, + ACMatchClassification::MATCH | url_style)); + // Skip all adjacent matches. + do { + offset += matches[i].length; + ++i; + } while ((i < match_count) && (offset == matches[i].offset)); + if (offset < text_length) + spans.push_back(ACMatchClassification(offset, url_style)); + } + + return spans; +} diff --git a/components/omnibox/history_provider.h b/components/omnibox/history_provider.h new file mode 100644 index 0000000..e7ed8d2 --- /dev/null +++ b/components/omnibox/history_provider.h @@ -0,0 +1,52 @@ +// 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 COMPONENTS_OMNIBOX_HISTORY_PROVIDER_H_ +#define COMPONENTS_OMNIBOX_HISTORY_PROVIDER_H_ + +#include "base/compiler_specific.h" +#include "components/omnibox/autocomplete_provider.h" +#include "components/omnibox/autocomplete_provider_client.h" +#include "components/omnibox/in_memory_url_index_types.h" + +class AutocompleteInput; +class Profile; +struct AutocompleteMatch; + +// This class is a base class for the history autocomplete providers and +// provides functions useful to all derived classes. +class HistoryProvider : public AutocompleteProvider { + public: + void DeleteMatch(const AutocompleteMatch& match) override; + + // Returns true if inline autocompletion should be prevented for URL-like + // input. This method returns true if input.prevent_inline_autocomplete() + // is true or the input text contains trailing whitespace. + static bool PreventInlineAutocomplete(const AutocompleteInput& input); + + protected: + HistoryProvider(AutocompleteProvider::Type type, + AutocompleteProviderClient* client); + + ~HistoryProvider() override; + + // Finds and removes the match from the current collection of matches and + // backing data. + void DeleteMatchFromMatches(const AutocompleteMatch& match); + + // Fill and return an ACMatchClassifications structure given the |matches| + // to highlight. + static ACMatchClassifications SpansFromTermMatch(const TermMatches& matches, + size_t text_length, + bool is_url); + + AutocompleteProviderClient* client() { return client_; } + + private: + AutocompleteProviderClient* client_; + + DISALLOW_COPY_AND_ASSIGN(HistoryProvider); +}; + +#endif // COMPONENTS_OMNIBOX_HISTORY_PROVIDER_H_ |