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

Side by Side Diff: chrome/browser/prerender/prerender_manager.cc

Issue 1854643002: Implement PrerenderManager::AddPrerenderForOffline() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addresses pasko's comments Created 4 years, 8 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
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/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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698