[go: up one dir, main page]

Do not send resource loading hints down if coinflip holdback is true

(cherry picked from commit f0efd272c3f4cbd2dc34c84aebfd04fc7402116f)

Bug: 973599
Change-Id: I6fab755385d27e5203ba216f9185e94a16c123ab
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1657168
Reviewed-by: Tarun Bansal <tbansal@chromium.org>
Reviewed-by: Robert Ogden <robertogden@chromium.org>
Commit-Queue: Sophie Chang <sophiechang@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#669120}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1664041
Cr-Commit-Position: refs/branch-heads/3809@{#412}
Cr-Branched-From: d82dec1a818f378c464ba307ddd9c92133eac355-refs/heads/master@{#665002}
diff --git a/chrome/browser/previews/resource_loading_hints/resource_loading_hints_browsertest.cc b/chrome/browser/previews/resource_loading_hints/resource_loading_hints_browsertest.cc
index c10f34f..fa75b62 100644
--- a/chrome/browser/previews/resource_loading_hints/resource_loading_hints_browsertest.cc
+++ b/chrome/browser/previews/resource_loading_hints/resource_loading_hints_browsertest.cc
@@ -36,10 +36,12 @@
 #include "components/previews/core/previews_constants.h"
 #include "components/previews/core/previews_features.h"
 #include "components/previews/core/previews_switches.h"
+#include "components/ukm/test_ukm_recorder.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/test/browser_test_utils.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/network/public/cpp/network_quality_tracker.h"
 
 namespace {
@@ -703,3 +705,44 @@
       "ResourceLoadingHints.CountBlockedSubresourcePatterns", 0);
   EXPECT_FALSE(resource_loading_hint_intervention_header_seen());
 }
+
+IN_PROC_BROWSER_TEST_F(
+    ResourceLoadingHintsBrowserTest,
+    DISABLE_ON_WIN_MAC_CHROMESOS(
+        ResourceLoadingHintsHttpsWhitelistedButShouldNotApplyBecauseCoinFlipHoldback)) {
+  // Holdback the page load from previews and also disable offline previews to
+  // ensure that only post-commit previews are enabled.
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitWithFeaturesAndParameters(
+      {{previews::features::kCoinFlipHoldback,
+        {{"force_coin_flip_always_holdback", "true"}}}},
+      {previews::features::kOfflinePreviews});
+
+  ukm::TestAutoSetUkmRecorder test_ukm_recorder;
+
+  GURL url = https_url();
+
+  // Whitelist resource loading hints for https_hint_setup_url()'s' host.
+  SetDefaultOnlyResourceLoadingHints(https_hint_setup_url());
+
+  SetExpectedFooJpgRequest(true);
+  SetExpectedBarJpgRequest(true);
+  ResetResourceLoadingHintInterventionHeaderSeen();
+
+  base::HistogramTester histogram_tester;
+
+  ui_test_utils::NavigateToURL(browser(), url);
+
+  histogram_tester.ExpectBucketCount(
+      "Previews.EligibilityReason.ResourceLoadingHints",
+      static_cast<int>(previews::PreviewsEligibilityReason::COMMITTED), 1);
+  histogram_tester.ExpectTotalCount(
+      "Previews.PreviewShown.ResourceLoadingHints", 0);
+  histogram_tester.ExpectTotalCount(
+      "ResourceLoadingHints.CountBlockedSubresourcePatterns", 0);
+  EXPECT_FALSE(resource_loading_hint_intervention_header_seen());
+  // Make sure we did not record a PreviewsResourceLoadingHints UKM for it.
+  auto rlh_ukm_entries = test_ukm_recorder.GetEntriesByName(
+      ukm::builders::PreviewsResourceLoadingHints::kEntryName);
+  ASSERT_EQ(0u, rlh_ukm_entries.size());
+}
diff --git a/chrome/browser/previews/resource_loading_hints/resource_loading_hints_web_contents_observer.cc b/chrome/browser/previews/resource_loading_hints/resource_loading_hints_web_contents_observer.cc
index a4ef961..af5f1571 100644
--- a/chrome/browser/previews/resource_loading_hints/resource_loading_hints_web_contents_observer.cc
+++ b/chrome/browser/previews/resource_loading_hints/resource_loading_hints_web_contents_observer.cc
@@ -58,6 +58,13 @@
           previews::PreviewsType::RESOURCE_LOADING_HINTS) {
     return;
   }
+  // The committed previews type can sometimes not be cleared out if there were
+  // no pre-commit previews allowed, so make sure we are not in the coin flip
+  // holdback before proceeding with sending resource loading hints.
+  if (previews_user_data->coin_flip_holdback_result() ==
+      previews::CoinFlipHoldbackResult::kHoldback) {
+    return;
+  }
 
   DCHECK(previews::params::IsResourceLoadingHintsEnabled());
   SendResourceLoadingHints(navigation_handle,