blob: 5b4d5cc5e27b4e4e295d7f045d665a6fb6efb841 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef EXTENSIONS_BROWSER_API_DECLARATIVE_NET_REQUEST_PREFS_HELPER_H_
#define EXTENSIONS_BROWSER_API_DECLARATIVE_NET_REQUEST_PREFS_HELPER_H_
#include <optional>
#include <set>
#include <vector>
#include "base/containers/flat_set.h"
#include "base/memory/raw_ref.h"
#include "base/values.h"
#include "extensions/common/api/declarative_net_request/constants.h"
#include "extensions/common/extension_id.h"
namespace extensions {
class ExtensionPrefs;
namespace declarative_net_request {
// ExtensionPrefs helper class for DeclarativeNetRequest.
// This class is stateless, as it is intended to provides one-off operations
// that hits ExtensionPrefs whenever DeclarativeNetRequest preference value
// is fetched or set.
// If any performance issues are noticed, we could look into optimizing this
// class to keep a bit more state. (e.g. keeping disabled static rule count
// and updating it whenever UpdateDisabledStaticRules() is called, so that
// GetDisabledStaticRuleCount() doesn't hit ExtensionPrefs to calculate the
// size each time)
class PrefsHelper {
public:
explicit PrefsHelper(ExtensionPrefs&);
~PrefsHelper();
// Prevent copy constructor and dynamic allocation so that the instance
// lifecycle can be scoped by stack.
PrefsHelper(const PrefsHelper&) = delete;
void* operator new(size_t) = delete;
// Struct that contains the rule ids to disable or enable.
struct RuleIdsToUpdate {
RuleIdsToUpdate(const std::optional<std::vector<int>>& ids_to_disable,
const std::optional<std::vector<int>>& ids_to_enable);
RuleIdsToUpdate(RuleIdsToUpdate&&);
~RuleIdsToUpdate();
bool Empty() { return ids_to_disable.empty() && ids_to_enable.empty(); }
base::flat_set<int> ids_to_disable;
base::flat_set<int> ids_to_enable;
};
// Struct that contains UpdateDisabledStaticRules() result.
struct UpdateDisabledStaticRulesResult {
UpdateDisabledStaticRulesResult();
UpdateDisabledStaticRulesResult(UpdateDisabledStaticRulesResult&&);
~UpdateDisabledStaticRulesResult();
// True if the UpdateDisabledStaticRules() call changed the disabled rule
// ids.
bool changed = false;
// Disabled rule ids after update. (empty if it was not changed)
base::flat_set<int> disabled_rule_ids_after_update;
// Error while updating the disabled rule ids.
std::optional<std::string> error;
};
// Returns the set of disabled rule ids of a static ruleset.
base::flat_set<int> GetDisabledStaticRuleIds(const ExtensionId& extension_id,
RulesetID ruleset_id) const;
// Returns the disabled static rule count for the given `extension_id`.
size_t GetDisabledStaticRuleCount(const ExtensionId& extension_id) const;
// Updates the set of disabled rule ids of a static ruleset.
UpdateDisabledStaticRulesResult UpdateDisabledStaticRules(
const ExtensionId& extension_id,
RulesetID ruleset_id,
const RuleIdsToUpdate& rule_ids_to_update);
// Returns false if there is no ruleset checksum corresponding to the given
// `extension_id` and `ruleset_id`. On success, returns true and populates the
// checksum.
bool GetStaticRulesetChecksum(const ExtensionId& extension_id,
RulesetID ruleset_id,
int& checksum) const;
void SetStaticRulesetChecksum(const ExtensionId& extension_id,
RulesetID ruleset_id,
int checksum);
// Returns false if there is no dynamic ruleset corresponding to
// `extension_id`. On success, returns true and populates the checksum.
bool GetDynamicRulesetChecksum(const ExtensionId& extension_id,
int& checksum) const;
void SetDynamicRulesetChecksum(const ExtensionId& extension_id, int checksum);
// Returns the set of enabled static ruleset IDs or std::nullopt if the
// extension hasn't updated the set of enabled static rulesets.
std::optional<std::set<RulesetID>> GetEnabledStaticRulesets(
const ExtensionId& extension_id) const;
// Updates the set of enabled static rulesets for the `extension_id`. This
// preference gets cleared on extension update.
void SetEnabledStaticRulesets(const ExtensionId& extension_id,
const std::set<RulesetID>& ids);
// Whether the extension with the given `extension_id` is using its ruleset's
// matched action count for the badge text. This is set via the
// setExtensionActionOptions API call.
bool GetUseActionCountAsBadgeText(const ExtensionId& extension_id) const;
void SetUseActionCountAsBadgeText(const ExtensionId& extension_id,
bool use_action_count_as_badge_text);
// Whether the ruleset for the given `extension_id` and `ruleset_id` should be
// ignored while loading the extension.
bool ShouldIgnoreRuleset(const ExtensionId& extension_id,
RulesetID ruleset_id) const;
// Returns the global rule allocation for the given `extension_id`. If no
// rules are allocated to the extension, false is returned.
bool GetAllocatedGlobalRuleCount(const ExtensionId& extension_id,
int& rule_count) const;
void SetAllocatedGlobalRuleCount(const ExtensionId& extension_id,
int rule_count);
// Whether the extension with the given `extension_id` should have its excess
// global rules allocation kept during its next load.
bool GetKeepExcessAllocation(const ExtensionId& extension_id) const;
void SetKeepExcessAllocation(const ExtensionId& extension_id,
bool keep_excess_allocation);
private:
const base::Value::Dict* GetDisabledRuleIdsDict(const ExtensionId&) const;
void SetDisabledStaticRuleIds(const ExtensionId& extension_id,
RulesetID ruleset_id,
const base::flat_set<int>& disabled_rule_ids);
const raw_ref<ExtensionPrefs> prefs_;
};
} // namespace declarative_net_request
} // namespace extensions
#endif // EXTENSIONS_BROWSER_API_DECLARATIVE_NET_REQUEST_PREFS_HELPER_H_