Index: chrome/browser/search_engines/template_url_service_unittest.cc |
diff --git a/chrome/browser/search_engines/template_url_service_unittest.cc b/chrome/browser/search_engines/template_url_service_unittest.cc |
index 07abd01787e417ddfe0c61ae831ce0db68cf4db4..b4292898dab78cfc548360987715695c36780273 100644 |
--- a/chrome/browser/search_engines/template_url_service_unittest.cc |
+++ b/chrome/browser/search_engines/template_url_service_unittest.cc |
@@ -176,6 +176,12 @@ class TemplateURLServiceTest : public testing::Test { |
Time last_modified, |
Time last_visited); |
+ // Add extension controlled search engine with |keyword| to model. |
+ TemplateURL* AddExtensionSearchEngine(const std::string& keyword, |
+ const std::string& extension_name, |
+ bool wants_to_be_default_engine, |
+ const base::Time& install_time); |
+ |
// Verifies the two TemplateURLs are equal. |
void AssertEquals(const TemplateURL& expected, const TemplateURL& actual); |
@@ -253,6 +259,26 @@ TemplateURL* TemplateURLServiceTest::AddKeywordWithDate( |
last_visited); |
} |
+TemplateURL* TemplateURLServiceTest::AddExtensionSearchEngine( |
+ const std::string& keyword, |
+ const std::string& extension_name, |
+ bool wants_to_be_default_engine, |
+ const base::Time& install_time) { |
+ std::unique_ptr<TemplateURLData> turl_data = |
+ GenerateDummyTemplateURLData(keyword); |
+ turl_data->safe_for_autoreplace = false; |
+ |
+ auto ext_dse = base::MakeUnique<TemplateURL>( |
+ *turl_data, TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); |
+ auto extension_info = |
+ base::MakeUnique<TemplateURL::AssociatedExtensionInfo>(extension_name); |
+ extension_info->wants_to_be_default_engine = wants_to_be_default_engine; |
+ extension_info->install_time = install_time; |
+ |
+ return model()->AddExtensionControlledTURL(std::move(ext_dse), |
+ std::move(extension_info)); |
+} |
+ |
void TemplateURLServiceTest::AssertEquals(const TemplateURL& expected, |
const TemplateURL& actual) { |
ASSERT_EQ(expected.short_name(), actual.short_name()); |
@@ -464,39 +490,42 @@ TEST_F(TemplateURLServiceTest, AddSameKeyword) { |
EXPECT_EQ(ASCIIToUTF16("test2"), t_url->keyword()); |
} |
-TEST_F(TemplateURLServiceTest, AddExtensionKeyword) { |
+TEST_F(TemplateURLServiceTest, AddOmniboxExtensionKeyword) { |
test_util()->VerifyLoad(); |
AddKeywordWithDate("replaceable", "keyword1", "http://test1", std::string(), |
std::string(), std::string(), true, "UTF-8", Time(), |
Time(), Time()); |
- TemplateURL* original2 = AddKeywordWithDate( |
- "nonreplaceable", "keyword2", "http://test2", std::string(), |
- std::string(), std::string(), false, "UTF-8", Time(), Time(), Time()); |
+ AddKeywordWithDate("nonreplaceable", "keyword2", "http://test2", |
+ std::string(), std::string(), std::string(), false, |
+ "UTF-8", Time(), Time(), Time()); |
model()->RegisterOmniboxKeyword("test3", "extension", "keyword3", |
- "http://test3"); |
+ "http://test3", Time::FromDoubleT(1)); |
TemplateURL* original3 = |
model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword3")); |
ASSERT_TRUE(original3); |
// Extension keywords should override replaceable keywords. |
- model()->RegisterOmniboxKeyword("id1", "test", "keyword1", "http://test4"); |
+ model()->RegisterOmniboxKeyword("id1", "test", "keyword1", "http://test4", |
+ Time()); |
TemplateURL* extension1 = model()->FindTemplateURLForExtension( |
"id1", TemplateURL::OMNIBOX_API_EXTENSION); |
EXPECT_TRUE(extension1); |
EXPECT_EQ(extension1, |
model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword1"))); |
- // They should not override non-replaceable keywords. |
- model()->RegisterOmniboxKeyword("id2", "test", "keyword2", "http://test5"); |
+ // They should also override non-replaceable keywords. |
+ model()->RegisterOmniboxKeyword("id2", "test", "keyword2", "http://test5", |
+ Time()); |
TemplateURL* extension2 = model()->FindTemplateURLForExtension( |
"id2", TemplateURL::OMNIBOX_API_EXTENSION); |
ASSERT_TRUE(extension2); |
- EXPECT_EQ(original2, |
+ EXPECT_EQ(extension2, |
model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword2"))); |
// They should override extension keywords added earlier. |
- model()->RegisterOmniboxKeyword("id3", "test", "keyword3", "http://test6"); |
+ model()->RegisterOmniboxKeyword("id3", "test", "keyword3", "http://test6", |
+ Time::FromDoubleT(4)); |
TemplateURL* extension3 = model()->FindTemplateURLForExtension( |
"id3", TemplateURL::OMNIBOX_API_EXTENSION); |
ASSERT_TRUE(extension3); |
@@ -504,14 +533,14 @@ TEST_F(TemplateURLServiceTest, AddExtensionKeyword) { |
model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword3"))); |
} |
-TEST_F(TemplateURLServiceTest, AddSameKeywordWithExtensionPresent) { |
+TEST_F(TemplateURLServiceTest, AddSameKeywordWithOmniboxExtensionPresent) { |
test_util()->VerifyLoad(); |
// Similar to the AddSameKeyword test, but with an extension keyword masking a |
// replaceable TemplateURL. We should still do correct conflict resolution |
// between the non-template URLs. |
model()->RegisterOmniboxKeyword("test2", "extension", "keyword", |
- "http://test2"); |
+ "http://test2", Time()); |
TemplateURL* extension = |
model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword")); |
ASSERT_TRUE(extension); |
@@ -531,16 +560,22 @@ TEST_F(TemplateURLServiceTest, AddSameKeywordWithExtensionPresent) { |
EXPECT_EQ(extension, |
model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword"))); |
EXPECT_EQ(t_url, model()->GetTemplateURLForHost("test3")); |
+ // Check that previous replaceable engine with keyword is removed. |
+ EXPECT_FALSE(model()->GetTemplateURLForHost("test1")); |
// Adding a nonreplaceable keyword should remove the existing replaceable |
- // keyword and replace the extension as the associated URL for this keyword, |
- // but not evict the extension from the service entirely. |
+ // keyword, yet extension must still be set as the associated URL for this |
+ // keyword. |
data.SetShortName(ASCIIToUTF16("name2")); |
data.SetURL("http://test4"); |
data.safe_for_autoreplace = false; |
- TemplateURL* t_url2 = model()->Add(base::MakeUnique<TemplateURL>(data)); |
- EXPECT_EQ(t_url2, |
+ TemplateURL* nonreplaceable = |
+ model()->Add(base::MakeUnique<TemplateURL>(data)); |
+ EXPECT_EQ(extension, |
model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword"))); |
+ EXPECT_EQ(nonreplaceable, model()->GetTemplateURLForHost("test4")); |
+ // Check that previous replaceable engine with keyword is removed. |
+ EXPECT_FALSE(model()->GetTemplateURLForHost("test3")); |
} |
TEST_F(TemplateURLServiceTest, NotPersistOmniboxExtensionKeyword) { |
@@ -548,7 +583,7 @@ TEST_F(TemplateURLServiceTest, NotPersistOmniboxExtensionKeyword) { |
// Register an omnibox keyword. |
model()->RegisterOmniboxKeyword("test", "extension", "keyword", |
- "chrome-extension://test"); |
+ "chrome-extension://test", Time()); |
ASSERT_TRUE(model()->GetTemplateURLForKeyword(ASCIIToUTF16("keyword"))); |
// Reload the data. |
@@ -879,7 +914,7 @@ TEST_F(TemplateURLServiceTest, RepairPrepopulatedSearchEngines) { |
// Register an extension with bing keyword. |
model()->RegisterOmniboxKeyword("abcdefg", "extension_name", "bing.com", |
- "http://abcdefg"); |
+ "http://abcdefg", Time()); |
EXPECT_TRUE(model()->GetTemplateURLForKeyword(ASCIIToUTF16("bing.com"))); |
model()->RepairPrepopulatedSearchEngines(); |
@@ -892,7 +927,8 @@ TEST_F(TemplateURLServiceTest, RepairPrepopulatedSearchEngines) { |
google->GenerateSearchURL(model()->search_terms_data()).host()); |
// Bing was repaired. |
- bing = model()->GetTemplateURLForKeyword(ASCIIToUTF16("bing.com")); |
+ bing = |
+ model()->FindNonExtensionTemplateURLForKeyword(ASCIIToUTF16("bing.com")); |
ASSERT_TRUE(bing); |
EXPECT_EQ(TemplateURL::NORMAL, bing->type()); |
@@ -1658,6 +1694,116 @@ TEST_F(TemplateURLServiceTest, ExtensionEnginesNotPersist) { |
EXPECT_FALSE(model()->GetTemplateURLForKeyword(ASCIIToUTF16("ext2"))); |
} |
+// Checks that correct priority is applied when resolving conflicts between the |
+// omnibox extension, search engine extension and user search engines with same |
+// keyword. |
+TEST_F(TemplateURLServiceTest, CheckEnginesWithSameKeywords) { |
+ test_util()->VerifyLoad(); |
+ // TemplateURLData used for user engines. |
+ std::unique_ptr<TemplateURLData> turl_data = |
+ GenerateDummyTemplateURLData("common_keyword"); |
+ turl_data->safe_for_autoreplace = false; |
+ |
+ // Add non replaceable user engine. |
+ const TemplateURL* user1 = |
+ model()->Add(base::MakeUnique<TemplateURL>(*turl_data)); |
+ |
+ // Add default extension engine with same keyword as user engine. |
+ const TemplateURL* extension = AddExtensionSearchEngine( |
+ "common_keyword", "extension_id", true, Time::FromDoubleT(2)); |
+ |
+ // Add another non replaceable user engine with same keyword as extension. |
+ const TemplateURL* user2 = |
+ model()->Add(base::MakeUnique<TemplateURL>(*turl_data)); |
+ |
+ // Check extension DSE is set as default and its keyword is not changed. |
+ const TemplateURL* current_dse = model()->GetDefaultSearchProvider(); |
+ EXPECT_EQ(extension, current_dse); |
+ EXPECT_EQ(ASCIIToUTF16("common_keyword"), current_dse->keyword()); |
+ |
+ // Register omnibox keyword with same keyword as extension. |
+ // Use |install_time| value less than in AddExtensionSearchEngine call above |
+ // to check that omnibox api keyword is ranked higher even if installed |
+ // earlier. |
+ model()->RegisterOmniboxKeyword("omnibox_api_extension_id", "extension_name", |
+ "common_keyword", "http://test3", |
+ Time::FromDoubleT(1)); |
+ TemplateURL* omnibox_api = model()->FindTemplateURLForExtension( |
+ "omnibox_api_extension_id", TemplateURL::OMNIBOX_API_EXTENSION); |
+ |
+ // Expect that first non replaceable user engine keyword is changed because of |
+ // conflict. Second user engine will keep its keyword. |
+ EXPECT_NE(ASCIIToUTF16("common_keyword"), user1->keyword()); |
+ EXPECT_EQ(ASCIIToUTF16("common_keyword"), user2->keyword()); |
+ |
+ // Check that extensions kept their keywords. |
+ EXPECT_EQ(ASCIIToUTF16("common_keyword"), extension->keyword()); |
+ EXPECT_EQ(ASCIIToUTF16("common_keyword"), omnibox_api->keyword()); |
+ |
+ // Omnibox api is accessible by keyword as most relevant. |
+ EXPECT_EQ(omnibox_api, |
+ model()->GetTemplateURLForKeyword(ASCIIToUTF16("common_keyword"))); |
+ // Extension controlled search engine is still set as default and can be found |
+ // in TemplateURLService. |
+ EXPECT_EQ(extension, model()->GetDefaultSearchProvider()); |
+ EXPECT_EQ(extension, |
+ model()->FindTemplateURLForExtension( |
+ "extension_id", TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION)); |
+ |
+ // Test removing engines. |
+ // Remove omnibox api extension. |
+ model()->RemoveExtensionControlledTURL("omnibox_api_extension_id", |
+ TemplateURL::OMNIBOX_API_EXTENSION); |
+ // Expect that keyword is now corresponds to extension search engine. |
+ EXPECT_EQ(extension, |
+ model()->GetTemplateURLForKeyword(ASCIIToUTF16("common_keyword"))); |
+ // Remove extension engine. |
+ model()->RemoveExtensionControlledTURL( |
+ "extension_id", TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); |
+ EXPECT_NE(extension, model()->GetDefaultSearchProvider()); |
+ // Now latest user engine is returned for keyword. |
+ EXPECT_EQ(user2, |
+ model()->GetTemplateURLForKeyword(ASCIIToUTF16("common_keyword"))); |
+} |
+ |
+// Check that two extensions with the same engine are handled correctly. |
+TEST_F(TemplateURLServiceTest, ExtensionsWithSameKeywords) { |
+ test_util()->VerifyLoad(); |
+ |
+ // Add non default extension engine. |
+ const TemplateURL* extension1 = AddExtensionSearchEngine( |
+ "common_keyword", "extension_id1", false, Time::FromDoubleT(1)); |
+ |
+ // Check that GetTemplateURLForKeyword returns last installed extension. |
+ EXPECT_EQ(extension1, |
+ model()->GetTemplateURLForKeyword(ASCIIToUTF16("common_keyword"))); |
+ |
+ // Add default extension engine with the same keyword. |
+ const TemplateURL* extension2 = AddExtensionSearchEngine( |
+ "common_keyword", "extension_id2", true, Time::FromDoubleT(2)); |
+ |
+ // Check that GetTemplateURLForKeyword now returns extension2 because it was |
+ // installed later. |
+ EXPECT_EQ(extension2, |
+ model()->GetTemplateURLForKeyword(ASCIIToUTF16("common_keyword"))); |
+ |
+ // Add another non default extension with same keyword. This action must not |
+ // change any keyword due to conflict. |
+ const TemplateURL* extension3 = AddExtensionSearchEngine( |
+ "common_keyword", "extension_id3", false, Time::FromDoubleT(3)); |
+ |
+ // Check that extension2 is set as default. |
+ EXPECT_EQ(extension2, model()->GetDefaultSearchProvider()); |
+ |
+ // Check that GetTemplateURLForKeyword returns last installed extension. |
+ EXPECT_EQ(extension3, |
+ model()->GetTemplateURLForKeyword(ASCIIToUTF16("common_keyword"))); |
+ // Check that all keywords for extensions are left unchanged. |
+ EXPECT_EQ(ASCIIToUTF16("common_keyword"), extension1->keyword()); |
+ EXPECT_EQ(ASCIIToUTF16("common_keyword"), extension2->keyword()); |
+ EXPECT_EQ(ASCIIToUTF16("common_keyword"), extension3->keyword()); |
+} |
+ |
TEST_F(TemplateURLServiceTest, ExtensionEngineVsPolicy) { |
// Set a managed preference that establishes a default search provider. |
std::unique_ptr<TemplateURLData> managed = CreateTestSearchEngine(); |