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..58835a98756142d9bdfd87237e8bdbabc494c1e0 100644 |
--- a/extensions/common/url_pattern_set.cc |
+++ b/extensions/common/url_pattern_set.cc |
@@ -29,8 +29,19 @@ 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) { |
+ bool keepPattern1 = true; |
not at google - send to devlin
2014/02/27 21:10:46
is this whole block just
if (!set.ContainsPattern
rpaquay
2014/02/28 01:46:47
Done.
|
+ for (URLPatternSet::const_iterator pattern2 = set2.patterns_.begin(); |
+ pattern2 != set2.patterns_.end(); ++pattern2) { |
+ if (*pattern2 == *pattern1 || pattern2->Contains(*pattern1)) { |
not at google - send to devlin
2014/02/27 21:10:46
Could you add the equality shortcut (assuming its
rpaquay
2014/02/28 01:46:47
Done.
|
+ keepPattern1 = false; |
+ break; |
+ } |
+ } |
+ if (keepPattern1) |
+ out->InsertPattern(*pattern1); |
+ } |
} |
// static |
@@ -38,10 +49,19 @@ 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 == *pattern2) { |
+ out->InsertPattern(*pattern1); |
not at google - send to devlin
2014/02/27 21:10:46
likewise above comment; this *pattern1 == *pattern
rpaquay
2014/02/28 01:46:47
Done.
|
+ } else if (pattern1->Contains(*pattern2)) { |
+ out->InsertPattern(*pattern2); |
+ } else if (pattern2->Contains(*pattern1)) { |
+ out->InsertPattern(*pattern1); |
+ } |
+ } |
+ } |
} |
// static |
@@ -49,10 +69,38 @@ 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())); |
+ |
+ // Add all elements from set1 except the ones that have a "better" element in |
+ // set2. |
+ for (URLPatternSet::const_iterator pattern1 = set1.patterns_.begin(); |
+ pattern1 != set1.patterns_.end(); ++pattern1) { |
+ bool addPattern1 = true; |
+ for (URLPatternSet::const_iterator pattern2 = set2.patterns_.begin(); |
+ pattern2 != set2.patterns_.end(); ++pattern2) { |
+ if (!(*pattern2 == *pattern1) && pattern2->Contains(*pattern1)) { |
+ addPattern1 = false; |
+ break; |
+ } |
+ } |
+ if (addPattern1) |
+ out->InsertPattern(*pattern1); |
+ } |
+ |
+ // Add all elements from set2 except the ones that have a "better" element in |
+ // set1. |
+ for (URLPatternSet::const_iterator pattern2 = set2.patterns_.begin(); |
+ pattern2 != set2.patterns_.end(); ++pattern2) { |
+ bool addPattern2 = true; |
+ for (URLPatternSet::const_iterator pattern1 = set1.patterns_.begin(); |
+ pattern1 != set1.patterns_.end(); ++pattern1) { |
+ if (!(*pattern1 == *pattern2) && pattern1->Contains(*pattern2)) { |
+ addPattern2 = false; |
+ break; |
+ } |
+ } |
+ if (addPattern2) |
+ out->InsertPattern(*pattern2); |
+ } |
not at google - send to devlin
2014/02/27 21:10:46
see above comment(s) that apply to this function t
rpaquay
2014/02/28 01:46:47
Actually, since I updated AddPattern to do the "ri
|
} |
// static |
@@ -116,12 +164,28 @@ size_t URLPatternSet::size() const { |
} |
bool URLPatternSet::AddPattern(const URLPattern& pattern) { |
- return patterns_.insert(pattern).second; |
+ // Note: Adding a more specific pattern should be a no-op. |
+ for (URLPatternSet::const_iterator it = patterns_.begin(); |
+ it != patterns_.end(); ++it) { |
+ if (it->Contains(pattern)) |
+ return false; |
+ } |
not at google - send to devlin
2014/02/27 21:10:46
if (ContainsPattern(pattern))
return false;
?
rpaquay
2014/02/28 01:46:47
Done.
|
+ // 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; |
not at google - send to devlin
2014/02/27 21:10:46
nice
rpaquay
2014/02/28 01:46:47
http://stackoverflow.com/questions/2874441/deletin
|
+ } |
+ 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 +293,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 |