Commit 010756d2 authored by msramek's avatar msramek Committed by Commit bot

Implement origin-based deletion for the domain reliability service.

BUG=589586

Review-Url: https://codereview.chromium.org/2132563003
Cr-Commit-Position: refs/heads/master@{#406025}
parent 9f937f5b
...@@ -1001,6 +1001,7 @@ void BrowsingDataRemover::RemoveImpl( ...@@ -1001,6 +1001,7 @@ void BrowsingDataRemover::RemoveImpl(
waiting_for_clear_domain_reliability_monitor_ = true; waiting_for_clear_domain_reliability_monitor_ = true;
service->ClearBrowsingData( service->ClearBrowsingData(
mode, mode,
filter,
base::Bind(&BrowsingDataRemover::OnClearedDomainReliabilityMonitor, base::Bind(&BrowsingDataRemover::OnClearedDomainReliabilityMonitor,
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
} }
......
...@@ -349,7 +349,8 @@ class ProbablySameFilterMatcher ...@@ -349,7 +349,8 @@ class ProbablySameFilterMatcher
{kOrigin1, kOrigin2, kOrigin3, GURL("invalid spec")}; {kOrigin1, kOrigin2, kOrigin3, GURL("invalid spec")};
for (GURL url : urls_to_test_) { for (GURL url : urls_to_test_) {
if (filter.Run(url) != to_match_.Run(url)) { if (filter.Run(url) != to_match_.Run(url)) {
*listener << "The filters differ on the URL " << url; if (listener)
*listener << "The filters differ on the URL " << url;
return false; return false;
} }
} }
...@@ -373,6 +374,12 @@ inline Matcher<const base::Callback<bool(const GURL&)>&> ProbablySameFilter( ...@@ -373,6 +374,12 @@ inline Matcher<const base::Callback<bool(const GURL&)>&> ProbablySameFilter(
return MakeMatcher(new ProbablySameFilterMatcher(filter)); return MakeMatcher(new ProbablySameFilterMatcher(filter));
} }
bool ProbablySameFilters(
const base::Callback<bool(const GURL&)>& filter1,
const base::Callback<bool(const GURL&)>& filter2) {
return ProbablySameFilter(filter1).MatchAndExplain(filter2, nullptr);
}
} // namespace } // namespace
// Testers ------------------------------------------------------------------- // Testers -------------------------------------------------------------------
...@@ -847,10 +854,13 @@ class MockDomainReliabilityService : public DomainReliabilityService { ...@@ -847,10 +854,13 @@ class MockDomainReliabilityService : public DomainReliabilityService {
return std::unique_ptr<DomainReliabilityMonitor>(); return std::unique_ptr<DomainReliabilityMonitor>();
} }
void ClearBrowsingData(DomainReliabilityClearMode clear_mode, void ClearBrowsingData(
const base::Closure& callback) override { DomainReliabilityClearMode clear_mode,
const base::Callback<bool(const GURL&)>& origin_filter,
const base::Closure& callback) override {
clear_count_++; clear_count_++;
last_clear_mode_ = clear_mode; last_clear_mode_ = clear_mode;
last_filter_ = origin_filter;
callback.Run(); callback.Run();
} }
...@@ -865,9 +875,14 @@ class MockDomainReliabilityService : public DomainReliabilityService { ...@@ -865,9 +875,14 @@ class MockDomainReliabilityService : public DomainReliabilityService {
return last_clear_mode_; return last_clear_mode_;
} }
const base::Callback<bool(const GURL&)>& last_filter() const {
return last_filter_;
}
private: private:
unsigned clear_count_ = 0; unsigned clear_count_ = 0;
DomainReliabilityClearMode last_clear_mode_; DomainReliabilityClearMode last_clear_mode_;
base::Callback<bool(const GURL&)> last_filter_;
}; };
struct TestingDomainReliabilityServiceFactoryUserData struct TestingDomainReliabilityServiceFactoryUserData
...@@ -920,6 +935,10 @@ class ClearDomainReliabilityTester { ...@@ -920,6 +935,10 @@ class ClearDomainReliabilityTester {
return mock_service_->last_clear_mode(); return mock_service_->last_clear_mode();
} }
const base::Callback<bool(const GURL&)>& last_filter() const {
return mock_service_->last_filter();
}
private: private:
void AttachService() { void AttachService() {
const void* kKey = TestingDomainReliabilityServiceFactoryUserData::kKey; const void* kKey = TestingDomainReliabilityServiceFactoryUserData::kKey;
...@@ -2274,6 +2293,24 @@ TEST_F(BrowsingDataRemoverTest, DomainReliability_Beacons) { ...@@ -2274,6 +2293,24 @@ TEST_F(BrowsingDataRemoverTest, DomainReliability_Beacons) {
BrowsingDataRemover::REMOVE_HISTORY, false); BrowsingDataRemover::REMOVE_HISTORY, false);
EXPECT_EQ(1u, tester.clear_count()); EXPECT_EQ(1u, tester.clear_count());
EXPECT_EQ(CLEAR_BEACONS, tester.last_clear_mode()); EXPECT_EQ(CLEAR_BEACONS, tester.last_clear_mode());
EXPECT_TRUE(ProbablySameFilters(
BrowsingDataFilterBuilder::BuildNoopFilter(), tester.last_filter()));
}
TEST_F(BrowsingDataRemoverTest, DomainReliability_Beacons_WithFilter) {
const ClearDomainReliabilityTester& tester =
clear_domain_reliability_tester();
RegistrableDomainFilterBuilder builder(
RegistrableDomainFilterBuilder::WHITELIST);
builder.AddRegisterableDomain(kTestRegisterableDomain1);
BlockUntilOriginDataRemoved(browsing_data::EVERYTHING,
BrowsingDataRemover::REMOVE_HISTORY, builder);
EXPECT_EQ(1u, tester.clear_count());
EXPECT_EQ(CLEAR_BEACONS, tester.last_clear_mode());
EXPECT_TRUE(ProbablySameFilters(
builder.BuildGeneralFilter(), tester.last_filter()));
} }
TEST_F(BrowsingDataRemoverTest, DomainReliability_Contexts) { TEST_F(BrowsingDataRemoverTest, DomainReliability_Contexts) {
...@@ -2284,6 +2321,24 @@ TEST_F(BrowsingDataRemoverTest, DomainReliability_Contexts) { ...@@ -2284,6 +2321,24 @@ TEST_F(BrowsingDataRemoverTest, DomainReliability_Contexts) {
BrowsingDataRemover::REMOVE_COOKIES, false); BrowsingDataRemover::REMOVE_COOKIES, false);
EXPECT_EQ(1u, tester.clear_count()); EXPECT_EQ(1u, tester.clear_count());
EXPECT_EQ(CLEAR_CONTEXTS, tester.last_clear_mode()); EXPECT_EQ(CLEAR_CONTEXTS, tester.last_clear_mode());
EXPECT_TRUE(ProbablySameFilters(
BrowsingDataFilterBuilder::BuildNoopFilter(), tester.last_filter()));
}
TEST_F(BrowsingDataRemoverTest, DomainReliability_Contexts_WithFilter) {
const ClearDomainReliabilityTester& tester =
clear_domain_reliability_tester();
RegistrableDomainFilterBuilder builder(
RegistrableDomainFilterBuilder::WHITELIST);
builder.AddRegisterableDomain(kTestRegisterableDomain1);
BlockUntilOriginDataRemoved(browsing_data::EVERYTHING,
BrowsingDataRemover::REMOVE_COOKIES, builder);
EXPECT_EQ(1u, tester.clear_count());
EXPECT_EQ(CLEAR_CONTEXTS, tester.last_clear_mode());
EXPECT_TRUE(ProbablySameFilters(
builder.BuildGeneralFilter(), tester.last_filter()));
} }
TEST_F(BrowsingDataRemoverTest, DomainReliability_ContextsWin) { TEST_F(BrowsingDataRemoverTest, DomainReliability_ContextsWin) {
......
...@@ -14,7 +14,8 @@ DomainReliabilityContextManager::DomainReliabilityContextManager( ...@@ -14,7 +14,8 @@ DomainReliabilityContextManager::DomainReliabilityContextManager(
} }
DomainReliabilityContextManager::~DomainReliabilityContextManager() { DomainReliabilityContextManager::~DomainReliabilityContextManager() {
RemoveAllContexts(); RemoveContexts(
base::Callback<bool(const GURL&)>() /* no filter - delete everything */);
} }
void DomainReliabilityContextManager::RouteBeacon( void DomainReliabilityContextManager::RouteBeacon(
...@@ -69,9 +70,14 @@ void DomainReliabilityContextManager::ClearConfig(const GURL& origin) { ...@@ -69,9 +70,14 @@ void DomainReliabilityContextManager::ClearConfig(const GURL& origin) {
} }
} }
void DomainReliabilityContextManager::ClearBeaconsInAllContexts() { void DomainReliabilityContextManager::ClearBeacons(
for (auto& context_entry : contexts_) const base::Callback<bool(const GURL&)>& origin_filter) {
context_entry.second->ClearBeacons(); for (auto& context_entry : contexts_) {
if (origin_filter.is_null() ||
origin_filter.Run(context_entry.second->config().origin)) {
context_entry.second->ClearBeacons();
}
}
} }
DomainReliabilityContext* DomainReliabilityContextManager::AddContextForConfig( DomainReliabilityContext* DomainReliabilityContextManager::AddContextForConfig(
...@@ -89,10 +95,18 @@ DomainReliabilityContext* DomainReliabilityContextManager::AddContextForConfig( ...@@ -89,10 +95,18 @@ DomainReliabilityContext* DomainReliabilityContextManager::AddContextForConfig(
return *entry; return *entry;
} }
void DomainReliabilityContextManager::RemoveAllContexts() { void DomainReliabilityContextManager::RemoveContexts(
STLDeleteContainerPairSecondPointers( const base::Callback<bool(const GURL&)>& origin_filter) {
contexts_.begin(), contexts_.end()); for (ContextMap::iterator it = contexts_.begin(); it != contexts_.end(); ) {
contexts_.clear(); if (!origin_filter.is_null() &&
!origin_filter.Run(it->second->config().origin)) {
++it;
continue;
}
delete it->second;
it = contexts_.erase(it);
}
} }
std::unique_ptr<base::Value> DomainReliabilityContextManager::GetWebUIData() std::unique_ptr<base::Value> DomainReliabilityContextManager::GetWebUIData()
......
...@@ -37,9 +37,11 @@ class DOMAIN_RELIABILITY_EXPORT DomainReliabilityContextManager { ...@@ -37,9 +37,11 @@ class DOMAIN_RELIABILITY_EXPORT DomainReliabilityContextManager {
base::TimeDelta max_age); base::TimeDelta max_age);
void ClearConfig(const GURL& origin); void ClearConfig(const GURL& origin);
// Calls |ClearBeacons| on all contexts added to this manager, but leaves // Calls |ClearBeacons| on all contexts matched by |origin_filter| added
// the contexts themselves intact. // to this manager, but leaves the contexts themselves intact. A null
void ClearBeaconsInAllContexts(); // |origin_filter| is interpreted as an always-true filter, indicating
// complete deletion.
void ClearBeacons(const base::Callback<bool(const GURL&)>& origin_filter);
// TODO(juliatuttle): Once unit tests test ContextManager directly, they can // TODO(juliatuttle): Once unit tests test ContextManager directly, they can
// use a custom Context::Factory to get the created Context, and this can be // use a custom Context::Factory to get the created Context, and this can be
...@@ -47,9 +49,10 @@ class DOMAIN_RELIABILITY_EXPORT DomainReliabilityContextManager { ...@@ -47,9 +49,10 @@ class DOMAIN_RELIABILITY_EXPORT DomainReliabilityContextManager {
DomainReliabilityContext* AddContextForConfig( DomainReliabilityContext* AddContextForConfig(
std::unique_ptr<const DomainReliabilityConfig> config); std::unique_ptr<const DomainReliabilityConfig> config);
// Removes all contexts from this manager (discarding all queued beacons in // Removes all contexts matched by |origin_filter| from this manager
// the process). // (discarding all queued beacons in the process). A null |origin_filter|
void RemoveAllContexts(); // is interpreted as an always-true filter, indicating complete deletion.
void RemoveContexts(const base::Callback<bool(const GURL&)>& origin_filter);
std::unique_ptr<base::Value> GetWebUIData() const; std::unique_ptr<base::Value> GetWebUIData() const;
......
...@@ -217,15 +217,16 @@ void DomainReliabilityMonitor::OnNetworkChanged( ...@@ -217,15 +217,16 @@ void DomainReliabilityMonitor::OnNetworkChanged(
} }
void DomainReliabilityMonitor::ClearBrowsingData( void DomainReliabilityMonitor::ClearBrowsingData(
DomainReliabilityClearMode mode) { DomainReliabilityClearMode mode,
const base::Callback<bool(const GURL&)>& origin_filter) {
DCHECK(OnNetworkThread()); DCHECK(OnNetworkThread());
switch (mode) { switch (mode) {
case CLEAR_BEACONS: case CLEAR_BEACONS:
context_manager_.ClearBeaconsInAllContexts(); context_manager_.ClearBeacons(origin_filter);
break; break;
case CLEAR_CONTEXTS: case CLEAR_CONTEXTS:
context_manager_.RemoveAllContexts(); context_manager_.RemoveContexts(origin_filter);
break; break;
case MAX_CLEAR_MODE: case MAX_CLEAR_MODE:
NOTREACHED(); NOTREACHED();
......
...@@ -111,10 +111,14 @@ class DOMAIN_RELIABILITY_EXPORT DomainReliabilityMonitor ...@@ -111,10 +111,14 @@ class DOMAIN_RELIABILITY_EXPORT DomainReliabilityMonitor
void OnNetworkChanged( void OnNetworkChanged(
net::NetworkChangeNotifier::ConnectionType type) override; net::NetworkChangeNotifier::ConnectionType type) override;
// Called to remove browsing data. With CLEAR_BEACONS, leaves contexts in // Called to remove browsing data for origins matched by |origin_filter|.
// place but clears beacons (which betray browsing history); with // With CLEAR_BEACONS, leaves contexts in place but clears beacons (which
// CLEAR_CONTEXTS, removes all contexts (which can behave as cookies). // betray browsing history); with CLEAR_CONTEXTS, removes entire contexts
void ClearBrowsingData(DomainReliabilityClearMode mode); // (which can behave as cookies). A null |origin_filter| is interpreted
// as an always-true filter, indicating complete deletion.
void ClearBrowsingData(
DomainReliabilityClearMode mode,
const base::Callback<bool(const GURL&)>& origin_filter);
// Gets a Value containing data that can be formatted into a web page for // Gets a Value containing data that can be formatted into a web page for
// debugging purposes. // debugging purposes.
......
...@@ -295,25 +295,78 @@ TEST_F(DomainReliabilityMonitorTest, ClearBeacons) { ...@@ -295,25 +295,78 @@ TEST_F(DomainReliabilityMonitorTest, ClearBeacons) {
// Make sure it was added. // Make sure it was added.
EXPECT_EQ(1u, CountQueuedBeacons(context)); EXPECT_EQ(1u, CountQueuedBeacons(context));
monitor_.ClearBrowsingData(CLEAR_BEACONS); monitor_.ClearBrowsingData(
CLEAR_BEACONS, base::Callback<bool(const GURL&)>());
// Make sure the beacon was cleared, but not the contexts. // Make sure the beacon was cleared, but not the contexts.
EXPECT_EQ(1u, monitor_.contexts_size_for_testing()); EXPECT_EQ(1u, monitor_.contexts_size_for_testing());
EXPECT_EQ(0u, CountQueuedBeacons(context)); EXPECT_EQ(0u, CountQueuedBeacons(context));
} }
TEST_F(DomainReliabilityMonitorTest, ClearBeaconsWithFilter) {
// Create two contexts, each with one beacon.
GURL origin1("http://example.com/");
GURL origin2("http://example.org/");
DomainReliabilityContext* context1 =
CreateAndAddContextForOrigin(origin1, false);
RequestInfo request = MakeRequestInfo();
request.url = origin1;
request.status =
net::URLRequestStatus::FromError(net::ERR_CONNECTION_RESET);
OnRequestLegComplete(request);
DomainReliabilityContext* context2 =
CreateAndAddContextForOrigin(origin2, false);
request = MakeRequestInfo();
request.url = origin2;
request.status =
net::URLRequestStatus::FromError(net::ERR_CONNECTION_RESET);
OnRequestLegComplete(request);
// Delete the beacons for |origin1|.
monitor_.ClearBrowsingData(
CLEAR_BEACONS,
base::Bind(&GURL::operator==, base::Unretained(&origin1)));
// Beacons for |context1| were cleared. Beacons for |context2| and
// the contexts themselves were not.
EXPECT_EQ(2u, monitor_.contexts_size_for_testing());
EXPECT_EQ(0u, CountQueuedBeacons(context1));
EXPECT_EQ(1u, CountQueuedBeacons(context2));
}
TEST_F(DomainReliabilityMonitorTest, ClearContexts) { TEST_F(DomainReliabilityMonitorTest, ClearContexts) {
CreateAndAddContext(); CreateAndAddContext();
// Initially the monitor should have just the test context. // Initially the monitor should have just the test context.
EXPECT_EQ(1u, monitor_.contexts_size_for_testing()); EXPECT_EQ(1u, monitor_.contexts_size_for_testing());
monitor_.ClearBrowsingData(CLEAR_CONTEXTS); monitor_.ClearBrowsingData(
CLEAR_CONTEXTS, base::Callback<bool(const GURL&)>());
// Clearing contexts should leave the monitor with none. // Clearing contexts should leave the monitor with none.
EXPECT_EQ(0u, monitor_.contexts_size_for_testing()); EXPECT_EQ(0u, monitor_.contexts_size_for_testing());
} }
TEST_F(DomainReliabilityMonitorTest, ClearContextsWithFilter) {
GURL origin1("http://example.com/");
GURL origin2("http://example.org/");
CreateAndAddContextForOrigin(origin1, false);
CreateAndAddContextForOrigin(origin2, false);
EXPECT_EQ(2u, monitor_.contexts_size_for_testing());
// Delete the contexts for |origin1|.
monitor_.ClearBrowsingData(
CLEAR_CONTEXTS,
base::Bind(&GURL::operator==, base::Unretained(&origin1)));
// Only one of the contexts should have been deleted.
EXPECT_EQ(1u, monitor_.contexts_size_for_testing());
}
TEST_F(DomainReliabilityMonitorTest, WildcardMatchesSelf) { TEST_F(DomainReliabilityMonitorTest, WildcardMatchesSelf) {
DomainReliabilityContext* context = DomainReliabilityContext* context =
CreateAndAddContextForOrigin(GURL("https://wildcard/"), true); CreateAndAddContextForOrigin(GURL("https://wildcard/"), true);
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "components/domain_reliability/monitor.h" #include "components/domain_reliability/monitor.h"
#include "net/url_request/url_request_context_getter.h" #include "net/url_request/url_request_context_getter.h"
#include "url/gurl.h"
namespace domain_reliability { namespace domain_reliability {
...@@ -56,15 +57,18 @@ class DomainReliabilityServiceImpl : public DomainReliabilityService { ...@@ -56,15 +57,18 @@ class DomainReliabilityServiceImpl : public DomainReliabilityService {
return monitor; return monitor;
} }
void ClearBrowsingData(DomainReliabilityClearMode clear_mode, void ClearBrowsingData(
const base::Closure& callback) override { DomainReliabilityClearMode clear_mode,
const base::Callback<bool(const GURL&)>& origin_filter,
const base::Closure& callback) override {
DCHECK(network_task_runner_.get()); DCHECK(network_task_runner_.get());
network_task_runner_->PostTaskAndReply( network_task_runner_->PostTaskAndReply(
FROM_HERE, FROM_HERE,
base::Bind(&DomainReliabilityMonitor::ClearBrowsingData, base::Bind(&DomainReliabilityMonitor::ClearBrowsingData,
monitor_, monitor_,
clear_mode), clear_mode,
base::Callback<bool(const GURL&)>(origin_filter)),
callback); callback);
} }
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "components/domain_reliability/domain_reliability_export.h" #include "components/domain_reliability/domain_reliability_export.h"
#include "components/keyed_service/core/keyed_service.h" #include "components/keyed_service/core/keyed_service.h"
class GURL;
class PrefService; class PrefService;
namespace base { namespace base {
...@@ -54,8 +55,10 @@ class DOMAIN_RELIABILITY_EXPORT DomainReliabilityService ...@@ -54,8 +55,10 @@ class DOMAIN_RELIABILITY_EXPORT DomainReliabilityService
// Clears browsing data on the associated Monitor. |Init()| must have been // Clears browsing data on the associated Monitor. |Init()| must have been
// called first. // called first.
virtual void ClearBrowsingData(DomainReliabilityClearMode clear_mode, virtual void ClearBrowsingData(
const base::Closure& callback) = 0; DomainReliabilityClearMode clear_mode,
const base::Callback<bool(const GURL&)>& origin,
const base::Closure& callback) = 0;
virtual void GetWebUIData( virtual void GetWebUIData(
const base::Callback<void(std::unique_ptr<base::Value>)>& callback) const base::Callback<void(std::unique_ptr<base::Value>)>& callback)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment