1bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#ifndef CHROME_BROWSER_SEARCH_ENGINES_SEARCH_HOST_TO_URLS_MAP_H_
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define CHROME_BROWSER_SEARCH_ENGINES_SEARCH_HOST_TO_URLS_MAP_H_
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#pragma once
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <map>
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <set>
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <string>
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <vector>
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/basictypes.h"
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass SearchTermsData;
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TemplateURL;
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Holds the host to template url mappings for the search providers. WARNING:
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// This class does not own any TemplateURLs passed to it and it is up to the
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// caller to ensure the right lifetime of them.
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass SearchHostToURLsMap {
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::set<const TemplateURL*> TemplateURLSet;
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SearchHostToURLsMap();
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ~SearchHostToURLsMap();
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Initializes the map.
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void Init(const std::vector<const TemplateURL*>& template_urls,
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen            const SearchTermsData& search_terms_data);
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Adds a new TemplateURL to the map. Since |template_url| is owned
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // externally, Remove or RemoveAll should be called if it becomes invalid.
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void Add(const TemplateURL* template_url,
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen           const SearchTermsData& search_terms_data);
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Removes the TemplateURL from the lookup.
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void Remove(const TemplateURL* template_url);
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Updates information in an existing TemplateURL. Note: Using Remove and
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // then Add separately would lead to race conditions in reading because the
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // lock would be released inbetween the calls.
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void Update(const TemplateURL* existing_turl,
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen              const TemplateURL& new_values,
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen              const SearchTermsData& search_terms_data);
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Updates all search providers which have a google base url.
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void UpdateGoogleBaseURLs(const SearchTermsData& search_terms_data);
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns the first TemplateURL found with a URL using the specified |host|,
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // or NULL if there are no such TemplateURLs
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const TemplateURL* GetTemplateURLForHost(const std::string& host) const;
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Return the TemplateURLSet for the given the |host| or NULL if there are
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // none.
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const TemplateURLSet* GetURLsForHost(const std::string& host) const;
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  friend class SearchHostToURLsMapTest;
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::map<std::string, TemplateURLSet> HostToURLsMap;
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Removes the given template_url using only the pointer instead of the value.
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // This is useful when the value may have changed before being updated in the
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // map. (Specifically when the GoogleBaseURLValue changes.)
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void RemoveByPointer(const TemplateURL* template_url);
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Maps from host to set of TemplateURLs whose search url host is host.
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  HostToURLsMap host_to_urls_map_;
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The security origin for the default search provider.
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string default_search_origin_;
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Has Init been called?
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool initialized_;
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(SearchHostToURLsMap);
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif  // CHROME_BROWSER_SEARCH_ENGINES_SEARCH_HOST_TO_URLS_MAP_H_
82