Skip to content

Commit a419da7

Browse files
committed
Preloading: Add browser side support of "eager" viewport heuristics
This CL adds a new mojom method, `OnEagerViewportHeuristicTriggered()` to the `blink.mojom.AnchorElementInteractionHost` interface. The existing `OnViewportHeuristicTriggered()` method is renamed to `OnModerateViewportHeuristicTriggered()` to accommodate this change. No real callers of `OnEagerViewportHeuristicTriggered` are implemented in this CL. Please refer to crrev.com/c/7059950/ for the usage. All changes in this CL are gated by the `kPreloadingEagerViewportHeuristics` feature flag. Bug: 436705485 Change-Id: Icbacd1216012205442ccabca7f37a04bfab5b0cf Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7058432 Reviewed-by: Takashi Toyoshima <[email protected]> Reviewed-by: Hiroki Nakagawa <[email protected]> Commit-Queue: Takashi Nakayama <[email protected]> Cr-Commit-Position: refs/heads/main@{#1532385}
1 parent 432f6a7 commit a419da7

File tree

6 files changed

+88
-13
lines changed

6 files changed

+88
-13
lines changed

content/browser/preloading/anchor_element_interaction_host_impl.cc

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,14 @@ void AnchorElementInteractionHostImpl::OnPointerHoverModerate(
167167
MaybeWarmUpServiceWorkerOnPointerHover(url, render_frame_host());
168168
}
169169

170-
void AnchorElementInteractionHostImpl::OnViewportHeuristicTriggered(
170+
void AnchorElementInteractionHostImpl::OnModerateViewportHeuristicTriggered(
171171
const GURL& url) {
172172
if (!base::FeatureList::IsEnabled(
173173
blink::features::kPreloadingModerateViewportHeuristics)) {
174174
ReportBadMessageAndDeleteThis(
175-
"OnViewportHeuristic should not be called by the renderer without "
176-
"blink::features::kPreloadingModerateViewportHeuristics being enabled");
175+
"OnModerateViewportHeuristic should not be called by the renderer "
176+
"without blink::features::kPreloadingModerateViewportHeuristics being "
177+
"enabled");
177178
return;
178179
}
179180

@@ -182,4 +183,21 @@ void AnchorElementInteractionHostImpl::OnViewportHeuristicTriggered(
182183
preloading_decider->OnModerateViewportHeuristicTriggered(url);
183184
}
184185

186+
void AnchorElementInteractionHostImpl::OnEagerViewportHeuristicTriggered(
187+
const std::vector<GURL>& target_urls) {
188+
if (!base::FeatureList::IsEnabled(
189+
blink::features::kPreloadingEagerViewportHeuristics)) {
190+
ReportBadMessageAndDeleteThis(
191+
"OnEagerViewportHeuristic should not be called by the renderer without "
192+
"blink::features::kPreloadingEagerViewportHeuristics being enabled");
193+
return;
194+
}
195+
196+
auto* preloading_decider =
197+
PreloadingDecider::GetOrCreateForCurrentDocument(&render_frame_host());
198+
for (const GURL& url : target_urls) {
199+
preloading_decider->OnEagerViewportHeuristicTriggered(url);
200+
}
201+
}
202+
185203
} // namespace content

content/browser/preloading/anchor_element_interaction_host_impl.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ class CONTENT_EXPORT AnchorElementInteractionHostImpl
3636
void OnPointerHoverModerate(
3737
const GURL& target,
3838
blink::mojom::AnchorElementPointerDataPtr mouse_data) override;
39-
void OnViewportHeuristicTriggered(const GURL& target) override;
39+
void OnModerateViewportHeuristicTriggered(const GURL& target) override;
40+
void OnEagerViewportHeuristicTriggered(
41+
const std::vector<GURL>& targets) override;
4042
};
4143

4244
} // namespace content

content/browser/preloading/anchor_element_interaction_host_impl_unittest.cc

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@ TEST_F(AnchorElementInteractionHostImplTest, OnPointerEvents) {
104104
blink::mojom::SpeculationEagerness::kEager);
105105
}
106106

107-
TEST_F(AnchorElementInteractionHostImplTest, OnViewportHeuristicTriggered) {
107+
TEST_F(AnchorElementInteractionHostImplTest,
108+
OnModerateViewportHeuristicTriggered) {
108109
base::test::ScopedFeatureList feature_list;
109110
feature_list.InitAndEnableFeature(
110111
blink::features::kPreloadingModerateViewportHeuristics);
@@ -121,7 +122,7 @@ TEST_F(AnchorElementInteractionHostImplTest, OnViewportHeuristicTriggered) {
121122
remote.BindNewPipeAndPassReceiver());
122123

123124
const GURL url("https://example.com");
124-
remote->OnViewportHeuristicTriggered(url);
125+
remote->OnModerateViewportHeuristicTriggered(url);
125126
remote.FlushForTesting();
126127

127128
auto* preloading_data =
@@ -142,10 +143,50 @@ TEST_F(AnchorElementInteractionHostImplTest, OnViewportHeuristicTriggered) {
142143
}
143144

144145
TEST_F(AnchorElementInteractionHostImplTest,
145-
RecallRecordedWhenViewportHeuristicIsNotTriggered) {
146+
OnEagerViewportHeuristicTriggered) {
146147
base::test::ScopedFeatureList feature_list;
147148
feature_list.InitAndEnableFeature(
148-
blink::features::kPreloadingModerateViewportHeuristics);
149+
blink::features::kPreloadingEagerViewportHeuristics);
150+
151+
base::HistogramTester histogram_tester;
152+
auto* render_frame_host = static_cast<RenderFrameHostImpl*>(main_rfh());
153+
154+
std::vector<blink::mojom::SpeculationCandidatePtr> candidates;
155+
PreloadingDecider::GetOrCreateForCurrentDocument(render_frame_host)
156+
->UpdateSpeculationCandidates(candidates);
157+
158+
mojo::Remote<blink::mojom::AnchorElementInteractionHost> remote;
159+
AnchorElementInteractionHostImpl::Create(render_frame_host,
160+
remote.BindNewPipeAndPassReceiver());
161+
162+
const GURL url("https://example.com");
163+
remote->OnEagerViewportHeuristicTriggered({url});
164+
remote.FlushForTesting();
165+
166+
auto* preloading_data =
167+
PreloadingDataImpl::GetOrCreateForWebContents(web_contents());
168+
EXPECT_EQ(preloading_data->GetPredictionsSizeForTesting(), 1u);
169+
170+
std::unique_ptr<NavigationSimulator> navigation_simulator =
171+
NavigationSimulator::CreateRendererInitiated(url, main_rfh());
172+
navigation_simulator->SetTransition(ui::PAGE_TRANSITION_LINK);
173+
navigation_simulator->Start();
174+
175+
histogram_tester.ExpectUniqueSample(
176+
"Preloading.Predictor.EagerViewportHeuristic.Precision",
177+
PredictorConfusionMatrix::kTruePositive, 1);
178+
histogram_tester.ExpectUniqueSample(
179+
"Preloading.Predictor.EagerViewportHeuristic.Recall",
180+
PredictorConfusionMatrix::kTruePositive, 1);
181+
}
182+
183+
TEST_F(AnchorElementInteractionHostImplTest,
184+
RecallRecordedWhenViewportHeuristicsAreNotTriggered) {
185+
base::test::ScopedFeatureList feature_list;
186+
feature_list.InitWithFeatures(
187+
{blink::features::kPreloadingModerateViewportHeuristics,
188+
blink::features::kPreloadingEagerViewportHeuristics},
189+
/*disabled_features=*/{});
149190

150191
base::HistogramTester histogram_tester;
151192

@@ -162,6 +203,9 @@ TEST_F(AnchorElementInteractionHostImplTest,
162203
histogram_tester.ExpectUniqueSample(
163204
"Preloading.Predictor.ViewportHeuristic.Recall",
164205
PredictorConfusionMatrix::kFalseNegative, 1);
206+
histogram_tester.ExpectUniqueSample(
207+
"Preloading.Predictor.EagerViewportHeuristic.Recall",
208+
PredictorConfusionMatrix::kFalseNegative, 1);
165209
}
166210

167211
} // namespace

third_party/blink/public/mojom/preloading/anchor_element_interaction_host.mojom

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,14 @@ interface AnchorElementInteractionHost {
3737
OnPointerHoverModerate(url.mojom.Url target,
3838
AnchorElementPointerData mouse_data);
3939

40-
// The renderer calls OnViewportHeuristicTriggered for selected anchor
40+
// The renderer calls OnModerateViewportHeuristicTriggered for selected
41+
// anchor elements that are part of the HTTP family, in the viewport, and
42+
// meet certain other criteria used by the heuristic.
43+
OnModerateViewportHeuristicTriggered(url.mojom.Url target);
44+
45+
// The renderer calls OnEagerViewportHeuristicTriggered for selected anchor
4146
// elements that are part of the HTTP family, in the viewport, and meet
42-
// certain other criteria used by the heuristic.
43-
OnViewportHeuristicTriggered(url.mojom.Url target);
47+
// certain other criteria used by the heuristic. This function accepts
48+
// multiple target URLs at once to reduce the number of IPC calls.
49+
OnEagerViewportHeuristicTriggered(array<url.mojom.Url> targets);
4450
};

third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,14 @@ class MockAnchorElementInteractionHost
8585
.mouse_velocity = mouse_data->mouse_velocity,
8686
.is_eager = false});
8787
}
88-
void OnViewportHeuristicTriggered(const KURL& target) override {
88+
void OnModerateViewportHeuristicTriggered(const KURL& target) override {
8989
calls_.push_back({.url = target, .type = PointerEventType::kNone});
9090
}
91+
void OnEagerViewportHeuristicTriggered(const Vector<KURL>& targets) override {
92+
for (const KURL& url : targets) {
93+
calls_.push_back({.url = url, .type = PointerEventType::kNone});
94+
}
95+
}
9196

9297
private:
9398
mojo::Receiver<mojom::blink::AnchorElementInteractionHost> receiver_{this};

third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ void AnchorElementInteractionTracker::ViewportHeuristicTimerFired(
616616
return;
617617
}
618618

619-
interaction_host_->OnViewportHeuristicTriggered(
619+
interaction_host_->OnModerateViewportHeuristicTriggered(
620620
largest_anchor_element_in_viewport_->Url());
621621
}
622622

0 commit comments

Comments
 (0)