Don't trigger HTTPS Previews unless there is a chrome-proxy header
(cherry picked from commit b8b8b0aec3606c7c9d4f1934c70e34b25b621e94)
Bug: 972756
Change-Id: I18e4716e31859f171a29edbfd70a19f86f24c708
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1652422
Commit-Queue: Robert Ogden <robertogden@chromium.org>
Reviewed-by: Ryan Sturm <ryansturm@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#668654}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1658936
Reviewed-by: Robert Ogden <robertogden@chromium.org>
Cr-Commit-Position: refs/branch-heads/3809@{#304}
Cr-Branched-From: d82dec1a818f378c464ba307ddd9c92133eac355-refs/heads/master@{#665002}
diff --git a/chrome/browser/previews/previews_content_util.cc b/chrome/browser/previews/previews_content_util.cc
index abdd661..86c4077 100644
--- a/chrome/browser/previews/previews_content_util.cc
+++ b/chrome/browser/previews/previews_content_util.cc
@@ -103,6 +103,11 @@
PreviewsLitePageNavigationThrottle::IneligibleReason::kCookiesBlocked);
}
+ if (!decider->has_drp_headers()) {
+ ineligible_reasons.push_back(PreviewsLitePageNavigationThrottle::
+ IneligibleReason::kInvalidProxyHeaders);
+ }
+
// Record UMA.
for (PreviewsLitePageNavigationThrottle::IneligibleReason reason :
ineligible_reasons) {
diff --git a/chrome/browser/previews/previews_lite_page_browsertest.cc b/chrome/browser/previews/previews_lite_page_browsertest.cc
index 10ab94a..b1e4ad8 100644
--- a/chrome/browser/previews/previews_lite_page_browsertest.cc
+++ b/chrome/browser/previews/previews_lite_page_browsertest.cc
@@ -1065,6 +1065,31 @@
IN_PROC_BROWSER_TEST_P(
PreviewsLitePageServerBrowserTest,
+ DISABLE_ON_WIN_MAC_CHROMESOS(LitePagePreviewsNoChromeProxyHeader)) {
+ ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
+ VerifyPreviewLoaded();
+
+ // Mimic a bad proxy header update.
+ net::HttpRequestHeaders empty;
+ PreviewsService* previews_service =
+ PreviewsServiceFactory::GetForProfile(browser()->profile());
+ PreviewsLitePageDecider* decider =
+ previews_service->previews_lite_page_decider();
+ decider->OnProxyRequestHeadersChanged(empty);
+
+ base::HistogramTester histogram_tester;
+ ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
+ VerifyPreviewNotLoaded();
+
+ histogram_tester.ExpectBucketCount(
+ "Previews.ServerLitePage.IneligibleReasons",
+ static_cast<int>(PreviewsLitePageNavigationThrottle::IneligibleReason::
+ kInvalidProxyHeaders),
+ 1);
+}
+
+IN_PROC_BROWSER_TEST_P(
+ PreviewsLitePageServerBrowserTest,
DISABLE_ON_WIN_MAC_CHROMESOS(CoinFlipHoldbackTriggering)) {
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitAndEnableFeatureWithParameters(
diff --git a/chrome/browser/previews/previews_lite_page_decider.cc b/chrome/browser/previews/previews_lite_page_decider.cc
index 036d3af6..58012c5 100644
--- a/chrome/browser/previews/previews_lite_page_decider.cc
+++ b/chrome/browser/previews/previews_lite_page_decider.cc
@@ -23,6 +23,7 @@
#include "chrome/browser/profiles/profile.h"
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.h"
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
+#include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h"
#include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
#include "components/data_use_measurement/core/data_use_user_data.h"
#include "components/pref_registry/pref_registry_syncable.h"
@@ -138,7 +139,8 @@
page_id_(base::RandUint64()),
drp_settings_(nullptr),
pref_service_(nullptr),
- host_bypass_blacklist_(std::make_unique<base::DictionaryValue>()) {
+ host_bypass_blacklist_(std::make_unique<base::DictionaryValue>()),
+ drp_headers_valid_(false) {
if (!browser_context)
return;
@@ -244,6 +246,15 @@
void PreviewsLitePageDecider::OnProxyRequestHeadersChanged(
const net::HttpRequestHeaders& headers) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+ std::string drp_header;
+ drp_headers_valid_ =
+ headers.GetHeader(data_reduction_proxy::chrome_proxy_header(),
+ &drp_header) &&
+ (drp_header.find(",s=") != std::string::npos ||
+ drp_header.find(" s=") != std::string::npos ||
+ base::StartsWith(drp_header, "s=", base::CompareCase::SENSITIVE));
+
// This is done so that successive page ids cannot be used to track users
// across sessions. These sessions are contained in the chrome-proxy header.
page_id_ = base::RandUint64();
diff --git a/chrome/browser/previews/previews_lite_page_decider.h b/chrome/browser/previews/previews_lite_page_decider.h
index df594e71..c9c0b18 100644
--- a/chrome/browser/previews/previews_lite_page_decider.h
+++ b/chrome/browser/previews/previews_lite_page_decider.h
@@ -97,12 +97,14 @@
base::TimeDelta duration) override;
bool HostBlacklistedFromBypass(const std::string& host) override;
- private:
// data_reduction_proxy::DataReductionProxySettingsObserver:
void OnProxyRequestHeadersChanged(
const net::HttpRequestHeaders& headers) override;
void OnSettingsInitialized() override;
+ bool has_drp_headers() const { return drp_headers_valid_; }
+
+ private:
// The time after which it is ok to send the server more preview requests.
base::Optional<base::TimeTicks> retry_at_;
@@ -133,6 +135,10 @@
// after the time value. This is stored persistently in prefs.
std::unique_ptr<base::DictionaryValue> host_bypass_blacklist_;
+ // A bool that tracks if the last call to |OnProxyRequestHeadersChanged| had
+ // what looked like a valid chrome-proxy header.
+ bool drp_headers_valid_;
+
SEQUENCE_CHECKER(sequence_checker_);
DISALLOW_COPY_AND_ASSIGN(PreviewsLitePageDecider);
diff --git a/chrome/browser/previews/previews_lite_page_navigation_throttle.h b/chrome/browser/previews/previews_lite_page_navigation_throttle.h
index 593d5c43..1c5c5e62 100644
--- a/chrome/browser/previews/previews_lite_page_navigation_throttle.h
+++ b/chrome/browser/previews/previews_lite_page_navigation_throttle.h
@@ -63,7 +63,8 @@
kECTUnknown_DEPRECATED = 8,
kExceededMaxNavigationRestarts = 9,
kPreviewsState_DEPRECATED = 10,
- kMaxValue = kPreviewsState_DEPRECATED,
+ kInvalidProxyHeaders = 11,
+ kMaxValue = kInvalidProxyHeaders,
};
// The response type from the previews server. This enum must
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 5d3709dc..caf20141 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -47230,6 +47230,7 @@
label="Exceeded maximum number of navigation restarts or a redirect
loop was detected"/>
<int value="10" label="(DEPRECATED IN M74) Disallowed by PreviewsState"/>
+ <int value="11" label="The chrome-proxy header is invalid"/>
</enum>
<enum name="PreviewsServerLitePageServerResponse">