template_url_model.h revision ddb351dbec246cf1fab5ec20d2d5520909041de1
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