1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
|
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_NAVIGATION_DATA_H_
#define CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_NAVIGATION_DATA_H_
#include <stdint.h>
#include <memory>
#include <string>
#include <utility>
#include "base/containers/flat_map.h"
#include "base/containers/flat_set.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "base/time/time.h"
#include "components/optimization_guide/content/optimization_guide_decider.h"
#include "components/optimization_guide/core/optimization_guide_enums.h"
#include "components/optimization_guide/proto/hints.pb.h"
#include "components/optimization_guide/proto/models.pb.h"
// A representation of optimization guide information related to a navigation.
// Metrics will be recorded upon this object's destruction.
class OptimizationGuideNavigationData {
public:
explicit OptimizationGuideNavigationData(int64_t navigation_id);
~OptimizationGuideNavigationData();
OptimizationGuideNavigationData(
const OptimizationGuideNavigationData& other) = delete;
OptimizationGuideNavigationData& operator=(
const OptimizationGuideNavigationData&) = delete;
// Returns the OptimizationGuideNavigationData for |navigation_handle|. Will
// return nullptr if one cannot be created for it for any reason.
static OptimizationGuideNavigationData* GetFromNavigationHandle(
content::NavigationHandle* navigation_handle);
base::WeakPtr<OptimizationGuideNavigationData> GetWeakPtr() {
return weak_ptr_factory_.GetWeakPtr();
}
// The navigation ID of the navigation handle that this data is associated
// with.
int64_t navigation_id() const { return navigation_id_; }
// The optimization types that were registered at the start of the navigation.
base::flat_set<optimization_guide::proto::OptimizationType>
registered_optimization_types() const {
return registered_optimization_types_;
}
void set_registered_optimization_types(
base::flat_set<optimization_guide::proto::OptimizationType>
registered_optimization_types) {
registered_optimization_types_ = registered_optimization_types;
}
// The optimization targets that were registered at the start of the
// navigation.
base::flat_set<optimization_guide::proto::OptimizationTarget>
registered_optimization_targets() const {
return registered_optimization_targets_;
}
void set_registered_optimization_targets(
base::flat_set<optimization_guide::proto::OptimizationTarget>
registered_optimization_targets) {
registered_optimization_targets_ = registered_optimization_targets;
}
// Returns the latest decision made for |optimmization_target|.
base::Optional<optimization_guide::OptimizationTargetDecision>
GetDecisionForOptimizationTarget(
optimization_guide::proto::OptimizationTarget optimization_target) const;
// Sets the |decision| for |optimization_target|.
void SetDecisionForOptimizationTarget(
optimization_guide::proto::OptimizationTarget optimization_target,
optimization_guide::OptimizationTargetDecision decision);
// Returns the version of the model evaluated for |optimization_target|.
base::Optional<int64_t> GetModelVersionForOptimizationTarget(
optimization_guide::proto::OptimizationTarget optimization_target) const;
// Sets the |model_version| for |optimization_target|.
void SetModelVersionForOptimizationTarget(
optimization_guide::proto::OptimizationTarget optimization_target,
int64_t model_version);
// Returns the prediction score of the model evaluated for
// |optimization_target|.
base::Optional<double> GetModelPredictionScoreForOptimizationTarget(
optimization_guide::proto::OptimizationTarget optimization_target) const;
// Sets the |model_prediction_score| for |optimization_target|.
void SetModelPredictionScoreForOptimizationTarget(
optimization_guide::proto::OptimizationTarget optimization_target,
double model_prediction_score);
// Returns the value of the model feature if it has been provided.
base::Optional<float> GetValueForModelFeatureForTesting(
optimization_guide::proto::ClientModelFeature model_feature);
// Sets the value provided to the model for a particular model feature.
void SetValueForModelFeature(
optimization_guide::proto::ClientModelFeature model_feature,
float value);
// Whether the initiation of the navigation was from a same origin URL or not.
bool is_same_origin_navigation() const { return is_same_origin_navigation_; }
void set_is_same_origin_navigation(bool is_same_origin_navigation) {
is_same_origin_navigation_ = is_same_origin_navigation;
}
// The duration between the fetch for a hint for the navigation going out to
// when it was received by the client if a fetch was initiated for the
// navigation.
base::Optional<base::TimeDelta> hints_fetch_latency() const;
void set_hints_fetch_start(base::TimeTicks hints_fetch_start) {
hints_fetch_start_ = hints_fetch_start;
}
void set_hints_fetch_end(base::TimeTicks hints_fetch_end) {
hints_fetch_end_ = hints_fetch_end;
}
// The status for whether a hint for the page load was attempted to be fetched
// from the remote Optimization Guide Service.
base::Optional<optimization_guide::RaceNavigationFetchAttemptStatus>
hints_fetch_attempt_status() const {
return hints_fetch_attempt_status_;
}
void set_hints_fetch_attempt_status(
optimization_guide::RaceNavigationFetchAttemptStatus
hints_fetch_attempt_status) {
hints_fetch_attempt_status_ = hints_fetch_attempt_status;
}
private:
// Records metrics based on data currently held in |this|.
void RecordMetrics() const;
// Records the OptimizationGuide UKM event based on data currently held in
// |this|.
void RecordOptimizationGuideUKM() const;
// The navigation ID of the navigation handle that this data is associated
// with.
const int64_t navigation_id_;
// The optimization types that were registered at the start of the navigation.
base::flat_set<optimization_guide::proto::OptimizationType>
registered_optimization_types_;
// The optimization targets that were registered at the start of the
// navigation.
base::flat_set<optimization_guide::proto::OptimizationTarget>
registered_optimization_targets_;
// The map from optimization type to the last decision made for that type.
base::flat_map<optimization_guide::proto::OptimizationType,
optimization_guide::OptimizationTypeDecision>
optimization_type_decisions_;
// The map from optimization target to the last decision made for that target.
base::flat_map<optimization_guide::proto::OptimizationTarget,
optimization_guide::OptimizationTargetDecision>
optimization_target_decisions_;
// The version of the painful page load model that was evaluated for the
// page load.
base::flat_map<optimization_guide::proto::OptimizationTarget, int64_t>
optimization_target_model_versions_;
// The score output after evaluating the painful page load model. If
// populated, this is 100x the fractional value output by the model
// evaluation.
base::flat_map<optimization_guide::proto::OptimizationTarget, double>
optimization_target_model_prediction_scores_;
// The features used to make a prediction for any target.
base::flat_map<optimization_guide::proto::ClientModelFeature, float>
prediction_model_features_;
// The page hint for the navigation.
base::Optional<std::unique_ptr<optimization_guide::proto::PageHint>>
page_hint_;
// Whether the initiation of the navigation was from a same origin URL or not.
bool is_same_origin_navigation_ = false;
// The time that the hints fetch for this navigation started. Is only present
// if a fetch was initiated for this navigation.
base::Optional<base::TimeTicks> hints_fetch_start_;
// The time that the hints fetch for the navigation ended. Is only present if
// a fetch was initiated and successfully completed for this navigation.
base::Optional<base::TimeTicks> hints_fetch_end_;
// The status for whether a hint for the page load was attempted to be fetched
// from the remote Optimization Guide Service.
base::Optional<optimization_guide::RaceNavigationFetchAttemptStatus>
hints_fetch_attempt_status_;
// Used to get |weak_ptr_| to self on the UI thread.
base::WeakPtrFactory<OptimizationGuideNavigationData> weak_ptr_factory_{this};
};
#endif // CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_NAVIGATION_DATA_H_
|