Chromium Code Reviews| Index: chrome/browser/chrome_content_browser_client.cc |
| diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc |
| index 4f0bf8e06a13e0812c4e0735fdfa0a73d1440560..af6e9b760f9464761546ba0b951bd0ef842eeb71 100644 |
| --- a/chrome/browser/chrome_content_browser_client.cc |
| +++ b/chrome/browser/chrome_content_browser_client.cc |
| @@ -35,6 +35,8 @@ |
| #include "chrome/browser/browsing_data/browsing_data_helper.h" |
| #include "chrome/browser/browsing_data/browsing_data_remover.h" |
| #include "chrome/browser/browsing_data/browsing_data_remover_factory.h" |
| +#include "chrome/browser/browsing_data/origin_filter_builder.h" |
| +#include "chrome/browser/browsing_data/registrable_domain_filter_builder.h" |
| #include "chrome/browser/character_encoding.h" |
| #include "chrome/browser/chrome_content_browser_client_parts.h" |
| #include "chrome/browser/chrome_net_benchmarking_message_filter.h" |
| @@ -168,6 +170,7 @@ |
| #include "device/usb/public/interfaces/device_manager.mojom.h" |
| #include "gin/v8_initializer.h" |
| #include "net/base/mime_util.h" |
| +#include "net/base/registry_controlled_domains/registry_controlled_domain.h" |
| #include "net/cookies/canonical_cookie.h" |
| #include "net/cookies/cookie_options.h" |
| #include "net/ssl/ssl_cert_request_info.h" |
| @@ -740,6 +743,36 @@ bool IsIntentPickerEnabled() { |
| } |
| #endif |
| +// A BrowsingDataRemover::Observer that waits for |count| |
| +// OnBrowsingDataRemoverDone() callbacks, translates them into |
| +// one base::Closure, and then destroys itself. |
| +class ClearSiteDataObserver : public BrowsingDataRemover::Observer { |
| + public: |
| + explicit ClearSiteDataObserver(BrowsingDataRemover* remover, |
| + const base::Closure& callback, |
| + int count) |
| + : remover_(remover), callback_(callback), count_(count) { |
| + remover_->AddObserver(this); |
| + } |
| + |
| + ~ClearSiteDataObserver() override { remover_->RemoveObserver(this); } |
| + |
| + // BrowsingDataRemover::Observer. |
| + void OnBrowsingDataRemoverDone() override { |
| + DCHECK(count_); |
| + if (--count_) |
| + return; |
| + |
| + callback_.Run(); |
| + delete this; |
| + } |
| + |
| + private: |
| + BrowsingDataRemover* remover_; |
| + base::Closure callback_; |
| + int count_; |
| +}; |
| + |
| } // namespace |
| ChromeContentBrowserClient::ChromeContentBrowserClient() |
| @@ -2471,6 +2504,78 @@ void ChromeContentBrowserClient::ClearCookies(RenderFrameHost* rfh) { |
| BrowsingDataHelper::UNPROTECTED_WEB); |
| } |
| +void ChromeContentBrowserClient::ClearSiteData( |
| + content::BrowserContext* browser_context, |
| + const url::Origin& origin, |
| + bool remove_cookies, |
| + bool remove_storage, |
| + bool remove_cache, |
| + const base::Closure& callback) { |
| + BrowsingDataRemover* remover = |
| + BrowsingDataRemoverFactory::GetForBrowserContext(browser_context); |
| + |
| + // ClearSiteDataObserver deletes itself when callbacks from both removal |
| + // tasks are received. |
| + ClearSiteDataObserver* observer = |
| + new ClearSiteDataObserver(remover, callback, 2 /* number of tasks */); |
| + |
| + // Cookies and channel IDs are scoped to |
| + // a) eTLD+1 of |origin|'s host if |origin|'s host is a registrable domain |
| + // or a subdomain thereof |
| + // b) |origin|'s host exactly if it is an IP address or an internal hostname |
| + // (e.g. "localhost" or "fileserver"). |
| + int remove_mask = 0; |
| + if (remove_cookies) { |
| + remove_mask |= BrowsingDataRemover::REMOVE_COOKIES | |
| + BrowsingDataRemover::REMOVE_CHANNEL_IDS; |
| + } |
| + |
| + std::string domain = GetDomainAndRegistry( |
| + origin.host(), |
| + net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); |
| + if (domain.empty()) |
| + domain = origin.host(); // IP address or internal hostname. |
| + |
| + if (remove_mask) { |
|
nasko
2016/08/11 20:07:21
At this point, checking remove_mask is equivalent
msramek
2016/08/12 15:06:27
Done. I was probably mostly trying to make the two
|
| + std::unique_ptr<RegistrableDomainFilterBuilder> domain_filter_builder( |
| + new RegistrableDomainFilterBuilder( |
| + BrowsingDataFilterBuilder::WHITELIST)); |
| + domain_filter_builder->AddRegisterableDomain(domain); |
| + |
| + remover->RemoveWithFilterAndReply( |
| + BrowsingDataRemover::Period(browsing_data::TimePeriod::ALL_TIME), |
| + remove_mask, BrowsingDataHelper::ALL, std::move(domain_filter_builder), |
| + observer); |
| + } else { |
| + // The first removal task is a no-op. |
| + observer->OnBrowsingDataRemoverDone(); |
| + } |
| + |
| + // Delete origin-scoped data. |
| + remove_mask = 0; |
|
nasko
2016/08/11 20:07:21
Since remove_mask is reset here, its usage above (
msramek
2016/08/12 15:06:27
Done.
|
| + if (remove_storage) { |
| + remove_mask |= BrowsingDataRemover::REMOVE_SITE_DATA & |
| + ~BrowsingDataRemover::REMOVE_COOKIES & |
| + ~BrowsingDataRemover::REMOVE_CHANNEL_IDS; |
| + } |
| + if (remove_cache) |
| + remove_mask |= BrowsingDataRemover::REMOVE_CACHE; |
| + |
| + if (remove_mask) { |
| + std::unique_ptr<OriginFilterBuilder> origin_filter_builder( |
| + new OriginFilterBuilder(BrowsingDataFilterBuilder::WHITELIST)); |
| + origin_filter_builder->AddOrigin(origin); |
| + |
| + remover->RemoveWithFilterAndReply( |
| + BrowsingDataRemover::Period(browsing_data::TimePeriod::ALL_TIME), |
| + remove_mask, BrowsingDataHelper::ALL, std::move(origin_filter_builder), |
| + observer); |
| + } else { |
| + // The second removal task is a no-op. |
| + observer->OnBrowsingDataRemoverDone(); |
| + } |
| +} |
| + |
| base::FilePath ChromeContentBrowserClient::GetDefaultDownloadDirectory() { |
| return DownloadPrefs::GetDefaultDownloadDirectory(); |
| } |