1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/prefs/incognito_mode_prefs.h" 6 7#include "base/command_line.h" 8#include "base/logging.h" 9#include "base/prefs/pref_service.h" 10#include "chrome/browser/profiles/profile.h" 11#include "chrome/common/chrome_switches.h" 12#include "chrome/common/pref_names.h" 13#include "components/pref_registry/pref_registry_syncable.h" 14 15#if defined(OS_WIN) 16#include "base/win/metro.h" 17#endif // OS_WIN 18 19#if defined(OS_ANDROID) 20#include "chrome/browser/android/chromium_application.h" 21#endif // OS_ANDROID 22 23#if defined(OS_WIN) 24namespace { 25 26bool g_parental_control_on = false; 27 28} // empty namespace 29#endif // OS_WIN 30 31// static 32bool IncognitoModePrefs::IntToAvailability(int in_value, 33 Availability* out_value) { 34 if (in_value < 0 || in_value >= AVAILABILITY_NUM_TYPES) { 35 *out_value = ENABLED; 36 return false; 37 } 38 *out_value = static_cast<Availability>(in_value); 39 return true; 40} 41 42// static 43IncognitoModePrefs::Availability IncognitoModePrefs::GetAvailability( 44 const PrefService* pref_service) { 45 DCHECK(pref_service); 46 int pref_value = pref_service->GetInteger(prefs::kIncognitoModeAvailability); 47 Availability result = IncognitoModePrefs::ENABLED; 48 bool valid = IntToAvailability(pref_value, &result); 49 DCHECK(valid); 50 if (ArePlatformParentalControlsEnabled()) { 51 if (result == IncognitoModePrefs::FORCED) 52 LOG(ERROR) << "Ignoring FORCED incognito. Parental control logging on"; 53 return IncognitoModePrefs::DISABLED; 54 } 55 return result; 56} 57 58// static 59void IncognitoModePrefs::SetAvailability(PrefService* prefs, 60 const Availability availability) { 61 prefs->SetInteger(prefs::kIncognitoModeAvailability, availability); 62} 63 64// static 65void IncognitoModePrefs::RegisterProfilePrefs( 66 user_prefs::PrefRegistrySyncable* registry) { 67 registry->RegisterIntegerPref( 68 prefs::kIncognitoModeAvailability, 69 IncognitoModePrefs::ENABLED, 70 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 71} 72 73// static 74bool IncognitoModePrefs::ShouldLaunchIncognito( 75 const CommandLine& command_line, 76 const PrefService* prefs) { 77 Availability incognito_avail = GetAvailability(prefs); 78 return incognito_avail != IncognitoModePrefs::DISABLED && 79 (command_line.HasSwitch(switches::kIncognito) || 80 incognito_avail == IncognitoModePrefs::FORCED); 81} 82 83// static 84bool IncognitoModePrefs::CanOpenBrowser(Profile* profile) { 85 if (profile->IsGuestSession()) 86 return true; 87 88 switch (GetAvailability(profile->GetPrefs())) { 89 case IncognitoModePrefs::ENABLED: 90 return true; 91 92 case IncognitoModePrefs::DISABLED: 93 return !profile->IsOffTheRecord(); 94 95 case IncognitoModePrefs::FORCED: 96 return profile->IsOffTheRecord(); 97 98 default: 99 NOTREACHED(); 100 return false; 101 } 102} 103 104// static 105bool IncognitoModePrefs::ArePlatformParentalControlsEnabled() { 106#if defined(OS_WIN) 107 // Disable incognito mode windows if parental controls are on. This is only 108 // for Windows Vista and above. 109 return base::win::IsParentalControlActivityLoggingOn(); 110#elif defined(OS_ANDROID) 111 return chrome::android::ChromiumApplication::AreParentalControlsEnabled(); 112#else 113 return false; 114#endif 115} 116 117#if defined(OS_WIN) 118void IncognitoModePrefs::InitializePlatformParentalControls() { 119 g_parental_control_on = base::win::IsParentalControlActivityLoggingOn(); 120} 121#endif // OS_WIN 122 123bool IncognitoModePrefs::ArePlatformParentalControlsEnabledCached() { 124#if defined(OS_WIN) 125 return g_parental_control_on; 126#elif defined(OS_ANDROID) 127 return chrome::android::ChromiumApplication::AreParentalControlsEnabled(); 128#else 129 return false; 130#endif 131} 132 133