blob: 28bf4eeeefe8b34ef0016fbfdf3fccd94c81cd29 [file] [log] [blame]
// Copyright 2020 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_PERMISSIONS_PREDICTION_BASED_PERMISSION_UI_SELECTOR_H_
#define CHROME_BROWSER_PERMISSIONS_PREDICTION_BASED_PERMISSION_UI_SELECTOR_H_
#include <memory>
#include "base/functional/callback.h"
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "components/permissions/permission_actions_history.h"
#include "components/permissions/permission_ui_selector.h"
#include "components/permissions/prediction_service/prediction_request_features.h"
#include "components/permissions/request_type.h"
class PredictionServiceRequest;
class Profile;
namespace permissions {
struct PredictionRequestFeatures;
class GeneratePredictionsResponse;
} // namespace permissions
// Each instance of this class is long-lived and can support multiple requests,
// but only one at a time.
class PredictionBasedPermissionUiSelector
: public permissions::PermissionUiSelector {
public:
enum class PredictionSource {
USE_SERVER_SIDE,
USE_ONDEVICE,
USE_ANY,
USE_NONE,
};
using PredictionGrantLikelihood =
permissions::PermissionUmaUtil::PredictionGrantLikelihood;
// Constructs an instance in the context of the given |profile|.
explicit PredictionBasedPermissionUiSelector(Profile* profile);
~PredictionBasedPermissionUiSelector() override;
PredictionBasedPermissionUiSelector(
const PredictionBasedPermissionUiSelector&) = delete;
PredictionBasedPermissionUiSelector& operator=(
const PredictionBasedPermissionUiSelector&) = delete;
// NotificationPermissionUiSelector:
void SelectUiToUse(permissions::PermissionRequest* request,
DecisionMadeCallback callback) override;
void Cancel() override;
bool IsPermissionRequestSupported(
permissions::RequestType request_type) override;
absl::optional<PredictionGrantLikelihood> PredictedGrantLikelihoodForUKM()
override;
absl::optional<bool> WasSelectorDecisionHeldback() override;
private:
FRIEND_TEST_ALL_PREFIXES(PredictionBasedPermissionUiSelectorTest,
GetPredictionTypeToUse);
FRIEND_TEST_ALL_PREFIXES(PredictionBasedPermissionUiSelectorTest,
HoldbackHistogramTest);
FRIEND_TEST_ALL_PREFIXES(PredictionBasedPermissionUiSelectorTest,
HoldbackDecisionTest);
permissions::PredictionRequestFeatures BuildPredictionRequestFeatures(
permissions::PermissionRequest* request);
void LookupResponseReceived(
bool is_on_device,
permissions::RequestType request_type,
bool lookup_succesful,
bool response_from_cache,
const absl::optional<permissions::GeneratePredictionsResponse>& response);
PredictionSource GetPredictionTypeToUse(
permissions::RequestType request_type);
void set_likelihood_override(PredictionGrantLikelihood mock_likelihood) {
likelihood_override_for_testing_ = mock_likelihood;
}
void OnModelExecutionComplete(
const absl::optional<permissions::GeneratePredictionsResponse>& result);
bool ShouldHoldBack(bool is_on_device, permissions::RequestType request_type);
raw_ptr<Profile> profile_;
std::unique_ptr<PredictionServiceRequest> request_;
absl::optional<PredictionGrantLikelihood> last_request_grant_likelihood_;
absl::optional<bool> was_decision_held_back_;
absl::optional<PredictionGrantLikelihood> likelihood_override_for_testing_;
DecisionMadeCallback callback_;
base::WeakPtrFactory<PredictionBasedPermissionUiSelector> weak_ptr_factory_{
this};
};
#endif // CHROME_BROWSER_PERMISSIONS_PREDICTION_BASED_PERMISSION_UI_SELECTOR_H_