Chromium Code Reviews| Index: chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc |
| diff --git a/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc b/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc |
| index d03d2e622d8487ac14348880368a5794d0d29849..8a73be5c6cb35a14f6fe70fe27d77d81e6300956 100644 |
| --- a/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc |
| +++ b/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc |
| @@ -9,73 +9,99 @@ |
| #include "chrome/browser/extensions/extension_browsertest.h" |
| #include "chrome/browser/prefs/session_startup_pref.h" |
| #include "chrome/browser/profiles/profile.h" |
| +#include "chrome/browser/search/search.h" |
| #include "chrome/browser/search_engines/template_url_service_factory.h" |
| +#include "chrome/browser/search_engines/ui_thread_search_terms_data.h" |
| #include "chrome/common/pref_names.h" |
| +#include "chrome/test/base/search_test_utils.h" |
| #include "components/prefs/pref_service.h" |
| +#include "components/search_engines/default_search_manager.h" |
| +#include "components/search_engines/search_engines_test_util.h" |
| #include "components/search_engines/template_url.h" |
| +#include "components/search_engines/template_url_prepopulate_data.h" |
| #include "components/search_engines/template_url_service.h" |
| #include "components/version_info/version_info.h" |
| #include "extensions/common/features/feature_channel.h" |
| namespace { |
| +// Prepopulated id hardcoded in test_extension. |
| +const int kTestExtensionPrepopulatedId = 1; |
| +// TemplateURLData with search engines settings from test extension manifest. |
| +// chrome/test/data/extensions/settings_override/manifest.json |
| +std::unique_ptr<TemplateURLData> TestExtensionSearchEngine(PrefService* prefs) { |
| + auto result = base::MakeUnique<TemplateURLData>(); |
| + result->SetShortName(base::ASCIIToUTF16("name.de")); |
| + result->SetKeyword(base::ASCIIToUTF16("keyword.de")); |
| + result->SetURL("http://www.foo.de/s?q={searchTerms}&id=10"); |
| + result->favicon_url = GURL("http://www.foo.de/favicon.ico?id=10"); |
| + result->suggestions_url = "http://www.foo.de/suggest?q={searchTerms}&id=10"; |
| + result->instant_url = "http://www.foo.de/instant?q={searchTerms}&id=10"; |
| + result->image_url = "http://www.foo.de/image?q={searchTerms}&id=10"; |
| + result->search_url_post_params = "search_lang=de"; |
| + result->suggestions_url_post_params = "suggest_lang=de"; |
| + result->instant_url_post_params = "instant_lang=de"; |
| + result->image_url_post_params = "image_lang=de"; |
| + result->alternate_urls.push_back("http://www.moo.de/s?q={searchTerms}&id=10"); |
| + result->alternate_urls.push_back("http://www.noo.de/s?q={searchTerms}&id=10"); |
| + result->input_encodings.push_back("UTF-8"); |
| -class TemplateURLServiceObserver { |
| - public: |
| - TemplateURLServiceObserver(TemplateURLService* service, |
| - base::RunLoop* loop) |
| - : runner_(loop) { |
| - DCHECK(loop); |
| - template_url_sub_ = service->RegisterOnLoadedCallback( |
| - base::Bind(&TemplateURLServiceObserver::StopLoop, |
| - base::Unretained(this))); |
| - service->Load(); |
| - } |
| - ~TemplateURLServiceObserver() {} |
| - |
| - private: |
| - void StopLoop() { |
| - runner_->Quit(); |
| - } |
| - base::RunLoop* runner_; |
| - std::unique_ptr<TemplateURLService::Subscription> template_url_sub_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(TemplateURLServiceObserver); |
| -}; |
| + std::unique_ptr<TemplateURLData> prep_engine( |
| + TemplateURLPrepopulateData::GetPrepopulatedEngine( |
| + prefs, kTestExtensionPrepopulatedId)); |
| + // Values below do not exist in extension manifest and are taken from |
| + // prepopulated engine with prepopulated_id set in extension manifest. |
| + result->search_terms_replacement_key = |
| + prep_engine->search_terms_replacement_key; |
| + result->contextual_search_url = prep_engine->contextual_search_url; |
| + result->new_tab_url = prep_engine->new_tab_url; |
| + return result; |
| +} |
| testing::AssertionResult VerifyTemplateURLServiceLoad( |
| TemplateURLService* service) { |
| if (service->loaded()) |
| return testing::AssertionSuccess(); |
| - base::RunLoop runner; |
| - TemplateURLServiceObserver observer(service, &runner); |
| - runner.Run(); |
| + search_test_utils::WaitForTemplateURLServiceToLoad(service); |
| if (service->loaded()) |
| return testing::AssertionSuccess(); |
| return testing::AssertionFailure() << "TemplateURLService isn't loaded"; |
| } |
| -IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, OverrideSettings) { |
| +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, OverrideHomePageSettings) { |
| PrefService* prefs = profile()->GetPrefs(); |
| ASSERT_TRUE(prefs); |
| prefs->SetString(prefs::kHomePage, "http://google.com/"); |
| prefs->SetBoolean(prefs::kHomePageIsNewTabPage, true); |
| +#if defined(OS_WIN) || defined(OS_MACOSX) |
| + const extensions::Extension* extension = LoadExtensionWithInstallParam( |
| + test_data_dir_.AppendASCII("settings_override"), kFlagEnableFileAccess, |
| + "10"); |
| + ASSERT_TRUE(extension); |
| + EXPECT_EQ("http://www.homepage.de/?param=10", |
| + prefs->GetString(prefs::kHomePage)); |
| + EXPECT_FALSE(prefs->GetBoolean(prefs::kHomePageIsNewTabPage)); |
| + UnloadExtension(extension->id()); |
| + EXPECT_EQ("http://google.com/", prefs->GetString(prefs::kHomePage)); |
| + EXPECT_TRUE(prefs->GetBoolean(prefs::kHomePageIsNewTabPage)); |
| +#else |
| + const extensions::Extension* extension = |
| + LoadExtensionWithFlags(test_data_dir_.AppendASCII("settings_override"), |
| + kFlagIgnoreManifestWarnings); |
| + ASSERT_TRUE(extension); |
| + ASSERT_EQ(1u, extension->install_warnings().size()); |
| + EXPECT_EQ(std::string("'chrome_settings_overrides' " |
| + "is not allowed for specified platform."), |
| + extension->install_warnings().front().message); |
| +#endif |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, OverrideStartupPagesSettings) { |
| + PrefService* prefs = profile()->GetPrefs(); |
| + ASSERT_TRUE(prefs); |
| const GURL urls[] = {GURL("http://foo"), GURL("http://bar")}; |
| SessionStartupPref startup_pref(SessionStartupPref::LAST); |
| startup_pref.urls.assign(urls, urls + arraysize(urls)); |
| SessionStartupPref::SetStartupPref(prefs, startup_pref); |
| - TemplateURLService* url_service = |
| - TemplateURLServiceFactory::GetForProfile(profile()); |
| - ASSERT_TRUE(url_service); |
| - EXPECT_TRUE(VerifyTemplateURLServiceLoad(url_service)); |
| - TemplateURL* default_provider = url_service->GetDefaultSearchProvider(); |
| - ASSERT_TRUE(default_provider); |
| - EXPECT_EQ(TemplateURL::NORMAL, default_provider->type()); |
| - |
| -#if defined(OS_MACOSX) |
| - // On Mac, this API is limited to trunk. |
| - extensions::ScopedCurrentChannel scoped_channel( |
| - version_info::Channel::UNKNOWN); |
| -#endif // OS_MACOSX |
| #if defined(OS_WIN) || defined(OS_MACOSX) |
| const extensions::Extension* extension = LoadExtensionWithInstallParam( |
| @@ -83,49 +109,50 @@ IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, OverrideSettings) { |
| kFlagEnableFileAccess, |
| "10"); |
| ASSERT_TRUE(extension); |
| - EXPECT_EQ("http://www.homepage.de/?param=10", |
| - prefs->GetString(prefs::kHomePage)); |
| - EXPECT_FALSE(prefs->GetBoolean(prefs::kHomePageIsNewTabPage)); |
| startup_pref = SessionStartupPref::GetStartupPref(prefs); |
| EXPECT_EQ(SessionStartupPref::URLS, startup_pref.type); |
| EXPECT_EQ(std::vector<GURL>(1, GURL("http://www.startup.de/?param=10")), |
| startup_pref.urls); |
| - TemplateURL* extension_provider = url_service->GetDefaultSearchProvider(); |
| - EXPECT_EQ(TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION, |
| - extension_provider->type()); |
| - EXPECT_EQ(base::ASCIIToUTF16("name.de"), extension_provider->short_name()); |
| - EXPECT_EQ(base::ASCIIToUTF16("keyword.de"), extension_provider->keyword()); |
| - EXPECT_EQ("http://www.foo.de/s?q={searchTerms}&id=10", |
| - extension_provider->url()); |
| - EXPECT_EQ(GURL("http://www.foo.de/favicon.ico?id=10"), |
| - extension_provider->favicon_url()); |
| - EXPECT_EQ("http://www.foo.de/suggest?q={searchTerms}&id=10", |
| - extension_provider->suggestions_url()); |
| - EXPECT_EQ("http://www.foo.de/instant?q={searchTerms}&id=10", |
| - extension_provider->instant_url()); |
| - EXPECT_EQ("http://www.foo.de/image?q={searchTerms}&id=10", |
| - extension_provider->image_url()); |
| - EXPECT_EQ("search_lang=de", extension_provider->search_url_post_params()); |
| - EXPECT_EQ("suggest_lang=de", |
| - extension_provider->suggestions_url_post_params()); |
| - EXPECT_EQ("instant_lang=de", extension_provider->instant_url_post_params()); |
| - EXPECT_EQ("image_lang=de", extension_provider->image_url_post_params()); |
| - const std::string alternate_urls[] = { |
| - "http://www.moo.de/s?q={searchTerms}&id=10", |
| - "http://www.noo.de/s?q={searchTerms}&id=10"}; |
| - EXPECT_EQ(std::vector<std::string>( |
| - alternate_urls, alternate_urls + arraysize(alternate_urls)), |
| - extension_provider->alternate_urls()); |
| - EXPECT_EQ(std::vector<std::string>(1, "UTF-8"), |
| - extension_provider->input_encodings()); |
| - EXPECT_EQ(default_provider->new_tab_url(), extension_provider->new_tab_url()); |
| - |
| UnloadExtension(extension->id()); |
| - EXPECT_EQ("http://google.com/", prefs->GetString(prefs::kHomePage)); |
| - EXPECT_TRUE(prefs->GetBoolean(prefs::kHomePageIsNewTabPage)); |
| startup_pref = SessionStartupPref::GetStartupPref(prefs); |
| EXPECT_EQ(SessionStartupPref::LAST, startup_pref.type); |
| EXPECT_EQ(std::vector<GURL>(urls, urls + arraysize(urls)), startup_pref.urls); |
| +#else |
| + const extensions::Extension* extension = |
| + LoadExtensionWithFlags(test_data_dir_.AppendASCII("settings_override"), |
| + kFlagIgnoreManifestWarnings); |
| + ASSERT_TRUE(extension); |
| + ASSERT_EQ(1u, extension->install_warnings().size()); |
| + EXPECT_EQ(std::string("'chrome_settings_overrides' " |
| + "is not allowed for specified platform."), |
| + extension->install_warnings().front().message); |
| +#endif |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, OverrideDSE) { |
| + PrefService* prefs = profile()->GetPrefs(); |
| + ASSERT_TRUE(prefs); |
| + TemplateURLService* url_service = |
| + TemplateURLServiceFactory::GetForProfile(profile()); |
| + ASSERT_TRUE(url_service); |
| + EXPECT_TRUE(VerifyTemplateURLServiceLoad(url_service)); |
| + TemplateURL* default_provider = url_service->GetDefaultSearchProvider(); |
| + ASSERT_TRUE(default_provider); |
| + EXPECT_EQ(TemplateURL::NORMAL, default_provider->type()); |
| + |
| +#if defined(OS_WIN) || defined(OS_MACOSX) |
| + const extensions::Extension* extension = LoadExtensionWithInstallParam( |
| + test_data_dir_.AppendASCII("settings_override"), kFlagEnableFileAccess, |
| + "10"); |
| + ASSERT_TRUE(extension); |
| + TemplateURL* current_dse = url_service->GetDefaultSearchProvider(); |
| + EXPECT_EQ(TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION, current_dse->type()); |
| + |
| + std::unique_ptr<TemplateURLData> extension_dse = |
| + TestExtensionSearchEngine(prefs); |
| + ExpectSimilar(extension_dse.get(), ¤t_dse->data()); |
| + |
| + UnloadExtension(extension->id()); |
| EXPECT_EQ(default_provider, url_service->GetDefaultSearchProvider()); |
| #else |
| const extensions::Extension* extension = |
| @@ -140,4 +167,59 @@ IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, OverrideSettings) { |
| #endif |
| } |
| +#if defined(OS_WIN) || defined(OS_MACOSX) |
| +// Install and load extension into test profile. |
| +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, PRE_OverridenDSEPersists) { |
| + PrefService* prefs = profile()->GetPrefs(); |
| + ASSERT_TRUE(prefs); |
| + TemplateURLService* url_service = |
| + TemplateURLServiceFactory::GetForProfile(profile()); |
| + ASSERT_TRUE(url_service); |
| + EXPECT_TRUE(VerifyTemplateURLServiceLoad(url_service)); |
| + TemplateURL* default_provider = url_service->GetDefaultSearchProvider(); |
| + ASSERT_TRUE(default_provider); |
| + // Check that default provider is normal before extension is |
| + // installed and loaded. |
| + EXPECT_EQ(TemplateURL::NORMAL, default_provider->type()); |
| + EXPECT_NE(base::ASCIIToUTF16("name.de"), default_provider->short_name()); |
| + EXPECT_NE(base::ASCIIToUTF16("keyword.de"), default_provider->keyword()); |
| + |
| + // Install extension that overrides DSE. |
| + const extensions::Extension* extension = LoadExtensionWithInstallParam( |
| + test_data_dir_.AppendASCII("settings_override"), kFlagEnableFileAccess, |
| + "10"); |
| + ASSERT_TRUE(extension); |
| +} |
| + |
| +// PRE_OverridenDSEPersists already installed extension with overriden DSE into |
| +// profile. Current test checks that after extension is installed, |
| +// default_search_manager correctly determines extension overriden DSE |
| +// from profile. |
| +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, OverridenDSEPersists) { |
| + Profile* profile = browser()->profile(); |
| + DefaultSearchManager default_manager( |
| + profile->GetPrefs(), DefaultSearchManager::ObserverCallback()); |
| + |
| + DefaultSearchManager::Source source; |
| + TemplateURLData* dse = default_manager.GetDefaultSearchEngine(&source); |
|
vasilii
2016/12/13 17:16:39
current_dse?
Alexander Yashkin
2016/12/14 19:25:21
Done
|
| + |
| + ASSERT_TRUE(dse); |
| + std::unique_ptr<TemplateURLData> extension_dse = |
| + TestExtensionSearchEngine(profile->GetPrefs()); |
| + ExpectSimilar(extension_dse.get(), dse); |
| + EXPECT_EQ(DefaultSearchManager::FROM_EXTENSION, source); |
| + |
| + // Check that new tab url is correctly overriden by extension. |
| + // https://bugs.chromium.org/p/chromium/issues/detail?id=450534 |
| + TemplateURL ext_turl(*TestExtensionSearchEngine(profile->GetPrefs()), |
|
vasilii
2016/12/13 17:16:39
*extension_dse?
Alexander Yashkin
2016/12/14 19:25:21
Done, thanks
|
| + TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); |
| + |
| + std::string new_tab_url_ext = ext_turl.new_tab_url_ref().ReplaceSearchTerms( |
| + TemplateURLRef::SearchTermsArgs(base::string16()), |
| + UIThreadSearchTermsData(profile)); |
| + |
| + EXPECT_EQ(new_tab_url_ext, search::GetNewTabPageURL(profile).spec()); |
| +} |
| +#endif |
| + |
| } // namespace |