12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/path_service.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/browser_prefs.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/command_line_pref_store.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_mock_factory.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_paths.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/chrome_render_view_host_test_harness.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_pref_service_syncable.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_profile.h"
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/browser/configuration_policy_pref_store.h"
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/mock_configuration_policy_provider.h"
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/web_preferences.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/web_contents_tester.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/test/data/resource.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::WebContentsTester;
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing content::WebPreferences;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ChromePrefServiceTest, UpdateCommandLinePrefStore) {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSimple prefs;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.registry()->RegisterBooleanPref(prefs::kCloudPrintProxyEnabled, false);
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check to make sure the value is as expected.
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const PrefService::Preference* pref =
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs.FindPreference(prefs::kCloudPrintProxyEnabled);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(pref);
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::Value* value = pref->GetValue();
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(value);
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::Value::TYPE_BOOLEAN, value->GetType());
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool actual_bool_value = true;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(value->GetAsBoolean(&actual_bool_value));
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(actual_bool_value);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Change the command line.
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandLine cmd_line(CommandLine::NO_PROGRAM);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmd_line.AppendSwitch(switches::kEnableCloudPrintProxy);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Call UpdateCommandLinePrefStore and check to see if the value has changed.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs.UpdateCommandLinePrefStore(new CommandLinePrefStore(&cmd_line));
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref = prefs.FindPreference(prefs::kCloudPrintProxyEnabled);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(pref);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  value = pref->GetValue();
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(value);
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::Value::TYPE_BOOLEAN, value->GetType());
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  actual_bool_value = false;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(value->GetAsBoolean(&actual_bool_value));
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(actual_bool_value);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ChromePrefServiceUserFilePrefsTest : public testing::Test {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_dir_));
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    data_dir_ = data_dir_.AppendASCII("pref_service");
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_TRUE(base::PathExists(data_dir_));
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ClearListValue(PrefService* prefs, const char* key) {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ListPrefUpdate updater(prefs, key);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    updater->Clear();
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ClearDictionaryValue(PrefService* prefs, const char* key) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DictionaryPrefUpdate updater(prefs, key);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    updater->Clear();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The path to temporary directory used to contain the test operations.
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The path to the directory where the test data is stored.
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath data_dir_;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A message loop that we can use as the file thread message loop.
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop_;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ChromePrefServiceWebKitPrefs : public ChromeRenderViewHostTestHarness {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ChromeRenderViewHostTestHarness::SetUp();
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Supply our own profile so we use the correct profile data. The test
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // harness is not supposed to overwrite a profile if it's already created.
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set some (WebKit) user preferences.
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestingPrefServiceSyncable* pref_services =
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        profile()->GetTestingPrefService();
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pref_services->SetUserPref(prefs::kDefaultCharset,
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               new base::StringValue("utf8"));
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pref_services->SetUserPref(prefs::kWebKitDefaultFontSize,
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               new base::FundamentalValue(20));
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pref_services->SetUserPref(prefs::kWebKitTextAreasAreResizable,
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               new base::FundamentalValue(false));
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pref_services->SetUserPref(prefs::kWebKitUsesUniversalDetector,
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               new base::FundamentalValue(true));
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pref_services->SetUserPref("webkit.webprefs.foo",
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               new base::StringValue("bar"));
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests to see that webkit preferences are properly loaded and copied over
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to a WebPreferences object.
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ChromePrefServiceWebKitPrefs, PrefsCopied) {
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WebPreferences webkit_prefs =
1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      WebContentsTester::For(web_contents())->TestComputeWebkitPrefs();
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // These values have been overridden by the profile preferences.
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("UTF-8", webkit_prefs.default_encoding);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(20, webkit_prefs.default_font_size);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(webkit_prefs.text_areas_are_resizable);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(webkit_prefs.uses_universal_detector);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // These should still be the default values.
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char kDefaultFont[] = "Times";
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_CHROMEOS)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char kDefaultFont[] = "Tinos";
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char kDefaultFont[] = "Times New Roman";
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::ASCIIToUTF16(kDefaultFont),
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            webkit_prefs.standard_font_family_map[prefs::kWebKitCommonScript]);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(webkit_prefs.javascript_enabled);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
140