#ifndef SERVICES_NETWORK_COOKIE_MANAGER_H_
#define SERVICES_NETWORK_COOKIE_MANAGER_H_
#include <memory>
#include <string>
#include <vector>
#include "arkweb/build/features/features.h"
#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/synchronization/lock.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/content_settings_types.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "net/cookies/cookie_change_dispatcher.h"
#include "net/cookies/cookie_deletion_info.h"
#include "services/network/cookie_settings.h"
#include "services/network/public/mojom/cookie_manager.mojom.h"
#include "services/network/tpcd/metadata/manager.h"
namespace net {
class CookieStore;
class URLRequestContext;
}
class GURL;
namespace network {
class FirstPartySetsAccessDelegate;
class SessionCleanupCookieStore;
namespace tpcd::metadata {
class Manager;
}
using SettingsChangeCallback = base::RepeatingClosure;
class COMPONENT_EXPORT(NETWORK_SERVICE) CookieManager
: public mojom::CookieManager {
public:
CookieManager(
net::URLRequestContext* url_request_context,
FirstPartySetsAccessDelegate* const first_party_sets_access_delegate,
scoped_refptr<SessionCleanupCookieStore> session_cleanup_cookie_store,
mojom::CookieManagerParamsPtr params,
tpcd::metadata::Manager* tpcd_metadata_manager);
CookieManager(const CookieManager&) = delete;
CookieManager& operator=(const CookieManager&) = delete;
~CookieManager() override;
void AddSettingsWillChangeCallback(SettingsChangeCallback callback);
const CookieSettings& cookie_settings() const { return cookie_settings_; }
void AddReceiver(mojo::PendingReceiver<mojom::CookieManager> receiver);
void GetAllCookies(GetAllCookiesCallback callback) override;
void GetAllCookiesWithAccessSemantics(
GetAllCookiesWithAccessSemanticsCallback callback) override;
void GetCookieList(
const GURL& url,
const net::CookieOptions& cookie_options,
const net::CookiePartitionKeyCollection& cookie_partition_key_collection,
GetCookieListCallback callback) override;
void SetCanonicalCookie(const net::CanonicalCookie& cookie,
const GURL& source_url,
const net::CookieOptions& cookie_options,
SetCanonicalCookieCallback callback) override;
#if BUILDFLAG(ARKWEB_COOKIE)
void SetCanonicalCookieSync(const net::CanonicalCookie& cookie,
const GURL& source_url,
const net::CookieOptions& cookie_options,
SetCanonicalCookieCallback callback) override;
void GetCookieListSync(
const GURL& url,
const net::CookieOptions& cookie_options,
const net::CookiePartitionKeyCollection& cookie_partition_key_collection,
GetCookieListCallback callback) override;
void GetAllCookiesSync(GetAllCookiesCallback callback) override;
void DeleteCookiesSync(mojom::CookieDeletionFilterPtr filter,
DeleteCookiesCallback callback) override;
void SetAllCookies(const net::CookieList& list,
SetAllCookiesCallback callback) override;
#endif
void DeleteCanonicalCookie(const net::CanonicalCookie& cookie,
DeleteCanonicalCookieCallback callback) override;
void SetContentSettings(ContentSettingsType content_settings_type,
const ContentSettingsForOneType& settings,
SetContentSettingsCallback callback) override;
void DeleteCookies(mojom::CookieDeletionFilterPtr filter,
DeleteCookiesCallback callback) override;
void DeleteSessionOnlyCookies(
DeleteSessionOnlyCookiesCallback callback) override;
void DeleteStaleSessionOnlyCookies(
DeleteStaleSessionOnlyCookiesCallback callback) override;
void AddCookieChangeListener(
const GURL& url,
const std::optional<std::string>& name,
mojo::PendingRemote<mojom::CookieChangeListener> listener) override;
void AddGlobalChangeListener(
mojo::PendingRemote<mojom::CookieChangeListener> listener) override;
void CloneInterface(
mojo::PendingReceiver<mojom::CookieManager> new_interface) override;
void SetPreCommitCallbackDelayForTesting(base::TimeDelta delay) override;
size_t GetClientsBoundForTesting() const { return receivers_.size(); }
size_t GetListenersRegisteredForTesting() const {
return listener_registrations_.size();
}
void FlushCookieStore(FlushCookieStoreCallback callback) override;
void AllowFileSchemeCookies(bool allow,
AllowFileSchemeCookiesCallback callback) override;
void SetForceKeepSessionState() override;
void BlockThirdPartyCookies(bool block) override;
void SetMitigationsEnabledFor3pcd(bool enable) override;
void SetTrackingProtectionEnabledFor3pcd(bool enable) override;
static void ConfigureCookieSettings(
const network::mojom::CookieManagerParams& params,
CookieSettings* out);
static void CrashOnGetCookieList();
private:
void OnSettingsWillChange();
struct ListenerRegistration {
ListenerRegistration();
ListenerRegistration(const ListenerRegistration&) = delete;
ListenerRegistration& operator=(const ListenerRegistration&) = delete;
~ListenerRegistration();
void DispatchCookieStoreChange(const net::CookieChangeInfo& change);
std::unique_ptr<net::CookieChangeSubscription> subscription;
mojo::Remote<mojom::CookieChangeListener> listener;
};
void RemoveChangeListener(ListenerRegistration* registration);
const raw_ptr<net::CookieStore> cookie_store_;
scoped_refptr<SessionCleanupCookieStore> session_cleanup_cookie_store_;
mojo::ReceiverSet<mojom::CookieManager> receivers_;
std::vector<std::unique_ptr<ListenerRegistration>> listener_registrations_;
CookieSettings cookie_settings_;
SettingsChangeCallback settings_will_change_callback_;
base::WeakPtrFactory<CookieManager> weak_factory_{this};
};
COMPONENT_EXPORT(NETWORK_SERVICE)
net::CookieDeletionInfo DeletionFilterToInfo(
mojom::CookieDeletionFilterPtr filter);
}
#endif