Chromium Code Reviews| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <functional> | 10 #include <functional> |
| 11 #include <string> | 11 #include <string> |
| 12 #include <vector> | 12 #include <vector> |
| 13 | 13 |
| 14 #include "base/bind.h" | 14 #include "base/bind.h" |
| 15 #include "base/bind_helpers.h" | 15 #include "base/bind_helpers.h" |
| 16 #include "base/location.h" | 16 #include "base/location.h" |
| 17 #include "base/logging.h" | 17 #include "base/logging.h" |
| 18 #include "base/macros.h" | 18 #include "base/macros.h" |
| 19 #include "base/metrics/histogram.h" | 19 #include "base/metrics/histogram.h" |
| 20 #include "base/single_thread_task_runner.h" | 20 #include "base/single_thread_task_runner.h" |
| 21 #include "base/thread_task_runner_handle.h" | 21 #include "base/thread_task_runner_handle.h" |
| 22 #include "base/time/time.h" | 22 #include "base/time/time.h" |
| 23 #include "base/timer/elapsed_timer.h" | 23 #include "base/timer/elapsed_timer.h" |
| 24 #include "base/values.h" | 24 #include "base/values.h" |
| 25 #include "chrome/browser/browser_process.h" | 25 #include "chrome/browser/browser_process.h" |
| 26 #include "chrome/browser/chrome_notification_types.h" | 26 #include "chrome/browser/chrome_notification_types.h" |
| 27 #include "chrome/browser/net/prediction_options.h" | 27 #include "chrome/browser/net/prediction_options.h" |
| 28 #include "chrome/browser/prerender/prerender_constants.h" | |
| 28 #include "chrome/browser/prerender/prerender_contents.h" | 29 #include "chrome/browser/prerender/prerender_contents.h" |
| 29 #include "chrome/browser/prerender/prerender_field_trial.h" | 30 #include "chrome/browser/prerender/prerender_field_trial.h" |
| 30 #include "chrome/browser/prerender/prerender_final_status.h" | 31 #include "chrome/browser/prerender/prerender_final_status.h" |
| 31 #include "chrome/browser/prerender/prerender_handle.h" | 32 #include "chrome/browser/prerender/prerender_handle.h" |
| 32 #include "chrome/browser/prerender/prerender_histograms.h" | 33 #include "chrome/browser/prerender/prerender_histograms.h" |
| 33 #include "chrome/browser/prerender/prerender_history.h" | 34 #include "chrome/browser/prerender/prerender_history.h" |
| 34 #include "chrome/browser/prerender/prerender_manager_factory.h" | 35 #include "chrome/browser/prerender/prerender_manager_factory.h" |
| 35 #include "chrome/browser/prerender/prerender_tab_helper.h" | 36 #include "chrome/browser/prerender/prerender_tab_helper.h" |
| 36 #include "chrome/browser/prerender/prerender_util.h" | 37 #include "chrome/browser/prerender/prerender_util.h" |
| 37 #include "chrome/browser/profiles/profile.h" | 38 #include "chrome/browser/profiles/profile.h" |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 318 | 319 |
| 319 PrerenderHandle* PrerenderManager::AddPrerenderForInstant( | 320 PrerenderHandle* PrerenderManager::AddPrerenderForInstant( |
| 320 const GURL& url, | 321 const GURL& url, |
| 321 content::SessionStorageNamespace* session_storage_namespace, | 322 content::SessionStorageNamespace* session_storage_namespace, |
| 322 const gfx::Size& size) { | 323 const gfx::Size& size) { |
| 323 DCHECK(search::ShouldPrefetchSearchResults()); | 324 DCHECK(search::ShouldPrefetchSearchResults()); |
| 324 return AddPrerender(ORIGIN_INSTANT, url, content::Referrer(), size, | 325 return AddPrerender(ORIGIN_INSTANT, url, content::Referrer(), size, |
| 325 session_storage_namespace); | 326 session_storage_namespace); |
| 326 } | 327 } |
| 327 | 328 |
| 329 PrerenderHandle* PrerenderManager::AddPrerenderForOffline( | |
| 330 const GURL& url, | |
| 331 content::SessionStorageNamespace* session_storage_namespace, | |
| 332 const gfx::Size& size) { | |
| 333 return AddPrerender(ORIGIN_OFFLINE, url, content::Referrer(), size, | |
| 334 session_storage_namespace); | |
| 335 } | |
| 336 | |
| 328 void PrerenderManager::CancelAllPrerenders() { | 337 void PrerenderManager::CancelAllPrerenders() { |
| 329 DCHECK(CalledOnValidThread()); | 338 DCHECK(CalledOnValidThread()); |
| 330 while (!active_prerenders_.empty()) { | 339 while (!active_prerenders_.empty()) { |
| 331 PrerenderContents* prerender_contents = | 340 PrerenderContents* prerender_contents = |
| 332 active_prerenders_.front()->contents(); | 341 active_prerenders_.front()->contents(); |
| 333 prerender_contents->Destroy(FINAL_STATUS_CANCELLED); | 342 prerender_contents->Destroy(FINAL_STATUS_CANCELLED); |
| 334 } | 343 } |
| 335 } | 344 } |
| 336 | 345 |
| 337 bool PrerenderManager::MaybeUsePrerenderedPage(const GURL& url, | 346 bool PrerenderManager::MaybeUsePrerenderedPage(const GURL& url, |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 525 // Schedule the delete to occur after the tab has run its unload handlers. | 534 // Schedule the delete to occur after the tab has run its unload handlers. |
| 526 // TODO(davidben): Honor the beforeunload event. http://crbug.com/304932 | 535 // TODO(davidben): Honor the beforeunload event. http://crbug.com/304932 |
| 527 on_close_web_contents_deleters_.push_back( | 536 on_close_web_contents_deleters_.push_back( |
| 528 new OnCloseWebContentsDeleter(this, old_web_contents)); | 537 new OnCloseWebContentsDeleter(this, old_web_contents)); |
| 529 old_web_contents->DispatchBeforeUnload(false); | 538 old_web_contents->DispatchBeforeUnload(false); |
| 530 } else { | 539 } else { |
| 531 // No unload handler to run, so delete asap. | 540 // No unload handler to run, so delete asap. |
| 532 ScheduleDeleteOldWebContents(old_web_contents, NULL); | 541 ScheduleDeleteOldWebContents(old_web_contents, NULL); |
| 533 } | 542 } |
| 534 | 543 |
| 544 // Offline originated prerenders should never ever be swapped-in. | |
| 545 DCHECK(prerender_contents->origin() != ORIGIN_OFFLINE); | |
|
mmenke
2016/04/05 18:48:26
You don't seem to be enforcing this anywhere? Sit
gabadie
2016/04/14 18:28:51
We rely on the assemption that the offline should
| |
| 546 | |
| 535 // TODO(cbentzel): Should prerender_contents move to the pending delete | 547 // TODO(cbentzel): Should prerender_contents move to the pending delete |
| 536 // list, instead of deleting directly here? | 548 // list, instead of deleting directly here? |
| 537 AddToHistory(prerender_contents.get()); | 549 AddToHistory(prerender_contents.get()); |
| 538 RecordNavigation(url); | 550 RecordNavigation(url); |
| 539 return new_web_contents; | 551 return new_web_contents; |
| 540 } | 552 } |
| 541 | 553 |
| 542 void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry, | 554 void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry, |
| 543 FinalStatus final_status) { | 555 FinalStatus final_status) { |
| 544 DCHECK(CalledOnValidThread()); | 556 DCHECK(CalledOnValidThread()); |
| (...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1097 } | 1109 } |
| 1098 | 1110 |
| 1099 void PrerenderManager::PostCleanupTask() { | 1111 void PrerenderManager::PostCleanupTask() { |
| 1100 DCHECK(CalledOnValidThread()); | 1112 DCHECK(CalledOnValidThread()); |
| 1101 base::ThreadTaskRunnerHandle::Get()->PostTask( | 1113 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 1102 FROM_HERE, base::Bind(&PrerenderManager::PeriodicCleanup, AsWeakPtr())); | 1114 FROM_HERE, base::Bind(&PrerenderManager::PeriodicCleanup, AsWeakPtr())); |
| 1103 } | 1115 } |
| 1104 | 1116 |
| 1105 base::TimeTicks PrerenderManager::GetExpiryTimeForNewPrerender( | 1117 base::TimeTicks PrerenderManager::GetExpiryTimeForNewPrerender( |
| 1106 Origin origin) const { | 1118 Origin origin) const { |
| 1119 if (origin == ORIGIN_OFFLINE) | |
| 1120 return GetCurrentTimeTicks() + base::TimeDelta::FromMinutes( | |
| 1121 kOfflinePrerenderLifeExpectancyMinutes); | |
| 1107 return GetCurrentTimeTicks() + config_.time_to_live; | 1122 return GetCurrentTimeTicks() + config_.time_to_live; |
| 1108 } | 1123 } |
| 1109 | 1124 |
| 1110 base::TimeTicks PrerenderManager::GetExpiryTimeForNavigatedAwayPrerender() | 1125 base::TimeTicks PrerenderManager::GetExpiryTimeForNavigatedAwayPrerender() |
| 1111 const { | 1126 const { |
| 1112 return GetCurrentTimeTicks() + config_.abandon_time_to_live; | 1127 return GetCurrentTimeTicks() + config_.abandon_time_to_live; |
| 1113 } | 1128 } |
| 1114 | 1129 |
| 1115 void PrerenderManager::DeleteOldEntries() { | 1130 void PrerenderManager::DeleteOldEntries() { |
| 1116 DCHECK(CalledOnValidThread()); | 1131 DCHECK(CalledOnValidThread()); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1167 return it; | 1182 return it; |
| 1168 } | 1183 } |
| 1169 return active_prerenders_.end(); | 1184 return active_prerenders_.end(); |
| 1170 } | 1185 } |
| 1171 | 1186 |
| 1172 bool PrerenderManager::DoesRateLimitAllowPrerender(Origin origin) const { | 1187 bool PrerenderManager::DoesRateLimitAllowPrerender(Origin origin) const { |
| 1173 DCHECK(CalledOnValidThread()); | 1188 DCHECK(CalledOnValidThread()); |
| 1174 base::TimeDelta elapsed_time = | 1189 base::TimeDelta elapsed_time = |
| 1175 GetCurrentTimeTicks() - last_prerender_start_time_; | 1190 GetCurrentTimeTicks() - last_prerender_start_time_; |
| 1176 histograms_->RecordTimeBetweenPrerenderRequests(origin, elapsed_time); | 1191 histograms_->RecordTimeBetweenPrerenderRequests(origin, elapsed_time); |
| 1192 if (origin == ORIGIN_OFFLINE) | |
| 1193 return true; | |
| 1177 if (!config_.rate_limit_enabled) | 1194 if (!config_.rate_limit_enabled) |
| 1178 return true; | 1195 return true; |
| 1179 return elapsed_time >= | 1196 return elapsed_time >= |
| 1180 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs); | 1197 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs); |
| 1181 } | 1198 } |
| 1182 | 1199 |
| 1183 void PrerenderManager::DeleteOldWebContents() { | 1200 void PrerenderManager::DeleteOldWebContents() { |
| 1184 while (!old_web_contents_list_.empty()) { | 1201 while (!old_web_contents_list_.empty()) { |
| 1185 WebContents* web_contents = old_web_contents_list_.front(); | 1202 WebContents* web_contents = old_web_contents_list_.front(); |
| 1186 old_web_contents_list_.pop_front(); | 1203 old_web_contents_list_.pop_front(); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1309 | 1326 |
| 1310 NetworkPredictionStatus PrerenderManager::GetPredictionStatus() const { | 1327 NetworkPredictionStatus PrerenderManager::GetPredictionStatus() const { |
| 1311 DCHECK(CalledOnValidThread()); | 1328 DCHECK(CalledOnValidThread()); |
| 1312 return CanPrefetchAndPrerenderUI(profile_->GetPrefs()); | 1329 return CanPrefetchAndPrerenderUI(profile_->GetPrefs()); |
| 1313 } | 1330 } |
| 1314 | 1331 |
| 1315 NetworkPredictionStatus PrerenderManager::GetPredictionStatusForOrigin( | 1332 NetworkPredictionStatus PrerenderManager::GetPredictionStatusForOrigin( |
| 1316 Origin origin) const { | 1333 Origin origin) const { |
| 1317 DCHECK(CalledOnValidThread()); | 1334 DCHECK(CalledOnValidThread()); |
| 1318 | 1335 |
| 1319 // LINK rel=prerender origins ignore the network state and the privacy | 1336 // <link rel=prerender> origins ignore the network state and the privacy |
| 1320 // settings. | 1337 // settings. Web developers should be able prefetch with all possible privacy |
| 1338 // settings and with all possible network types. This would avoid web devs | |
| 1339 // coming up with creative ways to prefetch in cases they are not allowed to | |
| 1340 // do so. | |
| 1341 // | |
| 1342 // Offline originated prerenders also ignore the network state and privacy | |
| 1343 // settings because they are controlled by the offliner logic via | |
| 1344 // PrerenderHandle. | |
| 1321 if (origin == ORIGIN_LINK_REL_PRERENDER_SAMEDOMAIN || | 1345 if (origin == ORIGIN_LINK_REL_PRERENDER_SAMEDOMAIN || |
| 1322 origin == ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN) { | 1346 origin == ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN || |
| 1347 origin == ORIGIN_OFFLINE) { | |
| 1323 return NetworkPredictionStatus::ENABLED; | 1348 return NetworkPredictionStatus::ENABLED; |
| 1324 } | 1349 } |
| 1325 | 1350 |
| 1326 // Prerendering forced for cellular networks still prevents navigation with | 1351 // Prerendering forced for cellular networks still prevents navigation with |
| 1327 // the DISABLED_ALWAYS selected via privacy settings. | 1352 // the DISABLED_ALWAYS selected via privacy settings. |
| 1328 NetworkPredictionStatus prediction_status = | 1353 NetworkPredictionStatus prediction_status = |
| 1329 CanPrefetchAndPrerenderUI(profile_->GetPrefs()); | 1354 CanPrefetchAndPrerenderUI(profile_->GetPrefs()); |
| 1330 if (origin == ORIGIN_EXTERNAL_REQUEST_FORCED_CELLULAR && | 1355 if (origin == ORIGIN_EXTERNAL_REQUEST_FORCED_CELLULAR && |
| 1331 prediction_status == NetworkPredictionStatus::DISABLED_DUE_TO_NETWORK) { | 1356 prediction_status == NetworkPredictionStatus::DISABLED_DUE_TO_NETWORK) { |
| 1332 return NetworkPredictionStatus::ENABLED; | 1357 return NetworkPredictionStatus::ENABLED; |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 1360 } | 1385 } |
| 1361 | 1386 |
| 1362 void PrerenderManager::RenderProcessHostDestroyed( | 1387 void PrerenderManager::RenderProcessHostDestroyed( |
| 1363 content::RenderProcessHost* host) { | 1388 content::RenderProcessHost* host) { |
| 1364 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1389 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1365 size_t erased = prerender_process_hosts_.erase(host); | 1390 size_t erased = prerender_process_hosts_.erase(host); |
| 1366 DCHECK_EQ(1u, erased); | 1391 DCHECK_EQ(1u, erased); |
| 1367 } | 1392 } |
| 1368 | 1393 |
| 1369 } // namespace prerender | 1394 } // namespace prerender |
| OLD | NEW |