| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/net/dns_global.h" | 5 #include "chrome/browser/net/dns_global.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/singleton.h" | 10 #include "base/singleton.h" |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 } else { | 110 } else { |
| 111 ChromeThread::PostTask( | 111 ChromeThread::PostTask( |
| 112 ChromeThread::IO, | 112 ChromeThread::IO, |
| 113 FROM_HERE, | 113 FROM_HERE, |
| 114 NewRunnableMethod(dns_master, | 114 NewRunnableMethod(dns_master, |
| 115 &DnsMaster::ResolveList, hostnames, motivation)); | 115 &DnsMaster::ResolveList, hostnames, motivation)); |
| 116 } | 116 } |
| 117 } | 117 } |
| 118 | 118 |
| 119 // This API is used by the autocomplete popup box (where URLs are typed). | 119 // This API is used by the autocomplete popup box (where URLs are typed). |
| 120 void DnsPrefetchUrl(const GURL& url) { | 120 // It is only called on the UI thread. |
| 121 void DnsPrefetchUrl(const GURL& url, bool is_search_url) { |
| 121 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); | 122 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
| 122 if (!dns_prefetch_enabled || NULL == dns_master) | 123 if (!dns_prefetch_enabled || NULL == dns_master) |
| 123 return; | 124 return; |
| 124 if (url.is_valid()) | 125 if (!url.is_valid()) |
| 125 DnsMotivatedPrefetch(url.host(), DnsHostInfo::OMNIBOX_MOTIVATED); | 126 return; |
| 127 |
| 128 static std::string last_host; |
| 129 bool new_host = (url.host() != last_host); |
| 130 if (new_host) |
| 131 last_host = url.host(); |
| 132 |
| 133 // Omnibox tends to call in pairs (just a few milliseconds apart), and we |
| 134 // really don't need to keep resolving a name that often. |
| 135 static base::Time last_prefetch_for_host; |
| 136 static base::Time last_tcp_warm_for_host; |
| 137 base::Time now = base::Time::Now(); |
| 138 if (!new_host) { |
| 139 const int kMinPreresolveSeconds(10); |
| 140 if (kMinPreresolveSeconds > (now - last_prefetch_for_host).InSeconds()) |
| 141 return; |
| 142 } |
| 143 last_prefetch_for_host = now; |
| 144 DnsMotivatedPrefetch(last_host, DnsHostInfo::OMNIBOX_MOTIVATED); |
| 145 |
| 146 if (!is_search_url) |
| 147 return; |
| 148 static base::Time last_keepalive; |
| 149 const int kMaxSearchKeepaliveSeconds(90); // TODO(jar): Track vendors. |
| 150 if (!new_host && |
| 151 (now - last_keepalive).InSeconds() < kMaxSearchKeepaliveSeconds) |
| 152 return; |
| 153 last_keepalive = now; |
| 154 // Prewarm connection to Search URL. |
| 126 } | 155 } |
| 127 | 156 |
| 128 static void DnsMotivatedPrefetch(const std::string& hostname, | 157 static void DnsMotivatedPrefetch(const std::string& hostname, |
| 129 DnsHostInfo::ResolutionMotivation motivation) { | 158 DnsHostInfo::ResolutionMotivation motivation) { |
| 130 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); | 159 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
| 131 if (!dns_prefetch_enabled || NULL == dns_master || !hostname.size()) | 160 if (!dns_prefetch_enabled || NULL == dns_master || !hostname.size()) |
| 132 return; | 161 return; |
| 133 | 162 |
| 134 ChromeThread::PostTask( | 163 ChromeThread::PostTask( |
| 135 ChromeThread::IO, | 164 ChromeThread::IO, |
| (...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 614 TimeDelta max_queueing_delay( | 643 TimeDelta max_queueing_delay( |
| 615 TimeDelta::FromMilliseconds(max_queueing_delay_ms)); | 644 TimeDelta::FromMilliseconds(max_queueing_delay_ms)); |
| 616 | 645 |
| 617 DCHECK(!dns_master); | 646 DCHECK(!dns_master); |
| 618 InitDnsPrefetch(max_queueing_delay, max_concurrent, user_prefs, | 647 InitDnsPrefetch(max_queueing_delay, max_concurrent, user_prefs, |
| 619 local_state); | 648 local_state); |
| 620 } | 649 } |
| 621 } | 650 } |
| 622 | 651 |
| 623 } // namespace chrome_browser_net | 652 } // namespace chrome_browser_net |
| OLD | NEW |