Chromium Code Reviews| 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 |