#ifndef CONTENT_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_IMPL_H_
#define CONTENT_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_IMPL_H_
#include <stdint.h>
#include <map>
#include <memory>
#include <optional>
#include <set>
#include "base/cancelable_callback.h"
#include "base/containers/queue.h"
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/supports_user_data.h"
#include "base/synchronization/waitable_event_watcher.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "content/common/content_export.h"
#include "content/public/browser/browsing_data_remover.h"
#include "content/public/browser/storage_partition_config.h"
#include "third_party/blink/public/common/storage_key/storage_key.h"
#include "url/origin.h"
namespace content {
class BrowserContext;
class BrowsingDataFilterBuilder;
class StoragePartition;
class CONTENT_EXPORT BrowsingDataRemoverImpl
: public BrowsingDataRemover,
public base::SupportsUserData::Data {
public:
explicit BrowsingDataRemoverImpl(BrowserContext* browser_context);
BrowsingDataRemoverImpl(const BrowsingDataRemoverImpl&) = delete;
BrowsingDataRemoverImpl& operator=(const BrowsingDataRemoverImpl&) = delete;
~BrowsingDataRemoverImpl() override;
bool IsRemovingForTesting() { return is_removing_; }
void RemoveStorageBucketsAndReply(
const std::optional<StoragePartitionConfig> storage_partition_config,
const blink::StorageKey& storage_key,
const std::set<std::string>& storage_buckets,
base::OnceClosure callback);
void SetEmbedderDelegate(
BrowsingDataRemoverDelegate* embedder_delegate) override;
bool DoesOriginMatchMaskForTesting(
uint64_t origin_type_mask,
const url::Origin& origin,
storage::SpecialStoragePolicy* special_storage_policy) override;
void Remove(const base::Time& delete_begin,
const base::Time& delete_end,
uint64_t remove_mask,
uint64_t origin_type_mask) override;
void RemoveWithFilter(
const base::Time& delete_begin,
const base::Time& delete_end,
uint64_t remove_mask,
uint64_t origin_type_mask,
std::unique_ptr<BrowsingDataFilterBuilder> filter_builder) override;
void RemoveAndReply(const base::Time& delete_begin,
const base::Time& delete_end,
uint64_t remove_mask,
uint64_t origin_type_mask,
Observer* observer) override;
void RemoveWithFilterAndReply(
const base::Time& delete_begin,
const base::Time& delete_end,
uint64_t remove_mask,
uint64_t origin_type_mask,
std::unique_ptr<BrowsingDataFilterBuilder> filter_builder,
Observer* observer) override;
void AddObserver(Observer* observer) override;
void RemoveObserver(Observer* observer) override;
void SetWouldCompleteCallbackForTesting(
const base::RepeatingCallback<
void(base::OnceClosure continue_to_completion)>& callback) override;
const base::Time& GetLastUsedBeginTimeForTesting() override;
uint64_t GetLastUsedRemovalMaskForTesting() override;
uint64_t GetLastUsedOriginTypeMaskForTesting() override;
std::optional<StoragePartitionConfig>
GetLastUsedStoragePartitionConfigForTesting() override;
uint64_t GetPendingTaskCountForTesting() override;
void ClearClientHintCacheAndReply(const url::Origin& origin,
base::OnceClosure callback);
void OverrideStoragePartitionForTesting(
const StoragePartitionConfig& storage_partition_config,
StoragePartition* storage_partition);
protected:
virtual void RemoveInternal(
const base::Time& delete_begin,
const base::Time& delete_end,
uint64_t remove_mask,
uint64_t origin_type_mask,
std::unique_ptr<BrowsingDataFilterBuilder> filter_builder,
Observer* observer);
private:
FRIEND_TEST_ALL_PREFIXES(BrowsingDataRemoverImplTest, MultipleTasks);
FRIEND_TEST_ALL_PREFIXES(BrowsingDataRemoverImplTest, MultipleIdenticalTasks);
enum class TracingDataType {
kSynchronous = 1,
kEmbedderData = 2,
kStoragePartition = 3,
kHttpCache = 4,
kHttpAndMediaCaches = 5,
kReportingCache = 6,
kChannelIds = 7,
kNetworkHistory = 8,
kAuthCache = 9,
kCodeCaches = 10,
kNetworkErrorLogging = 11,
kTrustTokens = 12,
kConversions = 13,
kDeferredCookies = 14,
kSharedStorage = 15,
kPreflightCache = 16,
kSharedDictionary = 17,
kPrefetchCache = 18,
kPrerenderCache = 19,
kMaxValue = kPrerenderCache,
};
const char* GetHistogramSuffix(TracingDataType task);
struct CONTENT_EXPORT RemovalTask {
RemovalTask(const base::Time& delete_begin,
const base::Time& delete_end,
uint64_t remove_mask,
uint64_t origin_type_mask,
std::unique_ptr<BrowsingDataFilterBuilder> filter_builder,
Observer* observer);
RemovalTask(RemovalTask&& other) noexcept;
~RemovalTask();
bool IsSameDeletion(const RemovalTask& other);
base::Time delete_begin;
base::Time delete_end;
uint64_t remove_mask;
uint64_t origin_type_mask;
std::unique_ptr<BrowsingDataFilterBuilder> filter_builder;
std::vector<raw_ptr<Observer, VectorExperimental>> observers;
base::TimeTicks task_started;
};
void SetRemoving(bool is_removing);
void RunNextTask();
void RemoveImpl(const base::Time& delete_begin,
const base::Time& delete_end,
uint64_t remove_mask,
BrowsingDataFilterBuilder* filter_builder,
uint64_t origin_type_mask);
void OnDelegateDone(base::OnceClosure completion_closure,
uint64_t failed_data_types);
void Notify();
void OnTaskComplete(TracingDataType data_type, base::TimeTicks started);
void DidRemoveStorageBuckets(base::OnceClosure callback);
base::OnceClosure CreateTaskCompletionClosure(TracingDataType data_type);
base::OnceClosure CreateTaskCompletionClosureForMojo(
TracingDataType data_type);
void RecordUnfinishedSubTasks();
StoragePartition* GetStoragePartition(
std::optional<StoragePartitionConfig> storage_partition_config);
void ClearClientHintCacheAndReplyImpl(const url::Origin& origin,
base::OnceClosure callback);
base::WeakPtr<BrowsingDataRemoverImpl> GetWeakPtr();
raw_ptr<BrowserContext> browser_context_;
raw_ptr<BrowsingDataRemoverDelegate, DanglingUntriaged> embedder_delegate_;
base::Time delete_begin_;
base::Time delete_end_;
uint64_t remove_mask_ = 0;
uint64_t origin_type_mask_ = 0;
std::optional<StoragePartitionConfig> storage_partition_config_ =
std::nullopt;
std::vector<std::string> domains_for_deferred_cookie_deletion_;
bool is_removing_;
std::deque<RemovalTask> task_queue_;
base::RepeatingCallback<void(base::OnceClosure continue_to_completion)>
would_complete_callback_;
std::set<TracingDataType> pending_sub_tasks_;
uint64_t failed_data_types_ = 0;
base::CancelableOnceClosure slow_pending_tasks_closure_;
base::ObserverList<Observer, true>::Unchecked observer_list_;
std::map<StoragePartitionConfig, raw_ptr<StoragePartition>>
storage_partitions_for_testing_;
base::WeakPtrFactory<BrowsingDataRemoverImpl> weak_ptr_factory_{this};
};
}
#endif