| OLD | NEW |
| 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 <set> | 9 #include <set> |
| 10 #include <sstream> | 10 #include <sstream> |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 TimeDelta::FromMilliseconds(g_max_queueing_delay_ms)), | 149 TimeDelta::FromMilliseconds(g_max_queueing_delay_ms)), |
| 150 host_resolver_(NULL), | 150 host_resolver_(NULL), |
| 151 transport_security_state_(NULL), | 151 transport_security_state_(NULL), |
| 152 ssl_config_service_(NULL), | 152 ssl_config_service_(NULL), |
| 153 proxy_service_(NULL), | 153 proxy_service_(NULL), |
| 154 preconnect_enabled_(preconnect_enabled), | 154 preconnect_enabled_(preconnect_enabled), |
| 155 consecutive_omnibox_preconnect_count_(0), | 155 consecutive_omnibox_preconnect_count_(0), |
| 156 next_trim_time_(base::TimeTicks::Now() + | 156 next_trim_time_(base::TimeTicks::Now() + |
| 157 TimeDelta::FromHours(kDurationBetweenTrimmingsHours)), | 157 TimeDelta::FromHours(kDurationBetweenTrimmingsHours)), |
| 158 observer_(NULL) { | 158 observer_(NULL) { |
| 159 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 159 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 160 } | 160 } |
| 161 | 161 |
| 162 Predictor::~Predictor() { | 162 Predictor::~Predictor() { |
| 163 // TODO(rlp): Add DCHECK for CurrentlyOn(BrowserThread::IO) when the | 163 // TODO(rlp): Add DCHECK for CurrentlyOn(BrowserThread::IO) when the |
| 164 // ProfileManagerTest has been updated with a mock profile. | 164 // ProfileManagerTest has been updated with a mock profile. |
| 165 DCHECK(shutdown_); | 165 DCHECK(shutdown_); |
| 166 } | 166 } |
| 167 | 167 |
| 168 // static | 168 // static |
| 169 Predictor* Predictor::CreatePredictor(bool preconnect_enabled, | 169 Predictor* Predictor::CreatePredictor(bool preconnect_enabled, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 180 registry->RegisterListPref(prefs::kDnsPrefetchingHostReferralList); | 180 registry->RegisterListPref(prefs::kDnsPrefetchingHostReferralList); |
| 181 } | 181 } |
| 182 | 182 |
| 183 // --------------------- Start UI methods. ------------------------------------ | 183 // --------------------- Start UI methods. ------------------------------------ |
| 184 | 184 |
| 185 void Predictor::InitNetworkPredictor(PrefService* user_prefs, | 185 void Predictor::InitNetworkPredictor(PrefService* user_prefs, |
| 186 PrefService* local_state, | 186 PrefService* local_state, |
| 187 IOThread* io_thread, | 187 IOThread* io_thread, |
| 188 net::URLRequestContextGetter* getter, | 188 net::URLRequestContextGetter* getter, |
| 189 ProfileIOData* profile_io_data) { | 189 ProfileIOData* profile_io_data) { |
| 190 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 190 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 191 | 191 |
| 192 user_prefs_ = user_prefs; | 192 user_prefs_ = user_prefs; |
| 193 url_request_context_getter_ = getter; | 193 url_request_context_getter_ = getter; |
| 194 | 194 |
| 195 // Gather the list of hostnames to prefetch on startup. | 195 // Gather the list of hostnames to prefetch on startup. |
| 196 UrlList urls = GetPredictedUrlListAtStartup(user_prefs, local_state); | 196 UrlList urls = GetPredictedUrlListAtStartup(user_prefs, local_state); |
| 197 | 197 |
| 198 base::ListValue* referral_list = | 198 base::ListValue* referral_list = |
| 199 static_cast<base::ListValue*>(user_prefs->GetList( | 199 static_cast<base::ListValue*>(user_prefs->GetList( |
| 200 prefs::kDnsPrefetchingHostReferralList)->DeepCopy()); | 200 prefs::kDnsPrefetchingHostReferralList)->DeepCopy()); |
| 201 | 201 |
| 202 // Now that we have the statistics in memory, wipe them from the Preferences | 202 // Now that we have the statistics in memory, wipe them from the Preferences |
| 203 // file. They will be serialized back on a clean shutdown. This way we only | 203 // file. They will be serialized back on a clean shutdown. This way we only |
| 204 // have to worry about clearing our in-memory state when Clearing Browsing | 204 // have to worry about clearing our in-memory state when Clearing Browsing |
| 205 // Data. | 205 // Data. |
| 206 user_prefs->ClearPref(prefs::kDnsPrefetchingStartupList); | 206 user_prefs->ClearPref(prefs::kDnsPrefetchingStartupList); |
| 207 user_prefs->ClearPref(prefs::kDnsPrefetchingHostReferralList); | 207 user_prefs->ClearPref(prefs::kDnsPrefetchingHostReferralList); |
| 208 | 208 |
| 209 BrowserThread::PostTask( | 209 BrowserThread::PostTask( |
| 210 BrowserThread::IO, | 210 BrowserThread::IO, |
| 211 FROM_HERE, | 211 FROM_HERE, |
| 212 base::Bind( | 212 base::Bind( |
| 213 &Predictor::FinalizeInitializationOnIOThread, | 213 &Predictor::FinalizeInitializationOnIOThread, |
| 214 base::Unretained(this), | 214 base::Unretained(this), |
| 215 urls, referral_list, | 215 urls, referral_list, |
| 216 io_thread, profile_io_data)); | 216 io_thread, profile_io_data)); |
| 217 } | 217 } |
| 218 | 218 |
| 219 void Predictor::AnticipateOmniboxUrl(const GURL& url, bool preconnectable) { | 219 void Predictor::AnticipateOmniboxUrl(const GURL& url, bool preconnectable) { |
| 220 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 220 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 221 if (!predictor_enabled_) | 221 if (!predictor_enabled_) |
| 222 return; | 222 return; |
| 223 if (!url.is_valid() || !url.has_host()) | 223 if (!url.is_valid() || !url.has_host()) |
| 224 return; | 224 return; |
| 225 if (!CanPreresolveAndPreconnect()) | 225 if (!CanPreresolveAndPreconnect()) |
| 226 return; | 226 return; |
| 227 | 227 |
| 228 std::string host = url.HostNoBrackets(); | 228 std::string host = url.HostNoBrackets(); |
| 229 bool is_new_host_request = (host != last_omnibox_host_); | 229 bool is_new_host_request = (host != last_omnibox_host_); |
| 230 last_omnibox_host_ = host; | 230 last_omnibox_host_ = host; |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 UrlInfo::ResolutionMotivation motivation(UrlInfo::EARLY_LOAD_MOTIVATED); | 304 UrlInfo::ResolutionMotivation motivation(UrlInfo::EARLY_LOAD_MOTIVATED); |
| 305 const int kConnectionsNeeded = 1; | 305 const int kConnectionsNeeded = 1; |
| 306 PreconnectUrl(CanonicalizeUrl(url), first_party_for_cookies, | 306 PreconnectUrl(CanonicalizeUrl(url), first_party_for_cookies, |
| 307 motivation, kConnectionsNeeded); | 307 motivation, kConnectionsNeeded); |
| 308 PredictFrameSubresources(url.GetWithEmptyPath(), first_party_for_cookies); | 308 PredictFrameSubresources(url.GetWithEmptyPath(), first_party_for_cookies); |
| 309 } | 309 } |
| 310 | 310 |
| 311 UrlList Predictor::GetPredictedUrlListAtStartup( | 311 UrlList Predictor::GetPredictedUrlListAtStartup( |
| 312 PrefService* user_prefs, | 312 PrefService* user_prefs, |
| 313 PrefService* local_state) { | 313 PrefService* local_state) { |
| 314 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 314 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 315 UrlList urls; | 315 UrlList urls; |
| 316 // Recall list of URLs we learned about during last session. | 316 // Recall list of URLs we learned about during last session. |
| 317 // This may catch secondary hostnames, pulled in by the homepages. It will | 317 // This may catch secondary hostnames, pulled in by the homepages. It will |
| 318 // also catch more of the "primary" home pages, since that was (presumably) | 318 // also catch more of the "primary" home pages, since that was (presumably) |
| 319 // rendered first (and will be rendered first this time too). | 319 // rendered first (and will be rendered first this time too). |
| 320 const base::ListValue* startup_list = | 320 const base::ListValue* startup_list = |
| 321 user_prefs->GetList(prefs::kDnsPrefetchingStartupList); | 321 user_prefs->GetList(prefs::kDnsPrefetchingStartupList); |
| 322 | 322 |
| 323 if (startup_list) { | 323 if (startup_list) { |
| 324 base::ListValue::const_iterator it = startup_list->begin(); | 324 base::ListValue::const_iterator it = startup_list->begin(); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 } | 358 } |
| 359 } | 359 } |
| 360 | 360 |
| 361 if (urls.empty()) | 361 if (urls.empty()) |
| 362 urls.push_back(GURL("http://www.google.com:80")); | 362 urls.push_back(GURL("http://www.google.com:80")); |
| 363 | 363 |
| 364 return urls; | 364 return urls; |
| 365 } | 365 } |
| 366 | 366 |
| 367 void Predictor::set_max_queueing_delay(int max_queueing_delay_ms) { | 367 void Predictor::set_max_queueing_delay(int max_queueing_delay_ms) { |
| 368 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 368 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 369 g_max_queueing_delay_ms = max_queueing_delay_ms; | 369 g_max_queueing_delay_ms = max_queueing_delay_ms; |
| 370 } | 370 } |
| 371 | 371 |
| 372 void Predictor::set_max_parallel_resolves(size_t max_parallel_resolves) { | 372 void Predictor::set_max_parallel_resolves(size_t max_parallel_resolves) { |
| 373 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 373 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 374 g_max_parallel_resolves = max_parallel_resolves; | 374 g_max_parallel_resolves = max_parallel_resolves; |
| 375 } | 375 } |
| 376 | 376 |
| 377 void Predictor::ShutdownOnUIThread() { | 377 void Predictor::ShutdownOnUIThread() { |
| 378 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 378 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 379 BrowserThread::PostTask( | 379 BrowserThread::PostTask( |
| 380 BrowserThread::IO, | 380 BrowserThread::IO, |
| 381 FROM_HERE, | 381 FROM_HERE, |
| 382 base::Bind(&Predictor::Shutdown, base::Unretained(this))); | 382 base::Bind(&Predictor::Shutdown, base::Unretained(this))); |
| 383 } | 383 } |
| 384 | 384 |
| 385 // ---------------------- End UI methods. ------------------------------------- | 385 // ---------------------- End UI methods. ------------------------------------- |
| 386 | 386 |
| 387 // --------------------- Start IO methods. ------------------------------------ | 387 // --------------------- Start IO methods. ------------------------------------ |
| 388 | 388 |
| 389 void Predictor::Shutdown() { | 389 void Predictor::Shutdown() { |
| 390 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 390 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 391 DCHECK(!shutdown_); | 391 DCHECK(!shutdown_); |
| 392 shutdown_ = true; | 392 shutdown_ = true; |
| 393 | 393 |
| 394 STLDeleteElements(&pending_lookups_); | 394 STLDeleteElements(&pending_lookups_); |
| 395 } | 395 } |
| 396 | 396 |
| 397 void Predictor::DiscardAllResults() { | 397 void Predictor::DiscardAllResults() { |
| 398 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 398 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 399 // Delete anything listed so far in this session that shows in about:dns. | 399 // Delete anything listed so far in this session that shows in about:dns. |
| 400 referrers_.clear(); | 400 referrers_.clear(); |
| 401 | 401 |
| 402 | 402 |
| 403 // Try to delete anything in our work queue. | 403 // Try to delete anything in our work queue. |
| 404 while (!work_queue_.IsEmpty()) { | 404 while (!work_queue_.IsEmpty()) { |
| 405 // Emulate processing cycle as though host was not found. | 405 // Emulate processing cycle as though host was not found. |
| 406 GURL url = work_queue_.Pop(); | 406 GURL url = work_queue_.Pop(); |
| 407 UrlInfo* info = &results_[url]; | 407 UrlInfo* info = &results_[url]; |
| 408 DCHECK(info->HasUrl(url)); | 408 DCHECK(info->HasUrl(url)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 429 // Put back in the names being worked on. | 429 // Put back in the names being worked on. |
| 430 for (Results::iterator it = assignees.begin(); assignees.end() != it; ++it) { | 430 for (Results::iterator it = assignees.begin(); assignees.end() != it; ++it) { |
| 431 DCHECK(it->second.is_marked_to_delete()); | 431 DCHECK(it->second.is_marked_to_delete()); |
| 432 results_[it->first] = it->second; | 432 results_[it->first] = it->second; |
| 433 } | 433 } |
| 434 } | 434 } |
| 435 | 435 |
| 436 // Overloaded Resolve() to take a vector of names. | 436 // Overloaded Resolve() to take a vector of names. |
| 437 void Predictor::ResolveList(const UrlList& urls, | 437 void Predictor::ResolveList(const UrlList& urls, |
| 438 UrlInfo::ResolutionMotivation motivation) { | 438 UrlInfo::ResolutionMotivation motivation) { |
| 439 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 439 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 440 | 440 |
| 441 for (UrlList::const_iterator it = urls.begin(); it < urls.end(); ++it) { | 441 for (UrlList::const_iterator it = urls.begin(); it < urls.end(); ++it) { |
| 442 AppendToResolutionQueue(*it, motivation); | 442 AppendToResolutionQueue(*it, motivation); |
| 443 } | 443 } |
| 444 } | 444 } |
| 445 | 445 |
| 446 // Basic Resolve() takes an invidual name, and adds it | 446 // Basic Resolve() takes an invidual name, and adds it |
| 447 // to the queue. | 447 // to the queue. |
| 448 void Predictor::Resolve(const GURL& url, | 448 void Predictor::Resolve(const GURL& url, |
| 449 UrlInfo::ResolutionMotivation motivation) { | 449 UrlInfo::ResolutionMotivation motivation) { |
| 450 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 450 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 451 if (!url.has_host()) | 451 if (!url.has_host()) |
| 452 return; | 452 return; |
| 453 AppendToResolutionQueue(url, motivation); | 453 AppendToResolutionQueue(url, motivation); |
| 454 } | 454 } |
| 455 | 455 |
| 456 void Predictor::LearnFromNavigation(const GURL& referring_url, | 456 void Predictor::LearnFromNavigation(const GURL& referring_url, |
| 457 const GURL& target_url) { | 457 const GURL& target_url) { |
| 458 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 458 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 459 if (!predictor_enabled_ || !CanPreresolveAndPreconnect()) | 459 if (!predictor_enabled_ || !CanPreresolveAndPreconnect()) |
| 460 return; | 460 return; |
| 461 DCHECK_EQ(referring_url, Predictor::CanonicalizeUrl(referring_url)); | 461 DCHECK_EQ(referring_url, Predictor::CanonicalizeUrl(referring_url)); |
| 462 DCHECK_NE(referring_url, GURL::EmptyGURL()); | 462 DCHECK_NE(referring_url, GURL::EmptyGURL()); |
| 463 DCHECK_EQ(target_url, Predictor::CanonicalizeUrl(target_url)); | 463 DCHECK_EQ(target_url, Predictor::CanonicalizeUrl(target_url)); |
| 464 DCHECK_NE(target_url, GURL::EmptyGURL()); | 464 DCHECK_NE(target_url, GURL::EmptyGURL()); |
| 465 | 465 |
| 466 referrers_[referring_url].SuggestHost(target_url); | 466 referrers_[referring_url].SuggestHost(target_url); |
| 467 // Possibly do some referrer trimming. | 467 // Possibly do some referrer trimming. |
| 468 TrimReferrers(); | 468 TrimReferrers(); |
| 469 } | 469 } |
| 470 | 470 |
| 471 //----------------------------------------------------------------------------- | 471 //----------------------------------------------------------------------------- |
| 472 // This section supports the about:dns page. | 472 // This section supports the about:dns page. |
| 473 | 473 |
| 474 void Predictor::PredictorGetHtmlInfo(Predictor* predictor, | 474 void Predictor::PredictorGetHtmlInfo(Predictor* predictor, |
| 475 std::string* output) { | 475 std::string* output) { |
| 476 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 476 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 477 | 477 |
| 478 output->append("<html><head><title>About DNS</title>" | 478 output->append("<html><head><title>About DNS</title>" |
| 479 // We'd like the following no-cache... but it doesn't work. | 479 // We'd like the following no-cache... but it doesn't work. |
| 480 // "<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">" | 480 // "<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">" |
| 481 "</head><body>"); | 481 "</head><body>"); |
| 482 if (predictor && predictor->predictor_enabled() && | 482 if (predictor && predictor->predictor_enabled() && |
| 483 predictor->CanPreresolveAndPreconnect()) { | 483 predictor->CanPreresolveAndPreconnect()) { |
| 484 predictor->GetHtmlInfo(output); | 484 predictor->GetHtmlInfo(output); |
| 485 } else { | 485 } else { |
| 486 output->append("DNS pre-resolution and TCP pre-connection is disabled."); | 486 output->append("DNS pre-resolution and TCP pre-connection is disabled."); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 505 std::string reversed_host = JoinString(parts, '.'); | 505 std::string reversed_host = JoinString(parts, '.'); |
| 506 | 506 |
| 507 // Return the new URL. | 507 // Return the new URL. |
| 508 GURL::Replacements url_components; | 508 GURL::Replacements url_components; |
| 509 url_components.SetHostStr(reversed_host); | 509 url_components.SetHostStr(reversed_host); |
| 510 return url.ReplaceComponents(url_components).spec(); | 510 return url.ReplaceComponents(url_components).spec(); |
| 511 } | 511 } |
| 512 }; | 512 }; |
| 513 | 513 |
| 514 void Predictor::GetHtmlReferrerLists(std::string* output) { | 514 void Predictor::GetHtmlReferrerLists(std::string* output) { |
| 515 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 515 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 516 if (referrers_.empty()) | 516 if (referrers_.empty()) |
| 517 return; | 517 return; |
| 518 | 518 |
| 519 // TODO(jar): Remove any plausible JavaScript from names before displaying. | 519 // TODO(jar): Remove any plausible JavaScript from names before displaying. |
| 520 | 520 |
| 521 typedef std::set<GURL, struct RightToLeftStringSorter> | 521 typedef std::set<GURL, struct RightToLeftStringSorter> |
| 522 SortedNames; | 522 SortedNames; |
| 523 SortedNames sorted_names; | 523 SortedNames sorted_names; |
| 524 | 524 |
| 525 for (Referrers::iterator it = referrers_.begin(); | 525 for (Referrers::iterator it = referrers_.begin(); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 static_cast<int>(future_url->second.preconnection_count()), | 558 static_cast<int>(future_url->second.preconnection_count()), |
| 559 static_cast<int>(future_url->second.preresolution_count()), | 559 static_cast<int>(future_url->second.preresolution_count()), |
| 560 static_cast<double>(future_url->second.subresource_use_rate()), | 560 static_cast<double>(future_url->second.subresource_use_rate()), |
| 561 future_url->first.spec().c_str()); | 561 future_url->first.spec().c_str()); |
| 562 } | 562 } |
| 563 } | 563 } |
| 564 output->append("</table>"); | 564 output->append("</table>"); |
| 565 } | 565 } |
| 566 | 566 |
| 567 void Predictor::GetHtmlInfo(std::string* output) { | 567 void Predictor::GetHtmlInfo(std::string* output) { |
| 568 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 568 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 569 if (initial_observer_.get()) | 569 if (initial_observer_.get()) |
| 570 initial_observer_->GetFirstResolutionsHtml(output); | 570 initial_observer_->GetFirstResolutionsHtml(output); |
| 571 // Show list of subresource predictions and stats. | 571 // Show list of subresource predictions and stats. |
| 572 GetHtmlReferrerLists(output); | 572 GetHtmlReferrerLists(output); |
| 573 | 573 |
| 574 // Local lists for calling UrlInfo | 574 // Local lists for calling UrlInfo |
| 575 UrlInfo::UrlInfoTable name_not_found; | 575 UrlInfo::UrlInfoTable name_not_found; |
| 576 UrlInfo::UrlInfoTable name_preresolved; | 576 UrlInfo::UrlInfoTable name_preresolved; |
| 577 | 577 |
| 578 // Get copies of all useful data. | 578 // Get copies of all useful data. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 600 #endif // NDEBUG | 600 #endif // NDEBUG |
| 601 | 601 |
| 602 // Call for display of each table, along with title. | 602 // Call for display of each table, along with title. |
| 603 UrlInfo::GetHtmlTable(name_preresolved, | 603 UrlInfo::GetHtmlTable(name_preresolved, |
| 604 "Preresolution DNS records performed for ", brief, output); | 604 "Preresolution DNS records performed for ", brief, output); |
| 605 UrlInfo::GetHtmlTable(name_not_found, | 605 UrlInfo::GetHtmlTable(name_not_found, |
| 606 "Preresolving DNS records revealed non-existence for ", brief, output); | 606 "Preresolving DNS records revealed non-existence for ", brief, output); |
| 607 } | 607 } |
| 608 | 608 |
| 609 void Predictor::TrimReferrersNow() { | 609 void Predictor::TrimReferrersNow() { |
| 610 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 610 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 611 // Just finish up work if an incremental trim is in progress. | 611 // Just finish up work if an incremental trim is in progress. |
| 612 if (urls_being_trimmed_.empty()) | 612 if (urls_being_trimmed_.empty()) |
| 613 LoadUrlsForTrimming(); | 613 LoadUrlsForTrimming(); |
| 614 IncrementalTrimReferrers(true); // Do everything now. | 614 IncrementalTrimReferrers(true); // Do everything now. |
| 615 } | 615 } |
| 616 | 616 |
| 617 void Predictor::SerializeReferrers(base::ListValue* referral_list) { | 617 void Predictor::SerializeReferrers(base::ListValue* referral_list) { |
| 618 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 618 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 619 referral_list->Clear(); | 619 referral_list->Clear(); |
| 620 referral_list->Append(new base::FundamentalValue(kPredictorReferrerVersion)); | 620 referral_list->Append(new base::FundamentalValue(kPredictorReferrerVersion)); |
| 621 for (Referrers::const_iterator it = referrers_.begin(); | 621 for (Referrers::const_iterator it = referrers_.begin(); |
| 622 it != referrers_.end(); ++it) { | 622 it != referrers_.end(); ++it) { |
| 623 // Serialize the list of subresource names. | 623 // Serialize the list of subresource names. |
| 624 base::Value* subresource_list(it->second.Serialize()); | 624 base::Value* subresource_list(it->second.Serialize()); |
| 625 | 625 |
| 626 // Create a list for each referer. | 626 // Create a list for each referer. |
| 627 base::ListValue* motivator(new base::ListValue); | 627 base::ListValue* motivator(new base::ListValue); |
| 628 motivator->Append(new base::StringValue(it->first.spec())); | 628 motivator->Append(new base::StringValue(it->first.spec())); |
| 629 motivator->Append(subresource_list); | 629 motivator->Append(subresource_list); |
| 630 | 630 |
| 631 referral_list->Append(motivator); | 631 referral_list->Append(motivator); |
| 632 } | 632 } |
| 633 } | 633 } |
| 634 | 634 |
| 635 void Predictor::DeserializeReferrers(const base::ListValue& referral_list) { | 635 void Predictor::DeserializeReferrers(const base::ListValue& referral_list) { |
| 636 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 636 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 637 int format_version = -1; | 637 int format_version = -1; |
| 638 if (referral_list.GetSize() > 0 && | 638 if (referral_list.GetSize() > 0 && |
| 639 referral_list.GetInteger(0, &format_version) && | 639 referral_list.GetInteger(0, &format_version) && |
| 640 format_version == kPredictorReferrerVersion) { | 640 format_version == kPredictorReferrerVersion) { |
| 641 for (size_t i = 1; i < referral_list.GetSize(); ++i) { | 641 for (size_t i = 1; i < referral_list.GetSize(); ++i) { |
| 642 const base::ListValue* motivator; | 642 const base::ListValue* motivator; |
| 643 if (!referral_list.GetList(i, &motivator)) { | 643 if (!referral_list.GetList(i, &motivator)) { |
| 644 NOTREACHED(); | 644 NOTREACHED(); |
| 645 return; | 645 return; |
| 646 } | 646 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 661 } | 661 } |
| 662 } | 662 } |
| 663 | 663 |
| 664 void Predictor::DeserializeReferrersThenDelete( | 664 void Predictor::DeserializeReferrersThenDelete( |
| 665 base::ListValue* referral_list) { | 665 base::ListValue* referral_list) { |
| 666 DeserializeReferrers(*referral_list); | 666 DeserializeReferrers(*referral_list); |
| 667 delete referral_list; | 667 delete referral_list; |
| 668 } | 668 } |
| 669 | 669 |
| 670 void Predictor::DiscardInitialNavigationHistory() { | 670 void Predictor::DiscardInitialNavigationHistory() { |
| 671 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 671 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 672 if (initial_observer_.get()) | 672 if (initial_observer_.get()) |
| 673 initial_observer_->DiscardInitialNavigationHistory(); | 673 initial_observer_->DiscardInitialNavigationHistory(); |
| 674 } | 674 } |
| 675 | 675 |
| 676 void Predictor::FinalizeInitializationOnIOThread( | 676 void Predictor::FinalizeInitializationOnIOThread( |
| 677 const UrlList& startup_urls, | 677 const UrlList& startup_urls, |
| 678 base::ListValue* referral_list, | 678 base::ListValue* referral_list, |
| 679 IOThread* io_thread, | 679 IOThread* io_thread, |
| 680 ProfileIOData* profile_io_data) { | 680 ProfileIOData* profile_io_data) { |
| 681 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 681 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 682 | 682 |
| 683 profile_io_data_ = profile_io_data; | 683 profile_io_data_ = profile_io_data; |
| 684 initial_observer_.reset(new InitialObserver()); | 684 initial_observer_.reset(new InitialObserver()); |
| 685 host_resolver_ = io_thread->globals()->host_resolver.get(); | 685 host_resolver_ = io_thread->globals()->host_resolver.get(); |
| 686 | 686 |
| 687 net::URLRequestContext* context = | 687 net::URLRequestContext* context = |
| 688 url_request_context_getter_->GetURLRequestContext(); | 688 url_request_context_getter_->GetURLRequestContext(); |
| 689 transport_security_state_ = context->transport_security_state(); | 689 transport_security_state_ = context->transport_security_state(); |
| 690 ssl_config_service_ = context->ssl_config_service(); | 690 ssl_config_service_ = context->ssl_config_service(); |
| 691 proxy_service_ = context->proxy_service(); | 691 proxy_service_ = context->proxy_service(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 704 } | 704 } |
| 705 | 705 |
| 706 //----------------------------------------------------------------------------- | 706 //----------------------------------------------------------------------------- |
| 707 // This section intermingles prefetch results with actual browser HTTP | 707 // This section intermingles prefetch results with actual browser HTTP |
| 708 // network activity. It supports calculating of the benefit of a prefetch, as | 708 // network activity. It supports calculating of the benefit of a prefetch, as |
| 709 // well as recording what prefetched hostname resolutions might be potentially | 709 // well as recording what prefetched hostname resolutions might be potentially |
| 710 // helpful during the next chrome-startup. | 710 // helpful during the next chrome-startup. |
| 711 //----------------------------------------------------------------------------- | 711 //----------------------------------------------------------------------------- |
| 712 | 712 |
| 713 void Predictor::LearnAboutInitialNavigation(const GURL& url) { | 713 void Predictor::LearnAboutInitialNavigation(const GURL& url) { |
| 714 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 714 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 715 if (!predictor_enabled_ || NULL == initial_observer_.get() || | 715 if (!predictor_enabled_ || NULL == initial_observer_.get() || |
| 716 !CanPreresolveAndPreconnect()) { | 716 !CanPreresolveAndPreconnect()) { |
| 717 return; | 717 return; |
| 718 } | 718 } |
| 719 initial_observer_->Append(url, this); | 719 initial_observer_->Append(url, this); |
| 720 } | 720 } |
| 721 | 721 |
| 722 // This API is only used in the browser process. | 722 // This API is only used in the browser process. |
| 723 // It is called from an IPC message originating in the renderer. It currently | 723 // It is called from an IPC message originating in the renderer. It currently |
| 724 // includes both Page-Scan, and Link-Hover prefetching. | 724 // includes both Page-Scan, and Link-Hover prefetching. |
| 725 // TODO(jar): Separate out link-hover prefetching, and page-scan results. | 725 // TODO(jar): Separate out link-hover prefetching, and page-scan results. |
| 726 void Predictor::DnsPrefetchList(const NameList& hostnames) { | 726 void Predictor::DnsPrefetchList(const NameList& hostnames) { |
| 727 // TODO(jar): Push GURL transport further back into renderer, but this will | 727 // TODO(jar): Push GURL transport further back into renderer, but this will |
| 728 // require a Webkit change in the observer :-/. | 728 // require a Webkit change in the observer :-/. |
| 729 UrlList urls; | 729 UrlList urls; |
| 730 for (NameList::const_iterator it = hostnames.begin(); | 730 for (NameList::const_iterator it = hostnames.begin(); |
| 731 it < hostnames.end(); | 731 it < hostnames.end(); |
| 732 ++it) { | 732 ++it) { |
| 733 urls.push_back(GURL("http://" + *it + ":80")); | 733 urls.push_back(GURL("http://" + *it + ":80")); |
| 734 } | 734 } |
| 735 | 735 |
| 736 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 736 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 737 DnsPrefetchMotivatedList(urls, UrlInfo::PAGE_SCAN_MOTIVATED); | 737 DnsPrefetchMotivatedList(urls, UrlInfo::PAGE_SCAN_MOTIVATED); |
| 738 } | 738 } |
| 739 | 739 |
| 740 void Predictor::DnsPrefetchMotivatedList( | 740 void Predictor::DnsPrefetchMotivatedList( |
| 741 const UrlList& urls, | 741 const UrlList& urls, |
| 742 UrlInfo::ResolutionMotivation motivation) { | 742 UrlInfo::ResolutionMotivation motivation) { |
| 743 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || | 743 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || |
| 744 BrowserThread::CurrentlyOn(BrowserThread::IO)); | 744 BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 745 if (!predictor_enabled_) | 745 if (!predictor_enabled_) |
| 746 return; | 746 return; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 760 | 760 |
| 761 //----------------------------------------------------------------------------- | 761 //----------------------------------------------------------------------------- |
| 762 // Functions to handle saving of hostnames from one session to the next, to | 762 // Functions to handle saving of hostnames from one session to the next, to |
| 763 // expedite startup times. | 763 // expedite startup times. |
| 764 | 764 |
| 765 static void SaveDnsPrefetchStateForNextStartupAndTrimOnIOThread( | 765 static void SaveDnsPrefetchStateForNextStartupAndTrimOnIOThread( |
| 766 base::ListValue* startup_list, | 766 base::ListValue* startup_list, |
| 767 base::ListValue* referral_list, | 767 base::ListValue* referral_list, |
| 768 base::WaitableEvent* completion, | 768 base::WaitableEvent* completion, |
| 769 Predictor* predictor) { | 769 Predictor* predictor) { |
| 770 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 770 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 771 | 771 |
| 772 if (NULL == predictor) { | 772 if (NULL == predictor) { |
| 773 completion->Signal(); | 773 completion->Signal(); |
| 774 return; | 774 return; |
| 775 } | 775 } |
| 776 predictor->SaveDnsPrefetchStateForNextStartupAndTrim( | 776 predictor->SaveDnsPrefetchStateForNextStartupAndTrim( |
| 777 startup_list, referral_list, completion); | 777 startup_list, referral_list, completion); |
| 778 } | 778 } |
| 779 | 779 |
| 780 void Predictor::SaveStateForNextStartupAndTrim() { | 780 void Predictor::SaveStateForNextStartupAndTrim() { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 base::ThreadRestrictions::ScopedAllowWait allow_wait; | 814 base::ThreadRestrictions::ScopedAllowWait allow_wait; |
| 815 completion.Wait(); | 815 completion.Wait(); |
| 816 } | 816 } |
| 817 } | 817 } |
| 818 } | 818 } |
| 819 | 819 |
| 820 void Predictor::SaveDnsPrefetchStateForNextStartupAndTrim( | 820 void Predictor::SaveDnsPrefetchStateForNextStartupAndTrim( |
| 821 base::ListValue* startup_list, | 821 base::ListValue* startup_list, |
| 822 base::ListValue* referral_list, | 822 base::ListValue* referral_list, |
| 823 base::WaitableEvent* completion) { | 823 base::WaitableEvent* completion) { |
| 824 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 824 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 825 if (initial_observer_.get()) | 825 if (initial_observer_.get()) |
| 826 initial_observer_->GetInitialDnsResolutionList(startup_list); | 826 initial_observer_->GetInitialDnsResolutionList(startup_list); |
| 827 | 827 |
| 828 // Do at least one trim at shutdown, in case the user wasn't running long | 828 // Do at least one trim at shutdown, in case the user wasn't running long |
| 829 // enough to do any regular trimming of referrers. | 829 // enough to do any regular trimming of referrers. |
| 830 // TODO(lizeb): Should trimming really be done at each shutdown? This could be | 830 // TODO(lizeb): Should trimming really be done at each shutdown? This could be |
| 831 // a frequent occurrence on Android. | 831 // a frequent occurrence on Android. |
| 832 TrimReferrersNow(); | 832 TrimReferrersNow(); |
| 833 SerializeReferrers(referral_list); | 833 SerializeReferrers(referral_list); |
| 834 | 834 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 893 FROM_HERE, | 893 FROM_HERE, |
| 894 base::Bind(&Predictor::PrepareFrameSubresources, | 894 base::Bind(&Predictor::PrepareFrameSubresources, |
| 895 base::Unretained(this), url, first_party_for_cookies)); | 895 base::Unretained(this), url, first_party_for_cookies)); |
| 896 } | 896 } |
| 897 } | 897 } |
| 898 | 898 |
| 899 bool Predictor::CanPrefetchAndPrerender() const { | 899 bool Predictor::CanPrefetchAndPrerender() const { |
| 900 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 900 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| 901 return chrome_browser_net::CanPrefetchAndPrerenderUI(user_prefs_); | 901 return chrome_browser_net::CanPrefetchAndPrerenderUI(user_prefs_); |
| 902 } else { | 902 } else { |
| 903 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 903 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 904 return chrome_browser_net::CanPrefetchAndPrerenderIO(profile_io_data_); | 904 return chrome_browser_net::CanPrefetchAndPrerenderIO(profile_io_data_); |
| 905 } | 905 } |
| 906 } | 906 } |
| 907 | 907 |
| 908 bool Predictor::CanPreresolveAndPreconnect() const { | 908 bool Predictor::CanPreresolveAndPreconnect() const { |
| 909 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 909 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| 910 return chrome_browser_net::CanPreresolveAndPreconnectUI(user_prefs_); | 910 return chrome_browser_net::CanPreresolveAndPreconnectUI(user_prefs_); |
| 911 } else { | 911 } else { |
| 912 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 912 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 913 return chrome_browser_net::CanPreresolveAndPreconnectIO(profile_io_data_); | 913 return chrome_browser_net::CanPreresolveAndPreconnectIO(profile_io_data_); |
| 914 } | 914 } |
| 915 } | 915 } |
| 916 | 916 |
| 917 enum SubresourceValue { | 917 enum SubresourceValue { |
| 918 PRECONNECTION, | 918 PRECONNECTION, |
| 919 PRERESOLUTION, | 919 PRERESOLUTION, |
| 920 TOO_NEW, | 920 TOO_NEW, |
| 921 SUBRESOURCE_VALUE_MAX | 921 SUBRESOURCE_VALUE_MAX |
| 922 }; | 922 }; |
| 923 | 923 |
| 924 void Predictor::PrepareFrameSubresources(const GURL& original_url, | 924 void Predictor::PrepareFrameSubresources(const GURL& original_url, |
| 925 const GURL& first_party_for_cookies) { | 925 const GURL& first_party_for_cookies) { |
| 926 // Apply HSTS redirect early so it is taken into account when looking up | 926 // Apply HSTS redirect early so it is taken into account when looking up |
| 927 // subresources. | 927 // subresources. |
| 928 GURL url = GetHSTSRedirectOnIOThread(original_url); | 928 GURL url = GetHSTSRedirectOnIOThread(original_url); |
| 929 | 929 |
| 930 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 930 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 931 DCHECK_EQ(url.GetWithEmptyPath(), url); | 931 DCHECK_EQ(url.GetWithEmptyPath(), url); |
| 932 Referrers::iterator it = referrers_.find(url); | 932 Referrers::iterator it = referrers_.find(url); |
| 933 if (referrers_.end() == it) { | 933 if (referrers_.end() == it) { |
| 934 // Only when we don't know anything about this url, make 2 connections | 934 // Only when we don't know anything about this url, make 2 connections |
| 935 // available. We could do this completely via learning (by prepopulating | 935 // available. We could do this completely via learning (by prepopulating |
| 936 // the referrer_ list with this expected value), but it would swell the | 936 // the referrer_ list with this expected value), but it would swell the |
| 937 // size of the list with all the "Leaf" nodes in the tree (nodes that don't | 937 // size of the list with all the "Leaf" nodes in the tree (nodes that don't |
| 938 // load any subresources). If we learn about this resource, we will instead | 938 // load any subresources). If we learn about this resource, we will instead |
| 939 // provide a more carefully estimated preconnection count. | 939 // provide a more carefully estimated preconnection count. |
| 940 if (preconnect_enabled_) { | 940 if (preconnect_enabled_) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 973 if (queued_info) | 973 if (queued_info) |
| 974 queued_info->SetReferringHostname(url); | 974 queued_info->SetReferringHostname(url); |
| 975 } | 975 } |
| 976 UMA_HISTOGRAM_ENUMERATION("Net.PreconnectSubresourceEval", evalution, | 976 UMA_HISTOGRAM_ENUMERATION("Net.PreconnectSubresourceEval", evalution, |
| 977 SUBRESOURCE_VALUE_MAX); | 977 SUBRESOURCE_VALUE_MAX); |
| 978 } | 978 } |
| 979 } | 979 } |
| 980 | 980 |
| 981 void Predictor::OnLookupFinished(LookupRequest* request, const GURL& url, | 981 void Predictor::OnLookupFinished(LookupRequest* request, const GURL& url, |
| 982 bool found) { | 982 bool found) { |
| 983 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 983 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 984 | 984 |
| 985 LookupFinished(request, url, found); | 985 LookupFinished(request, url, found); |
| 986 pending_lookups_.erase(request); | 986 pending_lookups_.erase(request); |
| 987 delete request; | 987 delete request; |
| 988 | 988 |
| 989 StartSomeQueuedResolutions(); | 989 StartSomeQueuedResolutions(); |
| 990 } | 990 } |
| 991 | 991 |
| 992 void Predictor::LookupFinished(LookupRequest* request, const GURL& url, | 992 void Predictor::LookupFinished(LookupRequest* request, const GURL& url, |
| 993 bool found) { | 993 bool found) { |
| 994 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 994 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 995 UrlInfo* info = &results_[url]; | 995 UrlInfo* info = &results_[url]; |
| 996 DCHECK(info->HasUrl(url)); | 996 DCHECK(info->HasUrl(url)); |
| 997 if (info->is_marked_to_delete()) { | 997 if (info->is_marked_to_delete()) { |
| 998 results_.erase(url); | 998 results_.erase(url); |
| 999 } else { | 999 } else { |
| 1000 if (found) | 1000 if (found) |
| 1001 info->SetFoundState(); | 1001 info->SetFoundState(); |
| 1002 else | 1002 else |
| 1003 info->SetNoSuchNameState(); | 1003 info->SetNoSuchNameState(); |
| 1004 } | 1004 } |
| 1005 } | 1005 } |
| 1006 | 1006 |
| 1007 bool Predictor::WouldLikelyProxyURL(const GURL& url) { | 1007 bool Predictor::WouldLikelyProxyURL(const GURL& url) { |
| 1008 if (!proxy_service_) | 1008 if (!proxy_service_) |
| 1009 return false; | 1009 return false; |
| 1010 | 1010 |
| 1011 net::ProxyInfo info; | 1011 net::ProxyInfo info; |
| 1012 bool synchronous_success = proxy_service_->TryResolveProxySynchronously( | 1012 bool synchronous_success = proxy_service_->TryResolveProxySynchronously( |
| 1013 url, net::LOAD_NORMAL, &info, NULL, net::BoundNetLog()); | 1013 url, net::LOAD_NORMAL, &info, NULL, net::BoundNetLog()); |
| 1014 | 1014 |
| 1015 return synchronous_success && !info.is_direct(); | 1015 return synchronous_success && !info.is_direct(); |
| 1016 } | 1016 } |
| 1017 | 1017 |
| 1018 UrlInfo* Predictor::AppendToResolutionQueue( | 1018 UrlInfo* Predictor::AppendToResolutionQueue( |
| 1019 const GURL& url, | 1019 const GURL& url, |
| 1020 UrlInfo::ResolutionMotivation motivation) { | 1020 UrlInfo::ResolutionMotivation motivation) { |
| 1021 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 1021 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1022 DCHECK(url.has_host()); | 1022 DCHECK(url.has_host()); |
| 1023 | 1023 |
| 1024 if (shutdown_) | 1024 if (shutdown_) |
| 1025 return NULL; | 1025 return NULL; |
| 1026 | 1026 |
| 1027 UrlInfo* info = &results_[url]; | 1027 UrlInfo* info = &results_[url]; |
| 1028 info->SetUrl(url); // Initialize or DCHECK. | 1028 info->SetUrl(url); // Initialize or DCHECK. |
| 1029 // TODO(jar): I need to discard names that have long since expired. | 1029 // TODO(jar): I need to discard names that have long since expired. |
| 1030 // Currently we only add to the domain map :-/ | 1030 // Currently we only add to the domain map :-/ |
| 1031 | 1031 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1050 } | 1050 } |
| 1051 | 1051 |
| 1052 info->SetQueuedState(motivation); | 1052 info->SetQueuedState(motivation); |
| 1053 work_queue_.Push(url, motivation); | 1053 work_queue_.Push(url, motivation); |
| 1054 | 1054 |
| 1055 StartSomeQueuedResolutions(); | 1055 StartSomeQueuedResolutions(); |
| 1056 return info; | 1056 return info; |
| 1057 } | 1057 } |
| 1058 | 1058 |
| 1059 bool Predictor::CongestionControlPerformed(UrlInfo* info) { | 1059 bool Predictor::CongestionControlPerformed(UrlInfo* info) { |
| 1060 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 1060 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1061 // Note: queue_duration is ONLY valid after we go to assigned state. | 1061 // Note: queue_duration is ONLY valid after we go to assigned state. |
| 1062 if (info->queue_duration() < max_dns_queue_delay_) | 1062 if (info->queue_duration() < max_dns_queue_delay_) |
| 1063 return false; | 1063 return false; |
| 1064 // We need to discard all entries in our queue, as we're keeping them waiting | 1064 // We need to discard all entries in our queue, as we're keeping them waiting |
| 1065 // too long. By doing this, we'll have a chance to quickly service urgent | 1065 // too long. By doing this, we'll have a chance to quickly service urgent |
| 1066 // resolutions, and not have a bogged down system. | 1066 // resolutions, and not have a bogged down system. |
| 1067 while (true) { | 1067 while (true) { |
| 1068 info->RemoveFromQueue(); | 1068 info->RemoveFromQueue(); |
| 1069 if (work_queue_.IsEmpty()) | 1069 if (work_queue_.IsEmpty()) |
| 1070 break; | 1070 break; |
| 1071 info = &results_[work_queue_.Pop()]; | 1071 info = &results_[work_queue_.Pop()]; |
| 1072 info->SetAssignedState(); | 1072 info->SetAssignedState(); |
| 1073 } | 1073 } |
| 1074 return true; | 1074 return true; |
| 1075 } | 1075 } |
| 1076 | 1076 |
| 1077 void Predictor::StartSomeQueuedResolutions() { | 1077 void Predictor::StartSomeQueuedResolutions() { |
| 1078 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 1078 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1079 | 1079 |
| 1080 while (!work_queue_.IsEmpty() && | 1080 while (!work_queue_.IsEmpty() && |
| 1081 pending_lookups_.size() < max_concurrent_dns_lookups_) { | 1081 pending_lookups_.size() < max_concurrent_dns_lookups_) { |
| 1082 const GURL url(work_queue_.Pop()); | 1082 const GURL url(work_queue_.Pop()); |
| 1083 UrlInfo* info = &results_[url]; | 1083 UrlInfo* info = &results_[url]; |
| 1084 DCHECK(info->HasUrl(url)); | 1084 DCHECK(info->HasUrl(url)); |
| 1085 info->SetAssignedState(); | 1085 info->SetAssignedState(); |
| 1086 | 1086 |
| 1087 if (CongestionControlPerformed(info)) { | 1087 if (CongestionControlPerformed(info)) { |
| 1088 DCHECK(work_queue_.IsEmpty()); | 1088 DCHECK(work_queue_.IsEmpty()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1109 // Completed synchronously (was already cached by HostResolver), or else | 1109 // Completed synchronously (was already cached by HostResolver), or else |
| 1110 // there was (equivalently) some network error that prevents us from | 1110 // there was (equivalently) some network error that prevents us from |
| 1111 // finding the name. Status net::OK means it was "found." | 1111 // finding the name. Status net::OK means it was "found." |
| 1112 LookupFinished(request, url, status == net::OK); | 1112 LookupFinished(request, url, status == net::OK); |
| 1113 delete request; | 1113 delete request; |
| 1114 } | 1114 } |
| 1115 } | 1115 } |
| 1116 } | 1116 } |
| 1117 | 1117 |
| 1118 void Predictor::TrimReferrers() { | 1118 void Predictor::TrimReferrers() { |
| 1119 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 1119 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1120 if (!urls_being_trimmed_.empty()) | 1120 if (!urls_being_trimmed_.empty()) |
| 1121 return; // There is incremental trimming in progress already. | 1121 return; // There is incremental trimming in progress already. |
| 1122 | 1122 |
| 1123 // Check to see if it is time to trim yet. | 1123 // Check to see if it is time to trim yet. |
| 1124 base::TimeTicks now = base::TimeTicks::Now(); | 1124 base::TimeTicks now = base::TimeTicks::Now(); |
| 1125 if (now < next_trim_time_) | 1125 if (now < next_trim_time_) |
| 1126 return; | 1126 return; |
| 1127 next_trim_time_ = now + TimeDelta::FromHours(kDurationBetweenTrimmingsHours); | 1127 next_trim_time_ = now + TimeDelta::FromHours(kDurationBetweenTrimmingsHours); |
| 1128 | 1128 |
| 1129 LoadUrlsForTrimming(); | 1129 LoadUrlsForTrimming(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1159 urls_being_trimmed_.pop_back(); | 1159 urls_being_trimmed_.pop_back(); |
| 1160 if (it == referrers_.end()) | 1160 if (it == referrers_.end()) |
| 1161 continue; // Defensive code: It got trimmed away already. | 1161 continue; // Defensive code: It got trimmed away already. |
| 1162 if (!it->second.Trim(kReferrerTrimRatio, kDiscardableExpectedValue)) | 1162 if (!it->second.Trim(kReferrerTrimRatio, kDiscardableExpectedValue)) |
| 1163 referrers_.erase(it); | 1163 referrers_.erase(it); |
| 1164 } | 1164 } |
| 1165 PostIncrementalTrimTask(); | 1165 PostIncrementalTrimTask(); |
| 1166 } | 1166 } |
| 1167 | 1167 |
| 1168 GURL Predictor::GetHSTSRedirectOnIOThread(const GURL& url) { | 1168 GURL Predictor::GetHSTSRedirectOnIOThread(const GURL& url) { |
| 1169 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 1169 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1170 | 1170 |
| 1171 if (!transport_security_state_) | 1171 if (!transport_security_state_) |
| 1172 return url; | 1172 return url; |
| 1173 if (!url.SchemeIs("http")) | 1173 if (!url.SchemeIs("http")) |
| 1174 return url; | 1174 return url; |
| 1175 if (!transport_security_state_->ShouldUpgradeToSSL(url.host())) | 1175 if (!transport_security_state_->ShouldUpgradeToSSL(url.host())) |
| 1176 return url; | 1176 return url; |
| 1177 | 1177 |
| 1178 url::Replacements<char> replacements; | 1178 url::Replacements<char> replacements; |
| 1179 const char kNewScheme[] = "https"; | 1179 const char kNewScheme[] = "https"; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1223 // Member definitions for InitialObserver class. | 1223 // Member definitions for InitialObserver class. |
| 1224 | 1224 |
| 1225 Predictor::InitialObserver::InitialObserver() { | 1225 Predictor::InitialObserver::InitialObserver() { |
| 1226 } | 1226 } |
| 1227 | 1227 |
| 1228 Predictor::InitialObserver::~InitialObserver() { | 1228 Predictor::InitialObserver::~InitialObserver() { |
| 1229 } | 1229 } |
| 1230 | 1230 |
| 1231 void Predictor::InitialObserver::Append(const GURL& url, | 1231 void Predictor::InitialObserver::Append(const GURL& url, |
| 1232 Predictor* predictor) { | 1232 Predictor* predictor) { |
| 1233 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 1233 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1234 | 1234 |
| 1235 // TODO(rlp): Do we really need the predictor check here? | 1235 // TODO(rlp): Do we really need the predictor check here? |
| 1236 if (NULL == predictor) | 1236 if (NULL == predictor) |
| 1237 return; | 1237 return; |
| 1238 if (kStartupResolutionCount <= first_navigations_.size()) | 1238 if (kStartupResolutionCount <= first_navigations_.size()) |
| 1239 return; | 1239 return; |
| 1240 | 1240 |
| 1241 DCHECK(url.SchemeIsHTTPOrHTTPS()); | 1241 DCHECK(url.SchemeIsHTTPOrHTTPS()); |
| 1242 DCHECK_EQ(url, Predictor::CanonicalizeUrl(url)); | 1242 DCHECK_EQ(url, Predictor::CanonicalizeUrl(url)); |
| 1243 if (first_navigations_.find(url) == first_navigations_.end()) | 1243 if (first_navigations_.find(url) == first_navigations_.end()) |
| 1244 first_navigations_[url] = base::TimeTicks::Now(); | 1244 first_navigations_[url] = base::TimeTicks::Now(); |
| 1245 } | 1245 } |
| 1246 | 1246 |
| 1247 void Predictor::InitialObserver::GetInitialDnsResolutionList( | 1247 void Predictor::InitialObserver::GetInitialDnsResolutionList( |
| 1248 base::ListValue* startup_list) { | 1248 base::ListValue* startup_list) { |
| 1249 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 1249 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1250 DCHECK(startup_list); | 1250 DCHECK(startup_list); |
| 1251 startup_list->Clear(); | 1251 startup_list->Clear(); |
| 1252 DCHECK_EQ(0u, startup_list->GetSize()); | 1252 DCHECK_EQ(0u, startup_list->GetSize()); |
| 1253 startup_list->Append( | 1253 startup_list->Append( |
| 1254 new base::FundamentalValue(kPredictorStartupFormatVersion)); | 1254 new base::FundamentalValue(kPredictorStartupFormatVersion)); |
| 1255 for (FirstNavigations::iterator it = first_navigations_.begin(); | 1255 for (FirstNavigations::iterator it = first_navigations_.begin(); |
| 1256 it != first_navigations_.end(); | 1256 it != first_navigations_.end(); |
| 1257 ++it) { | 1257 ++it) { |
| 1258 DCHECK(it->first == Predictor::CanonicalizeUrl(it->first)); | 1258 DCHECK(it->first == Predictor::CanonicalizeUrl(it->first)); |
| 1259 startup_list->Append(new base::StringValue(it->first.spec())); | 1259 startup_list->Append(new base::StringValue(it->first.spec())); |
| 1260 } | 1260 } |
| 1261 } | 1261 } |
| 1262 | 1262 |
| 1263 void Predictor::InitialObserver::GetFirstResolutionsHtml( | 1263 void Predictor::InitialObserver::GetFirstResolutionsHtml( |
| 1264 std::string* output) { | 1264 std::string* output) { |
| 1265 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 1265 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1266 | 1266 |
| 1267 UrlInfo::UrlInfoTable resolution_list; | 1267 UrlInfo::UrlInfoTable resolution_list; |
| 1268 { | 1268 { |
| 1269 for (FirstNavigations::iterator it(first_navigations_.begin()); | 1269 for (FirstNavigations::iterator it(first_navigations_.begin()); |
| 1270 it != first_navigations_.end(); | 1270 it != first_navigations_.end(); |
| 1271 it++) { | 1271 it++) { |
| 1272 UrlInfo info; | 1272 UrlInfo info; |
| 1273 info.SetUrl(it->first); | 1273 info.SetUrl(it->first); |
| 1274 info.set_time(it->second); | 1274 info.set_time(it->second); |
| 1275 resolution_list.push_back(info); | 1275 resolution_list.push_back(info); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1317 } | 1317 } |
| 1318 | 1318 |
| 1319 void SimplePredictor::ShutdownOnUIThread() { | 1319 void SimplePredictor::ShutdownOnUIThread() { |
| 1320 SetShutdown(true); | 1320 SetShutdown(true); |
| 1321 } | 1321 } |
| 1322 | 1322 |
| 1323 bool SimplePredictor::CanPrefetchAndPrerender() const { return true; } | 1323 bool SimplePredictor::CanPrefetchAndPrerender() const { return true; } |
| 1324 bool SimplePredictor::CanPreresolveAndPreconnect() const { return true; } | 1324 bool SimplePredictor::CanPreresolveAndPreconnect() const { return true; } |
| 1325 | 1325 |
| 1326 } // namespace chrome_browser_net | 1326 } // namespace chrome_browser_net |
| OLD | NEW |