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

Side by Side Diff: chrome/browser/browsing_data/browsing_data_remover_filter.cc

Issue 1741123002: Add removal filter support for Cookies, Storage, and Content Settings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Renamed class, comments Created 4 years, 8 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 unified diff | Download patch
OLDNEW
(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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698