summaryrefslogtreecommitdiffstats
path: root/chrome/browser/search_engines/search_host_to_urls_map.cc
blob: cb91724a0bb10044d9667a4f5c95fbb5f6644799 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// Copyright (c) 2011 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 "chrome/browser/search_engines/search_host_to_urls_map.h"

#include "base/memory/scoped_ptr.h"
#include "base/task.h"
#include "chrome/browser/search_engines/template_url.h"
#include "chrome/browser/search_engines/template_url_service.h"

SearchHostToURLsMap::SearchHostToURLsMap()
    : initialized_(false) {
}

SearchHostToURLsMap::~SearchHostToURLsMap() {
}

void SearchHostToURLsMap::Init(
    const std::vector<const TemplateURL*>& template_urls,
    const SearchTermsData& search_terms_data) {
  DCHECK(!initialized_);

  // Set as initialized here so Add doesn't assert.
  initialized_ = true;

  for (size_t i = 0; i < template_urls.size(); ++i)
    Add(template_urls[i], search_terms_data);
}

void SearchHostToURLsMap::Add(const TemplateURL* template_url,
                              const SearchTermsData& search_terms_data) {
  DCHECK(initialized_);
  DCHECK(template_url);

  const GURL url(TemplateURLService::GenerateSearchURLUsingTermsData(
      template_url, search_terms_data));
  if (!url.is_valid() || !url.has_host())
    return;

  host_to_urls_map_[url.host()].insert(template_url);
}

void SearchHostToURLsMap::Remove(const TemplateURL* template_url) {
  DCHECK(initialized_);
  DCHECK(template_url);

  const GURL url(TemplateURLService::GenerateSearchURL(template_url));
  if (!url.is_valid() || !url.has_host())
    return;

  const std::string host(url.host());
  DCHECK(host_to_urls_map_.find(host) != host_to_urls_map_.end());

  TemplateURLSet& urls = host_to_urls_map_[host];
  DCHECK(urls.find(template_url) != urls.end());

  urls.erase(urls.find(template_url));
  if (urls.empty())
    host_to_urls_map_.erase(host_to_urls_map_.find(host));
}

void SearchHostToURLsMap::Update(const TemplateURL* existing_turl,
                                 const TemplateURL& new_values,
                                 const SearchTermsData& search_terms_data) {
  DCHECK(initialized_);
  DCHECK(existing_turl);

  Remove(existing_turl);

  // Use the information from new_values but preserve existing_turl's id.
  TemplateURLID previous_id = existing_turl->id();
  TemplateURL* modifiable_turl = const_cast<TemplateURL*>(existing_turl);
  *modifiable_turl = new_values;
  modifiable_turl->set_id(previous_id);

  Add(existing_turl, search_terms_data);
}

void SearchHostToURLsMap::UpdateGoogleBaseURLs(
    const SearchTermsData& search_terms_data) {
  DCHECK(initialized_);

  // Create a list of the the TemplateURLs to update.
  std::vector<const TemplateURL*> t_urls_using_base_url;
  for (HostToURLsMap::iterator host_map_iterator = host_to_urls_map_.begin();
       host_map_iterator != host_to_urls_map_.end(); ++host_map_iterator) {
    const TemplateURLSet& urls = host_map_iterator->second;
    for (TemplateURLSet::const_iterator url_set_iterator = urls.begin();
         url_set_iterator != urls.end(); ++url_set_iterator) {
      const TemplateURL* t_url = *url_set_iterator;
      if ((t_url->url() && t_url->url()->HasGoogleBaseURLs()) ||
          (t_url->suggestions_url() &&
           t_url->suggestions_url()->HasGoogleBaseURLs())) {
        t_urls_using_base_url.push_back(t_url);
      }
    }
  }

  for (size_t i = 0; i < t_urls_using_base_url.size(); ++i)
    RemoveByPointer(t_urls_using_base_url[i]);

  for (size_t i = 0; i < t_urls_using_base_url.size(); ++i)
    Add(t_urls_using_base_url[i], search_terms_data);
}

const TemplateURL* SearchHostToURLsMap::GetTemplateURLForHost(
    const std::string& host) const {
  DCHECK(initialized_);

  HostToURLsMap::const_iterator iter = host_to_urls_map_.find(host);
  if (iter == host_to_urls_map_.end() || iter->second.empty())
    return NULL;
  return *(iter->second.begin());  // Return the 1st element.
}

const SearchHostToURLsMap::TemplateURLSet* SearchHostToURLsMap::GetURLsForHost(
    const std::string& host) const {
  DCHECK(initialized_);

  HostToURLsMap::const_iterator urls_for_host = host_to_urls_map_.find(host);
  if (urls_for_host == host_to_urls_map_.end() || urls_for_host->second.empty())
    return NULL;
  return &urls_for_host->second;
}

void SearchHostToURLsMap::RemoveByPointer(
    const TemplateURL* template_url) {
  for (HostToURLsMap::iterator i = host_to_urls_map_.begin();
       i != host_to_urls_map_.end(); ++i) {
    TemplateURLSet::iterator url_set_iterator = i->second.find(template_url);
    if (url_set_iterator != i->second.end()) {
      i->second.erase(url_set_iterator);
      if (i->second.empty())
        host_to_urls_map_.erase(i);
      // A given TemplateURL only occurs once in the map. As soon as we find the
      // entry, stop.
      return;
    }
  }
}