| 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> |
| (...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 // static | 606 // static |
| 607 bool PrerenderManager::IsPrerenderingPossible() { | 607 bool PrerenderManager::IsPrerenderingPossible() { |
| 608 return GetMode() != PRERENDER_MODE_DISABLED; | 608 return GetMode() != PRERENDER_MODE_DISABLED; |
| 609 } | 609 } |
| 610 | 610 |
| 611 // static | 611 // static |
| 612 bool PrerenderManager::IsNoStatePrefetch() { | 612 bool PrerenderManager::IsNoStatePrefetch() { |
| 613 return GetMode() == PRERENDER_MODE_NOSTATE_PREFETCH; | 613 return GetMode() == PRERENDER_MODE_NOSTATE_PREFETCH; |
| 614 } | 614 } |
| 615 | 615 |
| 616 // static |
| 617 bool PrerenderManager::IsSimpleLoadExperiment() { |
| 618 return GetMode() == PRERENDER_MODE_SIMPLE_LOAD_EXPERIMENT; |
| 619 } |
| 620 |
| 616 bool PrerenderManager::IsWebContentsPrerendering( | 621 bool PrerenderManager::IsWebContentsPrerendering( |
| 617 const WebContents* web_contents, | 622 const WebContents* web_contents, |
| 618 Origin* origin) const { | 623 Origin* origin) const { |
| 619 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 624 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 620 PrerenderContents* prerender_contents = GetPrerenderContents(web_contents); | 625 PrerenderContents* prerender_contents = GetPrerenderContents(web_contents); |
| 621 if (!prerender_contents) | 626 if (!prerender_contents) |
| 622 return false; | 627 return false; |
| 623 | 628 |
| 624 if (origin) | 629 if (origin) |
| 625 *origin = prerender_contents->origin(); | 630 *origin = prerender_contents->origin(); |
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 936 // Check if enough time has passed since the last prerender. | 941 // Check if enough time has passed since the last prerender. |
| 937 if (!DoesRateLimitAllowPrerender(origin)) { | 942 if (!DoesRateLimitAllowPrerender(origin)) { |
| 938 // Cancel the prerender. We could add it to the pending prerender list but | 943 // Cancel the prerender. We could add it to the pending prerender list but |
| 939 // this doesn't make sense as the next prerender request will be triggered | 944 // this doesn't make sense as the next prerender request will be triggered |
| 940 // by a navigation and is unlikely to be the same site. | 945 // by a navigation and is unlikely to be the same site. |
| 941 RecordFinalStatusWithoutCreatingPrerenderContents( | 946 RecordFinalStatusWithoutCreatingPrerenderContents( |
| 942 url, origin, FINAL_STATUS_RATE_LIMIT_EXCEEDED); | 947 url, origin, FINAL_STATUS_RATE_LIMIT_EXCEEDED); |
| 943 return nullptr; | 948 return nullptr; |
| 944 } | 949 } |
| 945 | 950 |
| 951 // Record the URL in the prefetch list, even when in full prerender mode, to |
| 952 // enable metrics comparisons. |
| 953 prefetches_.emplace_back(url, GetCurrentTimeTicks(), origin); |
| 954 |
| 955 if (IsSimpleLoadExperiment()) { |
| 956 // Exit after adding the url to prefetches_, so that no prefetching occurs |
| 957 // but the page is still tracked as "would have been prefetched". |
| 958 return nullptr; |
| 959 } |
| 960 |
| 946 std::unique_ptr<PrerenderContents> prerender_contents = | 961 std::unique_ptr<PrerenderContents> prerender_contents = |
| 947 CreatePrerenderContents(url, referrer, origin); | 962 CreatePrerenderContents(url, referrer, origin); |
| 948 DCHECK(prerender_contents); | 963 DCHECK(prerender_contents); |
| 949 PrerenderContents* prerender_contents_ptr = prerender_contents.get(); | 964 PrerenderContents* prerender_contents_ptr = prerender_contents.get(); |
| 950 if (IsNoStatePrefetch()) | 965 if (IsNoStatePrefetch()) |
| 951 prerender_contents_ptr->SetPrerenderMode(PREFETCH_ONLY); | 966 prerender_contents_ptr->SetPrerenderMode(PREFETCH_ONLY); |
| 952 active_prerenders_.push_back( | 967 active_prerenders_.push_back( |
| 953 base::MakeUnique<PrerenderData>(this, std::move(prerender_contents), | 968 base::MakeUnique<PrerenderData>(this, std::move(prerender_contents), |
| 954 GetExpiryTimeForNewPrerender(origin))); | 969 GetExpiryTimeForNewPrerender(origin))); |
| 955 if (!prerender_contents_ptr->Init()) { | 970 if (!prerender_contents_ptr->Init()) { |
| 956 DCHECK(active_prerenders_.end() == | 971 DCHECK(active_prerenders_.end() == |
| 957 FindIteratorForPrerenderContents(prerender_contents_ptr)); | 972 FindIteratorForPrerenderContents(prerender_contents_ptr)); |
| 958 return nullptr; | 973 return nullptr; |
| 959 } | 974 } |
| 960 | 975 |
| 961 histograms_->RecordPrerenderStarted(origin); | 976 histograms_->RecordPrerenderStarted(origin); |
| 962 DCHECK(!prerender_contents_ptr->prerendering_has_started()); | 977 DCHECK(!prerender_contents_ptr->prerendering_has_started()); |
| 963 | 978 |
| 964 if (prerender_contents_ptr->prerender_mode() == PREFETCH_ONLY) | |
| 965 prefetches_.emplace_back(url, GetCurrentTimeTicks(), origin); | |
| 966 | |
| 967 std::unique_ptr<PrerenderHandle> prerender_handle = | 979 std::unique_ptr<PrerenderHandle> prerender_handle = |
| 968 base::WrapUnique(new PrerenderHandle(active_prerenders_.back().get())); | 980 base::WrapUnique(new PrerenderHandle(active_prerenders_.back().get())); |
| 969 SortActivePrerenders(); | 981 SortActivePrerenders(); |
| 970 | 982 |
| 971 last_prerender_start_time_ = GetCurrentTimeTicks(); | 983 last_prerender_start_time_ = GetCurrentTimeTicks(); |
| 972 | 984 |
| 973 gfx::Rect contents_bounds = | 985 gfx::Rect contents_bounds = |
| 974 bounds.IsEmpty() ? config_.default_tab_bounds : bounds; | 986 bounds.IsEmpty() ? config_.default_tab_bounds : bounds; |
| 975 | 987 |
| 976 prerender_contents_ptr->StartPrerendering(contents_bounds, | 988 prerender_contents_ptr->StartPrerendering(contents_bounds, |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1349 return weak_factory_.GetWeakPtr(); | 1361 return weak_factory_.GetWeakPtr(); |
| 1350 } | 1362 } |
| 1351 | 1363 |
| 1352 void PrerenderManager::SetPrerenderContentsFactoryForTest( | 1364 void PrerenderManager::SetPrerenderContentsFactoryForTest( |
| 1353 PrerenderContents::Factory* prerender_contents_factory) { | 1365 PrerenderContents::Factory* prerender_contents_factory) { |
| 1354 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1366 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1355 prerender_contents_factory_.reset(prerender_contents_factory); | 1367 prerender_contents_factory_.reset(prerender_contents_factory); |
| 1356 } | 1368 } |
| 1357 | 1369 |
| 1358 } // namespace prerender | 1370 } // namespace prerender |
| OLD | NEW |