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

Unified Diff: chrome/browser/browsing_data/browsing_data_filter_builder.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: Fixed Android 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/browsing_data/browsing_data_filter_builder.cc
diff --git a/chrome/browser/browsing_data/browsing_data_filter_builder.cc b/chrome/browser/browsing_data/browsing_data_filter_builder.cc
new file mode 100644
index 0000000000000000000000000000000000000000..06f78fc4718219bba9b092ee03559d713a057d48
--- /dev/null
+++ b/chrome/browser/browsing_data/browsing_data_filter_builder.cc
@@ -0,0 +1,140 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+#include <vector>
+
+#include "base/bind.h"
+#include "chrome/browser/browsing_data/browsing_data_filter_builder.h"
+#include "components/content_settings/core/common/content_settings_pattern.h"
+#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
+
+using net::registry_controlled_domains::GetDomainAndRegistry;
+using net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES;
+using Relation = ContentSettingsPattern::Relation;
+
+namespace {
+
+bool NoopFilter(const GURL& url) {
+ return true;
+}
+
+} // namespace
+
+BrowsingDataFilterBuilder::BrowsingDataFilterBuilder(Mode mode) : mode_(mode) {}
+
+BrowsingDataFilterBuilder::~BrowsingDataFilterBuilder() {}
+
+void BrowsingDataFilterBuilder::AddRegisterableDomain(
+ const std::string& domain) {
+ // We check that the domain we're given is actually a eTLD+1, or an IP
+ // address.
+ DCHECK(GetDomainAndRegistry("www." + domain, INCLUDE_PRIVATE_REGISTRIES) ==
+ domain ||
+ GURL("http://" + domain).HostIsIPAddress());
+ domain_list_.insert(domain);
+}
+
+void BrowsingDataFilterBuilder::SetMode(Mode mode) {
+ mode_ = mode;
+}
+
+bool BrowsingDataFilterBuilder::IsEmptyBlacklist() const {
+ return mode_ == Mode::BLACKLIST && domain_list_.empty();
+}
+
+base::Callback<bool(const GURL&)>
+BrowsingDataFilterBuilder::BuildSameDomainFilter() const {
+ std::set<std::string>* domains = new std::set<std::string>(domain_list_);
+ return base::Bind(&BrowsingDataFilterBuilder::MatchesURL,
+ base::Owned(domains), mode_);
+}
+
+base::Callback<bool(const ContentSettingsPattern& pattern)>
+BrowsingDataFilterBuilder::BuildWebsiteSettingsPatternMatchesFilter() const {
+ std::vector<ContentSettingsPattern>* patterns_from_domains =
+ new std::vector<ContentSettingsPattern>();
+ patterns_from_domains->reserve(domain_list_.size());
+
+ std::unique_ptr<ContentSettingsPattern::BuilderInterface> builder(
+ ContentSettingsPattern::CreateBuilder(/* use_legacy_validate */ false));
+ for (const std::string& domain : domain_list_) {
+ builder->WithSchemeWildcard()
+ ->WithPortWildcard()
+ ->WithPathWildcard()
+ ->WithHost(domain);
+ if (!GURL("http://" + domain).HostIsIPAddress()) {
+ builder->WithDomainWildcard();
+ }
+ patterns_from_domains->push_back(builder->Build());
+ }
+
+ for (const ContentSettingsPattern& domain : *patterns_from_domains) {
+ DCHECK(domain.IsValid());
+ }
+
+ return base::Bind(&BrowsingDataFilterBuilder::MatchesWebsiteSettingsPattern,
+ base::Owned(patterns_from_domains), mode_);
+}
+
+base::Callback<bool(const net::CanonicalCookie& pattern)>
+BrowsingDataFilterBuilder::BuildDomainCookieFilter() const {
+ std::set<std::string>* domains_and_ips =
+ new std::set<std::string>(domain_list_);
+ return base::Bind(
+ &BrowsingDataFilterBuilder::MatchesCookieForRegisterableDomainsAndIPs,
+ base::Owned(domains_and_ips), mode_);
+}
+
+// static
+base::Callback<bool(const GURL&)> BrowsingDataFilterBuilder::BuildNoopFilter() {
+ return base::Bind(&NoopFilter);
+}
+
+// static
+bool BrowsingDataFilterBuilder::MatchesURL(
+ std::set<std::string>* registerable_domains,
+ Mode mode,
+ const GURL& url) {
+ std::string url_registerable_domain =
+ GetDomainAndRegistry(url, INCLUDE_PRIVATE_REGISTRIES);
+ return (registerable_domains->find(url_registerable_domain) !=
+ registerable_domains->end() ||
+ (url.HostIsIPAddress() && (registerable_domains->find(url.host()) !=
+ registerable_domains->end()))) ==
+ (mode == WHITELIST);
+}
+
+// static
+bool BrowsingDataFilterBuilder::MatchesWebsiteSettingsPattern(
+ std::vector<ContentSettingsPattern>* domain_patterns,
+ Mode mode,
+ const ContentSettingsPattern& pattern) {
+ for (const ContentSettingsPattern& domain : *domain_patterns) {
+ DCHECK(domain.IsValid());
+ Relation relation = pattern.Compare(domain);
+ if (relation == Relation::IDENTITY || relation == Relation::PREDECESSOR)
+ return mode == WHITELIST;
+ }
+ return mode != WHITELIST;
+}
+
+// static
+bool BrowsingDataFilterBuilder::MatchesCookieForRegisterableDomainsAndIPs(
+ std::set<std::string>* domains_and_ips,
+ Mode mode,
+ const net::CanonicalCookie& cookie) {
+ if (domains_and_ips->empty())
+ return mode == BLACKLIST;
+ std::string cookie_domain = cookie.Domain();
+ if (cookie.IsDomainCookie())
+ cookie_domain = cookie_domain.substr(1);
+ std::string parsed_cookie_domain =
+ GetDomainAndRegistry(cookie_domain, INCLUDE_PRIVATE_REGISTRIES);
+ // This means we're an IP address.
+ if (parsed_cookie_domain.empty())
+ parsed_cookie_domain = cookie_domain;
+ return (mode == WHITELIST) == (domains_and_ips->find(parsed_cookie_domain) !=
+ domains_and_ips->end());
+}

Powered by Google App Engine
This is Rietveld 408576698