15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/off_the_record_profile_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/prefs/json_pref_store.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/background/background_contents_service_factory.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/dom_distiller/profile_utils.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/chrome_download_manager_delegate.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service_factory.h"
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_service.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_special_storage_policy.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/io_thread.h"
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/net/chrome_url_request_context_getter.h"
28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/net/pref_proxy_config_tracker.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/proxy_service_factory.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/plugins/chrome_plugin_service_filter.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_prefs.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/incognito_mode_prefs.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable.h"
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/ssl/chrome_ssl_host_state_delegate.h"
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/ssl/chrome_ssl_host_state_delegate_factory.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_service.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/extensions/extension_icon_source.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h"
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/content/browser_context_dependency_manager.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/user_prefs.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/host_zoom_map.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/url_data_source.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_server_properties.h"
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/transport_security_state.h"
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/database/database_tracker.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID)
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/media/protected_media_identifier_permission_context.h"
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/media/protected_media_identifier_permission_context_factory.h"
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(OS_ANDROID)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) || defined(OS_IOS)
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h"
62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/prefs/proxy_prefs.h"
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined(OS_ANDROID) || defined(OS_IOS)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/preferences.h"
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/profiles/profile_helper.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) && !defined(OS_CHROMEOS)
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h"
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/web_request/web_request_api.h"
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_system.h"
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/browser/guest_view/guest_view_manager.h"
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/extension.h"
796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#endif
806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadManagerDelegate;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::HostZoomMap;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NotifyOTRProfileCreatedOnIOThread(void* original_profile,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       void* otr_profile) {
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionWebRequestEventRouter::GetInstance()->OnOTRBrowserContextCreated(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      original_profile, otr_profile);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NotifyOTRProfileDestroyedOnIOThread(void* original_profile,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         void* otr_profile) {
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionWebRequestEventRouter::GetInstance()->OnOTRBrowserContextDestroyed(
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      original_profile, otr_profile);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#endif
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OffTheRecordProfileImpl::OffTheRecordProfileImpl(Profile* real_profile)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : profile_(real_profile),
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs_(PrefServiceSyncable::IncognitoFromProfile(real_profile)),
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      start_time_(Time::Now()) {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Register on BrowserContext.
1085e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  user_prefs::UserPrefs::Set(this, prefs_);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::Init() {
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The construction of OffTheRecordProfileIOData::Handle needs the profile
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // type returned by this->GetProfileType().  Since GetProfileType() is a
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // virtual member function, we cannot call the function defined in the most
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // derived class (e.g. GuestSessionProfile) until a ctor finishes.  Thus,
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // we have to instantiate OffTheRecordProfileIOData::Handle here after a ctor.
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  InitIoData();
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) && !defined(OS_CHROMEOS)
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Because UserCloudPolicyManager is in a component, it cannot access
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // GetOriginalProfile. Instead, we have to inject this relation here.
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  policy::UserCloudPolicyManagerFactory::RegisterForOffTheRecordBrowserContext(
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      this->GetOriginalProfile(), this);
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices(
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      this);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Guest profiles may always be OTR. Check IncognitoModePrefs otherwise.
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DCHECK(profile_->IsGuestSession() ||
13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         IncognitoModePrefs::GetAvailability(profile_->GetPrefs()) !=
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)             IncognitoModePrefs::DISABLED);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) || defined(OS_IOS)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UseSystemProxy();
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined(OS_ANDROID) || defined(OS_IOS)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(oshima): Remove the need to eagerly initialize the request context
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // getter. chromeos::OnlineAttempt is illegally trying to access this
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Profile member from a thread other than the UI thread, so we need to
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // prevent a race.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetRequestContext();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitHostZoomMap();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromePluginServiceFilter::GetInstance()->RegisterResourceContext(
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      PluginPrefs::GetForProfile(this).get(),
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      io_data_->GetResourceContextNoInit());
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Make the chrome//extension-icon/ resource available.
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extensions::ExtensionIconSource* icon_source =
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new extensions::ExtensionIconSource(profile_);
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::URLDataSource::Add(this, icon_source);
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NotifyOTRProfileCreatedOnIOThread, profile_, this));
1636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#endif
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The DomDistillerViewerSource is not a normal WebUI so it must be registered
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // as a URLDataSource early.
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RegisterDomDistillerViewerSource(this);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OffTheRecordProfileImpl::~OffTheRecordProfileImpl() {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybeSendDestroyedNotification();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromePluginServiceFilter::GetInstance()->UnregisterResourceContext(
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      io_data_->GetResourceContextNoInit());
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices(
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      this);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NotifyOTRProfileDestroyedOnIOThread, profile_, this));
1856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#endif
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (host_content_settings_map_.get())
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_content_settings_map_->ShutdownOnUIThread();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
190b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (pref_proxy_config_tracker_)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref_proxy_config_tracker_->DetachFromPrefService();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears any data the network stack contains that may be related to the
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OTR session.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_browser_process->io_thread()->ChangedToOnTheRecord();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OffTheRecordProfileImpl::InitIoData() {
199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  io_data_.reset(new OffTheRecordProfileIOData::Handle(this));
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::InitHostZoomMap() {
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HostZoomMap* host_zoom_map = HostZoomMap::GetDefaultForBrowserContext(this);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostZoomMap* parent_host_zoom_map =
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      HostZoomMap::GetDefaultForBrowserContext(profile_);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_zoom_map->CopyFrom(parent_host_zoom_map);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observe parent's HZM change for propagating change of parent's
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // change to this HZM.
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  zoom_subscription_ = parent_host_zoom_map->AddZoomLevelChangedCallback(
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&OffTheRecordProfileImpl::OnZoomLevelChanged,
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 base::Unretained(this)));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) || defined(OS_IOS)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::UseSystemProxy() {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force the use of the system-assigned proxy when off the record.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kProxyMode[] = "mode";
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kProxyServer[] = "server";
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kProxyBypassList[] = "bypass_list";
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kProxyPacUrl[] = "pac_url";
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryPrefUpdate update(prefs_, prefs::kProxy);
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* dict = update.Get();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(kProxyMode, ProxyModeToString(ProxyPrefs::MODE_SYSTEM));
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(kProxyPacUrl, "");
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(kProxyServer, "");
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(kProxyBypassList, "");
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined(OS_ANDROID) || defined(OS_IOS)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string OffTheRecordProfileImpl::GetProfileName() {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Incognito profile should not return the profile name.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)Profile::ProfileType OffTheRecordProfileImpl::GetProfileType() const {
236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return INCOGNITO_PROFILE;
237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbase::FilePath OffTheRecordProfileImpl::GetPath() const {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->GetPath();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<base::SequencedTaskRunner>
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OffTheRecordProfileImpl::GetIOTaskRunner() {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->GetIOTaskRunner();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OffTheRecordProfileImpl::IsOffTheRecord() const {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* OffTheRecordProfileImpl::GetOffTheRecordProfile() {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::DestroyOffTheRecordProfile() {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Suicide is bad!
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OffTheRecordProfileImpl::HasOffTheRecordProfile() {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* OffTheRecordProfileImpl::GetOriginalProfile() {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionSpecialStoragePolicy*
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OffTheRecordProfileImpl::GetExtensionSpecialStoragePolicy() {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetOriginalProfile()->GetExtensionSpecialStoragePolicy();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
274f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool OffTheRecordProfileImpl::IsSupervised() {
275f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return GetOriginalProfile()->IsSupervised();
276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrefService* OffTheRecordProfileImpl::GetPrefs() {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prefs_;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrefService* OffTheRecordProfileImpl::GetOffTheRecordPrefs() {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prefs_;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadManagerDelegate* OffTheRecordProfileImpl::GetDownloadManagerDelegate() {
287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return DownloadServiceFactory::GetForBrowserContext(this)->
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetDownloadManagerDelegate();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter* OffTheRecordProfileImpl::GetRequestContext() {
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetDefaultStoragePartition(this)->GetURLRequestContext();
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::URLRequestContextGetter* OffTheRecordProfileImpl::CreateRequestContext(
296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    content::ProtocolHandlerMap* protocol_handlers,
297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::URLRequestInterceptorScopedVector request_interceptors) {
298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return io_data_->CreateMainRequestContextGetter(
299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      protocol_handlers, request_interceptors.Pass()).get();
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter*
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OffTheRecordProfileImpl::GetRequestContextForRenderProcess(
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int renderer_child_id) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* rph = content::RenderProcessHost::FromID(
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      renderer_child_id);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rph->GetStoragePartition()->GetURLRequestContext();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter*
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OffTheRecordProfileImpl::GetMediaRequestContext() {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In OTR mode, media request context is the same as the original one.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetRequestContext();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter*
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OffTheRecordProfileImpl::GetMediaRequestContextForRenderProcess(
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int renderer_child_id) {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In OTR mode, media request context is the same as the original one.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetRequestContextForRenderProcess(renderer_child_id);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter*
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OffTheRecordProfileImpl::GetMediaRequestContextForStoragePartition(
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& partition_path,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool in_memory) {
327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return io_data_->GetIsolatedAppRequestContextGetter(partition_path, in_memory)
3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      .get();
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter*
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OffTheRecordProfileImpl::GetRequestContextForExtensions() {
333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return io_data_->GetExtensionsRequestContextGetter().get();
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter*
337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)OffTheRecordProfileImpl::CreateRequestContextForStoragePartition(
338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const base::FilePath& partition_path,
339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bool in_memory,
340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    content::ProtocolHandlerMap* protocol_handlers,
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::URLRequestInterceptorScopedVector request_interceptors) {
342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return io_data_->CreateIsolatedAppRequestContextGetter(
343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      partition_path,
344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      in_memory,
345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      protocol_handlers,
346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      request_interceptors.Pass()).get();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::ResourceContext* OffTheRecordProfileImpl::GetResourceContext() {
350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return io_data_->GetResourceContext();
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::SSLConfigService* OffTheRecordProfileImpl::GetSSLConfigService() {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->GetSSLConfigService();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostContentSettingsMap* OffTheRecordProfileImpl::GetHostContentSettingsMap() {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieve the host content settings map of the parent profile in order to
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ensure the preferences have been migrated.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap();
361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!host_content_settings_map_.get()) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_content_settings_map_ = new HostContentSettingsMap(GetPrefs(), true);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ExtensionService* extension_service =
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        extensions::ExtensionSystem::Get(this)->extension_service();
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (extension_service) {
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extension_service->RegisterContentSettings(
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          host_content_settings_map_.get());
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host_content_settings_map_.get();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)content::BrowserPluginGuestManager* OffTheRecordProfileImpl::GetGuestManager() {
376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
3776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return extensions::GuestViewManager::FromBrowserContext(this);
378f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else
379f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return NULL;
380f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif
381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
38303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::SpecialStoragePolicy*
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)OffTheRecordProfileImpl::GetSpecialStoragePolicy() {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetExtensionSpecialStoragePolicy();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)content::PushMessagingService*
389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)OffTheRecordProfileImpl::GetPushMessagingService() {
390f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // TODO(johnme): Support push messaging in incognito if possible.
391f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return NULL;
392f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)content::SSLHostStateDelegate*
3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)OffTheRecordProfileImpl::GetSSLHostStateDelegate() {
3965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return ChromeSSLHostStateDelegateFactory::GetForProfile(this);
3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OffTheRecordProfileImpl::IsSameProfile(Profile* profile) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (profile == this) || (profile == profile_);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Time OffTheRecordProfileImpl::GetStartTime() const {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return start_time_;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)history::TopSites* OffTheRecordProfileImpl::GetTopSitesWithoutCreating() {
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)history::TopSites* OffTheRecordProfileImpl::GetTopSites() {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::SetExitType(ExitType exit_type) {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath OffTheRecordProfileImpl::last_selected_directory() {
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& directory = last_selected_directory_;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (directory.empty()) {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return profile_->last_selected_directory();
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return directory;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::set_last_selected_directory(
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& path) {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_selected_directory_ = path;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OffTheRecordProfileImpl::WasCreatedByVersionOrLater(
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& version) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->WasCreatedByVersionOrLater(version);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile::ExitType OffTheRecordProfileImpl::GetLastSessionExitType() {
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->GetLastSessionExitType();
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
4414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void OffTheRecordProfileImpl::ChangeAppLocale(const std::string& locale,
4424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                              AppLocaleChangedVia) {
4434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void OffTheRecordProfileImpl::OnLogin() {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::InitChromeOSPreferences() {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The incognito profile shouldn't have Chrome OS's preferences.
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The preferences are associated with the regular user profile.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrefProxyConfigTracker* OffTheRecordProfileImpl::GetProxyConfigTracker() {
4557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!pref_proxy_config_tracker_)
4567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    pref_proxy_config_tracker_.reset(CreateProxyConfigTracker());
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pref_proxy_config_tracker_.get();
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chrome_browser_net::Predictor* OffTheRecordProfileImpl::GetNetworkPredictor() {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We do not store information about websites visited in OTR profiles which
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is necessary for a Predictor, so we do not have a Predictor at all.
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)DevToolsNetworkController*
46746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)OffTheRecordProfileImpl::GetDevToolsNetworkController() {
46846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return io_data_->GetDevToolsNetworkController();
46946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
47046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::ClearNetworkingHistorySince(
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time time,
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Closure& completion) {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nothing to do here, our transport security state is read-only.
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Still, fire the callback to indicate we have finished, otherwise the
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowsingDataRemover will never be destroyed and the dialog will never be
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // closed. We must do this asynchronously in order to avoid reentrancy issues.
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!completion.is_null()) {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, completion);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL OffTheRecordProfileImpl::GetHomePage() {
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->GetHomePage();
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Special case of the OffTheRecordProfileImpl which is used while Guest
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// session in CrOS.
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GuestSessionProfile : public OffTheRecordProfileImpl {
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit GuestSessionProfile(Profile* real_profile)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : OffTheRecordProfileImpl(real_profile) {
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
496a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ProfileType GetProfileType() const OVERRIDE {
497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return GUEST_PROFILE;
498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InitChromeOSPreferences() OVERRIDE {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos_preferences_.reset(new chromeos::Preferences());
5026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    chromeos_preferences_->Init(
50303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        this, user_manager::UserManager::Get()->GetActiveUser());
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The guest user should be able to customize Chrome OS preferences.
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<chromeos::Preferences> chromeos_preferences_;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* Profile::CreateOffTheRecordProfile() {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OffTheRecordProfileImpl* profile = NULL;
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsGuestSession())
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile = new GuestSessionProfile(this);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!profile)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile = new OffTheRecordProfileImpl(this);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->Init();
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OffTheRecordProfileImpl::OnZoomLevelChanged(
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const HostZoomMap::ZoomLevelChange& change) {
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HostZoomMap* host_zoom_map = HostZoomMap::GetDefaultForBrowserContext(this);
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (change.mode) {
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM:
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       return;
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case HostZoomMap::ZOOM_CHANGED_FOR_HOST:
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       host_zoom_map->SetZoomLevelForHost(change.host, change.zoom_level);
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       return;
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST:
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       host_zoom_map->SetZoomLevelForHostAndScheme(change.scheme,
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           change.host,
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           change.zoom_level);
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       return;
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5417dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochPrefProxyConfigTracker* OffTheRecordProfileImpl::CreateProxyConfigTracker() {
5427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_CHROMEOS)
5437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (chromeos::ProfileHelper::IsSigninProfile(this)) {
5447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return ProxyServiceFactory::CreatePrefProxyConfigTrackerOfLocalState(
5457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        g_browser_process->local_state());
5467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
5477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif  // defined(OS_CHROMEOS)
5487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return ProxyServiceFactory::CreatePrefProxyConfigTrackerOfProfile(
5497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GetPrefs(), g_browser_process->local_state());
5507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
551