| Index: chrome/browser/extensions/extension_warning_set.cc
|
| diff --git a/chrome/browser/extensions/extension_warning_set.cc b/chrome/browser/extensions/extension_warning_set.cc
|
| index 494b8f8e77190cd8626b9fef987d2f820e7c040e..4d805923d7763ba7727ec6a2d1bf3d735b338ff1 100644
|
| --- a/chrome/browser/extensions/extension_warning_set.cc
|
| +++ b/chrome/browser/extensions/extension_warning_set.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "chrome/browser/extensions/extension_warning_set.h"
|
|
|
| +#include "base/stl_util.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/extensions/extension_global_error_badge.h"
|
| @@ -201,8 +202,8 @@ const std::string ExtensionWarning::GetMessage(
|
| }
|
| }
|
|
|
| -bool operator<(const linked_ptr<ExtensionWarning>& a,
|
| - const linked_ptr<ExtensionWarning>& b) {
|
| +bool ExtensionWarningComparator::operator()(ExtensionWarning* a,
|
| + ExtensionWarning* b) const {
|
| if (a->extension_id() != b->extension_id())
|
| return a->extension_id() < b->extension_id();
|
| return a->warning_type() < b->warning_type();
|
| @@ -214,14 +215,19 @@ bool operator<(const linked_ptr<ExtensionWarning>& a,
|
|
|
| ExtensionWarningSet::ExtensionWarningSet() {}
|
|
|
| -ExtensionWarningSet::~ExtensionWarningSet() {}
|
| +ExtensionWarningSet::~ExtensionWarningSet() {
|
| + // We cannot delete elements that are still in the set because operator<
|
| + // cannot be executed on freed pointers that are still in the set.
|
| + std::vector<ExtensionWarning*> tmp(warnings_.begin(), warnings_.end());
|
| + STLDeleteContainerPointers(tmp.begin(), tmp.end());
|
| +}
|
|
|
| void ExtensionWarningSet::Insert(scoped_ptr<ExtensionWarning> warning) {
|
| - warnings_.insert(make_linked_ptr(warning.release()));
|
| + warnings_.insert(warning.release());
|
| }
|
|
|
| -std::set<linked_ptr<ExtensionWarning> > ExtensionWarningSet::Release() {
|
| - std::set<linked_ptr<ExtensionWarning> > other;
|
| +ExtensionWarningSet::Set ExtensionWarningSet::Release() {
|
| + ExtensionWarningSet::Set other;
|
| warnings_.swap(other);
|
| return other;
|
| }
|
| @@ -239,7 +245,12 @@ ExtensionWarningService::ExtensionWarningService(Profile* profile)
|
| // ExtensionWarningService
|
| //
|
|
|
| -ExtensionWarningService::~ExtensionWarningService() {}
|
| +ExtensionWarningService::~ExtensionWarningService() {
|
| + // We cannot delete elements that are still in the set because operator<
|
| + // cannot be executed on freed pointers that are still in the set.
|
| + std::vector<ExtensionWarning*> tmp(warnings_.begin(), warnings_.end());
|
| + STLDeleteContainerPointers(tmp.begin(), tmp.end());
|
| +}
|
|
|
| void ExtensionWarningService::ClearWarnings(
|
| const std::set<ExtensionWarning::WarningType>& types) {
|
| @@ -248,7 +259,9 @@ void ExtensionWarningService::ClearWarnings(
|
| for (iterator i = warnings_.begin(); i != warnings_.end();) {
|
| if (types.find((*i)->warning_type()) != types.end()) {
|
| deleted_anything = true;
|
| + ExtensionWarning* warning = *i;
|
| warnings_.erase(i++);
|
| + delete warning;
|
| } else {
|
| ++i;
|
| }
|
| @@ -291,7 +304,7 @@ void ExtensionWarningService::AddWarnings(
|
| DCHECK(CalledOnValidThread());
|
| size_t old_size = warnings_.size();
|
|
|
| - std::set<linked_ptr<ExtensionWarning> > warning_set = warnings->Release();
|
| + ExtensionWarningSet::Set warning_set = warnings->Release();
|
| warnings_.insert(warning_set.begin(), warning_set.end());
|
|
|
| if (old_size != warnings_.size()) {
|
|
|