Home | History | Annotate | Download | only in profiles
      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/profiles/profile.h"
      6 
      7 #include <string>
      8 
      9 #include "base/prefs/pref_service.h"
     10 #include "build/build_config.h"
     11 #include "chrome/browser/chrome_notification_types.h"
     12 #include "chrome/browser/first_run/first_run.h"
     13 #include "chrome/browser/profiles/profile_manager.h"
     14 #include "chrome/browser/sync/profile_sync_service.h"
     15 #include "chrome/browser/sync/profile_sync_service_factory.h"
     16 #include "chrome/common/pref_names.h"
     17 #include "components/data_reduction_proxy/browser/data_reduction_proxy_prefs.h"
     18 #include "components/pref_registry/pref_registry_syncable.h"
     19 #include "components/sync_driver/sync_prefs.h"
     20 #include "content/public/browser/notification_service.h"
     21 #include "content/public/browser/notification_source.h"
     22 #include "content/public/browser/web_contents.h"
     23 #include "content/public/browser/web_ui.h"
     24 
     25 #if defined(OS_CHROMEOS)
     26 #include "base/command_line.h"
     27 #include "chrome/common/chrome_switches.h"
     28 #include "chromeos/chromeos_switches.h"
     29 #endif
     30 
     31 #if defined(OS_ANDROID) && defined(FULL_SAFE_BROWSING)
     32 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
     33 #endif
     34 
     35 #if defined(ENABLE_EXTENSIONS)
     36 #include "extensions/browser/pref_names.h"
     37 #endif
     38 
     39 Profile::Profile()
     40     : restored_last_session_(false),
     41       sent_destroyed_notification_(false),
     42       accessibility_pause_level_(0) {
     43 }
     44 
     45 Profile::~Profile() {
     46 }
     47 
     48 // static
     49 Profile* Profile::FromBrowserContext(content::BrowserContext* browser_context) {
     50   // This is safe; this is the only implementation of the browser context.
     51   return static_cast<Profile*>(browser_context);
     52 }
     53 
     54 // static
     55 Profile* Profile::FromWebUI(content::WebUI* web_ui) {
     56   return FromBrowserContext(web_ui->GetWebContents()->GetBrowserContext());
     57 }
     58 
     59 TestingProfile* Profile::AsTestingProfile() {
     60   return NULL;
     61 }
     62 
     63 Profile::Delegate::~Delegate() {
     64 }
     65 
     66 // static
     67 const char Profile::kProfileKey[] = "__PROFILE__";
     68 
     69 // static
     70 void Profile::RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
     71   registry->RegisterBooleanPref(
     72       prefs::kSearchSuggestEnabled,
     73       true,
     74       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
     75 #if defined(OS_ANDROID)
     76   registry->RegisterStringPref(
     77       prefs::kContextualSearchEnabled,
     78       std::string(),
     79       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
     80 #endif
     81   registry->RegisterBooleanPref(
     82       prefs::kSessionExitedCleanly,
     83       true,
     84       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
     85   registry->RegisterStringPref(
     86       prefs::kSessionExitType,
     87       std::string(),
     88       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
     89 #if defined(OS_ANDROID) && defined(FULL_SAFE_BROWSING)
     90   // During Finch trail, safe browsing should be turned off
     91   // by default, and not sync'ed with desktop.
     92   // If we want to enable safe browsing on Android, we will
     93   // need to remove this Android-specific code.
     94   registry->RegisterBooleanPref(
     95       prefs::kSafeBrowsingEnabled,
     96       SafeBrowsingService::IsEnabledByFieldTrial(),
     97       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
     98 #else
     99   registry->RegisterBooleanPref(
    100       prefs::kSafeBrowsingEnabled,
    101       true,
    102       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
    103 #endif
    104   registry->RegisterBooleanPref(
    105       prefs::kSafeBrowsingExtendedReportingEnabled,
    106       false,
    107       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    108   registry->RegisterBooleanPref(
    109       prefs::kSafeBrowsingProceedAnywayDisabled,
    110       false,
    111       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    112   registry->RegisterBooleanPref(
    113       prefs::kSafeBrowsingIncidentReportSent,
    114       false,
    115       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    116   registry->RegisterDictionaryPref(
    117       prefs::kSafeBrowsingIncidentsSent,
    118       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    119 #if defined(ENABLE_GOOGLE_NOW)
    120   registry->RegisterBooleanPref(
    121       prefs::kGoogleGeolocationAccessEnabled,
    122       false,
    123       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    124 #endif
    125   registry->RegisterBooleanPref(
    126       prefs::kDisableExtensions,
    127       false,
    128       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    129 #if defined(ENABLE_EXTENSIONS)
    130   registry->RegisterBooleanPref(
    131       extensions::pref_names::kAlertsInitialized,
    132       false,
    133       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    134 #endif
    135   registry->RegisterStringPref(
    136       prefs::kSelectFileLastDirectory,
    137       std::string(),
    138       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    139   registry->RegisterDoublePref(
    140       prefs::kDefaultZoomLevel,
    141       0.0,
    142       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    143   registry->RegisterDictionaryPref(
    144       prefs::kPerHostZoomLevels,
    145       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    146   registry->RegisterStringPref(
    147       prefs::kDefaultApps,
    148       "install",
    149       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    150   registry->RegisterBooleanPref(
    151       prefs::kSpeechRecognitionFilterProfanities,
    152       true,
    153       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    154   registry->RegisterIntegerPref(
    155       prefs::kProfileIconVersion,
    156       0,
    157       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    158 #if defined(OS_CHROMEOS)
    159   // TODO(dilmah): For OS_CHROMEOS we maintain kApplicationLocale in both
    160   // local state and user's profile.  For other platforms we maintain
    161   // kApplicationLocale only in local state.
    162   // In the future we may want to maintain kApplicationLocale
    163   // in user's profile for other platforms as well.
    164   registry->RegisterStringPref(
    165       prefs::kApplicationLocale,
    166       std::string(),
    167       user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF);
    168   registry->RegisterStringPref(
    169       prefs::kApplicationLocaleBackup,
    170       std::string(),
    171       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    172   registry->RegisterStringPref(
    173       prefs::kApplicationLocaleAccepted,
    174       std::string(),
    175       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    176   registry->RegisterStringPref(
    177       prefs::kCurrentWallpaperAppName,
    178       std::string(),
    179       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    180 #endif
    181 
    182 #if defined(OS_ANDROID)
    183   registry->RegisterBooleanPref(
    184       prefs::kDevToolsRemoteEnabled,
    185       false,
    186       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    187 #endif
    188 
    189   data_reduction_proxy::RegisterSyncableProfilePrefs(registry);
    190 
    191 #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) && !defined(OS_IOS)
    192   // Preferences related to the avatar bubble and user manager tutorials.
    193   registry->RegisterIntegerPref(
    194       prefs::kProfileAvatarTutorialShown,
    195       0,
    196       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    197 #endif
    198 }
    199 
    200 std::string Profile::GetDebugName() {
    201   std::string name = GetPath().BaseName().MaybeAsASCII();
    202   if (name.empty()) {
    203     name = "UnknownProfile";
    204   }
    205   return name;
    206 }
    207 
    208 bool Profile::IsGuestSession() const {
    209 #if defined(OS_CHROMEOS)
    210   static bool is_guest_session = CommandLine::ForCurrentProcess()->HasSwitch(
    211       chromeos::switches::kGuestSession);
    212   return is_guest_session;
    213 #else
    214   return GetPath() == ProfileManager::GetGuestProfilePath();
    215 #endif
    216 }
    217 
    218 bool Profile::IsNewProfile() {
    219   // The profile has been shut down if the prefs were loaded from disk, unless
    220   // first-run autoimport wrote them and reloaded the pref service.
    221   // TODO(dconnelly): revisit this when crbug.com/22142 (unifying the profile
    222   // import code) is fixed.
    223   return GetOriginalProfile()->GetPrefs()->GetInitializationStatus() ==
    224       PrefService::INITIALIZATION_STATUS_CREATED_NEW_PREF_STORE;
    225 }
    226 
    227 bool Profile::IsSyncAccessible() {
    228   if (ProfileSyncServiceFactory::HasProfileSyncService(this))
    229     return !ProfileSyncServiceFactory::GetForProfile(this)->IsManaged();
    230 
    231   // No ProfileSyncService created yet - we don't want to create one, so just
    232   // infer the accessible state by looking at prefs/command line flags.
    233   sync_driver::SyncPrefs prefs(GetPrefs());
    234   return ProfileSyncService::IsSyncEnabled() && !prefs.IsManaged();
    235 }
    236 
    237 void Profile::MaybeSendDestroyedNotification() {
    238   if (!sent_destroyed_notification_) {
    239     sent_destroyed_notification_ = true;
    240     content::NotificationService::current()->Notify(
    241         chrome::NOTIFICATION_PROFILE_DESTROYED,
    242         content::Source<Profile>(this),
    243         content::NotificationService::NoDetails());
    244   }
    245 }
    246 
    247 bool ProfileCompare::operator()(Profile* a, Profile* b) const {
    248   DCHECK(a && b);
    249   if (a->IsSameProfile(b))
    250     return false;
    251   return a->GetOriginalProfile() < b->GetOriginalProfile();
    252 }
    253