| Index: chrome/browser/net/dns_global.cc
 | 
| ===================================================================
 | 
| --- chrome/browser/net/dns_global.cc	(revision 35853)
 | 
| +++ chrome/browser/net/dns_global.cc	(working copy)
 | 
| @@ -34,7 +34,7 @@
 | 
|  
 | 
|  namespace chrome_browser_net {
 | 
|  
 | 
| -static void DiscardAllPrefetchState();
 | 
| +static void ChangedToOnTheRecord();
 | 
|  static void DnsMotivatedPrefetch(const std::string& hostname,
 | 
|                                   DnsHostInfo::ResolutionMotivation motivation);
 | 
|  static void DnsPrefetchMotivatedList(
 | 
| @@ -42,10 +42,10 @@
 | 
|      DnsHostInfo::ResolutionMotivation motivation);
 | 
|  
 | 
|  // static
 | 
| -const size_t DnsPrefetcherInit::kMaxConcurrentLookups = 8;
 | 
| +const size_t DnsGlobalInit::kMaxPrefetchConcurrentLookups = 8;
 | 
|  
 | 
|  // static
 | 
| -const int DnsPrefetcherInit::kMaxQueueingDelayMs = 1000;
 | 
| +const int DnsGlobalInit::kMaxPrefetchQueueingDelayMs = 1000;
 | 
|  
 | 
|  // Host resolver shared by DNS prefetcher, and the main URLRequestContext.
 | 
|  static net::HostResolver* global_host_resolver = NULL;
 | 
| @@ -72,8 +72,12 @@
 | 
|    if (on_the_record_switch == enable)
 | 
|      return;
 | 
|    on_the_record_switch = enable;
 | 
| -  if (on_the_record_switch)
 | 
| -    DiscardAllPrefetchState();  // Destroy all evidence of our OTR session.
 | 
| +  if (on_the_record_switch) {
 | 
| +    ChromeThread::PostTask(
 | 
| +        ChromeThread::IO,
 | 
| +        FROM_HERE,
 | 
| +        NewRunnableFunction(ChangedToOnTheRecord));
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  void RegisterPrefs(PrefService* local_state) {
 | 
| @@ -409,9 +413,6 @@
 | 
|      dns_master = new DnsMaster(GetGlobalHostResolver(),
 | 
|                                 max_queue_delay, max_concurrent);
 | 
|      dns_master->AddRef();
 | 
| -    // We did the initialization, so we should prime the pump, and set up
 | 
| -    // the DNS resolution system to run.
 | 
| -    Singleton<OffTheRecordObserver>::get()->Register();
 | 
|  
 | 
|      if (user_prefs) {
 | 
|        bool enabled = user_prefs->GetBoolean(prefs::kDnsPrefetchingEnabled);
 | 
| @@ -457,16 +458,19 @@
 | 
|    dns_master = NULL;
 | 
|  }
 | 
|  
 | 
| -static void DiscardAllPrefetchState() {
 | 
| -  DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
 | 
| -  if (!dns_master)
 | 
| -    return;
 | 
| +static void ChangedToOnTheRecord() {
 | 
| +  DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
 | 
|  
 | 
| -  ChromeThread::PostTask(
 | 
| -      ChromeThread::IO,
 | 
| -      FROM_HERE,
 | 
| -      NewRunnableMethod(dns_master,
 | 
| -                        &DnsMaster::DiscardAllResults));
 | 
| +  if (dns_master) {
 | 
| +    // Destroy all evidence of our OTR session.
 | 
| +    dns_master->DnsMaster::DiscardAllResults();
 | 
| +  }
 | 
| +
 | 
| +  // Clear the host cache to avoid showing entries from the OTR session
 | 
| +  // in about:net-internals.
 | 
| +  net::HostCache* host_cache = GetGlobalHostResolver()->GetHostCache();
 | 
| +  if (host_cache)
 | 
| +    host_cache->clear();
 | 
|  }
 | 
|  
 | 
|  //------------------------------------------------------------------------------
 | 
| @@ -610,8 +614,8 @@
 | 
|  // Methods for the helper class that is used to startup and teardown the whole
 | 
|  // DNS prefetch system.
 | 
|  
 | 
| -DnsPrefetcherInit::DnsPrefetcherInit(PrefService* user_prefs,
 | 
| -                                     PrefService* local_state) {
 | 
| +DnsGlobalInit::DnsGlobalInit(PrefService* user_prefs,
 | 
| +                             PrefService* local_state) {
 | 
|    DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
 | 
|    // Set up a field trial to see what disabling DNS pre-resolution does to
 | 
|    // latency of page loads.
 | 
| @@ -639,12 +643,16 @@
 | 
|    trial_->AppendGroup("_default_enabled_prefetch",
 | 
|        FieldTrial::kAllRemainingProbability);
 | 
|  
 | 
| +  // We will register the incognito observer regardless of whether prefetching
 | 
| +  // is enabled, as it is also used to clear the host cache.
 | 
| +  Singleton<OffTheRecordObserver>::get()->Register();
 | 
| +
 | 
|    if (trial_->group() != disabled_prefetch) {
 | 
|      // Initialize the DNS prefetch system.
 | 
|  
 | 
| -    size_t max_concurrent = kMaxConcurrentLookups;
 | 
| +    size_t max_concurrent = kMaxPrefetchConcurrentLookups;
 | 
|  
 | 
| -    int max_queueing_delay_ms = kMaxQueueingDelayMs;
 | 
| +    int max_queueing_delay_ms = kMaxPrefetchQueueingDelayMs;
 | 
|  
 | 
|      if (trial_->group() == max_250ms_prefetch)
 | 
|        max_queueing_delay_ms = 250;
 | 
| @@ -666,7 +674,7 @@
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -DnsPrefetcherInit::~DnsPrefetcherInit() {
 | 
| +DnsGlobalInit::~DnsGlobalInit() {
 | 
|      if (dns_master)
 | 
|        FreeDnsPrefetchResources();
 | 
|    }
 | 
| 
 |