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 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
93 // Because of this, it is okay to show prerendered contents even if | 93 // Because of this, it is okay to show prerendered contents even if |
94 // |extra_headers| contains "Upgrade-Insecure-Requests" header. | 94 // |extra_headers| contains "Upgrade-Insecure-Requests" header. |
95 bool AreExtraHeadersCompatibleWithPrerenderContents( | 95 bool AreExtraHeadersCompatibleWithPrerenderContents( |
96 const std::string& extra_headers) { | 96 const std::string& extra_headers) { |
97 net::HttpRequestHeaders parsed_headers; | 97 net::HttpRequestHeaders parsed_headers; |
98 parsed_headers.AddHeadersFromString(extra_headers); | 98 parsed_headers.AddHeadersFromString(extra_headers); |
99 parsed_headers.RemoveHeader("upgrade-insecure-requests"); | 99 parsed_headers.RemoveHeader("upgrade-insecure-requests"); |
100 return parsed_headers.IsEmpty(); | 100 return parsed_headers.IsEmpty(); |
101 } | 101 } |
102 | 102 |
103 // Returns true if prerendering is forced, because it is needed as a feature, as | |
104 // opposed to a performance optimization. | |
105 bool IsPrerenderingForced(Origin origin) { | |
106 return origin == ORIGIN_OFFLINE || | |
107 origin == ORIGIN_EXTERNAL_REQUEST_FORCED_CELLULAR; | |
108 } | |
109 | |
103 } // namespace | 110 } // namespace |
104 | 111 |
105 class PrerenderManager::OnCloseWebContentsDeleter | 112 class PrerenderManager::OnCloseWebContentsDeleter |
106 : public content::WebContentsDelegate, | 113 : public content::WebContentsDelegate, |
107 public base::SupportsWeakPtr< | 114 public base::SupportsWeakPtr< |
108 PrerenderManager::OnCloseWebContentsDeleter> { | 115 PrerenderManager::OnCloseWebContentsDeleter> { |
109 public: | 116 public: |
110 OnCloseWebContentsDeleter(PrerenderManager* manager, | 117 OnCloseWebContentsDeleter(PrerenderManager* manager, |
111 std::unique_ptr<WebContents> tab) | 118 std::unique_ptr<WebContents> tab) |
112 : manager_(manager), tab_(std::move(tab)), suppressed_dialog_(false) { | 119 : manager_(manager), tab_(std::move(tab)), suppressed_dialog_(false) { |
(...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
602 void PrerenderManager::SetMode(PrerenderManagerMode mode) { | 609 void PrerenderManager::SetMode(PrerenderManagerMode mode) { |
603 mode_ = mode; | 610 mode_ = mode; |
604 } | 611 } |
605 | 612 |
606 // static | 613 // static |
607 bool PrerenderManager::IsPrerenderingPossible() { | 614 bool PrerenderManager::IsPrerenderingPossible() { |
608 return GetMode() != PRERENDER_MODE_DISABLED; | 615 return GetMode() != PRERENDER_MODE_DISABLED; |
609 } | 616 } |
610 | 617 |
611 // static | 618 // static |
612 bool PrerenderManager::IsNoStatePrefetch() { | 619 bool PrerenderManager::IsNoStatePrefetch(Origin origin) { |
613 return GetMode() == PRERENDER_MODE_NOSTATE_PREFETCH; | 620 return !IsPrerenderingForced(origin) && |
621 GetMode() == PRERENDER_MODE_NOSTATE_PREFETCH; | |
614 } | 622 } |
615 | 623 |
616 // static | 624 // static |
617 bool PrerenderManager::IsSimpleLoadExperiment() { | 625 bool PrerenderManager::IsSimpleLoadExperiment(Origin origin) { |
618 return GetMode() == PRERENDER_MODE_SIMPLE_LOAD_EXPERIMENT; | 626 return !IsPrerenderingForced(origin) && |
627 GetMode() == PRERENDER_MODE_SIMPLE_LOAD_EXPERIMENT; | |
619 } | 628 } |
620 | 629 |
621 bool PrerenderManager::IsWebContentsPrerendering( | 630 bool PrerenderManager::IsWebContentsPrerendering( |
622 const WebContents* web_contents, | 631 const WebContents* web_contents, |
623 Origin* origin) const { | 632 Origin* origin) const { |
624 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 633 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
625 PrerenderContents* prerender_contents = GetPrerenderContents(web_contents); | 634 PrerenderContents* prerender_contents = GetPrerenderContents(web_contents); |
626 if (!prerender_contents) | 635 if (!prerender_contents) |
627 return false; | 636 return false; |
628 | 637 |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
943 // Cancel the prerender. We could add it to the pending prerender list but | 952 // Cancel the prerender. We could add it to the pending prerender list but |
944 // this doesn't make sense as the next prerender request will be triggered | 953 // this doesn't make sense as the next prerender request will be triggered |
945 // by a navigation and is unlikely to be the same site. | 954 // by a navigation and is unlikely to be the same site. |
946 RecordFinalStatusWithoutCreatingPrerenderContents( | 955 RecordFinalStatusWithoutCreatingPrerenderContents( |
947 url, origin, FINAL_STATUS_RATE_LIMIT_EXCEEDED); | 956 url, origin, FINAL_STATUS_RATE_LIMIT_EXCEEDED); |
948 return nullptr; | 957 return nullptr; |
949 } | 958 } |
950 | 959 |
951 // Record the URL in the prefetch list, even when in full prerender mode, to | 960 // Record the URL in the prefetch list, even when in full prerender mode, to |
952 // enable metrics comparisons. | 961 // enable metrics comparisons. |
953 prefetches_.emplace_back(url, GetCurrentTimeTicks(), origin); | 962 prefetches_.emplace_back(url, GetCurrentTimeTicks(), origin); |
pasko
2016/12/16 17:23:00
Just to double-check that I understand: modifying
droger
2016/12/16 18:35:47
Yes, exactly.
This messes up our metrics a bit bu
| |
954 | 963 |
955 if (IsSimpleLoadExperiment()) { | 964 if (IsSimpleLoadExperiment(origin)) { |
956 // Exit after adding the url to prefetches_, so that no prefetching occurs | 965 // Exit after adding the url to prefetches_, so that no prefetching occurs |
957 // but the page is still tracked as "would have been prefetched". | 966 // but the page is still tracked as "would have been prefetched". |
958 return nullptr; | 967 return nullptr; |
959 } | 968 } |
960 | 969 |
961 std::unique_ptr<PrerenderContents> prerender_contents = | 970 std::unique_ptr<PrerenderContents> prerender_contents = |
962 CreatePrerenderContents(url, referrer, origin); | 971 CreatePrerenderContents(url, referrer, origin); |
963 DCHECK(prerender_contents); | 972 DCHECK(prerender_contents); |
964 PrerenderContents* prerender_contents_ptr = prerender_contents.get(); | 973 PrerenderContents* prerender_contents_ptr = prerender_contents.get(); |
965 if (IsNoStatePrefetch()) | 974 if (IsNoStatePrefetch(origin)) |
966 prerender_contents_ptr->SetPrerenderMode(PREFETCH_ONLY); | 975 prerender_contents_ptr->SetPrerenderMode(PREFETCH_ONLY); |
967 active_prerenders_.push_back( | 976 active_prerenders_.push_back( |
968 base::MakeUnique<PrerenderData>(this, std::move(prerender_contents), | 977 base::MakeUnique<PrerenderData>(this, std::move(prerender_contents), |
969 GetExpiryTimeForNewPrerender(origin))); | 978 GetExpiryTimeForNewPrerender(origin))); |
970 if (!prerender_contents_ptr->Init()) { | 979 if (!prerender_contents_ptr->Init()) { |
971 DCHECK(active_prerenders_.end() == | 980 DCHECK(active_prerenders_.end() == |
972 FindIteratorForPrerenderContents(prerender_contents_ptr)); | 981 FindIteratorForPrerenderContents(prerender_contents_ptr)); |
973 return nullptr; | 982 return nullptr; |
974 } | 983 } |
975 | 984 |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1361 return weak_factory_.GetWeakPtr(); | 1370 return weak_factory_.GetWeakPtr(); |
1362 } | 1371 } |
1363 | 1372 |
1364 void PrerenderManager::SetPrerenderContentsFactoryForTest( | 1373 void PrerenderManager::SetPrerenderContentsFactoryForTest( |
1365 PrerenderContents::Factory* prerender_contents_factory) { | 1374 PrerenderContents::Factory* prerender_contents_factory) { |
1366 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1375 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1367 prerender_contents_factory_.reset(prerender_contents_factory); | 1376 prerender_contents_factory_.reset(prerender_contents_factory); |
1368 } | 1377 } |
1369 | 1378 |
1370 } // namespace prerender | 1379 } // namespace prerender |
OLD | NEW |