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