| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/profiles/profile.h" | 5 #include "chrome/browser/profiles/profile.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 | 75 |
| 76 // A pointer to the request context for the default profile. See comments on | 76 // A pointer to the request context for the default profile. See comments on |
| 77 // Profile::GetDefaultRequestContext. | 77 // Profile::GetDefaultRequestContext. |
| 78 net::URLRequestContextGetter* Profile::default_request_context_; | 78 net::URLRequestContextGetter* Profile::default_request_context_; |
| 79 | 79 |
| 80 namespace { | 80 namespace { |
| 81 | 81 |
| 82 // Used to tag the first profile launched in a Chrome session. | 82 // Used to tag the first profile launched in a Chrome session. |
| 83 bool g_first_profile_launched = true; | 83 bool g_first_profile_launched = true; |
| 84 | 84 |
| 85 void NotifyOTRProfileCreatedOnIOThread(void* original_profile, | |
| 86 void* otr_profile) { | |
| 87 ExtensionWebRequestEventRouter::GetInstance()->OnOTRProfileCreated( | |
| 88 original_profile, otr_profile); | |
| 89 } | |
| 90 | |
| 91 void NotifyOTRProfileDestroyedOnIOThread(void* original_profile, | |
| 92 void* otr_profile) { | |
| 93 ExtensionWebRequestEventRouter::GetInstance()->OnOTRProfileDestroyed( | |
| 94 original_profile, otr_profile); | |
| 95 } | |
| 96 | |
| 97 } // namespace | 85 } // namespace |
| 98 | 86 |
| 99 Profile::Profile() | 87 Profile::Profile() |
| 100 : restored_last_session_(false), | 88 : restored_last_session_(false), |
| 101 first_launched_(g_first_profile_launched), | 89 first_launched_(g_first_profile_launched), |
| 102 accessibility_pause_level_(0) { | 90 accessibility_pause_level_(0) { |
| 103 g_first_profile_launched = false; | 91 g_first_profile_launched = false; |
| 104 } | 92 } |
| 105 | 93 |
| 106 // static | 94 // static |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 } | 196 } |
| 209 | 197 |
| 210 std::string Profile::GetDebugName() { | 198 std::string Profile::GetDebugName() { |
| 211 std::string name = GetPath().BaseName().MaybeAsASCII(); | 199 std::string name = GetPath().BaseName().MaybeAsASCII(); |
| 212 if (name.empty()) { | 200 if (name.empty()) { |
| 213 name = "UnknownProfile"; | 201 name = "UnknownProfile"; |
| 214 } | 202 } |
| 215 return name; | 203 return name; |
| 216 } | 204 } |
| 217 | 205 |
| 206 // static |
| 218 bool Profile::IsGuestSession() { | 207 bool Profile::IsGuestSession() { |
| 219 #if defined(OS_CHROMEOS) | 208 #if defined(OS_CHROMEOS) |
| 220 static bool is_guest_session = | 209 static bool is_guest_session = |
| 221 CommandLine::ForCurrentProcess()->HasSwitch(switches::kGuestSession); | 210 CommandLine::ForCurrentProcess()->HasSwitch(switches::kGuestSession); |
| 222 return is_guest_session; | 211 return is_guest_session; |
| 223 #else | 212 #else |
| 224 return false; | 213 return false; |
| 225 #endif | 214 #endif |
| 226 } | 215 } |
| 227 | 216 |
| 228 bool Profile::IsSyncAccessible() { | 217 bool Profile::IsSyncAccessible() { |
| 229 ProfileSyncService* syncService = GetProfileSyncService(); | 218 ProfileSyncService* syncService = GetProfileSyncService(); |
| 230 return syncService && !syncService->IsManaged(); | 219 return syncService && !syncService->IsManaged(); |
| 231 } | 220 } |
| 232 | |
| 233 //////////////////////////////////////////////////////////////////////////////// | |
| 234 // | |
| 235 // OffTheRecordProfileImpl is a profile subclass that wraps an existing profile | |
| 236 // to make it suitable for the incognito mode. | |
| 237 // | |
| 238 //////////////////////////////////////////////////////////////////////////////// | |
| 239 class OffTheRecordProfileImpl : public Profile, | |
| 240 public BrowserList::Observer { | |
| 241 public: | |
| 242 explicit OffTheRecordProfileImpl(Profile* real_profile) | |
| 243 : profile_(real_profile), | |
| 244 prefs_(real_profile->GetOffTheRecordPrefs()), | |
| 245 ALLOW_THIS_IN_INITIALIZER_LIST(io_data_(this)), | |
| 246 start_time_(Time::Now()) { | |
| 247 extension_process_manager_.reset(ExtensionProcessManager::Create(this)); | |
| 248 | |
| 249 BrowserList::AddObserver(this); | |
| 250 | |
| 251 ProfileDependencyManager::GetInstance()->CreateProfileServices(this, false); | |
| 252 | |
| 253 DCHECK_NE(IncognitoModePrefs::DISABLED, | |
| 254 IncognitoModePrefs::GetAvailability(real_profile->GetPrefs())); | |
| 255 | |
| 256 // TODO(oshima): Remove the need to eagerly initialize the request context | |
| 257 // getter. chromeos::OnlineAttempt is illegally trying to access this | |
| 258 // Profile member from a thread other than the UI thread, so we need to | |
| 259 // prevent a race. | |
| 260 #if defined(OS_CHROMEOS) | |
| 261 GetRequestContext(); | |
| 262 #endif // defined(OS_CHROMEOS) | |
| 263 | |
| 264 // Make the chrome//extension-icon/ resource available. | |
| 265 ExtensionIconSource* icon_source = new ExtensionIconSource(real_profile); | |
| 266 GetChromeURLDataManager()->AddDataSource(icon_source); | |
| 267 | |
| 268 BrowserThread::PostTask( | |
| 269 BrowserThread::IO, FROM_HERE, | |
| 270 NewRunnableFunction(&NotifyOTRProfileCreatedOnIOThread, profile_, this)); | |
| 271 } | |
| 272 | |
| 273 virtual ~OffTheRecordProfileImpl() { | |
| 274 NotificationService::current()->Notify( | |
| 275 chrome::NOTIFICATION_PROFILE_DESTROYED, Source<Profile>(this), | |
| 276 NotificationService::NoDetails()); | |
| 277 | |
| 278 ProfileDependencyManager::GetInstance()->DestroyProfileServices(this); | |
| 279 | |
| 280 BrowserThread::PostTask( | |
| 281 BrowserThread::IO, FROM_HERE, | |
| 282 NewRunnableFunction( | |
| 283 &NotifyOTRProfileDestroyedOnIOThread, profile_, this)); | |
| 284 | |
| 285 // Clean up all DB files/directories | |
| 286 if (db_tracker_) { | |
| 287 BrowserThread::PostTask( | |
| 288 BrowserThread::FILE, FROM_HERE, | |
| 289 NewRunnableMethod( | |
| 290 db_tracker_.get(), | |
| 291 &webkit_database::DatabaseTracker::Shutdown)); | |
| 292 } | |
| 293 | |
| 294 BrowserList::RemoveObserver(this); | |
| 295 | |
| 296 if (host_content_settings_map_) | |
| 297 host_content_settings_map_->ShutdownOnUIThread(); | |
| 298 | |
| 299 if (pref_proxy_config_tracker_) | |
| 300 pref_proxy_config_tracker_->DetachFromPrefService(); | |
| 301 | |
| 302 ExtensionService* extension_service = GetExtensionService(); | |
| 303 if (extension_service) { | |
| 304 ExtensionPrefs* extension_prefs = extension_service->extension_prefs(); | |
| 305 extension_prefs->ClearIncognitoSessionOnlyContentSettings(); | |
| 306 } | |
| 307 } | |
| 308 | |
| 309 virtual std::string GetProfileName() { | |
| 310 // Incognito profile should not return the profile name. | |
| 311 return std::string(); | |
| 312 } | |
| 313 | |
| 314 virtual FilePath GetPath() { return profile_->GetPath(); } | |
| 315 | |
| 316 virtual bool IsOffTheRecord() { | |
| 317 return true; | |
| 318 } | |
| 319 | |
| 320 virtual Profile* GetOffTheRecordProfile() { | |
| 321 return this; | |
| 322 } | |
| 323 | |
| 324 virtual void DestroyOffTheRecordProfile() { | |
| 325 // Suicide is bad! | |
| 326 NOTREACHED(); | |
| 327 } | |
| 328 | |
| 329 virtual bool HasOffTheRecordProfile() { | |
| 330 return true; | |
| 331 } | |
| 332 | |
| 333 virtual Profile* GetOriginalProfile() { | |
| 334 return profile_; | |
| 335 } | |
| 336 | |
| 337 virtual ChromeAppCacheService* GetAppCacheService() { | |
| 338 CreateQuotaManagerAndClients(); | |
| 339 return appcache_service_; | |
| 340 } | |
| 341 | |
| 342 virtual webkit_database::DatabaseTracker* GetDatabaseTracker() { | |
| 343 CreateQuotaManagerAndClients(); | |
| 344 return db_tracker_; | |
| 345 } | |
| 346 | |
| 347 virtual VisitedLinkMaster* GetVisitedLinkMaster() { | |
| 348 // We don't provide access to the VisitedLinkMaster when we're OffTheRecord | |
| 349 // because we don't want to leak the sites that the user has visited before. | |
| 350 return NULL; | |
| 351 } | |
| 352 | |
| 353 virtual ExtensionService* GetExtensionService() { | |
| 354 return GetOriginalProfile()->GetExtensionService(); | |
| 355 } | |
| 356 | |
| 357 virtual UserScriptMaster* GetUserScriptMaster() { | |
| 358 return GetOriginalProfile()->GetUserScriptMaster(); | |
| 359 } | |
| 360 | |
| 361 virtual ExtensionDevToolsManager* GetExtensionDevToolsManager() { | |
| 362 // TODO(mpcomplete): figure out whether we should return the original | |
| 363 // profile's version. | |
| 364 return NULL; | |
| 365 } | |
| 366 | |
| 367 virtual ExtensionProcessManager* GetExtensionProcessManager() { | |
| 368 return extension_process_manager_.get(); | |
| 369 } | |
| 370 | |
| 371 virtual ExtensionMessageService* GetExtensionMessageService() { | |
| 372 return GetOriginalProfile()->GetExtensionMessageService(); | |
| 373 } | |
| 374 | |
| 375 virtual ExtensionEventRouter* GetExtensionEventRouter() { | |
| 376 return GetOriginalProfile()->GetExtensionEventRouter(); | |
| 377 } | |
| 378 | |
| 379 virtual ExtensionSpecialStoragePolicy* GetExtensionSpecialStoragePolicy() { | |
| 380 return GetOriginalProfile()->GetExtensionSpecialStoragePolicy(); | |
| 381 } | |
| 382 | |
| 383 virtual SSLHostState* GetSSLHostState() { | |
| 384 if (!ssl_host_state_.get()) | |
| 385 ssl_host_state_.reset(new SSLHostState()); | |
| 386 | |
| 387 DCHECK(ssl_host_state_->CalledOnValidThread()); | |
| 388 return ssl_host_state_.get(); | |
| 389 } | |
| 390 | |
| 391 virtual net::TransportSecurityState* GetTransportSecurityState() { | |
| 392 if (!transport_security_state_.get()) { | |
| 393 transport_security_state_ = new net::TransportSecurityState( | |
| 394 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | |
| 395 switches::kHstsHosts)); | |
| 396 transport_security_loader_ = | |
| 397 new TransportSecurityPersister(true /* readonly */); | |
| 398 transport_security_loader_->Initialize(transport_security_state_.get(), | |
| 399 GetOriginalProfile()->GetPath()); | |
| 400 } | |
| 401 | |
| 402 return transport_security_state_.get(); | |
| 403 } | |
| 404 | |
| 405 virtual HistoryService* GetHistoryService(ServiceAccessType sat) { | |
| 406 if (sat == EXPLICIT_ACCESS) | |
| 407 return profile_->GetHistoryService(sat); | |
| 408 | |
| 409 NOTREACHED() << "This profile is OffTheRecord"; | |
| 410 return NULL; | |
| 411 } | |
| 412 | |
| 413 virtual HistoryService* GetHistoryServiceWithoutCreating() { | |
| 414 return profile_->GetHistoryServiceWithoutCreating(); | |
| 415 } | |
| 416 | |
| 417 virtual FaviconService* GetFaviconService(ServiceAccessType sat) { | |
| 418 if (sat == EXPLICIT_ACCESS) | |
| 419 return profile_->GetFaviconService(sat); | |
| 420 | |
| 421 NOTREACHED() << "This profile is OffTheRecord"; | |
| 422 return NULL; | |
| 423 } | |
| 424 | |
| 425 virtual AutocompleteClassifier* GetAutocompleteClassifier() { | |
| 426 return profile_->GetAutocompleteClassifier(); | |
| 427 } | |
| 428 | |
| 429 virtual history::ShortcutsBackend* GetShortcutsBackend() { | |
| 430 return NULL; | |
| 431 } | |
| 432 | |
| 433 virtual WebDataService* GetWebDataService(ServiceAccessType sat) { | |
| 434 if (sat == EXPLICIT_ACCESS) | |
| 435 return profile_->GetWebDataService(sat); | |
| 436 | |
| 437 NOTREACHED() << "This profile is OffTheRecord"; | |
| 438 return NULL; | |
| 439 } | |
| 440 | |
| 441 virtual WebDataService* GetWebDataServiceWithoutCreating() { | |
| 442 return profile_->GetWebDataServiceWithoutCreating(); | |
| 443 } | |
| 444 | |
| 445 virtual PasswordStore* GetPasswordStore(ServiceAccessType sat) { | |
| 446 if (sat == EXPLICIT_ACCESS) | |
| 447 return profile_->GetPasswordStore(sat); | |
| 448 | |
| 449 NOTREACHED() << "This profile is OffTheRecord"; | |
| 450 return NULL; | |
| 451 } | |
| 452 | |
| 453 virtual PrefService* GetPrefs() { | |
| 454 return prefs_; | |
| 455 } | |
| 456 | |
| 457 virtual PrefService* GetOffTheRecordPrefs() { | |
| 458 return prefs_; | |
| 459 } | |
| 460 | |
| 461 virtual TemplateURLFetcher* GetTemplateURLFetcher() { | |
| 462 return profile_->GetTemplateURLFetcher(); | |
| 463 } | |
| 464 | |
| 465 virtual DownloadManager* GetDownloadManager() { | |
| 466 if (!download_manager_.get()) { | |
| 467 download_manager_delegate_ = new ChromeDownloadManagerDelegate(this); | |
| 468 scoped_refptr<DownloadManager> dlm( | |
| 469 new DownloadManager(download_manager_delegate_, | |
| 470 g_browser_process->download_status_updater())); | |
| 471 dlm->Init(this); | |
| 472 download_manager_delegate_->SetDownloadManager(dlm); | |
| 473 download_manager_.swap(dlm); | |
| 474 } | |
| 475 return download_manager_.get(); | |
| 476 } | |
| 477 | |
| 478 virtual bool HasCreatedDownloadManager() const { | |
| 479 return (download_manager_.get() != NULL); | |
| 480 } | |
| 481 | |
| 482 virtual PersonalDataManager* GetPersonalDataManager() { | |
| 483 return NULL; | |
| 484 } | |
| 485 | |
| 486 virtual fileapi::FileSystemContext* GetFileSystemContext() { | |
| 487 CreateQuotaManagerAndClients(); | |
| 488 return file_system_context_.get(); | |
| 489 } | |
| 490 | |
| 491 virtual net::URLRequestContextGetter* GetRequestContext() { | |
| 492 return io_data_.GetMainRequestContextGetter(); | |
| 493 } | |
| 494 | |
| 495 virtual quota::QuotaManager* GetQuotaManager() { | |
| 496 CreateQuotaManagerAndClients(); | |
| 497 return quota_manager_.get(); | |
| 498 } | |
| 499 | |
| 500 virtual net::URLRequestContextGetter* GetRequestContextForRenderProcess( | |
| 501 int renderer_child_id) { | |
| 502 if (GetExtensionService()) { | |
| 503 const Extension* installed_app = GetExtensionService()-> | |
| 504 GetInstalledAppForRenderer(renderer_child_id); | |
| 505 if (installed_app != NULL && installed_app->is_storage_isolated() && | |
| 506 installed_app->HasAPIPermission( | |
| 507 ExtensionAPIPermission::kExperimental)) { | |
| 508 return GetRequestContextForIsolatedApp(installed_app->id()); | |
| 509 } | |
| 510 } | |
| 511 return GetRequestContext(); | |
| 512 } | |
| 513 | |
| 514 virtual net::URLRequestContextGetter* GetRequestContextForMedia() { | |
| 515 // In OTR mode, media request context is the same as the original one. | |
| 516 return io_data_.GetMainRequestContextGetter(); | |
| 517 } | |
| 518 | |
| 519 virtual net::URLRequestContextGetter* GetRequestContextForExtensions() { | |
| 520 return io_data_.GetExtensionsRequestContextGetter(); | |
| 521 } | |
| 522 | |
| 523 virtual net::URLRequestContextGetter* GetRequestContextForIsolatedApp( | |
| 524 const std::string& app_id) { | |
| 525 return io_data_.GetIsolatedAppRequestContextGetter(app_id); | |
| 526 } | |
| 527 | |
| 528 virtual const content::ResourceContext& GetResourceContext() { | |
| 529 return io_data_.GetResourceContext(); | |
| 530 } | |
| 531 | |
| 532 virtual net::SSLConfigService* GetSSLConfigService() { | |
| 533 return profile_->GetSSLConfigService(); | |
| 534 } | |
| 535 | |
| 536 virtual HostContentSettingsMap* GetHostContentSettingsMap() { | |
| 537 // Retrieve the host content settings map of the parent profile in order to | |
| 538 // ensure the preferences have been migrated. | |
| 539 profile_->GetHostContentSettingsMap(); | |
| 540 if (!host_content_settings_map_.get()) { | |
| 541 host_content_settings_map_ = new HostContentSettingsMap( | |
| 542 GetPrefs(), GetExtensionService(), true); | |
| 543 } | |
| 544 return host_content_settings_map_.get(); | |
| 545 } | |
| 546 | |
| 547 virtual HostZoomMap* GetHostZoomMap() { | |
| 548 if (!host_zoom_map_) | |
| 549 host_zoom_map_ = new HostZoomMap(); | |
| 550 return host_zoom_map_.get(); | |
| 551 } | |
| 552 | |
| 553 virtual GeolocationPermissionContext* GetGeolocationPermissionContext() { | |
| 554 return profile_->GetGeolocationPermissionContext(); | |
| 555 } | |
| 556 | |
| 557 virtual UserStyleSheetWatcher* GetUserStyleSheetWatcher() { | |
| 558 return profile_->GetUserStyleSheetWatcher(); | |
| 559 } | |
| 560 | |
| 561 virtual FindBarState* GetFindBarState() { | |
| 562 if (!find_bar_state_.get()) | |
| 563 find_bar_state_.reset(new FindBarState()); | |
| 564 return find_bar_state_.get(); | |
| 565 } | |
| 566 | |
| 567 virtual bool HasProfileSyncService() const { | |
| 568 // We never have a profile sync service. | |
| 569 return false; | |
| 570 } | |
| 571 | |
| 572 virtual bool DidLastSessionExitCleanly() { | |
| 573 return profile_->DidLastSessionExitCleanly(); | |
| 574 } | |
| 575 | |
| 576 virtual BookmarkModel* GetBookmarkModel() { | |
| 577 return profile_->GetBookmarkModel(); | |
| 578 } | |
| 579 | |
| 580 virtual ProtocolHandlerRegistry* GetProtocolHandlerRegistry() { | |
| 581 return profile_->GetProtocolHandlerRegistry(); | |
| 582 } | |
| 583 | |
| 584 virtual TokenService* GetTokenService() { | |
| 585 return NULL; | |
| 586 } | |
| 587 | |
| 588 virtual ProfileSyncService* GetProfileSyncService() { | |
| 589 return NULL; | |
| 590 } | |
| 591 | |
| 592 virtual ProfileSyncService* GetProfileSyncService( | |
| 593 const std::string& cros_user) { | |
| 594 return NULL; | |
| 595 } | |
| 596 | |
| 597 virtual bool IsSameProfile(Profile* profile) { | |
| 598 return (profile == this) || (profile == profile_); | |
| 599 } | |
| 600 | |
| 601 virtual Time GetStartTime() const { | |
| 602 return start_time_; | |
| 603 } | |
| 604 | |
| 605 virtual SpellCheckHost* GetSpellCheckHost() { | |
| 606 return profile_->GetSpellCheckHost(); | |
| 607 } | |
| 608 | |
| 609 virtual void ReinitializeSpellCheckHost(bool force) { | |
| 610 profile_->ReinitializeSpellCheckHost(force); | |
| 611 } | |
| 612 | |
| 613 virtual WebKitContext* GetWebKitContext() { | |
| 614 CreateQuotaManagerAndClients(); | |
| 615 return webkit_context_.get(); | |
| 616 } | |
| 617 | |
| 618 virtual history::TopSites* GetTopSitesWithoutCreating() { | |
| 619 return NULL; | |
| 620 } | |
| 621 | |
| 622 virtual history::TopSites* GetTopSites() { | |
| 623 return NULL; | |
| 624 } | |
| 625 | |
| 626 virtual void MarkAsCleanShutdown() { | |
| 627 } | |
| 628 | |
| 629 virtual void InitExtensions(bool extensions_enabled) { | |
| 630 NOTREACHED(); | |
| 631 } | |
| 632 | |
| 633 virtual void InitPromoResources() { | |
| 634 NOTREACHED(); | |
| 635 } | |
| 636 | |
| 637 virtual void InitRegisteredProtocolHandlers() { | |
| 638 NOTREACHED(); | |
| 639 } | |
| 640 | |
| 641 virtual FilePath last_selected_directory() { | |
| 642 const FilePath& directory = last_selected_directory_; | |
| 643 if (directory.empty()) { | |
| 644 return profile_->last_selected_directory(); | |
| 645 } | |
| 646 return directory; | |
| 647 } | |
| 648 | |
| 649 virtual void set_last_selected_directory(const FilePath& path) { | |
| 650 last_selected_directory_ = path; | |
| 651 } | |
| 652 | |
| 653 #if defined(OS_CHROMEOS) | |
| 654 virtual void SetupChromeOSEnterpriseExtensionObserver() { | |
| 655 profile_->SetupChromeOSEnterpriseExtensionObserver(); | |
| 656 } | |
| 657 | |
| 658 virtual void InitChromeOSPreferences() { | |
| 659 // The incognito profile shouldn't have Chrome OS's preferences. | |
| 660 // The preferences are associated with the regular user profile. | |
| 661 } | |
| 662 #endif // defined(OS_CHROMEOS) | |
| 663 | |
| 664 virtual void ExitedOffTheRecordMode() { | |
| 665 // DownloadManager is lazily created, so check before accessing it. | |
| 666 if (download_manager_.get()) { | |
| 667 // Drop our download manager so we forget about all the downloads made | |
| 668 // in incognito mode. | |
| 669 download_manager_->Shutdown(); | |
| 670 download_manager_ = NULL; | |
| 671 } | |
| 672 } | |
| 673 | |
| 674 virtual void OnBrowserAdded(const Browser* browser) { | |
| 675 } | |
| 676 | |
| 677 virtual void OnBrowserRemoved(const Browser* browser) { | |
| 678 if (BrowserList::GetBrowserCount(this) == 0) | |
| 679 ExitedOffTheRecordMode(); | |
| 680 } | |
| 681 | |
| 682 virtual ChromeBlobStorageContext* GetBlobStorageContext() { | |
| 683 if (!blob_storage_context_) { | |
| 684 blob_storage_context_ = new ChromeBlobStorageContext(); | |
| 685 BrowserThread::PostTask( | |
| 686 BrowserThread::IO, FROM_HERE, | |
| 687 NewRunnableMethod( | |
| 688 blob_storage_context_.get(), | |
| 689 &ChromeBlobStorageContext::InitializeOnIOThread)); | |
| 690 } | |
| 691 return blob_storage_context_; | |
| 692 } | |
| 693 | |
| 694 virtual ExtensionInfoMap* GetExtensionInfoMap() { | |
| 695 return profile_->GetExtensionInfoMap(); | |
| 696 } | |
| 697 | |
| 698 virtual ChromeURLDataManager* GetChromeURLDataManager() { | |
| 699 if (!chrome_url_data_manager_.get()) | |
| 700 chrome_url_data_manager_.reset(new ChromeURLDataManager( | |
| 701 io_data_.GetChromeURLDataManagerBackendGetter())); | |
| 702 return chrome_url_data_manager_.get(); | |
| 703 } | |
| 704 | |
| 705 virtual PromoCounter* GetInstantPromoCounter() { | |
| 706 return NULL; | |
| 707 } | |
| 708 | |
| 709 #if defined(OS_CHROMEOS) | |
| 710 virtual void ChangeAppLocale(const std::string& locale, AppLocaleChangedVia) { | |
| 711 } | |
| 712 virtual void OnLogin() { | |
| 713 } | |
| 714 #endif // defined(OS_CHROMEOS) | |
| 715 | |
| 716 virtual PrefProxyConfigTracker* GetProxyConfigTracker() { | |
| 717 if (!pref_proxy_config_tracker_) | |
| 718 pref_proxy_config_tracker_ = new PrefProxyConfigTracker(GetPrefs()); | |
| 719 | |
| 720 return pref_proxy_config_tracker_; | |
| 721 } | |
| 722 | |
| 723 virtual prerender::PrerenderManager* GetPrerenderManager() { | |
| 724 // We do not allow prerendering in OTR profiles at this point. | |
| 725 // TODO(tburkard): Figure out if we want to support this, and how, at some | |
| 726 // point in the future. | |
| 727 return NULL; | |
| 728 } | |
| 729 | |
| 730 private: | |
| 731 void CreateQuotaManagerAndClients() { | |
| 732 if (quota_manager_.get()) { | |
| 733 DCHECK(file_system_context_.get()); | |
| 734 DCHECK(db_tracker_.get()); | |
| 735 DCHECK(webkit_context_.get()); | |
| 736 return; | |
| 737 } | |
| 738 | |
| 739 // All of the clients have to be created and registered with the | |
| 740 // QuotaManager prior to the QuotaManger being used. So we do them | |
| 741 // all together here prior to handing out a reference to anything | |
| 742 // that utlizes the QuotaManager. | |
| 743 quota_manager_ = new quota::QuotaManager( | |
| 744 IsOffTheRecord(), | |
| 745 GetPath(), | |
| 746 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO), | |
| 747 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB), | |
| 748 GetExtensionSpecialStoragePolicy()); | |
| 749 | |
| 750 // Each consumer is responsible for registering its QuotaClient during | |
| 751 // its construction. | |
| 752 file_system_context_ = CreateFileSystemContext( | |
| 753 GetPath(), IsOffTheRecord(), | |
| 754 GetExtensionSpecialStoragePolicy(), | |
| 755 quota_manager_->proxy()); | |
| 756 db_tracker_ = new webkit_database::DatabaseTracker( | |
| 757 GetPath(), IsOffTheRecord(), false, GetExtensionSpecialStoragePolicy(), | |
| 758 quota_manager_->proxy(), | |
| 759 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE)); | |
| 760 webkit_context_ = new WebKitContext( | |
| 761 IsOffTheRecord(), GetPath(), GetExtensionSpecialStoragePolicy(), | |
| 762 false, quota_manager_->proxy(), | |
| 763 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::WEBKIT)); | |
| 764 appcache_service_ = new ChromeAppCacheService(quota_manager_->proxy()); | |
| 765 BrowserThread::PostTask( | |
| 766 BrowserThread::IO, FROM_HERE, | |
| 767 NewRunnableMethod( | |
| 768 appcache_service_.get(), | |
| 769 &ChromeAppCacheService::InitializeOnIOThread, | |
| 770 IsOffTheRecord() | |
| 771 ? FilePath() : GetPath().Append(chrome::kAppCacheDirname), | |
| 772 &GetResourceContext(), | |
| 773 make_scoped_refptr(GetExtensionSpecialStoragePolicy()))); | |
| 774 } | |
| 775 | |
| 776 NotificationRegistrar registrar_; | |
| 777 | |
| 778 // The real underlying profile. | |
| 779 Profile* profile_; | |
| 780 | |
| 781 // Weak pointer owned by |profile_|. | |
| 782 PrefService* prefs_; | |
| 783 | |
| 784 scoped_ptr<ExtensionProcessManager> extension_process_manager_; | |
| 785 | |
| 786 OffTheRecordProfileIOData::Handle io_data_; | |
| 787 | |
| 788 // Used so that Chrome code can influence how content module's DownloadManager | |
| 789 // functions. | |
| 790 scoped_refptr<ChromeDownloadManagerDelegate> download_manager_delegate_; | |
| 791 | |
| 792 // The download manager that only stores downloaded items in memory. | |
| 793 scoped_refptr<DownloadManager> download_manager_; | |
| 794 | |
| 795 // We use a non-persistent content settings map for OTR. | |
| 796 scoped_refptr<HostContentSettingsMap> host_content_settings_map_; | |
| 797 | |
| 798 // Use a separate zoom map for OTR. | |
| 799 scoped_refptr<HostZoomMap> host_zoom_map_; | |
| 800 | |
| 801 // Use a special WebKit context for OTR browsing. | |
| 802 scoped_refptr<WebKitContext> webkit_context_; | |
| 803 | |
| 804 // We don't want SSLHostState from the OTR profile to leak back to the main | |
| 805 // profile because then the main profile would learn some of the host names | |
| 806 // the user visited while OTR. | |
| 807 scoped_ptr<SSLHostState> ssl_host_state_; | |
| 808 | |
| 809 // Use a separate FindBarState so search terms do not leak back to the main | |
| 810 // profile. | |
| 811 scoped_ptr<FindBarState> find_bar_state_; | |
| 812 | |
| 813 // The TransportSecurityState that only stores enabled sites in memory. | |
| 814 scoped_refptr<net::TransportSecurityState> | |
| 815 transport_security_state_; | |
| 816 | |
| 817 // Time we were started. | |
| 818 Time start_time_; | |
| 819 | |
| 820 scoped_refptr<ChromeAppCacheService> appcache_service_; | |
| 821 | |
| 822 // The main database tracker for this profile. | |
| 823 // Should be used only on the file thread. | |
| 824 scoped_refptr<webkit_database::DatabaseTracker> db_tracker_; | |
| 825 | |
| 826 FilePath last_selected_directory_; | |
| 827 | |
| 828 scoped_refptr<ChromeBlobStorageContext> blob_storage_context_; | |
| 829 | |
| 830 // The file_system context for this profile. | |
| 831 scoped_refptr<fileapi::FileSystemContext> file_system_context_; | |
| 832 | |
| 833 scoped_refptr<PrefProxyConfigTracker> pref_proxy_config_tracker_; | |
| 834 | |
| 835 scoped_ptr<ChromeURLDataManager> chrome_url_data_manager_; | |
| 836 | |
| 837 scoped_refptr<quota::QuotaManager> quota_manager_; | |
| 838 | |
| 839 // Used read-only. | |
| 840 scoped_refptr<TransportSecurityPersister> transport_security_loader_; | |
| 841 | |
| 842 DISALLOW_COPY_AND_ASSIGN(OffTheRecordProfileImpl); | |
| 843 }; | |
| 844 | |
| 845 #if defined(OS_CHROMEOS) | |
| 846 // Special case of the OffTheRecordProfileImpl which is used while Guest | |
| 847 // session in CrOS. | |
| 848 class GuestSessionProfile : public OffTheRecordProfileImpl { | |
| 849 public: | |
| 850 explicit GuestSessionProfile(Profile* real_profile) | |
| 851 : OffTheRecordProfileImpl(real_profile) { | |
| 852 } | |
| 853 | |
| 854 virtual PersonalDataManager* GetPersonalDataManager() { | |
| 855 return GetOriginalProfile()->GetPersonalDataManager(); | |
| 856 } | |
| 857 | |
| 858 virtual void InitChromeOSPreferences() { | |
| 859 chromeos_preferences_.reset(new chromeos::Preferences()); | |
| 860 chromeos_preferences_->Init(GetPrefs()); | |
| 861 } | |
| 862 | |
| 863 private: | |
| 864 // The guest user should be able to customize Chrome OS preferences. | |
| 865 scoped_ptr<chromeos::Preferences> chromeos_preferences_; | |
| 866 }; | |
| 867 #endif | |
| 868 | |
| 869 Profile* Profile::CreateOffTheRecordProfile() { | |
| 870 #if defined(OS_CHROMEOS) | |
| 871 if (Profile::IsGuestSession()) | |
| 872 return new GuestSessionProfile(this); | |
| 873 #endif | |
| 874 return new OffTheRecordProfileImpl(this); | |
| 875 } | |
| OLD | NEW |