#ifndef EXTENSIONS_BROWSER_ERROR_MAP_H_
#define EXTENSIONS_BROWSER_ERROR_MAP_H_
#include <stddef.h>
#include <map>
#include <memory>
#include <set>
#include <string>
#include "base/containers/circular_deque.h"
#include "extensions/browser/extension_error.h"
#include "extensions/common/extension_id.h"
namespace extensions {
using ErrorList = base::circular_deque<std::unique_ptr<ExtensionError>>;
class ErrorMap {
public:
ErrorMap();
ErrorMap(const ErrorMap&) = delete;
ErrorMap& operator=(const ErrorMap&) = delete;
~ErrorMap();
struct Filter {
Filter(const ExtensionId& restrict_to_extension_id,
int restrict_to_type,
const std::set<int>& restrict_to_ids,
bool restrict_to_incognito);
Filter(const Filter& other);
~Filter();
static Filter ErrorsForExtension(const ExtensionId& extension_id);
static Filter ErrorsForExtensionWithType(const ExtensionId& extension_id,
ExtensionError::Type type);
static Filter ErrorsForExtensionWithIds(const ExtensionId& extension_id,
const std::set<int>& ids);
static Filter ErrorsForExtensionWithTypeAndIds(
const ExtensionId& extension_id,
ExtensionError::Type type,
const std::set<int>& ids);
static Filter IncognitoErrors();
bool Matches(const ExtensionError* error) const;
const ExtensionId restrict_to_extension_id;
const int restrict_to_type;
const std::set<int> restrict_to_ids;
const bool restrict_to_incognito;
};
const ErrorList& GetErrorsForExtension(const ExtensionId& extension_id) const;
const ExtensionError* AddError(std::unique_ptr<ExtensionError> error);
void RemoveErrors(const Filter& filter, std::set<ExtensionId>* affected_ids);
void RemoveAllErrors();
size_t size() const { return map_.size(); }
private:
class ExtensionEntry;
std::map<ExtensionId, std::unique_ptr<ExtensionEntry>> map_;
};
}
#endif