blob: b873443e640b47c8d0529323e630346f4bcd8d6d [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_NAVIGATION_PREDICTOR_PRELOADING_MODEL_KEYED_SERVICE_H_
#define CHROME_BROWSER_NAVIGATION_PREDICTOR_PRELOADING_MODEL_KEYED_SERVICE_H_
#include <optional>
#include "base/functional/callback.h"
#include "base/task/cancelable_task_tracker.h"
#include "base/time/time.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/optimization_guide/machine_learning_tflite_buildflags.h"
class OptimizationGuideKeyedService;
class PreloadingModelHandler;
class PreloadingModelKeyedService : public KeyedService {
public:
using Result = const std::optional<float>&;
using ResultCallback = base::OnceCallback<void(Result)>;
// These inputs are also recorded as part of
// `NavigationPredictorModelTrainingData`. They are also similar to the fields
// of `NavigationPredictorAnchorElementMetrics` and
// `NavigationPredictorUserInteractions` UKM metrics. For more details please
// check https://crsrc.org/c/tools/metrics/ukm/ukm.xml
struct Inputs {
Inputs();
Inputs(const Inputs& other);
Inputs& operator=(const Inputs& other);
// Fields are arranged to minimize memory usage.
bool contains_image : 1;
bool has_text_sibling : 1;
bool is_bold : 1;
bool is_in_iframe : 1;
bool is_url_incremented_by_one : 1;
bool is_same_host : 1;
bool is_in_viewport : 1 = true;
bool is_pointer_hovering_over : 1 = true;
uint8_t path_depth;
uint8_t path_length;
uint8_t font_size;
uint8_t percent_clickable_area;
int percent_vertical_distance;
int pointer_hovering_over_count;
base::TimeDelta navigation_start_to_link_logged;
base::TimeDelta entered_viewport_to_left_viewport;
base::TimeDelta hover_dwell_time;
};
PreloadingModelKeyedService(const PreloadingModelKeyedService&) = delete;
explicit PreloadingModelKeyedService(
OptimizationGuideKeyedService* optimization_guide_keyed_service);
~PreloadingModelKeyedService() override;
void Score(base::CancelableTaskTracker* tracker,
const Inputs& inputs,
ResultCallback result_callback);
// Runs |callback| now if |ModelAvailable()| or the next time |OnModelUpdated|
// is called.
void AddOnModelUpdatedCallbackForTesting(base::OnceClosure callback);
#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
private:
// preloading ML model
std::unique_ptr<PreloadingModelHandler> preloading_model_handler_;
#endif
};
#endif // CHROME_BROWSER_NAVIGATION_PREDICTOR_PRELOADING_MODEL_KEYED_SERVICE_H_