11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file. 41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/pref_service.h" 61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/run_loop.h" 71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h" 91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/prefs/session_startup_pref.h" 101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/search_engines/template_url.h" 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service.h" 131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h" 141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/common/pref_names.h" 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace { 171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class TemplateURLServiceObserver { 191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: 201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TemplateURLServiceObserver(TemplateURLService* service, 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::RunLoop* loop) 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : runner_(loop) { 231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(loop); 241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) template_url_sub_ = service->RegisterOnLoadedCallback( 251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Bind(&TemplateURLServiceObserver::StopLoop, 261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Unretained(this))); 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) service->Load(); 281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ~TemplateURLServiceObserver() {} 301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private: 321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void StopLoop() { 331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) runner_->Quit(); 341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::RunLoop* runner_; 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<TemplateURLService::Subscription> template_url_sub_; 371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TemplateURLServiceObserver); 391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)testing::AssertionResult VerifyTemplateURLServiceLoad( 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TemplateURLService* service) { 431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (service->loaded()) 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return testing::AssertionSuccess(); 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::RunLoop runner; 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TemplateURLServiceObserver observer(service, &runner); 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) runner.Run(); 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (service->loaded()) 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return testing::AssertionSuccess(); 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return testing::AssertionFailure() << "TemplateURLService isn't loaded"; 511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, OverrideSettings) { 541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PrefService* prefs = profile()->GetPrefs(); 551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(prefs); 561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) prefs->SetString(prefs::kHomePage, "http://google.com/"); 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) prefs->SetBoolean(prefs::kHomePageIsNewTabPage, true); 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const GURL urls[] = {GURL("http://foo"), GURL("http://bar")}; 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SessionStartupPref startup_pref(SessionStartupPref::LAST); 601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) startup_pref.urls.assign(urls, urls + arraysize(urls)); 611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SessionStartupPref::SetStartupPref(prefs, startup_pref); 621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TemplateURLService* url_service = 631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TemplateURLServiceFactory::GetForProfile(profile()); 641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(url_service); 651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_TRUE(VerifyTemplateURLServiceLoad(url_service)); 661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TemplateURL* default_provider = url_service->GetDefaultSearchProvider(); 671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(default_provider); 681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(TemplateURL::NORMAL, default_provider->GetType()); 691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_WIN) 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const extensions::Extension* extension = LoadExtensionWithInstallParam( 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch test_data_dir_.AppendASCII("settings_override"), 73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch kFlagEnableFileAccess, 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "10"); 751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(extension); 76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ("http://www.homepage.de/?param=10", 77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch prefs->GetString(prefs::kHomePage)); 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FALSE(prefs->GetBoolean(prefs::kHomePageIsNewTabPage)); 791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) startup_pref = SessionStartupPref::GetStartupPref(prefs); 801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(SessionStartupPref::URLS, startup_pref.type); 81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(std::vector<GURL>(1, GURL("http://www.startup.de/?param=10")), 821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) startup_pref.urls); 831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TemplateURL* extension_provider = url_service->GetDefaultSearchProvider(); 841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION, 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) extension_provider->GetType()); 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16("name.de"), extension_provider->short_name()); 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16("keyword.de"), extension_provider->keyword()); 88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ("http://www.foo.de/s?q={searchTerms}&id=10", 89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extension_provider->url()); 90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(GURL("http://www.foo.de/favicon.ico?id=10"), 911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) extension_provider->favicon_url()); 92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ("http://www.foo.de/suggest?q={searchTerms}&id=10", 931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) extension_provider->suggestions_url()); 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ("http://www.foo.de/instant?q={searchTerms}&id=10", 950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) extension_provider->instant_url()); 96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ("http://www.foo.de/image?q={searchTerms}&id=10", 97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extension_provider->image_url()); 980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ("search_lang=de", extension_provider->search_url_post_params()); 990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ("suggest_lang=de", 1000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) extension_provider->suggestions_url_post_params()); 1010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ("instant_lang=de", extension_provider->instant_url_post_params()); 1020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ("image_lang=de", extension_provider->image_url_post_params()); 1030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const std::string alternate_urls[] = { 104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "http://www.moo.de/s?q={searchTerms}&id=10", 105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "http://www.noo.de/s?q={searchTerms}&id=10"}; 1060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ(std::vector<std::string>( 1070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) alternate_urls, alternate_urls + arraysize(alternate_urls)), 1080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) extension_provider->alternate_urls()); 1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(std::vector<std::string>(1, "UTF-8"), 1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) extension_provider->input_encodings()); 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(default_provider->new_tab_url(), extension_provider->new_tab_url()); 1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) UnloadExtension(extension->id()); 1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("http://google.com/", prefs->GetString(prefs::kHomePage)); 1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_TRUE(prefs->GetBoolean(prefs::kHomePageIsNewTabPage)); 1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) startup_pref = SessionStartupPref::GetStartupPref(prefs); 1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(SessionStartupPref::LAST, startup_pref.type); 1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(std::vector<GURL>(urls, urls + arraysize(urls)), startup_pref.urls); 1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(default_provider, url_service->GetDefaultSearchProvider()); 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const extensions::Extension* extension = 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LoadExtensionWithFlags(test_data_dir_.AppendASCII("settings_override"), 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kFlagIgnoreManifestWarnings); 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(extension); 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(1u, extension->install_warnings().size()); 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(std::string( 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "'chrome_settings_overrides' " 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "is not allowed for specified platform."), 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extension->install_warnings().front().message); 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} // namespace 134