Chromium Code Reviews| Index: chrome/browser/prerender/prerender_manager.cc |
| diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc |
| index 743d117f38ca0a3799144705869176d0a3602a41..765c95325d4ab914651347f13fe5ff55a3c84fcc 100644 |
| --- a/chrome/browser/prerender/prerender_manager.cc |
| +++ b/chrome/browser/prerender/prerender_manager.cc |
| @@ -25,6 +25,7 @@ |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/chrome_notification_types.h" |
| #include "chrome/browser/net/prediction_options.h" |
| +#include "chrome/browser/prerender/prerender_constants.h" |
| #include "chrome/browser/prerender/prerender_contents.h" |
| #include "chrome/browser/prerender/prerender_field_trial.h" |
| #include "chrome/browser/prerender/prerender_final_status.h" |
| @@ -325,6 +326,14 @@ PrerenderHandle* PrerenderManager::AddPrerenderForInstant( |
| session_storage_namespace); |
| } |
| +PrerenderHandle* PrerenderManager::AddPrerenderForOffline( |
| + const GURL& url, |
| + content::SessionStorageNamespace* session_storage_namespace, |
| + const gfx::Size& size) { |
| + return AddPrerender(ORIGIN_OFFLINE, url, content::Referrer(), size, |
| + session_storage_namespace); |
| +} |
| + |
| void PrerenderManager::CancelAllPrerenders() { |
| DCHECK(CalledOnValidThread()); |
| while (!active_prerenders_.empty()) { |
| @@ -532,6 +541,9 @@ WebContents* PrerenderManager::SwapInternal( |
| ScheduleDeleteOldWebContents(old_web_contents, NULL); |
| } |
| + // Offline originated prerenders should never ever be swapped-in. |
| + DCHECK(prerender_contents->origin() != ORIGIN_OFFLINE); |
| + |
| // TODO(cbentzel): Should prerender_contents move to the pending delete |
| // list, instead of deleting directly here? |
| AddToHistory(prerender_contents.get()); |
| @@ -1104,6 +1116,9 @@ void PrerenderManager::PostCleanupTask() { |
| base::TimeTicks PrerenderManager::GetExpiryTimeForNewPrerender( |
| Origin origin) const { |
| + if (origin == ORIGIN_OFFLINE) |
| + return GetCurrentTimeTicks() + base::TimeDelta::FromMinutes( |
| + kOfflinePrerenderLifeExpectancyMinutes); |
| return GetCurrentTimeTicks() + config_.time_to_live; |
| } |
| @@ -1174,6 +1189,8 @@ bool PrerenderManager::DoesRateLimitAllowPrerender(Origin origin) const { |
| base::TimeDelta elapsed_time = |
| GetCurrentTimeTicks() - last_prerender_start_time_; |
| histograms_->RecordTimeBetweenPrerenderRequests(origin, elapsed_time); |
| + if (origin == ORIGIN_OFFLINE) |
| + return true; |
| if (!config_.rate_limit_enabled) |
| return true; |
| return elapsed_time >= |
| @@ -1316,10 +1333,18 @@ NetworkPredictionStatus PrerenderManager::GetPredictionStatusForOrigin( |
| Origin origin) const { |
| DCHECK(CalledOnValidThread()); |
| - // LINK rel=prerender origins ignore the network state and the privacy |
| - // settings. |
| + // <link rel=prerender> origins ignore the network state and the privacy |
| + // settings. Web developers should be able prefetch with all possible privacy |
| + // settings and with all possible network types. This would avoid web devs |
| + // coming up with creative ways to prefetch in cases they are not allowed to |
| + // do so. |
| + // |
| + // Offline originated prerenders also ignore the network state and privacy |
| + // settings because want to be able to snapshot webpages independently of |
|
pasko
2016/04/05 11:49:56
slight rephrasing: "because they are controlled by
gabadie
2016/04/05 13:35:24
Done.
|
| + // these former settings. |
| if (origin == ORIGIN_LINK_REL_PRERENDER_SAMEDOMAIN || |
| - origin == ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN) { |
| + origin == ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN || |
| + origin == ORIGIN_OFFLINE) { |
| return NetworkPredictionStatus::ENABLED; |
| } |