Commit 99792c43 authored by Robert Ogden's avatar Robert Ogden Committed by Commit Bot

Add actual prediction triggering to NavPredictor Renderer Warmup

Bug: 1115259
Change-Id: I3e352ce08e93609e047f13f519dede7f9f7296ce
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2358035Reviewed-by: default avatarRyan Sturm <ryansturm@chromium.org>
Commit-Queue: Robert Ogden <robertogden@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799306}
parent bf466ac4
...@@ -37,6 +37,23 @@ NavigationPredictorRendererWarmupClient:: ...@@ -37,6 +37,23 @@ NavigationPredictorRendererWarmupClient::
kNavigationPredictorRendererWarmup, kNavigationPredictorRendererWarmup,
"mem_threshold_mb", "mem_threshold_mb",
1024)), 1024)),
warmup_on_dse_(base::GetFieldTrialParamByFeatureAsBool(
kNavigationPredictorRendererWarmup,
"warmup_on_dse",
true)),
use_navigation_predictions_(base::GetFieldTrialParamByFeatureAsBool(
kNavigationPredictorRendererWarmup,
"use_navigation_predictions",
true)),
examine_top_n_predictions_(base::GetFieldTrialParamByFeatureAsInt(
kNavigationPredictorRendererWarmup,
"examine_top_n_predictions",
10)),
prediction_crosss_origin_threshold_(
base::GetFieldTrialParamByFeatureAsDouble(
kNavigationPredictorRendererWarmup,
"prediction_crosss_origin_threshold",
0.5)),
cooldown_duration_(base::TimeDelta::FromMilliseconds( cooldown_duration_(base::TimeDelta::FromMilliseconds(
base::GetFieldTrialParamByFeatureAsInt( base::GetFieldTrialParamByFeatureAsInt(
kNavigationPredictorRendererWarmup, kNavigationPredictorRendererWarmup,
...@@ -74,9 +91,10 @@ void NavigationPredictorRendererWarmupClient::OnPredictionUpdated( ...@@ -74,9 +91,10 @@ void NavigationPredictorRendererWarmupClient::OnPredictionUpdated(
return; return;
} }
// TODO(robertogden): Actually use the predicted URLs. if (IsEligibleForCrossNavigationWarmup(*prediction) ||
IsEligibleForDSEWarmup(*prediction)) {
RecordMetricsAndMaybeDoWarmup(); RecordMetricsAndMaybeDoWarmup();
}
} }
void NavigationPredictorRendererWarmupClient::DoRendererWarmpup() { void NavigationPredictorRendererWarmupClient::DoRendererWarmpup() {
...@@ -117,6 +135,61 @@ bool NavigationPredictorRendererWarmupClient:: ...@@ -117,6 +135,61 @@ bool NavigationPredictorRendererWarmupClient::
return true; return true;
} }
bool NavigationPredictorRendererWarmupClient::
IsEligibleForCrossNavigationWarmup(
const NavigationPredictorKeyedService::Prediction& prediction) const {
if (!use_navigation_predictions_) {
return false;
}
url::Origin src_origin =
url::Origin::Create(prediction.source_document_url().value());
const std::vector<GURL> urls = prediction.sorted_predicted_urls();
size_t examine_n_urls =
std::min(urls.size(), static_cast<size_t>(examine_top_n_predictions_));
if (examine_n_urls == 0) {
return false;
}
int cross_origin_count = 0;
for (size_t i = 0; i < examine_n_urls; ++i) {
const GURL& url = urls[i];
if (!url.is_valid()) {
continue;
}
if (!url.SchemeIsHTTPOrHTTPS()) {
continue;
}
url::Origin url_origin = url::Origin::Create(url);
if (!url_origin.IsSameOriginWith(src_origin)) {
cross_origin_count++;
}
}
// Just in case there's very few links on a page, check against the threshold
// as a ratio. This may be helpful on redirector sites, like Cloudflare's DDoS
// checker.
double cross_origin_ratio = static_cast<double>(cross_origin_count) /
static_cast<double>(examine_n_urls);
return cross_origin_ratio >= prediction_crosss_origin_threshold_;
}
bool NavigationPredictorRendererWarmupClient::IsEligibleForDSEWarmup(
const NavigationPredictorKeyedService::Prediction& prediction) const {
if (!warmup_on_dse_) {
return false;
}
return TemplateURLServiceFactory::GetForProfile(profile_)
->IsSearchResultsPageFromDefaultSearchProvider(
prediction.source_document_url().value());
}
void NavigationPredictorRendererWarmupClient::RecordMetricsAndMaybeDoWarmup() { void NavigationPredictorRendererWarmupClient::RecordMetricsAndMaybeDoWarmup() {
last_warmup_time_ = tick_clock_->NowTicks(); last_warmup_time_ = tick_clock_->NowTicks();
......
...@@ -43,6 +43,16 @@ class NavigationPredictorRendererWarmupClient ...@@ -43,6 +43,16 @@ class NavigationPredictorRendererWarmupClient
// renderer too recently. // renderer too recently.
bool IsEligibleForWarmupOnCommonCriteria() const; bool IsEligibleForWarmupOnCommonCriteria() const;
// Checks if the |prediction| is eligible to trigger a renderer warmup based
// on the number of predicted origins.
bool IsEligibleForCrossNavigationWarmup(
const NavigationPredictorKeyedService::Prediction& prediction) const;
// Checks if the |prediction| is eligible to trigger a renderer warmup based
// on the current page being search results for the default search engine.
bool IsEligibleForDSEWarmup(
const NavigationPredictorKeyedService::Prediction& prediction) const;
// Records class state and metrics before checking |counterfactual_| and then // Records class state and metrics before checking |counterfactual_| and then
// calling |DoRendererWarmpup| if |counterfactual_| is false. // calling |DoRendererWarmpup| if |counterfactual_| is false.
void RecordMetricsAndMaybeDoWarmup(); void RecordMetricsAndMaybeDoWarmup();
...@@ -57,6 +67,18 @@ class NavigationPredictorRendererWarmupClient ...@@ -57,6 +67,18 @@ class NavigationPredictorRendererWarmupClient
// renderer warmup. // renderer warmup.
const int mem_threshold_mb_; const int mem_threshold_mb_;
// Whether to initiate a renderer warmup on a search result page for the
// default search engine.
const bool warmup_on_dse_;
// Whether to initiate a renderer warmup based on the top N predictions being
// cross origin.
const bool use_navigation_predictions_;
// How many prediction urls to examine.
const int examine_top_n_predictions_;
// The threshold ratio of how many of the top urls need to be cross-origin.
const double prediction_crosss_origin_threshold_;
// The tick clock used within this class. // The tick clock used within this class.
const base::TickClock* tick_clock_; const base::TickClock* tick_clock_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment