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