Home | History | Annotate | Download | only in prefs
      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)
     24 namespace {
     25 
     26 bool g_parental_control_on = false;
     27 
     28 } // empty namespace
     29 #endif  // OS_WIN
     30 
     31 // static
     32 bool 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
     43 IncognitoModePrefs::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
     59 void IncognitoModePrefs::SetAvailability(PrefService* prefs,
     60                                          const Availability availability) {
     61   prefs->SetInteger(prefs::kIncognitoModeAvailability, availability);
     62 }
     63 
     64 // static
     65 void 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
     74 bool 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
     84 bool 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
    105 bool 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)
    118 void IncognitoModePrefs::InitializePlatformParentalControls() {
    119   g_parental_control_on = base::win::IsParentalControlActivityLoggingOn();
    120 }
    121 #endif // OS_WIN
    122 
    123 bool 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