Commit 16ab753c authored by Lu Chen's avatar Lu Chen Committed by Commit Bot

Use finch to control scaling factors of each feature.

Finch is used to control the scales of each feature when
calculating navigation scores.

This CL is blocked on 1132680.

Bug: 850624
Change-Id: I422f1e7f9f9db17530694d7445ab1233976f5930
Reviewed-on: https://chromium-review.googlesource.com/1152037
Commit-Queue: Lu Chen <chelu@chromium.org>
Reviewed-by: default avatarRyan Sturm <ryansturm@chromium.org>
Reviewed-by: default avatarTarun Bansal <tbansal@chromium.org>
Cr-Commit-Position: refs/heads/master@{#579582}
parent bf3721ae
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "chrome/browser/navigation_predictor/navigation_predictor.h" #include "chrome/browser/navigation_predictor/navigation_predictor.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/metrics/field_trial_params.h"
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/optional.h" #include "base/optional.h"
#include "chrome/browser/engagement/site_engagement_service.h" #include "chrome/browser/engagement/site_engagement_service.h"
...@@ -13,6 +14,7 @@ ...@@ -13,6 +14,7 @@
#include "content/public/browser/site_instance.h" #include "content/public/browser/site_instance.h"
#include "mojo/public/cpp/bindings/message.h" #include "mojo/public/cpp/bindings/message.h"
#include "mojo/public/cpp/bindings/strong_binding.h" #include "mojo/public/cpp/bindings/strong_binding.h"
#include "third_party/blink/public/common/features.h"
#include "url/gurl.h" #include "url/gurl.h"
struct NavigationPredictor::NavigationScore { struct NavigationPredictor::NavigationScore {
...@@ -39,7 +41,9 @@ NavigationPredictor::NavigationPredictor( ...@@ -39,7 +41,9 @@ NavigationPredictor::NavigationPredictor(
render_frame_host->GetSiteInstance()->GetBrowserContext()) { render_frame_host->GetSiteInstance()->GetBrowserContext()) {
DCHECK(browser_context_); DCHECK(browser_context_);
DETACH_FROM_SEQUENCE(sequence_checker_); DETACH_FROM_SEQUENCE(sequence_checker_);
InitializeFieldTrialMetricScales();
} }
NavigationPredictor::~NavigationPredictor() { NavigationPredictor::~NavigationPredictor() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
} }
...@@ -62,6 +66,26 @@ bool NavigationPredictor::IsValidMetricFromRenderer( ...@@ -62,6 +66,26 @@ bool NavigationPredictor::IsValidMetricFromRenderer(
metric.source_url.SchemeIsHTTPOrHTTPS(); metric.source_url.SchemeIsHTTPOrHTTPS();
} }
void NavigationPredictor::InitializeFieldTrialMetricScales() {
const base::Feature& feature = blink::features::kRecordAnchorMetricsVisible;
ratio_area_scale_ = base::GetFieldTrialParamByFeatureAsInt(
feature, "ratio_area_scale", ratio_area_scale_);
is_in_iframe_scale_ = base::GetFieldTrialParamByFeatureAsInt(
feature, "is_in_iframe_scale", is_in_iframe_scale_);
is_same_host_scale_ = base::GetFieldTrialParamByFeatureAsInt(
feature, "is_same_host_scale", is_same_host_scale_);
contains_image_scale_ = base::GetFieldTrialParamByFeatureAsInt(
feature, "contains_image_scale", contains_image_scale_);
is_url_incremented_scale_ = base::GetFieldTrialParamByFeatureAsInt(
feature, "is_url_incremented_scale", is_url_incremented_scale_);
source_engagement_score_scale_ = base::GetFieldTrialParamByFeatureAsInt(
feature, "source_engagement_score_scale", source_engagement_score_scale_);
target_engagement_score_scale_ = base::GetFieldTrialParamByFeatureAsInt(
feature, "target_engagement_score_scale", target_engagement_score_scale_);
area_rank_scale_ = base::GetFieldTrialParamByFeatureAsInt(
feature, "area_rank_scale", area_rank_scale_);
}
void NavigationPredictor::RecordTimingOnClick() { void NavigationPredictor::RecordTimingOnClick() {
base::TimeTicks current_timing = base::TimeTicks::Now(); base::TimeTicks current_timing = base::TimeTicks::Now();
...@@ -296,7 +320,8 @@ void NavigationPredictor::ReportAnchorElementMetricsOnLoad( ...@@ -296,7 +320,8 @@ void NavigationPredictor::ReportAnchorElementMetricsOnLoad(
area_rank = navigation_scores[navigation_scores.size() - 1]->area_rank; area_rank = navigation_scores[navigation_scores.size() - 1]->area_rank;
double score = CalculateAnchorNavigationScore( double score = CalculateAnchorNavigationScore(
*metric, document_engagement_score, target_engagement_score, area_rank); *metric, document_engagement_score, target_engagement_score, area_rank,
metrics.size());
navigation_scores.push_back(std::make_unique<NavigationScore>( navigation_scores.push_back(std::make_unique<NavigationScore>(
metric->target_url, area_rank, score)); metric->target_url, area_rank, score));
...@@ -324,10 +349,18 @@ double NavigationPredictor::CalculateAnchorNavigationScore( ...@@ -324,10 +349,18 @@ double NavigationPredictor::CalculateAnchorNavigationScore(
const blink::mojom::AnchorElementMetrics& metrics, const blink::mojom::AnchorElementMetrics& metrics,
double document_engagement_score, double document_engagement_score,
double target_engagement_score, double target_engagement_score,
int area_rank) const { int area_rank,
int number_of_anchors) const {
// TODO(chelu): https://crbug.com/850624/. Experiment with other heuristic // TODO(chelu): https://crbug.com/850624/. Experiment with other heuristic
// algorithms for computing the anchor elements score. // algorithms for computing the anchor elements score.
return metrics.ratio_visible_area; return ratio_area_scale_ * metrics.ratio_visible_area +
is_same_host_scale_ * metrics.is_same_host +
contains_image_scale_ * metrics.contains_image +
is_in_iframe_scale_ * metrics.is_in_iframe +
is_url_incremented_scale_ * metrics.is_url_incremented_by_one +
source_engagement_score_scale_ * document_engagement_score +
target_engagement_score_scale_ * target_engagement_score +
area_rank_scale_ * (number_of_anchors - area_rank);
} }
void NavigationPredictor::MaybeTakeActionOnLoad( void NavigationPredictor::MaybeTakeActionOnLoad(
......
...@@ -52,6 +52,10 @@ class NavigationPredictor : public blink::mojom::AnchorElementMetricsHost { ...@@ -52,6 +52,10 @@ class NavigationPredictor : public blink::mojom::AnchorElementMetricsHost {
bool IsValidMetricFromRenderer( bool IsValidMetricFromRenderer(
const blink::mojom::AnchorElementMetrics& metric) const; const blink::mojom::AnchorElementMetrics& metric) const;
// Retrieve scaling factors for each metric from Finch and save to this class.
// These scales are used to compute navigation scores.
void InitializeFieldTrialMetricScales();
// Returns site engagement service, which can be used to get site engagement // Returns site engagement service, which can be used to get site engagement
// score. Return value is guaranteed to be non-null. // score. Return value is guaranteed to be non-null.
SiteEngagementService* GetEngagementService() const; SiteEngagementService* GetEngagementService() const;
...@@ -71,7 +75,8 @@ class NavigationPredictor : public blink::mojom::AnchorElementMetricsHost { ...@@ -71,7 +75,8 @@ class NavigationPredictor : public blink::mojom::AnchorElementMetricsHost {
const blink::mojom::AnchorElementMetrics& metrics, const blink::mojom::AnchorElementMetrics& metrics,
double document_engagement_score, double document_engagement_score,
double target_engagement_score, double target_engagement_score,
int area_rank) const; int area_rank,
int number_of_anchors) const;
// Given a vector of navigation scores sorted in descending order, decide what // Given a vector of navigation scores sorted in descending order, decide what
// action to take, or decide not to do anything. Example actions including // action to take, or decide not to do anything. Example actions including
...@@ -101,6 +106,16 @@ class NavigationPredictor : public blink::mojom::AnchorElementMetricsHost { ...@@ -101,6 +106,16 @@ class NavigationPredictor : public blink::mojom::AnchorElementMetricsHost {
int number_of_anchors_in_iframe_ = 0; int number_of_anchors_in_iframe_ = 0;
int number_of_anchors_url_incremented_ = 0; int number_of_anchors_url_incremented_ = 0;
// Scaling factors used to compute navigation scores.
int ratio_area_scale_ = 100;
int is_same_host_scale_ = 0;
int contains_image_scale_ = 0;
int is_in_iframe_scale_ = 0;
int is_url_incremented_scale_ = 0;
int source_engagement_score_scale_ = 0;
int target_engagement_score_scale_ = 0;
int area_rank_scale_ = 0;
// Timing of document loaded and last click. // Timing of document loaded and last click.
base::TimeTicks document_loaded_timing_; base::TimeTicks document_loaded_timing_;
base::TimeTicks last_click_timing_; base::TimeTicks last_click_timing_;
......
...@@ -35,7 +35,8 @@ class TestNavigationPredictor : public NavigationPredictor { ...@@ -35,7 +35,8 @@ class TestNavigationPredictor : public NavigationPredictor {
const blink::mojom::AnchorElementMetrics& metrics, const blink::mojom::AnchorElementMetrics& metrics,
double document_engagement_score, double document_engagement_score,
double target_engagement_score, double target_engagement_score,
int area_rank) const override { int area_rank,
int number_of_anchors) const override {
area_rank_map_.emplace(std::make_pair(metrics.target_url, area_rank)); area_rank_map_.emplace(std::make_pair(metrics.target_url, area_rank));
return 100 * metrics.ratio_area; return 100 * metrics.ratio_area;
} }
......
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