search_host_to_urls_map.cc 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/search_engines/search_host_to_urls_map.h"
  5. #include <algorithm>
  6. #include <memory>
  7. #include "components/search_engines/template_url.h"
  8. SearchHostToURLsMap::SearchHostToURLsMap()
  9. : initialized_(false) {
  10. }
  11. SearchHostToURLsMap::~SearchHostToURLsMap() {
  12. }
  13. void SearchHostToURLsMap::Init(
  14. const TemplateURL::OwnedTemplateURLVector& template_urls,
  15. const SearchTermsData& search_terms_data) {
  16. DCHECK(!initialized_);
  17. initialized_ = true; // Set here so Add doesn't assert.
  18. Add(template_urls, search_terms_data);
  19. }
  20. void SearchHostToURLsMap::Add(TemplateURL* template_url,
  21. const SearchTermsData& search_terms_data) {
  22. DCHECK(initialized_);
  23. DCHECK(template_url);
  24. DCHECK_NE(TemplateURL::OMNIBOX_API_EXTENSION, template_url->type());
  25. const GURL url(template_url->GenerateSearchURL(search_terms_data));
  26. if (!url.is_valid() || !url.has_host())
  27. return;
  28. host_to_urls_map_[url.host()].insert(template_url);
  29. }
  30. void SearchHostToURLsMap::Remove(const TemplateURL* template_url) {
  31. DCHECK(initialized_);
  32. DCHECK(template_url);
  33. DCHECK_NE(TemplateURL::OMNIBOX_API_EXTENSION, template_url->type());
  34. // A given TemplateURL only occurs once in the map.
  35. auto set_with_url =
  36. std::find_if(host_to_urls_map_.begin(), host_to_urls_map_.end(),
  37. [&](std::pair<const std::string, TemplateURLSet>& entry) {
  38. return entry.second.erase(template_url);
  39. });
  40. if (set_with_url != host_to_urls_map_.end() && set_with_url->second.empty())
  41. host_to_urls_map_.erase(set_with_url);
  42. }
  43. TemplateURL* SearchHostToURLsMap::GetTemplateURLForHost(
  44. base::StringPiece host) {
  45. DCHECK(initialized_);
  46. HostToURLsMap::const_iterator iter = host_to_urls_map_.find(host);
  47. if (iter == host_to_urls_map_.end() || iter->second.empty())
  48. return nullptr;
  49. // Because we have to happily tolerate duplicates in TemplateURLService now,
  50. /// return the best TemplateURL for `host`, just like
  51. // `GetTemplateURLForKeyword` returns the best TemplateURL for a keyword.
  52. return *std::min_element(
  53. iter->second.begin(), iter->second.end(),
  54. [](const auto& a, const auto& b) {
  55. return a->IsBetterThanEngineWithConflictingKeyword(b);
  56. });
  57. }
  58. SearchHostToURLsMap::TemplateURLSet* SearchHostToURLsMap::GetURLsForHost(
  59. base::StringPiece host) {
  60. DCHECK(initialized_);
  61. auto urls_for_host = host_to_urls_map_.find(host);
  62. if (urls_for_host == host_to_urls_map_.end() || urls_for_host->second.empty())
  63. return nullptr;
  64. return &urls_for_host->second;
  65. }
  66. void SearchHostToURLsMap::Add(
  67. const TemplateURL::OwnedTemplateURLVector& template_urls,
  68. const SearchTermsData& search_terms_data) {
  69. for (const auto& turl : template_urls)
  70. Add(turl.get(), search_terms_data);
  71. }