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

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

Issue 2580753005: Disable No-State prefetch for offline origins. (Closed)
Patch Set: Created 4 years 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>
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/prerender/prerender_manager.h ('k') | chrome/browser/prerender/prerender_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698