Index: extensions/common/url_pattern_set.cc |
diff --git a/extensions/common/url_pattern_set.cc b/extensions/common/url_pattern_set.cc |
index 118f9ee31ead02fa1891469830b54ab90698beb1..b8d55fc01934d30bad12e5eb283f45da810d8fbb 100644 |
--- a/extensions/common/url_pattern_set.cc |
+++ b/extensions/common/url_pattern_set.cc |
@@ -29,8 +29,11 @@ void URLPatternSet::CreateDifference(const URLPatternSet& set1, |
const URLPatternSet& set2, |
URLPatternSet* out) { |
out->ClearPatterns(); |
- out->patterns_ = base::STLSetDifference<std::set<URLPattern> >( |
- set1.patterns_, set2.patterns_); |
+ for (URLPatternSet::const_iterator pattern1 = set1.patterns_.begin(); |
+ pattern1 != set1.patterns_.end(); ++pattern1) { |
+ if (!set2.ContainsPattern(*pattern1)) |
+ out->InsertPattern(*pattern1); |
+ } |
} |
// static |
@@ -38,10 +41,17 @@ void URLPatternSet::CreateIntersection(const URLPatternSet& set1, |
const URLPatternSet& set2, |
URLPatternSet* out) { |
out->ClearPatterns(); |
- std::set_intersection(set1.patterns_.begin(), set1.patterns_.end(), |
- set2.patterns_.begin(), set2.patterns_.end(), |
- std::inserter<std::set<URLPattern> >( |
- out->patterns_, out->patterns_.begin())); |
+ for (URLPatternSet::const_iterator pattern1 = set1.patterns_.begin(); |
+ pattern1 != set1.patterns_.end(); ++pattern1) { |
+ for (URLPatternSet::const_iterator pattern2 = set2.patterns_.begin(); |
+ pattern2 != set2.patterns_.end(); ++pattern2) { |
+ if (pattern1->Contains(*pattern2)) { |
+ out->InsertPattern(*pattern2); |
+ } else if (pattern2->Contains(*pattern1)) { |
+ out->InsertPattern(*pattern1); |
+ } |
+ } |
+ } |
} |
// static |
@@ -49,10 +59,8 @@ void URLPatternSet::CreateUnion(const URLPatternSet& set1, |
const URLPatternSet& set2, |
URLPatternSet* out) { |
out->ClearPatterns(); |
- std::set_union(set1.patterns_.begin(), set1.patterns_.end(), |
- set2.patterns_.begin(), set2.patterns_.end(), |
- std::inserter<std::set<URLPattern> >( |
- out->patterns_, out->patterns_.begin())); |
+ out->AddPatterns(set1); |
+ out->AddPatterns(set2); |
} |
// static |
@@ -116,12 +124,26 @@ size_t URLPatternSet::size() const { |
} |
bool URLPatternSet::AddPattern(const URLPattern& pattern) { |
- return patterns_.insert(pattern).second; |
+ // Adding a more specific pattern should be a no-op. |
+ if (ContainsPattern(pattern)) |
+ return false; |
+ |
+ // Adding a more general pattern should remove the more specific patterns |
+ for (URLPatternSet::const_iterator it = patterns_.begin(); |
+ it != patterns_.end();) { |
+ if (pattern.Contains(*it)) |
+ patterns_.erase(it++); |
+ else |
+ ++it; |
+ } |
+ return InsertPattern(pattern); |
} |
void URLPatternSet::AddPatterns(const URLPatternSet& set) { |
- patterns_.insert(set.patterns().begin(), |
- set.patterns().end()); |
+ for (URLPatternSet::const_iterator pattern = set.patterns_.begin(); |
+ pattern != set.patterns_.end(); ++pattern) { |
+ AddPattern(*pattern); |
+ } |
} |
void URLPatternSet::ClearPatterns() { |
@@ -229,4 +251,8 @@ bool URLPatternSet::Populate(const base::ListValue& value, |
return Populate(patterns, valid_schemes, allow_file_access, error); |
} |
+bool URLPatternSet::InsertPattern(const URLPattern& pattern) { |
+ return patterns_.insert(pattern).second; |
+} |
+ |
} // namespace extensions |