This source file includes following definitions.
- DeleteAllErrors
- DeleteIncognitoErrors
- DeleteErrorsOfType
- AddError
- GetErrorsForExtension
- AddError
- Remove
- RemoveErrorsForExtensionOfType
- RemoveIncognitoErrors
- RemoveAllErrors
#include "extensions/browser/error_map.h"
#include "base/lazy_instance.h"
#include "base/stl_util.h"
#include "extensions/common/extension.h"
namespace extensions {
namespace {
const size_t kMaxErrorsPerExtension = 100;
base::LazyInstance<ErrorList> g_empty_error_list = LAZY_INSTANCE_INITIALIZER;
}
ErrorMap::ExtensionEntry::ExtensionEntry() {
}
ErrorMap::ExtensionEntry::~ExtensionEntry() {
DeleteAllErrors();
}
void ErrorMap::ExtensionEntry::DeleteAllErrors() {
STLDeleteContainerPointers(list_.begin(), list_.end());
list_.clear();
}
void ErrorMap::ExtensionEntry::DeleteIncognitoErrors() {
ErrorList::iterator iter = list_.begin();
while (iter != list_.end()) {
if ((*iter)->from_incognito()) {
delete *iter;
iter = list_.erase(iter);
} else {
++iter;
}
}
}
void ErrorMap::ExtensionEntry::DeleteErrorsOfType(ExtensionError::Type type) {
ErrorList::iterator iter = list_.begin();
while (iter != list_.end()) {
if ((*iter)->type() == type) {
delete *iter;
iter = list_.erase(iter);
} else {
++iter;
}
}
}
const ExtensionError* ErrorMap::ExtensionEntry::AddError(
scoped_ptr<ExtensionError> error) {
for (ErrorList::iterator iter = list_.begin(); iter != list_.end(); ++iter) {
if (error->IsEqual(*iter)) {
error->set_occurrences((*iter)->occurrences() + 1);
delete *iter;
list_.erase(iter);
break;
}
}
if (list_.size() >= kMaxErrorsPerExtension) {
delete list_.front();
list_.pop_front();
}
list_.push_back(error.release());
return list_.back();
}
ErrorMap::ErrorMap() {
}
ErrorMap::~ErrorMap() {
RemoveAllErrors();
}
const ErrorList& ErrorMap::GetErrorsForExtension(
const std::string& extension_id) const {
EntryMap::const_iterator iter = map_.find(extension_id);
return iter != map_.end() ? *iter->second->list() : g_empty_error_list.Get();
}
const ExtensionError* ErrorMap::AddError(scoped_ptr<ExtensionError> error) {
EntryMap::iterator iter = map_.find(error->extension_id());
if (iter == map_.end()) {
iter = map_.insert(std::pair<std::string, ExtensionEntry*>(
error->extension_id(), new ExtensionEntry)).first;
}
return iter->second->AddError(error.Pass());
}
void ErrorMap::Remove(const std::string& extension_id) {
EntryMap::iterator iter = map_.find(extension_id);
if (iter == map_.end())
return;
delete iter->second;
map_.erase(iter);
}
void ErrorMap::RemoveErrorsForExtensionOfType(const std::string& extension_id,
ExtensionError::Type type) {
EntryMap::iterator iter = map_.find(extension_id);
if (iter != map_.end())
iter->second->DeleteErrorsOfType(type);
}
void ErrorMap::RemoveIncognitoErrors() {
for (EntryMap::iterator iter = map_.begin(); iter != map_.end(); ++iter)
iter->second->DeleteIncognitoErrors();
}
void ErrorMap::RemoveAllErrors() {
for (EntryMap::iterator iter = map_.begin(); iter != map_.end(); ++iter) {
iter->second->DeleteAllErrors();
delete iter->second;
}
map_.clear();
}
}