Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / profiles / profile.cc
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 }