#ifndef EXTENSIONS_BROWSER_API_DECLARATIVE_NET_REQUEST_FILE_SEQUENCE_HELPER_H_
#define EXTENSIONS_BROWSER_API_DECLARATIVE_NET_REQUEST_FILE_SEQUENCE_HELPER_H_
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/functional/callback_forward.h"
#include "base/memory/weak_ptr.h"
#include "base/token.h"
#include "base/version.h"
#include "extensions/browser/api/declarative_net_request/constants.h"
#include "extensions/browser/api/declarative_net_request/file_backed_ruleset_source.h"
#include "extensions/browser/api/declarative_net_request/ruleset_matcher.h"
#include "extensions/common/extension_id.h"
namespace extensions {
namespace api::declarative_net_request {
struct Rule;
}
namespace declarative_net_request {
enum class DynamicRuleUpdateAction;
struct RuleCounts;
class RulesetInfo {
public:
explicit RulesetInfo(FileBackedRulesetSource source);
RulesetInfo(const RulesetInfo&) = delete;
RulesetInfo(RulesetInfo&&);
RulesetInfo& operator=(const RulesetInfo&) = delete;
RulesetInfo& operator=(RulesetInfo&&);
~RulesetInfo();
const FileBackedRulesetSource& source() const { return source_; }
std::unique_ptr<RulesetMatcher> TakeMatcher();
void set_new_checksum(int new_checksum) { new_checksum_ = new_checksum; }
std::optional<int> new_checksum() const { return new_checksum_; }
void set_expected_checksum(int checksum) { expected_checksum_ = checksum; }
std::optional<int> expected_checksum() const { return expected_checksum_; }
void set_indexing_successful(bool val) { indexing_successful_ = val; }
std::optional<bool> indexing_successful() const {
return indexing_successful_;
}
const std::optional<LoadRulesetResult>& load_ruleset_result() const;
bool did_load_successfully() const {
return load_ruleset_result() == LoadRulesetResult::kSuccess;
}
void CreateVerifiedMatcher();
private:
FileBackedRulesetSource source_;
std::optional<int> expected_checksum_;
std::unique_ptr<RulesetMatcher> matcher_;
std::optional<LoadRulesetResult> load_ruleset_result_;
std::optional<int> new_checksum_;
std::optional<bool> indexing_successful_;
};
struct LoadRequestData {
LoadRequestData() = delete;
LoadRequestData(ExtensionId extension_id,
base::Version extension_version,
LoadRulesetRequestSource request_source);
LoadRequestData(const LoadRequestData&) = delete;
LoadRequestData(LoadRequestData&&);
LoadRequestData& operator=(const LoadRequestData&) = delete;
LoadRequestData& operator=(LoadRequestData&&);
~LoadRequestData();
ExtensionId extension_id;
base::Version extension_version;
LoadRulesetRequestSource request_source;
std::vector<RulesetInfo> rulesets;
base::Token load_request_id;
};
class FileSequenceHelper {
public:
FileSequenceHelper();
FileSequenceHelper(const FileSequenceHelper&) = delete;
FileSequenceHelper& operator=(const FileSequenceHelper&) = delete;
~FileSequenceHelper();
using LoadRulesetsUICallback = base::OnceCallback<void(LoadRequestData)>;
void LoadRulesets(LoadRequestData load_data,
LoadRulesetsUICallback ui_callback) const;
using UpdateDynamicRulesUICallback =
base::OnceCallback<void(LoadRequestData, std::optional<std::string>)>;
void UpdateDynamicRules(
LoadRequestData load_data,
std::vector<int> rule_ids_to_remove,
std::vector<api::declarative_net_request::Rule> rules_to_add,
const RuleCounts& rule_limit,
UpdateDynamicRulesUICallback ui_callback) const;
private:
void OnRulesetsIndexed(LoadRulesetsUICallback ui_callback,
LoadRequestData load_data) const;
mutable base::WeakPtrFactory<FileSequenceHelper> weak_factory_{this};
};
}
}
#endif