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

Unified Diff: chrome/browser/chrome_content_browser_client_unittest.cc

Issue 2025683003: First experimental implementation of the Clear-Site-Data header (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix URL in comments, remove accidental change. Created 4 years, 5 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/chrome_content_browser_client_unittest.cc
diff --git a/chrome/browser/chrome_content_browser_client_unittest.cc b/chrome/browser/chrome_content_browser_client_unittest.cc
index 88a062064fe2be72b758d2c6a23358533310d39c..85331d0e8a9a03810a10d19bbc00bab4b5c620aa 100644
--- a/chrome/browser/chrome_content_browser_client_unittest.cc
+++ b/chrome/browser/chrome_content_browser_client_unittest.cc
@@ -8,10 +8,19 @@
#include "base/command_line.h"
#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/message_loop/message_loop.h"
#include "base/metrics/field_trial.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
+#include "chrome/browser/browsing_data/browsing_data_filter_builder.h"
+#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/search_engines/template_url_service_factory.h"
+#include "chrome/test/base/testing_profile.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/search_engines/template_url_service.h"
#include "components/variations/entropy_provider.h"
@@ -22,6 +31,7 @@
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/test_browser_thread_bundle.h"
+#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
@@ -33,6 +43,7 @@
#include "chrome/test/base/search_test_utils.h"
#endif
+using testing::_;
using ChromeContentBrowserClientTest = testing::Test;
TEST_F(ChromeContentBrowserClientTest, ShouldAssignSiteForURL) {
@@ -328,3 +339,254 @@ TEST_F(InstantNTPURLRewriteTest, UberURLHandler_InstantExtendedNewTabPage) {
} // namespace content
#endif // !defined(OS_ANDROID)
+
+namespace {
+
+// Tests for ChromeContentBrowserClient::ClearSiteData().
+class ChromeContentBrowserClientClearSiteDataTest : public testing::Test {
+ public:
+ class MockBrowsingDataRemover : public BrowsingDataRemover {
+ public:
+ explicit MockBrowsingDataRemover(content::BrowserContext* context)
+ : BrowsingDataRemover(context) {}
+ ~MockBrowsingDataRemover() {}
+
+ MOCK_METHOD4(RemoveWithFilter, void(
+ const TimeRange& time_range, int remove_mask, int origin_type_mask,
+ const BrowsingDataFilterBuilder& filter_builder));
+ };
+
+ void SetUp() override {
+ BrowsingDataRemoverFactory::GetInstance()->SetTestingFactoryAndUse(
+ &profile_, &ChromeContentBrowserClientClearSiteDataTest::GetRemover);
+ }
+
+ content::BrowserContext* profile() {
+ return &profile_;
+ }
+
+ MockBrowsingDataRemover* remover() {
+ return static_cast<MockBrowsingDataRemover*>(
+ BrowsingDataRemoverFactory::GetForBrowserContext(&profile_));
+ }
+
+ private:
+ static std::unique_ptr<KeyedService> GetRemover(
+ content::BrowserContext* context) {
+ return base::WrapUnique(new MockBrowsingDataRemover(context));
+ }
+
+ base::MessageLoop loop_;
+ TestingProfile profile_;
+};
+
+// Matcher for BrowsingDataFilterBuilder. As it is not possible to compare
+// two BrowsingDataFilterBuilder-s of different kinds, it can only be used
+// when we know which subclass of BrowsingDataFilterBuilder we expect:
+// OriginFilterBuilder or RegistrableDomainFilterBuilder.
+class SameBuilderMatcher :
+ public testing::MatcherInterface<const BrowsingDataFilterBuilder&> {
+ public:
+ explicit SameBuilderMatcher(const OriginFilterBuilder& builder)
+ : origin_filter_builder_(&builder), domain_filter_builder_(nullptr) {
+ }
+
+ explicit SameBuilderMatcher(const RegistrableDomainFilterBuilder& builder)
+ : origin_filter_builder_(nullptr), domain_filter_builder_(&builder) {
+ }
+
+ virtual bool MatchAndExplain(const BrowsingDataFilterBuilder& builder,
+ testing::MatchResultListener* listener) const {
+ DCHECK(origin_filter_builder_ || domain_filter_builder_);
+ DCHECK(!origin_filter_builder_ || !domain_filter_builder_);
+
+ if (origin_filter_builder_) {
+ return *origin_filter_builder_ ==
+ static_cast<const OriginFilterBuilder&>(builder);
+ }
+
+ if (domain_filter_builder_) {
+ return *domain_filter_builder_ ==
+ static_cast<const RegistrableDomainFilterBuilder&>(builder);
+ }
+
+ NOTREACHED();
+ return false;
+ }
+
+ void DescribeTo(std::ostream* os) const override {
+ *os << "has the same scope, mode, and added entries as the expected "
+ << "filter builder.";
+ }
+
+ void DescribeNegationTo(std::ostream* os) const override {
+ *os << "differs from the expected filter builder in scope, mode, "
+ << "or added entries.";
+ }
+
+ private:
+ const OriginFilterBuilder* origin_filter_builder_;
+ const RegistrableDomainFilterBuilder* domain_filter_builder_;
+};
+
+// Tests that the parameters to ClearBrowsingData() are translated to
+// the correct BrowsingDataRemover::RemoveWithFilter() operation. The fourth
+// parameter, |filter_builder|, is tested in detail in the RegistrableDomains
+// test below.
+TEST_F(ChromeContentBrowserClientClearSiteDataTest, Parameters) {
+ ChromeContentBrowserClient client;
+
+ struct TestCase {
+ bool cookies;
+ bool storage;
+ bool cache;
+ int mask;
+ } test_cases[] = {
+ { false, false, false, 0 },
+ { true, false, false,
+ BrowsingDataRemover::REMOVE_COOKIES |
+ BrowsingDataRemover::REMOVE_CHANNEL_IDS },
+ { false, true, false,
+ BrowsingDataRemover::REMOVE_SITE_DATA &
+ ~BrowsingDataRemover::REMOVE_COOKIES &
+ ~BrowsingDataRemover::REMOVE_CHANNEL_IDS },
+ { false, false, true, BrowsingDataRemover::REMOVE_CACHE },
+ { true, true, false, BrowsingDataRemover::REMOVE_SITE_DATA },
+ { true, false, true,
+ BrowsingDataRemover::REMOVE_COOKIES |
+ BrowsingDataRemover::REMOVE_CHANNEL_IDS |
+ BrowsingDataRemover::REMOVE_CACHE },
+ { false, true, true,
+ BrowsingDataRemover::REMOVE_CACHE |
+ (BrowsingDataRemover::REMOVE_SITE_DATA &
+ ~BrowsingDataRemover::REMOVE_COOKIES &
+ ~BrowsingDataRemover::REMOVE_CHANNEL_IDS) },
+ { true, true, true,
+ BrowsingDataRemover::REMOVE_SITE_DATA |
+ BrowsingDataRemover::REMOVE_CACHE },
+ };
+
+ for (const TestCase& test_case : test_cases) {
+ SCOPED_TRACE(test_case.mask);
+
+ // We always delete data for all time and all origin types.
+ BrowsingDataRemover::TimeRange all_time(base::Time(), base::Time::Max());
+ BrowsingDataHelper::OriginTypeMask all_origin_types =
+ BrowsingDataHelper::ALL;
+
+ // Some data are deleted for the origin and some for the registrable domain.
+ // Depending on the chosen datatypes, this might result into one or two
+ // calls. In the latter case, the removal mask will be split into two
+ // parts - one for the origin deletion and one for the registrable domain.
+ const int domain_scoped_types =
+ BrowsingDataRemover::REMOVE_COOKIES |
+ BrowsingDataRemover::REMOVE_CHANNEL_IDS;
+ int origin_deletion_mask =
+ test_case.mask & ~domain_scoped_types;
+ int registrable_domain_deletion_mask =
+ test_case.mask & domain_scoped_types;
+
+ EXPECT_CALL(
+ *remover(),
+ RemoveWithFilter(
+ all_time,
+ origin_deletion_mask,
+ all_origin_types,
+ _)).Times(origin_deletion_mask != 0);
+
+ EXPECT_CALL(
+ *remover(),
+ RemoveWithFilter(
+ all_time,
+ registrable_domain_deletion_mask,
+ all_origin_types,
+ _)).Times(registrable_domain_deletion_mask != 0);
+
+ client.ClearSiteData(
+ profile(), url::Origin(GURL("https://www.example.com")),
+ test_case.cookies, test_case.storage, test_case.cache);
+
+ testing::Mock::VerifyAndClearExpectations(remover());
+ }
+}
+
+// Tests that ClearBrowsingData() called for an origin deletes cookies in the
+// scope of the registrable domain corresponding to that origin, while cache
+// is deleted for that exact origin.
+TEST_F(ChromeContentBrowserClientClearSiteDataTest, RegistrableDomains) {
+ ChromeContentBrowserClient client;
+
+ struct TestCase {
+ const char* origin; // origin on which ClearSiteData() is called.
+ const char* domain; // domain on which cookies will be deleted.
+ } test_cases[] = {
+ // TLD has no embedded dot.
+ { "https://example.com", "example.com" },
+ { "https://www.example.com", "example.com" },
+ { "https://www.fourth.third.second.com", "second.com" },
+
+ // TLD has one embedded dot.
+ { "https://www.example.co.uk", "example.co.uk" },
+ { "https://example.co.uk", "example.co.uk" },
+
+ // TLD has more embedded dots.
+ { "https://www.website.sp.nom.br", "website.sp.nom.br" },
+
+ // IP addresses.
+ { "http://127.0.0.1", "127.0.0.1" },
+ { "http://192.168.0.1", "192.168.0.1" },
+ { "http://192.168.0.1", "192.168.0.1" },
+
+ // Internal hostnames.
+ { "http://localhost", "localhost" },
+ { "http://fileserver", "fileserver" },
+
+ // These are not subdomains of internal hostnames, but subdomain of
+ // unknown TLDs.
+ { "http://subdomain.localhost", "subdomain.localhost" },
+ { "http://www.subdomain.localhost", "subdomain.localhost" },
+ { "http://documents.fileserver", "documents.fileserver" },
+
+ // Scheme and port don't matter.
+ { "http://example.com", "example.com" },
+ { "http://example.com:8080", "example.com" },
+ { "https://example.com:4433", "example.com" },
+ };
+
+ for (const TestCase& test_case : test_cases) {
+ SCOPED_TRACE(test_case.origin);
+
+ OriginFilterBuilder origin_filter_builder(
+ BrowsingDataFilterBuilder::WHITELIST);
+ origin_filter_builder.AddOrigin(url::Origin(GURL(test_case.origin)));
+
+ EXPECT_CALL(
+ *remover(),
+ RemoveWithFilter(
+ _,
+ BrowsingDataRemover::REMOVE_CACHE,
+ _,
+ MakeMatcher(new SameBuilderMatcher(origin_filter_builder))));
+
+ RegistrableDomainFilterBuilder registrable_domain_filter_builder(
+ BrowsingDataFilterBuilder::WHITELIST);
+ registrable_domain_filter_builder.AddRegisterableDomain(test_case.domain);
+
+ EXPECT_CALL(*remover(),
+ RemoveWithFilter(
+ _,
+ BrowsingDataRemover::REMOVE_COOKIES |
+ BrowsingDataRemover::REMOVE_CHANNEL_IDS,
+ _,
+ MakeMatcher(new SameBuilderMatcher(
+ registrable_domain_filter_builder))));
+
+ client.ClearSiteData(
+ profile(), url::Origin(GURL(test_case.origin)),
+ true /* cookies */, false /* storage */, true /* cache */);
+
+ testing::Mock::VerifyAndClearExpectations(remover());
+ }
+}
+
+} // namespace

Powered by Google App Engine
This is Rietveld 408576698