#ifndef CONTENT_BROWSER_BROWSING_DATA_CLEAR_SITE_DATA_HANDLER_H_
#define CONTENT_BROWSER_BROWSING_DATA_CLEAR_SITE_DATA_HANDLER_H_
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/functional/callback.h"
#include "base/time/time.h"
#include "content/common/content_export.h"
#include "content/public/browser/clear_site_data_utils.h"
#include "content/public/browser/storage_partition_config.h"
#include "net/cookies/cookie_partition_key.h"
#include "third_party/blink/public/common/storage_key/storage_key.h"
#include "third_party/blink/public/mojom/devtools/console_message.mojom.h"
#include "url/gurl.h"
#include "url/origin.h"
namespace content {
class WebContents;
class BrowserContext;
class CONTENT_EXPORT ClearSiteDataHandler {
public:
class CONTENT_EXPORT ConsoleMessagesDelegate {
public:
struct Message {
GURL url;
std::string text;
blink::mojom::ConsoleMessageLevel level;
};
using OutputFormattedMessageFunction =
base::RepeatingCallback<void(WebContents*,
blink::mojom::ConsoleMessageLevel,
const std::string&)>;
ConsoleMessagesDelegate();
virtual ~ConsoleMessagesDelegate();
virtual void AddMessage(const GURL& url,
const std::string& text,
blink::mojom::ConsoleMessageLevel level);
virtual void OutputMessages(base::WeakPtr<WebContents> web_contents);
const std::vector<Message>& GetMessagesForTesting() const {
return messages_;
}
protected:
void SetOutputFormattedMessageFunctionForTesting(
const OutputFormattedMessageFunction& function);
private:
std::vector<Message> messages_;
OutputFormattedMessageFunction output_formatted_message_function_;
};
ClearSiteDataHandler(const ClearSiteDataHandler&) = delete;
ClearSiteDataHandler& operator=(const ClearSiteDataHandler&) = delete;
static void HandleHeader(
base::WeakPtr<BrowserContext> browser_context,
base::WeakPtr<WebContents> web_contents,
const StoragePartitionConfig& storage_partition_config,
const GURL& url,
const std::string& header_value,
int load_flags,
const std::optional<net::CookiePartitionKey> cookie_partition_key,
const std::optional<blink::StorageKey> storage_key,
bool partitioned_state_allowed_only,
base::OnceClosure callback);
static bool ParseHeaderForTesting(
const std::string& header,
ClearSiteDataTypeSet* clear_site_data_types,
std::set<std::string>* storage_buckets_to_remove,
ConsoleMessagesDelegate* delegate,
const GURL& current_url);
protected:
ClearSiteDataHandler(
base::WeakPtr<BrowserContext> browser_context,
base::WeakPtr<WebContents> web_contents,
const StoragePartitionConfig& storage_partition_config,
const GURL& url,
const std::string& header_value,
int load_flags,
const std::optional<net::CookiePartitionKey> cookie_partition_key,
const std::optional<blink::StorageKey> storage_key,
bool partitioned_state_allowed_only,
base::OnceClosure callback,
std::unique_ptr<ConsoleMessagesDelegate> delegate);
virtual ~ClearSiteDataHandler();
bool HandleHeaderAndOutputConsoleMessages();
bool Run();
static bool ParseHeader(const std::string& header,
ClearSiteDataTypeSet* clear_site_data_types,
std::set<std::string>* storage_buckets_to_remove,
ConsoleMessagesDelegate* delegate,
const GURL& current_url);
virtual void ExecuteClearingTask(
const url::Origin& origin,
const ClearSiteDataTypeSet clear_site_data_types,
const std::set<std::string>& storage_buckets_to_remove,
base::OnceClosure callback);
static void TaskFinished(base::TimeTicks clearing_started,
std::unique_ptr<ConsoleMessagesDelegate> delegate,
base::WeakPtr<WebContents> web_contents,
base::OnceClosure callback);
void OutputConsoleMessages();
void RunCallbackNotDeferred();
const StoragePartitionConfig& StoragePartitionConfigForTesting() const {
return storage_partition_config_;
}
const GURL& GetURLForTesting();
const std::optional<net::CookiePartitionKey> CookiePartitionKeyForTesting()
const {
return cookie_partition_key_;
}
const std::optional<blink::StorageKey> StorageKeyForTesting() const {
return storage_key_;
}
bool PartitionedStateOnlyForTesting() const {
return partitioned_state_allowed_only_;
}
private:
base::WeakPtr<BrowserContext> browser_context_;
base::WeakPtr<WebContents> web_contents_;
const StoragePartitionConfig storage_partition_config_;
const GURL url_;
const std::string header_value_;
const int load_flags_;
const std::optional<net::CookiePartitionKey> cookie_partition_key_;
const std::optional<blink::StorageKey> storage_key_;
const bool partitioned_state_allowed_only_;
base::OnceClosure callback_;
std::unique_ptr<ConsoleMessagesDelegate> delegate_;
};
}
#endif