| 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();
|
|
|