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/browser/sync/sync_prefs.h" 17 #include "chrome/common/pref_names.h" 18 #include "components/user_prefs/pref_registry_syncable.h" 19 #include "content/public/browser/notification_service.h" 20 #include "content/public/browser/notification_source.h" 21 #include "content/public/browser/web_contents.h" 22 #include "content/public/browser/web_ui.h" 23 24 #if defined(OS_CHROMEOS) 25 #include "base/command_line.h" 26 #include "chrome/common/chrome_switches.h" 27 #include "chromeos/chromeos_switches.h" 28 #endif 29 30 Profile::Profile() 31 : restored_last_session_(false), 32 sent_destroyed_notification_(false), 33 accessibility_pause_level_(0) { 34 } 35 36 Profile::~Profile() { 37 } 38 39 // static 40 Profile* Profile::FromBrowserContext(content::BrowserContext* browser_context) { 41 // This is safe; this is the only implementation of the browser context. 42 return static_cast<Profile*>(browser_context); 43 } 44 45 // static 46 Profile* Profile::FromWebUI(content::WebUI* web_ui) { 47 return FromBrowserContext(web_ui->GetWebContents()->GetBrowserContext()); 48 } 49 50 TestingProfile* Profile::AsTestingProfile() { 51 return NULL; 52 } 53 54 Profile::Delegate::~Delegate() { 55 } 56 57 // static 58 const char Profile::kProfileKey[] = "__PROFILE__"; 59 60 // static 61 void Profile::RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { 62 registry->RegisterBooleanPref( 63 prefs::kSearchSuggestEnabled, 64 true, 65 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 66 registry->RegisterBooleanPref( 67 prefs::kSessionExitedCleanly, 68 true, 69 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 70 registry->RegisterStringPref( 71 prefs::kSessionExitType, 72 std::string(), 73 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 74 registry->RegisterBooleanPref( 75 prefs::kSafeBrowsingEnabled, 76 true, 77 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 78 registry->RegisterBooleanPref( 79 prefs::kSafeBrowsingReportingEnabled, 80 false, 81 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 82 registry->RegisterBooleanPref( 83 prefs::kSafeBrowsingProceedAnywayDisabled, 84 false, 85 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 86 #if defined(ENABLE_GOOGLE_NOW) 87 registry->RegisterBooleanPref( 88 prefs::kGoogleGeolocationAccessEnabled, 89 false, 90 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 91 #endif 92 registry->RegisterBooleanPref( 93 prefs::kDisableExtensions, 94 false, 95 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 96 registry->RegisterBooleanPref( 97 prefs::kExtensionAlertsInitializedPref, 98 false, 99 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 100 registry->RegisterStringPref( 101 prefs::kSelectFileLastDirectory, 102 std::string(), 103 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 104 registry->RegisterDoublePref( 105 prefs::kDefaultZoomLevel, 106 0.0, 107 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 108 registry->RegisterDictionaryPref( 109 prefs::kPerHostZoomLevels, 110 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 111 registry->RegisterStringPref( 112 prefs::kDefaultApps, 113 "install", 114 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 115 registry->RegisterBooleanPref( 116 prefs::kSpeechRecognitionFilterProfanities, 117 true, 118 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 119 registry->RegisterIntegerPref( 120 prefs::kProfileIconVersion, 121 0, 122 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 123 #if defined(OS_CHROMEOS) 124 // TODO(dilmah): For OS_CHROMEOS we maintain kApplicationLocale in both 125 // local state and user's profile. For other platforms we maintain 126 // kApplicationLocale only in local state. 127 // In the future we may want to maintain kApplicationLocale 128 // in user's profile for other platforms as well. 129 registry->RegisterStringPref( 130 prefs::kApplicationLocale, 131 std::string(), 132 user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF); 133 registry->RegisterStringPref( 134 prefs::kApplicationLocaleBackup, 135 std::string(), 136 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 137 registry->RegisterStringPref( 138 prefs::kApplicationLocaleAccepted, 139 std::string(), 140 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 141 #endif 142 143 #if defined(OS_ANDROID) 144 registry->RegisterBooleanPref( 145 prefs::kDevToolsRemoteEnabled, 146 false, 147 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 148 #endif 149 #if defined(OS_ANDROID) || defined(OS_IOS) 150 registry->RegisterBooleanPref( 151 prefs::kSpdyProxyAuthEnabled, 152 false, 153 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 154 registry->RegisterBooleanPref( 155 prefs::kSpdyProxyAuthWasEnabledBefore, 156 false, 157 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 158 159 #endif // defined(OS_ANDROID) || defined(OS_IOS) 160 } 161 162 163 std::string Profile::GetDebugName() { 164 std::string name = GetPath().BaseName().MaybeAsASCII(); 165 if (name.empty()) { 166 name = "UnknownProfile"; 167 } 168 return name; 169 } 170 171 bool Profile::IsGuestSession() const { 172 #if defined(OS_CHROMEOS) 173 static bool is_guest_session = CommandLine::ForCurrentProcess()->HasSwitch( 174 chromeos::switches::kGuestSession); 175 return is_guest_session; 176 #else 177 return GetPath() == ProfileManager::GetGuestProfilePath(); 178 #endif 179 } 180 181 bool Profile::IsNewProfile() { 182 // The profile has been shut down if the prefs were loaded from disk, unless 183 // first-run autoimport wrote them and reloaded the pref service. 184 // TODO(dconnelly): revisit this when crbug.com/22142 (unifying the profile 185 // import code) is fixed. 186 return GetOriginalProfile()->GetPrefs()->GetInitializationStatus() == 187 PrefService::INITIALIZATION_STATUS_CREATED_NEW_PREF_STORE; 188 } 189 190 bool Profile::IsSyncAccessible() { 191 if (ProfileSyncServiceFactory::HasProfileSyncService(this)) 192 return !ProfileSyncServiceFactory::GetForProfile(this)->IsManaged(); 193 194 // No ProfileSyncService created yet - we don't want to create one, so just 195 // infer the accessible state by looking at prefs/command line flags. 196 browser_sync::SyncPrefs prefs(GetPrefs()); 197 return ProfileSyncService::IsSyncEnabled() && !prefs.IsManaged(); 198 } 199 200 void Profile::MaybeSendDestroyedNotification() { 201 if (!sent_destroyed_notification_) { 202 sent_destroyed_notification_ = true; 203 content::NotificationService::current()->Notify( 204 chrome::NOTIFICATION_PROFILE_DESTROYED, 205 content::Source<Profile>(this), 206 content::NotificationService::NoDetails()); 207 } 208 } 209