| 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
|
|
|