summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorbeaudoin@chromium.org <beaudoin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-03 21:22:43 +0000
committerbeaudoin@chromium.org <beaudoin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-03 21:22:43 +0000
commit008987b027bb94fcffec30e2680d712a7eaf9912 (patch)
tree11991e5b517d991c537add773fa32fab316caf58 /chrome/browser
parent7f25632befd598b0fa96088c03d16ed604724819 (diff)
downloadchromium_src-008987b027bb94fcffec30e2680d712a7eaf9912.zip
chromium_src-008987b027bb94fcffec30e2680d712a7eaf9912.tar.gz
chromium_src-008987b027bb94fcffec30e2680d712a7eaf9912.tar.bz2
Add search_terms_replacement_key field to TemplateURL.
This CL is the first step in removing the hardcoded "espv" parameter used by instant-extended to detect when to perform search term replacement in the omnibox. The search_terms_replacement_key has beed added to prepopulated_engines, TemplateURL, policy, web_database, prefs, and sync. BUG=161602 Review URL: https://chromiumcodereview.appspot.com/11552020 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@175014 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/policy/configuration_policy_handler.cc7
-rw-r--r--chrome/browser/policy/configuration_policy_pref_store_unittest.cc20
-rw-r--r--chrome/browser/policy/policy_browsertest.cc10
-rw-r--r--chrome/browser/search_engines/prepopulated_engines.json3
-rw-r--r--chrome/browser/search_engines/prepopulated_engines_schema.json12
-rw-r--r--chrome/browser/search_engines/template_url.cc4
-rw-r--r--chrome/browser/search_engines/template_url.h8
-rw-r--r--chrome/browser/search_engines/template_url_prepopulate_data.cc46
-rw-r--r--chrome/browser/search_engines/template_url_prepopulate_data_unittest.cc4
-rw-r--r--chrome/browser/search_engines/template_url_service.cc18
-rw-r--r--chrome/browser/search_engines/template_url_service_factory.cc4
-rw-r--r--chrome/browser/webdata/keyword_table.cc29
-rw-r--r--chrome/browser/webdata/keyword_table.h5
-rw-r--r--chrome/browser/webdata/keyword_table_unittest.cc8
-rw-r--r--chrome/browser/webdata/web_database.cc10
-rw-r--r--chrome/browser/webdata/web_database_migration_unittest.cc45
16 files changed, 198 insertions, 35 deletions
diff --git a/chrome/browser/policy/configuration_policy_handler.cc b/chrome/browser/policy/configuration_policy_handler.cc
index 68536d3..5587cae 100644
--- a/chrome/browser/policy/configuration_policy_handler.cc
+++ b/chrome/browser/policy/configuration_policy_handler.cc
@@ -92,6 +92,9 @@ const DefaultSearchSimplePolicyHandlerEntry kDefaultSearchPolicyMap[] = {
{ key::kDefaultSearchProviderAlternateURLs,
prefs::kDefaultSearchProviderAlternateURLs,
Value::TYPE_LIST },
+ { key::kDefaultSearchProviderSearchTermsReplacementKey,
+ prefs::kDefaultSearchProviderSearchTermsReplacementKey,
+ Value::TYPE_STRING },
};
// List of entries determining which proxy policies can be specified, depending
@@ -825,6 +828,8 @@ void DefaultSearchPolicyHandler::ApplyPolicySettings(const PolicyMap& policies,
prefs->SetString(prefs::kDefaultSearchProviderInstantURL, std::string());
prefs->SetValue(prefs::kDefaultSearchProviderAlternateURLs,
new ListValue());
+ prefs->SetString(prefs::kDefaultSearchProviderSearchTermsReplacementKey,
+ std::string());
} else {
// The search URL is required. The other entries are optional. Just make
// sure that they are all specified via policy, so that the regular prefs
@@ -842,6 +847,8 @@ void DefaultSearchPolicyHandler::ApplyPolicySettings(const PolicyMap& policies,
EnsureStringPrefExists(prefs, prefs::kDefaultSearchProviderKeyword);
EnsureStringPrefExists(prefs, prefs::kDefaultSearchProviderInstantURL);
EnsureListPrefExists(prefs, prefs::kDefaultSearchProviderAlternateURLs);
+ EnsureStringPrefExists(prefs,
+ prefs::kDefaultSearchProviderSearchTermsReplacementKey);
// For the name and keyword, default to the host if not specified. If
// there is no host (file: URLs? Not sure), use "_" to guarantee that the
diff --git a/chrome/browser/policy/configuration_policy_pref_store_unittest.cc b/chrome/browser/policy/configuration_policy_pref_store_unittest.cc
index ccd9a05..0600465 100644
--- a/chrome/browser/policy/configuration_policy_pref_store_unittest.cc
+++ b/chrome/browser/policy/configuration_policy_pref_store_unittest.cc
@@ -567,6 +567,7 @@ class ConfigurationPolicyPrefStoreDefaultSearchTest
static const char* const kIconURL;
static const char* const kName;
static const char* const kKeyword;
+ static const char* const kReplacementKey;
// Build a default search policy by setting search-related keys in |policy| to
// reasonable values. You can update any of the keys after calling this
@@ -586,6 +587,8 @@ const char* const ConfigurationPolicyPrefStoreDefaultSearchTest::kName =
"MyName";
const char* const ConfigurationPolicyPrefStoreDefaultSearchTest::kKeyword =
"MyKeyword";
+const char* const
+ ConfigurationPolicyPrefStoreDefaultSearchTest::kReplacementKey = "espv";
void ConfigurationPolicyPrefStoreDefaultSearchTest::
BuildDefaultSearchPolicy(PolicyMap* policy) {
@@ -608,6 +611,9 @@ void ConfigurationPolicyPrefStoreDefaultSearchTest::
POLICY_SCOPE_USER, encodings);
policy->Set(key::kDefaultSearchProviderAlternateURLs, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, default_alternate_urls_.DeepCopy());
+ policy->Set(key::kDefaultSearchProviderSearchTermsReplacementKey,
+ POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
+ base::Value::CreateStringValue(kReplacementKey));
}
// Checks that if the policy for default search is valid, i.e. there's a
@@ -647,6 +653,11 @@ TEST_F(ConfigurationPolicyPrefStoreDefaultSearchTest, MinimallyDefined) {
EXPECT_TRUE(store_->GetValue(prefs::kDefaultSearchProviderAlternateURLs,
&value));
EXPECT_TRUE(base::ListValue().Equals(value));
+
+ EXPECT_TRUE(
+ store_->GetValue(prefs::kDefaultSearchProviderSearchTermsReplacementKey,
+ &value));
+ EXPECT_TRUE(base::StringValue(std::string()).Equals(value));
}
// Checks that for a fully defined search policy, all elements have been
@@ -679,6 +690,11 @@ TEST_F(ConfigurationPolicyPrefStoreDefaultSearchTest, FullyDefined) {
EXPECT_TRUE(store_->GetValue(
prefs::kDefaultSearchProviderAlternateURLs, &value));
EXPECT_TRUE(default_alternate_urls_.Equals(value));
+
+ EXPECT_TRUE(
+ store_->GetValue(prefs::kDefaultSearchProviderSearchTermsReplacementKey,
+ &value));
+ EXPECT_TRUE(base::StringValue(kReplacementKey).Equals(value));
}
// Checks that if the default search policy is missing, that no elements of the
@@ -697,6 +713,8 @@ TEST_F(ConfigurationPolicyPrefStoreDefaultSearchTest, MissingUrl) {
EXPECT_FALSE(store_->GetValue(prefs::kDefaultSearchProviderEncodings, NULL));
EXPECT_FALSE(store_->GetValue(prefs::kDefaultSearchProviderAlternateURLs,
NULL));
+ EXPECT_FALSE(store_->GetValue(
+ prefs::kDefaultSearchProviderSearchTermsReplacementKey, NULL));
}
// Checks that if the default search policy is invalid, that no elements of the
@@ -718,6 +736,8 @@ TEST_F(ConfigurationPolicyPrefStoreDefaultSearchTest, Invalid) {
EXPECT_FALSE(store_->GetValue(prefs::kDefaultSearchProviderEncodings, NULL));
EXPECT_FALSE(store_->GetValue(prefs::kDefaultSearchProviderAlternateURLs,
NULL));
+ EXPECT_FALSE(store_->GetValue(
+ prefs::kDefaultSearchProviderSearchTermsReplacementKey, NULL));
}
// Checks that if the default search policy is invalid, that no elements of the
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
index 86cbac3..1bec8bd 100644
--- a/chrome/browser/policy/policy_browsertest.cc
+++ b/chrome/browser/policy/policy_browsertest.cc
@@ -659,6 +659,7 @@ IN_PROC_BROWSER_TEST_F(PolicyTest, DefaultSearchProvider) {
const std::string kAlternateURL0(
"http://search.example/search#q={searchTerms}");
const std::string kAlternateURL1("http://search.example/#q={searchTerms}");
+ const std::string kSearchTermsReplacementKey("zekey");
TemplateURLService* service = TemplateURLServiceFactory::GetForProfile(
browser()->profile());
@@ -670,7 +671,9 @@ IN_PROC_BROWSER_TEST_F(PolicyTest, DefaultSearchProvider) {
EXPECT_FALSE(
default_search->alternate_urls().size() == 2 &&
default_search->alternate_urls()[0] == kAlternateURL0 &&
- default_search->alternate_urls()[1] == kAlternateURL1);
+ default_search->alternate_urls()[1] == kAlternateURL1 &&
+ default_search->search_terms_replacement_key() ==
+ kSearchTermsReplacementKey);
// Override the default search provider using policies.
PolicyMap policies;
@@ -685,6 +688,9 @@ IN_PROC_BROWSER_TEST_F(PolicyTest, DefaultSearchProvider) {
alternate_urls->AppendString(kAlternateURL1);
policies.Set(key::kDefaultSearchProviderAlternateURLs, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, alternate_urls);
+ policies.Set(key::kDefaultSearchProviderSearchTermsReplacementKey,
+ POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
+ base::Value::CreateStringValue(kSearchTermsReplacementKey));
provider_.UpdateChromePolicy(policies);
default_search = service->GetDefaultSearchProvider();
ASSERT_TRUE(default_search);
@@ -693,6 +699,8 @@ IN_PROC_BROWSER_TEST_F(PolicyTest, DefaultSearchProvider) {
EXPECT_EQ(2U, default_search->alternate_urls().size());
EXPECT_EQ(kAlternateURL0, default_search->alternate_urls()[0]);
EXPECT_EQ(kAlternateURL1, default_search->alternate_urls()[1]);
+ EXPECT_EQ(kSearchTermsReplacementKey,
+ default_search->search_terms_replacement_key());
// Verify that searching from the omnibox uses kSearchURL.
chrome::FocusLocationBar(browser());
diff --git a/chrome/browser/search_engines/prepopulated_engines.json b/chrome/browser/search_engines/prepopulated_engines.json
index 232f571..15a9862 100644
--- a/chrome/browser/search_engines/prepopulated_engines.json
+++ b/chrome/browser/search_engines/prepopulated_engines.json
@@ -26,7 +26,7 @@
// Increment this if you change the data in ways that mean users with
// existing data should get a new version.
- "kCurrentDataVersion": 49
+ "kCurrentDataVersion": 50
},
// The following engines are included in country lists and are added to the
@@ -855,6 +855,7 @@
"{google:baseURL}search#q={searchTerms}",
"{google:baseURL}webhp#q={searchTerms}"
],
+ "search_terms_replacement_key": "{google:instantExtendedEnabledKey}",
"type": "SEARCH_ENGINE_GOOGLE",
"id": 1
},
diff --git a/chrome/browser/search_engines/prepopulated_engines_schema.json b/chrome/browser/search_engines/prepopulated_engines_schema.json
index 0838e22..ae0f1ad 100644
--- a/chrome/browser/search_engines/prepopulated_engines_schema.json
+++ b/chrome/browser/search_engines/prepopulated_engines_schema.json
@@ -23,9 +23,9 @@
"optional": true
},
// If omitted, this engine does not support suggestions.
- { "field": "suggest_url", "type": "string", "optional": true },
+ { "field": "suggest_url", "type": "string", "optional": true },
// If omitted, this engine does not support instant.
- { "field": "instant_url", "type": "string", "optional": true },
+ { "field": "instant_url", "type": "string", "optional": true },
// A list of URL patterns that can be used, in addition to |search_url|,
// to extract search terms from a URL.
{
@@ -34,6 +34,14 @@
"contents": { "type": "string" },
"optional": true
},
+ // A parameter that, if present in the query or ref parameters of a
+ // search_url or instant_url, causes Chrome to replace the URL with the
+ // search term.
+ {
+ "field": "search_terms_replacement_key",
+ "type": "string",
+ "optional": true
+ },
{
"field": "type",
"type": "enum",
diff --git a/chrome/browser/search_engines/template_url.cc b/chrome/browser/search_engines/template_url.cc
index 43c8c38..9944621 100644
--- a/chrome/browser/search_engines/template_url.cc
+++ b/chrome/browser/search_engines/template_url.cc
@@ -58,6 +58,8 @@ const char kGoogleCursorPositionParameter[] = "google:cursorPosition";
const char kGoogleInstantEnabledParameter[] = "google:instantEnabledParameter";
const char kGoogleInstantExtendedEnabledParameter[] =
"google:instantExtendedEnabledParameter";
+const char kGoogleInstantExtendedEnabledKey[] =
+ "google:instantExtendedEnabledKey";
const char kGoogleOriginalQueryForSuggestionParameter[] =
"google:originalQueryForSuggestion";
const char kGoogleRLZParameter[] = "google:RLZ";
@@ -571,6 +573,8 @@ bool TemplateURLRef::ParseParameter(size_t start,
} else if (parameter == kGoogleInstantExtendedEnabledParameter) {
replacements->push_back(Replacement(GOOGLE_INSTANT_EXTENDED_ENABLED,
start));
+ } else if (parameter == kGoogleInstantExtendedEnabledKey) {
+ url->insert(start, google_util::kInstantExtendedAPIParam);
} else if (parameter == kGoogleOriginalQueryForSuggestionParameter) {
replacements->push_back(Replacement(GOOGLE_ORIGINAL_QUERY_FOR_SUGGESTION,
start));
diff --git a/chrome/browser/search_engines/template_url.h b/chrome/browser/search_engines/template_url.h
index 6fba137..b5a3576 100644
--- a/chrome/browser/search_engines/template_url.h
+++ b/chrome/browser/search_engines/template_url.h
@@ -352,6 +352,10 @@ struct TemplateURLData {
// search terms from a URL.
std::vector<std::string> alternate_urls;
+ // A parameter that, if present in the query or ref parameters of a search_url
+ // or instant_url, causes Chrome to replace the URL with the search term.
+ std::string search_terms_replacement_key;
+
private:
// Private so we can enforce using the setters and thus enforce that these
// fields are never empty.
@@ -427,6 +431,10 @@ class TemplateURL {
const std::string& sync_guid() const { return data_.sync_guid; }
+ const std::string& search_terms_replacement_key() const {
+ return data_.search_terms_replacement_key;
+ }
+
const TemplateURLRef& url_ref() const { return url_ref_; }
const TemplateURLRef& suggestions_url_ref() const {
return suggestions_url_ref_;
diff --git a/chrome/browser/search_engines/template_url_prepopulate_data.cc b/chrome/browser/search_engines/template_url_prepopulate_data.cc
index fa0fc4f4..b2a857b 100644
--- a/chrome/browser/search_engines/template_url_prepopulate_data.cc
+++ b/chrome/browser/search_engines/template_url_prepopulate_data.cc
@@ -1110,16 +1110,18 @@ int GetDataVersion(PrefService* prefs) {
kCurrentDataVersion;
}
-TemplateURL* MakePrepopulatedTemplateURL(Profile* profile,
- const string16& name,
- const string16& keyword,
- const base::StringPiece& search_url,
- const base::StringPiece& suggest_url,
- const base::StringPiece& instant_url,
- const ListValue& alternate_urls,
- const base::StringPiece& favicon_url,
- const base::StringPiece& encoding,
- int id) {
+TemplateURL* MakePrepopulatedTemplateURL(
+ Profile* profile,
+ const string16& name,
+ const string16& keyword,
+ const base::StringPiece& search_url,
+ const base::StringPiece& suggest_url,
+ const base::StringPiece& instant_url,
+ const base::StringPiece& favicon_url,
+ const base::StringPiece& encoding,
+ const ListValue& alternate_urls,
+ const base::StringPiece& search_terms_replacement_key,
+ int id) {
TemplateURLData data;
@@ -1128,12 +1130,6 @@ TemplateURL* MakePrepopulatedTemplateURL(Profile* profile,
data.SetURL(search_url.as_string());
data.suggestions_url = suggest_url.as_string();
data.instant_url = instant_url.as_string();
- for (size_t i = 0; i < alternate_urls.GetSize(); ++i) {
- std::string alternate_url;
- alternate_urls.GetString(i, &alternate_url);
- DCHECK(!alternate_url.empty());
- data.alternate_urls.push_back(alternate_url);
- }
data.favicon_url = GURL(favicon_url.as_string());
data.show_in_default_list = true;
data.safe_for_autoreplace = true;
@@ -1141,6 +1137,13 @@ TemplateURL* MakePrepopulatedTemplateURL(Profile* profile,
data.date_created = base::Time();
data.last_modified = base::Time();
data.prepopulate_id = id;
+ for (size_t i = 0; i < alternate_urls.GetSize(); ++i) {
+ std::string alternate_url;
+ alternate_urls.GetString(i, &alternate_url);
+ DCHECK(!alternate_url.empty());
+ data.alternate_urls.push_back(alternate_url);
+ }
+ data.search_terms_replacement_key = search_terms_replacement_key.as_string();
return new TemplateURL(profile, data);
}
@@ -1177,12 +1180,15 @@ void GetPrepopulatedTemplateFromPrefs(Profile* profile,
std::string instant_url;
ListValue empty_list;
const ListValue* alternate_urls = &empty_list;
+ std::string search_terms_replacement_key;
engine->GetString("suggest_url", &suggest_url);
engine->GetString("instant_url", &instant_url);
engine->GetList("alternate_urls", &alternate_urls);
+ engine->GetString("search_terms_replacement_key",
+ &search_terms_replacement_key);
t_urls->push_back(MakePrepopulatedTemplateURL(profile, name, keyword,
- search_url, suggest_url, instant_url, *alternate_urls, favicon_url,
- encoding, id));
+ search_url, suggest_url, instant_url, favicon_url, encoding,
+ *alternate_urls, search_terms_replacement_key, id));
}
}
}
@@ -1200,8 +1206,8 @@ TemplateURL* MakePrepopulatedTemplateURLFromPrepopulateEngine(
return MakePrepopulatedTemplateURL(profile, WideToUTF16(engine.name),
WideToUTF16(engine.keyword), engine.search_url, engine.suggest_url,
- engine.instant_url, alternate_urls,
- engine.favicon_url, engine.encoding, engine.id);
+ engine.instant_url, engine.favicon_url, engine.encoding, alternate_urls,
+ engine.search_terms_replacement_key, engine.id);
}
void GetPrepopulatedEngines(Profile* profile,
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 a8b765c..b53013f 100644
--- a/chrome/browser/search_engines/template_url_prepopulate_data_unittest.cc
+++ b/chrome/browser/search_engines/template_url_prepopulate_data_unittest.cc
@@ -128,6 +128,7 @@ TEST(TemplateURLPrepopulateDataTest, ProvidersFromPrefs) {
EXPECT_TRUE(t_urls[0]->suggestions_url().empty());
EXPECT_TRUE(t_urls[0]->instant_url().empty());
EXPECT_EQ(0u, t_urls[0]->alternate_urls().size());
+ EXPECT_TRUE(t_urls[0]->search_terms_replacement_key().empty());
// Test the optional settings too.
entry->SetString("suggest_url", "http://foo.com/suggest?q={searchTerms}");
@@ -135,6 +136,7 @@ TEST(TemplateURLPrepopulateDataTest, ProvidersFromPrefs) {
ListValue* alternate_urls = new ListValue;
alternate_urls->AppendString("http://foo.com/alternate?q={searchTerms}");
entry->Set("alternate_urls", alternate_urls);
+ entry->SetString("search_terms_replacement_key", "espv");
overrides = new ListValue;
overrides->Append(entry->DeepCopy());
prefs->SetUserPref(prefs::kSearchProviderOverrides, overrides);
@@ -156,6 +158,7 @@ TEST(TemplateURLPrepopulateDataTest, ProvidersFromPrefs) {
ASSERT_EQ(1u, t_urls[0]->alternate_urls().size());
EXPECT_EQ("http://foo.com/alternate?q={searchTerms}",
t_urls[0]->alternate_urls()[0]);
+ EXPECT_EQ("espv", t_urls[0]->search_terms_replacement_key());
// Test that subsequent providers are loaded even if an intermediate
// provider has an incomplete configuration.
@@ -212,6 +215,7 @@ TEST(TemplateURLPrepopulateDataTest, ProvidersFromPrepopulated) {
EXPECT_FALSE(t_urls[default_index]->alternate_urls()[i].empty());
EXPECT_EQ(SEARCH_ENGINE_GOOGLE,
TemplateURLPrepopulateData::GetEngineType(t_urls[default_index]->url()));
+ EXPECT_FALSE(t_urls[default_index]->search_terms_replacement_key().empty());
}
TEST(TemplateURLPrepopulateDataTest, GetEngineTypeBasic) {
diff --git a/chrome/browser/search_engines/template_url_service.cc b/chrome/browser/search_engines/template_url_service.cc
index 9730a09..576bc50 100644
--- a/chrome/browser/search_engines/template_url_service.cc
+++ b/chrome/browser/search_engines/template_url_service.cc
@@ -80,7 +80,9 @@ bool TemplateURLsHaveSamePrefs(const TemplateURL* url1,
(url1->safe_for_autoreplace() == url2->safe_for_autoreplace()) &&
(url1->show_in_default_list() == url2->show_in_default_list()) &&
(url1->input_encodings() == url2->input_encodings()) &&
- (url1->alternate_urls() == url2->alternate_urls());
+ (url1->alternate_urls() == url2->alternate_urls()) &&
+ (url1->search_terms_replacement_key() ==
+ url2->search_terms_replacement_key());
}
const char kFirstPotentialEngineHistogramName[] =
@@ -1246,10 +1248,12 @@ syncer::SyncData TemplateURLService::CreateSyncDataFromTemplateURL(
se_specifics->set_sync_guid(turl.sync_guid());
for (size_t i = 0; i < turl.alternate_urls().size(); ++i)
se_specifics->add_alternate_urls(turl.alternate_urls()[i]);
+ se_specifics->set_search_terms_replacement_key(
+ turl.search_terms_replacement_key());
return syncer::SyncData::CreateLocalData(se_specifics->sync_guid(),
- se_specifics->keyword(),
- specifics);
+ se_specifics->keyword(),
+ specifics);
}
// static
@@ -1309,6 +1313,7 @@ TemplateURL* TemplateURLService::CreateTemplateURLFromTemplateURLAndSyncData(
data.alternate_urls.clear();
for (int i = 0; i < specifics.alternate_urls_size(); ++i)
data.alternate_urls.push_back(specifics.alternate_urls(i));
+ data.search_terms_replacement_key = specifics.search_terms_replacement_key();
TemplateURL* turl = new TemplateURL(profile, data);
DCHECK(!turl->IsExtensionKeyword());
@@ -1572,6 +1577,7 @@ void TemplateURLService::SaveDefaultSearchProviderToPrefs(
std::string id_string;
std::string prepopulate_id;
ListValue alternate_urls;
+ std::string search_terms_replacement_key;
if (t_url) {
DCHECK(!t_url->IsExtensionKeyword());
enabled = true;
@@ -1588,6 +1594,7 @@ void TemplateURLService::SaveDefaultSearchProviderToPrefs(
prepopulate_id = base::Int64ToString(t_url->prepopulate_id());
for (size_t i = 0; i < t_url->alternate_urls().size(); ++i)
alternate_urls.AppendString(t_url->alternate_urls()[i]);
+ search_terms_replacement_key = t_url->search_terms_replacement_key();
}
prefs->SetBoolean(prefs::kDefaultSearchProviderEnabled, enabled);
prefs->SetString(prefs::kDefaultSearchProviderSearchURL, search_url);
@@ -1600,6 +1607,8 @@ void TemplateURLService::SaveDefaultSearchProviderToPrefs(
prefs->SetString(prefs::kDefaultSearchProviderID, id_string);
prefs->SetString(prefs::kDefaultSearchProviderPrepopulateID, prepopulate_id);
prefs->Set(prefs::kDefaultSearchProviderAlternateURLs, alternate_urls);
+ prefs->SetString(prefs::kDefaultSearchProviderSearchTermsReplacementKey,
+ search_terms_replacement_key);
}
bool TemplateURLService::LoadDefaultSearchProviderFromPrefs(
@@ -1650,6 +1659,8 @@ bool TemplateURLService::LoadDefaultSearchProviderFromPrefs(
prefs->GetString(prefs::kDefaultSearchProviderPrepopulateID);
const ListValue* alternate_urls =
prefs->GetList(prefs::kDefaultSearchProviderAlternateURLs);
+ std::string search_terms_replacement_key = prefs->GetString(
+ prefs::kDefaultSearchProviderSearchTermsReplacementKey);
TemplateURLData data;
data.short_name = name;
@@ -1665,6 +1676,7 @@ bool TemplateURLService::LoadDefaultSearchProviderFromPrefs(
if (alternate_urls->GetString(i, &alternate_url))
data.alternate_urls.push_back(alternate_url);
}
+ data.search_terms_replacement_key = search_terms_replacement_key;
base::SplitString(encodings, ';', &data.input_encodings);
if (!id_string.empty() && !*is_managed) {
int64 value;
diff --git a/chrome/browser/search_engines/template_url_service_factory.cc b/chrome/browser/search_engines/template_url_service_factory.cc
index 4dd8d29..6a63158 100644
--- a/chrome/browser/search_engines/template_url_service_factory.cc
+++ b/chrome/browser/search_engines/template_url_service_factory.cc
@@ -80,6 +80,10 @@ void TemplateURLServiceFactory::RegisterUserPrefs(PrefServiceSyncable* prefs) {
PrefServiceSyncable::UNSYNCABLE_PREF);
prefs->RegisterListPref(prefs::kDefaultSearchProviderAlternateURLs,
PrefServiceSyncable::UNSYNCABLE_PREF);
+ prefs->RegisterStringPref(
+ prefs::kDefaultSearchProviderSearchTermsReplacementKey,
+ std::string(),
+ PrefServiceSyncable::UNSYNCABLE_PREF);
}
bool TemplateURLServiceFactory::ServiceRedirectedInIncognito() const {
diff --git a/chrome/browser/webdata/keyword_table.cc b/chrome/browser/webdata/keyword_table.cc
index 0e2ea85..6e4b47e 100644
--- a/chrome/browser/webdata/keyword_table.cc
+++ b/chrome/browser/webdata/keyword_table.cc
@@ -64,6 +64,10 @@ const std::string ColumnsForVersion(int version, bool concatenated) {
// Column added in version 47.
columns.push_back("alternate_urls");
}
+ if (version >= 49) {
+ // Column added in version 49.
+ columns.push_back("search_terms_replacement_key");
+ }
return JoinString(columns, std::string(concatenated ? " || " : ", "));
}
@@ -109,6 +113,7 @@ void BindURLToStatement(const TemplateURLData& data,
s->BindInt64(starting_column + 14, data.last_modified.ToTimeT());
s->BindString(starting_column + 15, data.sync_guid);
s->BindString(starting_column + 16, alternate_urls);
+ s->BindString(starting_column + 17, data.search_terms_replacement_key);
}
} // anonymous namespace
@@ -139,7 +144,8 @@ bool KeywordTable::Init() {
"instant_url VARCHAR,"
"last_modified INTEGER DEFAULT 0,"
"sync_guid VARCHAR,"
- "alternate_urls VARCHAR)");
+ "alternate_urls VARCHAR,"
+ "search_terms_replacement_key VARCHAR)");
}
bool KeywordTable::IsSyncable() {
@@ -149,7 +155,7 @@ bool KeywordTable::IsSyncable() {
bool KeywordTable::AddKeyword(const TemplateURLData& data) {
DCHECK(data.id);
std::string query("INSERT INTO keywords (" + GetKeywordColumns() +
- ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
+ ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
sql::Statement s(db_->GetUniqueStatement(query.c_str()));
BindURLToStatement(data, &s, 0, 1);
@@ -192,8 +198,8 @@ bool KeywordTable::UpdateKeyword(const TemplateURLData& data) {
"originating_url=?, date_created=?, usage_count=?, input_encodings=?, "
"show_in_default_list=?, suggest_url=?, prepopulate_id=?, "
"created_by_policy=?, instant_url=?, last_modified=?, sync_guid=?, "
- "alternate_urls=? WHERE id=?"));
- BindURLToStatement(data, &s, 17, 0); // "17" binds id() as the last item.
+ "alternate_urls=?, search_terms_replacement_key=? WHERE id=?"));
+ BindURLToStatement(data, &s, 18, 0); // "18" binds id() as the last item.
return s.Run();
}
@@ -365,6 +371,19 @@ bool KeywordTable::MigrateToVersion48RemoveKeywordsBackup() {
return transaction.Commit();
}
+bool KeywordTable::MigrateToVersion49AddSearchTermsReplacementKeyColumn() {
+ sql::Transaction transaction(db_);
+
+ // Fill the |search_terms_replacement_key| column with empty strings;
+ // See comments in MigrateToVersion47AddAlternateURLsColumn().
+ if (!transaction.Begin() ||
+ !db_->Execute("ALTER TABLE keywords ADD COLUMN "
+ "search_terms_replacement_key VARCHAR DEFAULT ''"))
+ return false;
+
+ return transaction.Commit();
+}
+
// static
bool KeywordTable::GetKeywordDataFromStatement(const sql::Statement& s,
TemplateURLData* data) {
@@ -406,6 +425,8 @@ bool KeywordTable::GetKeywordDataFromStatement(const sql::Statement& s,
}
}
+ data->search_terms_replacement_key = s.ColumnString(18);
+
return true;
}
diff --git a/chrome/browser/webdata/keyword_table.h b/chrome/browser/webdata/keyword_table.h
index 9242ea2..32a5c94 100644
--- a/chrome/browser/webdata/keyword_table.h
+++ b/chrome/browser/webdata/keyword_table.h
@@ -53,6 +53,10 @@ class Statement;
// version 39.
// alternate_urls See TemplateURLData::alternate_urls. This was added
// in version 47.
+// search_terms_replacement_key
+// See TemplateURLData::search_terms_replacement_key.
+// This was added in version 49.
+//
//
// This class also manages some fields in the |meta| table:
//
@@ -113,6 +117,7 @@ class KeywordTable : public WebDatabaseTable {
bool MigrateToVersion45RemoveLogoIDAndAutogenerateColumns();
bool MigrateToVersion47AddAlternateURLsColumn();
bool MigrateToVersion48RemoveKeywordsBackup();
+ bool MigrateToVersion49AddSearchTermsReplacementKeyColumn();
private:
FRIEND_TEST_ALL_PREFIXES(KeywordTableTest, GetTableContents);
diff --git a/chrome/browser/webdata/keyword_table_unittest.cc b/chrome/browser/webdata/keyword_table_unittest.cc
index d0ff9c0..9bec318 100644
--- a/chrome/browser/webdata/keyword_table_unittest.cc
+++ b/chrome/browser/webdata/keyword_table_unittest.cc
@@ -152,6 +152,7 @@ TEST_F(KeywordTableTest, GetTableContents) {
keyword.sync_guid = "1234-5678-90AB-CDEF";
keyword.alternate_urls.push_back("a_url1");
keyword.alternate_urls.push_back("a_url2");
+ keyword.search_terms_replacement_key = "espv";
EXPECT_TRUE(keyword_table->AddKeyword(keyword));
keyword.SetKeyword(ASCIIToUTF16("url"));
@@ -162,10 +163,11 @@ TEST_F(KeywordTableTest, GetTableContents) {
keyword.prepopulate_id = 5;
keyword.sync_guid = "FEDC-BA09-8765-4321";
keyword.alternate_urls.clear();
+ keyword.search_terms_replacement_key.clear();
EXPECT_TRUE(keyword_table->AddKeyword(keyword));
const char kTestContents[] = "1short_namekeywordhttp://favicon.url/"
- "http://url/1001url20001234-5678-90AB-CDEF[\"a_url1\",\"a_url2\"]"
+ "http://url/1001url20001234-5678-90AB-CDEF[\"a_url1\",\"a_url2\"]espv"
"2short_nameurlhttp://favicon.url/http://url/1http://originating.url/00"
"Shift_JIS1url250http://instant2/0FEDC-BA09-8765-4321[]";
@@ -194,6 +196,7 @@ TEST_F(KeywordTableTest, GetTableContentsOrdering) {
keyword.sync_guid = "1234-5678-90AB-CDEF";
keyword.alternate_urls.push_back("a_url1");
keyword.alternate_urls.push_back("a_url2");
+ keyword.search_terms_replacement_key = "espv";
EXPECT_TRUE(keyword_table->AddKeyword(keyword));
keyword.SetKeyword(ASCIIToUTF16("url"));
@@ -204,13 +207,14 @@ TEST_F(KeywordTableTest, GetTableContentsOrdering) {
keyword.prepopulate_id = 5;
keyword.sync_guid = "FEDC-BA09-8765-4321";
keyword.alternate_urls.clear();
+ keyword.search_terms_replacement_key.clear();
EXPECT_TRUE(keyword_table->AddKeyword(keyword));
const char kTestContents[] = "1short_nameurlhttp://favicon.url/http://url/1"
"http://originating.url/00Shift_JIS1url250http://instant2/0"
"FEDC-BA09-8765-4321[]"
"2short_namekeywordhttp://favicon.url/http://url/1001"
- "url20001234-5678-90AB-CDEF[\"a_url1\",\"a_url2\"]";
+ "url20001234-5678-90AB-CDEF[\"a_url1\",\"a_url2\"]espv";
std::string contents;
EXPECT_TRUE(keyword_table->GetTableContents("keywords",
diff --git a/chrome/browser/webdata/web_database.cc b/chrome/browser/webdata/web_database.cc
index 02c1f80..fac52f5 100644
--- a/chrome/browser/webdata/web_database.cc
+++ b/chrome/browser/webdata/web_database.cc
@@ -21,7 +21,7 @@
// corresponding changes must happen in the unit tests, and new migration test
// added. See |WebDatabaseMigrationTest::kCurrentTestedVersionNumber|.
// static
-const int WebDatabase::kCurrentVersionNumber = 48;
+const int WebDatabase::kCurrentVersionNumber = 49;
namespace {
@@ -357,6 +357,14 @@ sql::InitStatus WebDatabase::MigrateOldVersionsAsNeeded() {
ChangeVersion(&meta_table_, 48, true);
// FALL THROUGH
+ case 48:
+ if (!keyword_table_->
+ MigrateToVersion49AddSearchTermsReplacementKeyColumn())
+ return FailedMigrationTo(49);
+
+ ChangeVersion(&meta_table_, 49, true);
+ // FALL THROUGH
+
// Add successive versions here. Each should set the version number and
// compatible version number as appropriate, then fall through to the next
// case.
diff --git a/chrome/browser/webdata/web_database_migration_unittest.cc b/chrome/browser/webdata/web_database_migration_unittest.cc
index de4de08..57170c0 100644
--- a/chrome/browser/webdata/web_database_migration_unittest.cc
+++ b/chrome/browser/webdata/web_database_migration_unittest.cc
@@ -213,7 +213,7 @@ class WebDatabaseMigrationTest : public testing::Test {
DISALLOW_COPY_AND_ASSIGN(WebDatabaseMigrationTest);
};
-const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 48;
+const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 49;
void WebDatabaseMigrationTest::LoadDatabase(const FilePath::StringType& file) {
std::string contents;
@@ -2056,3 +2056,46 @@ TEST_F(WebDatabaseMigrationTest, MigrateVersion47ToCurrent) {
EXPECT_NO_FATAL_FAILURE(CheckNoBackupData(connection, &meta_table));
}
}
+
+// Tests that the |search_terms_replacement_key| column is added to the keyword
+// table schema for a version 49 database.
+TEST_F(WebDatabaseMigrationTest, MigrateVersion48ToCurrent) {
+ ASSERT_NO_FATAL_FAILURE(
+ LoadDatabase(FILE_PATH_LITERAL("version_48.sql")));
+
+ // Verify pre-conditions. These are expectations for version 48 of the
+ // database.
+ {
+ sql::Connection connection;
+ ASSERT_TRUE(connection.Open(GetDatabasePath()));
+ ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
+
+ sql::MetaTable meta_table;
+ ASSERT_TRUE(meta_table.Init(&connection, 48, 48));
+
+ ASSERT_FALSE(connection.DoesColumnExist("keywords",
+ "search_terms_replacement_key"));
+ }
+
+ // Load the database via the WebDatabase class and migrate the database to
+ // the current version.
+ {
+ WebDatabase db;
+ ASSERT_EQ(sql::INIT_OK, db.Init(GetDatabasePath()));
+ }
+
+ // Verify post-conditions. These are expectations for current version of the
+ // database.
+ {
+ sql::Connection connection;
+ ASSERT_TRUE(connection.Open(GetDatabasePath()));
+ ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection));
+
+ // Check version.
+ EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection));
+
+ // A new column should have been created.
+ EXPECT_TRUE(connection.DoesColumnExist("keywords",
+ "search_terms_replacement_key"));
+ }
+}