Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Side by Side Diff: chrome/browser/net/predictor.cc

Issue 2871323006: Make Network Predictor skip empty urls (Closed)
Patch Set: self Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | net/http/http_stream_factory_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/predictor.h" 5 #include "chrome/browser/net/predictor.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <iterator> 9 #include <iterator>
10 #include <set> 10 #include <set>
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 base::BindOnce(&Predictor::FinalizeInitializationOnIOThread, 164 base::BindOnce(&Predictor::FinalizeInitializationOnIOThread,
165 base::Unretained(this), urls, 165 base::Unretained(this), urls,
166 base::Passed(std::move(referral_list)), io_thread, 166 base::Passed(std::move(referral_list)), io_thread,
167 profile_io_data)); 167 profile_io_data));
168 } 168 }
169 169
170 void Predictor::AnticipateOmniboxUrl(const GURL& url, bool preconnectable) { 170 void Predictor::AnticipateOmniboxUrl(const GURL& url, bool preconnectable) {
171 DCHECK_CURRENTLY_ON(BrowserThread::UI); 171 DCHECK_CURRENTLY_ON(BrowserThread::UI);
172 if (!PredictorEnabled()) 172 if (!PredictorEnabled())
173 return; 173 return;
174 if (!url.is_valid() || !url.has_host()) 174 GURL canonicalized_url = CanonicalizeUrl(url);
Charlie Harrison 2017/05/15 00:01:07 Here and below can you make sure we canoncalize th
xunjieli 2017/05/15 16:41:44 Done.
175 if (!canonicalized_url.is_valid() || !canonicalized_url.has_host())
175 return; 176 return;
176 if (!CanPreresolveAndPreconnect()) 177 if (!CanPreresolveAndPreconnect())
177 return; 178 return;
178 179
179 std::string host = url.HostNoBrackets(); 180 std::string host = canonicalized_url.HostNoBrackets();
180 bool is_new_host_request = (host != last_omnibox_host_); 181 bool is_new_host_request = (host != last_omnibox_host_);
181 last_omnibox_host_ = host; 182 last_omnibox_host_ = host;
182 183
183 UrlInfo::ResolutionMotivation motivation(UrlInfo::OMNIBOX_MOTIVATED); 184 UrlInfo::ResolutionMotivation motivation(UrlInfo::OMNIBOX_MOTIVATED);
184 base::TimeTicks now = base::TimeTicks::Now(); 185 base::TimeTicks now = base::TimeTicks::Now();
185 186
186 if (preconnectable && !is_new_host_request) { 187 if (preconnectable && !is_new_host_request) {
187 ++consecutive_omnibox_preconnect_count_; 188 ++consecutive_omnibox_preconnect_count_;
188 // The omnibox suggests a search URL (for which we can preconnect) after 189 // The omnibox suggests a search URL (for which we can preconnect) after
189 // one or two characters are typed, even though such typing often (1 in 190 // one or two characters are typed, even though such typing often (1 in
(...skipping 15 matching lines...) Expand all
205 // pool. Currently, we just do a connect, which MAY be reset if we 206 // pool. Currently, we just do a connect, which MAY be reset if we
206 // don't use it in 10 secondes!!! As a result, we may do more 207 // don't use it in 10 secondes!!! As a result, we may do more
207 // connections, and actually cost the server more than if we did a real 208 // connections, and actually cost the server more than if we did a real
208 // get with a fake request (/gen_204 might be the good path on Google). 209 // get with a fake request (/gen_204 might be the good path on Google).
209 const int kMaxSearchKeepaliveSeconds(10); 210 const int kMaxSearchKeepaliveSeconds(10);
210 if ((now - last_omnibox_preconnect_).InSeconds() < 211 if ((now - last_omnibox_preconnect_).InSeconds() <
211 kMaxSearchKeepaliveSeconds) 212 kMaxSearchKeepaliveSeconds)
212 return; // We've done a preconnect recently. 213 return; // We've done a preconnect recently.
213 last_omnibox_preconnect_ = now; 214 last_omnibox_preconnect_ = now;
214 const int kConnectionsNeeded = 1; 215 const int kConnectionsNeeded = 1;
215 PreconnectUrl(CanonicalizeUrl(url), GURL(), motivation, 216 PreconnectUrl(canonicalized_url, GURL(), motivation,
216 kAllowCredentialsOnPreconnectByDefault, kConnectionsNeeded); 217 kAllowCredentialsOnPreconnectByDefault, kConnectionsNeeded);
217 return; // Skip pre-resolution, since we'll open a connection. 218 return; // Skip pre-resolution, since we'll open a connection.
218 } 219 }
219 } else { 220 } else {
220 consecutive_omnibox_preconnect_count_ = 0; 221 consecutive_omnibox_preconnect_count_ = 0;
221 } 222 }
222 223
223 // Fall through and consider pre-resolution. 224 // Fall through and consider pre-resolution.
224 225
225 // Omnibox tends to call in pairs (just a few milliseconds apart), and we 226 // Omnibox tends to call in pairs (just a few milliseconds apart), and we
226 // really don't need to keep resolving a name that often. 227 // really don't need to keep resolving a name that often.
227 // TODO(jar): A/B tests could check for perf impact of the early returns. 228 // TODO(jar): A/B tests could check for perf impact of the early returns.
228 if (!is_new_host_request) { 229 if (!is_new_host_request) {
229 const int kMinPreresolveSeconds(10); 230 const int kMinPreresolveSeconds(10);
230 if (kMinPreresolveSeconds > (now - last_omnibox_preresolve_).InSeconds()) 231 if (kMinPreresolveSeconds > (now - last_omnibox_preresolve_).InSeconds())
231 return; 232 return;
232 } 233 }
233 last_omnibox_preresolve_ = now; 234 last_omnibox_preresolve_ = now;
234 235
235 BrowserThread::PostTask( 236 BrowserThread::PostTask(
236 BrowserThread::IO, FROM_HERE, 237 BrowserThread::IO, FROM_HERE,
237 base::BindOnce(&Predictor::Resolve, base::Unretained(this), 238 base::BindOnce(&Predictor::Resolve, base::Unretained(this),
238 CanonicalizeUrl(url), motivation)); 239 canonicalized_url, motivation));
239 } 240 }
240 241
241 void Predictor::PreconnectUrlAndSubresources(const GURL& url, 242 void Predictor::PreconnectUrlAndSubresources(const GURL& url,
242 const GURL& first_party_for_cookies) { 243 const GURL& first_party_for_cookies) {
243 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || 244 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) ||
244 BrowserThread::CurrentlyOn(BrowserThread::IO)); 245 BrowserThread::CurrentlyOn(BrowserThread::IO));
245 if (!PredictorEnabled() || !url.is_valid() || 246 GURL canonicalized_url = CanonicalizeUrl(url);
246 !url.has_host()) 247 if (!PredictorEnabled() || !canonicalized_url.is_valid() ||
248 !canonicalized_url.has_host())
247 return; 249 return;
248 if (!CanPreresolveAndPreconnect()) 250 if (!CanPreresolveAndPreconnect())
249 return; 251 return;
250 252
251 UrlInfo::ResolutionMotivation motivation(UrlInfo::EARLY_LOAD_MOTIVATED); 253 UrlInfo::ResolutionMotivation motivation(UrlInfo::EARLY_LOAD_MOTIVATED);
252 const int kConnectionsNeeded = 1; 254 const int kConnectionsNeeded = 1;
253 PreconnectUrl(CanonicalizeUrl(url), first_party_for_cookies, motivation, 255 PreconnectUrl(canonicalized_url, first_party_for_cookies, motivation,
254 kConnectionsNeeded, kAllowCredentialsOnPreconnectByDefault); 256 kConnectionsNeeded, kAllowCredentialsOnPreconnectByDefault);
255 PredictFrameSubresources(url.GetWithEmptyPath(), first_party_for_cookies); 257 PredictFrameSubresources(canonicalized_url.GetWithEmptyPath(),
258 first_party_for_cookies);
256 } 259 }
257 260
258 std::vector<GURL> Predictor::GetPredictedUrlListAtStartup( 261 std::vector<GURL> Predictor::GetPredictedUrlListAtStartup(
259 PrefService* user_prefs) { 262 PrefService* user_prefs) {
260 DCHECK_CURRENTLY_ON(BrowserThread::UI); 263 DCHECK_CURRENTLY_ON(BrowserThread::UI);
261 std::vector<GURL> urls; 264 std::vector<GURL> urls;
262 // Recall list of URLs we learned about during last session. 265 // Recall list of URLs we learned about during last session.
263 // This may catch secondary hostnames, pulled in by the homepages. It will 266 // This may catch secondary hostnames, pulled in by the homepages. It will
264 // also catch more of the "primary" home pages, since that was (presumably) 267 // also catch more of the "primary" home pages, since that was (presumably)
265 // rendered first (and will be rendered first this time too). 268 // rendered first (and will be rendered first this time too).
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 SerializeReferrers(referral_list); 721 SerializeReferrers(referral_list);
719 } 722 }
720 723
721 void Predictor::PreconnectUrl(const GURL& url, 724 void Predictor::PreconnectUrl(const GURL& url,
722 const GURL& first_party_for_cookies, 725 const GURL& first_party_for_cookies,
723 UrlInfo::ResolutionMotivation motivation, 726 UrlInfo::ResolutionMotivation motivation,
724 bool allow_credentials, 727 bool allow_credentials,
725 int count) { 728 int count) {
726 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || 729 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) ||
727 BrowserThread::CurrentlyOn(BrowserThread::IO)); 730 BrowserThread::CurrentlyOn(BrowserThread::IO));
731 DCHECK(url.is_valid());
728 732
729 if (BrowserThread::CurrentlyOn(BrowserThread::IO)) { 733 if (BrowserThread::CurrentlyOn(BrowserThread::IO)) {
730 PreconnectUrlOnIOThread(url, first_party_for_cookies, motivation, 734 PreconnectUrlOnIOThread(url, first_party_for_cookies, motivation,
731 allow_credentials, count); 735 allow_credentials, count);
732 } else { 736 } else {
733 BrowserThread::PostTask( 737 BrowserThread::PostTask(
734 BrowserThread::IO, FROM_HERE, 738 BrowserThread::IO, FROM_HERE,
735 base::BindOnce(&Predictor::PreconnectUrlOnIOThread, 739 base::BindOnce(&Predictor::PreconnectUrlOnIOThread,
736 base::Unretained(this), url, first_party_for_cookies, 740 base::Unretained(this), url, first_party_for_cookies,
737 motivation, allow_credentials, count)); 741 motivation, allow_credentials, count));
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after
1197 } 1201 }
1198 1202
1199 void SimplePredictor::ShutdownOnUIThread() { 1203 void SimplePredictor::ShutdownOnUIThread() {
1200 SetShutdown(true); 1204 SetShutdown(true);
1201 } 1205 }
1202 1206
1203 bool SimplePredictor::CanPrefetchAndPrerender() const { return true; } 1207 bool SimplePredictor::CanPrefetchAndPrerender() const { return true; }
1204 bool SimplePredictor::CanPreresolveAndPreconnect() const { return true; } 1208 bool SimplePredictor::CanPreresolveAndPreconnect() const { return true; }
1205 1209
1206 } // namespace chrome_browser_net 1210 } // namespace chrome_browser_net
OLDNEW
« no previous file with comments | « no previous file | net/http/http_stream_factory_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698