Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Unified Diff: extensions/common/url_pattern_set.cc

Issue 181043006: Implement correct logic for URLPatternSet set operators. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address code review feedback. Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « extensions/common/url_pattern_set.h ('k') | extensions/common/url_pattern_set_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « extensions/common/url_pattern_set.h ('k') | extensions/common/url_pattern_set_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698