Index: chrome/browser/profiles/profile.cc |
=================================================================== |
--- chrome/browser/profiles/profile.cc (revision 98818) |
+++ chrome/browser/profiles/profile.cc (working copy) |
@@ -82,18 +82,6 @@ |
// Used to tag the first profile launched in a Chrome session. |
bool g_first_profile_launched = true; |
-void NotifyOTRProfileCreatedOnIOThread(void* original_profile, |
- void* otr_profile) { |
- ExtensionWebRequestEventRouter::GetInstance()->OnOTRProfileCreated( |
- original_profile, otr_profile); |
-} |
- |
-void NotifyOTRProfileDestroyedOnIOThread(void* original_profile, |
- void* otr_profile) { |
- ExtensionWebRequestEventRouter::GetInstance()->OnOTRProfileDestroyed( |
- original_profile, otr_profile); |
-} |
- |
} // namespace |
Profile::Profile() |
@@ -215,6 +203,7 @@ |
return name; |
} |
+// static |
bool Profile::IsGuestSession() { |
#if defined(OS_CHROMEOS) |
static bool is_guest_session = |
@@ -229,647 +218,3 @@ |
ProfileSyncService* syncService = GetProfileSyncService(); |
return syncService && !syncService->IsManaged(); |
} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// |
-// OffTheRecordProfileImpl is a profile subclass that wraps an existing profile |
-// to make it suitable for the incognito mode. |
-// |
-//////////////////////////////////////////////////////////////////////////////// |
-class OffTheRecordProfileImpl : public Profile, |
- public BrowserList::Observer { |
- public: |
- explicit OffTheRecordProfileImpl(Profile* real_profile) |
- : profile_(real_profile), |
- prefs_(real_profile->GetOffTheRecordPrefs()), |
- ALLOW_THIS_IN_INITIALIZER_LIST(io_data_(this)), |
- start_time_(Time::Now()) { |
- extension_process_manager_.reset(ExtensionProcessManager::Create(this)); |
- |
- BrowserList::AddObserver(this); |
- |
- ProfileDependencyManager::GetInstance()->CreateProfileServices(this, false); |
- |
- DCHECK_NE(IncognitoModePrefs::DISABLED, |
- IncognitoModePrefs::GetAvailability(real_profile->GetPrefs())); |
- |
- // TODO(oshima): Remove the need to eagerly initialize the request context |
- // getter. chromeos::OnlineAttempt is illegally trying to access this |
- // Profile member from a thread other than the UI thread, so we need to |
- // prevent a race. |
-#if defined(OS_CHROMEOS) |
- GetRequestContext(); |
-#endif // defined(OS_CHROMEOS) |
- |
- // Make the chrome//extension-icon/ resource available. |
- ExtensionIconSource* icon_source = new ExtensionIconSource(real_profile); |
- GetChromeURLDataManager()->AddDataSource(icon_source); |
- |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableFunction(&NotifyOTRProfileCreatedOnIOThread, profile_, this)); |
- } |
- |
- virtual ~OffTheRecordProfileImpl() { |
- NotificationService::current()->Notify( |
- chrome::NOTIFICATION_PROFILE_DESTROYED, Source<Profile>(this), |
- NotificationService::NoDetails()); |
- |
- ProfileDependencyManager::GetInstance()->DestroyProfileServices(this); |
- |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableFunction( |
- &NotifyOTRProfileDestroyedOnIOThread, profile_, this)); |
- |
- // Clean up all DB files/directories |
- if (db_tracker_) { |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
- NewRunnableMethod( |
- db_tracker_.get(), |
- &webkit_database::DatabaseTracker::Shutdown)); |
- } |
- |
- BrowserList::RemoveObserver(this); |
- |
- if (host_content_settings_map_) |
- host_content_settings_map_->ShutdownOnUIThread(); |
- |
- if (pref_proxy_config_tracker_) |
- pref_proxy_config_tracker_->DetachFromPrefService(); |
- |
- ExtensionService* extension_service = GetExtensionService(); |
- if (extension_service) { |
- ExtensionPrefs* extension_prefs = extension_service->extension_prefs(); |
- extension_prefs->ClearIncognitoSessionOnlyContentSettings(); |
- } |
- } |
- |
- virtual std::string GetProfileName() { |
- // Incognito profile should not return the profile name. |
- return std::string(); |
- } |
- |
- virtual FilePath GetPath() { return profile_->GetPath(); } |
- |
- virtual bool IsOffTheRecord() { |
- return true; |
- } |
- |
- virtual Profile* GetOffTheRecordProfile() { |
- return this; |
- } |
- |
- virtual void DestroyOffTheRecordProfile() { |
- // Suicide is bad! |
- NOTREACHED(); |
- } |
- |
- virtual bool HasOffTheRecordProfile() { |
- return true; |
- } |
- |
- virtual Profile* GetOriginalProfile() { |
- return profile_; |
- } |
- |
- virtual ChromeAppCacheService* GetAppCacheService() { |
- CreateQuotaManagerAndClients(); |
- return appcache_service_; |
- } |
- |
- virtual webkit_database::DatabaseTracker* GetDatabaseTracker() { |
- CreateQuotaManagerAndClients(); |
- return db_tracker_; |
- } |
- |
- virtual VisitedLinkMaster* GetVisitedLinkMaster() { |
- // We don't provide access to the VisitedLinkMaster when we're OffTheRecord |
- // because we don't want to leak the sites that the user has visited before. |
- return NULL; |
- } |
- |
- virtual ExtensionService* GetExtensionService() { |
- return GetOriginalProfile()->GetExtensionService(); |
- } |
- |
- virtual UserScriptMaster* GetUserScriptMaster() { |
- return GetOriginalProfile()->GetUserScriptMaster(); |
- } |
- |
- virtual ExtensionDevToolsManager* GetExtensionDevToolsManager() { |
- // TODO(mpcomplete): figure out whether we should return the original |
- // profile's version. |
- return NULL; |
- } |
- |
- virtual ExtensionProcessManager* GetExtensionProcessManager() { |
- return extension_process_manager_.get(); |
- } |
- |
- virtual ExtensionMessageService* GetExtensionMessageService() { |
- return GetOriginalProfile()->GetExtensionMessageService(); |
- } |
- |
- virtual ExtensionEventRouter* GetExtensionEventRouter() { |
- return GetOriginalProfile()->GetExtensionEventRouter(); |
- } |
- |
- virtual ExtensionSpecialStoragePolicy* GetExtensionSpecialStoragePolicy() { |
- return GetOriginalProfile()->GetExtensionSpecialStoragePolicy(); |
- } |
- |
- virtual SSLHostState* GetSSLHostState() { |
- if (!ssl_host_state_.get()) |
- ssl_host_state_.reset(new SSLHostState()); |
- |
- DCHECK(ssl_host_state_->CalledOnValidThread()); |
- return ssl_host_state_.get(); |
- } |
- |
- virtual net::TransportSecurityState* GetTransportSecurityState() { |
- if (!transport_security_state_.get()) { |
- transport_security_state_ = new net::TransportSecurityState( |
- CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
- switches::kHstsHosts)); |
- transport_security_loader_ = |
- new TransportSecurityPersister(true /* readonly */); |
- transport_security_loader_->Initialize(transport_security_state_.get(), |
- GetOriginalProfile()->GetPath()); |
- } |
- |
- return transport_security_state_.get(); |
- } |
- |
- virtual HistoryService* GetHistoryService(ServiceAccessType sat) { |
- if (sat == EXPLICIT_ACCESS) |
- return profile_->GetHistoryService(sat); |
- |
- NOTREACHED() << "This profile is OffTheRecord"; |
- return NULL; |
- } |
- |
- virtual HistoryService* GetHistoryServiceWithoutCreating() { |
- return profile_->GetHistoryServiceWithoutCreating(); |
- } |
- |
- virtual FaviconService* GetFaviconService(ServiceAccessType sat) { |
- if (sat == EXPLICIT_ACCESS) |
- return profile_->GetFaviconService(sat); |
- |
- NOTREACHED() << "This profile is OffTheRecord"; |
- return NULL; |
- } |
- |
- virtual AutocompleteClassifier* GetAutocompleteClassifier() { |
- return profile_->GetAutocompleteClassifier(); |
- } |
- |
- virtual history::ShortcutsBackend* GetShortcutsBackend() { |
- return NULL; |
- } |
- |
- virtual WebDataService* GetWebDataService(ServiceAccessType sat) { |
- if (sat == EXPLICIT_ACCESS) |
- return profile_->GetWebDataService(sat); |
- |
- NOTREACHED() << "This profile is OffTheRecord"; |
- return NULL; |
- } |
- |
- virtual WebDataService* GetWebDataServiceWithoutCreating() { |
- return profile_->GetWebDataServiceWithoutCreating(); |
- } |
- |
- virtual PasswordStore* GetPasswordStore(ServiceAccessType sat) { |
- if (sat == EXPLICIT_ACCESS) |
- return profile_->GetPasswordStore(sat); |
- |
- NOTREACHED() << "This profile is OffTheRecord"; |
- return NULL; |
- } |
- |
- virtual PrefService* GetPrefs() { |
- return prefs_; |
- } |
- |
- virtual PrefService* GetOffTheRecordPrefs() { |
- return prefs_; |
- } |
- |
- virtual TemplateURLFetcher* GetTemplateURLFetcher() { |
- return profile_->GetTemplateURLFetcher(); |
- } |
- |
- virtual DownloadManager* GetDownloadManager() { |
- if (!download_manager_.get()) { |
- download_manager_delegate_ = new ChromeDownloadManagerDelegate(this); |
- scoped_refptr<DownloadManager> dlm( |
- new DownloadManager(download_manager_delegate_, |
- g_browser_process->download_status_updater())); |
- dlm->Init(this); |
- download_manager_delegate_->SetDownloadManager(dlm); |
- download_manager_.swap(dlm); |
- } |
- return download_manager_.get(); |
- } |
- |
- virtual bool HasCreatedDownloadManager() const { |
- return (download_manager_.get() != NULL); |
- } |
- |
- virtual PersonalDataManager* GetPersonalDataManager() { |
- return NULL; |
- } |
- |
- virtual fileapi::FileSystemContext* GetFileSystemContext() { |
- CreateQuotaManagerAndClients(); |
- return file_system_context_.get(); |
- } |
- |
- virtual net::URLRequestContextGetter* GetRequestContext() { |
- return io_data_.GetMainRequestContextGetter(); |
- } |
- |
- virtual quota::QuotaManager* GetQuotaManager() { |
- CreateQuotaManagerAndClients(); |
- return quota_manager_.get(); |
- } |
- |
- virtual net::URLRequestContextGetter* GetRequestContextForRenderProcess( |
- int renderer_child_id) { |
- if (GetExtensionService()) { |
- const Extension* installed_app = GetExtensionService()-> |
- GetInstalledAppForRenderer(renderer_child_id); |
- if (installed_app != NULL && installed_app->is_storage_isolated() && |
- installed_app->HasAPIPermission( |
- ExtensionAPIPermission::kExperimental)) { |
- return GetRequestContextForIsolatedApp(installed_app->id()); |
- } |
- } |
- return GetRequestContext(); |
- } |
- |
- virtual net::URLRequestContextGetter* GetRequestContextForMedia() { |
- // In OTR mode, media request context is the same as the original one. |
- return io_data_.GetMainRequestContextGetter(); |
- } |
- |
- virtual net::URLRequestContextGetter* GetRequestContextForExtensions() { |
- return io_data_.GetExtensionsRequestContextGetter(); |
- } |
- |
- virtual net::URLRequestContextGetter* GetRequestContextForIsolatedApp( |
- const std::string& app_id) { |
- return io_data_.GetIsolatedAppRequestContextGetter(app_id); |
- } |
- |
- virtual const content::ResourceContext& GetResourceContext() { |
- return io_data_.GetResourceContext(); |
- } |
- |
- virtual net::SSLConfigService* GetSSLConfigService() { |
- return profile_->GetSSLConfigService(); |
- } |
- |
- virtual HostContentSettingsMap* GetHostContentSettingsMap() { |
- // Retrieve the host content settings map of the parent profile in order to |
- // ensure the preferences have been migrated. |
- profile_->GetHostContentSettingsMap(); |
- if (!host_content_settings_map_.get()) { |
- host_content_settings_map_ = new HostContentSettingsMap( |
- GetPrefs(), GetExtensionService(), true); |
- } |
- return host_content_settings_map_.get(); |
- } |
- |
- virtual HostZoomMap* GetHostZoomMap() { |
- if (!host_zoom_map_) |
- host_zoom_map_ = new HostZoomMap(); |
- return host_zoom_map_.get(); |
- } |
- |
- virtual GeolocationPermissionContext* GetGeolocationPermissionContext() { |
- return profile_->GetGeolocationPermissionContext(); |
- } |
- |
- virtual UserStyleSheetWatcher* GetUserStyleSheetWatcher() { |
- return profile_->GetUserStyleSheetWatcher(); |
- } |
- |
- virtual FindBarState* GetFindBarState() { |
- if (!find_bar_state_.get()) |
- find_bar_state_.reset(new FindBarState()); |
- return find_bar_state_.get(); |
- } |
- |
- virtual bool HasProfileSyncService() const { |
- // We never have a profile sync service. |
- return false; |
- } |
- |
- virtual bool DidLastSessionExitCleanly() { |
- return profile_->DidLastSessionExitCleanly(); |
- } |
- |
- virtual BookmarkModel* GetBookmarkModel() { |
- return profile_->GetBookmarkModel(); |
- } |
- |
- virtual ProtocolHandlerRegistry* GetProtocolHandlerRegistry() { |
- return profile_->GetProtocolHandlerRegistry(); |
- } |
- |
- virtual TokenService* GetTokenService() { |
- return NULL; |
- } |
- |
- virtual ProfileSyncService* GetProfileSyncService() { |
- return NULL; |
- } |
- |
- virtual ProfileSyncService* GetProfileSyncService( |
- const std::string& cros_user) { |
- return NULL; |
- } |
- |
- virtual bool IsSameProfile(Profile* profile) { |
- return (profile == this) || (profile == profile_); |
- } |
- |
- virtual Time GetStartTime() const { |
- return start_time_; |
- } |
- |
- virtual SpellCheckHost* GetSpellCheckHost() { |
- return profile_->GetSpellCheckHost(); |
- } |
- |
- virtual void ReinitializeSpellCheckHost(bool force) { |
- profile_->ReinitializeSpellCheckHost(force); |
- } |
- |
- virtual WebKitContext* GetWebKitContext() { |
- CreateQuotaManagerAndClients(); |
- return webkit_context_.get(); |
- } |
- |
- virtual history::TopSites* GetTopSitesWithoutCreating() { |
- return NULL; |
- } |
- |
- virtual history::TopSites* GetTopSites() { |
- return NULL; |
- } |
- |
- virtual void MarkAsCleanShutdown() { |
- } |
- |
- virtual void InitExtensions(bool extensions_enabled) { |
- NOTREACHED(); |
- } |
- |
- virtual void InitPromoResources() { |
- NOTREACHED(); |
- } |
- |
- virtual void InitRegisteredProtocolHandlers() { |
- NOTREACHED(); |
- } |
- |
- virtual FilePath last_selected_directory() { |
- const FilePath& directory = last_selected_directory_; |
- if (directory.empty()) { |
- return profile_->last_selected_directory(); |
- } |
- return directory; |
- } |
- |
- virtual void set_last_selected_directory(const FilePath& path) { |
- last_selected_directory_ = path; |
- } |
- |
-#if defined(OS_CHROMEOS) |
- virtual void SetupChromeOSEnterpriseExtensionObserver() { |
- profile_->SetupChromeOSEnterpriseExtensionObserver(); |
- } |
- |
- virtual void InitChromeOSPreferences() { |
- // The incognito profile shouldn't have Chrome OS's preferences. |
- // The preferences are associated with the regular user profile. |
- } |
-#endif // defined(OS_CHROMEOS) |
- |
- virtual void ExitedOffTheRecordMode() { |
- // DownloadManager is lazily created, so check before accessing it. |
- if (download_manager_.get()) { |
- // Drop our download manager so we forget about all the downloads made |
- // in incognito mode. |
- download_manager_->Shutdown(); |
- download_manager_ = NULL; |
- } |
- } |
- |
- virtual void OnBrowserAdded(const Browser* browser) { |
- } |
- |
- virtual void OnBrowserRemoved(const Browser* browser) { |
- if (BrowserList::GetBrowserCount(this) == 0) |
- ExitedOffTheRecordMode(); |
- } |
- |
- virtual ChromeBlobStorageContext* GetBlobStorageContext() { |
- if (!blob_storage_context_) { |
- blob_storage_context_ = new ChromeBlobStorageContext(); |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableMethod( |
- blob_storage_context_.get(), |
- &ChromeBlobStorageContext::InitializeOnIOThread)); |
- } |
- return blob_storage_context_; |
- } |
- |
- virtual ExtensionInfoMap* GetExtensionInfoMap() { |
- return profile_->GetExtensionInfoMap(); |
- } |
- |
- virtual ChromeURLDataManager* GetChromeURLDataManager() { |
- if (!chrome_url_data_manager_.get()) |
- chrome_url_data_manager_.reset(new ChromeURLDataManager( |
- io_data_.GetChromeURLDataManagerBackendGetter())); |
- return chrome_url_data_manager_.get(); |
- } |
- |
- virtual PromoCounter* GetInstantPromoCounter() { |
- return NULL; |
- } |
- |
-#if defined(OS_CHROMEOS) |
- virtual void ChangeAppLocale(const std::string& locale, AppLocaleChangedVia) { |
- } |
- virtual void OnLogin() { |
- } |
-#endif // defined(OS_CHROMEOS) |
- |
- virtual PrefProxyConfigTracker* GetProxyConfigTracker() { |
- if (!pref_proxy_config_tracker_) |
- pref_proxy_config_tracker_ = new PrefProxyConfigTracker(GetPrefs()); |
- |
- return pref_proxy_config_tracker_; |
- } |
- |
- virtual prerender::PrerenderManager* GetPrerenderManager() { |
- // We do not allow prerendering in OTR profiles at this point. |
- // TODO(tburkard): Figure out if we want to support this, and how, at some |
- // point in the future. |
- return NULL; |
- } |
- |
- private: |
- void CreateQuotaManagerAndClients() { |
- if (quota_manager_.get()) { |
- DCHECK(file_system_context_.get()); |
- DCHECK(db_tracker_.get()); |
- DCHECK(webkit_context_.get()); |
- return; |
- } |
- |
- // All of the clients have to be created and registered with the |
- // QuotaManager prior to the QuotaManger being used. So we do them |
- // all together here prior to handing out a reference to anything |
- // that utlizes the QuotaManager. |
- quota_manager_ = new quota::QuotaManager( |
- IsOffTheRecord(), |
- GetPath(), |
- BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO), |
- BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB), |
- GetExtensionSpecialStoragePolicy()); |
- |
- // Each consumer is responsible for registering its QuotaClient during |
- // its construction. |
- file_system_context_ = CreateFileSystemContext( |
- GetPath(), IsOffTheRecord(), |
- GetExtensionSpecialStoragePolicy(), |
- quota_manager_->proxy()); |
- db_tracker_ = new webkit_database::DatabaseTracker( |
- GetPath(), IsOffTheRecord(), false, GetExtensionSpecialStoragePolicy(), |
- quota_manager_->proxy(), |
- BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE)); |
- webkit_context_ = new WebKitContext( |
- IsOffTheRecord(), GetPath(), GetExtensionSpecialStoragePolicy(), |
- false, quota_manager_->proxy(), |
- BrowserThread::GetMessageLoopProxyForThread(BrowserThread::WEBKIT)); |
- appcache_service_ = new ChromeAppCacheService(quota_manager_->proxy()); |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- NewRunnableMethod( |
- appcache_service_.get(), |
- &ChromeAppCacheService::InitializeOnIOThread, |
- IsOffTheRecord() |
- ? FilePath() : GetPath().Append(chrome::kAppCacheDirname), |
- &GetResourceContext(), |
- make_scoped_refptr(GetExtensionSpecialStoragePolicy()))); |
- } |
- |
- NotificationRegistrar registrar_; |
- |
- // The real underlying profile. |
- Profile* profile_; |
- |
- // Weak pointer owned by |profile_|. |
- PrefService* prefs_; |
- |
- scoped_ptr<ExtensionProcessManager> extension_process_manager_; |
- |
- OffTheRecordProfileIOData::Handle io_data_; |
- |
- // Used so that Chrome code can influence how content module's DownloadManager |
- // functions. |
- scoped_refptr<ChromeDownloadManagerDelegate> download_manager_delegate_; |
- |
- // The download manager that only stores downloaded items in memory. |
- scoped_refptr<DownloadManager> download_manager_; |
- |
- // We use a non-persistent content settings map for OTR. |
- scoped_refptr<HostContentSettingsMap> host_content_settings_map_; |
- |
- // Use a separate zoom map for OTR. |
- scoped_refptr<HostZoomMap> host_zoom_map_; |
- |
- // Use a special WebKit context for OTR browsing. |
- scoped_refptr<WebKitContext> webkit_context_; |
- |
- // We don't want SSLHostState from the OTR profile to leak back to the main |
- // profile because then the main profile would learn some of the host names |
- // the user visited while OTR. |
- scoped_ptr<SSLHostState> ssl_host_state_; |
- |
- // Use a separate FindBarState so search terms do not leak back to the main |
- // profile. |
- scoped_ptr<FindBarState> find_bar_state_; |
- |
- // The TransportSecurityState that only stores enabled sites in memory. |
- scoped_refptr<net::TransportSecurityState> |
- transport_security_state_; |
- |
- // Time we were started. |
- Time start_time_; |
- |
- scoped_refptr<ChromeAppCacheService> appcache_service_; |
- |
- // The main database tracker for this profile. |
- // Should be used only on the file thread. |
- scoped_refptr<webkit_database::DatabaseTracker> db_tracker_; |
- |
- FilePath last_selected_directory_; |
- |
- scoped_refptr<ChromeBlobStorageContext> blob_storage_context_; |
- |
- // The file_system context for this profile. |
- scoped_refptr<fileapi::FileSystemContext> file_system_context_; |
- |
- scoped_refptr<PrefProxyConfigTracker> pref_proxy_config_tracker_; |
- |
- scoped_ptr<ChromeURLDataManager> chrome_url_data_manager_; |
- |
- scoped_refptr<quota::QuotaManager> quota_manager_; |
- |
- // Used read-only. |
- scoped_refptr<TransportSecurityPersister> transport_security_loader_; |
- |
- DISALLOW_COPY_AND_ASSIGN(OffTheRecordProfileImpl); |
-}; |
- |
-#if defined(OS_CHROMEOS) |
-// Special case of the OffTheRecordProfileImpl which is used while Guest |
-// session in CrOS. |
-class GuestSessionProfile : public OffTheRecordProfileImpl { |
- public: |
- explicit GuestSessionProfile(Profile* real_profile) |
- : OffTheRecordProfileImpl(real_profile) { |
- } |
- |
- virtual PersonalDataManager* GetPersonalDataManager() { |
- return GetOriginalProfile()->GetPersonalDataManager(); |
- } |
- |
- virtual void InitChromeOSPreferences() { |
- chromeos_preferences_.reset(new chromeos::Preferences()); |
- chromeos_preferences_->Init(GetPrefs()); |
- } |
- |
- private: |
- // The guest user should be able to customize Chrome OS preferences. |
- scoped_ptr<chromeos::Preferences> chromeos_preferences_; |
-}; |
-#endif |
- |
-Profile* Profile::CreateOffTheRecordProfile() { |
-#if defined(OS_CHROMEOS) |
- if (Profile::IsGuestSession()) |
- return new GuestSessionProfile(this); |
-#endif |
- return new OffTheRecordProfileImpl(this); |
-} |