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/prerender/prerender_manager.h" | 5 #include "chrome/browser/prerender/prerender_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <functional> | 8 #include <functional> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 1254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1265 MaybeGetQueryStringBasedAliasURL(url, &alias_url)) { | 1265 MaybeGetQueryStringBasedAliasURL(url, &alias_url)) { |
1266 url = alias_url; | 1266 url = alias_url; |
1267 } | 1267 } |
1268 | 1268 |
1269 // From here on, we will record a FinalStatus so we need to register with the | 1269 // From here on, we will record a FinalStatus so we need to register with the |
1270 // histogram tracking. | 1270 // histogram tracking. |
1271 histograms_->RecordPrerender(origin, url_arg); | 1271 histograms_->RecordPrerender(origin, url_arg); |
1272 | 1272 |
1273 if (PrerenderData* preexisting_prerender_data = | 1273 if (PrerenderData* preexisting_prerender_data = |
1274 FindPrerenderData(url, session_storage_namespace)) { | 1274 FindPrerenderData(url, session_storage_namespace)) { |
1275 RecordFinalStatus(origin, experiment, FINAL_STATUS_DUPLICATE); | 1275 RecordFinalStatusWithoutCreatingPrerenderContents( |
| 1276 url, origin, experiment, FINAL_STATUS_DUPLICATE); |
1276 return new PrerenderHandle(preexisting_prerender_data); | 1277 return new PrerenderHandle(preexisting_prerender_data); |
1277 } | 1278 } |
1278 | 1279 |
1279 // Do not prerender if there are too many render processes, and we would | 1280 // Do not prerender if there are too many render processes, and we would |
1280 // have to use an existing one. We do not want prerendering to happen in | 1281 // have to use an existing one. We do not want prerendering to happen in |
1281 // a shared process, so that we can always reliably lower the CPU | 1282 // a shared process, so that we can always reliably lower the CPU |
1282 // priority for prerendering. | 1283 // priority for prerendering. |
1283 // In single-process mode, ShouldTryToUseExistingProcessHost() always returns | 1284 // In single-process mode, ShouldTryToUseExistingProcessHost() always returns |
1284 // true, so that case needs to be explicitly checked for. | 1285 // true, so that case needs to be explicitly checked for. |
1285 // TODO(tburkard): Figure out how to cancel prerendering in the opposite | 1286 // TODO(tburkard): Figure out how to cancel prerendering in the opposite |
1286 // case, when a new tab is added to a process used for prerendering. | 1287 // case, when a new tab is added to a process used for prerendering. |
1287 // TODO(ppi): Check whether there are usually enough render processes | 1288 // TODO(ppi): Check whether there are usually enough render processes |
1288 // available on Android. If not, kill an existing renderers so that we can | 1289 // available on Android. If not, kill an existing renderers so that we can |
1289 // create a new one. | 1290 // create a new one. |
1290 if (content::RenderProcessHost::ShouldTryToUseExistingProcessHost( | 1291 if (content::RenderProcessHost::ShouldTryToUseExistingProcessHost( |
1291 profile_, url) && | 1292 profile_, url) && |
1292 !content::RenderProcessHost::run_renderer_in_process()) { | 1293 !content::RenderProcessHost::run_renderer_in_process()) { |
1293 RecordFinalStatus(origin, experiment, FINAL_STATUS_TOO_MANY_PROCESSES); | 1294 RecordFinalStatusWithoutCreatingPrerenderContents( |
| 1295 url, origin, experiment, FINAL_STATUS_TOO_MANY_PROCESSES); |
1294 return NULL; | 1296 return NULL; |
1295 } | 1297 } |
1296 | 1298 |
1297 // Check if enough time has passed since the last prerender. | 1299 // Check if enough time has passed since the last prerender. |
1298 if (!DoesRateLimitAllowPrerender(origin)) { | 1300 if (!DoesRateLimitAllowPrerender(origin)) { |
1299 // Cancel the prerender. We could add it to the pending prerender list but | 1301 // Cancel the prerender. We could add it to the pending prerender list but |
1300 // this doesn't make sense as the next prerender request will be triggered | 1302 // this doesn't make sense as the next prerender request will be triggered |
1301 // by a navigation and is unlikely to be the same site. | 1303 // by a navigation and is unlikely to be the same site. |
1302 RecordFinalStatus(origin, experiment, FINAL_STATUS_RATE_LIMIT_EXCEEDED); | 1304 RecordFinalStatusWithoutCreatingPrerenderContents( |
| 1305 url, origin, experiment, FINAL_STATUS_RATE_LIMIT_EXCEEDED); |
1303 return NULL; | 1306 return NULL; |
1304 } | 1307 } |
1305 | 1308 |
1306 if (!cookie_store_loaded()) { | 1309 if (!cookie_store_loaded()) { |
1307 // Only prerender if the cookie store for this profile has been loaded. | 1310 // Only prerender if the cookie store for this profile has been loaded. |
1308 // This is required by PrerenderCookieMonster. | 1311 // This is required by PrerenderCookieMonster. |
1309 RecordFinalStatus(origin, experiment, FINAL_STATUS_COOKIE_STORE_NOT_LOADED); | 1312 RecordFinalStatus(origin, experiment, FINAL_STATUS_COOKIE_STORE_NOT_LOADED); |
1310 return NULL; | 1313 return NULL; |
1311 } | 1314 } |
1312 | 1315 |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1591 FinalStatus final_status) { | 1594 FinalStatus final_status) { |
1592 prerender_contents->set_match_complete_status( | 1595 prerender_contents->set_match_complete_status( |
1593 PrerenderContents::MATCH_COMPLETE_REPLACED); | 1596 PrerenderContents::MATCH_COMPLETE_REPLACED); |
1594 histograms_->RecordFinalStatus(prerender_contents->origin(), | 1597 histograms_->RecordFinalStatus(prerender_contents->origin(), |
1595 prerender_contents->experiment_id(), | 1598 prerender_contents->experiment_id(), |
1596 PrerenderContents::MATCH_COMPLETE_REPLACEMENT, | 1599 PrerenderContents::MATCH_COMPLETE_REPLACEMENT, |
1597 FINAL_STATUS_WOULD_HAVE_BEEN_USED); | 1600 FINAL_STATUS_WOULD_HAVE_BEEN_USED); |
1598 prerender_contents->Destroy(final_status); | 1601 prerender_contents->Destroy(final_status); |
1599 } | 1602 } |
1600 | 1603 |
1601 void PrerenderManager::RecordFinalStatus(Origin origin, | 1604 void PrerenderManager::RecordFinalStatusWithoutCreatingPrerenderContents( |
1602 uint8 experiment_id, | 1605 const GURL& url, Origin origin, uint8 experiment_id, |
1603 FinalStatus final_status) const { | 1606 FinalStatus final_status) const { |
| 1607 PrerenderHistory::Entry entry(url, final_status, origin, base::Time::Now()); |
| 1608 prerender_history_->AddEntry(entry); |
1604 RecordFinalStatusWithMatchCompleteStatus( | 1609 RecordFinalStatusWithMatchCompleteStatus( |
1605 origin, experiment_id, | 1610 origin, experiment_id, |
1606 PrerenderContents::MATCH_COMPLETE_DEFAULT, | 1611 PrerenderContents::MATCH_COMPLETE_DEFAULT, |
1607 final_status); | 1612 final_status); |
1608 } | 1613 } |
1609 | 1614 |
1610 bool PrerenderManager::IsEnabled() const { | 1615 bool PrerenderManager::IsEnabled() const { |
1611 DCHECK(CalledOnValidThread()); | 1616 DCHECK(CalledOnValidThread()); |
1612 if (!enabled_) | 1617 if (!enabled_) |
1613 return false; | 1618 return false; |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1887 content::RenderProcessHost* host) { | 1892 content::RenderProcessHost* host) { |
1888 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1893 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1889 prerender_process_hosts_.erase(host); | 1894 prerender_process_hosts_.erase(host); |
1890 BrowserThread::PostTask( | 1895 BrowserThread::PostTask( |
1891 BrowserThread::IO, FROM_HERE, | 1896 BrowserThread::IO, FROM_HERE, |
1892 base::Bind(&PrerenderTracker::RemovePrerenderCookieStoreOnIOThread, | 1897 base::Bind(&PrerenderTracker::RemovePrerenderCookieStoreOnIOThread, |
1893 base::Unretained(prerender_tracker()), host->GetID(), false)); | 1898 base::Unretained(prerender_tracker()), host->GetID(), false)); |
1894 } | 1899 } |
1895 | 1900 |
1896 } // namespace prerender | 1901 } // namespace prerender |
OLD | NEW |