#ifndef NET_COOKIES_COOKIE_STORE_TEST_CALLBACKS_H_
#define NET_COOKIES_COOKIE_STORE_TEST_CALLBACKS_H_
#include <vector>
#include "base/functional/bind.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/run_loop.h"
#include "base/task/single_thread_task_runner.h"
#include "net/cookies/canonical_cookie.h"
#include "net/cookies/cookie_constants.h"
#include "net/cookies/cookie_store.h"
namespace base {
class Thread;
}
namespace net {
class CookieCallback {
public:
void WaitUntilDone();
bool was_run() const;
protected:
explicit CookieCallback(base::Thread* run_in_thread);
CookieCallback();
~CookieCallback();
void CallbackEpilogue();
private:
void ValidateThread() const;
raw_ptr<base::Thread> run_in_thread_;
scoped_refptr<base::SingleThreadTaskRunner> run_in_task_runner_;
base::RunLoop loop_to_quit_;
bool was_run_ = false;
};
template <typename T>
class ResultSavingCookieCallback : public CookieCallback {
public:
ResultSavingCookieCallback() = default;
explicit ResultSavingCookieCallback(base::Thread* run_in_thread)
: CookieCallback(run_in_thread) {
}
void Run(T result) {
result_ = result;
CallbackEpilogue();
}
base::OnceCallback<void(T)> MakeCallback() {
return base::BindOnce(&ResultSavingCookieCallback<T>::Run,
base::Unretained(this));
}
const T& result() { return result_; }
private:
T result_;
};
class NoResultCookieCallback : public CookieCallback {
public:
NoResultCookieCallback();
explicit NoResultCookieCallback(base::Thread* run_in_thread);
base::OnceCallback<void()> MakeCallback() {
return base::BindOnce(&NoResultCookieCallback::Run, base::Unretained(this));
}
void Run() {
CallbackEpilogue();
}
};
class GetCookieListCallback : public CookieCallback {
public:
GetCookieListCallback();
explicit GetCookieListCallback(base::Thread* run_in_thread);
~GetCookieListCallback();
void Run(const CookieAccessResultList& cookies,
const CookieAccessResultList& excluded_cookies);
base::OnceCallback<void(const CookieAccessResultList&,
const CookieAccessResultList&)>
MakeCallback() {
return base::BindOnce(&GetCookieListCallback::Run, base::Unretained(this));
}
const CookieList& cookies() { return cookies_; }
const CookieAccessResultList& cookies_with_access_results() {
return cookies_with_access_results_;
}
const CookieAccessResultList& excluded_cookies() { return excluded_cookies_; }
private:
CookieList cookies_;
CookieAccessResultList cookies_with_access_results_;
CookieAccessResultList excluded_cookies_;
};
class GetAllCookiesCallback : public CookieCallback {
public:
GetAllCookiesCallback();
explicit GetAllCookiesCallback(base::Thread* run_in_thread);
~GetAllCookiesCallback();
void Run(const CookieList& cookies);
base::OnceCallback<void(const CookieList&)> MakeCallback() {
return base::BindOnce(&GetAllCookiesCallback::Run, base::Unretained(this));
}
const CookieList& cookies() { return cookies_; }
private:
CookieList cookies_;
};
class GetAllCookiesWithAccessSemanticsCallback : public CookieCallback {
public:
GetAllCookiesWithAccessSemanticsCallback();
explicit GetAllCookiesWithAccessSemanticsCallback(
base::Thread* run_in_thread);
~GetAllCookiesWithAccessSemanticsCallback();
void Run(const CookieList& cookies,
const std::vector<CookieAccessSemantics>& access_semantics_list);
base::OnceCallback<void(const CookieList&,
const std::vector<CookieAccessSemantics>&)>
MakeCallback() {
return base::BindOnce(&GetAllCookiesWithAccessSemanticsCallback::Run,
base::Unretained(this));
}
const CookieList& cookies() { return cookies_; }
const std::vector<CookieAccessSemantics>& access_semantics_list() {
return access_semantics_list_;
}
private:
CookieList cookies_;
std::vector<CookieAccessSemantics> access_semantics_list_;
};
}
#endif