Add a Profile* member to TemplateURL.  This makes some invocations of ReplaceSearchTerms() a bit less verbose, and will be useful later when UIThreadSearchTermsData starts taking a Profile*.

One downside is that there are a number of const_cast<>()s added when we try to access the profile() of a const TemplateURL*.  These will all go away soon when TemplateURLService is switched to using "const" much less, so I didn't worry too much about them.

BUG=none
TEST=none
Review URL: https://chromiumcodereview.appspot.com/10173001

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@133483 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/autocomplete/autocomplete_unittest.cc b/chrome/browser/autocomplete/autocomplete_unittest.cc
index 9caf94b..b0082948 100644
--- a/chrome/browser/autocomplete/autocomplete_unittest.cc
+++ b/chrome/browser/autocomplete/autocomplete_unittest.cc
@@ -184,7 +184,7 @@
   // Reset the default TemplateURL.
   TemplateURLData data;
   data.SetURL("http://defaultturl/{searchTerms}");
-  TemplateURL* default_t_url = new TemplateURL(data);
+  TemplateURL* default_t_url = new TemplateURL(&profile_, data);
   TemplateURLService* turl_model =
       TemplateURLServiceFactory::GetForProfile(&profile_);
   turl_model->Add(default_t_url);
@@ -196,7 +196,7 @@
   data.short_name = ASCIIToUTF16("k");
   data.SetKeyword(ASCIIToUTF16("k"));
   data.SetURL("http://keyword/{searchTerms}");
-  TemplateURL* keyword_t_url = new TemplateURL(data);
+  TemplateURL* keyword_t_url = new TemplateURL(&profile_, data);
   turl_model->Add(keyword_t_url);
   ASSERT_NE(0, keyword_t_url->id());
 
@@ -228,7 +228,7 @@
   data.short_name = ASCIIToUTF16("foo.com");
   data.SetKeyword(ASCIIToUTF16("foo.com"));
   data.SetURL("http://foo.com/{searchTerms}");
-  TemplateURL* keyword_t_url = new TemplateURL(data);
+  TemplateURL* keyword_t_url = new TemplateURL(&profile_, data);
   turl_model->Add(keyword_t_url);
   ASSERT_NE(0, keyword_t_url->id());
 
@@ -236,7 +236,7 @@
   data.short_name = ASCIIToUTF16("bar.com");
   data.SetKeyword(ASCIIToUTF16("bar.com"));
   data.SetURL("http://bar.com/{searchTerms}");
-  keyword_t_url = new TemplateURL(data);
+  keyword_t_url = new TemplateURL(&profile_, data);
   turl_model->Add(keyword_t_url);
   ASSERT_NE(0, keyword_t_url->id());
 
diff --git a/chrome/browser/autocomplete/keyword_provider.cc b/chrome/browser/autocomplete/keyword_provider.cc
index df2d00e..8c707b7 100644
--- a/chrome/browser/autocomplete/keyword_provider.cc
+++ b/chrome/browser/autocomplete/keyword_provider.cc
@@ -394,9 +394,8 @@
     // input, but we rely on later canonicalization functions to do more
     // fixup to make the URL valid if necessary.
     DCHECK(element_ref.SupportsReplacement());
-    match->destination_url = GURL(element_ref.ReplaceSearchTermsUsingProfile(
-        profile, remaining_input, TemplateURLRef::NO_SUGGESTIONS_AVAILABLE,
-        string16()));
+    match->destination_url = GURL(element_ref.ReplaceSearchTerms(
+        remaining_input, TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16()));
     std::vector<size_t> content_param_offsets;
     match->contents.assign(l10n_util::GetStringFUTF16(message_id,
                                                       element->short_name(),
@@ -437,7 +436,7 @@
   DCHECK(model);
   // Get keyword data from data store.
   const TemplateURL* element = model->GetTemplateURLForKeyword(keyword);
-  DCHECK(element && !element->url().empty());
+  DCHECK(element);
   const bool supports_replacement = element->url_ref().SupportsReplacement();
 
   // Create an edit entry of "[keyword] [remaining input]".  This is helpful
diff --git a/chrome/browser/autocomplete/keyword_provider_unittest.cc b/chrome/browser/autocomplete/keyword_provider_unittest.cc
index dd3a2e92..685608d 100644
--- a/chrome/browser/autocomplete/keyword_provider_unittest.cc
+++ b/chrome/browser/autocomplete/keyword_provider_unittest.cc
@@ -205,7 +205,7 @@
   string16 keyword(ASCIIToUTF16("foo"));
   data.SetKeyword(keyword);
   data.SetURL("http://www.google.com/foo?q={searchTerms}");
-  TemplateURL* template_url = new TemplateURL(data);
+  TemplateURL* template_url = new TemplateURL(NULL, data);
   model_->Add(template_url);
   ASSERT_TRUE(template_url == model_->GetTemplateURLForKeyword(keyword));
 }
diff --git a/chrome/browser/autocomplete/search_provider.cc b/chrome/browser/autocomplete/search_provider.cc
index 90a0309b..35ebbfcc 100644
--- a/chrome/browser/autocomplete/search_provider.cc
+++ b/chrome/browser/autocomplete/search_provider.cc
@@ -89,6 +89,7 @@
 
 SearchProvider::SearchProvider(ACProviderListener* listener, Profile* profile)
     : AutocompleteProvider(listener, profile, "Search"),
+      providers_(profile),
       suggest_results_pending_(0),
       have_suggest_results_(false),
       instant_finalized_(false) {
@@ -461,9 +462,8 @@
     const string16& text) {
   DCHECK(suggestions_url.SupportsReplacement());
   content::URLFetcher* fetcher = content::URLFetcher::Create(id,
-      GURL(suggestions_url.ReplaceSearchTermsUsingProfile(
-          profile_, text, TemplateURLRef::NO_SUGGESTIONS_AVAILABLE,
-          string16())),
+      GURL(suggestions_url.ReplaceSearchTerms(text,
+          TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16())),
       content::URLFetcher::GET, this);
   fetcher->SetRequestContext(profile_->GetRequestContext());
   fetcher->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES);
@@ -906,8 +906,8 @@
 
   const TemplateURLRef& search_url = provider.url_ref();
   DCHECK(search_url.SupportsReplacement());
-  match.destination_url = GURL(search_url.ReplaceSearchTermsUsingProfile(
-      profile_, query_string, accepted_suggestion, input_text));
+  match.destination_url = GURL(search_url.ReplaceSearchTerms(query_string,
+      accepted_suggestion, input_text));
 
   // Search results don't look like URLs.
   match.transition = is_keyword ?
diff --git a/chrome/browser/autocomplete/search_provider.h b/chrome/browser/autocomplete/search_provider.h
index 188ae3f..d4ab56ef 100644
--- a/chrome/browser/autocomplete/search_provider.h
+++ b/chrome/browser/autocomplete/search_provider.h
@@ -90,9 +90,9 @@
   // . The keyword provider. This is used if the user has typed in a keyword.
   class Providers {
    public:
-    Providers()
-        : cached_default_provider_(TemplateURLData()),
-          cached_keyword_provider_(TemplateURLData()),
+    explicit Providers(Profile* profile)
+        : cached_default_provider_(profile, TemplateURLData()),
+          cached_keyword_provider_(profile, TemplateURLData()),
           default_provider_(NULL),
           keyword_provider_(NULL) {
     }
diff --git a/chrome/browser/autocomplete/search_provider_unittest.cc b/chrome/browser/autocomplete/search_provider_unittest.cc
index e6e3a3d..976e3cd1 100644
--- a/chrome/browser/autocomplete/search_provider_unittest.cc
+++ b/chrome/browser/autocomplete/search_provider_unittest.cc
@@ -125,7 +125,7 @@
   data.short_name = ASCIIToUTF16("t");
   data.SetURL("http://defaultturl/{searchTerms}");
   data.suggestions_url = "http://defaultturl2/{searchTerms}";
-  default_t_url_ = new TemplateURL(data);
+  default_t_url_ = new TemplateURL(&profile_, data);
   turl_model->Add(default_t_url_);
   turl_model->SetDefaultSearchProvider(default_t_url_);
   TemplateURLID default_provider_id = default_t_url_->id();
@@ -139,7 +139,7 @@
   data.SetKeyword(ASCIIToUTF16("k"));
   data.SetURL("http://keyword/{searchTerms}");
   data.suggestions_url = "http://suggest_keyword/{searchTerms}";
-  keyword_t_url_ = new TemplateURL(data);
+  keyword_t_url_ = new TemplateURL(&profile_, data);
   turl_model->Add(keyword_t_url_);
   ASSERT_NE(0, keyword_t_url_->id());
 
diff --git a/chrome/browser/importer/firefox2_importer.cc b/chrome/browser/importer/firefox2_importer.cc
index 91bb725..09063edb 100644
--- a/chrome/browser/importer/firefox2_importer.cc
+++ b/chrome/browser/importer/firefox2_importer.cc
@@ -140,7 +140,7 @@
   data.short_name = title.empty() ? keyword : title;
   data.SetKeyword(keyword);
   data.SetURL(TemplateURLRef::DisplayURLToURLRef(UTF8ToUTF16(url.spec())));
-  return new TemplateURL(data);
+  return new TemplateURL(NULL, data);
 }
 
 // static
diff --git a/chrome/browser/importer/ie_importer.cc b/chrome/browser/importer/ie_importer.cc
index 0730fb8..93fde8c 100644
--- a/chrome/browser/importer/ie_importer.cc
+++ b/chrome/browser/importer/ie_importer.cc
@@ -590,7 +590,7 @@
         data.SetURL(url);
         data.show_in_default_list = true;
         t_iter = search_engines_map.insert(std::make_pair(url,
-            new TemplateURL(data))).first;
+            new TemplateURL(NULL, data))).first;
       }
     }
   }
diff --git a/chrome/browser/importer/profile_import_process_messages.h b/chrome/browser/importer/profile_import_process_messages.h
index 0c49109..93f62d0 100644
--- a/chrome/browser/importer/profile_import_process_messages.h
+++ b/chrome/browser/importer/profile_import_process_messages.h
@@ -261,7 +261,10 @@
     TemplateURLData data;
     if (!ReadParam(m, iter, &data))
       return false;
-    *p = new TemplateURL(data);
+    // Since we don't have access to a Profile*, just supply NULL.  The caller
+    // can create a new TemplateURL or modify this one (e.g. via
+    // TemplateURLService::AddAndSetProfile()) to correct this later.
+    *p = new TemplateURL(NULL, data);
     return true;
   }
   static void Log(const param_type& p, std::string* l) {
diff --git a/chrome/browser/importer/profile_writer.cc b/chrome/browser/importer/profile_writer.cc
index ee478a03..2450e58 100644
--- a/chrome/browser/importer/profile_writer.cc
+++ b/chrome/browser/importer/profile_writer.cc
@@ -316,8 +316,8 @@
 
     // Only add valid TemplateURLs to the model.
     if ((*i)->url_ref().IsValid()) {
-      model->Add(*i);  // Takes ownership.
-      *i = NULL;       // Prevent the vector from deleting *i later.
+      model->AddAndSetProfile(*i, profile_);  // Takes ownership.
+      *i = NULL;  // Prevent the vector from deleting *i later.
     }
   }
 }
diff --git a/chrome/browser/instant/instant_browsertest.cc b/chrome/browser/instant/instant_browsertest.cc
index 7d856c50..34a6949 100644
--- a/chrome/browser/instant/instant_browsertest.cc
+++ b/chrome/browser/instant/instant_browsertest.cc
@@ -57,8 +57,9 @@
   }
 
   void SetupInstantProvider(const std::string& page) {
+    Profile* profile = browser()->profile();
     TemplateURLService* model =
-        TemplateURLServiceFactory::GetForProfile(browser()->profile());
+        TemplateURLServiceFactory::GetForProfile(profile);
 
     ui_test_utils::WindowedNotificationObserver observer(
         chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED,
@@ -76,7 +77,7 @@
         test_server()->host_port_pair().port(), page.c_str()));
     data.instant_url = data.url();
     // TemplateURLService takes ownership of this.
-    TemplateURL* template_url = new TemplateURL(data);
+    TemplateURL* template_url = new TemplateURL(profile, data);
     model->Add(template_url);
     model->SetDefaultSearchProvider(template_url);
   }
diff --git a/chrome/browser/instant/instant_loader.cc b/chrome/browser/instant/instant_loader.cc
index d280bcb0..928d2ec8 100644
--- a/chrome/browser/instant/instant_loader.cc
+++ b/chrome/browser/instant/instant_loader.cc
@@ -727,8 +727,7 @@
             complete_suggested_text_.substr(user_text_.size());
       }
     } else {
-      LoadInstantURL(tab_contents, template_url, transition_type, user_text_,
-                     verbatim);
+      LoadInstantURL(template_url, transition_type, user_text_, verbatim);
     }
   } else {
     DCHECK(template_url_id_ == 0);
@@ -856,8 +855,8 @@
     return;
 
   CreatePreviewContents(tab_contents);
-  LoadInstantURL(tab_contents, template_url, content::PAGE_TRANSITION_GENERATED,
-                 string16(), true);
+  LoadInstantURL(template_url, content::PAGE_TRANSITION_GENERATED, string16(),
+                 true);
 }
 
 bool InstantLoader::IsNavigationPending() const {
@@ -1112,8 +1111,7 @@
   preview_contents_->web_contents()->ShowContents();
 }
 
-void InstantLoader::LoadInstantURL(TabContentsWrapper* tab_contents,
-                                   const TemplateURL* template_url,
+void InstantLoader::LoadInstantURL(const TemplateURL* template_url,
                                    content::PageTransition transition_type,
                                    const string16& user_text,
                                    bool verbatim) {
@@ -1127,10 +1125,8 @@
   // functionality so that embeded tags (like {google:baseURL}) are escaped
   // correctly.
   // TODO(sky): having to use a replaceable url is a bit of a hack here.
-  GURL instant_url(
-      template_url->instant_url_ref().ReplaceSearchTermsUsingProfile(
-          tab_contents->profile(), string16(),
-          TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16()));
+  GURL instant_url(template_url->instant_url_ref().ReplaceSearchTerms(
+      string16(), TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16()));
   CommandLine* cl = CommandLine::ForCurrentProcess();
   if (cl->HasSwitch(switches::kInstantURL))
     instant_url = GURL(cl->GetSwitchValueASCII(switches::kInstantURL));
diff --git a/chrome/browser/instant/instant_loader.h b/chrome/browser/instant/instant_loader.h
index 2df45ffe..5ac326c 100644
--- a/chrome/browser/instant/instant_loader.h
+++ b/chrome/browser/instant/instant_loader.h
@@ -193,8 +193,7 @@
   void CreatePreviewContents(TabContentsWrapper* tab_contents);
 
   // Creates and loads the |template_url|'s instant URL.
-  void LoadInstantURL(TabContentsWrapper* tab_contents,
-                      const TemplateURL* template_url,
+  void LoadInstantURL(const TemplateURL* template_url,
                       content::PageTransition transition_type,
                       const string16& user_text,
                       bool verbatim);
diff --git a/chrome/browser/policy/configuration_policy_handler.cc b/chrome/browser/policy/configuration_policy_handler.cc
index 0bae4da..769e9913 100644
--- a/chrome/browser/policy/configuration_policy_handler.cc
+++ b/chrome/browser/policy/configuration_policy_handler.cc
@@ -606,7 +606,8 @@
   TemplateURLData data;
   data.SetURL(*url_string);
   SearchTermsData search_terms_data;
-  return TemplateURL(data).SupportsReplacementUsingTermsData(search_terms_data);
+  return TemplateURL(NULL, data).SupportsReplacementUsingTermsData(
+      search_terms_data);
 }
 
 void DefaultSearchPolicyHandler::EnsureStringPrefExists(
diff --git a/chrome/browser/protector/default_search_provider_change_browsertest.cc b/chrome/browser/protector/default_search_provider_change_browsertest.cc
index 5d8aca8..f95ac0b 100644
--- a/chrome/browser/protector/default_search_provider_change_browsertest.cc
+++ b/chrome/browser/protector/default_search_provider_change_browsertest.cc
@@ -50,31 +50,16 @@
 const BaseSettingChange::DisplayName kNoDisplayName(
     BaseSettingChange::kDefaultNamePriority, string16());
 
-// Convenience function.
-TemplateURL* MakeTemplateURL(const string16& short_name,
-                             const string16& keyword,
-                             const std::string& url) {
-  TemplateURLData data;
-  data.short_name = short_name;
-  if (keyword.empty())
-    data.SetAutogenerateKeyword(true);
-  else
-    data.SetKeyword(keyword);
-  data.SetURL(url);
-  return new TemplateURL(data);
-}
-
 }  // namespace
 
 class DefaultSearchProviderChangeTest : public InProcessBrowserTest {
  public:
   virtual void SetUpOnMainThread() OVERRIDE {
-    mock_protector_service_ =
-        MockProtectorService::BuildForProfile(browser()->profile());
+    Profile* profile = browser()->profile();
+    mock_protector_service_ = MockProtectorService::BuildForProfile(profile);
 
     // Ensure that TemplateURLService is loaded.
-    turl_service_ =
-        TemplateURLServiceFactory::GetForProfile(browser()->profile());
+    turl_service_ = TemplateURLServiceFactory::GetForProfile(profile);
     ui_test_utils::WaitForTemplateURLServiceToLoad(turl_service_);
 
     prepopulated_url_.reset(
@@ -85,6 +70,19 @@
     EXPECT_CALL(*mock_protector_service_, Shutdown());
   }
 
+  TemplateURL* MakeTemplateURL(const string16& short_name,
+                               const string16& keyword,
+                               const std::string& url) {
+    TemplateURLData data;
+    data.short_name = short_name;
+    if (keyword.empty())
+      data.SetAutogenerateKeyword(true);
+    else
+      data.SetKeyword(keyword);
+    data.SetURL(url);
+    return new TemplateURL(browser()->profile(), data);
+  }
+
   const TemplateURL* FindTemplateURL(const std::string& search_url) {
     TemplateURLService::TemplateURLVector urls =
         turl_service_->GetTemplateURLs();
@@ -163,13 +161,14 @@
   int current_histogram_id =
       protector::GetSearchProviderHistogramID(current_url);
 
-  turl_service_->Add(new TemplateURL(backup_url->data()));
+  Profile* profile = browser()->profile();
+  turl_service_->Add(new TemplateURL(profile, backup_url->data()));
   AddAndSetDefault(current_url);
 
   scoped_ptr<BaseSettingChange> change(
       CreateDefaultSearchProviderChange(current_url, backup_url));
   ASSERT_TRUE(change.get());
-  ASSERT_TRUE(change->Init(browser()->profile()));
+  ASSERT_TRUE(change->Init(profile));
 
   // Verify that backup is active.
   EXPECT_EQ(FindTemplateURL(http_example_info),
@@ -216,15 +215,16 @@
   TemplateURL* current_url_long =
       MakeTemplateURL(example_com_long, ASCIIToUTF16("b"), http_example_com);
 
+  Profile* profile = browser()->profile();
   {
     // Backup name too long.
-    turl_service_->Add(new TemplateURL(backup_url_long->data()));
+    turl_service_->Add(new TemplateURL(profile, backup_url_long->data()));
     AddAndSetDefault(current_url);
 
     scoped_ptr<BaseSettingChange> change(
         CreateDefaultSearchProviderChange(current_url, backup_url_long));
     ASSERT_TRUE(change.get());
-    ASSERT_TRUE(change->Init(browser()->profile()));
+    ASSERT_TRUE(change->Init(profile));
 
     // Verify text messages.
     EXPECT_EQ(GetBubbleMessage(), change->GetBubbleMessage());
@@ -237,13 +237,13 @@
 
   {
     // Current name too long.
-    turl_service_->Add(new TemplateURL(backup_url->data()));
+    turl_service_->Add(new TemplateURL(profile, backup_url->data()));
     AddAndSetDefault(current_url_long);
 
     scoped_ptr<BaseSettingChange> change(
         CreateDefaultSearchProviderChange(current_url_long, backup_url));
     ASSERT_TRUE(change.get());
-    ASSERT_TRUE(change->Init(browser()->profile()));
+    ASSERT_TRUE(change->Init(profile));
 
     // Verify text messages.
     EXPECT_EQ(GetBubbleMessage(), change->GetBubbleMessage());
@@ -430,13 +430,14 @@
       MakeTemplateURL(example_info, ASCIIToUTF16("a"), http_example_info);
   int backup_histogram_id = protector::GetSearchProviderHistogramID(backup_url);
 
-  turl_service_->Add(new TemplateURL(backup_url->data()));
+  Profile* profile = browser()->profile();
+  turl_service_->Add(new TemplateURL(profile, backup_url->data()));
   turl_service_->SetDefaultSearchProvider(NULL);
 
   scoped_ptr<BaseSettingChange> change(
       CreateDefaultSearchProviderChange(NULL, backup_url));
   ASSERT_TRUE(change.get());
-  ASSERT_TRUE(change->Init(browser()->profile()));
+  ASSERT_TRUE(change->Init(profile));
 
   // Verify that backup is active.
   EXPECT_EQ(FindTemplateURL(http_example_info),
@@ -480,14 +481,15 @@
   int current_histogram_id =
       protector::GetSearchProviderHistogramID(current_url);
 
-  turl_service_->Add(new TemplateURL(backup_url->data()));
+  Profile* profile = browser()->profile();
+  turl_service_->Add(new TemplateURL(profile, backup_url->data()));
   // TODO(ivankr): this may become unsupported soon.
   AddAndSetDefault(current_url);
 
   scoped_ptr<BaseSettingChange> change(
       CreateDefaultSearchProviderChange(current_url, backup_url));
   ASSERT_TRUE(change.get());
-  ASSERT_TRUE(change->Init(browser()->profile()));
+  ASSERT_TRUE(change->Init(profile));
 
   // Verify that backup is active.
   EXPECT_EQ(FindTemplateURL(http_example_info),
@@ -613,13 +615,14 @@
   TemplateURL* new_url =
       MakeTemplateURL(example_net, ASCIIToUTF16("c"), http_example_net);
 
-  turl_service_->Add(new TemplateURL(backup_url->data()));
+  Profile* profile = browser()->profile();
+  turl_service_->Add(new TemplateURL(profile, backup_url->data()));
   AddAndSetDefault(current_url);
 
   scoped_ptr<BaseSettingChange> change(
       CreateDefaultSearchProviderChange(current_url, backup_url));
   ASSERT_TRUE(change.get());
-  ASSERT_TRUE(change->Init(browser()->profile()));
+  ASSERT_TRUE(change->Init(profile));
 
   // Verify that backup is active.
   EXPECT_EQ(FindTemplateURL(http_example_info),
@@ -639,13 +642,14 @@
   TemplateURL* current_url =
       MakeTemplateURL(example_com, ASCIIToUTF16("b"), http_example_com);
 
-  turl_service_->Add(new TemplateURL(backup_url->data()));
+  Profile* profile = browser()->profile();
+  turl_service_->Add(new TemplateURL(profile, backup_url->data()));
   AddAndSetDefault(current_url);
 
   scoped_ptr<BaseSettingChange> change(
       CreateDefaultSearchProviderChange(current_url, backup_url));
   ASSERT_TRUE(change.get());
-  ASSERT_TRUE(change->Init(browser()->profile()));
+  ASSERT_TRUE(change->Init(profile));
 
   // Verify that backup is active.
   EXPECT_EQ(FindTemplateURL(http_example_info),
diff --git a/chrome/browser/search_engines/search_host_to_urls_map_unittest.cc b/chrome/browser/search_engines/search_host_to_urls_map_unittest.cc
index 6a7d75c..edbec3d 100644
--- a/chrome/browser/search_engines/search_host_to_urls_map_unittest.cc
+++ b/chrome/browser/search_engines/search_host_to_urls_map_unittest.cc
@@ -31,9 +31,9 @@
   host_ = "www.unittest.com";
   TemplateURLData data;
   data.SetURL("http://" + host_ + "/path1");
-  t_urls_[0].reset(new TemplateURL(data));
+  t_urls_[0].reset(new TemplateURL(NULL, data));
   data.SetURL("http://" + host_ + "/path2");
-  t_urls_[1].reset(new TemplateURL(data));
+  t_urls_[1].reset(new TemplateURL(NULL, data));
   std::vector<const TemplateURL*> template_urls;
   template_urls.push_back(t_urls_[0].get());
   template_urls.push_back(t_urls_[1].get());
@@ -47,7 +47,7 @@
   std::string new_host = "example.com";
   TemplateURLData data;
   data.SetURL("http://" + new_host + "/");
-  TemplateURL new_t_url(data);
+  TemplateURL new_t_url(NULL, data);
   UIThreadSearchTermsData search_terms_data;
   provider_map_->Add(&new_t_url, search_terms_data);
 
@@ -79,7 +79,7 @@
   // Add in a url with the templated Google base url.
   TemplateURLData data;
   data.SetURL("{google:baseURL}?q={searchTerms}");
-  TemplateURL new_t_url(data);
+  TemplateURL new_t_url(NULL, data);
   provider_map_->Add(&new_t_url, search_terms_data);
   ASSERT_EQ(&new_t_url, provider_map_->GetTemplateURLForHost(google_base_url));
 
diff --git a/chrome/browser/search_engines/search_provider_install_data_unittest.cc b/chrome/browser/search_engines/search_provider_install_data_unittest.cc
index 2f69d2e..e7ae29b 100644
--- a/chrome/browser/search_engines/search_provider_install_data_unittest.cc
+++ b/chrome/browser/search_engines/search_provider_install_data_unittest.cc
@@ -236,7 +236,7 @@
   data.short_name = keyword;
   data.SetKeyword(keyword);
   data.SetURL(url);
-  TemplateURL* t_url = new TemplateURL(data);
+  TemplateURL* t_url = new TemplateURL(util_.profile(), data);
   util_.model()->Add(t_url);
   return t_url;
 }
diff --git a/chrome/browser/search_engines/template_url.cc b/chrome/browser/search_engines/template_url.cc
index 39343ea..b47696aa 100644
--- a/chrome/browser/search_engines/template_url.cc
+++ b/chrome/browser/search_engines/template_url.cc
@@ -121,17 +121,8 @@
     const string16& terms,
     int accepted_suggestion,
     const string16& original_query_for_suggestion) const {
-  return ReplaceSearchTermsUsingProfile(NULL, terms, accepted_suggestion,
-                                        original_query_for_suggestion);
-}
-
-std::string TemplateURLRef::ReplaceSearchTermsUsingProfile(
-    Profile* profile,
-    const string16& terms,
-    int accepted_suggestion,
-    const string16& original_query_for_suggestion) const {
   UIThreadSearchTermsData search_terms_data;
-  search_terms_data.set_profile(profile);
+  search_terms_data.set_profile(owner_->profile());
   return ReplaceSearchTermsUsingTermsData(terms, accepted_suggestion,
       original_query_for_suggestion, search_terms_data);
 }
@@ -623,8 +614,9 @@
 
 // TemplateURL ----------------------------------------------------------------
 
-TemplateURL::TemplateURL(const TemplateURLData& data)
-    : data_(data),
+TemplateURL::TemplateURL(Profile* profile, const TemplateURLData& data)
+    : profile_(profile),
+      data_(data),
       url_ref_(ALLOW_THIS_IN_INITIALIZER_LIST(this), TemplateURLRef::SEARCH),
       suggestions_url_ref_(ALLOW_THIS_IN_INITIALIZER_LIST(this),
                            TemplateURLRef::SUGGEST),
@@ -634,7 +626,8 @@
 }
 
 TemplateURL::TemplateURL(const TemplateURL& other)
-    : data_(other.data_),
+    : profile_(other.profile_),
+      data_(other.data_),
       url_ref_(ALLOW_THIS_IN_INITIALIZER_LIST(this), TemplateURLRef::SEARCH),
       suggestions_url_ref_(ALLOW_THIS_IN_INITIALIZER_LIST(this),
                            TemplateURLRef::SUGGEST),
@@ -647,6 +640,7 @@
   if (this == &other)
     return *this;
 
+  profile_ = other.profile_;
   data_ = other.data_;
   url_ref_.InvalidateCachedValues();
   suggestions_url_ref_.InvalidateCachedValues();
diff --git a/chrome/browser/search_engines/template_url.h b/chrome/browser/search_engines/template_url.h
index 1a10256..a0d703a 100644
--- a/chrome/browser/search_engines/template_url.h
+++ b/chrome/browser/search_engines/template_url.h
@@ -27,7 +27,8 @@
 // callers can substitute values to get a "real" URL using ReplaceSearchTerms().
 //
 // TemplateURLRefs always have a non-NULL |owner_| TemplateURL, which they
-// access in order to get at important data like the underlying URL string.
+// access in order to get at important data like the underlying URL string or
+// the associated Profile.
 class TemplateURLRef {
  public:
   // Magic numbers to pass to ReplaceSearchTerms() for the |accepted_suggestion|
@@ -70,15 +71,6 @@
       int accepted_suggestion,
       const string16& original_query_for_suggestion) const;
 
-  // Just like ReplaceSearchTerms except that it takes a Profile that's used to
-  // retrieve Instant field trial params. Most callers don't care about those
-  // params, and so can use ReplaceSearchTerms instead.
-  std::string ReplaceSearchTermsUsingProfile(
-      Profile* profile,
-      const string16& terms,
-      int accepted_suggestion,
-      const string16& original_query_for_suggestion) const;
-
   // Just like ReplaceSearchTerms except that it takes SearchTermsData to supply
   // the data for some search terms. Most of the time ReplaceSearchTerms should
   // be called.
@@ -364,7 +356,9 @@
 // is made a friend so that it can be the exception to this pattern.
 class TemplateURL {
  public:
-  explicit TemplateURL(const TemplateURLData& data);
+  // |profile| may be NULL.  This will affect the results of e.g. calling
+  // ReplaceSearchTerms() on the member TemplateURLRefs.
+  TemplateURL(Profile* profile, const TemplateURLData& data);
 
   TemplateURL(const TemplateURL& other);
   TemplateURL& operator=(const TemplateURL& other);
@@ -374,6 +368,7 @@
   // Generates a favicon URL from the specified url.
   static GURL GenerateFaviconURL(const GURL& url);
 
+  Profile* profile() { return profile_; }
   const TemplateURLData& data() const { return data_; }
 
   const string16& short_name() const { return data_.short_name; }
@@ -443,6 +438,7 @@
   // Invalidates cached values on this object and its child TemplateURLRefs.
   void InvalidateCachedValues();
 
+  Profile* profile_;
   TemplateURLData data_;
   TemplateURLRef url_ref_;
   TemplateURLRef suggestions_url_ref_;
diff --git a/chrome/browser/search_engines/template_url_fetcher.cc b/chrome/browser/search_engines/template_url_fetcher.cc
index fc855c30..575fef3 100644
--- a/chrome/browser/search_engines/template_url_fetcher.cc
+++ b/chrome/browser/search_engines/template_url_fetcher.cc
@@ -177,8 +177,8 @@
 void TemplateURLFetcher::RequestDelegate::AddSearchProvider() {
   DCHECK(template_url_.get());
   DCHECK(!keyword_.empty());
-  TemplateURLService* model = TemplateURLServiceFactory::GetForProfile(
-      fetcher_->profile());
+  Profile* profile = fetcher_->profile();
+  TemplateURLService* model = TemplateURLServiceFactory::GetForProfile(profile);
   DCHECK(model);
   DCHECK(model->loaded());
 
@@ -206,7 +206,7 @@
     case AUTODETECTED_PROVIDER:
       // Mark the keyword as replaceable so it can be removed if necessary.
       data.safe_for_autoreplace = true;
-      model->Add(new TemplateURL(data));
+      model->Add(new TemplateURL(profile, data));
       break;
 
     case EXPLICIT_PROVIDER:
@@ -216,8 +216,8 @@
       // The source WebContents' delegate takes care of adding the URL to the
       // model, which takes ownership, or of deleting it if the add is
       // cancelled.
-      callbacks_->ConfirmAddSearchProvider(new TemplateURL(data),
-                                           fetcher_->profile());
+      callbacks_->ConfirmAddSearchProvider(new TemplateURL(profile, data),
+                                           profile);
       break;
 
     default:
diff --git a/chrome/browser/search_engines/template_url_fetcher_unittest.cc b/chrome/browser/search_engines/template_url_fetcher_unittest.cc
index 448ccd2..6592e305 100644
--- a/chrome/browser/search_engines/template_url_fetcher_unittest.cc
+++ b/chrome/browser/search_engines/template_url_fetcher_unittest.cc
@@ -47,12 +47,12 @@
   virtual void SetUp() OVERRIDE {
     test_util_.SetUp();
     test_util_.StartIOThread();
-    ASSERT_TRUE(test_util_.profile());
-    ASSERT_TRUE(
-        TemplateURLFetcherFactory::GetForProfile(test_util_.profile()));
+    TestingProfile* profile = test_util_.profile();
+    ASSERT_TRUE(profile);
+    ASSERT_TRUE(TemplateURLFetcherFactory::GetForProfile(profile));
 
-    test_util_.profile()->CreateRequestContext();
-    ASSERT_TRUE(test_util_.profile()->GetRequestContext());
+    profile->CreateRequestContext();
+    ASSERT_TRUE(profile->GetRequestContext());
     ASSERT_TRUE(test_server_.Start());
   }
 
@@ -291,7 +291,7 @@
   data.short_name = keyword;
   data.SetKeyword(keyword);
   data.SetURL("http://example.com/");
-  test_util_.model()->Add(new TemplateURL(data));
+  test_util_.model()->Add(new TemplateURL(test_util_.profile(), data));
   test_util_.ChangeModelToLoadState();
 
   ASSERT_TRUE(test_util_.model()->GetTemplateURLForKeyword(keyword));
diff --git a/chrome/browser/search_engines/template_url_parser.cc b/chrome/browser/search_engines/template_url_parser.cc
index f83efd7..a9f6939 100644
--- a/chrome/browser/search_engines/template_url_parser.cc
+++ b/chrome/browser/search_engines/template_url_parser.cc
@@ -313,7 +313,7 @@
   DCHECK(!keyword.empty());
   data_.SetKeyword(keyword);
   data_.show_in_default_list = show_in_default_list;
-  return new TemplateURL(data_);
+  return new TemplateURL(profile, data_);
 }
 
 // static
diff --git a/chrome/browser/search_engines/template_url_prepopulate_data.cc b/chrome/browser/search_engines/template_url_prepopulate_data.cc
index 5f785ce..7cd25c3c 100644
--- a/chrome/browser/search_engines/template_url_prepopulate_data.cc
+++ b/chrome/browser/search_engines/template_url_prepopulate_data.cc
@@ -3150,7 +3150,8 @@
   return (version >= 0) ? version : kCurrentDataVersion;
 }
 
-TemplateURL* MakePrepopulatedTemplateURL(const string16& name,
+TemplateURL* MakePrepopulatedTemplateURL(Profile* profile,
+                                         const string16& name,
                                          const string16& keyword,
                                          const base::StringPiece& search_url,
                                          const base::StringPiece& suggest_url,
@@ -3174,16 +3175,16 @@
   data.date_created = base::Time();
   data.last_modified = base::Time();
   data.prepopulate_id = id;
-  return new TemplateURL(data);
+  return new TemplateURL(profile, data);
 }
 
-void GetPrepopulatedTemplateFromPrefs(PrefService* prefs,
+void GetPrepopulatedTemplateFromPrefs(Profile* profile,
                                       std::vector<TemplateURL*>* t_urls) {
-  if (!prefs)
+  if (!profile)
     return;
 
   const ListValue* list =
-      prefs->GetList(prefs::kSearchProviderOverrides);
+      profile->GetPrefs()->GetList(prefs::kSearchProviderOverrides);
   if (!list)
     return;
 
@@ -3217,45 +3218,47 @@
       // Got a parsing error. No big deal.
       continue;
     }
-    t_urls->push_back(MakePrepopulatedTemplateURL(name, keyword, search_url,
-        suggest_url, instant_url, favicon_url, encoding, id));
+    t_urls->push_back(MakePrepopulatedTemplateURL(profile, name, keyword,
+        search_url, suggest_url, instant_url, favicon_url, encoding, id));
   }
 }
 
 // The caller owns the returned TemplateURL.
 TemplateURL* MakePrepopulatedTemplateURLFromPrepopulateEngine(
+    Profile* profile,
     const PrepopulatedEngine& engine) {
-  return MakePrepopulatedTemplateURL(WideToUTF16(engine.name),
+  return MakePrepopulatedTemplateURL(profile, WideToUTF16(engine.name),
       WideToUTF16(engine.keyword), engine.search_url, engine.suggest_url,
       engine.instant_url, engine.favicon_url, engine.encoding, engine.id);
 }
 
-void GetPrepopulatedEngines(PrefService* prefs,
+void GetPrepopulatedEngines(Profile* profile,
                             std::vector<TemplateURL*>* t_urls,
                             size_t* default_search_provider_index) {
   // If there is a set of search engines in the preferences file, it overrides
   // the built-in set.
   *default_search_provider_index = 0;
-  GetPrepopulatedTemplateFromPrefs(prefs, t_urls);
+  GetPrepopulatedTemplateFromPrefs(profile, t_urls);
   if (!t_urls->empty())
     return;
 
   const PrepopulatedEngine** engines;
   size_t num_engines;
-  GetPrepopulationSetFromCountryID(prefs, &engines, &num_engines);
+  GetPrepopulationSetFromCountryID(profile ? profile->GetPrefs() : NULL,
+                                   &engines, &num_engines);
   for (size_t i = 0; i != num_engines; ++i) {
     t_urls->push_back(
-        MakePrepopulatedTemplateURLFromPrepopulateEngine(*engines[i]));
+        MakePrepopulatedTemplateURLFromPrepopulateEngine(profile, *engines[i]));
   }
 }
 
-TemplateURL* GetPrepopulatedDefaultSearch(PrefService* prefs) {
+TemplateURL* GetPrepopulatedDefaultSearch(Profile* profile) {
   TemplateURL* default_search_provider = NULL;
   ScopedVector<TemplateURL> loaded_urls;
   size_t default_search_index;
   // This could be more efficient.  We are loading all the URLs to only keep
   // the first one.
-  GetPrepopulatedEngines(prefs, &loaded_urls.get(), &default_search_index);
+  GetPrepopulatedEngines(profile, &loaded_urls.get(), &default_search_index);
   if (default_search_index < loaded_urls.size()) {
     default_search_provider = loaded_urls[default_search_index];
     loaded_urls.weak_erase(loaded_urls.begin() + default_search_index);
diff --git a/chrome/browser/search_engines/template_url_prepopulate_data.h b/chrome/browser/search_engines/template_url_prepopulate_data.h
index b30eff8..dc989f98 100644
--- a/chrome/browser/search_engines/template_url_prepopulate_data.h
+++ b/chrome/browser/search_engines/template_url_prepopulate_data.h
@@ -15,6 +15,7 @@
 
 class GURL;
 class PrefService;
+class Profile;
 class TemplateURL;
 
 namespace TemplateURLPrepopulateData {
@@ -32,15 +33,15 @@
 // TemplateURLs is passed to the caller.  On return,
 // |default_search_provider_index| is set to the index of the default search
 // provider.
-void GetPrepopulatedEngines(PrefService* prefs,
+void GetPrepopulatedEngines(Profile* profile,
                             std::vector<TemplateURL*>* t_urls,
                             size_t* default_search_provider_index);
 
 // Returns the default search provider specified by the prepopulate data.
 // The caller owns the returned value, which may be NULL.
-// If |prefs| is NULL, any search provider overrides from the preferences are
+// If |profile| is NULL, any search provider overrides from the preferences are
 // not used.
-TemplateURL* GetPrepopulatedDefaultSearch(PrefService* prefs);
+TemplateURL* GetPrepopulatedDefaultSearch(Profile* profile);
 
 // Both the next two functions use same-origin checks unless the |url| is a
 // Google seach URL, in which case we'll identify any valid Google hostname, or
diff --git a/chrome/browser/search_engines/template_url_prepopulate_data_unittest.cc b/chrome/browser/search_engines/template_url_prepopulate_data_unittest.cc
index ee91e85..14b89a9e 100644
--- a/chrome/browser/search_engines/template_url_prepopulate_data_unittest.cc
+++ b/chrome/browser/search_engines/template_url_prepopulate_data_unittest.cc
@@ -78,8 +78,8 @@
     profile.GetPrefs()->SetInteger(prefs::kCountryIDAtInstall, kCountryIds[i]);
     ScopedVector<TemplateURL> urls;
     size_t default_index;
-    TemplateURLPrepopulateData::GetPrepopulatedEngines(profile.GetPrefs(),
-        &urls.get(), &default_index);
+    TemplateURLPrepopulateData::GetPrepopulatedEngines(&profile, &urls.get(),
+                                                       &default_index);
     std::set<int> unique_ids;
     for (size_t turl_i = 0; turl_i < urls.size(); ++turl_i) {
       ASSERT_TRUE(unique_ids.find(urls[turl_i]->prepopulate_id()) ==
@@ -114,7 +114,7 @@
 
   ScopedVector<TemplateURL> t_urls;
   size_t default_index;
-  TemplateURLPrepopulateData::GetPrepopulatedEngines(prefs, &t_urls.get(),
+  TemplateURLPrepopulateData::GetPrepopulatedEngines(&profile, &t_urls.get(),
                                                      &default_index);
 
   ASSERT_EQ(1u, t_urls.size());
diff --git a/chrome/browser/search_engines/template_url_service.cc b/chrome/browser/search_engines/template_url_service.cc
index a2f99ae4..70c3d1f9 100644
--- a/chrome/browser/search_engines/template_url_service.cc
+++ b/chrome/browser/search_engines/template_url_service.cc
@@ -326,6 +326,12 @@
   NotifyObservers();
 }
 
+void TemplateURLService::AddAndSetProfile(TemplateURL* template_url,
+                                          Profile* profile) {
+  template_url->profile_ = profile;
+  Add(template_url);
+}
+
 void TemplateURLService::AddWithOverrides(const TemplateURL* template_url,
                                           const string16& short_name,
                                           const string16& keyword,
@@ -395,7 +401,7 @@
     // ID, as well as forcing the TemplateURL to be treated as a search keyword.
     data.SetURL(std::string(chrome::kExtensionScheme) + "://" +
         extension->id() + "/?q={searchTerms}");
-    Add(new TemplateURL(data));
+    Add(new TemplateURL(profile_, data));
   }
 }
 
@@ -456,7 +462,7 @@
   }
   data.safe_for_autoreplace = false;
   data.last_modified = time_provider_();
-  TemplateURL new_url(data);
+  TemplateURL new_url(const_cast<TemplateURL*>(url)->profile(), data);
   UpdateNoNotify(url, new_url);
   NotifyObservers();
 }
@@ -488,7 +494,7 @@
 const TemplateURL* TemplateURLService::FindNewDefaultSearchProvider() {
   // See if the prepopulated default still exists.
   scoped_ptr<TemplateURL> prepopulated_default(
-      TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(GetPrefs()));
+      TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(profile_));
   for (TemplateURLVector::iterator i = template_urls_.begin();
        i != template_urls_.end(); ++i) {
     if ((*i)->prepopulate_id() == prepopulated_default->prepopulate_id())
@@ -551,7 +557,7 @@
   std::vector<TemplateURL*> template_urls;
   const TemplateURL* default_search_provider = NULL;
   int new_resource_keyword_version = 0;
-  GetSearchProvidersUsingKeywordResult(*result, service_.get(), GetPrefs(),
+  GetSearchProvidersUsingKeywordResult(*result, service_.get(), profile_,
       &template_urls, &default_search_provider, &new_resource_keyword_version);
 
   bool database_specified_a_default = (default_search_provider != NULL);
@@ -570,7 +576,7 @@
   // No check is required if the default search is managed.
   // |DidDefaultSearchProviderChange| must always be called because it will
   // take care of the unowned backup default search provider instance.
-  if (DidDefaultSearchProviderChange(*result,
+  if (DidDefaultSearchProviderChange(*result, profile_,
                                      &backup_default_search_provider) &&
       !is_default_search_managed_) {
     hijacked_default_search_provider = default_search_provider;
@@ -599,7 +605,7 @@
         TemplateURLData data(default_from_prefs->data());
         data.created_by_policy = true;
         data.id = kInvalidTemplateURLID;
-        TemplateURL* managed_default = new TemplateURL(data);
+        TemplateURL* managed_default = new TemplateURL(profile_, data);
         AddNoNotify(managed_default, true);
         default_search_provider = managed_default;
       }
@@ -619,7 +625,7 @@
                default_search_provider == NULL) {
       for (std::vector<TemplateURL*>::const_iterator i = template_urls.begin();
            i != template_urls.end(); ++i) {
-        if (!(*i)->IsExtensionKeyword()) {
+        if (!(*i)->IsExtensionKeyword() && (*i)->SupportsReplacement()) {
           default_search_provider = *i;
           break;
         }
@@ -800,7 +806,7 @@
         iter->sync_data().GetSpecifics().search_engine().sync_guid();
     const TemplateURL* existing_turl = GetTemplateURLForGUID(guid);
     scoped_ptr<TemplateURL> turl(CreateTemplateURLFromTemplateURLAndSyncData(
-        existing_turl, iter->sync_data(), &new_changes));
+        profile_, existing_turl, iter->sync_data(), &new_changes));
     if (!turl.get())
       continue;
 
@@ -829,7 +835,7 @@
       // Force the local ID to kInvalidTemplateURLID so we can add it.
       TemplateURLData data(turl->data());
       data.id = kInvalidTemplateURLID;
-      Add(new TemplateURL(data));
+      Add(new TemplateURL(profile_, data));
 
       // Possibly set the newly added |turl| as the default search provider.
       SetDefaultSearchProviderIfNewlySynced(guid);
@@ -904,8 +910,8 @@
       iter != sync_data_map.end(); ++iter) {
     const TemplateURL* local_turl = GetTemplateURLForGUID(iter->first);
     scoped_ptr<TemplateURL> sync_turl(
-        CreateTemplateURLFromTemplateURLAndSyncData(local_turl, iter->second,
-                                                    &new_changes));
+        CreateTemplateURLFromTemplateURLAndSyncData(profile_, local_turl,
+            iter->second, &new_changes));
     if (!sync_turl.get())
       continue;
 
@@ -950,7 +956,7 @@
         // Force the local ID to kInvalidTemplateURLID so we can add it.
         TemplateURLData data(sync_turl->data());
         data.id = kInvalidTemplateURLID;
-        Add(new TemplateURL(data));
+        Add(new TemplateURL(profile_, data));
 
         // Possibly set the newly added |turl| as the default search provider.
         SetDefaultSearchProviderIfNewlySynced(guid);
@@ -1038,9 +1044,12 @@
 
 // static
 TemplateURL* TemplateURLService::CreateTemplateURLFromTemplateURLAndSyncData(
+    Profile* profile,
     const TemplateURL* existing_turl,
     const SyncData& sync_data,
     SyncChangeList* change_list) {
+  DCHECK(change_list);
+
   sync_pb::SearchEngineSpecifics specifics =
       sync_data.GetSpecifics().search_engine();
 
@@ -1073,7 +1082,7 @@
     data.usage_count = existing_turl->usage_count();
   }
 
-  TemplateURL* turl = new TemplateURL(data);
+  TemplateURL* turl = new TemplateURL(profile, data);
   DCHECK(!turl->IsExtensionKeyword());
   return turl;
 }
@@ -1141,7 +1150,7 @@
       data.short_name = UTF8ToUTF16(initializers[i].content);
       data.SetKeyword(UTF8ToUTF16(initializers[i].keyword));
       data.SetURL(osd_url);
-      AddNoNotify(new TemplateURL(data), true);
+      AddNoNotify(new TemplateURL(profile_, data), true);
     }
   }
 
@@ -1358,7 +1367,7 @@
     base::StringToInt(prepopulate_id, &value);
     data.prepopulate_id = value;
   }
-  default_provider->reset(new TemplateURL(data));
+  default_provider->reset(new TemplateURL(profile_, data));
   DCHECK(!(*default_provider)->IsExtensionKeyword());
   return true;
 }
@@ -1581,7 +1590,7 @@
       // Prefs does not specify, so rely on the prepopulated engines.  This
       // should happen only the first time Chrome is started.
       initial_default_search_provider_.reset(
-          TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(GetPrefs()));
+          TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(profile_));
       is_default_search_managed_ = false;
     }
     return;
@@ -1618,14 +1627,14 @@
     } else if (default_search_provider_) {
       TemplateURLData data(new_default_from_prefs->data());
       data.created_by_policy = true;
-      TemplateURL new_values(data);
+      TemplateURL new_values(profile_, data);
       UpdateNoNotify(default_search_provider_, new_values);
     } else {
       TemplateURL* new_template = NULL;
       if (new_default_from_prefs.get()) {
         TemplateURLData data(new_default_from_prefs->data());
         data.created_by_policy = true;
-        new_template = new TemplateURL(data);
+        new_template = new TemplateURL(profile_, data);
         AddNoNotify(new_template, true);
       }
       SetDefaultSearchProviderNoNotify(new_template);
@@ -1638,7 +1647,7 @@
     if (new_default_from_prefs.get()) {
       TemplateURLData data(new_default_from_prefs->data());
       data.created_by_policy = true;
-      new_template = new TemplateURL(data);
+      new_template = new TemplateURL(profile_, data);
       AddNoNotify(new_template, true);
     }
     SetDefaultSearchProviderNoNotify(new_template);
@@ -1848,7 +1857,7 @@
 
   TemplateURLData data(url->data());
   data.sync_guid = guid;
-  TemplateURL new_url(data);
+  TemplateURL new_url(const_cast<TemplateURL*>(url)->profile(), data);
   UpdateNoNotify(url, new_url);
 }
 
@@ -1902,7 +1911,8 @@
     string16 new_keyword = UniquifyKeyword(*existing_turl);
     TemplateURLData data(existing_turl->data());
     data.SetKeyword(new_keyword);
-    TemplateURL new_turl(data);
+    TemplateURL new_turl(const_cast<TemplateURL*>(existing_turl)->profile(),
+                         data);
     UpdateNoNotify(existing_turl, new_turl);
     NotifyObservers();
   }
diff --git a/chrome/browser/search_engines/template_url_service.h b/chrome/browser/search_engines/template_url_service.h
index 476797e8..764df40 100644
--- a/chrome/browser/search_engines/template_url_service.h
+++ b/chrome/browser/search_engines/template_url_service.h
@@ -144,6 +144,7 @@
 
   // Like Add(), but overwrites the |template_url|'s values with the provided
   // ones.
+  void AddAndSetProfile(TemplateURL* template_url, Profile* profile);
   void AddWithOverrides(const TemplateURL* template_url,
                         const string16& short_name,
                         const string16& keyword,
@@ -308,6 +309,7 @@
   // data is bad for some reason, an ACTION_DELETE change is added and the
   // function returns NULL.
   static TemplateURL* CreateTemplateURLFromTemplateURLAndSyncData(
+      Profile* profile,
       const TemplateURL* existing_turl,
       const SyncData& sync_data,
       SyncChangeList* change_list);
diff --git a/chrome/browser/search_engines/template_url_service_sync_unittest.cc b/chrome/browser/search_engines/template_url_service_sync_unittest.cc
index a7ba778..7cec55b 100644
--- a/chrome/browser/search_engines/template_url_service_sync_unittest.cc
+++ b/chrome/browser/search_engines/template_url_service_sync_unittest.cc
@@ -277,7 +277,7 @@
   data.prepopulate_id = 999999;
   if (!guid.empty())
     data.sync_guid = guid;
-  return new TemplateURL(data);
+  return new TemplateURL(NULL, data);
 }
 
 void TemplateURLServiceSyncTest::AssertEquals(const TemplateURL& expected,
@@ -341,7 +341,7 @@
     const SyncData& sync_data) {
   SyncChangeList dummy;
   return TemplateURLService::CreateTemplateURLFromTemplateURLAndSyncData(NULL,
-      sync_data, &dummy);
+      NULL, sync_data, &dummy);
 }
 
 
@@ -1135,7 +1135,8 @@
   // Keep a copy of it so we can compare it after we re-merge.
   const TemplateURL* key1_url = model()->GetTemplateURLForGUID("key1");
   ASSERT_TRUE(key1_url);
-  scoped_ptr<TemplateURL> updated_turl(new TemplateURL(key1_url->data()));
+  scoped_ptr<TemplateURL> updated_turl(new TemplateURL(
+      const_cast<TemplateURL*>(key1_url)->profile(), key1_url->data()));
   EXPECT_EQ(Time::FromTimeT(90), updated_turl->last_modified());
 
   // Modify a single field of the initial data. This should not be updated in
@@ -1143,7 +1144,7 @@
   scoped_ptr<TemplateURL> temp_turl(Deserialize(initial_data[0]));
   TemplateURLData data(temp_turl->data());
   data.short_name = ASCIIToUTF16("SomethingDifferent");
-  temp_turl.reset(new TemplateURL(data));
+  temp_turl.reset(new TemplateURL(temp_turl->profile(), data));
   initial_data.clear();
   initial_data.push_back(
       TemplateURLService::CreateSyncDataFromTemplateURL(*temp_turl));
diff --git a/chrome/browser/search_engines/template_url_service_unittest.cc b/chrome/browser/search_engines/template_url_service_unittest.cc
index b44b31dc..4bf0e23 100644
--- a/chrome/browser/search_engines/template_url_service_unittest.cc
+++ b/chrome/browser/search_engines/template_url_service_unittest.cc
@@ -33,25 +33,6 @@
 
 namespace {
 
-// Create an URL that appears to have been prepopulated, but won't be in the
-// current data. The caller owns the returned TemplateURL*.
-TemplateURL* CreatePreloadedTemplateURL(bool safe_for_autoreplace,
-                                        int prepopulate_id) {
-  TemplateURLData data;
-  data.short_name = ASCIIToUTF16("unittest");
-  data.SetKeyword(ASCIIToUTF16("unittest"));
-  data.SetURL("http://www.unittest.com/{searchTerms}");
-  data.favicon_url = GURL("http://favicon.url");
-  data.show_in_default_list = true;
-  data.safe_for_autoreplace = safe_for_autoreplace;
-  data.input_encodings.push_back("UTF-8");
-  data.date_created = Time::FromTimeT(100);
-  data.last_modified = Time::FromTimeT(100);
-  data.prepopulate_id = prepopulate_id;
-  return new TemplateURL(data);
-}
-
-
 // TestGenerateSearchURL ------------------------------------------------------
 
 // Test the GenerateSearchURL on a thread or the main thread.
@@ -100,7 +81,7 @@
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(generate_url_cases); ++i) {
     TemplateURLData data;
     data.SetURL(generate_url_cases[i].url);
-    TemplateURL t_url(data);
+    TemplateURL t_url(NULL, data);
     std::string result = (search_terms_data_ ?
         TemplateURLService::GenerateSearchURLUsingTermsData(&t_url,
             *search_terms_data_) :
@@ -172,6 +153,11 @@
   // date_created or the last_modified time.  Neither pointer should be NULL.
   void ExpectSimilar(const TemplateURL* expected, const TemplateURL* actual);
 
+  // Create an URL that appears to have been prepopulated, but won't be in the
+  // current data. The caller owns the returned TemplateURL*.
+  TemplateURL* CreatePreloadedTemplateURL(bool safe_for_autoreplace,
+                                          int prepopulate_id);
+
   // Creates a TemplateURL with the same prepopulated id as a real prepopulated
   // item. The input number determines which prepopulated item. The caller is
   // responsible for owning the returned TemplateURL*.
@@ -231,7 +217,7 @@
   base::SplitString(encodings, ';', &data.input_encodings);
   data.date_created = date_created;
   data.last_modified = last_modified;
-  TemplateURL* t_url = new TemplateURL(data);
+  TemplateURL* t_url = new TemplateURL(test_util_.profile(), data);
   model()->Add(t_url);
   EXPECT_NE(0, t_url->id());
   return t_url;
@@ -267,15 +253,31 @@
   EXPECT_EQ(expected->input_encodings(), actual->input_encodings());
 }
 
+TemplateURL* TemplateURLServiceTest::CreatePreloadedTemplateURL(
+    bool safe_for_autoreplace,
+    int prepopulate_id) {
+  TemplateURLData data;
+  data.short_name = ASCIIToUTF16("unittest");
+  data.SetKeyword(ASCIIToUTF16("unittest"));
+  data.SetURL("http://www.unittest.com/{searchTerms}");
+  data.favicon_url = GURL("http://favicon.url");
+  data.show_in_default_list = true;
+  data.safe_for_autoreplace = safe_for_autoreplace;
+  data.input_encodings.push_back("UTF-8");
+  data.date_created = Time::FromTimeT(100);
+  data.last_modified = Time::FromTimeT(100);
+  data.prepopulate_id = prepopulate_id;
+  return new TemplateURL(test_util_.profile(), data);
+}
+
 TemplateURL* TemplateURLServiceTest::CreateReplaceablePreloadedTemplateURL(
     bool safe_for_autoreplace,
     size_t index_offset_from_default,
     string16* prepopulated_display_url) {
   ScopedVector<TemplateURL> prepopulated_urls;
   size_t default_search_provider_index = 0;
-  TemplateURLPrepopulateData::GetPrepopulatedEngines(
-      test_util_.profile()->GetPrefs(), &prepopulated_urls.get(),
-      &default_search_provider_index);
+  TemplateURLPrepopulateData::GetPrepopulatedEngines(test_util_.profile(),
+      &prepopulated_urls.get(), &default_search_provider_index);
   EXPECT_LT(index_offset_from_default, prepopulated_urls.size());
   size_t prepopulated_index = (default_search_provider_index +
       index_offset_from_default) % prepopulated_urls.size();
@@ -351,7 +353,7 @@
   data.date_created = Time::FromTimeT(100);
   data.last_modified = Time::FromTimeT(100);
   data.sync_guid = "00000000-0000-0000-0000-000000000001";
-  TemplateURL* t_url = new TemplateURL(data);
+  TemplateURL* t_url = new TemplateURL(test_util_.profile(), data);
   model()->Add(t_url);
   ASSERT_TRUE(model()->CanReplaceKeyword(ASCIIToUTF16("keyword"), GURL(),
                                          NULL));
@@ -362,7 +364,8 @@
   // We need to make a second copy as the model takes ownership of |t_url| and
   // will delete it.  We have to do this after calling Add() since that gives
   // |t_url| its ID.
-  scoped_ptr<TemplateURL> cloned_url(new TemplateURL(t_url->data()));
+  scoped_ptr<TemplateURL> cloned_url(new TemplateURL(t_url->profile(),
+                                                     t_url->data()));
 
   // Reload the model to verify it was actually saved to the database.
   test_util_.ResetModel(true);
@@ -391,7 +394,8 @@
   ASSERT_TRUE(model()->CanReplaceKeyword(ASCIIToUTF16("keyword"), GURL(),
                                          NULL));
   ASSERT_FALSE(model()->CanReplaceKeyword(ASCIIToUTF16("b"), GURL(), NULL));
-  cloned_url.reset(new TemplateURL(loaded_url->data()));
+  cloned_url.reset(new TemplateURL(
+      const_cast<TemplateURL*>(loaded_url)->profile(), loaded_url->data()));
   test_util_.BlockTillServiceProcessesRequests();
   test_util_.ResetModel(true);
   ASSERT_EQ(initial_count + 1, model()->GetTemplateURLs().size());
@@ -575,7 +579,7 @@
   data.favicon_url = GURL("http://favicon.url");
   data.date_created = Time::FromTimeT(100);
   data.last_modified = Time::FromTimeT(100);
-  TemplateURL* t_url = new TemplateURL(data);
+  TemplateURL* t_url = new TemplateURL(test_util_.profile(), data);
   model()->Add(t_url);
 
   VerifyObserverCount(1);
@@ -599,7 +603,8 @@
   ASSERT_TRUE(
       model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword")) == NULL);
 
-  scoped_ptr<TemplateURL> cloned_url(new TemplateURL(t_url->data()));
+  scoped_ptr<TemplateURL> cloned_url(new TemplateURL(t_url->profile(),
+                                                     t_url->data()));
 
   // Reload the model from the database and make sure the change took.
   test_util_.ResetModel(true);
@@ -628,7 +633,8 @@
   VerifyObserverCount(1);
   test_util_.BlockTillServiceProcessesRequests();
 
-  scoped_ptr<TemplateURL> cloned_url(new TemplateURL(t_url->data()));
+  scoped_ptr<TemplateURL> cloned_url(new TemplateURL(t_url->profile(),
+                                                     t_url->data()));
 
   // Make sure when we reload we get a default search provider.
   test_util_.ResetModel(true);
@@ -724,13 +730,14 @@
   data.instant_url = "http://instant";
   data.date_created = Time::FromTimeT(100);
   data.last_modified = Time::FromTimeT(100);
-  TemplateURL* t_url = new TemplateURL(data);
+  TemplateURL* t_url = new TemplateURL(test_util_.profile(), data);
   model()->Add(t_url);
   const TemplateURLID id = t_url->id();
 
   model()->SetDefaultSearchProvider(t_url);
   test_util_.BlockTillServiceProcessesRequests();
-  scoped_ptr<TemplateURL> cloned_url(new TemplateURL(t_url->data()));
+  scoped_ptr<TemplateURL> cloned_url(new TemplateURL(t_url->profile(),
+                                                     t_url->data()));
 
   // Reset the model and don't load it. The template url we set as the default
   // should be pulled from prefs now.
@@ -971,7 +978,8 @@
   model()->Add(t_url);
 
   // Do the copy after t_url is added so that the id is set.
-  scoped_ptr<TemplateURL> cloned_url(new TemplateURL(t_url->data()));
+  scoped_ptr<TemplateURL> cloned_url(new TemplateURL(t_url->profile(),
+                                                     t_url->data()));
   ASSERT_EQ(t_url, model()->GetTemplateURLForKeyword(ASCIIToUTF16("unittest")));
 
   // Wait for any saves to finish.
@@ -1001,7 +1009,9 @@
   // Verify that the default search provider is set to something.
   const TemplateURL* default_search = model()->GetDefaultSearchProvider();
   ASSERT_TRUE(default_search != NULL);
-  scoped_ptr<TemplateURL> cloned_url(new TemplateURL(default_search->data()));
+  scoped_ptr<TemplateURL> cloned_url(new TemplateURL(
+      const_cast<TemplateURL*>(default_search)->profile(),
+      default_search->data()));
 
   // Wait for any saves to finish.
   test_util_.BlockTillServiceProcessesRequests();
@@ -1027,7 +1037,8 @@
   model()->SetDefaultSearchProvider(t_url);
   // Do the copy after t_url is added and set as default so that its
   // internal state is correct.
-  scoped_ptr<TemplateURL> cloned_url(new TemplateURL(t_url->data()));
+  scoped_ptr<TemplateURL> cloned_url(new TemplateURL(t_url->profile(),
+                                                     t_url->data()));
 
   ASSERT_EQ(t_url, model()->GetTemplateURLForKeyword(ASCIIToUTF16("unittest")));
   ASSERT_EQ(t_url, model()->GetDefaultSearchProvider());
@@ -1118,7 +1129,7 @@
 
   // Then add it to the model and save it all.
   test_util_.ChangeModelToLoadState();
-  model()->Add(new TemplateURL(data));
+  model()->Add(new TemplateURL(test_util_.profile(), data));
   test_util_.BlockTillServiceProcessesRequests();
 
   // Now reload the model and verify that the merge updates the url.
@@ -1186,7 +1197,9 @@
   data.favicon_url = GURL(kIconURL);
   data.show_in_default_list = true;
   base::SplitString(kEncodings, ';', &data.input_encodings);
-  scoped_ptr<TemplateURL> expected_managed_default1(new TemplateURL(data));
+  Profile* profile = test_util_.profile();
+  scoped_ptr<TemplateURL> expected_managed_default1(new TemplateURL(profile,
+                                                                    data));
   const TemplateURL* actual_managed_default =
       model()->GetDefaultSearchProvider();
   ExpectSimilar(expected_managed_default1.get(), actual_managed_default);
@@ -1210,7 +1223,8 @@
   data2.SetURL(kNewSearchURL);
   data2.suggestions_url = kNewSuggestURL;
   data2.show_in_default_list = true;
-  scoped_ptr<TemplateURL> expected_managed_default2(new TemplateURL(data2));
+  scoped_ptr<TemplateURL> expected_managed_default2(new TemplateURL(profile,
+                                                                    data2));
   actual_managed_default = model()->GetDefaultSearchProvider();
   ExpectSimilar(expected_managed_default2.get(), actual_managed_default);
   EXPECT_EQ(actual_managed_default->show_in_default_list(), true);
@@ -1283,7 +1297,7 @@
   data.SetKeyword(ASCIIToUTF16("keyword"));
   data.SetURL("http://www.google.com/foo/bar");
   data.sync_guid.clear();
-  TemplateURL* t_url = new TemplateURL(data);
+  TemplateURL* t_url = new TemplateURL(test_util_.profile(), data);
   model()->Add(t_url);
 
   VerifyObserverCount(1);
diff --git a/chrome/browser/search_engines/template_url_unittest.cc b/chrome/browser/search_engines/template_url_unittest.cc
index e9a9769..dbc5c396 100644
--- a/chrome/browser/search_engines/template_url_unittest.cc
+++ b/chrome/browser/search_engines/template_url_unittest.cc
@@ -67,7 +67,7 @@
 TEST_F(TemplateURLTest, TestValidWithComplete) {
   TemplateURLData data;
   data.SetURL("{searchTerms}");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   EXPECT_TRUE(url.url_ref().IsValid());
 }
 
@@ -91,7 +91,7 @@
     const SearchTermsCase& value = search_term_cases[i];
     TemplateURLData data;
     data.SetURL(value.url);
-    TemplateURL url(data);
+    TemplateURL url(NULL, data);
     EXPECT_TRUE(url.url_ref().IsValid());
     ASSERT_TRUE(url.url_ref().SupportsReplacement());
     std::string result = url.url_ref().ReplaceSearchTerms(value.terms,
@@ -105,7 +105,7 @@
 TEST_F(TemplateURLTest, URLRefTestCount) {
   TemplateURLData data;
   data.SetURL("http://foo{searchTerms}{count?}");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   EXPECT_TRUE(url.url_ref().IsValid());
   ASSERT_TRUE(url.url_ref().SupportsReplacement());
   GURL result(url.url_ref().ReplaceSearchTerms(ASCIIToUTF16("X"),
@@ -117,7 +117,7 @@
 TEST_F(TemplateURLTest, URLRefTestCount2) {
   TemplateURLData data;
   data.SetURL("http://foo{searchTerms}{count}");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   EXPECT_TRUE(url.url_ref().IsValid());
   ASSERT_TRUE(url.url_ref().SupportsReplacement());
   GURL result(url.url_ref().ReplaceSearchTerms(ASCIIToUTF16("X"),
@@ -129,7 +129,7 @@
 TEST_F(TemplateURLTest, URLRefTestIndices) {
   TemplateURLData data;
   data.SetURL("http://foo{searchTerms}x{startIndex?}y{startPage?}");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   EXPECT_TRUE(url.url_ref().IsValid());
   ASSERT_TRUE(url.url_ref().SupportsReplacement());
   GURL result(url.url_ref().ReplaceSearchTerms(ASCIIToUTF16("X"),
@@ -141,7 +141,7 @@
 TEST_F(TemplateURLTest, URLRefTestIndices2) {
   TemplateURLData data;
   data.SetURL("http://foo{searchTerms}x{startIndex}y{startPage}");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   EXPECT_TRUE(url.url_ref().IsValid());
   ASSERT_TRUE(url.url_ref().SupportsReplacement());
   GURL result(url.url_ref().ReplaceSearchTerms(ASCIIToUTF16("X"),
@@ -153,7 +153,7 @@
 TEST_F(TemplateURLTest, URLRefTestEncoding) {
   TemplateURLData data;
   data.SetURL("http://foo{searchTerms}x{inputEncoding?}y{outputEncoding?}a");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   EXPECT_TRUE(url.url_ref().IsValid());
   ASSERT_TRUE(url.url_ref().SupportsReplacement());
   GURL result(url.url_ref().ReplaceSearchTerms(ASCIIToUTF16("X"),
@@ -167,7 +167,7 @@
 TEST_F(TemplateURLTest, SetPrepopulatedAndParse) {
   TemplateURLData data;
   data.SetURL("http://foo{fhqwhgads}");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   TemplateURLRef::Replacements replacements;
   bool valid = false;
   EXPECT_EQ("http://foo{fhqwhgads}",
@@ -176,7 +176,7 @@
   EXPECT_TRUE(valid);
 
   data.prepopulate_id = 123;
-  TemplateURL url2(data);
+  TemplateURL url2(NULL, data);
   EXPECT_EQ("http://foo", url2.url_ref().ParseURL("http://foo{fhqwhgads}",
                                                   &replacements, &valid));
   EXPECT_TRUE(replacements.empty());
@@ -186,7 +186,7 @@
 TEST_F(TemplateURLTest, InputEncodingBeforeSearchTerm) {
   TemplateURLData data;
   data.SetURL("http://foox{inputEncoding?}a{searchTerms}y{outputEncoding?}b");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   EXPECT_TRUE(url.url_ref().IsValid());
   ASSERT_TRUE(url.url_ref().SupportsReplacement());
   GURL result(url.url_ref().ReplaceSearchTerms(ASCIIToUTF16("X"),
@@ -198,7 +198,7 @@
 TEST_F(TemplateURLTest, URLRefTestEncoding2) {
   TemplateURLData data;
   data.SetURL("http://foo{searchTerms}x{inputEncoding}y{outputEncoding}a");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   EXPECT_TRUE(url.url_ref().IsValid());
   ASSERT_TRUE(url.url_ref().SupportsReplacement());
   GURL result(url.url_ref().ReplaceSearchTerms(ASCIIToUTF16("X"),
@@ -224,7 +224,7 @@
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(search_term_cases); ++i) {
     const SearchTermsCase& value = search_term_cases[i];
     data.SetURL(value.url);
-    TemplateURL url(data);
+    TemplateURL url(NULL, data);
     EXPECT_TRUE(url.url_ref().IsValid());
     ASSERT_TRUE(url.url_ref().SupportsReplacement());
     GURL result(url.url_ref().ReplaceSearchTermsUsingTermsData(value.terms,
@@ -259,7 +259,7 @@
   TemplateURLData data;
   data.SetURL("http://foo?q={searchTerms}");
   data.input_encodings.push_back("big-5");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   EXPECT_TRUE(url.url_ref().IsValid());
   ASSERT_TRUE(url.url_ref().SupportsReplacement());
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(to_wide_cases); i++) {
@@ -286,7 +286,7 @@
   TemplateURLData data;
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) {
     data.SetURL(test_data[i].url);
-    TemplateURL url(data);
+    TemplateURL url(NULL, data);
     EXPECT_EQ(test_data[i].expected_result, url.url_ref().DisplayURL());
     EXPECT_EQ(test_data[i].url,
               TemplateURLRef::DisplayURLToURLRef(url.url_ref().DisplayURL()));
@@ -327,7 +327,7 @@
   data.input_encodings.push_back("UTF-8");
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) {
     data.SetURL(test_data[i].url);
-    TemplateURL url(data);
+    TemplateURL url(NULL, data);
     EXPECT_TRUE(url.url_ref().IsValid());
     ASSERT_TRUE(url.url_ref().SupportsReplacement());
     std::string expected_result = test_data[i].expected_result;
@@ -368,7 +368,7 @@
     data.SetURL(test_data[i].url);
     data.input_encodings.clear();
     data.input_encodings.push_back(test_data[i].encoding);
-    TemplateURL url(data);
+    TemplateURL url(NULL, data);
     EXPECT_TRUE(url.url_ref().IsValid());
     ASSERT_TRUE(url.url_ref().SupportsReplacement());
     GURL result(url.url_ref().ReplaceSearchTerms(test_data[i].search_term,
@@ -399,7 +399,7 @@
   data.SetURL("http://bar/foo?{google:acceptedSuggestion}"
               "{google:originalQueryForSuggestion}q={searchTerms}");
   data.input_encodings.push_back("UTF-8");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   EXPECT_TRUE(url.url_ref().IsValid());
   ASSERT_TRUE(url.url_ref().SupportsReplacement());
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) {
@@ -424,7 +424,7 @@
 
   TemplateURLData data;
   data.SetURL("http://bar/?{google:RLZ}{searchTerms}");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   EXPECT_TRUE(url.url_ref().IsValid());
   ASSERT_TRUE(url.url_ref().SupportsReplacement());
   GURL result(url.url_ref().ReplaceSearchTerms(ASCIIToUTF16("x"),
@@ -468,7 +468,7 @@
   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) {
     TemplateURLData data;
     data.SetURL(test_data[i].url);
-    TemplateURL url(data);
+    TemplateURL url(NULL, data);
     EXPECT_EQ(test_data[i].host, url.url_ref().GetHost());
     EXPECT_EQ(test_data[i].path, url.url_ref().GetPath());
     EXPECT_EQ(test_data[i].search_term_key, url.url_ref().GetSearchTermKey());
@@ -496,20 +496,20 @@
   data.SetURL("http://www.google.com/search");
   EXPECT_FALSE(data.autogenerate_keyword());
   data.SetKeyword(ASCIIToUTF16("foo"));
-  EXPECT_EQ(ASCIIToUTF16("foo"), TemplateURL(data).keyword());
+  EXPECT_EQ(ASCIIToUTF16("foo"), TemplateURL(NULL, data).keyword());
   data.SetAutogenerateKeyword(true);
   EXPECT_TRUE(data.autogenerate_keyword());
-  EXPECT_EQ(ASCIIToUTF16("google.com"), TemplateURL(data).keyword());
+  EXPECT_EQ(ASCIIToUTF16("google.com"), TemplateURL(NULL, data).keyword());
   data.SetKeyword(ASCIIToUTF16("foo"));
   EXPECT_FALSE(data.autogenerate_keyword());
-  EXPECT_EQ(ASCIIToUTF16("foo"), TemplateURL(data).keyword());
+  EXPECT_EQ(ASCIIToUTF16("foo"), TemplateURL(NULL, data).keyword());
 }
 
 TEST_F(TemplateURLTest, ParseParameterKnown) {
   std::string parsed_url("{searchTerms}");
   TemplateURLData data;
   data.SetURL(parsed_url);
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   TemplateURLRef::Replacements replacements;
   EXPECT_TRUE(url.url_ref().ParseParameter(0, 12, &parsed_url, &replacements));
   EXPECT_EQ(std::string(), parsed_url);
@@ -522,7 +522,7 @@
   std::string parsed_url("{fhqwhgads}");
   TemplateURLData data;
   data.SetURL(parsed_url);
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   TemplateURLRef::Replacements replacements;
 
   // By default, TemplateURLRef should not consider itself prepopulated.
@@ -534,7 +534,7 @@
   // If the TemplateURLRef is prepopulated, we should remove unknown parameters.
   parsed_url = "{fhqwhgads}";
   data.prepopulate_id = 1;
-  TemplateURL url2(data);
+  TemplateURL url2(NULL, data);
   EXPECT_FALSE(url2.url_ref().ParseParameter(0, 10, &parsed_url,
                                              &replacements));
   EXPECT_EQ(std::string(), parsed_url);
@@ -542,8 +542,7 @@
 }
 
 TEST_F(TemplateURLTest, ParseURLEmpty) {
-  TemplateURLData data;
-  TemplateURL url(data);
+  TemplateURL url(NULL, TemplateURLData());
   TemplateURLRef::Replacements replacements;
   bool valid = false;
   EXPECT_EQ(std::string(),
@@ -555,7 +554,7 @@
 TEST_F(TemplateURLTest, ParseURLNoTemplateEnd) {
   TemplateURLData data;
   data.SetURL("{");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   TemplateURLRef::Replacements replacements;
   bool valid = false;
   EXPECT_EQ(std::string(), url.url_ref().ParseURL("{", &replacements, &valid));
@@ -566,7 +565,7 @@
 TEST_F(TemplateURLTest, ParseURLNoKnownParameters) {
   TemplateURLData data;
   data.SetURL("{}");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   TemplateURLRef::Replacements replacements;
   bool valid = false;
   EXPECT_EQ("{}", url.url_ref().ParseURL("{}", &replacements, &valid));
@@ -577,7 +576,7 @@
 TEST_F(TemplateURLTest, ParseURLTwoParameters) {
   TemplateURLData data;
   data.SetURL("{}{{%s}}");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   TemplateURLRef::Replacements replacements;
   bool valid = false;
   EXPECT_EQ("{}{}",
@@ -591,7 +590,7 @@
 TEST_F(TemplateURLTest, ParseURLNestedParameter) {
   TemplateURLData data;
   data.SetURL("{%s");
-  TemplateURL url(data);
+  TemplateURL url(NULL, data);
   TemplateURLRef::Replacements replacements;
   bool valid = false;
   EXPECT_EQ("{",
diff --git a/chrome/browser/search_engines/util.cc b/chrome/browser/search_engines/util.cc
index b284aec4..63d71a5 100644
--- a/chrome/browser/search_engines/util.cc
+++ b/chrome/browser/search_engines/util.cc
@@ -8,7 +8,6 @@
 #include <vector>
 
 #include "base/logging.h"
-#include "chrome/browser/prefs/pref_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url.h"
 #include "chrome/browser/search_engines/template_url_prepopulate_data.h"
@@ -83,7 +82,7 @@
 // Loads engines from prepopulate data and merges them in with the existing
 // engines.  This is invoked when the version of the prepopulate data changes.
 void MergeEnginesFromPrepopulateData(
-    PrefService* prefs,
+    Profile* profile,
     WebDataService* service,
     std::vector<TemplateURL*>* template_urls,
     const TemplateURL** default_search_provider) {
@@ -105,7 +104,7 @@
   // Get the current set of prepopulatd URLs.
   std::vector<TemplateURL*> prepopulated_urls;
   size_t default_search_index;
-  TemplateURLPrepopulateData::GetPrepopulatedEngines(prefs,
+  TemplateURLPrepopulateData::GetPrepopulatedEngines(profile,
       &prepopulated_urls, &default_search_index);
 
   // For each current prepopulated URL, check whether |template_urls| contained
@@ -135,7 +134,7 @@
         data.short_name = existing_url->short_name();
       }
       data.id = existing_url->id();
-      url_in_vector = new TemplateURL(data);
+      url_in_vector = new TemplateURL(profile, data);
       if (service)
         service->UpdateKeyword(*url_in_vector);
 
@@ -175,7 +174,7 @@
 void GetSearchProvidersUsingKeywordResult(
     const WDTypedResult& result,
     WebDataService* service,
-    PrefService* prefs,
+    Profile* profile,
     std::vector<TemplateURL*>* template_urls,
     const TemplateURL** default_search_provider,
     int* new_resource_keyword_version) {
@@ -194,10 +193,11 @@
   for (KeywordTable::Keywords::const_iterator i(
        keyword_result.keywords.begin()); i != keyword_result.keywords.end();
        ++i)
-    template_urls->push_back(new TemplateURL(*i));
+    template_urls->push_back(new TemplateURL(profile, *i));
 
   const int resource_keyword_version =
-      TemplateURLPrepopulateData::GetDataVersion(prefs);
+      TemplateURLPrepopulateData::GetDataVersion(
+          profile ? profile->GetPrefs() : NULL);
   if (keyword_result.builtin_keyword_version != resource_keyword_version) {
     // There should never be duplicate TemplateURLs. We had a bug such that
     // duplicate TemplateURLs existed for one locale. As such we invoke
@@ -212,7 +212,7 @@
   }
 
   if (keyword_result.builtin_keyword_version != resource_keyword_version) {
-    MergeEnginesFromPrepopulateData(prefs, service, template_urls,
+    MergeEnginesFromPrepopulateData(profile, service, template_urls,
                                     default_search_provider);
     *new_resource_keyword_version = resource_keyword_version;
   }
@@ -220,6 +220,7 @@
 
 bool DidDefaultSearchProviderChange(
     const WDTypedResult& result,
+    Profile* profile,
     scoped_ptr<TemplateURL>* backup_default_search_provider) {
   DCHECK(backup_default_search_provider);
   DCHECK(!backup_default_search_provider->get());
@@ -232,7 +233,7 @@
     return false;
 
   if (keyword_result.backup_valid) {
-    backup_default_search_provider->reset(new TemplateURL(
+    backup_default_search_provider->reset(new TemplateURL(profile,
         keyword_result.default_search_provider_backup));
   }
   return true;
diff --git a/chrome/browser/search_engines/util.h b/chrome/browser/search_engines/util.h
index c2ba446..bba6a9a4 100644
--- a/chrome/browser/search_engines/util.h
+++ b/chrome/browser/search_engines/util.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
 
@@ -12,7 +12,6 @@
 #include "base/memory/scoped_ptr.h"
 #include "base/string16.h"
 
-class PrefService;
 class Profile;
 class TemplateURL;
 class WDTypedResult;
@@ -36,7 +35,7 @@
 void GetSearchProvidersUsingKeywordResult(
     const WDTypedResult& result,
     WebDataService* service,
-    PrefService* prefs,
+    Profile* profile,
     std::vector<TemplateURL*>* template_urls,
     const TemplateURL** default_search_provider,
     int* new_resource_keyword_version);
@@ -47,6 +46,7 @@
 // lost.
 bool DidDefaultSearchProviderChange(
     const WDTypedResult& result,
+    Profile* profile,
     scoped_ptr<TemplateURL>* backup_default_search_provider);
 
 #endif  // CHROME_BROWSER_SEARCH_ENGINES_UTIL_H_
diff --git a/chrome/browser/sync/test/integration/search_engines_helper.cc b/chrome/browser/sync/test/integration/search_engines_helper.cc
index 97f06677..1a9f4e0 100644
--- a/chrome/browser/sync/test/integration/search_engines_helper.cc
+++ b/chrome/browser/sync/test/integration/search_engines_helper.cc
@@ -20,15 +20,7 @@
 
 using sync_datatype_helper::test;
 
-namespace search_engines_helper {
-
-TemplateURLService* GetServiceForProfile(int index) {
-  return TemplateURLServiceFactory::GetForProfile(test()->GetProfile(index));
-}
-
-TemplateURLService* GetVerifierService() {
-  return TemplateURLServiceFactory::GetForProfile(test()->verifier());
-}
+namespace {
 
 GUIDToTURLMap CreateGUIDToTURLMap(TemplateURLService* service) {
   CHECK(service);
@@ -67,43 +59,11 @@
   return result;
 }
 
-bool ServiceMatchesVerifier(int profile) {
-  TemplateURLService* verifier = GetVerifierService();
-  TemplateURLService* other = GetServiceForProfile(profile);
-
-  CHECK(verifier);
-  CHECK(other);
-
-  TemplateURLService::TemplateURLVector verifier_turls =
-      verifier->GetTemplateURLs();
-  if (verifier_turls.size() != other->GetTemplateURLs().size()) {
-    LOG(ERROR) << "Verifier and other service have a different count of TURLs: "
-               << verifier_turls.size() << " vs "
-               << other->GetTemplateURLs().size() << " respectively.";
-    return false;
-  }
-
-  for (size_t i = 0; i < verifier_turls.size(); ++i) {
-    const TemplateURL* verifier_turl = verifier_turls.at(i);
-    CHECK(verifier_turl);
-    const TemplateURL* other_turl = other->GetTemplateURLForKeyword(
-        verifier_turl->keyword());
-
-    if (!other_turl) {
-      LOG(ERROR) << "The other service did not contain a TURL with keyword: "
-                 << verifier_turl->keyword();
-      return false;
-    }
-    if (!TURLsMatch(verifier_turl, other_turl))
-      return false;
-  }
-
-  return true;
-}
-
 bool ServicesMatch(int profile_a, int profile_b) {
-  TemplateURLService* service_a = GetServiceForProfile(profile_a);
-  TemplateURLService* service_b = GetServiceForProfile(profile_b);
+  TemplateURLService* service_a =
+      search_engines_helper::GetServiceForProfile(profile_a);
+  TemplateURLService* service_b =
+      search_engines_helper::GetServiceForProfile(profile_b);
   CHECK(service_a);
   CHECK(service_b);
 
@@ -145,6 +105,59 @@
   return true;
 }
 
+// Convenience helper for consistently generating the same keyword for a given
+// seed.
+string16 CreateKeyword(int seed) {
+  return ASCIIToUTF16(base::StringPrintf("test%d", seed));
+}
+
+}  // namespace
+
+namespace search_engines_helper {
+
+TemplateURLService* GetServiceForProfile(int profile_index) {
+  return TemplateURLServiceFactory::GetForProfile(
+      test()->GetProfile(profile_index));
+}
+
+TemplateURLService* GetVerifierService() {
+  return TemplateURLServiceFactory::GetForProfile(test()->verifier());
+}
+
+bool ServiceMatchesVerifier(int profile_index) {
+  TemplateURLService* verifier = GetVerifierService();
+  TemplateURLService* other = GetServiceForProfile(profile_index);
+
+  CHECK(verifier);
+  CHECK(other);
+
+  TemplateURLService::TemplateURLVector verifier_turls =
+      verifier->GetTemplateURLs();
+  if (verifier_turls.size() != other->GetTemplateURLs().size()) {
+    LOG(ERROR) << "Verifier and other service have a different count of TURLs: "
+               << verifier_turls.size() << " vs "
+               << other->GetTemplateURLs().size() << " respectively.";
+    return false;
+  }
+
+  for (size_t i = 0; i < verifier_turls.size(); ++i) {
+    const TemplateURL* verifier_turl = verifier_turls.at(i);
+    CHECK(verifier_turl);
+    const TemplateURL* other_turl = other->GetTemplateURLForKeyword(
+        verifier_turl->keyword());
+
+    if (!other_turl) {
+      LOG(ERROR) << "The other service did not contain a TURL with keyword: "
+                 << verifier_turl->keyword();
+      return false;
+    }
+    if (!TURLsMatch(verifier_turl, other_turl))
+      return false;
+  }
+
+  return true;
+}
+
 bool AllServicesMatch() {
   // Use 0 as the baseline.
   if (test()->use_verifier() && !ServiceMatchesVerifier(0)) {
@@ -162,25 +175,21 @@
   return true;
 }
 
-// Convenience helper for consistently generating the same keyword for a given
-// seed.
-string16 CreateKeyword(int seed) {
-  return ASCIIToUTF16(base::StringPrintf("test%d", seed));
-}
-
-TemplateURL* CreateTestTemplateURL(int seed) {
-  return CreateTestTemplateURL(seed, CreateKeyword(seed),
+TemplateURL* CreateTestTemplateURL(Profile* profile, int seed) {
+  return CreateTestTemplateURL(profile, seed, CreateKeyword(seed),
                                base::StringPrintf("0000-0000-0000-%04d", seed));
 }
 
-TemplateURL* CreateTestTemplateURL(int seed,
+TemplateURL* CreateTestTemplateURL(Profile* profile,
+                                   int seed,
                                    const string16& keyword,
                                    const std::string& sync_guid) {
-  return CreateTestTemplateURL(seed, keyword,
+  return CreateTestTemplateURL(profile, seed, keyword,
       base::StringPrintf("http://www.test%d.com/", seed), sync_guid);
 }
 
-TemplateURL* CreateTestTemplateURL(int seed,
+TemplateURL* CreateTestTemplateURL(Profile* profile,
+                                   int seed,
                                    const string16& keyword,
                                    const std::string& url,
                                    const std::string& sync_guid) {
@@ -194,27 +203,28 @@
   data.last_modified = base::Time::FromTimeT(100);
   data.prepopulate_id = 999999;
   data.sync_guid = sync_guid;
-  return new TemplateURL(data);
+  return new TemplateURL(profile, data);
 }
 
-void AddSearchEngine(int profile, int seed) {
-  GetServiceForProfile(profile)->Add(CreateTestTemplateURL(seed));
+void AddSearchEngine(int profile_index, int seed) {
+  Profile* profile = test()->GetProfile(profile_index);
+  TemplateURLServiceFactory::GetForProfile(profile)->Add(
+      CreateTestTemplateURL(profile, seed));
   if (test()->use_verifier())
-    GetVerifierService()->Add(CreateTestTemplateURL(seed));
+    GetVerifierService()->Add(CreateTestTemplateURL(profile, seed));
 }
 
-void EditSearchEngine(int profile,
+void EditSearchEngine(int profile_index,
                       const string16& keyword,
                       const string16& short_name,
                       const string16& new_keyword,
                       const std::string& url) {
   DCHECK(!url.empty());
-  const TemplateURL* turl =
-      GetServiceForProfile(profile)->GetTemplateURLForKeyword(keyword);
+  TemplateURLService* service = GetServiceForProfile(profile_index);
+  const TemplateURL* turl = service->GetTemplateURLForKeyword(keyword);
   EXPECT_TRUE(turl);
   ASSERT_FALSE(new_keyword.empty());
-  GetServiceForProfile(profile)->ResetTemplateURL(turl, short_name, new_keyword,
-                                                  url);
+  service->ResetTemplateURL(turl, short_name, new_keyword, url);
   // Make sure we do the same on the verifier.
   if (test()->use_verifier()) {
     const TemplateURL* verifier_turl =
@@ -225,11 +235,12 @@
   }
 }
 
-void DeleteSearchEngineByKeyword(int profile, const string16& keyword) {
-  const TemplateURL* turl =
-      GetServiceForProfile(profile)->GetTemplateURLForKeyword(keyword);
+void DeleteSearchEngineBySeed(int profile_index, int seed) {
+  TemplateURLService* service = GetServiceForProfile(profile_index);
+  string16 keyword(CreateKeyword(seed));
+  const TemplateURL* turl = service->GetTemplateURLForKeyword(keyword);
   EXPECT_TRUE(turl);
-  GetServiceForProfile(profile)->Remove(turl);
+  service->Remove(turl);
   // Make sure we do the same on the verifier.
   if (test()->use_verifier()) {
     const TemplateURL* verifier_turl =
@@ -239,12 +250,8 @@
   }
 }
 
-void DeleteSearchEngineBySeed(int profile, int seed) {
-  DeleteSearchEngineByKeyword(profile, CreateKeyword(seed));
-}
-
-void ChangeDefaultSearchProvider(int profile, int seed) {
-  TemplateURLService* service = GetServiceForProfile(profile);
+void ChangeDefaultSearchProvider(int profile_index, int seed) {
+  TemplateURLService* service = GetServiceForProfile(profile_index);
   ASSERT_TRUE(service);
   const TemplateURL* turl =
       service->GetTemplateURLForKeyword(CreateKeyword(seed));
diff --git a/chrome/browser/sync/test/integration/search_engines_helper.h b/chrome/browser/sync/test/integration/search_engines_helper.h
index f4048642..8924853 100644
--- a/chrome/browser/sync/test/integration/search_engines_helper.h
+++ b/chrome/browser/sync/test/integration/search_engines_helper.h
@@ -11,6 +11,7 @@
 
 #include "base/string16.h"
 
+class Profile;
 class TemplateURL;
 class TemplateURLService;
 
@@ -19,64 +20,51 @@
 namespace search_engines_helper {
 
 // Used to access the search engines within a particular sync profile.
-TemplateURLService* GetServiceForProfile(int index);
+TemplateURLService* GetServiceForProfile(int profile_index);
 
 // Used to access the search engines within the verifier sync profile.
 TemplateURLService* GetVerifierService();
 
-// Returns a mapping of |service|'s TemplateURL collection with their sync
-// GUIDs as keys.
-GUIDToTURLMap CreateGUIDToTURLMap(TemplateURLService* service);
-
-// Returns true iff the major user-visible fields of |turl1| and |turl2| match.
-bool TURLsMatch(const TemplateURL* turl1, const TemplateURL* turl2);
-
 // Compared a single TemplateURLService for a given profile to the verifier.
 // Retrns true iff their user-visible fields match.
-bool ServiceMatchesVerifier(int profile);
-
-// Returns true iff |other|'s TemplateURLs matches the verifier's TemplateURLs
-// by sync GUIDs and user-visible fields.
-bool ServicesMatch(TemplateURLService* other);
+bool ServiceMatchesVerifier(int profile_index);
 
 // Returns true iff all TemplateURLServices match with the verifier.
 bool AllServicesMatch();
 
 // Create a TemplateURL with some test values based on |seed|. The caller owns
 // the returned TemplateURL*.
-TemplateURL* CreateTestTemplateURL(int seed);
-TemplateURL* CreateTestTemplateURL(int seed,
+TemplateURL* CreateTestTemplateURL(Profile* profile,
+                                   int seed,
                                    const string16& keyword,
                                    const std::string& sync_guid);
-TemplateURL* CreateTestTemplateURL(int seed,
+TemplateURL* CreateTestTemplateURL(Profile* profile,
+                                   int seed,
                                    const string16& keyword,
                                    const std::string& url,
                                    const std::string& sync_guid);
 
-// Add a search engine based on a seed to the service at index |profile| and the
-// verifier if it is used.
-void AddSearchEngine(int profile, int seed);
+// Add a search engine based on a seed to the service at index |profile_index|
+// and the verifier if it is used.
+void AddSearchEngine(int profile_index, int seed);
 
-// Retrieves a search engine from the service at index |profile| with original
-// keyword |keyword| and changes its user-visible fields. Does the same to the
-// verifier, if it is used.
-void EditSearchEngine(int profile,
+// Retrieves a search engine from the service at index |profile_index| with
+// original keyword |keyword| and changes its user-visible fields. Does the same
+// to the verifier, if it is used.
+void EditSearchEngine(int profile_index,
                       const string16& keyword,
                       const string16& short_name,
                       const string16& new_keyword,
                       const std::string& url);
 
-// Deletes a search engine from the service at index |profile| with original
-// keyword |keyword|. Does the same to the verifier, if it is used.
-void DeleteSearchEngineByKeyword(int profile, const string16& keyword);
-
-// Deletes a search engine from the service at index |profile| which was
+// Deletes a search engine from the service at index |profile_index| which was
 // generated by seed |seed|.
-void DeleteSearchEngineBySeed(int profile, int seed);
+void DeleteSearchEngineBySeed(int profile_index, int seed);
 
-// Change the search engine generated with |seed| in service at index |profile|
-// to be the new default. Does the same to the verifier, if it is used.
-void ChangeDefaultSearchProvider(int profile, int seed);
+// Change the search engine generated with |seed| in service at index
+// |profile_index| to be the new default. Does the same to the verifier, if it
+// is used.
+void ChangeDefaultSearchProvider(int profile_index, int seed);
 
 }  // namespace search_engines_helper
 
diff --git a/chrome/browser/sync/test/integration/two_client_search_engines_sync_test.cc b/chrome/browser/sync/test/integration/two_client_search_engines_sync_test.cc
index 67c01069..83ec779 100644
--- a/chrome/browser/sync/test/integration/two_client_search_engines_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_search_engines_sync_test.cc
@@ -5,20 +5,12 @@
 #include "base/utf_string_conversions.h"
 #include "chrome/browser/search_engines/template_url.h"
 #include "chrome/browser/search_engines/template_url_service.h"
+#include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/browser/sync/profile_sync_service_harness.h"
 #include "chrome/browser/sync/test/integration/search_engines_helper.h"
+#include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
 
-using search_engines_helper::AddSearchEngine;
-using search_engines_helper::AllServicesMatch;
-using search_engines_helper::ChangeDefaultSearchProvider;
-using search_engines_helper::CreateTestTemplateURL;
-using search_engines_helper::DeleteSearchEngineBySeed;
-using search_engines_helper::EditSearchEngine;
-using search_engines_helper::GetServiceForProfile;
-using search_engines_helper::GetVerifierService;
-using search_engines_helper::ServiceMatchesVerifier;
-
 class TwoClientSearchEnginesSyncTest : public SyncTest {
  public:
   TwoClientSearchEnginesSyncTest() : SyncTest(TWO_CLIENT) {}
@@ -31,211 +23,217 @@
 // TCM ID - 8898628.
 IN_PROC_BROWSER_TEST_F(TwoClientSearchEnginesSyncTest, Add) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
-  AddSearchEngine(0, 0);
+  search_engines_helper::AddSearchEngine(0, 0);
 
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 }
 
 // TCM ID - 8912240.
 IN_PROC_BROWSER_TEST_F(TwoClientSearchEnginesSyncTest, AddMultiple) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
   // Add a few entries.
-  for (int i = 0; i < 3; ++i) {
-    AddSearchEngine(0, i);
-  }
+  for (int i = 0; i < 3; ++i)
+    search_engines_helper::AddSearchEngine(0, i);
 
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 }
 
 // TCM ID - 9011135.
 IN_PROC_BROWSER_TEST_F(TwoClientSearchEnginesSyncTest, Duplicates) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
   // Add two entries with the same Name and URL (but different keywords).
   // Note that we have to change the GUID of the duplicate.
-  AddSearchEngine(0, 0);
-  GetServiceForProfile(0)->Add(CreateTestTemplateURL(0,
-      ASCIIToUTF16("somethingelse"), "newguid"));
-  GetVerifierService()->Add(CreateTestTemplateURL(0,
-      ASCIIToUTF16("somethingelse"), "newguid"));
+  search_engines_helper::AddSearchEngine(0, 0);
+  Profile* profile = sync_datatype_helper::test()->GetProfile(0);
+  TemplateURLServiceFactory::GetForProfile(profile)->Add(
+      search_engines_helper::CreateTestTemplateURL(profile, 0,
+          ASCIIToUTF16("somethingelse"), "newguid"));
+  search_engines_helper::GetVerifierService()->Add(
+      search_engines_helper::CreateTestTemplateURL(profile, 0,
+          ASCIIToUTF16("somethingelse"), "newguid"));
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 }
 
 // TCM ID - 9004201.
 IN_PROC_BROWSER_TEST_F(TwoClientSearchEnginesSyncTest, UpdateKeyword) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
-  AddSearchEngine(0, 0);
+  search_engines_helper::AddSearchEngine(0, 0);
 
   // Change the keyword.
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
-  EditSearchEngine(0, ASCIIToUTF16("test0"), ASCIIToUTF16("test0"),
-                   ASCIIToUTF16("newkeyword"), "http://www.test0.com/");
+  search_engines_helper::EditSearchEngine(0, ASCIIToUTF16("test0"),
+      ASCIIToUTF16("test0"), ASCIIToUTF16("newkeyword"),
+      "http://www.test0.com/");
 
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 }
 
 // TCM ID - 8894859.
 IN_PROC_BROWSER_TEST_F(TwoClientSearchEnginesSyncTest, UpdateUrl) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
-  AddSearchEngine(0, 0);
+  search_engines_helper::AddSearchEngine(0, 0);
 
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
   // Change the URL.
-  EditSearchEngine(0, ASCIIToUTF16("test0"), ASCIIToUTF16("test0"),
-                   ASCIIToUTF16("test0"), "http://www.wikipedia.org/q=%s");
+  search_engines_helper::EditSearchEngine(0, ASCIIToUTF16("test0"),
+      ASCIIToUTF16("test0"), ASCIIToUTF16("test0"),
+      "http://www.wikipedia.org/q=%s");
 
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 }
 
 // TCM ID - 8910490.
 IN_PROC_BROWSER_TEST_F(TwoClientSearchEnginesSyncTest, UpdateName) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
-  AddSearchEngine(0, 0);
+  search_engines_helper::AddSearchEngine(0, 0);
 
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
   // Change the short name.
-  EditSearchEngine(0, ASCIIToUTF16("test0"), ASCIIToUTF16("New Name"),
-                   ASCIIToUTF16("test0"), "http://www.test0.com/");
+  search_engines_helper::EditSearchEngine(0, ASCIIToUTF16("test0"),
+      ASCIIToUTF16("New Name"), ASCIIToUTF16("test0"), "http://www.test0.com/");
 
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 }
 
 // TCM ID - 8898660.
 IN_PROC_BROWSER_TEST_F(TwoClientSearchEnginesSyncTest, Delete) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
-  AddSearchEngine(0, 0);
+  search_engines_helper::AddSearchEngine(0, 0);
 
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
-  DeleteSearchEngineBySeed(0, 0);
+  search_engines_helper::DeleteSearchEngineBySeed(0, 0);
 
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 }
 
 // TCM ID - 9004196.
 IN_PROC_BROWSER_TEST_F(TwoClientSearchEnginesSyncTest, ConflictKeyword) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
   DisableVerifier();
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
   // Add a different search engine to each client, but make their keywords
   // conflict.
-  AddSearchEngine(0, 0);
-  AddSearchEngine(1, 1);
-  const TemplateURL* turl = GetServiceForProfile(1)->GetTemplateURLForKeyword(
-      ASCIIToUTF16("test1"));
+  search_engines_helper::AddSearchEngine(0, 0);
+  search_engines_helper::AddSearchEngine(1, 1);
+  TemplateURLService* service = search_engines_helper::GetServiceForProfile(1);
+  const TemplateURL* turl =
+      service->GetTemplateURLForKeyword(ASCIIToUTF16("test1"));
   EXPECT_TRUE(turl);
-  GetServiceForProfile(1)->ResetTemplateURL(turl, turl->short_name(),
-                                            ASCIIToUTF16("test0"), turl->url());
+  service->ResetTemplateURL(turl, turl->short_name(), ASCIIToUTF16("test0"),
+                            turl->url());
 
   ASSERT_TRUE(AwaitQuiescence());
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 }
 
 // TCM ID - 9004187.
 IN_PROC_BROWSER_TEST_F(TwoClientSearchEnginesSyncTest, MergeMultiple) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
   DisableVerifier();
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
   // Set up some different search engines on each client, with some interesting
   // conflicts.
   // client0: { SE0, SE1, SE2 }
-  for (int i = 0; i < 3; ++i) {
-    AddSearchEngine(0, i);
-  }
+  for (int i = 0; i < 3; ++i)
+    search_engines_helper::AddSearchEngine(0, i);
 
   // client1: { SE0, SE2, SE3, SE0 + different URL }
-  AddSearchEngine(1, 0);
-  AddSearchEngine(1, 2);
-  AddSearchEngine(1, 3);
-  GetServiceForProfile(1)->Add(CreateTestTemplateURL(0,
-      ASCIIToUTF16("somethingelse.com"), "http://www.somethingelse.com/",
-      "somethingelse"));
+  search_engines_helper::AddSearchEngine(1, 0);
+  search_engines_helper::AddSearchEngine(1, 2);
+  search_engines_helper::AddSearchEngine(1, 3);
+  Profile* profile = sync_datatype_helper::test()->GetProfile(1);
+  TemplateURLServiceFactory::GetForProfile(profile)->Add(
+      search_engines_helper::CreateTestTemplateURL(profile, 0,
+          ASCIIToUTF16("somethingelse.com"), "http://www.somethingelse.com/",
+          "somethingelse"));
 
   ASSERT_TRUE(AwaitQuiescence());
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 }
 
 // TCM ID - 8906436.
 IN_PROC_BROWSER_TEST_F(TwoClientSearchEnginesSyncTest, DisableSync) {
   ASSERT_TRUE(SetupSync());
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
   ASSERT_TRUE(GetClient(1)->DisableSyncForAllDatatypes());
-  AddSearchEngine(0, 0);
+  search_engines_helper::AddSearchEngine(0, 0);
   ASSERT_TRUE(
       GetClient(0)->AwaitFullSyncCompletion("Added a search engine."));
-  ASSERT_TRUE(ServiceMatchesVerifier(0));
-  ASSERT_FALSE(ServiceMatchesVerifier(1));
+  ASSERT_TRUE(search_engines_helper::ServiceMatchesVerifier(0));
+  ASSERT_FALSE(search_engines_helper::ServiceMatchesVerifier(1));
 
   ASSERT_TRUE(GetClient(1)->EnableSyncForAllDatatypes());
   ASSERT_TRUE(AwaitQuiescence());
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 }
 
 // TCM ID - 8891809.
 IN_PROC_BROWSER_TEST_F(TwoClientSearchEnginesSyncTest, SyncDefault) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
-  AddSearchEngine(0, 0);
+  search_engines_helper::AddSearchEngine(0, 0);
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
 
   // Change the default to the new search engine, sync, and ensure that it
   // changed in the second client. AllServicesMatch does a default search
   // provider check.
-  ChangeDefaultSearchProvider(0, 0);
+  search_engines_helper::ChangeDefaultSearchProvider(0, 0);
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
 
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 }
 
 // Ensure that we can change the search engine and immediately delete it
 // without putting the clients out of sync.
 IN_PROC_BROWSER_TEST_F(TwoClientSearchEnginesSyncTest, DeleteSyncedDefault) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
-  AddSearchEngine(0, 0);
-  AddSearchEngine(0, 1);
+  search_engines_helper::AddSearchEngine(0, 0);
+  search_engines_helper::AddSearchEngine(0, 1);
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
 
-  ChangeDefaultSearchProvider(0, 0);
+  search_engines_helper::ChangeDefaultSearchProvider(0, 0);
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 
   // Change the default on the first client and delete the old default.
-  ChangeDefaultSearchProvider(0, 1);
-  DeleteSearchEngineBySeed(0, 0);
+  search_engines_helper::ChangeDefaultSearchProvider(0, 1);
+  search_engines_helper::DeleteSearchEngineBySeed(0, 0);
   ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
 
-  ASSERT_TRUE(AllServicesMatch());
+  ASSERT_TRUE(search_engines_helper::AllServicesMatch());
 }
diff --git a/chrome/browser/tab_contents/render_view_context_menu.cc b/chrome/browser/tab_contents/render_view_context_menu.cc
index 71cc273..4251989 100644
--- a/chrome/browser/tab_contents/render_view_context_menu.cc
+++ b/chrome/browser/tab_contents/render_view_context_menu.cc
@@ -1843,7 +1843,7 @@
             TemplateURL::GenerateFaviconURL(params_.page_url.GetOrigin());
         // Takes ownership of the TemplateURL.
         tab_contents_wrapper->search_engine_tab_helper()->delegate()->
-            ConfirmAddSearchProvider(new TemplateURL(data), profile_);
+            ConfirmAddSearchProvider(new TemplateURL(profile_, data), profile_);
       }
       break;
     }
diff --git a/chrome/browser/ui/browser_init.cc b/chrome/browser/ui/browser_init.cc
index 7573efa9..f021a8d 100644
--- a/chrome/browser/ui/browser_init.cc
+++ b/chrome/browser/ui/browser_init.cc
@@ -1655,9 +1655,8 @@
         const TemplateURLRef& search_url = default_provider->url_ref();
         DCHECK(search_url.SupportsReplacement());
         string16 search_term = param.LossyDisplayName().substr(2);
-        urls.push_back(GURL(search_url.ReplaceSearchTermsUsingProfile(
-            profile, search_term, TemplateURLRef::NO_SUGGESTIONS_AVAILABLE,
-            string16())));
+        urls.push_back(GURL(search_url.ReplaceSearchTerms(search_term,
+            TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16())));
         continue;
       }
     }
diff --git a/chrome/browser/ui/cocoa/browser/edit_search_engine_cocoa_controller_unittest.mm b/chrome/browser/ui/cocoa/browser/edit_search_engine_cocoa_controller_unittest.mm
index 987679d..e05aace 100644
--- a/chrome/browser/ui/cocoa/browser/edit_search_engine_cocoa_controller_unittest.mm
+++ b/chrome/browser/ui/cocoa/browser/edit_search_engine_cocoa_controller_unittest.mm
@@ -212,7 +212,7 @@
   std::string urlString = TemplateURLRef::DisplayURLToURLRef(
       ASCIIToUTF16("http://foo-bar.com"));
   data.SetURL(urlString);
-  TemplateURL url(data);
+  TemplateURL url(profile(), data);
   FakeEditSearchEngineController *controller =
       [[FakeEditSearchEngineController alloc] initWithProfile:profile()
                                                      delegate:nil
diff --git a/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc b/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc
index a96634a..d184acd96 100644
--- a/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc
+++ b/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc
@@ -264,8 +264,9 @@
   }
 
   void SetupSearchEngine() {
+    Profile* profile = browser()->profile();
     TemplateURLService* model =
-        TemplateURLServiceFactory::GetForProfile(browser()->profile());
+        TemplateURLServiceFactory::GetForProfile(profile);
     ASSERT_TRUE(model);
 
     if (!model->loaded()) {
@@ -289,12 +290,12 @@
     data.short_name = ASCIIToUTF16(kSearchShortName);
     data.SetKeyword(ASCIIToUTF16(kSearchKeyword));
     data.SetURL(kSearchURL);
-    TemplateURL* template_url = new TemplateURL(data);
+    TemplateURL* template_url = new TemplateURL(profile, data);
     model->Add(template_url);
     model->SetDefaultSearchProvider(template_url);
 
     data.SetKeyword(ASCIIToUTF16(kSearchKeyword2));
-    model->Add(new TemplateURL(data));
+    model->Add(new TemplateURL(profile, data));
   }
 
   void AddHistoryEntry(const TestHistoryEntry& entry, const Time& time) {
@@ -939,15 +940,16 @@
     AutocompletePopupModel* popup_model = omnibox_view->model()->popup_model();
     ASSERT_TRUE(popup_model);
 
+    Profile* profile = browser()->profile();
     TemplateURLService* template_url_service =
-        TemplateURLServiceFactory::GetForProfile(browser()->profile());
+        TemplateURLServiceFactory::GetForProfile(profile);
 
     // Add a non-default substituting keyword.
     TemplateURLData data;
     data.short_name = ASCIIToUTF16("Search abc");
     data.SetKeyword(ASCIIToUTF16(kSearchText));
     data.SetURL("http://abc.com/{searchTerms}");
-    TemplateURL* template_url = new TemplateURL(data);
+    TemplateURL* template_url = new TemplateURL(profile, data);
     template_url_service->Add(template_url);
 
     omnibox_view->SetUserText(string16());
@@ -971,7 +973,7 @@
     template_url_service->Remove(template_url);
     data.short_name = ASCIIToUTF16("abc");
     data.SetURL("http://abc.com/");
-    template_url_service->Add(new TemplateURL(data));
+    template_url_service->Add(new TemplateURL(profile, data));
 
     // We always allow exact matches for non-substituting keywords.
     ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchTextKeys));
diff --git a/chrome/browser/ui/search_engines/edit_search_engine_controller.cc b/chrome/browser/ui/search_engines/edit_search_engine_controller.cc
index 1a825109..ad9ec91 100644
--- a/chrome/browser/ui/search_engines/edit_search_engine_controller.cc
+++ b/chrome/browser/ui/search_engines/edit_search_engine_controller.cc
@@ -43,7 +43,7 @@
   // TemplateURLRef::IsValid() when its owner is NULL.
   TemplateURLData data;
   data.SetURL(url);
-  TemplateURL t_url(data);
+  TemplateURL t_url(profile_, data);
   const TemplateURLRef& template_ref = t_url.url_ref();
   if (!template_ref.IsValid())
     return false;
@@ -132,7 +132,7 @@
   // we need to replace the search terms before testing for the scheme.
   TemplateURLData data;
   data.SetURL(url);
-  TemplateURL t_url(data);
+  TemplateURL t_url(profile_, data);
   std::string expanded_url(t_url.url_ref().ReplaceSearchTerms(ASCIIToUTF16("x"),
       TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, string16()));
   url_parse::Parsed parts;
diff --git a/chrome/browser/ui/search_engines/keyword_editor_controller_unittest.cc b/chrome/browser/ui/search_engines/keyword_editor_controller_unittest.cc
index 68ef24f..7373089 100644
--- a/chrome/browser/ui/search_engines/keyword_editor_controller_unittest.cc
+++ b/chrome/browser/ui/search_engines/keyword_editor_controller_unittest.cc
@@ -243,7 +243,7 @@
   TemplateURLData data;
   data.short_name = ASCIIToUTF16("b");
   data.SetKeyword(ASCIIToUTF16("a"));
-  TemplateURL* turl = new TemplateURL(data);
+  TemplateURL* turl = new TemplateURL(profile_.get(), data);
   model_->Add(turl);
 
   // Table model should have updated.
diff --git a/chrome/browser/ui/search_engines/search_engine_tab_helper.cc b/chrome/browser/ui/search_engines/search_engine_tab_helper.cc
index 3065749..b10bfacc 100644
--- a/chrome/browser/ui/search_engines/search_engine_tab_helper.cc
+++ b/chrome/browser/ui/search_engines/search_engine_tab_helper.cc
@@ -187,5 +187,5 @@
       current_favicon : TemplateURL::GenerateFaviconURL(params.referrer.url);
   data.safe_for_autoreplace = true;
   data.input_encodings.push_back(params.searchable_form_encoding);
-  url_service->Add(new TemplateURL(data));
+  url_service->Add(new TemplateURL(profile, data));
 }
diff --git a/chrome/browser/ui/search_engines/template_url_table_model.cc b/chrome/browser/ui/search_engines/template_url_table_model.cc
index 3c7a0e76..256a9c1 100644
--- a/chrome/browser/ui/search_engines/template_url_table_model.cc
+++ b/chrome/browser/ui/search_engines/template_url_table_model.cc
@@ -259,7 +259,7 @@
   data.short_name = short_name;
   data.SetKeyword(keyword);
   data.SetURL(url);
-  TemplateURL* turl = new TemplateURL(data);
+  TemplateURL* turl = new TemplateURL(template_url_service_->profile(), data);
   template_url_service_->Add(turl);
   ModelEntry* entry = new ModelEntry(this, turl);
   template_url_service_->AddObserver(this);
diff --git a/chrome/browser/webdata/keyword_table_unittest.cc b/chrome/browser/webdata/keyword_table_unittest.cc
index 6d49701..5af4343 100644
--- a/chrome/browser/webdata/keyword_table_unittest.cc
+++ b/chrome/browser/webdata/keyword_table_unittest.cc
@@ -69,7 +69,7 @@
   keyword.created_by_policy = true;
   keyword.usage_count = 32;
   keyword.prepopulate_id = 10;
-  TemplateURL url(keyword);
+  TemplateURL url(NULL, keyword);
   EXPECT_TRUE(keyword_table->AddKeyword(url));
 
   KeywordTable::Keywords keywords;
@@ -78,7 +78,7 @@
   const TemplateURLData& restored_keyword = keywords.front();
 
   EXPECT_EQ(keyword.short_name, restored_keyword.short_name);
-  EXPECT_EQ(url.keyword(), TemplateURL(restored_keyword).keyword());
+  EXPECT_EQ(url.keyword(), TemplateURL(NULL, restored_keyword).keyword());
   EXPECT_EQ(keyword.autogenerate_keyword(),
             restored_keyword.autogenerate_keyword());
   EXPECT_EQ(keyword.url(), restored_keyword.url());
@@ -133,7 +133,7 @@
   keyword.created_by_policy = true;
   keyword.usage_count = 32;
   keyword.prepopulate_id = 10;
-  TemplateURL url(keyword);
+  TemplateURL url(NULL, keyword);
   EXPECT_TRUE(keyword_table->AddKeyword(url));
 
   EXPECT_TRUE(keyword_table->SetDefaultSearchProviderID(10));
@@ -160,7 +160,7 @@
   keyword.show_in_default_list = true;
   keyword.safe_for_autoreplace = true;
   keyword.id = 1;
-  TemplateURL url(keyword);
+  TemplateURL url(NULL, keyword);
   EXPECT_TRUE(keyword_table->AddKeyword(url));
 
   EXPECT_TRUE(keyword_table->SetDefaultSearchProviderID(1));
@@ -172,7 +172,7 @@
   // Backup URL should have an invalid ID.
   EXPECT_EQ(kInvalidTemplateURLID, backup.id);
   EXPECT_EQ(keyword.short_name, backup.short_name);
-  EXPECT_EQ(url.keyword(), TemplateURL(backup).keyword());
+  EXPECT_EQ(url.keyword(), TemplateURL(NULL, backup).keyword());
   EXPECT_EQ(keyword.url(), backup.url());
   EXPECT_EQ(keyword.favicon_url, backup.favicon_url);
   EXPECT_EQ(keyword.suggestions_url, backup.suggestions_url);
@@ -189,7 +189,7 @@
   EXPECT_TRUE(keyword_table->GetDefaultSearchProviderBackup(&backup));
   EXPECT_EQ(kInvalidTemplateURLID, backup.id);
   EXPECT_EQ(keyword.short_name, backup.short_name);
-  EXPECT_EQ(url.keyword(), TemplateURL(backup).keyword());
+  EXPECT_EQ(url.keyword(), TemplateURL(NULL, backup).keyword());
   EXPECT_EQ(keyword.url(), backup.url());
   EXPECT_EQ(keyword.favicon_url, backup.favicon_url);
   EXPECT_EQ(keyword.suggestions_url, backup.suggestions_url);
@@ -228,7 +228,7 @@
   EXPECT_TRUE(keyword_table->GetDefaultSearchProviderBackup(&backup));
   EXPECT_EQ(kInvalidTemplateURLID, backup.id);
   EXPECT_EQ(keyword.short_name, backup.short_name);
-  EXPECT_EQ(url.keyword(), TemplateURL(backup).keyword());
+  EXPECT_EQ(url.keyword(), TemplateURL(NULL, backup).keyword());
   EXPECT_EQ(keyword.url(), backup.url());
   EXPECT_EQ(keyword.suggestions_url, backup.suggestions_url);
   EXPECT_EQ(keyword.favicon_url, backup.favicon_url);
@@ -263,7 +263,7 @@
   keyword.date_created = base::Time::UnixEpoch();
   keyword.last_modified = base::Time::UnixEpoch();
   keyword.sync_guid = "1234-5678-90AB-CDEF";
-  TemplateURL url(keyword);
+  TemplateURL url(NULL, keyword);
   EXPECT_TRUE(keyword_table->AddKeyword(url));
 
   keyword.SetAutogenerateKeyword(true);
@@ -273,7 +273,7 @@
   keyword.id = 2;
   keyword.prepopulate_id = 5;
   keyword.sync_guid = "FEDC-BA09-8765-4321";
-  TemplateURL url2(keyword);
+  TemplateURL url2(NULL, keyword);
   EXPECT_TRUE(keyword_table->AddKeyword(url2));
 
   const char kTestContents[] = "1short_namekeywordhttp://favicon.url/"
@@ -306,7 +306,7 @@
   keyword.date_created = base::Time::UnixEpoch();
   keyword.last_modified = base::Time::UnixEpoch();
   keyword.sync_guid = "1234-5678-90AB-CDEF";
-  TemplateURL url(keyword);
+  TemplateURL url(NULL, keyword);
   EXPECT_TRUE(keyword_table->AddKeyword(url));
 
   keyword.SetAutogenerateKeyword(true);
@@ -316,7 +316,7 @@
   keyword.id = 1;
   keyword.prepopulate_id = 5;
   keyword.sync_guid = "FEDC-BA09-8765-4321";
-  TemplateURL url2(keyword);
+  TemplateURL url2(NULL, keyword);
   EXPECT_TRUE(keyword_table->AddKeyword(url2));
 
   const char kTestContents[] = "1short_nameurlhttp://favicon.url/http://url/1"
@@ -346,7 +346,7 @@
   keyword.show_in_default_list = true;
   keyword.safe_for_autoreplace = true;
   keyword.id = 1;
-  TemplateURL url(keyword);
+  TemplateURL url(NULL, keyword);
   EXPECT_TRUE(keyword_table->AddKeyword(url));
 
   keyword.originating_url = GURL("http://originating.url/");
@@ -354,7 +354,7 @@
   keyword.instant_url = "http://instant2/";
   keyword.input_encodings.push_back("Shift_JIS");
   keyword.prepopulate_id = 5;
-  TemplateURL url2(keyword);
+  TemplateURL url2(NULL, keyword);
   EXPECT_TRUE(keyword_table->UpdateKeyword(url2));
 
   KeywordTable::Keywords keywords;
@@ -363,7 +363,7 @@
   const TemplateURLData& restored_keyword = keywords.front();
 
   EXPECT_EQ(keyword.short_name, restored_keyword.short_name);
-  EXPECT_EQ(url2.keyword(), TemplateURL(restored_keyword).keyword());
+  EXPECT_EQ(url2.keyword(), TemplateURL(NULL, restored_keyword).keyword());
   EXPECT_EQ(keyword.autogenerate_keyword(),
             restored_keyword.autogenerate_keyword());
   EXPECT_EQ(keyword.suggestions_url, restored_keyword.suggestions_url);
@@ -390,7 +390,7 @@
   keyword.SetURL("http://url/");
   keyword.safe_for_autoreplace = true;
   keyword.id = -100;
-  TemplateURL url(keyword);
+  TemplateURL url(NULL, keyword);
   EXPECT_TRUE(keyword_table->AddKeyword(url));
 
   KeywordTable::Keywords keywords;
@@ -399,7 +399,7 @@
   const TemplateURLData& restored_keyword = keywords.front();
 
   EXPECT_EQ(keyword.short_name, restored_keyword.short_name);
-  EXPECT_EQ(url.keyword(), TemplateURL(restored_keyword).keyword());
+  EXPECT_EQ(url.keyword(), TemplateURL(NULL, restored_keyword).keyword());
   EXPECT_EQ(keyword.favicon_url, restored_keyword.favicon_url);
   EXPECT_EQ(keyword.safe_for_autoreplace,
             restored_keyword.safe_for_autoreplace);
@@ -416,13 +416,13 @@
   keyword.SetKeyword(ASCIIToUTF16("legit"));
   keyword.SetURL("http://url/");
   keyword.id = 1000;
-  TemplateURL url(keyword);
+  TemplateURL url(NULL, keyword);
   EXPECT_TRUE(keyword_table->AddKeyword(url));
 
   keyword.short_name = ASCIIToUTF16("bogus");
   keyword.SetKeyword(ASCIIToUTF16("bogus"));
   keyword.id = 2000;
-  TemplateURL url2(keyword);
+  TemplateURL url2(NULL, keyword);
   EXPECT_TRUE(keyword_table->AddKeyword(url2));
 
   KeywordTable::Keywords keywords;