preference_api_prefs_unittest.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <string>
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/ref_counted.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/prefs/mock_pref_change_callback.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/values.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/./extension_prefs_unittest.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/extensions/api/preference/preference_api.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_prefs.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using base::Value;
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace extensions {
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace {
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kPref1[] = "path1.subpath";
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kPref2[] = "path2";
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kPref3[] = "path3";
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kPref4[] = "path4";
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Default values in case an extension pref value is not overridden.
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kDefaultPref1[] = "default pref 1";
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kDefaultPref2[] = "default pref 2";
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kDefaultPref3[] = "default pref 3";
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kDefaultPref4[] = "default pref 4";
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// An implementation of the PreferenceAPI which returns the ExtensionPrefs and
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// ExtensionPrefValueMap from the TestExtensionPrefs, rather than from a
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// profile (which we don't create in unittests).
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class TestPreferenceAPI : public PreferenceAPIBase {
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  explicit TestPreferenceAPI(TestExtensionPrefs* test_extension_prefs)
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      : test_extension_prefs_(test_extension_prefs) { }
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ~TestPreferenceAPI() { }
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // PreferenceAPIBase implementation.
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ExtensionPrefs* extension_prefs() OVERRIDE {
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return test_extension_prefs_->prefs();
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ExtensionPrefValueMap* extension_pref_value_map() OVERRIDE {
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return test_extension_prefs_->extension_pref_value_map();
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TestExtensionPrefs* test_extension_prefs_;
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestPreferenceAPI);
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ExtensionControlledPrefsTest : public PrefsPrepopulatedTestBase {
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ExtensionControlledPrefsTest();
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~ExtensionControlledPrefsTest();
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void RegisterPreferences(user_prefs::PrefRegistrySyncable* registry)
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      OVERRIDE;
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void InstallExtensionControlledPref(Extension* extension,
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      const std::string& key,
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      base::Value* value);
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void InstallExtensionControlledPrefIncognito(Extension* extension,
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                               const std::string& key,
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                               base::Value* value);
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void InstallExtensionControlledPrefIncognitoSessionOnly(
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      Extension* extension,
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const std::string& key,
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Value* value);
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void InstallExtension(Extension* extension);
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void UninstallExtension(const std::string& extension_id);
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) protected:
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void EnsureExtensionInstalled(Extension* extension);
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void EnsureExtensionUninstalled(const std::string& extension_id);
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TestPreferenceAPI test_preference_api_;
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)ExtensionControlledPrefsTest::ExtensionControlledPrefsTest()
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : PrefsPrepopulatedTestBase(),
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      test_preference_api_(&prefs_) {
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)ExtensionControlledPrefsTest::~ExtensionControlledPrefsTest() {
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::RegisterPreferences(
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  registry->RegisterStringPref(
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      kPref1, kDefaultPref1, user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  registry->RegisterStringPref(
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      kPref2, kDefaultPref2, user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  registry->RegisterStringPref(
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      kPref3, kDefaultPref3, user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  registry->RegisterStringPref(
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      kPref4, kDefaultPref4, user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::InstallExtensionControlledPref(
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Extension* extension,
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& key,
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::Value* value) {
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EnsureExtensionInstalled(extension);
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  test_preference_api_.SetExtensionControlledPref(
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      extension->id(), key, kExtensionPrefsScopeRegular, value);
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::InstallExtensionControlledPrefIncognito(
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Extension* extension,
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& key,
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::Value* value) {
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EnsureExtensionInstalled(extension);
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  test_preference_api_.SetExtensionControlledPref(
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      extension->id(), key, kExtensionPrefsScopeIncognitoPersistent, value);
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)InstallExtensionControlledPrefIncognitoSessionOnly(Extension* extension,
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                                   const std::string& key,
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   base::Value* value) {
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EnsureExtensionInstalled(extension);
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  test_preference_api_.SetExtensionControlledPref(
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      extension->id(), key, kExtensionPrefsScopeIncognitoSessionOnly, value);
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::InstallExtension(Extension* extension) {
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EnsureExtensionInstalled(extension);
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::UninstallExtension(
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& extension_id) {
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EnsureExtensionUninstalled(extension_id);
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::EnsureExtensionInstalled(
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Extension* extension) {
1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Install extension the first time a preference is set for it.
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Extension* extensions[] = { extension1(),
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              extension2(),
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              extension3(),
1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              extension4() };
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  for (size_t i = 0; i < kNumInstalledExtensions; ++i) {
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (extension == extensions[i] && !installed_[i]) {
152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      prefs()->OnExtensionInstalled(extension,
153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                    Extension::ENABLED,
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    false,
155effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    syncer::StringOrdinal(),
156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    std::string());
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      prefs()->SetIsIncognitoEnabled(extension->id(), true);
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      installed_[i] = true;
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void ExtensionControlledPrefsTest::EnsureExtensionUninstalled(
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& extension_id) {
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Extension* extensions[] = { extension1(),
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              extension2(),
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              extension3(),
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              extension4() };
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  for (size_t i = 0; i < kNumInstalledExtensions; ++i) {
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (extensions[i]->id() == extension_id) {
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      installed_[i] = false;
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  prefs()->OnExtensionUninstalled(extension_id, Manifest::INTERNAL, false);
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsInstallOneExtension
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public ExtensionControlledPrefsTest {
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(extension1(),
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                   kPref1,
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                   new base::StringValue("val1"));
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val1", actual);
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsInstallOneExtension,
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       ControlledPrefsInstallOneExtension) { }
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Check that we do not forget persistent incognito values after a reload.
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsInstallIncognitoPersistent
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public ExtensionControlledPrefsTest {
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        extension1(), kPref1, new base::StringValue("val1"));
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPrefIncognito(
2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        extension1(), kPref1, new base::StringValue("val2"));
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<PrefService> incog_prefs(prefs_.CreateIncognitoPrefService());
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = incog_prefs->GetString(kPref1);
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val2", actual);
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Main pref service shall see only non-incognito settings.
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val1", actual);
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Incognito pref service shall see incognito values.
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<PrefService> incog_prefs(prefs_.CreateIncognitoPrefService());
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    actual = incog_prefs->GetString(kPref1);
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val2", actual);
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsInstallIncognitoPersistent,
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       ControlledPrefsInstallIncognitoPersistent) { }
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Check that we forget 'session only' incognito values after a reload.
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsInstallIncognitoSessionOnly
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public ExtensionControlledPrefsTest {
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ControlledPrefsInstallIncognitoSessionOnly() : iteration_(0) {}
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(
2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        extension1(), kPref1, new base::StringValue("val1"));
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPrefIncognitoSessionOnly(
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        extension1(), kPref1, new base::StringValue("val2"));
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<PrefService> incog_prefs(prefs_.CreateIncognitoPrefService());
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = incog_prefs->GetString(kPref1);
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val2", actual);
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Main pref service shall see only non-incognito settings.
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val1", actual);
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Incognito pref service shall see session-only incognito values only
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // during first run. Once the pref service was reloaded, all values shall be
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // discarded.
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<PrefService> incog_prefs(prefs_.CreateIncognitoPrefService());
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    actual = incog_prefs->GetString(kPref1);
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (iteration_ == 0) {
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      EXPECT_EQ("val2", actual);
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    } else {
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      EXPECT_EQ("val1", actual);
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ++iteration_;
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int iteration_;
2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsInstallIncognitoSessionOnly,
2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       ControlledPrefsInstallIncognitoSessionOnly) { }
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsUninstallExtension : public ExtensionControlledPrefsTest {
2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(
2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        extension1(), kPref1, new base::StringValue("val1"));
2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(
2623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        extension1(), kPref2, new base::StringValue("val2"));
2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ContentSettingsStore* store = prefs()->content_settings_store();
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ContentSettingsPattern pattern =
2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        ContentSettingsPattern::FromString("http://[*.]example.com");
2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    store->SetExtensionContentSetting(extension1()->id(),
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      pattern, pattern,
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      CONTENT_SETTINGS_TYPE_IMAGES,
2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      std::string(),
2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      CONTENT_SETTING_BLOCK,
2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      kExtensionPrefsScopeRegular);
2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    UninstallExtension(extension1()->id());
2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
2767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_FALSE(prefs()->HasPrefForExtension(extension1()->id()));
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual;
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    actual = prefs()->pref_service()->GetString(kPref1);
2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ(kDefaultPref1, actual);
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    actual = prefs()->pref_service()->GetString(kPref2);
2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ(kDefaultPref2, actual);
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsUninstallExtension,
2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       ControlledPrefsUninstallExtension) { }
2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Tests triggering of notifications to registered observers.
2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsNotifyWhenNeeded : public ExtensionControlledPrefsTest {
2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
2917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    using testing::_;
2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    using testing::Mock;
2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    using testing::StrEq;
2947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MockPrefChangeCallback observer(prefs()->pref_service());
2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PrefChangeRegistrar registrar;
2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    registrar.Init(prefs()->pref_service());
2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    registrar.Add(kPref1, observer.GetCallback());
2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MockPrefChangeCallback incognito_observer(prefs()->pref_service());
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<PrefService> incog_prefs(prefs_.CreateIncognitoPrefService());
3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PrefChangeRegistrar incognito_registrar;
3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    incognito_registrar.Init(incog_prefs.get());
3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    incognito_registrar.Add(kPref1, incognito_observer.GetCallback());
3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Write value and check notification.
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(observer, OnPreferenceChanged(_));
3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(incognito_observer, OnPreferenceChanged(_));
3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(extension1(), kPref1,
3103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        new base::StringValue("https://www.chromium.org"));
3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&observer);
3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&incognito_observer);
3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Write same value.
3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(observer, OnPreferenceChanged(_)).Times(0);
3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(incognito_observer, OnPreferenceChanged(_)).Times(0);
3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(extension1(), kPref1,
3183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        new base::StringValue("https://www.chromium.org"));
3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&observer);
3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&incognito_observer);
3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Change value.
3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(observer, OnPreferenceChanged(_));
3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(incognito_observer, OnPreferenceChanged(_));
3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(extension1(), kPref1,
3263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        new base::StringValue("chrome://newtab"));
3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&observer);
3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&incognito_observer);
3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Change only incognito persistent value.
3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(observer, OnPreferenceChanged(_)).Times(0);
3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(incognito_observer, OnPreferenceChanged(_));
3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPrefIncognito(extension1(), kPref1,
3333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        new base::StringValue("chrome://newtab2"));
3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&observer);
3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&incognito_observer);
3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Change only incognito session-only value.
3387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(observer, OnPreferenceChanged(_)).Times(0);
3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(incognito_observer, OnPreferenceChanged(_));
3407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPrefIncognito(extension1(), kPref1,
3413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        new base::StringValue("chrome://newtab3"));
3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&observer);
3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&incognito_observer);
3447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Uninstall.
3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(observer, OnPreferenceChanged(_));
3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(incognito_observer, OnPreferenceChanged(_));
3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    UninstallExtension(extension1()->id());
3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&observer);
3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Mock::VerifyAndClearExpectations(&incognito_observer);
3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    registrar.Remove(kPref1);
3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    incognito_registrar.Remove(kPref1);
3547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
3567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ(kDefaultPref1, actual);
3587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsNotifyWhenNeeded,
3617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       ControlledPrefsNotifyWhenNeeded) { }
3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Tests disabling an extension.
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsDisableExtension : public ExtensionControlledPrefsTest {
3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(
3673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        extension1(), kPref1, new base::StringValue("val1"));
3687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val1", actual);
3707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    prefs()->SetExtensionState(extension1()->id(), Extension::DISABLED);
3717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
3737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
3747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ(kDefaultPref1, actual);
3757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsDisableExtension, ControlledPrefsDisableExtension) { }
3787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Tests disabling and reenabling an extension.
3807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsReenableExtension : public ExtensionControlledPrefsTest {
3817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
3827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(
3833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        extension1(), kPref1, new base::StringValue("val1"));
3847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    prefs()->SetExtensionState(extension1()->id(), Extension::DISABLED);
3857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    prefs()->SetExtensionState(extension1()->id(), Extension::ENABLED);
3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
3887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
3897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ("val1", actual);
3907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
3927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsDisableExtension, ControlledPrefsReenableExtension) { }
3937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Mock class to test whether objects are deleted correctly.
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MockStringValue : public base::StringValue {
3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  explicit MockStringValue(const std::string& in_value)
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : base::StringValue(in_value) {
3997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~MockStringValue() {
4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    Die();
4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MOCK_METHOD0(Die, void());
4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
4057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsSetExtensionControlledPref
4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public ExtensionControlledPrefsTest {
4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
4097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
4107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MockStringValue* v1 = new MockStringValue("https://www.chromium.org");
4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MockStringValue* v2 = new MockStringValue("https://www.chromium.org");
4127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MockStringValue* v1i = new MockStringValue("https://www.chromium.org");
4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MockStringValue* v2i = new MockStringValue("https://www.chromium.org");
4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Ownership is taken, value shall not be deleted.
4157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*v1, Die()).Times(0);
4167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*v1i, Die()).Times(0);
4177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(extension1(), kPref1, v1);
4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPrefIncognito(extension1(), kPref1, v1i);
4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    testing::Mock::VerifyAndClearExpectations(v1);
4207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    testing::Mock::VerifyAndClearExpectations(v1i);
4217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Make sure there is no memory leak and both values are deleted.
4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*v1, Die()).Times(1);
4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*v1i, Die()).Times(1);
4247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*v2, Die()).Times(1);
4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*v2i, Die()).Times(1);
4267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(extension1(), kPref1, v2);
4277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPrefIncognito(extension1(), kPref1, v2i);
4287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    prefs_.RecreateExtensionPrefs();
4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    testing::Mock::VerifyAndClearExpectations(v1);
4307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    testing::Mock::VerifyAndClearExpectations(v1i);
4317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    testing::Mock::VerifyAndClearExpectations(v2);
4327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    testing::Mock::VerifyAndClearExpectations(v2i);
4337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsSetExtensionControlledPref,
4397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       ControlledPrefsSetExtensionControlledPref) { }
4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Tests that the switches::kDisableExtensions command-line flag prevents
4427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// extension controlled preferences from being enacted.
4437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ControlledPrefsDisableExtensions : public ExtensionControlledPrefsTest {
4447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
4457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ControlledPrefsDisableExtensions()
4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      : iteration_(0) {}
4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~ControlledPrefsDisableExtensions() {}
4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Initialize() OVERRIDE {
4497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    InstallExtensionControlledPref(
4503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        extension1(), kPref1, new base::StringValue("val1"));
4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // This becomes only active in the second verification phase.
4527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    prefs_.set_extensions_disabled(true);
4537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Verify() OVERRIDE {
4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string actual = prefs()->pref_service()->GetString(kPref1);
4567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (iteration_ == 0) {
4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      EXPECT_EQ("val1", actual);
4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ++iteration_;
4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    } else {
4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      EXPECT_EQ(kDefaultPref1, actual);
4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int iteration_;
4667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
4677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ControlledPrefsDisableExtensions, ControlledPrefsDisableExtensions) { }
4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace extensions
470