Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include <string> | |
| 6 #include <vector> | |
| 7 | |
| 8 #include "base/bind.h" | |
| 9 #include "chrome/browser/browsing_data/browsing_data_remover_filter.h" | |
| 10 #include "components/content_settings/core/common/content_settings_pattern.h" | |
| 11 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" | |
| 12 | |
| 13 using net::registry_controlled_domains::GetDomainAndRegistry; | |
| 14 using net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES; | |
| 15 using Relation = ContentSettingsPattern::Relation; | |
| 16 | |
| 17 namespace { | |
| 18 | |
| 19 bool NoopFilter(const GURL& url) { | |
| 20 return true; | |
| 21 } | |
| 22 | |
| 23 } // namespace | |
| 24 | |
| 25 BrowsingDataRemoverFilter::BrowsingDataRemoverFilter(Mode mode) : mode_(mode) {} | |
| 26 | |
| 27 BrowsingDataRemoverFilter::~BrowsingDataRemoverFilter() {} | |
| 28 | |
| 29 void BrowsingDataRemoverFilter::AddOrigin(const url::Origin& origin) { | |
| 30 // TODO(msramek): Optimize OriginFilterBuilder for larger filters if needed. | |
| 31 DCHECK_LE(origin_list_.size(), 10U) << "OriginFilterBuilder is only suitable " | |
| 32 "for creating small filters."; | |
| 33 | |
| 34 // By limiting the filter to non-unique origins, we can guarantee that | |
| 35 // origin1 < origin2 && origin1 > origin2 <=> origin1.isSameOrigin(origin2). | |
| 36 // This means that std::set::find() will use the same semantics for | |
| 37 // origin comparison as Origin::IsSameOriginWith(). Furthermore, this | |
| 38 // means that two filters are equal iff they are equal element-wise. | |
| 39 DCHECK(!origin.unique()) << "Invalid origin passed into OriginFilter."; | |
| 40 | |
| 41 // TODO(msramek): All urls with file scheme currently map to the same | |
| 42 // origin. This is currently not a problem, but if it becomes one, | |
| 43 // consider recognizing the URL path. | |
| 44 | |
| 45 origin_list_.insert(origin); | |
| 46 } | |
| 47 | |
| 48 void BrowsingDataRemoverFilter::AddRegisterableDomain( | |
| 49 const std::string& domain) { | |
| 50 DCHECK_EQ(GetDomainAndRegistry("www." + domain, INCLUDE_PRIVATE_REGISTRIES), | |
|
msramek
2016/04/07 16:19:12
Please explain this DCHECK.
dmurph
2016/04/08 23:33:45
Done.
| |
| 51 domain); | |
| 52 domain_list_.insert(domain); | |
| 53 } | |
| 54 | |
| 55 void BrowsingDataRemoverFilter::SetMode(Mode mode) { | |
| 56 mode_ = mode; | |
| 57 } | |
| 58 | |
| 59 bool BrowsingDataRemoverFilter::IsEmptyBlacklist() const { | |
| 60 return mode_ == Mode::BLACKLIST && origin_list_.empty(); | |
| 61 } | |
| 62 | |
| 63 base::Callback<bool(const GURL&)> | |
| 64 BrowsingDataRemoverFilter::BuildSameOriginOrDomainFilter() const { | |
| 65 std::set<url::Origin>* origins = new std::set<url::Origin>(origin_list_); | |
| 66 std::set<std::string>* domains = new std::set<std::string>(domain_list_); | |
| 67 return base::Bind(&BrowsingDataRemoverFilter::MatchesURL, | |
| 68 base::Owned(origins), base::Owned(domains), mode_); | |
| 69 } | |
| 70 | |
| 71 base::Callback<bool(const ContentSettingsPattern& pattern)> | |
| 72 BrowsingDataRemoverFilter::BuildWebsiteSettingsPatternMatchesFilter() const { | |
| 73 std::set<url::Origin>* origins = new std::set<url::Origin>(origin_list_); | |
| 74 std::vector<ContentSettingsPattern>* patterns_from_domains = | |
| 75 new std::vector<ContentSettingsPattern>(domain_list_.size()); | |
| 76 | |
| 77 ContentSettingsPattern::BuilderInterface* builder = | |
| 78 ContentSettingsPattern::CreateBuilder(false); | |
|
msramek
2016/04/07 16:19:12
nit: /* validate */
dmurph
2016/04/08 23:33:45
Done.
| |
| 79 for (const std::string& domain : domain_list_) { | |
| 80 patterns_from_domains->push_back(builder->WithSchemeWildcard() | |
| 81 ->WithPortWildcard() | |
| 82 ->WithDomainWildcard() | |
| 83 ->WithPathWildcard() | |
| 84 ->WithHost(domain) | |
| 85 ->Build()); | |
| 86 } | |
| 87 | |
| 88 return base::Bind(&BrowsingDataRemoverFilter::MatchesWebsiteSettingsPattern, | |
| 89 base::Owned(origins), base::Owned(patterns_from_domains), | |
| 90 mode_); | |
| 91 } | |
| 92 | |
| 93 base::Callback<bool(const net::CanonicalCookie& pattern)> | |
| 94 BrowsingDataRemoverFilter::BuildDomainCookieFilter() const { | |
| 95 std::set<std::string>* domains_and_ips = | |
| 96 new std::set<std::string>(domain_list_); | |
| 97 for (const url::Origin origin : origin_list_) { | |
| 98 GURL origin_url(origin.Serialize()); | |
| 99 if (origin_url.HostIsIPAddress()) { | |
| 100 domains_and_ips->insert(origin_url.host()); | |
| 101 } else { | |
| 102 domains_and_ips->insert( | |
| 103 GetDomainAndRegistry(origin.host(), INCLUDE_PRIVATE_REGISTRIES)); | |
| 104 } | |
| 105 } | |
| 106 return base::Bind( | |
| 107 &BrowsingDataRemoverFilter::MatchesCookieForRegisterableDomainsAndIPs, | |
| 108 base::Owned(domains_and_ips), mode_); | |
| 109 } | |
| 110 | |
| 111 // static | |
| 112 base::Callback<bool(const GURL&)> BrowsingDataRemoverFilter::BuildNoopFilter() { | |
| 113 return base::Bind(&NoopFilter); | |
| 114 } | |
| 115 | |
| 116 // static | |
| 117 bool BrowsingDataRemoverFilter::MatchesURL( | |
| 118 std::set<url::Origin>* origins, | |
| 119 std::set<std::string>* registerable_domains, | |
| 120 Mode mode, | |
| 121 const GURL& url) { | |
| 122 return (((origins->find(url::Origin(url)) != origins->end()) || | |
| 123 (registerable_domains->find( | |
| 124 GetDomainAndRegistry(url, INCLUDE_PRIVATE_REGISTRIES)) != | |
| 125 registerable_domains->end())) == (mode == WHITELIST)); | |
| 126 } | |
| 127 | |
| 128 // static | |
| 129 bool BrowsingDataRemoverFilter::MatchesWebsiteSettingsPattern( | |
| 130 std::set<url::Origin>* origins, | |
| 131 std::vector<ContentSettingsPattern>* domain_patterns, | |
| 132 Mode mode, | |
| 133 const ContentSettingsPattern& pattern) { | |
| 134 for (const url::Origin& origin : *origins) { | |
| 135 if (pattern.Matches(GURL(origin.Serialize()))) | |
| 136 return mode == WHITELIST; | |
| 137 } | |
| 138 for (const ContentSettingsPattern& domain : *domain_patterns) { | |
| 139 Relation relation = pattern.Compare(domain); | |
| 140 if (relation == Relation::IDENTITY || relation == Relation::PREDECESSOR) | |
| 141 return mode == WHITELIST; | |
| 142 } | |
| 143 return mode != WHITELIST; | |
| 144 } | |
| 145 | |
| 146 // static | |
| 147 bool BrowsingDataRemoverFilter::MatchesCookieForRegisterableDomainsAndIPs( | |
| 148 std::set<std::string>* domains_and_ips, | |
| 149 Mode mode, | |
| 150 const net::CanonicalCookie& cookie) { | |
| 151 if (domains_and_ips->empty()) | |
| 152 return mode == BLACKLIST; | |
| 153 std::string cookie_domain = cookie.Domain(); | |
| 154 if (cookie.IsDomainCookie()) | |
| 155 cookie_domain = cookie_domain.substr(1); | |
| 156 std::string parsed_cookie_domain = | |
| 157 GetDomainAndRegistry(cookie_domain, INCLUDE_PRIVATE_REGISTRIES); | |
| 158 // This means we're an IP address. | |
| 159 if (parsed_cookie_domain.empty()) | |
| 160 parsed_cookie_domain = cookie_domain; | |
| 161 return (mode == WHITELIST) == (domains_and_ips->find(parsed_cookie_domain) != | |
| 162 domains_and_ips->end()); | |
| 163 } | |
| OLD | NEW |