• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 // This class gathers state related to a single user profile.
6 
7 #ifndef CHROME_BROWSER_PROFILES_PROFILE_H_
8 #define CHROME_BROWSER_PROFILES_PROFILE_H_
9 #pragma once
10 
11 #include "base/basictypes.h"
12 #include "base/logging.h"
13 #ifndef ANDROID
14 #include "chrome/common/extensions/extension.h"
15 #endif
16 
17 namespace base {
18 class Time;
19 }
20 
21 namespace content {
22 class ResourceContext;
23 }
24 
25 namespace fileapi {
26 class FileSystemContext;
27 class SandboxedFileSystemContext;
28 }
29 
30 namespace history {
31 class TopSites;
32 }
33 
34 namespace net {
35 class TransportSecurityState;
36 class SSLConfigService;
37 }
38 
39 namespace policy {
40 class ProfilePolicyConnector;
41 }
42 
43 namespace prerender {
44 class PrerenderManager;
45 }
46 
47 namespace webkit_database {
48 class DatabaseTracker;
49 }
50 
51 #ifdef ANDROID
52 struct UnloadedExtensionInfo {
53   enum Reason {
54     DISABLE,    // The extension is being disabled.
55     UPDATE,     // The extension is being updated to a newer version.
56     UNINSTALL,  // The extension is being uninstalled.
57   };
58 };
59 #endif
60 
61 class AutocompleteClassifier;
62 class BookmarkModel;
63 class BrowserSignin;
64 class ChromeAppCacheService;
65 class ChromeBlobStorageContext;
66 class ChromeURLDataManager;
67 class CloudPrintProxyService;
68 class DownloadManager;
69 class Extension;
70 class ExtensionDevToolsManager;
71 class ExtensionEventRouter;
72 class ExtensionInfoMap;
73 class ExtensionMessageService;
74 class ExtensionPrefValueMap;
75 class ExtensionProcessManager;
76 class ExtensionService;
77 class ExtensionSpecialStoragePolicy;
78 class FaviconService;
79 class FilePath;
80 class FindBarState;
81 class GeolocationContentSettingsMap;
82 class GeolocationPermissionContext;
83 class HistoryService;
84 class HostContentSettingsMap;
85 class HostZoomMap;
86 class NTPResourceCache;
87 class NavigationController;
88 class PasswordStore;
89 class PersonalDataManager;
90 class PrefProxyConfigTracker;
91 class PrefService;
92 class ProfileSyncFactory;
93 class ProfileSyncService;
94 class PromoCounter;
95 class ProtocolHandlerRegistry;
96 class SQLitePersistentCookieStore;
97 class SSLConfigServiceManager;
98 class SSLHostState;
99 class SessionService;
100 class SpellCheckHost;
101 class StatusTray;
102 class TabRestoreService;
103 class TemplateURLFetcher;
104 class TemplateURLModel;
105 class TokenService;
106 class TransportSecurityPersister;
107 class UserScriptMaster;
108 class UserStyleSheetWatcher;
109 class VisitedLinkEventListener;
110 class VisitedLinkMaster;
111 class WebDataService;
112 class WebKitContext;
113 class PromoResourceService;
114 
115 namespace net {
116 class URLRequestContextGetter;
117 }
118 
119 typedef intptr_t ProfileId;
120 
121 class Profile {
122  public:
123   // Profile services are accessed with the following parameter. This parameter
124   // defines what the caller plans to do with the service.
125   // The caller is responsible for not performing any operation that would
126   // result in persistent implicit records while using an OffTheRecord profile.
127   // This flag allows the profile to perform an additional check.
128   //
129   // It also gives us an opportunity to perform further checks in the future. We
130   // could, for example, return an history service that only allow some specific
131   // methods.
132   enum ServiceAccessType {
133     // The caller plans to perform a read or write that takes place as a result
134     // of the user input. Use this flag when the operation you are doing can be
135     // performed while incognito. (ex: creating a bookmark)
136     //
137     // Since EXPLICIT_ACCESS means "as a result of a user action", this request
138     // always succeeds.
139     EXPLICIT_ACCESS,
140 
141     // The caller plans to call a method that will permanently change some data
142     // in the profile, as part of Chrome's implicit data logging. Use this flag
143     // when you are about to perform an operation which is incompatible with the
144     // incognito mode.
145     IMPLICIT_ACCESS
146   };
147 
148   class Delegate {
149    public:
150     // Called when creation of the profile is finished.
151     virtual void OnProfileCreated(Profile* profile, bool success) = 0;
152 #ifdef ANDROID
~Delegate()153     virtual ~Delegate() {}
154 #endif
155   };
156 
157   // Key used to bind profile to the widget with which it is associated.
158   static const char* kProfileKey;
159 
160   // Value that represents no profile Id.
161   static const ProfileId kInvalidProfileId;
162 
163   Profile();
~Profile()164   virtual ~Profile() {}
165 
166   // Profile prefs are registered as soon as the prefs are loaded for the first
167   // time.
168   static void RegisterUserPrefs(PrefService* prefs);
169 
170   // Create a new profile given a path.
171   static Profile* CreateProfile(const FilePath& path);
172 
173   // Same as above, but uses async initialization.
174   static Profile* CreateProfileAsync(const FilePath& path,
175                                      Delegate* delegate);
176 
177   // Returns the request context for the "default" profile.  This may be called
178   // from any thread.  This CAN return NULL if a first request context has not
179   // yet been created.  If necessary, listen on the UI thread for
180   // NOTIFY_DEFAULT_REQUEST_CONTEXT_AVAILABLE.
181   static net::URLRequestContextGetter* GetDefaultRequestContext();
182 
183   // Returns a unique Id that can be used to identify this profile at runtime.
184   // This Id is not persistent and will not survive a restart of the browser.
185   virtual ProfileId GetRuntimeId() = 0;
186 
187   // Returns the path of the directory where this profile's data is stored.
188   virtual FilePath GetPath() = 0;
189 
190   // Return whether this profile is incognito. Default is false.
191   virtual bool IsOffTheRecord() = 0;
192 
193   // Return the incognito version of this profile. The returned pointer
194   // is owned by the receiving profile. If the receiving profile is off the
195   // record, the same profile is returned.
196   virtual Profile* GetOffTheRecordProfile() = 0;
197 
198   // Destroys the incognito profile.
199   virtual void DestroyOffTheRecordProfile() = 0;
200 
201   // True if an incognito profile exists.
202   virtual bool HasOffTheRecordProfile() = 0;
203 
204   // Return the original "recording" profile. This method returns this if the
205   // profile is not incognito.
206   virtual Profile* GetOriginalProfile() = 0;
207 
208   // Returns a pointer to the ChromeAppCacheService instance for this profile.
209   virtual ChromeAppCacheService* GetAppCacheService() = 0;
210 
211   // Returns a pointer to the DatabaseTracker instance for this profile.
212   virtual webkit_database::DatabaseTracker* GetDatabaseTracker() = 0;
213 
214   // Returns a pointer to the TopSites (thumbnail manager) instance
215   // for this profile.
216   virtual history::TopSites* GetTopSites() = 0;
217 
218   // Variant of GetTopSites that doesn't force creation.
219   virtual history::TopSites* GetTopSitesWithoutCreating() = 0;
220 
221   // Retrieves a pointer to the VisitedLinkMaster associated with this
222   // profile.  The VisitedLinkMaster is lazily created the first time
223   // that this method is called.
224   virtual VisitedLinkMaster* GetVisitedLinkMaster() = 0;
225 
226   // Retrieves a pointer to the ExtensionService associated with this
227   // profile. The ExtensionService is created at startup.
228   virtual ExtensionService* GetExtensionService() = 0;
229 
230   // Retrieves a pointer to the UserScriptMaster associated with this
231   // profile.  The UserScriptMaster is lazily created the first time
232   // that this method is called.
233   virtual UserScriptMaster* GetUserScriptMaster() = 0;
234 
235   // Retrieves a pointer to the ExtensionDevToolsManager associated with this
236   // profile.  The instance is created at startup.
237   virtual ExtensionDevToolsManager* GetExtensionDevToolsManager() = 0;
238 
239   // Retrieves a pointer to the ExtensionProcessManager associated with this
240   // profile.  The instance is created at startup.
241   virtual ExtensionProcessManager* GetExtensionProcessManager() = 0;
242 
243   // Retrieves a pointer to the ExtensionMessageService associated with this
244   // profile.  The instance is created at startup.
245   virtual ExtensionMessageService* GetExtensionMessageService() = 0;
246 
247   // Accessor. The instance is created at startup.
248   virtual ExtensionEventRouter* GetExtensionEventRouter() = 0;
249 
250   // Accessor. The instance is created upon first access.
251   virtual ExtensionSpecialStoragePolicy*
252       GetExtensionSpecialStoragePolicy() = 0;
253 
254   // Retrieves a pointer to the SSLHostState associated with this profile.
255   // The SSLHostState is lazily created the first time that this method is
256   // called.
257   virtual SSLHostState* GetSSLHostState() = 0;
258 
259   // Retrieves a pointer to the TransportSecurityState associated with
260   // this profile.  The TransportSecurityState is lazily created the
261   // first time that this method is called.
262   virtual net::TransportSecurityState* GetTransportSecurityState() = 0;
263 
264   // Retrieves a pointer to the FaviconService associated with this
265   // profile.  The FaviconService is lazily created the first time
266   // that this method is called.
267   //
268   // Although FaviconService is refcounted, this will not addref, and callers
269   // do not need to do any reference counting as long as they keep the pointer
270   // only for the local scope (which they should do anyway since the browser
271   // process may decide to shut down).
272   //
273   // |access| defines what the caller plans to do with the service. See
274   // the ServiceAccessType definition above.
275   virtual FaviconService* GetFaviconService(ServiceAccessType access) = 0;
276 
277   // Retrieves a pointer to the HistoryService associated with this
278   // profile.  The HistoryService is lazily created the first time
279   // that this method is called.
280   //
281   // Although HistoryService is refcounted, this will not addref, and callers
282   // do not need to do any reference counting as long as they keep the pointer
283   // only for the local scope (which they should do anyway since the browser
284   // process may decide to shut down).
285   //
286   // |access| defines what the caller plans to do with the service. See
287   // the ServiceAccessType definition above.
288   virtual HistoryService* GetHistoryService(ServiceAccessType access) = 0;
289 
290   // Similar to GetHistoryService(), but won't create the history service if it
291   // doesn't already exist.
292   virtual HistoryService* GetHistoryServiceWithoutCreating() = 0;
293 
294   // Retrieves a pointer to the AutocompleteClassifier associated with this
295   // profile. The AutocompleteClassifier is lazily created the first time that
296   // this method is called.
297   virtual AutocompleteClassifier* GetAutocompleteClassifier() = 0;
298 
299   // Returns the WebDataService for this profile. This is owned by
300   // the Profile. Callers that outlive the life of this profile need to be
301   // sure they refcount the returned value.
302   //
303   // |access| defines what the caller plans to do with the service. See
304   // the ServiceAccessType definition above.
305   virtual WebDataService* GetWebDataService(ServiceAccessType access) = 0;
306 
307   // Similar to GetWebDataService(), but won't create the web data service if it
308   // doesn't already exist.
309   virtual WebDataService* GetWebDataServiceWithoutCreating() = 0;
310 
311   // Returns the PasswordStore for this profile. This is owned by the Profile.
312   virtual PasswordStore* GetPasswordStore(ServiceAccessType access) = 0;
313 
314   // Retrieves a pointer to the PrefService that manages the preferences
315   // for this user profile.  The PrefService is lazily created the first
316   // time that this method is called.
317   virtual PrefService* GetPrefs() = 0;
318 
319   // Retrieves a pointer to the PrefService that manages the preferences
320   // for OffTheRecord Profiles.  This PrefService is lazily created the first
321   // time that this method is called.
322   virtual PrefService* GetOffTheRecordPrefs() = 0;
323 
324   // Returns the TemplateURLModel for this profile. This is owned by the
325   // the Profile.
326   virtual TemplateURLModel* GetTemplateURLModel() = 0;
327 
328   // Returns the TemplateURLFetcher for this profile. This is owned by the
329   // profile.
330   virtual TemplateURLFetcher* GetTemplateURLFetcher() = 0;
331 
332   // Returns the DownloadManager associated with this profile.
333   virtual DownloadManager* GetDownloadManager() = 0;
334   virtual bool HasCreatedDownloadManager() const = 0;
335 
336   // Returns the PersonalDataManager associated with this profile.
337   virtual PersonalDataManager* GetPersonalDataManager() = 0;
338 
339   // Returns the FileSystemContext associated to this profile.  The context
340   // is lazily created the first time this method is called.  This is owned
341   // by the profile.
342   virtual fileapi::FileSystemContext* GetFileSystemContext() = 0;
343 
344   // Returns the BrowserSignin object assigned to this profile.
345   virtual BrowserSignin* GetBrowserSignin() = 0;
346 
347   // Returns the request context information associated with this profile.  Call
348   // this only on the UI thread, since it can send notifications that should
349   // happen on the UI thread.
350   virtual net::URLRequestContextGetter* GetRequestContext() = 0;
351 
352   // Returns the request context appropriate for the given app. If installed_app
353   // is null or installed_app->is_storage_isolated() returns false, this is
354   // equivalent to calling GetRequestContext().
355   // TODO(creis): After isolated app storage is no longer an experimental
356   // feature, consider making this the default contract for GetRequestContext.
357   virtual net::URLRequestContextGetter* GetRequestContextForPossibleApp(
358       const Extension* installed_app) = 0;
359 
360   // Returns the request context for media resources asociated with this
361   // profile.
362   virtual net::URLRequestContextGetter* GetRequestContextForMedia() = 0;
363 
364   // Returns the request context used for extension-related requests.  This
365   // is only used for a separate cookie store currently.
366   virtual net::URLRequestContextGetter* GetRequestContextForExtensions() = 0;
367 
368   // Returns the request context used within an installed app that has
369   // requested isolated storage.
370   virtual net::URLRequestContextGetter* GetRequestContextForIsolatedApp(
371       const std::string& app_id) = 0;
372 
373 #ifndef ANDROID
374   virtual const content::ResourceContext& GetResourceContext() = 0;
375 #endif
376 
377   // Called by the ExtensionService that lives in this profile. Gives the
378   // profile a chance to react to the load event before the EXTENSION_LOADED
379   // notification has fired. The purpose for handling this event first is to
380   // avoid race conditions by making sure URLRequestContexts learn about new
381   // extensions before anything else needs them to know.
RegisterExtensionWithRequestContexts(const Extension * extension)382   virtual void RegisterExtensionWithRequestContexts(
383       const Extension* extension) {}
384 
385   // Called by the ExtensionService that lives in this profile. Lets the
386   // profile clean up its RequestContexts once all the listeners to the
387   // EXTENSION_UNLOADED notification have finished running.
UnregisterExtensionWithRequestContexts(const std::string & extension_id,const UnloadedExtensionInfo::Reason)388   virtual void UnregisterExtensionWithRequestContexts(
389       const std::string& extension_id,
390       const UnloadedExtensionInfo::Reason) {}
391 
392   // Returns the SSLConfigService for this profile.
393   virtual net::SSLConfigService* GetSSLConfigService() = 0;
394 
395   // Returns the Hostname <-> Content settings map for this profile.
396   virtual HostContentSettingsMap* GetHostContentSettingsMap() = 0;
397 
398   // Returns the Hostname <-> Zoom Level map for this profile.
399   virtual HostZoomMap* GetHostZoomMap() = 0;
400 
401   // Returns the geolocation settings map for this profile.
402   virtual GeolocationContentSettingsMap* GetGeolocationContentSettingsMap() = 0;
403 
404   // Returns the geolocation permission context for this profile.
405   virtual GeolocationPermissionContext* GetGeolocationPermissionContext() = 0;
406 
407   // Returns the user style sheet watcher.
408   virtual UserStyleSheetWatcher* GetUserStyleSheetWatcher() = 0;
409 
410   // Returns the find bar state for this profile.  The find bar state is lazily
411   // created the first time that this method is called.
412   virtual FindBarState* GetFindBarState() = 0;
413 
414   // Returns the session service for this profile. This may return NULL. If
415   // this profile supports a session service (it isn't incognito), and
416   // the session service hasn't yet been created, this forces creation of
417   // the session service.
418   //
419   // This returns NULL in two situations: the profile is incognito, or the
420   // session service has been explicitly shutdown (browser is exiting). Callers
421   // should always check the return value for NULL.
422   virtual SessionService* GetSessionService() = 0;
423 
424   // If this profile has a session service, it is shut down. To properly record
425   // the current state this forces creation of the session service, then shuts
426   // it down.
427   virtual void ShutdownSessionService() = 0;
428 
429   // Returns true if this profile has a session service.
430   virtual bool HasSessionService() const = 0;
431 
432   // Returns true if this profile has a profile sync service.
433   virtual bool HasProfileSyncService() const = 0;
434 
435   // Returns true if the last time this profile was open it was exited cleanly.
436   virtual bool DidLastSessionExitCleanly() = 0;
437 
438   // Returns the BookmarkModel, creating if not yet created.
439   virtual BookmarkModel* GetBookmarkModel() = 0;
440 
441   // Returns the ProtocolHandlerRegistry, creating if not yet created.
442   virtual ProtocolHandlerRegistry* GetProtocolHandlerRegistry() = 0;
443 
444   // Returns the Gaia Token Service, creating if not yet created.
445   virtual TokenService* GetTokenService() = 0;
446 
447   // Returns the ProfileSyncService, creating if not yet created.
448   virtual ProfileSyncService* GetProfileSyncService() = 0;
449 
450   // Returns the ProfileSyncService, creating if not yet created, with
451   // the specified CrOS username.
452   virtual ProfileSyncService* GetProfileSyncService(
453       const std::string& cros_user) = 0;
454 
455   // Returns the CloudPrintProxyService, creating if not yet created.
456   virtual CloudPrintProxyService* GetCloudPrintProxyService() = 0;
457 
458   // Return whether 2 profiles are the same. 2 profiles are the same if they
459   // represent the same profile. This can happen if there is pointer equality
460   // or if one profile is the incognito version of another profile (or vice
461   // versa).
462   virtual bool IsSameProfile(Profile* profile) = 0;
463 
464   // Returns the time the profile was started. This is not the time the profile
465   // was created, rather it is the time the user started chrome and logged into
466   // this profile. For the single profile case, this corresponds to the time
467   // the user started chrome.
468   virtual base::Time GetStartTime() const = 0;
469 
470   // Returns the TabRestoreService. This returns NULL when incognito.
471   virtual TabRestoreService* GetTabRestoreService() = 0;
472 
473   virtual void ResetTabRestoreService() = 0;
474 
475   // May return NULL.
476   virtual SpellCheckHost* GetSpellCheckHost() = 0;
477 
478   // If |force| is false, and the spellchecker is already initialized (or is in
479   // the process of initializing), then do nothing. Otherwise clobber the
480   // current spellchecker and replace it with a new one.
481   virtual void ReinitializeSpellCheckHost(bool force) = 0;
482 
483   // Returns the WebKitContext assigned to this profile.
484   virtual WebKitContext* GetWebKitContext() = 0;
485 
486   // Returns the StatusTray, which provides an API for displaying status icons
487   // in the system status tray. Returns NULL if status icons are not supported
488   // on this platform (or this is a unit test).
489   virtual StatusTray* GetStatusTray() = 0;
490 
491   // Marks the profile as cleanly shutdown.
492   //
493   // NOTE: this is invoked internally on a normal shutdown, but is public so
494   // that it can be invoked when the user logs out/powers down (WM_ENDSESSION).
495   virtual void MarkAsCleanShutdown() = 0;
496 
497   // Initializes extensions machinery.
498   // Component extensions are always enabled, external and user extensions
499   // are controlled by |extensions_enabled|.
500   virtual void InitExtensions(bool extensions_enabled) = 0;
501 
502   // Start up service that gathers data from a promo resource feed.
503   virtual void InitPromoResources() = 0;
504 
505   // Register URLRequestFactories for protocols registered with
506   // registerProtocolHandler.
507   virtual void InitRegisteredProtocolHandlers() = 0;
508 
509   // Returns the new tab page resource cache.
510   virtual NTPResourceCache* GetNTPResourceCache() = 0;
511 
512   // Returns the last directory that was chosen for uploading or opening a file.
513   virtual FilePath last_selected_directory() = 0;
514   virtual void set_last_selected_directory(const FilePath& path) = 0;
515 
516   // Returns a pointer to the ChromeBlobStorageContext instance for this
517   // profile.
518   virtual ChromeBlobStorageContext* GetBlobStorageContext() = 0;
519 
520   // Returns the IO-thread-accessible profile data for this profile.
521   virtual ExtensionInfoMap* GetExtensionInfoMap() = 0;
522 
523   // Returns the PromoCounter for Instant, or NULL if not applicable.
524   virtual PromoCounter* GetInstantPromoCounter() = 0;
525 
526   // Gets the policy connector associated with this profile.
527   virtual policy::ProfilePolicyConnector* GetPolicyConnector() = 0;
528 
529   // Returns the ChromeURLDataManager for this profile.
530   virtual ChromeURLDataManager* GetChromeURLDataManager() = 0;
531 
532 #if defined(OS_CHROMEOS)
533   enum AppLocaleChangedVia {
534     // Caused by chrome://settings change.
535     APP_LOCALE_CHANGED_VIA_SETTINGS,
536     // Locale has been reverted via LocaleChangeGuard.
537     APP_LOCALE_CHANGED_VIA_REVERT,
538     // From login screen.
539     APP_LOCALE_CHANGED_VIA_LOGIN,
540     // Source unknown.
541     APP_LOCALE_CHANGED_VIA_UNKNOWN
542   };
543 
544   // Changes application locale for a profile.
545   virtual void ChangeAppLocale(
546       const std::string& locale, AppLocaleChangedVia via) = 0;
547 
548   // Called after login.
549   virtual void OnLogin() = 0;
550 
551   // Creates ChromeOS's EnterpriseExtensionListener.
552   virtual void SetupChromeOSEnterpriseExtensionObserver() = 0;
553 
554   // Initializes Chrome OS's preferences.
555   virtual void InitChromeOSPreferences() = 0;
556 #endif  // defined(OS_CHROMEOS)
557 
558   // Returns the helper object that provides the proxy configuration service
559   // access to the the proxy configuration possibly defined by preferences.
560   virtual PrefProxyConfigTracker* GetProxyConfigTracker() = 0;
561 
562   // Returns the PrerenderManager used to prerender entire webpages for this
563   // profile.
564   virtual prerender::PrerenderManager* GetPrerenderManager() = 0;
565 
566   // Returns whether it is a guest session.
567   static bool IsGuestSession();
568 
569 #ifdef UNIT_TEST
570   // Use with caution.  GetDefaultRequestContext may be called on any thread!
set_default_request_context(net::URLRequestContextGetter * c)571   static void set_default_request_context(net::URLRequestContextGetter* c) {
572     default_request_context_ = c;
573   }
574 #endif
575 
576   // Did the user restore the last session? This is set by SessionRestore.
set_restored_last_session(bool restored_last_session)577   void set_restored_last_session(bool restored_last_session) {
578     restored_last_session_ = restored_last_session;
579   }
restored_last_session()580   bool restored_last_session() const {
581     return restored_last_session_;
582   }
583 
584   // Stop sending accessibility events until ResumeAccessibilityEvents().
585   // Calls to Pause nest; no events will be sent until the number of
586   // Resume calls matches the number of Pause calls received.
PauseAccessibilityEvents()587   void PauseAccessibilityEvents() {
588     accessibility_pause_level_++;
589   }
590 
ResumeAccessibilityEvents()591   void ResumeAccessibilityEvents() {
592     DCHECK(accessibility_pause_level_ > 0);
593     accessibility_pause_level_--;
594   }
595 
ShouldSendAccessibilityEvents()596   bool ShouldSendAccessibilityEvents() {
597     return 0 == accessibility_pause_level_;
598   }
599 
600   // Checks whether sync is configurable by the user. Returns false if sync is
601   // disabled or controlled by configuration management.
602   bool IsSyncAccessible();
603 
604   // Creates an OffTheRecordProfile which points to this Profile.
605   Profile* CreateOffTheRecordProfile();
606 
607  protected:
608   friend class OffTheRecordProfileImpl;
609 
610   static net::URLRequestContextGetter* default_request_context_;
611 
612  private:
613   bool restored_last_session_;
614 
615   // Accessibility events will only be propagated when the pause
616   // level is zero.  PauseAccessibilityEvents and ResumeAccessibilityEvents
617   // increment and decrement the level, respectively, rather than set it to
618   // true or false, so that calls can be nested.
619   int accessibility_pause_level_;
620 };
621 
622 #endif  // CHROME_BROWSER_PROFILES_PROFILE_H_
623