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"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/chrome_download_manager_delegate.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service_factory.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_request/web_request_api.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#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/extensions/extension_system.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/geolocation/chrome_geolocation_permission_context.h"
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/geolocation/chrome_geolocation_permission_context_factory.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/io_thread.h"
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/media/chrome_midi_permission_context.h"
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/media/chrome_midi_permission_context_factory.h"
32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/net/pref_proxy_config_tracker.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/proxy_service_factory.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/plugins/chrome_plugin_service_filter.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_prefs.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/incognito_mode_prefs.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_service.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/extensions/extension_icon_source.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h"
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/browser_context_keyed_service/browser_context_dependency_manager.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/user_prefs.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/host_zoom_map.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/url_data_source.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_server_properties.h"
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/transport_security_state.h"
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/database/database_tracker.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) || defined(OS_IOS)
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h"
60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/prefs/proxy_prefs.h"
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined(OS_ANDROID) || defined(OS_IOS)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/preferences.h"
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/profiles/profile_helper.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) && !defined(OS_CHROMEOS)
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h"
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadManagerDelegate;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::HostZoomMap;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NotifyOTRProfileCreatedOnIOThread(void* original_profile,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       void* otr_profile) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionWebRequestEventRouter::GetInstance()->OnOTRProfileCreated(
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      original_profile, otr_profile);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NotifyOTRProfileDestroyedOnIOThread(void* original_profile,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         void* otr_profile) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionWebRequestEventRouter::GetInstance()->OnOTRProfileDestroyed(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      original_profile, otr_profile);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OffTheRecordProfileImpl::OffTheRecordProfileImpl(Profile* real_profile)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : profile_(real_profile),
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs_(PrefServiceSyncable::IncognitoFromProfile(real_profile)),
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      io_data_(this),
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      start_time_(Time::Now()) {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Register on BrowserContext.
985e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  user_prefs::UserPrefs::Set(this, prefs_);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::Init() {
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) && !defined(OS_CHROMEOS)
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Because UserCloudPolicyManager is in a component, it cannot access
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // GetOriginalProfile. Instead, we have to inject this relation here.
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  policy::UserCloudPolicyManagerFactory::RegisterForOffTheRecordBrowserContext(
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      this->GetOriginalProfile(), this);
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices(
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      this);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(IncognitoModePrefs::DISABLED,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            IncognitoModePrefs::GetAvailability(profile_->GetPrefs()));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) || defined(OS_IOS)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UseSystemProxy();
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined(OS_ANDROID) || defined(OS_IOS)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(oshima): Remove the need to eagerly initialize the request context
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // getter. chromeos::OnlineAttempt is illegally trying to access this
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Profile member from a thread other than the UI thread, so we need to
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // prevent a race.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetRequestContext();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitHostZoomMap();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make the chrome//extension-icon/ resource available.
130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  extensions::ExtensionIconSource* icon_source =
131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      new extensions::ExtensionIconSource(profile_);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::URLDataSource::Add(this, icon_source);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromePluginServiceFilter::GetInstance()->RegisterResourceContext(
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      PluginPrefs::GetForProfile(this).get(),
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      io_data_.GetResourceContextNoInit());
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NotifyOTRProfileCreatedOnIOThread, profile_, this));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OffTheRecordProfileImpl::~OffTheRecordProfileImpl() {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybeSendDestroyedNotification();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromePluginServiceFilter::GetInstance()->UnregisterResourceContext(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_data_.GetResourceContextNoInit());
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices(
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      this);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NotifyOTRProfileDestroyedOnIOThread, profile_, this));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (host_content_settings_map_.get())
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_content_settings_map_->ShutdownOnUIThread();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
163b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (pref_proxy_config_tracker_)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref_proxy_config_tracker_->DetachFromPrefService();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears any data the network stack contains that may be related to the
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OTR session.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_browser_process->io_thread()->ChangedToOnTheRecord();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::InitHostZoomMap() {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostZoomMap* host_zoom_map = HostZoomMap::GetForBrowserContext(this);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostZoomMap* parent_host_zoom_map =
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HostZoomMap::GetForBrowserContext(profile_);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_zoom_map->CopyFrom(parent_host_zoom_map);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observe parent's HZM change for propagating change of parent's
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // change to this HZM.
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  zoom_subscription_ = parent_host_zoom_map->AddZoomLevelChangedCallback(
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&OffTheRecordProfileImpl::OnZoomLevelChanged,
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 base::Unretained(this)));
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) || defined(OS_IOS)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::UseSystemProxy() {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force the use of the system-assigned proxy when off the record.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kProxyMode[] = "mode";
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kProxyServer[] = "server";
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kProxyBypassList[] = "bypass_list";
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kProxyPacUrl[] = "pac_url";
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryPrefUpdate update(prefs_, prefs::kProxy);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* dict = update.Get();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(kProxyMode, ProxyModeToString(ProxyPrefs::MODE_SYSTEM));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(kProxyPacUrl, "");
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(kProxyServer, "");
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(kProxyBypassList, "");
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined(OS_ANDROID) || defined(OS_IOS)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string OffTheRecordProfileImpl::GetProfileName() {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Incognito profile should not return the profile name.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbase::FilePath OffTheRecordProfileImpl::GetPath() const {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->GetPath();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<base::SequencedTaskRunner>
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OffTheRecordProfileImpl::GetIOTaskRunner() {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->GetIOTaskRunner();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OffTheRecordProfileImpl::IsOffTheRecord() const {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* OffTheRecordProfileImpl::GetOffTheRecordProfile() {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::DestroyOffTheRecordProfile() {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Suicide is bad!
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OffTheRecordProfileImpl::HasOffTheRecordProfile() {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* OffTheRecordProfileImpl::GetOriginalProfile() {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionService* OffTheRecordProfileImpl::GetExtensionService() {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return extensions::ExtensionSystem::Get(this)->extension_service();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionSpecialStoragePolicy*
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OffTheRecordProfileImpl::GetExtensionSpecialStoragePolicy() {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetOriginalProfile()->GetExtensionSpecialStoragePolicy();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool OffTheRecordProfileImpl::IsManaged() {
244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return GetOriginalProfile()->IsManaged();
245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrefService* OffTheRecordProfileImpl::GetPrefs() {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prefs_;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrefService* OffTheRecordProfileImpl::GetOffTheRecordPrefs() {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prefs_;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadManagerDelegate* OffTheRecordProfileImpl::GetDownloadManagerDelegate() {
256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return DownloadServiceFactory::GetForBrowserContext(this)->
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetDownloadManagerDelegate();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter* OffTheRecordProfileImpl::GetRequestContext() {
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetDefaultStoragePartition(this)->GetURLRequestContext();
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::URLRequestContextGetter* OffTheRecordProfileImpl::CreateRequestContext(
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::ProtocolHandlerMap* protocol_handlers) {
2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return io_data_.CreateMainRequestContextGetter(protocol_handlers).get();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter*
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OffTheRecordProfileImpl::GetRequestContextForRenderProcess(
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int renderer_child_id) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* rph = content::RenderProcessHost::FromID(
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      renderer_child_id);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rph->GetStoragePartition()->GetURLRequestContext();
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter*
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OffTheRecordProfileImpl::GetMediaRequestContext() {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In OTR mode, media request context is the same as the original one.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetRequestContext();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter*
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OffTheRecordProfileImpl::GetMediaRequestContextForRenderProcess(
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int renderer_child_id) {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In OTR mode, media request context is the same as the original one.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetRequestContextForRenderProcess(renderer_child_id);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter*
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OffTheRecordProfileImpl::GetMediaRequestContextForStoragePartition(
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& partition_path,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool in_memory) {
2947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return io_data_.GetIsolatedAppRequestContextGetter(partition_path, in_memory)
2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      .get();
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid OffTheRecordProfileImpl::RequestMIDISysExPermission(
2997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      int render_process_id,
3007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      int render_view_id,
3011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      int bridge_id,
3027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const GURL& requesting_frame,
3037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const MIDISysExPermissionCallback& callback) {
304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ChromeMIDIPermissionContext* context =
305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      ChromeMIDIPermissionContextFactory::GetForProfile(this);
306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  context->RequestMIDISysExPermission(render_process_id,
307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                      render_view_id,
3081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                      bridge_id,
309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                      requesting_frame,
310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                      callback);
3117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void OffTheRecordProfileImpl::CancelMIDISysExPermissionRequest(
3141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    int render_process_id,
3151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    int render_view_id,
3161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    int bridge_id,
3171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const GURL& requesting_frame) {
3181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ChromeMIDIPermissionContext* context =
3191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ChromeMIDIPermissionContextFactory::GetForProfile(this);
3201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  context->CancelMIDISysExPermissionRequest(
3211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      render_process_id, render_view_id, bridge_id, requesting_frame);
3221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter*
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OffTheRecordProfileImpl::GetRequestContextForExtensions() {
3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return io_data_.GetExtensionsRequestContextGetter().get();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter*
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OffTheRecordProfileImpl::CreateRequestContextForStoragePartition(
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const base::FilePath& partition_path,
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bool in_memory,
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content::ProtocolHandlerMap* protocol_handlers) {
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return io_data_.CreateIsolatedAppRequestContextGetter(
3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                      partition_path, in_memory, protocol_handlers).get();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::ResourceContext* OffTheRecordProfileImpl::GetResourceContext() {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io_data_.GetResourceContext();
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::SSLConfigService* OffTheRecordProfileImpl::GetSSLConfigService() {
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->GetSSLConfigService();
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostContentSettingsMap* OffTheRecordProfileImpl::GetHostContentSettingsMap() {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieve the host content settings map of the parent profile in order to
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ensure the preferences have been migrated.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->GetHostContentSettingsMap();
350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!host_content_settings_map_.get()) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_content_settings_map_ = new HostContentSettingsMap(GetPrefs(), true);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionService* extension_service = GetExtensionService();
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extension_service)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_content_settings_map_->RegisterExtensionService(extension_service);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host_content_settings_map_.get();
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::GeolocationPermissionContext*
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OffTheRecordProfileImpl::GetGeolocationPermissionContext() {
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return ChromeGeolocationPermissionContextFactory::GetForProfile(this);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)quota::SpecialStoragePolicy*
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OffTheRecordProfileImpl::GetSpecialStoragePolicy() {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetExtensionSpecialStoragePolicy();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OffTheRecordProfileImpl::IsSameProfile(Profile* profile) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (profile == this) || (profile == profile_);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Time OffTheRecordProfileImpl::GetStartTime() const {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return start_time_;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)history::TopSites* OffTheRecordProfileImpl::GetTopSitesWithoutCreating() {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)history::TopSites* OffTheRecordProfileImpl::GetTopSites() {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::SetExitType(ExitType exit_type) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath OffTheRecordProfileImpl::last_selected_directory() {
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& directory = last_selected_directory_;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (directory.empty()) {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return profile_->last_selected_directory();
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return directory;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::set_last_selected_directory(
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& path) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_selected_directory_ = path;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OffTheRecordProfileImpl::WasCreatedByVersionOrLater(
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& version) {
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->WasCreatedByVersionOrLater(version);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile::ExitType OffTheRecordProfileImpl::GetLastSessionExitType() {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->GetLastSessionExitType();
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void OffTheRecordProfileImpl::ChangeAppLocale(const std::string& locale,
4144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                              AppLocaleChangedVia) {
4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void OffTheRecordProfileImpl::OnLogin() {
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::InitChromeOSPreferences() {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The incognito profile shouldn't have Chrome OS's preferences.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The preferences are associated with the regular user profile.
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrefProxyConfigTracker* OffTheRecordProfileImpl::GetProxyConfigTracker() {
4277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!pref_proxy_config_tracker_)
4287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    pref_proxy_config_tracker_.reset(CreateProxyConfigTracker());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pref_proxy_config_tracker_.get();
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chrome_browser_net::Predictor* OffTheRecordProfileImpl::GetNetworkPredictor() {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We do not store information about websites visited in OTR profiles which
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is necessary for a Predictor, so we do not have a Predictor at all.
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OffTheRecordProfileImpl::ClearNetworkingHistorySince(
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time time,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Closure& completion) {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nothing to do here, our transport security state is read-only.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Still, fire the callback to indicate we have finished, otherwise the
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowsingDataRemover will never be destroyed and the dialog will never be
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // closed. We must do this asynchronously in order to avoid reentrancy issues.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!completion.is_null()) {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, completion);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL OffTheRecordProfileImpl::GetHomePage() {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile_->GetHomePage();
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Special case of the OffTheRecordProfileImpl which is used while Guest
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// session in CrOS.
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GuestSessionProfile : public OffTheRecordProfileImpl {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit GuestSessionProfile(Profile* real_profile)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : OffTheRecordProfileImpl(real_profile) {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InitChromeOSPreferences() OVERRIDE {
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos_preferences_.reset(new chromeos::Preferences());
4650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    chromeos_preferences_->Init(static_cast<PrefServiceSyncable*>(GetPrefs()),
4660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                true /* is_primary_profile */);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The guest user should be able to customize Chrome OS preferences.
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<chromeos::Preferences> chromeos_preferences_;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* Profile::CreateOffTheRecordProfile() {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OffTheRecordProfileImpl* profile = NULL;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsGuestSession())
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile = new GuestSessionProfile(this);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!profile)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile = new OffTheRecordProfileImpl(this);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile->Init();
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OffTheRecordProfileImpl::OnZoomLevelChanged(
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const HostZoomMap::ZoomLevelChange& change) {
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HostZoomMap* host_zoom_map = HostZoomMap::GetForBrowserContext(this);
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (change.mode) {
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM:
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       return;
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case HostZoomMap::ZOOM_CHANGED_FOR_HOST:
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       host_zoom_map->SetZoomLevelForHost(change.host, change.zoom_level);
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       return;
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST:
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       host_zoom_map->SetZoomLevelForHostAndScheme(change.scheme,
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           change.host,
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           change.zoom_level);
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       return;
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5047dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochPrefProxyConfigTracker* OffTheRecordProfileImpl::CreateProxyConfigTracker() {
5057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_CHROMEOS)
5067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (chromeos::ProfileHelper::IsSigninProfile(this)) {
5077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return ProxyServiceFactory::CreatePrefProxyConfigTrackerOfLocalState(
5087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        g_browser_process->local_state());
5097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
5107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif  // defined(OS_CHROMEOS)
5117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return ProxyServiceFactory::CreatePrefProxyConfigTrackerOfProfile(
5127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GetPrefs(), g_browser_process->local_state());
5137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
514