#include <stddef.h>
#include <array>
#include <memory>
#include <string>
#include "base/feature_list.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/metrics/histogram_samples.h"
#include "base/path_service.h"
#include "base/run_loop.h"
#include "base/strings/stringprintf.h"
#include "base/task/sequenced_task_runner.h"
#include "base/test/bind.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/simple_test_clock.h"
#include "base/test/test_future.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "chrome/browser/browsing_data/browsing_data_remover_browsertest_base.h"
#include "chrome/browser/browsing_data/chrome_browsing_data_remover_constants.h"
#include "chrome/browser/browsing_data/counters/cache_counter.h"
#include "chrome/browser/browsing_data/counters/site_data_counting_helper.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/external_protocol/external_protocol_handler.h"
#include "chrome/browser/media/clear_key_cdm_test_helper.h"
#include "chrome/browser/prefs/session_startup_pref.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/account_reconcilor_factory.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/sync/sync_service_factory.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/browsing_data/content/browsing_data_model.h"
#include "components/browsing_data/core/features.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/content_settings/core/common/content_settings_utils.h"
#include "components/history/core/common/pref_names.h"
#include "components/metrics/content/subprocess_metrics_provider.h"
#include "components/password_manager/core/browser/features/password_features.h"
#include "components/password_manager/core/browser/features/password_manager_features_util.h"
#include "components/prefs/pref_service.h"
#include "components/signin/core/browser/account_reconcilor.h"
#include "components/signin/public/base/signin_switches.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/signin/public/identity_manager/identity_test_utils.h"
#include "components/sync/base/user_selectable_type.h"
#include "components/sync/service/sync_user_settings.h"
#include "components/sync/test/test_sync_service.h"
#include "content/public/browser/browsing_data_filter_builder.h"
#include "content/public/browser/clear_site_data_utils.h"
#include "content/public/browser/network_service_util.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/browser/storage_usage_info.h"
#include "content/public/common/content_client.h"
#include "content/public/common/content_features.h"
#include "content/public/common/content_paths.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/browsing_data_remover_test_util.h"
#include "google_apis/gaia/google_service_auth_error.h"
#include "media/base/media_switches.h"
#include "media/mojo/mojom/media_types.mojom.h"
#include "media/mojo/services/video_decode_perf_history.h"
#include "media/mojo/services/webrtc_video_perf_history.h"
#include "net/base/features.h"
#include "net/cookies/cookie_partition_key.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "storage/browser/quota/quota_manager.h"
#include "storage/browser/quota/quota_manager_proxy.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/common/features_generated.h"
#include "url/gurl.h"
#include "url/origin.h"
#if BUILDFLAG(ENABLE_LIBRARY_CDMS)
#if BUILDFLAG(IS_MAC)
#include "base/threading/platform_thread.h"
#endif
#include "base/memory/scoped_refptr.h"
#endif
#if BUILDFLAG(IS_CHROMEOS)
#include "chrome/browser/ash/net/system_proxy_manager.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
#include "chromeos/ash/components/dbus/system_proxy/system_proxy_client.h"
#endif
using content::BrowserThread;
using content::BrowsingDataFilterBuilder;
using testing::UnorderedElementsAre;
using testing::UnorderedElementsAreArray;
namespace {
static const char* kExampleHost = "example.com";
static const char* kLocalHost = "localhost";
static const base::Time kStartTime = base::Time::Now();
static const base::Time kLastHourTime = kStartTime - base::Hours(1);
enum TimeEnum {
kDefault,
kStart,
kLastHour,
kMax,
};
base::Time TimeEnumToTime(TimeEnum time) {
switch (time) {
case TimeEnum::kStart:
return kStartTime;
case TimeEnum::kLastHour:
return kLastHourTime;
case TimeEnum::kMax:
return base::Time::Max();
default:
return base::Time();
}
}
std::vector<std::string> GetHistogramSuffixes(
const base::HistogramTester& tester,
const std::string& prefix) {
std::vector<std::string> types;
for (const auto& entry : tester.GetTotalCountsForPrefix(prefix)) {
types.push_back(entry.first.substr(prefix.length()));
}
return types;
}
void AppendRange(std::vector<std::string>& target,
const std::vector<std::string_view>& append) {
target.insert(target.end(), append.begin(), append.end());
}
}
class BrowsingDataRemoverBrowserTest
: public BrowsingDataRemoverBrowserTestBase {
public:
BrowsingDataRemoverBrowserTest() {
std::vector<base::test::FeatureRef> enabled_features = {};
std::vector<base::test::FeatureRef> disabled_features = {};
#if BUILDFLAG(ENABLE_LIBRARY_CDMS)
enabled_features.push_back(media::kExternalClearKeyForTesting);
#endif
#if !BUILDFLAG(IS_ANDROID)
enabled_features.push_back(browsing_data::features::kDbdRevampDesktop);
#endif
InitFeatureLists(std::move(enabled_features), std::move(disabled_features));
}
void SetUpOnMainThread() override {
BrowsingDataRemoverBrowserTestBase::SetUpOnMainThread();
host_resolver()->AddRule(kExampleHost, "127.0.0.1");
SessionStartupPref::SetStartupPref(
GetProfile()->GetPrefs(),
SessionStartupPref(SessionStartupPref::DEFAULT));
}
void RemoveAndWait(uint64_t remove_mask) {
RemoveAndWait(remove_mask, TimeEnum::kDefault, TimeEnum::kMax);
}
void RemoveAndWait(uint64_t remove_mask, TimeEnum delete_begin) {
RemoveAndWait(remove_mask, delete_begin, TimeEnum::kMax);
}
void RemoveAndWait(uint64_t remove_mask,
TimeEnum delete_begin,
TimeEnum delete_end) {
content::BrowsingDataRemover* remover =
GetBrowser()->profile()->GetBrowsingDataRemover();
content::BrowsingDataRemoverCompletionObserver completion_observer(remover);
remover->RemoveAndReply(
TimeEnumToTime(delete_begin), TimeEnumToTime(delete_end), remove_mask,
content::BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB,
&completion_observer);
completion_observer.BlockUntilCompletion();
}
void RemoveWithFilterAndWait(
uint64_t remove_mask,
std::unique_ptr<BrowsingDataFilterBuilder> filter_builder) {
content::BrowsingDataRemover* remover =
GetBrowser()->profile()->GetBrowsingDataRemover();
content::BrowsingDataRemoverCompletionObserver completion_observer(remover);
remover->RemoveWithFilterAndReply(
base::Time(), base::Time::Max(), remove_mask,
content::BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB,
std::move(filter_builder), &completion_observer);
completion_observer.BlockUntilCompletion();
}
void TestSiteData(const std::string& type, TimeEnum delete_begin) {
EXPECT_EQ(0, GetSiteDataCount());
GURL url = embedded_test_server()->GetURL("/browsing_data/site_data.html");
ASSERT_TRUE(ui_test_utils::NavigateToURL(GetBrowser(), url));
EXPECT_EQ(0, GetSiteDataCount());
ExpectTotalModelCount(0);
EXPECT_FALSE(HasDataForType(type));
SetDataForType(type);
EXPECT_EQ(1, GetSiteDataCount());
EXPECT_TRUE(HasDataForType(type));
RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_SITE_DATA,
delete_begin);
EXPECT_EQ(0, GetSiteDataCount());
ExpectTotalModelCount(0);
EXPECT_FALSE(HasDataForType(type));
}
void TestEmptySiteData(const std::string& type, TimeEnum delete_begin) {
EXPECT_EQ(0, GetSiteDataCount());
ExpectTotalModelCount(0);
GURL url = embedded_test_server()->GetURL("/browsing_data/site_data.html");
ASSERT_TRUE(ui_test_utils::NavigateToURL(GetBrowser(), url));
EXPECT_EQ(0, GetSiteDataCount());
ExpectTotalModelCount(0);
EXPECT_FALSE(HasDataForType(type));
EXPECT_EQ(1, GetSiteDataCount());
RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_SITE_DATA,
delete_begin);
EXPECT_EQ(0, GetSiteDataCount());
ExpectTotalModelCount(0);
}
inline void ExpectTotalModelCount(size_t expected) {
std::unique_ptr<BrowsingDataModel> browsing_data_model =
GetBrowsingDataModel(GetProfile());
EXPECT_EQ(expected, browsing_data_model->size());
}
void OnVideoDecodePerfInfo(base::RunLoop* run_loop,
bool* out_is_smooth,
bool* out_is_power_efficient,
bool is_smooth,
bool is_power_efficient) {
*out_is_smooth = is_smooth;
*out_is_power_efficient = is_power_efficient;
run_loop->QuitWhenIdle();
}
network::mojom::NetworkContext* network_context() const {
return GetBrowser()
->profile()
->GetDefaultStoragePartition()
->GetNetworkContext();
}
void ClearSiteDataAndWait(
const url::Origin& origin,
const std::optional<net::CookiePartitionKey>& cookie_partition_key,
const std::optional<blink::StorageKey>& storage_key,
const std::set<std::string>& storage_buckets_to_remove) {
bool partitioned_state_allowed_only =
cookie_partition_key.has_value() &&
!origin.DomainIs(cookie_partition_key->site()
.registrable_domain_or_host_for_testing());
base::RunLoop loop;
content::ClearSiteData(
GetBrowser()->profile()->GetWeakPtr(),
std::nullopt,
origin, content::ClearSiteDataTypeSet::All(),
storage_buckets_to_remove,
true,
cookie_partition_key,
storage_key,
partitioned_state_allowed_only,
loop.QuitClosure());
loop.Run();
}
private:
void OnCacheSizeResult(
base::RunLoop* run_loop,
browsing_data::BrowsingDataCounter::ResultInt* out_size,
std::unique_ptr<browsing_data::BrowsingDataCounter::Result> result) {
if (!result->Finished())
return;
*out_size =
static_cast<browsing_data::BrowsingDataCounter::FinishedResult*>(
result.get())
->Value();
run_loop->Quit();
}
void SetUpCommandLine(base::CommandLine* command_line) override {
#if BUILDFLAG(ENABLE_LIBRARY_CDMS)
RegisterClearKeyCdm(command_line);
#endif
}
};
#if BUILDFLAG(ENABLE_DICE_SUPPORT)
class DiceBrowsingDataRemoverBrowserTest
: public BrowsingDataRemoverBrowserTest {
public:
AccountInfo AddAccountToProfile(const std::string& account_id,
Profile* profile,
bool is_primary) {
auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
if (is_primary) {
DCHECK(
!identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin));
return signin::MakePrimaryAccountAvailable(identity_manager,
account_id + "@gmail.com",
signin::ConsentLevel::kSignin);
}
auto account_info =
signin::MakeAccountAvailable(identity_manager, account_id);
DCHECK(
identity_manager->HasAccountWithRefreshToken(account_info.account_id));
return account_info;
}
};
#endif
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, Download) {
DownloadAnItem();
RemoveAndWait(content::BrowsingDataRemover::DATA_TYPE_DOWNLOADS);
VerifyDownloadCount(0u);
}
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, MediaDeviceIdSalt) {
content::RenderFrameHost* frame_host = GetBrowser()
->tab_strip_model()
->GetActiveWebContents()
->GetPrimaryMainFrame();
url::Origin origin = frame_host->GetLastCommittedOrigin();
net::SiteForCookies site_for_cookies =
net::SiteForCookies::FromOrigin(origin);
blink::StorageKey storage_key = blink::StorageKey::CreateFirstParty(origin);
base::test::TestFuture<bool, const std::string&> future;
content::GetContentClientForTesting()->browser()->GetMediaDeviceIDSalt(
frame_host, site_for_cookies, storage_key, future.GetCallback());
std::string original_salt = future.Get<1>();
RemoveAndWait(content::BrowsingDataRemover::DATA_TYPE_COOKIES);
future.Clear();
content::GetContentClientForTesting()->browser()->GetMediaDeviceIDSalt(
frame_host, site_for_cookies, storage_key, future.GetCallback());
std::string new_salt = future.Get<1>();
EXPECT_NE(original_salt, new_salt);
}
#if BUILDFLAG(ENABLE_DICE_SUPPORT)
IN_PROC_BROWSER_TEST_F(DiceBrowsingDataRemoverBrowserTest, SyncToken) {
Profile* profile = browser()->profile();
ASSERT_TRUE(SetGaiaCookieForProfile(profile));
const char kPrimaryAccountId[] = "primary_account_id";
AccountInfo primary_account =
AddAccountToProfile(kPrimaryAccountId, profile, true);
const char kSecondaryAccountId[] = "secondary_account_id";
AccountInfo secondary_account =
AddAccountToProfile(kSecondaryAccountId, profile, false);
RemoveAndWait(content::BrowsingDataRemover::DATA_TYPE_COOKIES);
signin::IdentityManager* identity_manager =
IdentityManagerFactory::GetForProfile(profile);
EXPECT_TRUE(
identity_manager->HasAccountWithRefreshToken(primary_account.account_id));
EXPECT_FALSE(
identity_manager->HasAccountWithRefreshTokenInPersistentErrorState(
primary_account.account_id));
EXPECT_FALSE(identity_manager->HasAccountWithRefreshToken(
secondary_account.account_id));
}
IN_PROC_BROWSER_TEST_F(DiceBrowsingDataRemoverBrowserTest,
SyncTokenScopedDeletion) {
Profile* profile = browser()->profile();
ASSERT_TRUE(SetGaiaCookieForProfile(profile));
const char kPrimaryAccountId[] = "primary_account_id";
AccountInfo primary_account =
AddAccountToProfile(kPrimaryAccountId, profile, true);
const char kSecondaryAccountId[] = "secondary_account_id";
AccountInfo secondary_account =
AddAccountToProfile(kSecondaryAccountId, profile, false);
RemoveAndWait(content::BrowsingDataRemover::DATA_TYPE_COOKIES);
auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
EXPECT_TRUE(
identity_manager->HasAccountWithRefreshToken(primary_account.account_id));
EXPECT_FALSE(
identity_manager->HasAccountWithRefreshTokenInPersistentErrorState(
primary_account.account_id));
EXPECT_FALSE(identity_manager->HasAccountWithRefreshToken(
secondary_account.account_id));
}
IN_PROC_BROWSER_TEST_F(DiceBrowsingDataRemoverBrowserTest, SyncTokenError) {
Profile* profile = browser()->profile();
ASSERT_TRUE(SetGaiaCookieForProfile(profile));
const char kAccountId[] = "account_id";
AccountInfo primary_account =
AddAccountToProfile(kAccountId, profile, true);
auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
signin::UpdatePersistentErrorOfRefreshTokenForAccount(
identity_manager, primary_account.account_id,
GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
GoogleServiceAuthError::InvalidGaiaCredentialsReason::
CREDENTIALS_REJECTED_BY_SERVER));
RemoveAndWait(content::BrowsingDataRemover::DATA_TYPE_COOKIES);
EXPECT_TRUE(
identity_manager->HasAccountWithRefreshToken(primary_account.account_id));
EXPECT_EQ(
GoogleServiceAuthError::InvalidGaiaCredentialsReason::
CREDENTIALS_REJECTED_BY_SERVER,
identity_manager
->GetErrorStateOfRefreshTokenForAccount(primary_account.account_id)
.GetInvalidGaiaCredentialsReason());
}
IN_PROC_BROWSER_TEST_F(DiceBrowsingDataRemoverBrowserTest, NoSync) {
Profile* profile = browser()->profile();
ASSERT_TRUE(SetGaiaCookieForProfile(profile));
const char kAccountId[] = "account_id";
AccountInfo secondary_account =
AddAccountToProfile(kAccountId, profile, false);
RemoveAndWait(content::BrowsingDataRemover::DATA_TYPE_COOKIES);
auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
EXPECT_FALSE(identity_manager->HasAccountWithRefreshToken(
secondary_account.account_id));
}
#endif
#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, DownloadProhibited) {
PrefService* prefs = GetBrowser()->profile()->GetPrefs();
prefs->SetBoolean(prefs::kAllowDeletingBrowserHistory, false);
DownloadAnItem();
RemoveAndWait(content::BrowsingDataRemover::DATA_TYPE_DOWNLOADS);
VerifyDownloadCount(1u);
}
#endif
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, VideoDecodePerfHistory) {
media::VideoDecodePerfHistory* video_decode_perf_history =
GetBrowser()->profile()->GetVideoDecodePerfHistory();
const media::VideoCodecProfile kProfile = media::VP9PROFILE_PROFILE0;
const gfx::Size kSize(100, 200);
const int kFrameRate = 30;
const int kFramesDecoded = 1000;
const int kFramesDropped = .9 * kFramesDecoded;
const int kFramesPowerEfficient = 0;
const url::Origin kOrigin = url::Origin::Create(GURL("http://example.com"));
const bool kIsTopFrame = true;
const uint64_t kPlayerId = 1234u;
media::mojom::PredictionFeatures prediction_features;
prediction_features.profile = kProfile;
prediction_features.video_size = kSize;
prediction_features.frames_per_sec = kFrameRate;
media::mojom::PredictionTargets prediction_targets;
prediction_targets.frames_decoded = kFramesDecoded;
prediction_targets.frames_dropped = kFramesDropped;
prediction_targets.frames_power_efficient = kFramesPowerEfficient;
{
base::RunLoop run_loop;
video_decode_perf_history->GetSaveCallback().Run(
ukm::kInvalidSourceId, kIsTopFrame, prediction_features,
prediction_targets, kPlayerId, run_loop.QuitWhenIdleClosure());
run_loop.Run();
}
bool is_smooth = true;
bool is_power_efficient = true;
{
base::RunLoop run_loop;
video_decode_perf_history->GetPerfInfo(
media::mojom::PredictionFeatures::New(prediction_features),
base::BindOnce(&BrowsingDataRemoverBrowserTest::OnVideoDecodePerfInfo,
base::Unretained(this), &run_loop, &is_smooth,
&is_power_efficient));
run_loop.Run();
}
EXPECT_FALSE(is_smooth);
EXPECT_FALSE(is_power_efficient);
RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_HISTORY);
{
base::RunLoop run_loop;
video_decode_perf_history->GetPerfInfo(
media::mojom::PredictionFeatures::New(prediction_features),
base::BindOnce(&BrowsingDataRemoverBrowserTest::OnVideoDecodePerfInfo,
base::Unretained(this), &run_loop, &is_smooth,
&is_power_efficient));
run_loop.Run();
}
EXPECT_TRUE(is_smooth);
EXPECT_TRUE(is_power_efficient);
}
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, WebrtcVideoPerfHistory) {
media::WebrtcVideoPerfHistory* webrtc_video_perf_history =
GetBrowser()->profile()->GetWebrtcVideoPerfHistory();
const media::VideoCodecProfile kProfile = media::VP9PROFILE_PROFILE0;
const int kVideoPixels = 1920 * 1080;
const int kFrameRate = 30;
const int kFramesProcessed = 1000;
const int kKeyFramesProcessed = 11;
const float kP99ProcessingTimeMs = 100.0;
media::mojom::WebrtcPredictionFeatures features;
features.is_decode_stats = true;
features.profile = kProfile;
features.video_pixels = kVideoPixels;
features.hardware_accelerated = false;
media::mojom::WebrtcVideoStats video_stats;
video_stats.frames_processed = kFramesProcessed;
video_stats.key_frames_processed = kKeyFramesProcessed;
video_stats.p99_processing_time_ms = kP99ProcessingTimeMs;
{
base::RunLoop run_loop;
webrtc_video_perf_history->GetSaveCallback().Run(features, video_stats,
run_loop.QuitClosure());
run_loop.Run();
}
{
base::RunLoop run_loop;
webrtc_video_perf_history->GetPerfInfo(
media::mojom::WebrtcPredictionFeatures::New(features), kFrameRate,
base::BindLambdaForTesting([&](bool smooth) {
EXPECT_FALSE(smooth);
run_loop.Quit();
}));
run_loop.Run();
}
auto filter_builder = BrowsingDataFilterBuilder::Create(
BrowsingDataFilterBuilder::Mode::kDelete);
filter_builder->AddRegisterableDomain("example.com");
RemoveWithFilterAndWait(chrome_browsing_data_remover::FILTERABLE_DATA_TYPES,
std::move(filter_builder));
{
base::RunLoop run_loop;
webrtc_video_perf_history->GetPerfInfo(
media::mojom::WebrtcPredictionFeatures::New(features), kFrameRate,
base::BindLambdaForTesting([&](bool smooth) {
EXPECT_FALSE(smooth);
run_loop.Quit();
}));
run_loop.Run();
}
RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_HISTORY);
{
base::RunLoop run_loop;
webrtc_video_perf_history->GetPerfInfo(
media::mojom::WebrtcPredictionFeatures::New(features), kFrameRate,
base::BindLambdaForTesting([&](bool smooth) {
EXPECT_TRUE(smooth);
run_loop.Quit();
}));
run_loop.Run();
}
}
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, Cache) {
GURL url1 = embedded_test_server()->GetURL("/cachetime");
GURL url2 = embedded_test_server()->GetURL(kExampleHost, "/cachetime");
ASSERT_FALSE(url::IsSameOriginWith(url1, url2));
EXPECT_EQ(net::OK, content::LoadBasicRequest(network_context(), url1));
EXPECT_EQ(net::OK, content::LoadBasicRequest(network_context(), url2));
ASSERT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete());
EXPECT_EQ(net::OK, content::LoadBasicRequest(network_context(), url1));
EXPECT_EQ(net::OK, content::LoadBasicRequest(network_context(), url2));
std::unique_ptr<BrowsingDataFilterBuilder> filter_builder =
BrowsingDataFilterBuilder::Create(
BrowsingDataFilterBuilder::Mode::kDelete);
filter_builder->AddOrigin(url::Origin::Create(url1));
RemoveWithFilterAndWait(content::BrowsingDataRemover::DATA_TYPE_CACHE,
std::move(filter_builder));
EXPECT_NE(net::OK, content::LoadBasicRequest(network_context(), url1));
EXPECT_EQ(net::OK, content::LoadBasicRequest(network_context(), url2));
filter_builder = BrowsingDataFilterBuilder::Create(
BrowsingDataFilterBuilder::Mode::kDelete);
filter_builder->AddOrigin(url::Origin::Create(url1));
RemoveWithFilterAndWait(content::BrowsingDataRemover::DATA_TYPE_CACHE,
std::move(filter_builder));
EXPECT_NE(net::OK, content::LoadBasicRequest(network_context(), url1));
EXPECT_EQ(net::OK, content::LoadBasicRequest(network_context(), url2));
RemoveAndWait(content::BrowsingDataRemover::DATA_TYPE_CACHE);
EXPECT_NE(net::OK, content::LoadBasicRequest(network_context(), url1));
EXPECT_NE(net::OK, content::LoadBasicRequest(network_context(), url2));
}
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest,
ClearCacheAndNetworkServiceCrashes) {
if (!content::IsOutOfProcessNetworkService())
return;
base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE,
base::BindOnce(&content::BrowserTestBase::SimulateNetworkServiceCrash,
base::Unretained(this)));
RemoveAndWait(content::BrowsingDataRemover::DATA_TYPE_CACHE);
}
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, VerifyNQECacheCleared) {
base::HistogramTester histogram_tester;
RemoveAndWait(content::BrowsingDataRemover::DATA_TYPE_CACHE);
bool histogram_populated = false;
for (size_t attempt = 0; attempt < 3; ++attempt) {
const std::vector<base::Bucket> buckets =
histogram_tester.GetAllSamples("NQE.PrefsSizeOnClearing");
for (const auto& bucket : buckets) {
if (bucket.count > 0) {
histogram_populated = true;
break;
}
}
if (histogram_populated)
break;
content::FetchHistogramsFromChildProcesses();
metrics::SubprocessMetricsProvider::MergeHistogramDeltasForTesting();
base::RunLoop().RunUntilIdle();
}
histogram_tester.ExpectTotalCount("NQE.PrefsSizeOnClearing", 1);
}
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest,
ExternalProtocolHandlerPerOriginPrefs) {
Profile* profile = GetBrowser()->profile();
url::Origin test_origin = url::Origin::Create(GURL("https://example.test/"));
const std::string serialized_test_origin = test_origin.Serialize();
base::Value::Dict allowed_protocols_for_origin;
allowed_protocols_for_origin.Set("tel", true);
base::Value::Dict origin_pref;
origin_pref.Set(serialized_test_origin,
std::move(allowed_protocols_for_origin));
profile->GetPrefs()->SetDict(prefs::kProtocolHandlerPerOriginAllowedProtocols,
std::move(origin_pref));
ExternalProtocolHandler::BlockState block_state =
ExternalProtocolHandler::GetBlockState("tel", &test_origin, profile);
ASSERT_EQ(ExternalProtocolHandler::DONT_BLOCK, block_state);
RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_SITE_DATA);
block_state =
ExternalProtocolHandler::GetBlockState("tel", &test_origin, profile);
ASSERT_EQ(ExternalProtocolHandler::UNKNOWN, block_state);
}
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, HistoryDeletion) {
const std::string kType = "History";
GURL url = embedded_test_server()->GetURL("/browsing_data/site_data.html");
ui_test_utils::NavigateToURLWithDisposition(
GetBrowser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
EXPECT_FALSE(HasDataForType(kType));
SetDataForType(kType);
EXPECT_TRUE(HasDataForType(kType));
RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_HISTORY);
EXPECT_FALSE(HasDataForType(kType));
SetDataForType(kType);
EXPECT_TRUE(HasDataForType(kType));
RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_HISTORY);
EXPECT_FALSE(HasDataForType(kType));
}
class BrowsingDataRemoverStorageBucketsBrowserTest
: public BrowsingDataRemoverBrowserTest {
public:
BrowsingDataRemoverStorageBucketsBrowserTest() {
features_.InitWithFeatures({blink::features::kStorageBuckets,
net::features::kThirdPartyStoragePartitioning},
{});
}
void ClearSiteDataAndWait(
const url::Origin& origin,
const std::optional<blink::StorageKey>& storage_key,
const std::set<std::string>& storage_buckets_to_remove) {
base::RunLoop loop;
content::ClearSiteDataTypeSet clear_site_data_types =
content::ClearSiteDataTypeSet::All();
clear_site_data_types.Remove(content::ClearSiteDataType::kStorage);
content::ClearSiteData(
GetBrowser()->profile()->GetWeakPtr(),
std::nullopt,
origin, clear_site_data_types,
storage_buckets_to_remove,
true,
std::nullopt,
storage_key,
false,
loop.QuitClosure());
loop.Run();
}
private:
base::test::ScopedFeatureList features_;
};
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverStorageBucketsBrowserTest,
ClearSiteDataStorageBuckets) {
GURL url("https://example.com");
url::Origin origin = url::Origin::Create(url);
const auto storage_key = blink::StorageKey::CreateFirstParty(origin);
storage::QuotaManager* quota_manager =
GetBrowser()->profile()->GetDefaultStoragePartition()->GetQuotaManager();
auto* quota_manager_proxy = quota_manager->proxy();
quota_manager_proxy->CreateBucketForTesting(
storage_key, "drafts", base::SequencedTaskRunner::GetCurrentDefault(),
base::BindOnce(
[](storage::QuotaErrorOr<storage::BucketInfo> error_or_bucket_info) {
}));
quota_manager_proxy->CreateBucketForTesting(
storage_key, "inbox", base::SequencedTaskRunner::GetCurrentDefault(),
base::BindOnce(
[](storage::QuotaErrorOr<storage::BucketInfo> error_or_bucket_info) {
}));
quota_manager_proxy->CreateBucketForTesting(
storage_key, "attachments",
base::SequencedTaskRunner::GetCurrentDefault(),
base::BindOnce(
[](storage::QuotaErrorOr<storage::BucketInfo> error_or_bucket_info) {
}));
ClearSiteDataAndWait(origin, storage_key, {"drafts", "attachments"});
quota_manager_proxy->GetBucketsForStorageKey(
storage_key,
false, base::SequencedTaskRunner::GetCurrentDefault(),
base::BindOnce([](storage::QuotaErrorOr<std::set<storage::BucketInfo>>
error_or_buckets) {
EXPECT_EQ(1u, error_or_buckets.value().size());
}));
}
const char kDelegateHistogramPrefix[] =
"History.ClearBrowsingData.Duration.ChromeTask.";
const char kImplHistogramPrefix[] = "History.ClearBrowsingData.Duration.Task.";
const std::vector<std::string_view> kSupportsOriginFilteringImpl{
"AuthCache", "EmbedderData", "HttpCache",
"NetworkErrorLogging", "PrefetchCache", "PreflightCache",
"PrerenderCache", "ReportingCache", "SharedDictionary",
"StoragePartition", "Synchronous", "TrustTokens",
};
const std::vector<std::string_view> kSupportsOriginFilteringDelegate{
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN)
"CdmLicenses",
#endif
"Cookies", "DisableAutoSigninForProfilePasswords",
"DomainReliability", "MediaDeviceSalts",
"Synchronous",
};
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, FullyFilteredDataTypes) {
base::HistogramTester tester;
auto filter_builder = BrowsingDataFilterBuilder::Create(
BrowsingDataFilterBuilder::Mode::kDelete);
filter_builder->AddRegisterableDomain("example.com");
RemoveWithFilterAndWait(chrome_browsing_data_remover::FILTERABLE_DATA_TYPES,
std::move(filter_builder));
EXPECT_THAT(GetHistogramSuffixes(tester, kImplHistogramPrefix),
UnorderedElementsAreArray(kSupportsOriginFilteringImpl));
EXPECT_THAT(GetHistogramSuffixes(tester, kDelegateHistogramPrefix),
UnorderedElementsAreArray(kSupportsOriginFilteringDelegate));
}
const std::vector<std::string_view> kDoesNotSupportOriginFilteringImpl{
"CodeCaches",
"NetworkHistory",
};
const std::vector<std::string_view> kDoesNotSupportOriginFilteringDelegate{
"FaviconCacheExpiration",
#if BUILDFLAG(ENABLE_DOWNGRADE_PROCESSING)
"UserDataSnapshot",
#endif
"WebrtcEventLogs",
#if BUILDFLAG(IS_CHROMEOS)
"TpmAttestationKeys",
#endif
};
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, AllFilterableDataTypes) {
base::HistogramTester tester;
auto filter_builder = BrowsingDataFilterBuilder::Create(
BrowsingDataFilterBuilder::Mode::kPreserve);
filter_builder->AddRegisterableDomain("example.com");
RemoveWithFilterAndWait(chrome_browsing_data_remover::FILTERABLE_DATA_TYPES,
std::move(filter_builder));
std::vector<std::string> all_impl_types;
AppendRange(all_impl_types, kSupportsOriginFilteringImpl);
AppendRange(all_impl_types, kDoesNotSupportOriginFilteringImpl);
EXPECT_THAT(GetHistogramSuffixes(tester, kImplHistogramPrefix),
UnorderedElementsAreArray(all_impl_types));
std::vector<std::string> all_delegate_types;
AppendRange(all_delegate_types, kSupportsOriginFilteringDelegate);
AppendRange(all_delegate_types, kDoesNotSupportOriginFilteringDelegate);
EXPECT_THAT(GetHistogramSuffixes(tester, kDelegateHistogramPrefix),
UnorderedElementsAreArray(all_delegate_types));
}
class BrowsingDataRemoverBrowserTestP
: public BrowsingDataRemoverBrowserTest,
public testing::WithParamInterface<TimeEnum> {};
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP, CookieDeletion) {
TestSiteData("Cookie", GetParam());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP,
CookieIncognitoDeletion) {
UseIncognitoBrowser();
TestSiteData("Cookie", GetParam());
}
#if BUILDFLAG(IS_WIN)
#define MAYBE_BrowserContextDestructionVsCookieRemoval \
DISABLED_BrowserContextDestructionVsCookieRemoval
#else
#define MAYBE_BrowserContextDestructionVsCookieRemoval \
BrowserContextDestructionVsCookieRemoval
#endif
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP,
MAYBE_BrowserContextDestructionVsCookieRemoval) {
UseIncognitoBrowser();
const char kDataType[] = "Cookie";
GURL url = embedded_test_server()->GetURL("/browsing_data/site_data.html");
ASSERT_TRUE(ui_test_utils::NavigateToURL(GetBrowser(), url));
SetDataForType(kDataType);
EXPECT_EQ(1, GetSiteDataCount());
ExpectTotalModelCount(1);
EXPECT_TRUE(HasDataForType(kDataType));
constexpr uint64_t kRemoveMask =
chrome_browsing_data_remover::DATA_TYPE_SITE_DATA |
chrome_browsing_data_remover::DEFERRED_COOKIE_DELETION_DATA_TYPES;
content::BrowserContext* browser_context = GetBrowser()->profile();
content::BrowsingDataRemover* remover =
browser_context->GetBrowsingDataRemover();
content::BrowsingDataRemoverCompletionObserver completion_observer(remover);
remover->RemoveAndReply(
base::Time(),
base::Time::Max(),
kRemoveMask, content::BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB,
&completion_observer);
CloseBrowserSynchronously(GetBrowser());
completion_observer.BlockUntilCompletion();
EXPECT_TRUE(content::StoragePartition::REMOVE_DATA_MASK_COOKIES &
completion_observer.failed_data_types());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP, SessionCookieDeletion) {
TestSiteData("SessionCookie", GetParam());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP, LocalStorageDeletion) {
TestSiteData("LocalStorage", GetParam());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP,
LocalStorageIncognitoDeletion) {
UseIncognitoBrowser();
TestSiteData("LocalStorage", GetParam());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP,
DISABLED_SessionStorageDeletion) {
TestSiteData("SessionStorage", GetParam());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP,
SessionStorageDeletionWebOnly) {
GURL url = embedded_test_server()->GetURL("/browsing_data/site_data.html");
ASSERT_TRUE(ui_test_utils::NavigateToURL(GetBrowser(), url));
const std::string type = "SessionStorage";
EXPECT_FALSE(HasDataForType(type));
SetDataForType(type);
EXPECT_TRUE(HasDataForType(type));
RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_SITE_DATA, GetParam());
EXPECT_FALSE(HasDataForType(type));
}
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, SessionStorageCounting) {
EXPECT_EQ(0, GetSiteDataCount());
ExpectTotalModelCount(0);
GURL url = embedded_test_server()->GetURL("/browsing_data/site_data.html");
ASSERT_TRUE(ui_test_utils::NavigateToURL(GetBrowser(), url));
EXPECT_EQ(0, GetSiteDataCount());
ExpectTotalModelCount(0);
SetDataForType("SessionStorage");
EXPECT_EQ(0, GetSiteDataCount());
ExpectTotalModelCount(0);
EXPECT_TRUE(HasDataForType("SessionStorage"));
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP, ServiceWorkerDeletion) {
TestSiteData("ServiceWorker", GetParam());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP,
ServiceWorkerIncognitoDeletion) {
UseIncognitoBrowser();
TestSiteData("ServiceWorker", GetParam());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP, CacheStorageDeletion) {
TestSiteData("CacheStorage", GetParam());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP,
CacheStorageIncognitoDeletion) {
UseIncognitoBrowser();
TestSiteData("CacheStorage", GetParam());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP, FileSystemDeletion) {
TestSiteData("FileSystem", GetParam());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP,
FileSystemIncognitoDeletion) {
UseIncognitoBrowser();
TestSiteData("FileSystem", GetParam());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP,
EmptyFileSystemDeletion) {
TestEmptySiteData("FileSystem", GetParam());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP,
EmptyFileSystemIncognitoDeletion) {
UseIncognitoBrowser();
TestEmptySiteData("FileSystem", GetParam());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP, IndexedDbDeletion) {
TestSiteData("IndexedDb", GetParam());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP,
IndexedDbIncognitoDeletion) {
UseIncognitoBrowser();
TestSiteData("IndexedDb", GetParam());
}
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP, EmptyIndexedDb) {
TestEmptySiteData("IndexedDb", GetParam());
}
#if BUILDFLAG(ENABLE_LIBRARY_CDMS)
IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP, MediaLicenseDeletion) {
const std::string kMediaLicenseType = "MediaLicense";
const TimeEnum delete_begin = GetParam();
EXPECT_EQ(0, GetSiteDataCount());
GURL url =
embedded_test_server()->GetURL("/browsing_data/media_license.html");
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
EXPECT_EQ(0, GetSiteDataCount());
ExpectTotalModelCount(0);
EXPECT_FALSE(HasDataForType(kMediaLicenseType));
SetDataForType(kMediaLicenseType);
EXPECT_EQ(1, GetSiteDataCount());
ExpectTotalModelCount(1);
EXPECT_TRUE(HasDataForType(kMediaLicenseType));
RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_SITE_DATA, delete_begin,
TimeEnum::kLastHour);
EXPECT_EQ(1, GetSiteDataCount());
ExpectTotalModelCount(1);
EXPECT_TRUE(HasDataForType(kMediaLicenseType));
RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_SITE_DATA, delete_begin,
TimeEnum::kMax);
EXPECT_EQ(0, GetSiteDataCount());
ExpectTotalModelCount(0);
EXPECT_FALSE(HasDataForType(kMediaLicenseType));
}
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest,
PRE_MediaLicenseTimedDeletion) {
const std::string kMediaLicenseType = "MediaLicense";
EXPECT_EQ(0, GetSiteDataCount());
GURL url =
embedded_test_server()->GetURL("/browsing_data/media_license.html");
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
EXPECT_EQ(0, GetSiteDataCount());
ExpectTotalModelCount(0);
EXPECT_FALSE(HasDataForType(kMediaLicenseType));
SetDataForType(kMediaLicenseType);
EXPECT_EQ(1, GetSiteDataCount());
ExpectTotalModelCount(1);
EXPECT_TRUE(HasDataForType(kMediaLicenseType));
}
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest,
MediaLicenseTimedDeletion) {
const std::string kMediaLicenseType = "MediaLicense";
LOG(INFO) << "MediaLicenseTimedDeletion starting @ " << kStartTime;
EXPECT_EQ(1, GetSiteDataCount());
GURL url =
embedded_test_server()->GetURL("/browsing_data/media_license.html");
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
#if BUILDFLAG(IS_MAC)
base::PlatformThread::Sleep(base::Seconds(1));
#endif
EXPECT_FALSE(HasDataForType(kMediaLicenseType));
SetDataForType(kMediaLicenseType);
ExpectTotalModelCount(1);
EXPECT_TRUE(HasDataForType(kMediaLicenseType));
RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_SITE_DATA,
TimeEnum::kStart);
EXPECT_EQ(1, GetSiteDataCount());
ExpectTotalModelCount(1);
EXPECT_FALSE(HasDataForType(kMediaLicenseType));
RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_SITE_DATA);
EXPECT_EQ(0, GetSiteDataCount());
ExpectTotalModelCount(0);
}
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest,
MediaLicenseDeletionWithFilter) {
const std::string kMediaLicenseType = "MediaLicense";
GURL url =
embedded_test_server()->GetURL("/browsing_data/media_license.html");
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
ExpectTotalModelCount(0);
EXPECT_FALSE(HasDataForType(kMediaLicenseType));
SetDataForType(kMediaLicenseType);
ExpectTotalModelCount(1);
EXPECT_TRUE(HasDataForType(kMediaLicenseType));
std::unique_ptr<BrowsingDataFilterBuilder> filter_builder =
BrowsingDataFilterBuilder::Create(
BrowsingDataFilterBuilder::Mode::kDelete);
filter_builder->AddOrigin(
url::Origin::CreateFromNormalizedTuple("https", "test-origin", 443));
RemoveWithFilterAndWait(
content::BrowsingDataRemover::DATA_TYPE_MEDIA_LICENSES,
std::move(filter_builder));
ExpectTotalModelCount(1);
filter_builder = BrowsingDataFilterBuilder::Create(
BrowsingDataFilterBuilder::Mode::kPreserve);
filter_builder->AddOrigin(url::Origin::Create(url));
RemoveWithFilterAndWait(
content::BrowsingDataRemover::DATA_TYPE_MEDIA_LICENSES,
std::move(filter_builder));
ExpectTotalModelCount(1);
filter_builder = BrowsingDataFilterBuilder::Create(
BrowsingDataFilterBuilder::Mode::kDelete);
filter_builder->AddOrigin(url::Origin::Create(url));
RemoveWithFilterAndWait(
content::BrowsingDataRemover::DATA_TYPE_MEDIA_LICENSES,
std::move(filter_builder));
ExpectTotalModelCount(0);
}
#endif
const std::vector<std::string> kStorageTypes{
"Cookie", "LocalStorage", "FileSystem", "SessionStorage",
"IndexedDb", "ServiceWorker", "CacheStorage", "MediaLicense",
};
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest,
PRE_PRE_StorageRemovedFromDisk) {
ASSERT_EQ(0, CheckUserDirectoryForString(kLocalHost, {},
false));
ASSERT_EQ(0, GetSiteDataCount());
ExpectTotalModelCount(0);
net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
https_server.SetSSLConfig(
net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
base::FilePath path;
base::PathService::Get(content::DIR_TEST_DATA, &path);
https_server.ServeFilesFromDirectory(path);
ASSERT_TRUE(https_server.Start());
GURL url = https_server.GetURL(kLocalHost, "/browsing_data/site_data.html");
ASSERT_TRUE(ui_test_utils::NavigateToURL(GetBrowser(), url));
for (const std::string& type : kStorageTypes) {
SetDataForType(type);
EXPECT_TRUE(HasDataForType(type));
}
}
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest,
PRE_StorageRemovedFromDisk) {
EXPECT_EQ(1, GetSiteDataCount());
ExpectTotalModelCount(1);
RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_SITE_DATA |
content::BrowsingDataRemover::DATA_TYPE_CACHE |
chrome_browsing_data_remover::DATA_TYPE_HISTORY |
chrome_browsing_data_remover::DATA_TYPE_CONTENT_SETTINGS);
EXPECT_EQ(0, GetSiteDataCount());
ExpectTotalModelCount(0);
}
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, StorageRemovedFromDisk) {
static const std::vector<std::string> ignore_file_patterns = {
#if BUILDFLAG(IS_CHROMEOS)
"[0-9]{6}",
#endif
};
int found = CheckUserDirectoryForString(kLocalHost, ignore_file_patterns,
false);
EXPECT_EQ(0, found) << "A non-ignored file contains the hostname.";
}
const std::vector<std::string> kSessionOnlyStorageTestTypes{
"Cookie", "LocalStorage", "FileSystem", "SessionStorage",
"IndexedDb", "ServiceWorker", "CacheStorage", "MediaLicense",
};
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest,
PRE_SessionOnlyStorageRemoved) {
ExpectTotalModelCount(0);
GURL url = embedded_test_server()->GetURL("/browsing_data/site_data.html");
ASSERT_TRUE(ui_test_utils::NavigateToURL(GetBrowser(), url));
for (const std::string& type : kSessionOnlyStorageTestTypes) {
SetDataForType(type);
EXPECT_TRUE(HasDataForType(type));
}
ExpectTotalModelCount(1);
HostContentSettingsMapFactory::GetForProfile(GetBrowser()->profile())
->SetDefaultContentSetting(ContentSettingsType::COOKIES,
CONTENT_SETTING_SESSION_ONLY);
}
#if BUILDFLAG(IS_MAC)
#define MAYBE_SessionOnlyStorageRemoved DISABLED_SessionOnlyStorageRemoved
#else
#define MAYBE_SessionOnlyStorageRemoved SessionOnlyStorageRemoved
#endif
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest,
MAYBE_SessionOnlyStorageRemoved) {
ExpectTotalModelCount(0);
GURL url = embedded_test_server()->GetURL("/browsing_data/site_data.html");
ASSERT_TRUE(ui_test_utils::NavigateToURL(GetBrowser(), url));
for (const std::string& type : kSessionOnlyStorageTestTypes) {
EXPECT_FALSE(HasDataForType(type));
}
}
#if BUILDFLAG(IS_CHROMEOS)
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest,
SystemProxyClearsUserCredentials_RemovePasswords) {
ash::SystemProxyManager::Get()->SetSystemProxyEnabledForTest(true);
EXPECT_EQ(0, ash::SystemProxyClient::Get()
->GetTestInterface()
->GetClearUserCredentialsCount());
RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_PASSWORDS);
EXPECT_EQ(1, ash::SystemProxyClient::Get()
->GetTestInterface()
->GetClearUserCredentialsCount());
}
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest,
SystemProxyClearsUserCredentials_RemoveCookies) {
ash::SystemProxyManager::Get()->SetSystemProxyEnabledForTest(true);
EXPECT_EQ(0, ash::SystemProxyClient::Get()
->GetTestInterface()
->GetClearUserCredentialsCount());
RemoveAndWait(content::BrowsingDataRemover::DATA_TYPE_COOKIES);
EXPECT_EQ(1, ash::SystemProxyClient::Get()
->GetTestInterface()
->GetClearUserCredentialsCount());
}
#endif
IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest,
RelatedWebsiteSetsDeletion) {
const GURL kPrimaryUrl("https://subdomain.example.com:112");
const GURL kSecondaryUrl("https://subidubi.testsite.com:55");
HostContentSettingsMap* settings_map =
HostContentSettingsMapFactory::GetForProfile(GetProfile());
base::SimpleTestClock test_clock;
settings_map->SetClockForTesting(&test_clock);
test_clock.SetNow(base::Time::Now());
const ContentSettingPatternSource kExpectedSettingDefault(
ContentSettingsPattern::Wildcard(), ContentSettingsPattern::Wildcard(),
content_settings::ContentSettingToValue(CONTENT_SETTING_ASK),
content_settings::ProviderType::kDefaultProvider,
false);
ASSERT_THAT(
settings_map->GetSettingsForOneType(ContentSettingsType::STORAGE_ACCESS),
UnorderedElementsAre(kExpectedSettingDefault));
ASSERT_THAT(settings_map->GetSettingsForOneType(
ContentSettingsType::TOP_LEVEL_STORAGE_ACCESS),
UnorderedElementsAre(kExpectedSettingDefault));
content_settings::ContentSettingConstraints constraints;
constraints.set_session_model(content_settings::mojom::SessionModel::DURABLE);
constraints.set_decided_by_related_website_sets(true);
settings_map->SetContentSettingDefaultScope(
kPrimaryUrl, kSecondaryUrl, ContentSettingsType::STORAGE_ACCESS,
CONTENT_SETTING_ALLOW, constraints);
settings_map->SetContentSettingDefaultScope(
kPrimaryUrl, kSecondaryUrl, ContentSettingsType::TOP_LEVEL_STORAGE_ACCESS,
CONTENT_SETTING_ALLOW, constraints);
content_settings::RuleMetaData expected_metadata;
expected_metadata.SetFromConstraints(constraints);
expected_metadata.set_last_modified(test_clock.Now());
EXPECT_THAT(
settings_map->GetSettingsForOneType(ContentSettingsType::STORAGE_ACCESS),
UnorderedElementsAre(
kExpectedSettingDefault,
ContentSettingPatternSource(
ContentSettingsPattern::FromURLToSchemefulSitePattern(
GURL(kPrimaryUrl)),
ContentSettingsPattern::FromURLToSchemefulSitePattern(
GURL(kSecondaryUrl)),
content_settings::ContentSettingToValue(CONTENT_SETTING_ALLOW),
content_settings::ProviderType::kPrefProvider,
false, expected_metadata.Clone())));
EXPECT_THAT(
settings_map->GetSettingsForOneType(
ContentSettingsType::TOP_LEVEL_STORAGE_ACCESS),
UnorderedElementsAre(
kExpectedSettingDefault,
ContentSettingPatternSource(
ContentSettingsPattern::FromURLNoWildcard(
GURL(kPrimaryUrl)),
ContentSettingsPattern::FromURLToSchemefulSitePattern(
GURL(kSecondaryUrl)),
content_settings::ContentSettingToValue(CONTENT_SETTING_ALLOW),
content_settings::ProviderType::kPrefProvider,
false, expected_metadata.Clone())));
std::unique_ptr<BrowsingDataFilterBuilder> filter_builder =
BrowsingDataFilterBuilder::Create(
BrowsingDataFilterBuilder::Mode::kDelete);
filter_builder->AddOrigin(url::Origin::Create(kPrimaryUrl));
RemoveWithFilterAndWait(
content::BrowsingDataRemover::DATA_TYPE_RELATED_WEBSITE_SETS_PERMISSIONS,
std::move(filter_builder));
EXPECT_THAT(
settings_map->GetSettingsForOneType(ContentSettingsType::STORAGE_ACCESS),
UnorderedElementsAre(kExpectedSettingDefault));
EXPECT_THAT(settings_map->GetSettingsForOneType(
ContentSettingsType::TOP_LEVEL_STORAGE_ACCESS),
UnorderedElementsAre(kExpectedSettingDefault));
}
INSTANTIATE_TEST_SUITE_P(
All,
BrowsingDataRemoverBrowserTestP,
::testing::Values(TimeEnum::kDefault, TimeEnum::kLastHour),
[](const ::testing::TestParamInfo<
BrowsingDataRemoverBrowserTestP::ParamType>& info) {
switch (info.param) {
case TimeEnum::kDefault:
return "kDefault";
case TimeEnum::kLastHour:
return "kLastHour";
case TimeEnum::kStart:
return "kStart";
case TimeEnum::kMax:
return "kMax";
}
});