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
|
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_PERMISSIONS_PREDICTION_SERVICE_PERMISSIONS_AIV3_HANDLER_H_
#define COMPONENTS_PERMISSIONS_PREDICTION_SERVICE_PERMISSIONS_AIV3_HANDLER_H_
#include "base/task/sequenced_task_runner.h"
#include "base/timer/timer.h"
#include "components/optimization_guide/core/inference/model_handler.h"
#include "components/optimization_guide/proto/models.pb.h"
#include "components/permissions/prediction_service/permissions_aiv3_executor.h"
#include "components/permissions/prediction_service/permissions_aiv3_model_metadata.pb.h"
#include "components/permissions/prediction_service/prediction_model_metadata.pb.h"
#include "components/permissions/prediction_service/prediction_service_messages.pb.h"
namespace permissions {
class PermissionsAiv3Handler : public optimization_guide::ModelHandler<
PermissionsAiv3Executor::ModelOutput,
const PermissionsAiv3Executor::ModelInput&> {
public:
// The timeout for the model execution. If the model execution takes longer
// than this timeout, the callback will be called with a nullopt result.
static const int kModelExecutionTimeout = 2;
using ModelInput = PermissionsAiv3Executor::ModelInput;
PermissionsAiv3Handler(
optimization_guide::OptimizationGuideModelProvider* model_provider,
optimization_guide::proto::OptimizationTarget optimization_target,
RequestType request_type);
PermissionsAiv3Handler(
optimization_guide::OptimizationGuideModelProvider* model_provider,
optimization_guide::proto::OptimizationTarget optimization_target,
RequestType request_type,
std::unique_ptr<PermissionsAiv3Executor> model_executor,
scoped_refptr<base::SequencedTaskRunner> model_executor_task_runner =
base::ThreadPool::CreateSequencedTaskRunner(
{base::MayBlock(), base::TaskPriority::USER_BLOCKING}),
scoped_refptr<base::SequencedTaskRunner> reply_task_runner =
base::SequencedTaskRunner::GetCurrentDefault());
~PermissionsAiv3Handler() override;
PermissionsAiv3Handler(const PermissionsAiv3Handler&) = delete;
PermissionsAiv3Handler& operator=(const PermissionsAiv3Handler&) = delete;
void OnModelUpdated(
optimization_guide::proto::OptimizationTarget optimization_target,
base::optional_ref<const optimization_guide::ModelInfo> model_info)
override;
virtual void ExecuteModel(ExecutionCallback callback, ModelInput model_input);
private:
// Called when the model execution is complete. This is a wrapper around the
// callback provided to `ExecuteModel` that verifies that the callback is
// still valid.
void OnModelExecutionComplete(
const std::optional<PermissionRequestRelevance>& relevance);
// Called when the model execution times out.
void OnModelExecutionTimeout(
const std::optional<PermissionRequestRelevance>& relevance);
std::optional<PermissionsAiv3ModelMetadata> model_metadata_;
// Because there is no way to cancel a model execution once it has started, we
// will return an empty response to the new callback if a new execution is
// requested while the previous one is still in progress.
bool is_execution_in_progress_ = false;
// Whether the callback passed to ExecuteModel is still valid. It is no longer
// valid if a new execution is requested while the previous one is still in
// progress.
bool is_callback_valid_ = true;
base::OneShotTimer timeout_timer_;
ExecutionCallback current_callback_;
base::WeakPtrFactory<PermissionsAiv3Handler> weak_factory_{this};
};
} // namespace permissions
#endif // COMPONENTS_PERMISSIONS_PREDICTION_SERVICE_PERMISSIONS_AIV3_HANDLER_H_
|