910e62b5创建于 1月15日历史提交
// 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_DEVTOOLS_AIDA_CLIENT_H_
#define CHROME_BROWSER_DEVTOOLS_AIDA_CLIENT_H_

#include <optional>
#include <string>
#include <variant>

#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "chrome/browser/profiles/profile.h"
#include "components/signin/public/identity_manager/access_token_fetcher.h"
#include "components/signin/public/identity_manager/access_token_info.h"
#include "google_apis/gaia/google_service_auth_error.h"
#include "services/network/public/cpp/resource_request.h"
#include "services/network/public/cpp/simple_url_loader.h"

// The possible values for the DevTools AI enterprise policy.
enum class DevToolsGenAiEnterprisePolicyValue {
  kAllow = 0,
  kAllowWithoutLogging = 1,
  kDisable = 2,
};

class AidaClient {
 public:
  using ScopedOverride = std::unique_ptr<base::ScopedClosureRunner>;

  explicit AidaClient(Profile* profile);
  ~AidaClient();

  void PrepareRequestOrFail(
      base::OnceCallback<
          void(std::variant<network::ResourceRequest, std::string>)> callback);
  void RemoveAccessToken();

  // Needed because VariationsService is not available for unit tests.
  static ScopedOverride OverrideCountryForTesting(std::string country_code);

  static constexpr std::string_view kDoConversationUrl =
      "https://aida.googleapis.com/v1/aida:doConversation";
  static constexpr std::string_view kCompleteCodeUrl =
      "https://aida.googleapis.com/v1/aida:completeCode";
  static constexpr std::string_view kRegisterClientEventUrl =
      "https://aida.googleapis.com/v1:registerClientEvent";

  struct Availability {
    bool available = false;
    bool blocked = true;
    bool blocked_by_age = true;
    bool blocked_by_enterprise_policy = true;
    bool blocked_by_geo = true;
    bool blocked_by_rollout = false;
    bool disallow_logging = true;
    DevToolsGenAiEnterprisePolicyValue enterprise_policy_value =
        DevToolsGenAiEnterprisePolicyValue::kAllow;
  };

  static Availability CanUseAida(Profile* profile);

 private:
  void PrepareAidaRequest(
      base::OnceCallback<
          void(std::variant<network::ResourceRequest, std::string>)> callback);
  void AccessTokenFetchFinished(
      base::OnceCallback<
          void(std::variant<network::ResourceRequest, std::string>)> callback,
      GoogleServiceAuthError error,
      signin::AccessTokenInfo access_token_info);

  const raw_ref<Profile> profile_;
  std::unique_ptr<signin::AccessTokenFetcher> access_token_fetcher_;
  std::string access_token_;
  base::Time access_token_expiration_;
};

#endif  // CHROME_BROWSER_DEVTOOLS_AIDA_CLIENT_H_