Skip to content

Commit 432f6a7

Browse files
committed
Add "eager" viewport heuristics support to PreloadingDecider
To accommodate a new "eager" viewport heuristic, the existing `OnViewportHeuristicTriggered()` method is renamed to `OnModerateViewportHeuristicTriggered()`. A new method, `OnEagerViewportHeuristicTriggered()`, is added. This method is gated by the `kPreloadingEagerViewportHeuristics` feature flag and calls `MaybeEnactCandidate` with the `kEagerViewportHeuristic` predictor. Call sites and unit tests are updated to use the new 'moderate' function name. New tests are also added to cover the 'eager' heuristic's behavior. Bug: 436705485 Change-Id: I4396749b5067a131ad0ab6079ce2336fec48d280 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7058431 Commit-Queue: Takashi Nakayama <[email protected]> Reviewed-by: Hiroki Nakagawa <[email protected]> Reviewed-by: Lingqi Chi <[email protected]> Cr-Commit-Position: refs/heads/main@{#1532384}
1 parent da7ec36 commit 432f6a7

File tree

4 files changed

+94
-16
lines changed

4 files changed

+94
-16
lines changed

content/browser/preloading/anchor_element_interaction_host_impl.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ void AnchorElementInteractionHostImpl::OnViewportHeuristicTriggered(
179179

180180
auto* preloading_decider =
181181
PreloadingDecider::GetOrCreateForCurrentDocument(&render_frame_host());
182-
preloading_decider->OnViewportHeuristicTriggered(url);
182+
preloading_decider->OnModerateViewportHeuristicTriggered(url);
183183
}
184184

185185
} // namespace content

content/browser/preloading/preloading_decider.cc

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ void PreloadingDecider::OnPointerHover(
351351
eagerness_to_exclude);
352352
}
353353

354-
void PreloadingDecider::OnViewportHeuristicTriggered(const GURL& url) {
354+
void PreloadingDecider::OnModerateViewportHeuristicTriggered(const GURL& url) {
355355
CHECK(base::FeatureList::IsEnabled(
356356
blink::features::kPreloadingModerateViewportHeuristics));
357357
static const base::FeatureParam<bool> kShouldEnactCandidates{
@@ -371,6 +371,15 @@ void PreloadingDecider::OnViewportHeuristicTriggered(const GURL& url) {
371371
/*eagerness_to_exclude=*/{});
372372
}
373373

374+
void PreloadingDecider::OnEagerViewportHeuristicTriggered(const GURL& url) {
375+
CHECK(base::FeatureList::IsEnabled(
376+
blink::features::kPreloadingEagerViewportHeuristics));
377+
MaybeEnactCandidate(url, preloading_predictor::kEagerViewportHeuristic,
378+
PreloadingConfidence{100},
379+
/*fallback_to_preconnect=*/false,
380+
/*eagerness_to_exclude=*/{});
381+
}
382+
374383
void PreloadingDecider::MaybeEnactCandidate(
375384
const GURL& url,
376385
const PreloadingPredictor& enacting_predictor,

content/browser/preloading/preloading_decider.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,11 @@ class CONTENT_EXPORT PreloadingDecider
5959
// Receives and processes ML model score for 'url' target link.
6060
void OnPreloadingHeuristicsModelDone(const GURL& url, float score);
6161

62-
// Receives and processes 'url' selected by viewport heuristic.
63-
void OnViewportHeuristicTriggered(const GURL& url);
62+
// Receives and processes `url` selected by "moderate" viewport heuristic.
63+
void OnModerateViewportHeuristicTriggered(const GURL& url);
64+
65+
// Receives and processes `url` selected by "eager" viewport heuristic.
66+
void OnEagerViewportHeuristicTriggered(const GURL& url);
6467

6568
// Sets the new preloading decider observer for testing and returns the old
6669
// one.

content/browser/preloading/preloading_decider_unittest.cc

Lines changed: 78 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,7 +1033,8 @@ TEST_F(PreloadingDeciderTest,
10331033
/*100*(75-0/500)=*/15, 1);
10341034
}
10351035

1036-
TEST_F(PreloadingDeciderTest, ViewportHeuristicPredictionIsNotEnacted) {
1036+
TEST_F(PreloadingDeciderTest,
1037+
ModerateViewportHeuristicPredictionIsNotEnactedIfDisabled) {
10371038
base::test::ScopedFeatureList feature_list;
10381039
feature_list.InitAndEnableFeatureWithParameters(
10391040
blink::features::kPreloadingModerateViewportHeuristics,
@@ -1051,13 +1052,14 @@ TEST_F(PreloadingDeciderTest, ViewportHeuristicPredictionIsNotEnacted) {
10511052
candidates.push_back(std::move(candidate));
10521053
preloading_decider->UpdateSpeculationCandidates(candidates);
10531054

1054-
preloading_decider->OnViewportHeuristicTriggered(url);
1055+
preloading_decider->OnModerateViewportHeuristicTriggered(url);
10551056
const auto& prefetches = GetPrefetchService()->prefetches_;
10561057
EXPECT_TRUE(prefetches.empty());
10571058
}
10581059

1059-
TEST_F(PreloadingDeciderTest,
1060-
ViewportHeuristicPredictionIsEnactedForModeratePrefetchCandidate) {
1060+
TEST_F(
1061+
PreloadingDeciderTest,
1062+
ModerateViewportHeuristicPredictionIsEnactedForModeratePrefetchCandidate) {
10611063
base::test::ScopedFeatureList feature_list;
10621064
feature_list.InitAndEnableFeatureWithParameters(
10631065
blink::features::kPreloadingModerateViewportHeuristics,
@@ -1076,7 +1078,7 @@ TEST_F(PreloadingDeciderTest,
10761078
candidates.push_back(std::move(candidate));
10771079
preloading_decider->UpdateSpeculationCandidates(candidates);
10781080

1079-
preloading_decider->OnViewportHeuristicTriggered(url);
1081+
preloading_decider->OnModerateViewportHeuristicTriggered(url);
10801082
const auto& prefetches = GetPrefetchService()->prefetches_;
10811083
ASSERT_EQ(prefetches.size(), 1u);
10821084
EXPECT_EQ(prefetches[0]->GetURL(), url);
@@ -1095,7 +1097,44 @@ TEST_F(PreloadingDeciderTest,
10951097
}
10961098

10971099
TEST_F(PreloadingDeciderTest,
1098-
ViewportHeuristicIsEnactedForModeratePrerenderCandidate) {
1100+
EagerViewportHeuristicPredictionIsEnactedForEagerPrefetchCandidate) {
1101+
base::test::ScopedFeatureList feature_list;
1102+
feature_list.InitAndEnableFeature(
1103+
blink::features::kPreloadingEagerViewportHeuristics);
1104+
1105+
base::HistogramTester histogram_tester;
1106+
auto* preloading_decider =
1107+
PreloadingDecider::GetOrCreateForCurrentDocument(&GetPrimaryMainFrame());
1108+
ASSERT_TRUE(preloading_decider != nullptr);
1109+
1110+
const GURL url("https://example.com");
1111+
std::vector<blink::mojom::SpeculationCandidatePtr> candidates;
1112+
auto candidate =
1113+
MakeCandidate(url, blink::mojom::SpeculationAction::kPrefetch,
1114+
blink::mojom::SpeculationEagerness::kEager);
1115+
candidates.push_back(std::move(candidate));
1116+
preloading_decider->UpdateSpeculationCandidates(candidates);
1117+
1118+
preloading_decider->OnEagerViewportHeuristicTriggered(url);
1119+
const auto& prefetches = GetPrefetchService()->prefetches_;
1120+
ASSERT_EQ(prefetches.size(), 1u);
1121+
EXPECT_EQ(prefetches[0]->GetURL(), url);
1122+
1123+
std::unique_ptr<NavigationSimulator> navigation =
1124+
NavigationSimulator::CreateRendererInitiated(url, main_rfh());
1125+
navigation->SetTransition(ui::PAGE_TRANSITION_LINK);
1126+
navigation->Start();
1127+
1128+
histogram_tester.ExpectUniqueSample(
1129+
"Preloading.Predictor.EagerViewportHeuristic.Precision",
1130+
PredictorConfusionMatrix::kTruePositive, 1);
1131+
histogram_tester.ExpectUniqueSample(
1132+
"Preloading.Predictor.EagerViewportHeuristic.Recall",
1133+
PredictorConfusionMatrix::kTruePositive, 1);
1134+
}
1135+
1136+
TEST_F(PreloadingDeciderTest,
1137+
ModerateViewportHeuristicIsEnactedForModeratePrerenderCandidate) {
10991138
base::test::ScopedFeatureList feature_list;
11001139
feature_list.InitAndEnableFeatureWithParameters(
11011140
blink::features::kPreloadingModerateViewportHeuristics,
@@ -1114,17 +1153,43 @@ TEST_F(PreloadingDeciderTest,
11141153
candidates.push_back(std::move(candidate));
11151154
preloading_decider->UpdateSpeculationCandidates(candidates);
11161155

1117-
preloading_decider->OnViewportHeuristicTriggered(url);
1156+
preloading_decider->OnModerateViewportHeuristicTriggered(url);
11181157
ASSERT_EQ(mock_prerender.Get()->prerenders_.size(), 1u);
11191158
EXPECT_EQ(mock_prerender.Get()->prerenders_[0].first, url);
11201159
}
11211160

11221161
TEST_F(PreloadingDeciderTest,
1123-
ViewportHeuristicIsNotEnactedForConservativePrefetchCandidate) {
1162+
EagerViewportHeuristicIsEnactedForEagerPrerenderCandidate) {
11241163
base::test::ScopedFeatureList feature_list;
1125-
feature_list.InitAndEnableFeatureWithParameters(
1126-
blink::features::kPreloadingModerateViewportHeuristics,
1127-
{{"enact_candidates", "true"}});
1164+
feature_list.InitAndEnableFeature(
1165+
blink::features::kPreloadingEagerViewportHeuristics);
1166+
1167+
auto* preloading_decider =
1168+
PreloadingDecider::GetOrCreateForCurrentDocument(&GetPrimaryMainFrame());
1169+
ASSERT_TRUE(preloading_decider != nullptr);
1170+
ScopedMockPrerenderer mock_prerender(preloading_decider);
1171+
1172+
const GURL url("https://example.com");
1173+
std::vector<blink::mojom::SpeculationCandidatePtr> candidates;
1174+
auto candidate =
1175+
MakeCandidate(url, blink::mojom::SpeculationAction::kPrerender,
1176+
blink::mojom::SpeculationEagerness::kEager);
1177+
candidates.push_back(std::move(candidate));
1178+
preloading_decider->UpdateSpeculationCandidates(candidates);
1179+
1180+
preloading_decider->OnEagerViewportHeuristicTriggered(url);
1181+
ASSERT_EQ(mock_prerender.Get()->prerenders_.size(), 1u);
1182+
EXPECT_EQ(mock_prerender.Get()->prerenders_[0].first, url);
1183+
}
1184+
1185+
TEST_F(PreloadingDeciderTest,
1186+
ViewportHeuristicsAreNotEnactedForConservativePrefetchCandidate) {
1187+
base::test::ScopedFeatureList feature_list;
1188+
feature_list.InitWithFeaturesAndParameters(
1189+
{{blink::features::kPreloadingModerateViewportHeuristics,
1190+
{{"enact_candidates", "true"}}},
1191+
{blink::features::kPreloadingEagerViewportHeuristics, {}}},
1192+
/*disabled_features=*/{});
11281193

11291194
auto* preloading_decider =
11301195
PreloadingDecider::GetOrCreateForCurrentDocument(&GetPrimaryMainFrame());
@@ -1138,7 +1203,8 @@ TEST_F(PreloadingDeciderTest,
11381203
candidates.push_back(std::move(candidate));
11391204
preloading_decider->UpdateSpeculationCandidates(candidates);
11401205

1141-
preloading_decider->OnViewportHeuristicTriggered(url);
1206+
preloading_decider->OnModerateViewportHeuristicTriggered(url);
1207+
preloading_decider->OnEagerViewportHeuristicTriggered(url);
11421208
const auto& prefetches = GetPrefetchService()->prefetches_;
11431209
EXPECT_TRUE(prefetches.empty());
11441210
}

0 commit comments

Comments
 (0)