| // 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/optimization_guide_decider.h" |
| #include "components/optimization_guide/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 |optimization_type|. |
| base::Optional<optimization_guide::OptimizationTypeDecision> |
| GetDecisionForOptimizationType( |
| optimization_guide::proto::OptimizationType optimization_type) const; |
| // Sets the |decision| for |optimization_type|. |
| void SetDecisionForOptimizationType( |
| optimization_guide::proto::OptimizationType optimization_type, |
| optimization_guide::OptimizationTypeDecision decision); |
| |
| // 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); |
| |
| // The page hint applicable for the navigation. |
| bool has_page_hint_value() const { return !!page_hint_; } |
| const optimization_guide::proto::PageHint* page_hint() const { |
| return page_hint_.value().get(); |
| } |
| void set_page_hint( |
| std::unique_ptr<optimization_guide::proto::PageHint> page_hint) { |
| page_hint_ = std::move(page_hint); |
| } |
| |
| // 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 histograms for the decisions made for each optimization target and |
| // type that was queried for the navigation based on data currently held in |
| // |this|. |
| void RecordOptimizationTypeAndTargetDecisions() 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_ |