#ifndef ASH_WEBUI_GRADUATION_WEBVIEW_AUTH_HANDLER_H_
#define ASH_WEBUI_GRADUATION_WEBVIEW_AUTH_HANDLER_H_
#include <memory>
#include <string>
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/timer/timer.h"
#include "components/signin/public/identity_manager/accounts_cookie_mutator.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/browser/storage_partition_config.h"
#include "net/base/backoff_entry.h"
namespace base {
class OneShotTimer;
}
namespace content {
class BrowserContext;
class StoragePartition;
}
namespace signin {
enum class SetAccountsInCookieResult;
}
namespace ash::graduation {
class WebviewAuthHandler
: public signin::AccountsCookieMutator::PartitionDelegate {
public:
using OnWebviewAuth = base::OnceCallback<void(bool is_success)>;
enum class AuthResult : int {
kSuccess = 0,
kTransientFailure = 1,
kPersistentFailure = 2,
kMaxValue = kPersistentFailure,
};
static constexpr char kAuthResultHistogramName[] =
"Ash.ContentTransfer.AuthenticationResult";
static constexpr int kMaxRetries = 3;
WebviewAuthHandler(content::BrowserContext* context,
const std::string& webview_host_name);
WebviewAuthHandler(const WebviewAuthHandler&) = delete;
WebviewAuthHandler& operator=(const WebviewAuthHandler&) = delete;
virtual ~WebviewAuthHandler();
virtual void AuthenticateWebview(OnWebviewAuth callback);
private:
std::unique_ptr<GaiaAuthFetcher> CreateGaiaAuthFetcherForPartition(
GaiaAuthConsumer* consumer,
const gaia::GaiaSource& source) override;
network::mojom::CookieManager* GetCookieManagerForPartition() override;
void OnAuthFinished(OnWebviewAuth callback,
signin::SetAccountsInCookieResult cookie_result);
void CompleteAuth(OnWebviewAuth callback, bool is_success);
void RetryAuth(OnWebviewAuth callback);
content::StoragePartition* GetStoragePartition();
content::StoragePartitionConfig storage_partition_config_;
const raw_ptr<content::BrowserContext> context_;
base::OneShotTimer retry_auth_timer_;
net::BackoffEntry retry_auth_backoff_;
std::unique_ptr<signin::AccountsCookieMutator::SetAccountsInCookieTask>
cookie_loader_;
};
}
#endif