172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_SEARCH_ENGINES_TEMPLATE_URL_MODEL_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_SEARCH_ENGINES_TEMPLATE_URL_MODEL_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <map>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set>
11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <string>
12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <vector>
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/gtest_prod_util.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/observer_list.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/search_engines/search_host_to_urls_map.h"
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/search_engines/template_url_id.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/webdata/web_data_service.h"
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h"
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GURL;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Extension;
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PrefService;
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass PrefSetObserver;
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass SearchHostToURLsMap;
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass SearchTermsData;
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass TemplateURLModelObserver;
31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass TemplateURLRef;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace history {
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct URLVisitedDetails;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TemplateURLModel is the backend for keywords. It's used by
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// KeywordAutocomplete.
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TemplateURLModel stores a vector of TemplateURLs. The TemplateURLs are
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// persisted to the database maintained by WebDataService. *ALL* mutations
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to the TemplateURLs must funnel through TemplateURLModel. This allows
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TemplateURLModel to notify listeners of changes as well as keep the
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// database in sync.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// There is a TemplateURLModel per Profile.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TemplateURLModel does not load the vector of TemplateURLs in its
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// constructor (except for testing). Use the Load method to trigger a load.
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// When TemplateURLModel has completed loading, observers are notified via
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OnTemplateURLModelChanged as well as the TEMPLATE_URL_MODEL_LOADED
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// notification message.
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TemplateURLModel takes ownership of any TemplateURL passed to it. If there
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// is a WebDataService, deletion is handled by WebDataService, otherwise
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TemplateURLModel handles deletion.
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TemplateURLModel : public WebDataServiceConsumer,
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         public NotificationObserver {
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::map<std::string, std::string> QueryTerms;
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  typedef std::vector<const TemplateURL*> TemplateURLVector;
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Struct used for initializing the data store with fake data.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Each initializer is mapped to a TemplateURL.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct Initializer {
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char* const keyword;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const char* const url;
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char* const content;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit TemplateURLModel(Profile* profile);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The following is for testing.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TemplateURLModel(const Initializer* initializers, const int count);
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~TemplateURLModel();
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Generates a suitable keyword for the specified url.  Returns an empty
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // string if a keyword couldn't be generated.  If |autodetected| is true, we
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // don't generate keywords for a variety of situations where we would probably
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // not want to auto-add keywords, such as keywords for searches on pages that
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // themselves come from form submissions.
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static string16 GenerateKeyword(const GURL& url, bool autodetected);
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Removes any unnecessary characters from a user input keyword.
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This removes the leading scheme, "www." and any trailing slash.
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static string16 CleanUserInputKeyword(const string16& keyword);
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the search url for t_url.  Returns an empty GURL if t_url has no
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // url().
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static GURL GenerateSearchURL(const TemplateURL* t_url);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Just like GenerateSearchURL except that it takes SearchTermsData to supply
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // the data for some search terms. Most of the time GenerateSearchURL should
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // be called.
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static GURL GenerateSearchURLUsingTermsData(
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const TemplateURL* t_url,
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const SearchTermsData& search_terms_data);
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if there is no TemplateURL that conflicts with the
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // keyword/url pair, or there is one but it can be replaced. If there is an
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // existing keyword that can be replaced and template_url_to_replace is
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // non-NULL, template_url_to_replace is set to the keyword to replace.
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // url gives the url of the search query. The url is used to avoid generating
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a TemplateURL for an existing TemplateURL that shares the same host.
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool CanReplaceKeyword(const string16& keyword,
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const GURL& url,
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const TemplateURL** template_url_to_replace);
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns (in |matches|) all keywords beginning with |prefix|, sorted
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // shortest-first. If support_replacement_only is true, only keywords that
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // support replacement are returned.
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void FindMatchingKeywords(const string16& prefix,
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            bool support_replacement_only,
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            std::vector<string16>* matches) const;
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Looks up |keyword| and returns the element it maps to.  Returns NULL if
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the keyword was not found.
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The caller should not try to delete the returned pointer; the data store
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // retains ownership of it.
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const TemplateURL* GetTemplateURLForKeyword(const string16& keyword) const;
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the first TemplateURL found with a URL using the specified |host|,
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // or NULL if there are no such TemplateURLs
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const TemplateURL* GetTemplateURLForHost(const std::string& host) const;
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds a new TemplateURL to this model. TemplateURLModel will own the
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // reference, and delete it when the TemplateURL is removed.
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Add(TemplateURL* template_url);
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Removes the keyword from the model. This deletes the supplied TemplateURL.
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This fails if the supplied template_url is the default search provider.
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Remove(const TemplateURL* template_url);
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Removes all auto-generated keywords that were created in the specified
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // range.
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveAutoGeneratedBetween(base::Time created_after,
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  base::Time created_before);
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Removes all auto-generated keywords that were created on or after the
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // date passed in.
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveAutoGeneratedSince(base::Time created_after);
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If the given extension has an omnibox keyword, adds a TemplateURL for that
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // keyword. Only 1 keyword is allowed for a given extension. If the keyword
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // already exists for this extension, does nothing.
147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void RegisterExtensionKeyword(const Extension* extension);
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Removes the TemplateURL containing the keyword for the given extension,
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // if any.
151513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void UnregisterExtensionKeyword(const Extension* extension);
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the TemplateURL associated with the keyword for this extension.
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This works by checking the extension ID, not the keyword, so it will work
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // even if the user changed the keyword.
156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const TemplateURL* GetTemplateURLForExtension(
157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      const Extension* extension) const;
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the set of URLs describing the keywords. The elements are owned
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // by TemplateURLModel and should not be deleted.
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TemplateURLVector GetTemplateURLs() const;
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Increment the usage count of a keyword.
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called when a URL is loaded that was generated from a keyword.
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void IncrementUsageCount(const TemplateURL* url);
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Resets the title, keyword and search url of the specified TemplateURL.
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The TemplateURL is marked as not replaceable.
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ResetTemplateURL(const TemplateURL* url,
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                        const string16& title,
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                        const string16& keyword,
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const std::string& search_url);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Return true if the given |url| can be made the default.
175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool CanMakeDefault(const TemplateURL* url);
176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Set the default search provider.  |url| may be null.
178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // This will assert if the default search is managed; the UI should not be
179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // invoking this method in that situation.
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetDefaultSearchProvider(const TemplateURL* url);
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the default search provider. If the TemplateURLModel hasn't been
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // loaded, the default search provider is pulled from preferences.
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NOTE: At least in unittest mode, this may return NULL.
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const TemplateURL* GetDefaultSearchProvider();
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Returns true if the default search is managed through group policy.
189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool is_default_search_managed() const { return is_default_search_managed_; }
1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Observers used to listen for changes to the model.
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TemplateURLModel does NOT delete the observers when deleted.
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddObserver(TemplateURLModelObserver* observer);
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveObserver(TemplateURLModelObserver* observer);
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Loads the keywords. This has no effect if the keywords have already been
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // loaded.
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Observers are notified when loading completes via the method
1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // OnTemplateURLModelChanged.
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Load();
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether or not the keywords have been loaded.
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool loaded() { return loaded_; }
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notification that the keywords have been loaded.
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is invoked from WebDataService, and should not be directly
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // invoked.
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnWebDataServiceRequestDone(WebDataService::Handle h,
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           const WDTypedResult* result);
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the locale-direction-adjusted short name for the given keyword.
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Also sets the out param to indicate whether the keyword belongs to an
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // extension.
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 GetKeywordShortName(const string16& keyword,
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               bool* is_extension_keyword);
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NotificationObserver method. TemplateURLModel listens for three
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // notification types:
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // . NOTIFY_HISTORY_URL_VISITED: adds keyword search terms if the visit
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //   corresponds to a keyword.
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // . NOTIFY_GOOGLE_URL_UPDATED: updates mapping for any keywords containing
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //   a google base url replacement term.
223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // . PREF_CHANGED: checks whether the default search engine has changed.
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile() const { return profile_; }
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetSearchEngineDialogSlot(int slot) {
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    search_engine_dialog_chosen_slot_ = slot;
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int GetSearchEngineDialogSlot() const {
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return search_engine_dialog_chosen_slot_;
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Registers the preferences used to save a TemplateURL to prefs.
239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static void RegisterUserPrefs(PrefService* prefs);
240731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Cover method for the method of the same name on the HistoryService.
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // url is the one that was visited with the given search terms.
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This exists and is virtual for testing.
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetKeywordSearchTermsForURL(const TemplateURL* t_url,
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           const GURL& url,
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                           const string16& term);
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(TemplateURLModelTest, BuildQueryTerms);
252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  FRIEND_TEST_ALL_PREFIXES(TemplateURLModelTest, TestManagedDefaultSearch);
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(TemplateURLModelTest,
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           UpdateKeywordSearchTermsForURL);
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(TemplateURLModelTest,
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           DontUpdateKeywordSearchForNonReplaceable);
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(TemplateURLModelTest, ChangeGoogleBaseValue);
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(TemplateURLModelTest, MergeDeletesUnusedProviders);
2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  friend class TemplateURLModelTestUtil;
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  typedef std::map<string16, const TemplateURL*> KeywordToTemplateMap;
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Helper functor for FindMatchingKeywords(), for finding the range of
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // keywords which begin with a prefix.
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class LessWithPrefix;
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Init(const Initializer* initializers, int num_initializers);
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveFromMaps(const TemplateURL* template_url);
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Removes the supplied template_url from the keyword maps. This searches
2723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // through all entries in the keyword map and does not generate the host or
2733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // keyword. This is used when the cached content of the TemplateURL changes.
2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void RemoveFromKeywordMapByPointer(const TemplateURL* template_url);
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddToMaps(const TemplateURL* template_url);
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the keywords. This is used once the keywords have been loaded.
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This does NOT notify the delegate or the database.
2803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void SetTemplateURLs(const std::vector<TemplateURL*>& urls);
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Transitions to the loaded state.
2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void ChangeToLoadedState();
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If there is a notification service, sends TEMPLATE_URL_MODEL_LOADED
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // notification.
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void NotifyLoaded();
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Saves enough of url to preferences so that it can be loaded from
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // preferences on start up.
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SaveDefaultSearchProviderToPrefs(const TemplateURL* url);
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a TemplateURL that was previously saved to prefs via
294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // SaveDefaultSearchProviderToPrefs or set via policy.
295731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Returns true if successful, false otherwise.
296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If the user or the policy has opted for no default search, this
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // returns true but default_provider is set to NULL.
298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // |*is_managed| specifies whether the default is managed via policy.
299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool LoadDefaultSearchProviderFromPrefs(
300731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      scoped_ptr<TemplateURL>* default_provider,
301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      bool* is_managed);
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if there is no TemplateURL that has a search url with the
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // specified host, or the only TemplateURLs matching the specified host can
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // be replaced.
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool CanReplaceKeywordForHost(const std::string& host,
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                const TemplateURL** to_replace);
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the TemplateURL is replaceable. This doesn't look at the
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // uniqueness of the keyword or host and is intended to be called after those
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // checks have been done. This returns true if the TemplateURL doesn't appear
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in the default list and is marked as safe_for_autoreplace.
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool CanReplace(const TemplateURL* t_url);
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Updates the information in |existing_turl| using the information from
3163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // |new_values|, but the ID for |existing_turl| is retained.
317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Notifying observers is the responsibility of the caller.
318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void UpdateNoNotify(const TemplateURL* existing_turl,
319731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                      const TemplateURL& new_values);
3203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the preferences we use.
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrefService* GetPrefs();
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Iterates through the TemplateURLs to see if one matches the visited url.
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // For each TemplateURL whose url matches the visited url
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // SetKeywordSearchTermsForURL is invoked.
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateKeywordSearchTermsForURL(
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const history::URLVisitedDetails& details);
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If necessary, generates a visit for the site http:// + t_url.keyword().
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddTabToSearchVisit(const TemplateURL& t_url);
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds each of the query terms in the specified url whose key and value are
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // non-empty to query_terms. If a query key appears multiple times, the value
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is set to an empty string. Returns true if there is at least one key that
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // does not occur multiple times.
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool BuildQueryTerms(
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const GURL& url,
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::map<std::string,std::string>* query_terms);
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invoked when the Google base URL has changed. Updates the mapping for all
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TemplateURLs that have a replacement term of {google:baseURL} or
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // {google:baseSuggestURL}.
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GoogleBaseURLChanged();
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Update the default search.  Called at initialization or when a managed
347731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // preference has changed.
348731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void UpdateDefaultSearch();
349731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
350731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Returns the default search specified in the prepopulated data, if it
351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // exists.  If not, returns first URL in |template_urls_|, or NULL if that's
352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // empty.
353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const TemplateURL* FindNewDefaultSearchProvider();
354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Set the default search provider even if it is managed. |url| may be null.
356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Caller is responsible for notifying observers.
357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void SetDefaultSearchProviderNoNotify(const TemplateURL* url);
358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Adds a new TemplateURL to this model. TemplateURLModel will own the
360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // reference, and delete it when the TemplateURL is removed.
361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Caller is responsible for notifying observers.
362731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void AddNoNotify(TemplateURL* template_url);
363731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Removes the keyword from the model. This deletes the supplied TemplateURL.
365731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // This fails if the supplied template_url is the default search provider.
366731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Caller is responsible for notifying observers.
367731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void RemoveNoNotify(const TemplateURL* template_url);
368731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
369731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Notify the observers that the model has changed.  This is done only if the
370731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // model is loaded.
371731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void NotifyObservers();
372731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Mapping from keyword to the TemplateURL.
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  KeywordToTemplateMap keyword_to_template_map_;
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TemplateURLVector template_urls_;
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ObserverList<TemplateURLModelObserver> model_observers_;
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Maps from host to set of TemplateURLs whose search url host is host.
3833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SearchHostToURLsMap provider_map_;
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used to obtain the WebDataService.
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // When Load is invoked, if we haven't yet loaded, the WebDataService is
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // obtained from the Profile. This allows us to lazily access the database.
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile_;
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether the keywords have been loaded.
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool loaded_;
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Did loading fail? This is only valid if loaded_ is true.
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool load_failed_;
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If non-zero, we're waiting on a load.
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WebDataService::Handle load_handle_;
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Service used to store entries.
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<WebDataService> service_;
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // All visits that occurred before we finished loading. Once loaded
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // UpdateKeywordSearchTermsForURL is invoked for each element of the vector.
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<history::URLVisitedDetails> visits_to_add_;
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
406731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Once loaded, the default search provider.  This is a pointer to a
407731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TemplateURL owned by template_urls_.
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const TemplateURL* default_search_provider_;
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used for UX testing. Gives the slot in the search engine dialog that was
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // chosen as the default search engine.
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int search_engine_dialog_chosen_slot_;
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
414731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // The initial search provider extracted from preferences. This is only valid
415731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // if we haven't been loaded or loading failed.
416731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_ptr<TemplateURL> initial_default_search_provider_;
417731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
418731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Whether the default search is managed via policy.
419731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool is_default_search_managed_;
420731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
421731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // The set of preferences observer we use to find if the default search
422731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // preferences have changed.
423731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_ptr<PrefSetObserver> default_search_prefs_;
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ID assigned to next TemplateURL added to this model. This is an ever
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // increasing integer that is initialized from the database.
4273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TemplateURLID next_id_;
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // List of extension IDs waiting for Load to have keywords registered.
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<std::string> pending_extension_ids_;
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(TemplateURLModel);
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_SEARCH_ENGINES_TEMPLATE_URL_MODEL_H_
436