#include "services/network/cookie_settings.h"
#include <optional>
#include <tuple>
#include <utility>
#include "base/functional/callback_helpers.h"
#include "base/rand_util.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/task_environment.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/content_settings_metadata.h"
#include "components/content_settings/core/common/features.h"
#include "net/base/features.h"
#include "net/base/network_delegate.h"
#include "net/base/schemeful_site.h"
#include "net/cookies/canonical_cookie.h"
#include "net/cookies/canonical_cookie_test_helpers.h"
#include "net/cookies/cookie_constants.h"
#include "net/cookies/cookie_inclusion_status.h"
#include "net/cookies/cookie_setting_override.h"
#include "net/cookies/cookie_util.h"
#include "net/cookies/site_for_cookies.h"
#include "net/cookies/static_cookie_policy.h"
#include "net/first_party_sets/first_party_set_metadata.h"
#include "services/network/public/cpp/features.h"
#include "services/network/tpcd/metadata/manager.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/origin.h"
#include "url/url_util.h"
namespace network {
namespace {
using testing::_;
using testing::AllOf;
using testing::ElementsAre;
using testing::IsEmpty;
using testing::Not;
using testing::UnorderedElementsAre;
constexpr char kAllowedRequestsHistogram[] =
"API.StorageAccess.AllowedRequests4.Subsampled";
constexpr char kAllowedByStorageAccessTypeHistogram[] =
"API.EffectiveStorageAccess.AllowedByStorageAccessType.Subsampled";
constexpr char kDomainURL[] = "http://example.com";
constexpr char kURL[] = "http://foo.com";
constexpr char kSecureSchemedURL[] = "https://foo.com";
constexpr char kOtherURL[] = "http://other.com";
constexpr char kSubDomainURL[] = "http://www.corp.example.com";
constexpr char kDomain[] = "example.com";
constexpr char kDotDomain[] = ".example.com";
constexpr char kSubDomain[] = "www.corp.example.com";
constexpr char kOtherDomain[] = "not-example.com";
constexpr char kDomainWildcardPattern[] = "[*.]example.com";
constexpr char kRwsOwnerURL[] = "https://rws-owner.test";
constexpr char kRwsMemberURL[] = "https://rws-member.test";
constexpr char kUnrelatedURL[] = "http://unrelated.com";
constexpr char kChromeScheme[] = "chrome";
constexpr char kChromeSchemedURL[] = "chrome://new-tab-page/";
constexpr char kUmaCookieName[] = "umaCookieName";
constexpr char kCookieName[] = "name";
std::unique_ptr<net::CanonicalCookie> MakeCanonicalCookie(
const std::string& name,
const std::string& domain,
std::optional<net::CookiePartitionKey> cookie_partition_key =
std::nullopt) {
return net::CanonicalCookie::CreateUnsafeCookieForTesting(
name, "1", domain, "/", base::Time(),
base::Time(), base::Time(),
base::Time(),
true, false, net::CookieSameSite::UNSPECIFIED,
net::CookiePriority::COOKIE_PRIORITY_DEFAULT, cookie_partition_key);
}
std::unique_ptr<net::CanonicalCookie> MakeCanonicalSameSiteNoneCookie(
const std::string& name,
const std::string& domain,
std::optional<net::CookiePartitionKey> cookie_partition_key =
std::nullopt) {
return net::CanonicalCookie::CreateUnsafeCookieForTesting(
name, "1", domain, "/", base::Time(),
base::Time(), base::Time(),
base::Time(),
true, false, net::CookieSameSite::NO_RESTRICTION,
net::CookiePriority::COOKIE_PRIORITY_DEFAULT, cookie_partition_key);
}
enum GrantSource {
kNoneGranted,
kStorageAccessGrantsEligibleViaAPI,
kStorageAccessGrantsEligibleViaHeader,
kTopLevelStorageAccessGrantEligible,
kGrantSourceCount
};
enum BlockSource {
kNoneBlocked,
kTrackingProtectionEnabledFor3pcd,
kForceThirdPartyCookieBlockingFlagEnabled,
kBlockSourceCount
};
enum TestVariables {
kGrantSource,
kBlockSource,
};
class CookieSettingsTestBase : public testing::Test {
public:
CookieSettingsTestBase()
: task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
ContentSettingPatternSource CreateSetting(
const std::string& primary_pattern,
const std::string& secondary_pattern,
ContentSetting setting,
base::Time expiration = base::Time(),
content_settings::ProviderType source =
content_settings::ProviderType::kNone,
bool off_the_record = false) {
content_settings::RuleMetaData metadata;
metadata.SetExpirationAndLifetime(
expiration, expiration.is_null() ? base::TimeDelta()
: expiration - base::Time::Now());
return ContentSettingPatternSource(
ContentSettingsPattern::FromString(primary_pattern),
ContentSettingsPattern::FromString(secondary_pattern),
base::Value(setting), source, off_the_record, std::move(metadata));
}
void FastForwardTime(base::TimeDelta delta) {
task_environment_.FastForwardBy(delta);
}
protected:
base::test::ScopedFeatureList feature_list_;
private:
base::test::TaskEnvironment task_environment_;
base::MetricsSubSampler::ScopedAlwaysSampleForTesting always_sample_;
};
class CookieSettingsTest : public CookieSettingsTestBase {};
class CookieSettingsTestP : public CookieSettingsTestBase,
public testing::WithParamInterface<
std::tuple</*kGrantSource*/ GrantSource,
/*kBlockSource*/ BlockSource>> {
public:
CookieSettingsTestP() {
std::vector<base::test::FeatureRef> enabled_features;
if (IsForceThirdPartyCookieBlockingFlagEnabled()) {
enabled_features.push_back(net::features::kForceThirdPartyCookieBlocking);
enabled_features.push_back(net::features::kThirdPartyStoragePartitioning);
}
feature_list_.InitWithFeatures(enabled_features, {});
}
bool IsForceThirdPartyCookieBlockingFlagEnabled() const {
return std::get<TestVariables::kBlockSource>(GetParam()) ==
BlockSource::kForceThirdPartyCookieBlockingFlagEnabled;
}
bool IsTrackingProtectionEnabledFor3pcd() const {
return std::get<TestVariables::kBlockSource>(GetParam()) ==
BlockSource::kTrackingProtectionEnabledFor3pcd;
}
bool IsTPCDEnabled() const {
return IsForceThirdPartyCookieBlockingFlagEnabled() ||
IsTrackingProtectionEnabledFor3pcd();
}
bool IsStorageAccessGrantEligibleViaAPI() const {
return std::get<TestVariables::kGrantSource>(GetParam()) ==
GrantSource::kStorageAccessGrantsEligibleViaAPI;
}
bool IsStorageAccessGrantEligibleViaHeader() const {
return std::get<TestVariables::kGrantSource>(GetParam()) ==
GrantSource::kStorageAccessGrantsEligibleViaHeader;
}
bool IsTopLevelStorageAccessGrantEligible() const {
return std::get<TestVariables::kGrantSource>(GetParam()) ==
GrantSource::kTopLevelStorageAccessGrantEligible;
}
net::CookieSettingOverrides GetCookieSettingOverrides() const {
net::CookieSettingOverrides overrides;
if (IsStorageAccessGrantEligibleViaAPI()) {
overrides.Put(net::CookieSettingOverride::kStorageAccessGrantEligible);
}
if (IsStorageAccessGrantEligibleViaHeader()) {
overrides.Put(
net::CookieSettingOverride::kStorageAccessGrantEligibleViaHeader);
}
if (IsTopLevelStorageAccessGrantEligible()) {
overrides.Put(
net::CookieSettingOverride::kTopLevelStorageAccessGrantEligible);
}
return overrides;
}
ContentSetting SettingWithSaaOverride(ContentSetting allow) const {
DCHECK(allow == CONTENT_SETTING_ALLOW ||
allow == CONTENT_SETTING_SESSION_ONLY);
return IsStorageAccessGrantEligibleViaAPI() ||
IsStorageAccessGrantEligibleViaHeader()
? allow
: CONTENT_SETTING_BLOCK;
}
ContentSetting SettingWithSaaViaAPI(ContentSetting allow) const {
DCHECK(allow == CONTENT_SETTING_ALLOW ||
allow == CONTENT_SETTING_SESSION_ONLY);
return IsStorageAccessGrantEligibleViaAPI() ? allow : CONTENT_SETTING_BLOCK;
}
ContentSetting SettingWithTopLevelSaaOverride() const {
return IsTopLevelStorageAccessGrantEligible() ? CONTENT_SETTING_ALLOW
: CONTENT_SETTING_BLOCK;
}
net::cookie_util::StorageAccessResult
BlockedStorageAccessResultWithSaaOverride() const {
if (IsStorageAccessGrantEligibleViaAPI() ||
IsStorageAccessGrantEligibleViaHeader()) {
return net::cookie_util::StorageAccessResult::
ACCESS_ALLOWED_STORAGE_ACCESS_GRANT;
}
return net::cookie_util::StorageAccessResult::ACCESS_BLOCKED;
}
net::cookie_util::StorageAccessResult
BlockedStorageAccessResultWithSaaViaAPI() const {
if (IsStorageAccessGrantEligibleViaAPI()) {
return net::cookie_util::StorageAccessResult::
ACCESS_ALLOWED_STORAGE_ACCESS_GRANT;
}
return net::cookie_util::StorageAccessResult::ACCESS_BLOCKED;
}
net::cookie_util::StorageAccessResult
BlockedStorageAccessResultWithTopLevelSaaOverride() const {
if (IsTopLevelStorageAccessGrantEligible()) {
return net::cookie_util::StorageAccessResult::
ACCESS_ALLOWED_TOP_LEVEL_STORAGE_ACCESS_GRANT;
}
return net::cookie_util::StorageAccessResult::ACCESS_BLOCKED;
}
};
TEST_F(CookieSettingsTest, GetCookieSettingDefault) {
CookieSettings settings;
EXPECT_EQ(
settings.GetCookieSetting(GURL(kURL), net::SiteForCookies(), GURL(kURL),
net::CookieSettingOverrides(), nullptr),
CONTENT_SETTING_ALLOW);
}
TEST_F(CookieSettingsTest, GetCookieSetting) {
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kURL, kURL, CONTENT_SETTING_BLOCK)});
EXPECT_EQ(
settings.GetCookieSetting(GURL(kURL), net::SiteForCookies(), GURL(kURL),
net::CookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
}
TEST_F(CookieSettingsTest, GetCookieSettingMultipleProviders) {
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kURL, kURL, CONTENT_SETTING_SESSION_ONLY, base::Time(),
content_settings::ProviderType::kPolicyProvider),
CreateSetting("*", "*", CONTENT_SETTING_BLOCK, base::Time(),
content_settings::ProviderType::kPolicyProvider),
CreateSetting(kOtherURL, kOtherURL, CONTENT_SETTING_ALLOW, base::Time(),
content_settings::ProviderType::kPrefProvider),
CreateSetting("*", "*", CONTENT_SETTING_ALLOW, base::Time(),
content_settings::ProviderType::kDefaultProvider)});
EXPECT_EQ(
settings.GetCookieSetting(GURL(kURL), net::SiteForCookies(), GURL(kURL),
net::CookieSettingOverrides(), nullptr),
CONTENT_SETTING_SESSION_ONLY);
EXPECT_EQ(settings.GetCookieSetting(GURL(kOtherURL), net::SiteForCookies(),
GURL(kOtherURL),
net::CookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
}
TEST_F(CookieSettingsTest, GetCookieSettingOtrProviders) {
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kURL, kURL, CONTENT_SETTING_SESSION_ONLY, base::Time(),
content_settings::ProviderType::kPrefProvider, true),
CreateSetting("*", "*", CONTENT_SETTING_BLOCK, base::Time(),
content_settings::ProviderType::kPrefProvider, true),
CreateSetting(kOtherURL, kOtherURL, CONTENT_SETTING_ALLOW, base::Time(),
content_settings::ProviderType::kPrefProvider, false),
CreateSetting("*", "*", CONTENT_SETTING_ALLOW, base::Time(),
content_settings::ProviderType::kDefaultProvider, false)});
EXPECT_EQ(
settings.GetCookieSetting(GURL(kURL), net::SiteForCookies(), GURL(kURL),
net::CookieSettingOverrides(), nullptr),
CONTENT_SETTING_SESSION_ONLY);
EXPECT_EQ(settings.GetCookieSetting(GURL(kOtherURL), net::SiteForCookies(),
GURL(kOtherURL),
net::CookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
}
TEST_P(CookieSettingsTestP, GetCookieSettingMustMatchBothPatterns) {
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kURL, kOtherURL, CONTENT_SETTING_BLOCK)});
EXPECT_EQ(settings.GetCookieSetting(
GURL(kURL), net::SiteForCookies::FromUrl(GURL(kURL)),
GURL(kURL), GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_ALLOW);
EXPECT_EQ(settings.GetCookieSetting(GURL(kOtherURL), net::SiteForCookies(),
GURL(kURL), GetCookieSettingOverrides(),
nullptr),
IsForceThirdPartyCookieBlockingFlagEnabled()
? CONTENT_SETTING_BLOCK
: CONTENT_SETTING_ALLOW);
EXPECT_EQ(settings.GetCookieSetting(GURL(kURL), net::SiteForCookies(),
GURL(kOtherURL),
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
}
TEST_F(CookieSettingsTest, GetCookieSettingGetsFirstSetting) {
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kURL, kURL, CONTENT_SETTING_BLOCK),
CreateSetting("*", kURL, CONTENT_SETTING_SESSION_ONLY)});
EXPECT_EQ(
settings.GetCookieSetting(GURL(kURL), net::SiteForCookies(), GURL(kURL),
net::CookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
}
TEST_F(CookieSettingsTest, GetCookieSettingDontBlockThirdParty) {
base::HistogramTester histogram_tester;
histogram_tester.ExpectTotalCount(kAllowedRequestsHistogram, 0);
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_ALLOW)});
settings.set_block_third_party_cookies(false);
EXPECT_EQ(settings.GetCookieSetting(GURL(kURL), net::SiteForCookies(),
GURL(kOtherURL),
net::CookieSettingOverrides(), nullptr),
CONTENT_SETTING_ALLOW);
histogram_tester.ExpectUniqueSample(
kAllowedRequestsHistogram,
net::cookie_util::StorageAccessResult::ACCESS_ALLOWED, 1);
}
TEST_F(CookieSettingsTest, GetCookieSettingBlockThirdParty) {
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_ALLOW)});
settings.set_block_third_party_cookies(true);
EXPECT_EQ(settings.GetCookieSetting(GURL(kURL), net::SiteForCookies(),
GURL(kOtherURL),
net::CookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
}
TEST_F(CookieSettingsTest, ForceEnableThirdPartyCookieMitigations) {
const GURL top_level_url(kDomainURL);
const GURL url(kUnrelatedURL);
CookieSettings settings;
const net::CookieSettingOverrides overrides(
{net::CookieSettingOverride::kForceDisableThirdPartyCookies,
net::CookieSettingOverride::kForceEnableThirdPartyCookieMitigations});
{
base::HistogramTester histogram_tester;
ASSERT_EQ(settings.GetCookieSetting(url, net::SiteForCookies(),
top_level_url, overrides, nullptr),
CONTENT_SETTING_BLOCK);
histogram_tester.ExpectUniqueSample(
kAllowedRequestsHistogram,
net::cookie_util::StorageAccessResult::ACCESS_BLOCKED,
1);
}
base::HistogramTester histogram_tester;
network::tpcd::metadata::Manager manager;
manager.SetGrants({CreateSetting(url.GetHost(), top_level_url.GetHost(),
CONTENT_SETTING_ALLOW)});
settings.set_tpcd_metadata_manager(&manager);
EXPECT_EQ(settings.GetCookieSetting(url, net::SiteForCookies(), top_level_url,
overrides, nullptr),
CONTENT_SETTING_ALLOW);
histogram_tester.ExpectUniqueSample(
kAllowedRequestsHistogram,
net::cookie_util::StorageAccessResult::ACCESS_ALLOWED_3PCD_METADATA_GRANT,
1);
}
TEST_F(CookieSettingsTest,
IsCookieAccessible_CookieSettingOverrideBlockSameSiteNoneCookie) {
CookieSettings settings;
const std::unique_ptr<net::CanonicalCookie> cookie =
MakeCanonicalSameSiteNoneCookie("name", kURL);
const url::Origin top_level_origin = url::Origin::Create(GURL(kOtherURL));
settings.set_block_third_party_cookies(false);
auto check_third_party_accessibility =
[&](net::CookieSettingOverrides overrides,
std::optional<net::CookieInclusionStatus::ExclusionReason>
expected_exclusion_reason,
std::optional<net::CookieInclusionStatus::WarningReason>
expected_warning_reason = std::nullopt,
const base::Location& location = FROM_HERE) -> bool {
net::CookieInclusionStatus status;
bool allowed = settings.IsCookieAccessible(
*cookie, GURL(kURL), net::SiteForCookies(), top_level_origin,
net::FirstPartySetMetadata(), overrides, &status);
EXPECT_NE(allowed, expected_exclusion_reason.has_value())
<< location.ToString();
EXPECT_EQ(allowed, status.IsInclude()) << location.ToString();
if (expected_exclusion_reason) {
EXPECT_TRUE(status.HasExclusionReason(expected_exclusion_reason.value()))
<< location.ToString();
}
if (expected_warning_reason) {
EXPECT_TRUE(status.HasWarningReason(expected_warning_reason.value()))
<< location.ToString();
}
return allowed;
};
ASSERT_TRUE(check_third_party_accessibility(
net::CookieSettingOverrides(), std::nullopt,
net::CookieInclusionStatus::WarningReason::WARN_THIRD_PARTY_PHASEOUT));
EXPECT_FALSE(check_third_party_accessibility(
{net::CookieSettingOverride::kForceDisableThirdPartyCookies},
net::CookieInclusionStatus::
ExclusionReason::EXCLUDE_USER_PREFERENCES));
EXPECT_FALSE(check_third_party_accessibility(
{net::CookieSettingOverride::kForceDisableThirdPartyCookies,
net::CookieSettingOverride::kForceEnableThirdPartyCookies},
net::CookieInclusionStatus::
ExclusionReason::EXCLUDE_USER_PREFERENCES));
EXPECT_FALSE(check_third_party_accessibility(
{net::CookieSettingOverride::kForceDisableThirdPartyCookies,
net::CookieSettingOverride::kForceEnableThirdPartyCookieMitigations},
net::CookieInclusionStatus::
ExclusionReason::EXCLUDE_THIRD_PARTY_PHASEOUT));
EXPECT_FALSE(check_third_party_accessibility(
{net::CookieSettingOverride::kForceDisableThirdPartyCookies,
net::CookieSettingOverride::kForceEnableThirdPartyCookieMitigations,
net::CookieSettingOverride::kForceEnableThirdPartyCookies},
net::CookieInclusionStatus::
ExclusionReason::EXCLUDE_THIRD_PARTY_PHASEOUT));
net::CookieSettingOverrides overrides(
{net::CookieSettingOverride::kForceDisableThirdPartyCookies,
net::CookieSettingOverride::kForceEnableThirdPartyCookieMitigations});
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kURL, "*", CONTENT_SETTING_BLOCK)});
EXPECT_FALSE(check_third_party_accessibility(
overrides, net::CookieInclusionStatus::
ExclusionReason::EXCLUDE_USER_PREFERENCES));
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_BLOCK)});
EXPECT_FALSE(check_third_party_accessibility(
overrides, net::CookieInclusionStatus::
ExclusionReason::EXCLUDE_USER_PREFERENCES));
}
TEST_F(CookieSettingsTest, ShouldAlwaysAllowCookies) {
CookieSettings settings;
settings.set_secure_origin_cookies_allowed_schemes({kChromeScheme});
settings.set_block_third_party_cookies(false);
ASSERT_FALSE(settings.ShouldAlwaysAllowCookiesForTesting(
GURL(kURL), GURL(kChromeSchemedURL)));
ASSERT_TRUE(settings.ShouldAlwaysAllowCookiesForTesting(
GURL(kSecureSchemedURL), GURL(kChromeSchemedURL)));
settings.set_block_third_party_cookies(true);
EXPECT_FALSE(settings.ShouldAlwaysAllowCookiesForTesting(
GURL(kURL), GURL(kChromeSchemedURL)));
EXPECT_TRUE(settings.ShouldAlwaysAllowCookiesForTesting(
GURL(kSecureSchemedURL), GURL(kChromeSchemedURL)));
}
TEST_F(CookieSettingsTest, IsCookieAccessible_AlwaysAllowCookieNotAffected) {
url::ScopedSchemeRegistryForTests scoped_registry;
url::AddStandardScheme(kChromeScheme, url::SCHEME_WITH_HOST);
CookieSettings settings;
settings.set_block_third_party_cookies(false);
settings.set_secure_origin_cookies_allowed_schemes({kChromeScheme});
net::CookieInclusionStatus status;
std::unique_ptr<net::CanonicalCookie> cookie =
MakeCanonicalSameSiteNoneCookie("name", kSecureSchemedURL);
EXPECT_TRUE(settings.IsCookieAccessible(
*cookie, GURL(kSecureSchemedURL), net::SiteForCookies(),
url::Origin::Create(GURL(kChromeSchemedURL)),
net::FirstPartySetMetadata(), net::CookieSettingOverrides(), &status));
EXPECT_FALSE(status.HasWarningReason(
net::CookieInclusionStatus::WarningReason::WARN_THIRD_PARTY_PHASEOUT));
}
TEST_F(CookieSettingsTest, ExplicitSettingNoopWhenCookiesAreAllowed) {
GURL top_level_url = GURL(kURL);
GURL url = GURL(kOtherURL);
CookieSettings settings;
net::CookieInclusionStatus status;
settings.set_block_third_party_cookies(false);
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(url.GetHost(), top_level_url.GetHost(),
CONTENT_SETTING_ALLOW)});
std::unique_ptr<net::CanonicalCookie> cookie =
MakeCanonicalSameSiteNoneCookie("name", kOtherURL);
EXPECT_TRUE(settings.IsCookieAccessible(
*cookie, GURL(kOtherURL), net::SiteForCookies(),
url::Origin::Create(GURL(kURL)), net::FirstPartySetMetadata(),
net::CookieSettingOverrides(), &status));
EXPECT_EQ(status.exemption_reason(),
net::CookieInclusionStatus::ExemptionReason::kNone);
EXPECT_TRUE(status.warning_reasons().empty());
}
TEST_P(CookieSettingsTestP,
GetCookieSettingOverridePreservesSessionOnlySetting) {
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_SESSION_ONLY)});
settings.set_content_settings(
ContentSettingsType::STORAGE_ACCESS,
{CreateSetting(kURL, kOtherURL, CONTENT_SETTING_ALLOW)});
settings.set_block_third_party_cookies(true);
EXPECT_EQ(settings.GetCookieSetting(GURL(kURL), net::SiteForCookies(),
GURL(kOtherURL),
GetCookieSettingOverrides(), nullptr),
SettingWithSaaOverride(CONTENT_SETTING_SESSION_ONLY));
}
TEST_F(CookieSettingsTest, GetCookieSettingDontBlockThirdPartyWithException) {
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kURL, kOtherURL, CONTENT_SETTING_ALLOW)});
settings.set_block_third_party_cookies(true);
EXPECT_EQ(settings.GetCookieSetting(GURL(kURL), net::SiteForCookies(),
GURL(kOtherURL),
net::CookieSettingOverrides(), nullptr),
CONTENT_SETTING_ALLOW);
}
TEST_P(CookieSettingsTestP, GetCookieSettingSAAUnblocks) {
GURL top_level_url = GURL(kURL);
GURL url = GURL(kOtherURL);
GURL third_url = GURL(kDomainURL);
base::HistogramTester histogram_tester;
histogram_tester.ExpectTotalCount(kAllowedRequestsHistogram, 0);
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_ALLOW)});
settings.set_block_third_party_cookies(true);
settings.set_content_settings(
ContentSettingsType::STORAGE_ACCESS,
{CreateSetting(url.GetHost(), top_level_url.GetHost(),
CONTENT_SETTING_ALLOW)});
EXPECT_EQ(settings.GetCookieSetting(url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
SettingWithSaaOverride(CONTENT_SETTING_ALLOW));
histogram_tester.ExpectUniqueSample(
kAllowedRequestsHistogram, BlockedStorageAccessResultWithSaaOverride(),
1);
EXPECT_EQ(settings.GetCookieSetting(top_level_url, net::SiteForCookies(), url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
histogram_tester.ExpectBucketCount(
kAllowedRequestsHistogram,
net::cookie_util::StorageAccessResult::
ACCESS_ALLOWED_STORAGE_ACCESS_GRANT,
IsStorageAccessGrantEligibleViaAPI() ||
IsStorageAccessGrantEligibleViaHeader()
? 1
: 0);
histogram_tester.ExpectBucketCount(
kAllowedRequestsHistogram, BlockedStorageAccessResultWithSaaOverride(),
IsStorageAccessGrantEligibleViaAPI() ||
IsStorageAccessGrantEligibleViaHeader()
? 1
: 2);
EXPECT_EQ(settings.GetCookieSetting(url, net::SiteForCookies(), third_url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
EXPECT_EQ(
settings.GetCookieSetting(third_url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
{
settings.set_block_third_party_cookies(true);
base::HistogramTester histogram_tester_2;
EXPECT_EQ(
settings.GetCookieSetting(url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
SettingWithSaaOverride(CONTENT_SETTING_ALLOW));
histogram_tester_2.ExpectUniqueSample(
kAllowedRequestsHistogram, BlockedStorageAccessResultWithSaaOverride(),
1);
}
{
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_BLOCK)});
settings.set_block_third_party_cookies(true);
base::HistogramTester histogram_tester_2;
EXPECT_EQ(
settings.GetCookieSetting(url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
histogram_tester_2.ExpectUniqueSample(
kAllowedRequestsHistogram,
net::cookie_util::StorageAccessResult::ACCESS_BLOCKED, 1);
}
}
TEST_P(CookieSettingsTestP, GetCookieSettingSAAUnblocksViaFedCM) {
GURL top_level_url = GURL(kURL);
GURL url = GURL(kOtherURL);
GURL third_url = GURL(kDomainURL);
base::HistogramTester histogram_tester;
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_ALLOW)});
settings.set_block_third_party_cookies(true);
settings.set_content_settings(
ContentSettingsType::FEDERATED_IDENTITY_SHARING,
{CreateSetting(net::SchemefulSite(url).Serialize(),
net::SchemefulSite(top_level_url).Serialize(),
CONTENT_SETTING_ALLOW)});
EXPECT_EQ(settings.GetCookieSetting(url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
SettingWithSaaViaAPI(CONTENT_SETTING_ALLOW));
histogram_tester.ExpectUniqueSample(
kAllowedRequestsHistogram, BlockedStorageAccessResultWithSaaViaAPI(), 1);
EXPECT_EQ(settings.GetCookieSetting(top_level_url, net::SiteForCookies(), url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
histogram_tester.ExpectBucketCount(
kAllowedRequestsHistogram,
net::cookie_util::StorageAccessResult::
ACCESS_ALLOWED_STORAGE_ACCESS_GRANT,
IsStorageAccessGrantEligibleViaAPI() ? 1 : 0);
histogram_tester.ExpectBucketCount(
kAllowedRequestsHistogram, BlockedStorageAccessResultWithSaaViaAPI(),
IsStorageAccessGrantEligibleViaAPI() ? 1 : 2);
EXPECT_EQ(settings.GetCookieSetting(url, net::SiteForCookies(), third_url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
EXPECT_EQ(
settings.GetCookieSetting(third_url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
{
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_BLOCK)});
settings.set_block_third_party_cookies(true);
base::HistogramTester histogram_tester_2;
EXPECT_EQ(
settings.GetCookieSetting(url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
histogram_tester_2.ExpectUniqueSample(
kAllowedRequestsHistogram,
net::cookie_util::StorageAccessResult::ACCESS_BLOCKED, 1);
}
}
TEST_P(CookieSettingsTestP, GetCookieSettingTopLevelStorageAccessUnblocks) {
const GURL top_level_url(kURL);
const GURL url(kOtherURL);
const GURL third_url(kDomainURL);
base::HistogramTester histogram_tester;
histogram_tester.ExpectTotalCount(kAllowedRequestsHistogram, 0);
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_ALLOW)});
settings.set_block_third_party_cookies(true);
settings.set_content_settings(
ContentSettingsType::TOP_LEVEL_STORAGE_ACCESS,
{CreateSetting(url.GetHost(), top_level_url.GetHost(),
CONTENT_SETTING_ALLOW)});
EXPECT_EQ(settings.GetCookieSetting(url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
SettingWithTopLevelSaaOverride());
histogram_tester.ExpectUniqueSample(
kAllowedRequestsHistogram,
BlockedStorageAccessResultWithTopLevelSaaOverride(), 1);
EXPECT_EQ(settings.GetCookieSetting(top_level_url, net::SiteForCookies(), url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
histogram_tester.ExpectTotalCount(kAllowedRequestsHistogram, 2);
histogram_tester.ExpectBucketCount(
kAllowedRequestsHistogram,
net::cookie_util::StorageAccessResult::
ACCESS_ALLOWED_TOP_LEVEL_STORAGE_ACCESS_GRANT,
IsTopLevelStorageAccessGrantEligible() ? 1 : 0);
histogram_tester.ExpectBucketCount(
kAllowedRequestsHistogram,
BlockedStorageAccessResultWithTopLevelSaaOverride(),
IsTopLevelStorageAccessGrantEligible() ? 1 : 2);
EXPECT_EQ(settings.GetCookieSetting(url, net::SiteForCookies(), third_url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
EXPECT_EQ(
settings.GetCookieSetting(third_url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
{
base::HistogramTester histogram_tester_2;
EXPECT_EQ(
settings.GetCookieSetting(url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
SettingWithTopLevelSaaOverride());
histogram_tester_2.ExpectUniqueSample(
kAllowedRequestsHistogram,
BlockedStorageAccessResultWithTopLevelSaaOverride(), 1);
}
{
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_BLOCK)});
base::HistogramTester histogram_tester_2;
EXPECT_EQ(
settings.GetCookieSetting(url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
histogram_tester_2.ExpectUniqueSample(
kAllowedRequestsHistogram,
net::cookie_util::StorageAccessResult::ACCESS_BLOCKED, 1);
}
}
TEST_P(CookieSettingsTestP, GetCookieSettingSAAResourceWildcards) {
GURL top_level_url = GURL(kURL);
GURL url = GURL(kDomainURL);
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_ALLOW)});
settings.set_block_third_party_cookies(true);
settings.set_content_settings(
ContentSettingsType::STORAGE_ACCESS,
{CreateSetting(kDomain, top_level_url.GetHost(), CONTENT_SETTING_ALLOW)});
EXPECT_EQ(settings.GetCookieSetting(url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
SettingWithSaaOverride(CONTENT_SETTING_ALLOW));
EXPECT_EQ(settings.GetCookieSetting(GURL(kSubDomainURL),
net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
}
TEST_P(CookieSettingsTestP, GetCookieSettingSAATopLevelWildcards) {
GURL top_level_url = GURL(kDomainURL);
GURL url(kURL);
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_ALLOW)});
settings.set_block_third_party_cookies(true);
settings.set_content_settings(
ContentSettingsType::STORAGE_ACCESS,
{CreateSetting(url.GetHost(), kDomain, CONTENT_SETTING_ALLOW)});
EXPECT_EQ(settings.GetCookieSetting(url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
SettingWithSaaOverride(CONTENT_SETTING_ALLOW));
EXPECT_EQ(
settings.GetCookieSetting(url, net::SiteForCookies(), GURL(kSubDomainURL),
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
}
TEST_P(CookieSettingsTestP, GetCookieSettingSAARespectsSettings) {
GURL top_level_url = GURL(kURL);
GURL url = GURL(kOtherURL);
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_BLOCK)});
settings.set_content_settings(
ContentSettingsType::STORAGE_ACCESS,
{CreateSetting(url.GetHost(), top_level_url.GetHost(),
CONTENT_SETTING_ALLOW)});
base::HistogramTester histogram_tester;
EXPECT_EQ(settings.GetCookieSetting(url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
}
TEST_P(CookieSettingsTestP, GetCookieSettingSAAExpiredGrant) {
GURL top_level_url = GURL(kURL);
GURL url = GURL(kOtherURL);
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_ALLOW)});
settings.set_block_third_party_cookies(true);
base::Time expiration_time = base::Time::Now() + base::Seconds(100);
settings.set_content_settings(
ContentSettingsType::STORAGE_ACCESS,
{CreateSetting(url.GetHost(), top_level_url.GetHost(),
CONTENT_SETTING_ALLOW, expiration_time)});
base::HistogramTester histogram_tester;
EXPECT_EQ(settings.GetCookieSetting(url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
SettingWithSaaOverride(CONTENT_SETTING_ALLOW));
FastForwardTime(base::Seconds(101));
EXPECT_EQ(settings.GetCookieSetting(url, net::SiteForCookies(), top_level_url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
}
TEST_F(CookieSettingsTest, CreateDeleteCookieOnExitPredicateNoSettings) {
CookieSettings settings;
EXPECT_FALSE(settings.CreateDeleteCookieOnExitPredicate());
}
TEST_F(CookieSettingsTest, CreateDeleteCookieOnExitPredicateNoSessionOnly) {
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_ALLOW)});
EXPECT_FALSE(settings.CreateDeleteCookieOnExitPredicate());
}
TEST_F(CookieSettingsTest, CreateDeleteCookieOnExitPredicateSessionOnly) {
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_SESSION_ONLY)});
EXPECT_TRUE(settings.CreateDeleteCookieOnExitPredicate().Run(
"foo.com", net::CookieSourceScheme::kNonSecure));
}
TEST_F(CookieSettingsTest, CreateDeleteCookieOnExitPredicateExceptionOnly) {
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("https://foo.com", "*", CONTENT_SETTING_SESSION_ONLY)});
EXPECT_TRUE(settings.CreateDeleteCookieOnExitPredicate().Run(
"foo.com", net::CookieSourceScheme::kSecure));
EXPECT_FALSE(settings.CreateDeleteCookieOnExitPredicate().Run(
"other.com", net::CookieSourceScheme::kSecure));
}
TEST_F(CookieSettingsTest, CreateDeleteCookieOnExitPredicateAllow) {
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kURL, "*", CONTENT_SETTING_ALLOW),
CreateSetting("*", "*", CONTENT_SETTING_SESSION_ONLY)});
EXPECT_FALSE(settings.CreateDeleteCookieOnExitPredicate().Run(
"foo.com", net::CookieSourceScheme::kNonSecure));
}
TEST_F(CookieSettingsTest, GetCookieSettingSecureOriginCookiesAllowed) {
CookieSettings settings;
settings.set_secure_origin_cookies_allowed_schemes({"chrome"});
settings.set_block_third_party_cookies(true);
EXPECT_EQ(settings.GetCookieSetting(
GURL("https://foo.com") , net::SiteForCookies(),
GURL("chrome://foo") ,
net::CookieSettingOverrides()),
CONTENT_SETTING_ALLOW);
EXPECT_EQ(settings.GetCookieSetting(
GURL("chrome://foo") , net::SiteForCookies(),
GURL("https://foo.com") ,
net::CookieSettingOverrides()),
CONTENT_SETTING_BLOCK);
EXPECT_EQ(settings.GetCookieSetting(
GURL("http://foo.com") , net::SiteForCookies(),
GURL("chrome://foo") ,
net::CookieSettingOverrides()),
CONTENT_SETTING_BLOCK);
}
TEST_F(CookieSettingsTest, GetCookieSettingWithThirdPartyCookiesAllowedScheme) {
CookieSettings settings;
settings.set_third_party_cookies_allowed_schemes({"chrome-extension"});
settings.set_block_third_party_cookies(true);
EXPECT_EQ(settings.GetCookieSetting(
GURL("http://foo.com") , net::SiteForCookies(),
GURL("chrome-extension://foo") ,
net::CookieSettingOverrides()),
CONTENT_SETTING_ALLOW);
EXPECT_EQ(settings.GetCookieSetting(
GURL("http://foo.com") , net::SiteForCookies(),
GURL("other-scheme://foo") ,
net::CookieSettingOverrides()),
CONTENT_SETTING_BLOCK);
EXPECT_EQ(settings.GetCookieSetting(
GURL("chrome-extension://foo") , net::SiteForCookies(),
GURL("http://foo.com") ,
net::CookieSettingOverrides()),
CONTENT_SETTING_BLOCK);
}
TEST_F(CookieSettingsTest, GetCookieSettingMatchingSchemeCookiesAllowed) {
CookieSettings settings;
settings.set_matching_scheme_cookies_allowed_schemes({"chrome-extension"});
settings.set_block_third_party_cookies(true);
EXPECT_EQ(settings.GetCookieSetting(
GURL("chrome-extension://bar") , net::SiteForCookies(),
GURL("chrome-extension://foo") ,
net::CookieSettingOverrides()),
CONTENT_SETTING_ALLOW);
EXPECT_EQ(settings.GetCookieSetting(
GURL("http://foo.com") , net::SiteForCookies(),
GURL("chrome-extension://foo") ,
net::CookieSettingOverrides()),
CONTENT_SETTING_BLOCK);
EXPECT_EQ(settings.GetCookieSetting(
GURL("chrome-extension://foo") , net::SiteForCookies(),
GURL("http://foo.com") ,
net::CookieSettingOverrides()),
CONTENT_SETTING_BLOCK);
}
TEST_F(CookieSettingsTest, LegacyCookieAccessDefault) {
CookieSettings settings;
EXPECT_EQ(settings.GetSettingForLegacyCookieAccess(kDomain),
CONTENT_SETTING_BLOCK);
EXPECT_EQ(net::CookieAccessSemantics::NONLEGACY,
settings.GetCookieAccessSemanticsForDomain(kDomain));
}
TEST_F(CookieSettingsTest, CookieAccessSemanticsForDomain) {
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::LEGACY_COOKIE_ACCESS,
{CreateSetting(kDomain, "*", CONTENT_SETTING_ALLOW)});
const struct {
net::CookieAccessSemantics status;
std::string cookie_domain;
} kTestCases[] = {
{net::CookieAccessSemantics::LEGACY, kDomain},
{net::CookieAccessSemantics::LEGACY, kDotDomain},
{net::CookieAccessSemantics::NONLEGACY, kSubDomain},
{net::CookieAccessSemantics::NONLEGACY, kOtherDomain}};
for (const auto& test : kTestCases) {
EXPECT_EQ(test.status,
settings.GetCookieAccessSemanticsForDomain(test.cookie_domain));
}
}
TEST_F(CookieSettingsTest, CookieAccessSemanticsForDomainWithWildcard) {
CookieSettings settings;
settings.set_content_settings(
ContentSettingsType::LEGACY_COOKIE_ACCESS,
{CreateSetting(kDomainWildcardPattern, "*", CONTENT_SETTING_ALLOW)});
const struct {
net::CookieAccessSemantics status;
std::string cookie_domain;
} kTestCases[] = {
{net::CookieAccessSemantics::LEGACY, kDomain},
{net::CookieAccessSemantics::LEGACY, kDotDomain},
{net::CookieAccessSemantics::LEGACY, kSubDomain},
{net::CookieAccessSemantics::NONLEGACY, kOtherDomain}};
for (const auto& test : kTestCases) {
EXPECT_EQ(test.status,
settings.GetCookieAccessSemanticsForDomain(test.cookie_domain));
}
}
struct AllowedByStorageAccessTypeTestData {
content_settings::CookieSettingsBase::AllowedByStorageAccessType
expected_type;
net::CookieSettingOverrides overrides;
std::vector<ContentSettingsType> settings_types;
bool expected_api_result = true;
};
class AllowedByStorageAccessTypeTest
: public CookieSettingsTestBase,
public testing::WithParamInterface<AllowedByStorageAccessTypeTestData> {
public:
AllowedByStorageAccessTypeTest() {
for (const auto& val : GetParam().settings_types) {
settings_.set_content_settings(
val, {CreateSetting(kURL, kOtherURL, CONTENT_SETTING_ALLOW)});
}
}
content_settings::CookieSettingsBase::AllowedByStorageAccessType
ExpectedType() const {
return GetParam().expected_type;
}
bool ExpectedApiResult() const { return GetParam().expected_api_result; }
net::CookieSettingOverrides Overrides() const { return GetParam().overrides; }
std::vector<ContentSettingsType> SettingTypes() const {
return GetParam().settings_types;
}
CookieSettings settings_;
};
INSTANTIATE_TEST_SUITE_P(
,
AllowedByStorageAccessTypeTest,
testing::ValuesIn({
AllowedByStorageAccessTypeTestData{
content_settings::CookieSettingsBase::AllowedByStorageAccessType::
kNone,
{},
{},
false,
},
AllowedByStorageAccessTypeTestData{
content_settings::CookieSettingsBase::AllowedByStorageAccessType::
kNone,
{net::CookieSettingOverride::kTopLevelStorageAccessGrantEligible},
{},
false,
},
AllowedByStorageAccessTypeTestData{
content_settings::CookieSettingsBase::AllowedByStorageAccessType::
kNone,
{},
{ContentSettingsType::TOP_LEVEL_STORAGE_ACCESS},
false,
},
AllowedByStorageAccessTypeTestData{
content_settings::CookieSettingsBase::AllowedByStorageAccessType::
kTopLevelOnly,
{net::CookieSettingOverride::kTopLevelStorageAccessGrantEligible},
{ContentSettingsType::TOP_LEVEL_STORAGE_ACCESS},
},
AllowedByStorageAccessTypeTestData{
content_settings::CookieSettingsBase::AllowedByStorageAccessType::
kStorageAccessOnly,
{net::CookieSettingOverride::kStorageAccessGrantEligible},
{ContentSettingsType::STORAGE_ACCESS},
},
AllowedByStorageAccessTypeTestData{
content_settings::CookieSettingsBase::AllowedByStorageAccessType::
kTopLevelAndStorageAccess,
{net::CookieSettingOverride::kTopLevelStorageAccessGrantEligible,
net::CookieSettingOverride::kStorageAccessGrantEligible},
{ContentSettingsType::TOP_LEVEL_STORAGE_ACCESS,
ContentSettingsType::STORAGE_ACCESS},
},
}));
TEST_P(AllowedByStorageAccessTypeTest, IsCookieAccessible) {
base::HistogramTester histogram_tester;
net::CookieInclusionStatus status;
settings_.set_block_third_party_cookies(true);
std::unique_ptr<net::CanonicalCookie> cookie =
MakeCanonicalCookie(kUmaCookieName, kURL);
ASSERT_EQ(settings_.IsCookieAccessible(
*cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)),
net::FirstPartySetMetadata(), Overrides(), &status),
ExpectedApiResult());
histogram_tester.ExpectUniqueSample(kAllowedByStorageAccessTypeHistogram,
ExpectedType(), 1);
}
TEST_P(AllowedByStorageAccessTypeTest, AnnotateAndMoveUserBlockedCookies) {
base::HistogramTester histogram_tester;
settings_.set_block_third_party_cookies(true);
net::CookieAccessResultList maybe_included_cookies = {
{*MakeCanonicalCookie(kUmaCookieName, kURL), {}}};
net::CookieAccessResultList excluded_cookies = {};
ASSERT_EQ(
settings_.AnnotateAndMoveUserBlockedCookies(
GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
Overrides(), maybe_included_cookies, excluded_cookies),
ExpectedApiResult());
histogram_tester.ExpectUniqueSample(kAllowedByStorageAccessTypeHistogram,
ExpectedType(), 1);
}
TEST_P(CookieSettingsTestP, IsPrivacyModeEnabled) {
CookieSettings settings;
settings.set_block_third_party_cookies(true);
const net::NetworkDelegate::PrivacySetting
third_party_partitioned_or_all_allowed =
net::NetworkDelegate::PrivacySetting::kPartitionedStateAllowedOnly;
EXPECT_EQ(third_party_partitioned_or_all_allowed,
settings.IsPrivacyModeEnabled(GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)),
GetCookieSettingOverrides()));
const net::NetworkDelegate::PrivacySetting
first_party_partitioned_or_all_allowed =
IsStorageAccessGrantEligibleViaAPI() ||
IsStorageAccessGrantEligibleViaHeader()
? net::NetworkDelegate::PrivacySetting::kStateAllowed
: net::NetworkDelegate::PrivacySetting::
kPartitionedStateAllowedOnly;
EXPECT_EQ(first_party_partitioned_or_all_allowed,
settings.IsPrivacyModeEnabled(GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kURL)),
GetCookieSettingOverrides()));
EXPECT_EQ(net::NetworkDelegate::PrivacySetting::kStateAllowed,
settings.IsPrivacyModeEnabled(
GURL(kURL), net::SiteForCookies::FromUrl(GURL(kURL)),
url::Origin::Create(GURL(kURL)), GetCookieSettingOverrides()));
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kOtherURL, kUnrelatedURL, CONTENT_SETTING_BLOCK)});
EXPECT_EQ(third_party_partitioned_or_all_allowed,
settings.IsPrivacyModeEnabled(GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)),
GetCookieSettingOverrides()));
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kURL, "*", CONTENT_SETTING_BLOCK)});
EXPECT_EQ(net::NetworkDelegate::PrivacySetting::kStateDisallowed,
settings.IsPrivacyModeEnabled(GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)),
GetCookieSettingOverrides()));
EXPECT_EQ(net::NetworkDelegate::PrivacySetting::kStateDisallowed,
settings.IsPrivacyModeEnabled(GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kURL)),
GetCookieSettingOverrides()));
EXPECT_EQ(net::NetworkDelegate::PrivacySetting::kStateDisallowed,
settings.IsPrivacyModeEnabled(
GURL(kURL), net::SiteForCookies::FromUrl(GURL(kURL)),
url::Origin::Create(GURL(kURL)), GetCookieSettingOverrides()));
}
TEST_P(CookieSettingsTestP, IsCookieAccessible_SameSiteNoneCookie) {
CookieSettings settings;
settings.set_block_third_party_cookies(true);
if (IsTrackingProtectionEnabledFor3pcd()) {
settings.set_tracking_protection_enabled_for_3pcd(true);
}
std::unique_ptr<net::CanonicalCookie> cookie =
MakeCanonicalSameSiteNoneCookie("name", kURL);
net::CookieInclusionStatus status;
EXPECT_FALSE(settings.IsCookieAccessible(
*cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status));
EXPECT_FALSE(status.HasWarningReason(
net::CookieInclusionStatus::WarningReason::WARN_THIRD_PARTY_PHASEOUT));
EXPECT_TRUE(status.HasExclusionReason(
IsTPCDEnabled() ? net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_THIRD_PARTY_PHASEOUT
: net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES));
status.ResetForTesting();
EXPECT_EQ(settings.IsCookieAccessible(
*cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status),
IsStorageAccessGrantEligibleViaAPI() ||
IsStorageAccessGrantEligibleViaHeader());
EXPECT_THAT(
status.HasExclusionReason(
IsTPCDEnabled() ? net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_THIRD_PARTY_PHASEOUT
: net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES),
Not(IsStorageAccessGrantEligibleViaAPI() ||
IsStorageAccessGrantEligibleViaHeader()));
EXPECT_THAT(status.exemption_reason() ==
net::CookieInclusionStatus::ExemptionReason::kStorageAccess,
IsStorageAccessGrantEligibleViaAPI() ||
IsStorageAccessGrantEligibleViaHeader());
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kURL, "*", CONTENT_SETTING_BLOCK)});
status.ResetForTesting();
EXPECT_FALSE(settings.IsCookieAccessible(
*cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status));
EXPECT_TRUE(status.HasExclusionReason(
net::CookieInclusionStatus::ExclusionReason::EXCLUDE_USER_PREFERENCES));
status.ResetForTesting();
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_BLOCK)});
EXPECT_FALSE(settings.IsCookieAccessible(
*cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status));
EXPECT_TRUE(status.HasOnlyExclusionReason(
net::CookieInclusionStatus::ExclusionReason::EXCLUDE_USER_PREFERENCES));
}
TEST_P(CookieSettingsTestP, IsCookieAccessible_SameSiteLaxCookie) {
CookieSettings settings;
settings.set_block_third_party_cookies(true);
if (IsTrackingProtectionEnabledFor3pcd()) {
settings.set_tracking_protection_enabled_for_3pcd(true);
}
std::unique_ptr<net::CanonicalCookie> cookie =
MakeCanonicalCookie("name", kURL);
net::CookieInclusionStatus status;
EXPECT_FALSE(settings.IsCookieAccessible(
*cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status));
if (IsTPCDEnabled()) {
EXPECT_FALSE(status.HasWarningReason(
net::CookieInclusionStatus::WarningReason::WARN_THIRD_PARTY_PHASEOUT));
EXPECT_FALSE(
status.HasExclusionReason(net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_THIRD_PARTY_PHASEOUT));
EXPECT_FALSE(status.HasExclusionReason(
net::CookieInclusionStatus::ExclusionReason::EXCLUDE_USER_PREFERENCES));
} else {
EXPECT_TRUE(status.HasExclusionReason(
net::CookieInclusionStatus::ExclusionReason::EXCLUDE_USER_PREFERENCES));
}
status.ResetForTesting();
EXPECT_EQ(settings.IsCookieAccessible(
*cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status),
IsStorageAccessGrantEligibleViaAPI() ||
IsStorageAccessGrantEligibleViaHeader());
EXPECT_EQ(status.exemption_reason(),
net::CookieInclusionStatus::ExemptionReason::kNone);
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kURL, "*", CONTENT_SETTING_BLOCK)});
status.ResetForTesting();
EXPECT_FALSE(settings.IsCookieAccessible(
*cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status));
EXPECT_TRUE(status.HasExclusionReason(
net::CookieInclusionStatus::ExclusionReason::EXCLUDE_USER_PREFERENCES));
status.ResetForTesting();
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_BLOCK)});
EXPECT_FALSE(settings.IsCookieAccessible(
*cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status));
EXPECT_TRUE(status.HasExclusionReason(
net::CookieInclusionStatus::ExclusionReason::EXCLUDE_USER_PREFERENCES));
}
TEST_P(CookieSettingsTestP, IsCookieAccessible_PartitionedCookies) {
CookieSettings settings;
net::CookieInclusionStatus status;
settings.set_block_third_party_cookies(true);
if (IsTrackingProtectionEnabledFor3pcd()) {
settings.set_tracking_protection_enabled_for_3pcd(true);
}
std::unique_ptr<net::CanonicalCookie> partitioned_cookie =
MakeCanonicalCookie(
"__Host-partitioned", kURL,
net::CookiePartitionKey::FromURLForTesting(GURL(kOtherURL)));
EXPECT_TRUE(settings.IsCookieAccessible(
*partitioned_cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status));
settings.set_block_third_party_cookies(false);
EXPECT_TRUE(settings.IsCookieAccessible(
*partitioned_cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status));
settings.set_block_third_party_cookies(false);
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kURL, "*", CONTENT_SETTING_BLOCK)});
EXPECT_FALSE(settings.IsCookieAccessible(
*partitioned_cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status));
settings.set_block_third_party_cookies(true);
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", kOtherURL, CONTENT_SETTING_BLOCK)});
EXPECT_FALSE(settings.IsCookieAccessible(
*partitioned_cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status));
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kUnrelatedURL, kOtherURL, CONTENT_SETTING_BLOCK)});
EXPECT_TRUE(settings.IsCookieAccessible(
*partitioned_cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status));
settings.set_block_third_party_cookies(true);
settings.set_content_settings(
ContentSettingsType::STORAGE_ACCESS,
{CreateSetting(kURL, kOtherURL, CONTENT_SETTING_BLOCK)});
EXPECT_TRUE(settings.IsCookieAccessible(
*partitioned_cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status));
EXPECT_FALSE(status.HasWarningReason(
net::CookieInclusionStatus::WarningReason::WARN_THIRD_PARTY_PHASEOUT));
EXPECT_FALSE(
status.HasExclusionReason(net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_THIRD_PARTY_PHASEOUT));
}
TEST_P(CookieSettingsTestP, IsCookieAccessible_NoneExemptionReason) {
CookieSettings settings;
net::CookieInclusionStatus status;
settings.set_block_third_party_cookies(true);
if (IsTrackingProtectionEnabledFor3pcd()) {
settings.set_tracking_protection_enabled_for_3pcd(true);
}
std::unique_ptr<net::CanonicalCookie> partitioned_cookie =
MakeCanonicalSameSiteNoneCookie(
"__Host-partitioned", kURL,
net::CookiePartitionKey::FromURLForTesting(GURL(kOtherURL)));
std::unique_ptr<net::CanonicalCookie> samesitelax_cookie =
MakeCanonicalCookie("samesite_lax", kURL);
EXPECT_TRUE(settings.IsCookieAccessible(
*partitioned_cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status));
EXPECT_TRUE(status.exemption_reason() ==
net::CookieInclusionStatus::ExemptionReason::kNone);
if (IsStorageAccessGrantEligibleViaAPI() ||
IsStorageAccessGrantEligibleViaHeader()) {
settings.set_content_settings(
ContentSettingsType::STORAGE_ACCESS,
{CreateSetting(kURL, kOtherURL, CONTENT_SETTING_ALLOW)});
} else if (IsTopLevelStorageAccessGrantEligible()) {
settings.set_content_settings(
ContentSettingsType::TOP_LEVEL_STORAGE_ACCESS,
{CreateSetting(kURL, kOtherURL, CONTENT_SETTING_ALLOW)});
} else {
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kURL, kOtherURL, CONTENT_SETTING_ALLOW)});
}
status.ResetForTesting();
EXPECT_TRUE(settings.IsCookieAccessible(
*partitioned_cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status));
EXPECT_TRUE(status.exemption_reason() ==
net::CookieInclusionStatus::ExemptionReason::kNone);
status.ResetForTesting();
EXPECT_TRUE(settings.IsCookieAccessible(
*samesitelax_cookie, GURL(kURL), net::SiteForCookies(),
url::Origin::Create(GURL(kOtherURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status));
EXPECT_TRUE(status.exemption_reason() ==
net::CookieInclusionStatus::ExemptionReason::kNone);
}
TEST_P(CookieSettingsTestP, IsCookieAccessible_SitesInFirstPartySets) {
CookieSettings settings;
net::CookieInclusionStatus status;
url::Origin top_level_origin = url::Origin::Create(GURL(kRwsOwnerURL));
net::SchemefulSite primary((GURL(kRwsOwnerURL)));
settings.set_block_third_party_cookies(true);
if (IsTrackingProtectionEnabledFor3pcd()) {
settings.set_tracking_protection_enabled_for_3pcd(true);
}
std::unique_ptr<net::CanonicalCookie> cookie =
MakeCanonicalSameSiteNoneCookie("name", kRwsMemberURL);
EXPECT_FALSE(settings.IsCookieAccessible(
*cookie, GURL(kRwsMemberURL), net::SiteForCookies(), top_level_origin,
net::FirstPartySetMetadata(), GetCookieSettingOverrides(), &status));
EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting(
{IsTPCDEnabled() ? net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_THIRD_PARTY_PHASEOUT
: net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES}));
status.ResetForTesting();
EXPECT_FALSE(settings.IsCookieAccessible(
*cookie, GURL(kRwsMemberURL), net::SiteForCookies(), top_level_origin,
net::FirstPartySetMetadata(
net::FirstPartySetEntry(primary, net::SiteType::kAssociated),
net::FirstPartySetEntry(primary, net::SiteType::kPrimary)),
GetCookieSettingOverrides(), &status));
if (IsTPCDEnabled()) {
EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_THIRD_PARTY_PHASEOUT,
net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_THIRD_PARTY_BLOCKED_WITHIN_FIRST_PARTY_SET}));
} else {
EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES}));
}
}
TEST_P(CookieSettingsTestP, AnnotateAndMoveUserBlockedCookies_CrossSiteEmbed) {
CookieSettings settings;
settings.set_block_third_party_cookies(true);
if (IsTrackingProtectionEnabledFor3pcd()) {
settings.set_tracking_protection_enabled_for_3pcd(true);
}
net::CookieAccessResultList maybe_included_cookies = {
{*MakeCanonicalSameSiteNoneCookie("third_party", kURL), {}},
{*MakeCanonicalCookie("cookie", kURL), {}}};
net::CookieAccessResultList excluded_cookies = {
{*MakeCanonicalSameSiteNoneCookie("excluded_other", kURL),
net::CookieAccessResult(
net::CookieInclusionStatus::MakeFromReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}))},
{*MakeCanonicalCookie("excluded_samesitelax", kURL),
net::CookieAccessResult(
net::CookieInclusionStatus::MakeFromReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}))},
};
url::Origin origin = url::Origin::Create(GURL(kOtherURL));
EXPECT_EQ(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kURL), net::SiteForCookies(), &origin,
net::FirstPartySetMetadata(), GetCookieSettingOverrides(),
maybe_included_cookies, excluded_cookies),
IsTPCDEnabled());
if (IsTPCDEnabled()) {
EXPECT_THAT(
maybe_included_cookies,
UnorderedElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("cookie"),
MatchesCookieAccessResult(
AllOf(net::IsInclude(),
Not(net::HasWarningReason(
net::CookieInclusionStatus::WarningReason::
WARN_THIRD_PARTY_PHASEOUT)),
net::HasExactlyExemptionReason(
net::CookieInclusionStatus::ExemptionReason::kNone)),
_, _, _))));
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("excluded_other"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}),
_, _, _)),
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("third_party"),
MatchesCookieAccessResult(
net::HasExclusionReason(
net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_THIRD_PARTY_PHASEOUT),
_, _, _)),
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("excluded_samesitelax"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}),
_, _, _))));
} else {
EXPECT_THAT(maybe_included_cookies, IsEmpty());
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("cookie"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES}),
_, _, _)),
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("excluded_other"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY,
net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES}),
_, _, _)),
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("excluded_samesitelax"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting({
net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY,
net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES,
}),
_, _, _)),
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("third_party"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES}),
_, _, _))));
}
}
TEST_F(CookieSettingsTest,
AnnotateAndMoveUserBlockedCookies_CrossSiteEmbed_3PCAllowed) {
CookieSettings settings;
settings.set_block_third_party_cookies(false);
net::CookieAccessResultList maybe_included_cookies = {
{*MakeCanonicalCookie("lax_by_default", kURL), {}},
{*MakeCanonicalSameSiteNoneCookie("third_party", kURL), {}}};
net::CookieAccessResultList excluded_cookies = {};
url::Origin origin = url::Origin::Create(GURL(kOtherURL));
EXPECT_TRUE(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kURL), net::SiteForCookies(), &origin, net::FirstPartySetMetadata(),
net::CookieSettingOverrides(), maybe_included_cookies, excluded_cookies));
EXPECT_THAT(maybe_included_cookies,
UnorderedElementsAre(
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("lax_by_default"),
MatchesCookieAccessResult(
AllOf(net::IsInclude(),
Not(net::HasWarningReason(
net::CookieInclusionStatus::WarningReason::
WARN_THIRD_PARTY_PHASEOUT))),
_, _, _)),
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("third_party"),
MatchesCookieAccessResult(
AllOf(net::IsInclude(),
net::HasExactlyWarningReasonsForTesting(
{net::CookieInclusionStatus::WarningReason::
WARN_THIRD_PARTY_PHASEOUT})),
_, _, _))));
}
TEST_F(
CookieSettingsTest,
AnnotateAndMoveUserBlockedCookies_CrossSiteEmbed_CookieSettingOverrideBlock3PC) {
CookieSettings settings;
settings.set_block_third_party_cookies(false);
const url::Origin origin = url::Origin::Create(GURL(kOtherURL));
net::CookieSettingOverrides overrides(
{net::CookieSettingOverride::kForceDisableThirdPartyCookies});
{
net::CookieAccessResultList maybe_included_cookies = {
{*MakeCanonicalSameSiteNoneCookie("third_party", kURL), {}}};
net::CookieAccessResultList excluded_cookies = {};
EXPECT_FALSE(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kURL), net::SiteForCookies(), &origin,
net::FirstPartySetMetadata(), overrides, maybe_included_cookies,
excluded_cookies));
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("third_party"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES}),
_, _, _))));
}
overrides.Put(
net::CookieSettingOverride::kForceEnableThirdPartyCookieMitigations);
{
net::CookieAccessResultList maybe_included_cookies = {
{*MakeCanonicalSameSiteNoneCookie("third_party", kURL), {}}};
net::CookieAccessResultList excluded_cookies = {};
EXPECT_FALSE(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kURL), net::SiteForCookies(), &origin,
net::FirstPartySetMetadata(), overrides, maybe_included_cookies,
excluded_cookies));
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("third_party"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_THIRD_PARTY_PHASEOUT}),
_, _, _))));
}
}
TEST_F(CookieSettingsTest,
AnnotateAndMoveUserBlockedCookies_SameSiteEmbed_3PCAllowed) {
CookieSettings settings;
settings.set_block_third_party_cookies(false);
net::CookieAccessResultList maybe_included_cookies = {
{*MakeCanonicalSameSiteNoneCookie("cookie", kDomainURL), {}}};
net::CookieAccessResultList excluded_cookies = {};
url::Origin origin = url::Origin::Create(GURL(kDomainURL));
EXPECT_TRUE(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kSubDomainURL), net::SiteForCookies(net::SchemefulSite(origin)),
&origin, net::FirstPartySetMetadata(), net::CookieSettingOverrides(),
maybe_included_cookies, excluded_cookies));
EXPECT_THAT(
maybe_included_cookies,
ElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("cookie"),
MatchesCookieAccessResult(
AllOf(net::IsInclude(),
Not(net::HasWarningReason(
net::CookieInclusionStatus::WarningReason::
WARN_THIRD_PARTY_PHASEOUT)),
net::HasExactlyExemptionReason(
net::CookieInclusionStatus::ExemptionReason::kNone)),
_, _, _))));
maybe_included_cookies[0].access_result.status = net::CookieInclusionStatus();
EXPECT_TRUE(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kSubDomainURL), net::SiteForCookies(), &origin,
net::FirstPartySetMetadata(), net::CookieSettingOverrides(),
maybe_included_cookies, excluded_cookies));
EXPECT_THAT(maybe_included_cookies,
ElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("cookie"),
MatchesCookieAccessResult(
AllOf(net::IsInclude(),
net::HasWarningReason(
net::CookieInclusionStatus::WarningReason::
WARN_THIRD_PARTY_PHASEOUT)),
_, _, _))));
}
TEST_P(CookieSettingsTestP,
AnnotateAndMoveUserBlockedCookies_SameSiteEmbed_FirstPartyContext) {
CookieSettings settings;
settings.set_block_third_party_cookies(true);
if (IsTrackingProtectionEnabledFor3pcd()) {
settings.set_tracking_protection_enabled_for_3pcd(true);
}
net::CookieAccessResultList maybe_included_cookies = {
{*MakeCanonicalSameSiteNoneCookie("third_party", kURL), {}},
{*MakeCanonicalCookie("cookie", kURL), {}}};
net::CookieAccessResultList excluded_cookies = {
{*MakeCanonicalSameSiteNoneCookie("excluded_other", kURL),
net::CookieAccessResult(
net::CookieInclusionStatus::MakeFromReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}))},
{*MakeCanonicalCookie("excluded_samesitelax", kURL),
net::CookieAccessResult(
net::CookieInclusionStatus::MakeFromReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}))},
};
url::Origin origin = url::Origin::Create(GURL(kURL));
EXPECT_TRUE(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kURL), net::SiteForCookies::FromUrl(GURL(kURL)), &origin,
net::FirstPartySetMetadata(), GetCookieSettingOverrides(),
maybe_included_cookies, excluded_cookies));
EXPECT_THAT(
maybe_included_cookies,
UnorderedElementsAre(
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("cookie"),
MatchesCookieAccessResult(
AllOf(
net::IsInclude(),
Not(net::HasWarningReason(
net::CookieInclusionStatus::WarningReason::
WARN_THIRD_PARTY_PHASEOUT)),
net::HasExactlyExemptionReason(
net::CookieInclusionStatus::ExemptionReason::kNone)),
_, _, _)),
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("third_party"),
MatchesCookieAccessResult(
AllOf(
net::IsInclude(),
Not(net::HasWarningReason(
net::CookieInclusionStatus::WarningReason::
WARN_THIRD_PARTY_PHASEOUT)),
net::HasExactlyExemptionReason(
net::CookieInclusionStatus::ExemptionReason::kNone)),
_, _, _))));
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("excluded_other"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}),
_, _, _)),
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("excluded_samesitelax"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}),
_, _, _))));
}
TEST_P(CookieSettingsTestP,
AnnotateAndMoveUserBlockedCookies_SameSiteEmbed_ThirdPartyContext) {
CookieSettings settings;
settings.set_block_third_party_cookies(true);
if (IsTrackingProtectionEnabledFor3pcd()) {
settings.set_tracking_protection_enabled_for_3pcd(true);
}
net::CookieAccessResultList maybe_included_cookies = {
{*MakeCanonicalSameSiteNoneCookie("cookie", kDomainURL), {}},
{*MakeCanonicalCookie("samesite_lax", kDomainURL), {}},
};
net::CookieAccessResultList excluded_cookies = {
{*MakeCanonicalSameSiteNoneCookie("excluded_other", kDomainURL),
net::CookieAccessResult(
net::CookieInclusionStatus::MakeFromReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}))}};
url::Origin origin = url::Origin::Create(GURL(kDomainURL));
const bool expected_any_allowed = IsStorageAccessGrantEligibleViaAPI() ||
IsStorageAccessGrantEligibleViaHeader() ||
IsTPCDEnabled();
EXPECT_EQ(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kSubDomainURL), net::SiteForCookies(), &origin,
net::FirstPartySetMetadata(), GetCookieSettingOverrides(),
maybe_included_cookies, excluded_cookies),
expected_any_allowed);
if (IsStorageAccessGrantEligibleViaAPI() ||
IsStorageAccessGrantEligibleViaHeader()) {
EXPECT_THAT(
maybe_included_cookies,
ElementsAre(
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("cookie"),
MatchesCookieAccessResult(
AllOf(net::IsInclude(),
Not(net::HasWarningReason(
net::CookieInclusionStatus::WarningReason::
WARN_THIRD_PARTY_PHASEOUT)),
net::HasExactlyExemptionReason(
net::CookieInclusionStatus::ExemptionReason::
kStorageAccess)),
_, _, _)),
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("samesite_lax"),
MatchesCookieAccessResult(
AllOf(net::IsInclude(),
Not(net::HasWarningReason(
net::CookieInclusionStatus::WarningReason::
WARN_THIRD_PARTY_PHASEOUT)),
net::HasExactlyExemptionReason(
net::CookieInclusionStatus::ExemptionReason::
kNone)),
_, _, _))));
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("excluded_other"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}),
_, _, _))));
} else if (IsTPCDEnabled()) {
EXPECT_THAT(
maybe_included_cookies,
UnorderedElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("samesite_lax"),
MatchesCookieAccessResult(
AllOf(net::IsInclude(),
Not(net::HasWarningReason(
net::CookieInclusionStatus::WarningReason::
WARN_THIRD_PARTY_PHASEOUT)),
net::HasExactlyExemptionReason(
net::CookieInclusionStatus::ExemptionReason::kNone)),
_, _, _))));
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("cookie"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_THIRD_PARTY_PHASEOUT}),
_, _, _)),
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("excluded_other"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}),
_, _, _))));
} else {
EXPECT_THAT(maybe_included_cookies, IsEmpty());
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("cookie"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES}),
_, _, _)),
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("samesite_lax"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES}),
_, _, _)),
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("excluded_other"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY,
net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES}),
_, _, _))));
}
}
TEST_P(CookieSettingsTestP,
AnnotateAndMoveUserBlockedCookies_SitesInFirstPartySet) {
CookieSettings settings;
settings.set_block_third_party_cookies(true);
if (IsTrackingProtectionEnabledFor3pcd()) {
settings.set_tracking_protection_enabled_for_3pcd(true);
}
net::CookieAccessResultList maybe_included_cookies = {
{*MakeCanonicalSameSiteNoneCookie("third_party_but_member",
kRwsMemberURL),
{}}};
net::CookieAccessResultList excluded_cookies = {};
url::Origin origin = url::Origin::Create(GURL(kRwsOwnerURL));
net::SchemefulSite primary((GURL(kRwsOwnerURL)));
EXPECT_FALSE(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kRwsMemberURL), net::SiteForCookies(), &origin,
net::FirstPartySetMetadata(
net::FirstPartySetEntry(primary, net::SiteType::kAssociated),
net::FirstPartySetEntry(primary, net::SiteType::kPrimary)),
GetCookieSettingOverrides(), maybe_included_cookies, excluded_cookies));
EXPECT_EQ(0u, maybe_included_cookies.size());
EXPECT_THAT(
excluded_cookies,
ElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("third_party_but_member"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
IsForceThirdPartyCookieBlockingFlagEnabled() ||
IsTrackingProtectionEnabledFor3pcd()
? net::CookieInclusionStatus::ExclusionReasonBitset{
net::CookieInclusionStatus::
ExclusionReason::EXCLUDE_THIRD_PARTY_PHASEOUT,
net::CookieInclusionStatus::
ExclusionReason::EXCLUDE_THIRD_PARTY_BLOCKED_WITHIN_FIRST_PARTY_SET,
}
:
net::CookieInclusionStatus::
ExclusionReasonBitset{net::CookieInclusionStatus::
ExclusionReason::EXCLUDE_USER_PREFERENCES}),
_, _, _))));
}
TEST_P(
CookieSettingsTestP,
AnnotateAndMoveUserBlockedCookies_SitesInFirstPartySet_FirstPartyURLBlocked) {
CookieSettings settings;
settings.set_block_third_party_cookies(true);
if (IsTrackingProtectionEnabledFor3pcd()) {
settings.set_tracking_protection_enabled_for_3pcd(true);
}
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kRwsOwnerURL, kRwsOwnerURL, CONTENT_SETTING_BLOCK)});
std::unique_ptr<net::CanonicalCookie> cookie =
MakeCanonicalSameSiteNoneCookie("third_party_but_member", kRwsMemberURL);
url::Origin top_frame_origin = url::Origin::Create(GURL(kRwsOwnerURL));
net::SchemefulSite primary((GURL(kRwsOwnerURL)));
net::FirstPartySetEntry frame_entry(primary, net::SiteType::kAssociated);
net::FirstPartySetEntry top_frame_entry(primary, net::SiteType::kPrimary);
net::CookieAccessResultList maybe_included_cookies = {{*cookie, {}}};
net::CookieAccessResultList excluded_cookies = {};
EXPECT_FALSE(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kRwsMemberURL), net::SiteForCookies(), &top_frame_origin,
net::FirstPartySetMetadata(frame_entry, top_frame_entry),
GetCookieSettingOverrides(), maybe_included_cookies, excluded_cookies));
EXPECT_EQ(0u, maybe_included_cookies.size());
EXPECT_THAT(
excluded_cookies,
ElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("third_party_but_member"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
IsForceThirdPartyCookieBlockingFlagEnabled() ||
IsTrackingProtectionEnabledFor3pcd()
?
net::CookieInclusionStatus::
ExclusionReasonBitset{
net::CookieInclusionStatus::
ExclusionReason::EXCLUDE_THIRD_PARTY_PHASEOUT,
net::CookieInclusionStatus::
ExclusionReason::EXCLUDE_THIRD_PARTY_BLOCKED_WITHIN_FIRST_PARTY_SET,
}
:
net::CookieInclusionStatus::
ExclusionReasonBitset{net::CookieInclusionStatus::
ExclusionReason::EXCLUDE_USER_PREFERENCES}),
_, _, _))));
}
namespace {
net::CookieAccessResultList MakePartitionedCookie() {
return {
{*MakeCanonicalCookie(
"__Host-partitioned", kURL,
net::CookiePartitionKey::FromURLForTesting(GURL(kOtherURL))),
{}},
};
}
}
TEST_F(CookieSettingsTest,
AnnotateAndMoveUserBlockedCookies_PartitionedCookies) {
CookieSettings settings;
net::CookieAccessResultList maybe_included_cookies = MakePartitionedCookie();
net::CookieAccessResultList excluded_cookies = {};
url::Origin top_level_origin = url::Origin::Create(GURL(kOtherURL));
settings.set_block_third_party_cookies(true);
EXPECT_TRUE(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kURL), net::SiteForCookies(), &top_level_origin,
net::FirstPartySetMetadata(), net::CookieSettingOverrides(),
maybe_included_cookies, excluded_cookies));
EXPECT_THAT(maybe_included_cookies,
ElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("__Host-partitioned"),
MatchesCookieAccessResult(net::IsInclude(), _, _, _))));
EXPECT_THAT(excluded_cookies, IsEmpty());
maybe_included_cookies = MakePartitionedCookie();
excluded_cookies = {};
settings.set_block_third_party_cookies(false);
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kURL, "*", CONTENT_SETTING_BLOCK)});
EXPECT_FALSE(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kURL), net::SiteForCookies(), &top_level_origin,
net::FirstPartySetMetadata(), net::CookieSettingOverrides(),
maybe_included_cookies, excluded_cookies));
EXPECT_THAT(maybe_included_cookies, IsEmpty());
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("__Host-partitioned"),
MatchesCookieAccessResult(
net::HasExclusionReason(
net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES),
_, _, _))));
maybe_included_cookies = MakePartitionedCookie();
excluded_cookies = {};
settings.set_block_third_party_cookies(true);
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kURL, "*", CONTENT_SETTING_BLOCK)});
EXPECT_FALSE(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kURL), net::SiteForCookies(), &top_level_origin,
net::FirstPartySetMetadata(), net::CookieSettingOverrides(),
maybe_included_cookies, excluded_cookies));
{
EXPECT_THAT(maybe_included_cookies, IsEmpty());
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("__Host-partitioned"),
MatchesCookieAccessResult(
net::HasExclusionReason(
net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES),
_, _, _))));
}
maybe_included_cookies = MakePartitionedCookie();
excluded_cookies = {};
settings.set_block_third_party_cookies(true);
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting(kOtherURL, kUnrelatedURL, CONTENT_SETTING_BLOCK)});
EXPECT_TRUE(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kURL), net::SiteForCookies(), &top_level_origin,
net::FirstPartySetMetadata(), net::CookieSettingOverrides(),
maybe_included_cookies, excluded_cookies));
EXPECT_THAT(maybe_included_cookies,
ElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("__Host-partitioned"),
MatchesCookieAccessResult(net::IsInclude(), _, _, _))));
EXPECT_THAT(excluded_cookies, IsEmpty());
}
TEST_F(CookieSettingsTest, GetStorageAccessStatus) {
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitWithFeatures(
{network::features::kPopulatePermissionsPolicyOnRequest,
network::features::kStorageAccessHeadersRespectPermissionsPolicy},
{});
CookieSettings settings;
GURL url(kURL);
url::Origin top_frame_origin = url::Origin::Create(GURL(kOtherURL));
settings.set_block_third_party_cookies(true);
url::Origin origin = url::Origin::Create(url);
const std::unique_ptr<network::PermissionsPolicy>
allowing_permissions_policy =
network::PermissionsPolicy::CreateFromParsedPolicy(
{{{network::mojom::PermissionsPolicyFeature::kStorageAccessAPI,
{*network::OriginWithPossibleWildcards::FromOrigin(origin)},
std::nullopt,
false,
false}}},
std::nullopt, origin);
EXPECT_EQ(
settings.GetStorageAccessStatus(url, net::SiteForCookies::FromUrl(url),
origin, net::CookieSettingOverrides(),
std::nullopt,
*allowing_permissions_policy),
std::nullopt);
EXPECT_EQ(
settings.GetStorageAccessStatus(
url, net::SiteForCookies::FromUrl(url), origin,
net::CookieSettingOverrides(
{net::CookieSettingOverride::kStorageAccessGrantEligible}),
std::nullopt, *allowing_permissions_policy),
std::nullopt);
EXPECT_EQ(
settings.GetStorageAccessStatus(
url, net::SiteForCookies(), top_frame_origin,
net::CookieSettingOverrides(), std::nullopt,
*allowing_permissions_policy),
net::cookie_util::StorageAccessStatus::kNone);
EXPECT_EQ(
settings.GetStorageAccessStatus(
url, net::SiteForCookies(), top_frame_origin,
net::CookieSettingOverrides(
{net::CookieSettingOverride::kStorageAccessGrantEligible}),
std::nullopt, *allowing_permissions_policy),
net::cookie_util::StorageAccessStatus::kNone);
settings.set_content_settings(
ContentSettingsType::STORAGE_ACCESS,
{CreateSetting(kURL, kOtherURL, CONTENT_SETTING_ALLOW)});
EXPECT_EQ(
settings.GetStorageAccessStatus(
url, net::SiteForCookies(), top_frame_origin,
net::CookieSettingOverrides(), std::nullopt,
*allowing_permissions_policy),
net::cookie_util::StorageAccessStatus::kInactive);
const std::unique_ptr<network::PermissionsPolicy>
blocking_permissions_policy =
network::PermissionsPolicy::CreateFromParsedPolicy(
{{{network::mojom::PermissionsPolicyFeature::kStorageAccessAPI,
{},
std::nullopt,
false,
false}}},
std::nullopt, origin);
EXPECT_EQ(
settings.GetStorageAccessStatus(
url, net::SiteForCookies(), top_frame_origin,
net::CookieSettingOverrides(), std::nullopt,
*blocking_permissions_policy),
net::cookie_util::StorageAccessStatus::kNone);
EXPECT_EQ(
settings.GetStorageAccessStatus(
url, net::SiteForCookies(), top_frame_origin,
net::CookieSettingOverrides(
{net::CookieSettingOverride::kStorageAccessGrantEligible}),
std::nullopt, *allowing_permissions_policy),
net::cookie_util::StorageAccessStatus::kActive);
EXPECT_EQ(
settings.GetStorageAccessStatus(
url, net::SiteForCookies(), top_frame_origin,
net::CookieSettingOverrides(
{net::CookieSettingOverride::
kStorageAccessGrantEligibleViaHeader}),
std::nullopt, *allowing_permissions_policy),
net::cookie_util::StorageAccessStatus::kActive);
net::CookiePartitionKey cookie_partition_key =
net::CookiePartitionKey::FromURLForTesting(
GURL(kOtherURL),
net::CookiePartitionKey::AncestorChainBit::kCrossSite,
base::UnguessableToken::Create());
EXPECT_EQ(settings.GetStorageAccessStatus(
url, net::SiteForCookies(), top_frame_origin,
net::CookieSettingOverrides(), cookie_partition_key,
*allowing_permissions_policy),
net::cookie_util::StorageAccessStatus::kNone);
EXPECT_EQ(settings.GetStorageAccessStatus(
url, net::SiteForCookies(), top_frame_origin,
net::CookieSettingOverrides(
{net::CookieSettingOverride::kStorageAccessGrantEligible}),
cookie_partition_key, *allowing_permissions_policy),
net::cookie_util::StorageAccessStatus::kNone);
EXPECT_EQ(settings.GetStorageAccessStatus(
url, net::SiteForCookies(), top_frame_origin,
net::CookieSettingOverrides(
{net::CookieSettingOverride::
kStorageAccessGrantEligibleViaHeader}),
cookie_partition_key, *allowing_permissions_policy),
net::cookie_util::StorageAccessStatus::kNone);
}
TEST_F(CookieSettingsTest,
GetStorageAccessStatus_RespectPermissionsPolicyDisabled) {
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitWithFeatures(
{network::features::kPopulatePermissionsPolicyOnRequest},
{
network::features::kStorageAccessHeadersRespectPermissionsPolicy});
CookieSettings settings;
GURL url(kURL);
url::Origin top_frame_origin = url::Origin::Create(GURL(kOtherURL));
settings.set_block_third_party_cookies(true);
settings.set_content_settings(
ContentSettingsType::STORAGE_ACCESS,
{CreateSetting(kURL, kOtherURL, CONTENT_SETTING_ALLOW)});
const std::unique_ptr<network::PermissionsPolicy>
blocking_permissions_policy =
network::PermissionsPolicy::CreateFromParsedPolicy(
{{{network::mojom::PermissionsPolicyFeature::kStorageAccessAPI,
{},
std::nullopt,
false,
false}}},
std::nullopt, url::Origin::Create(url));
EXPECT_EQ(
settings.GetStorageAccessStatus(
url, net::SiteForCookies(), top_frame_origin,
net::CookieSettingOverrides(), std::nullopt,
*blocking_permissions_policy),
net::cookie_util::StorageAccessStatus::kInactive);
}
TEST_F(CookieSettingsTest,
IsCookieAccessible_SandboxValueAllowsSameSiteNoneCookiesWhenSet) {
CookieSettings settings;
GURL url(kURL);
url::Origin origin = url::Origin::Create(url);
settings.set_block_third_party_cookies(true);
base::HistogramTester histogram_tester;
std::unique_ptr<net::CanonicalCookie> cookie =
MakeCanonicalSameSiteNoneCookie("name", url.spec());
ASSERT_FALSE(settings.IsCookieAccessible(
*cookie, url, net::SiteForCookies(), origin, net::FirstPartySetMetadata(),
net::CookieSettingOverrides(), nullptr));
histogram_tester.ExpectUniqueSample(
kAllowedRequestsHistogram,
net::cookie_util::StorageAccessResult::ACCESS_BLOCKED, 1);
const net::CookieSettingOverrides overrides(
{net::CookieSettingOverride::kAllowSameSiteNoneCookiesInSandbox});
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(
net::features::kAllowSameSiteNoneCookiesInSandbox);
net::CookieInclusionStatus status;
EXPECT_TRUE(settings.IsCookieAccessible(*cookie, url, net::SiteForCookies(),
origin, net::FirstPartySetMetadata(),
overrides, &status));
EXPECT_EQ(status.exemption_reason(),
net::CookieInclusionStatus::ExemptionReason::
kSameSiteNoneCookiesInSandbox);
histogram_tester.ExpectBucketCount(
kAllowedRequestsHistogram,
net::cookie_util::StorageAccessResult::ACCESS_ALLOWED_SANDBOX_VALUE, 1);
}
TEST_F(CookieSettingsTest,
IsCookieAccessible_SandboxValueDoesNotAllowCrossSiteCookiesWhenSet) {
CookieSettings settings;
GURL cross_site_url(kOtherURL);
url::Origin origin = url::Origin::Create(GURL(kURL));
settings.set_block_third_party_cookies(true);
base::HistogramTester histogram_tester;
std::unique_ptr<net::CanonicalCookie> cookie =
MakeCanonicalSameSiteNoneCookie("name", cross_site_url.spec());
const net::CookieSettingOverrides overrides(
{net::CookieSettingOverride::kAllowSameSiteNoneCookiesInSandbox});
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(
net::features::kAllowSameSiteNoneCookiesInSandbox);
net::CookieInclusionStatus status;
EXPECT_FALSE(settings.IsCookieAccessible(
*cookie, cross_site_url, net::SiteForCookies(), origin,
net::FirstPartySetMetadata(), overrides, &status));
EXPECT_EQ(status.exemption_reason(),
net::CookieInclusionStatus::ExemptionReason::kNone);
histogram_tester.ExpectUniqueSample(
kAllowedRequestsHistogram,
net::cookie_util::StorageAccessResult::ACCESS_BLOCKED, 1);
}
std::string CustomTestName(
const testing::TestParamInfo<CookieSettingsTestP::ParamType>& info) {
std::stringstream custom_test_name;
custom_test_name
<< "GrantSource_"
<< std::get<TestVariables::kGrantSource>(info.param)
<< "_BlockSource_"
<< std::get<TestVariables::kBlockSource>(info.param);
return custom_test_name.str();
}
INSTANTIATE_TEST_SUITE_P(
,
CookieSettingsTestP,
testing::Combine(testing::Range(GrantSource::kNoneGranted,
GrantSource::kGrantSourceCount),
testing::Range(BlockSource::kNoneBlocked,
BlockSource::kBlockSourceCount)),
CustomTestName);
class CookieSettingsTpcdMetadataGrantsTest
: public CookieSettingsTestBase,
public testing::WithParamInterface</* net::features::kTpcdMetadataGrants:
*/
bool> {
public:
CookieSettingsTpcdMetadataGrantsTest() {
std::vector<base::test::FeatureRef> enabled_features;
std::vector<base::test::FeatureRef> disabled_features;
if (IsTpcdMetadataGrantEligible()) {
enabled_features.push_back(net::features::kTpcdMetadataGrants);
} else {
disabled_features.push_back(net::features::kTpcdMetadataGrants);
}
feature_list_.InitWithFeatures(enabled_features, disabled_features);
}
bool IsTpcdMetadataGrantEligible() const { return GetParam(); }
net::CookieSettingOverrides GetCookieSettingOverrides() const {
net::CookieSettingOverrides overrides;
return overrides;
}
ContentSetting SettingWith3pcdMetadataGrantEligibleOverride() const {
return IsTpcdMetadataGrantEligible() ? CONTENT_SETTING_ALLOW
: CONTENT_SETTING_BLOCK;
}
net::cookie_util::StorageAccessResult
BlockedStorageAccessResultWith3pcdMetadataGrantOverride() const {
if (IsTpcdMetadataGrantEligible()) {
return net::cookie_util::StorageAccessResult::
ACCESS_ALLOWED_3PCD_METADATA_GRANT;
}
return net::cookie_util::StorageAccessResult::ACCESS_BLOCKED;
}
};
TEST_P(CookieSettingsTpcdMetadataGrantsTest, Grants) {
GURL first_party_url = GURL(kURL);
GURL third_party_url_1 = GURL(kOtherURL);
GURL third_party_url_2 = GURL(kDomainURL);
base::HistogramTester histogram_tester;
CookieSettings settings;
settings.set_block_third_party_cookies(true);
settings.set_mitigations_enabled_for_3pcd(true);
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_ALLOW)});
network::tpcd::metadata::Manager manager;
manager.SetGrants(
{CreateSetting(third_party_url_1.GetHost(), first_party_url.GetHost(),
CONTENT_SETTING_ALLOW)});
settings.set_tpcd_metadata_manager(&manager);
histogram_tester.ExpectTotalCount(kAllowedRequestsHistogram, 0);
EXPECT_EQ(settings.GetCookieSetting(third_party_url_1, net::SiteForCookies(),
first_party_url,
GetCookieSettingOverrides(), nullptr),
SettingWith3pcdMetadataGrantEligibleOverride());
histogram_tester.ExpectUniqueSample(
kAllowedRequestsHistogram,
BlockedStorageAccessResultWith3pcdMetadataGrantOverride(), 1);
EXPECT_EQ(settings.GetCookieSetting(first_party_url, net::SiteForCookies(),
third_party_url_1,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
histogram_tester.ExpectBucketCount(
kAllowedRequestsHistogram,
net::cookie_util::StorageAccessResult::ACCESS_ALLOWED_3PCD_METADATA_GRANT,
IsTpcdMetadataGrantEligible() ? 1 : 0);
histogram_tester.ExpectBucketCount(
kAllowedRequestsHistogram,
BlockedStorageAccessResultWith3pcdMetadataGrantOverride(),
IsTpcdMetadataGrantEligible() ? 1 : 2);
EXPECT_EQ(settings.GetCookieSetting(third_party_url_2, net::SiteForCookies(),
first_party_url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
}
TEST_P(CookieSettingsTpcdMetadataGrantsTest, IsCookieAccessible) {
CookieSettings settings;
net::CookieInclusionStatus status;
settings.set_block_third_party_cookies(true);
settings.set_mitigations_enabled_for_3pcd(true);
network::tpcd::metadata::Manager manager;
manager.SetGrants({CreateSetting(kOtherURL, kURL, CONTENT_SETTING_ALLOW)});
settings.set_tpcd_metadata_manager(&manager);
std::unique_ptr<net::CanonicalCookie> cookie =
MakeCanonicalSameSiteNoneCookie("name", kOtherURL);
EXPECT_EQ(settings.IsCookieAccessible(
*cookie, GURL(kOtherURL), net::SiteForCookies(),
url::Origin::Create(GURL(kURL)), net::FirstPartySetMetadata(),
GetCookieSettingOverrides(), &status),
IsTpcdMetadataGrantEligible());
EXPECT_EQ(status.exemption_reason() ==
net::CookieInclusionStatus::ExemptionReason::k3PCDMetadata,
IsTpcdMetadataGrantEligible());
}
TEST_P(CookieSettingsTpcdMetadataGrantsTest,
IsCookieAccessible_OverridesLimitTPC) {
CookieSettings settings;
net::CookieInclusionStatus status;
net::CookieSettingOverrides overrides(
{net::CookieSettingOverride::kForceDisableThirdPartyCookies,
net::CookieSettingOverride::kForceEnableThirdPartyCookieMitigations});
settings.set_block_third_party_cookies(false);
network::tpcd::metadata::Manager manager;
manager.SetGrants({CreateSetting(kOtherURL, kURL, CONTENT_SETTING_ALLOW)});
settings.set_tpcd_metadata_manager(&manager);
std::unique_ptr<net::CanonicalCookie> cookie =
MakeCanonicalSameSiteNoneCookie("name", kOtherURL);
EXPECT_EQ(settings.IsCookieAccessible(
*cookie, GURL(kOtherURL), net::SiteForCookies(),
url::Origin::Create(GURL(kURL)), net::FirstPartySetMetadata(),
overrides, &status),
IsTpcdMetadataGrantEligible());
EXPECT_EQ(status.exemption_reason() ==
net::CookieInclusionStatus::ExemptionReason::k3PCDMetadata,
IsTpcdMetadataGrantEligible());
}
TEST_P(CookieSettingsTpcdMetadataGrantsTest,
IsCookieAccessible_OverridesDisableMetadata) {
CookieSettings settings;
net::CookieInclusionStatus status;
net::CookieSettingOverrides overrides(
{net::CookieSettingOverride::kForceDisableThirdPartyCookies,
net::CookieSettingOverride::kForceEnableThirdPartyCookieMitigations,
net::CookieSettingOverride::kSkipTPCDMetadataGrant});
settings.set_block_third_party_cookies(false);
network::tpcd::metadata::Manager manager;
manager.SetGrants({CreateSetting(kOtherURL, kURL, CONTENT_SETTING_ALLOW)});
settings.set_tpcd_metadata_manager(&manager);
std::unique_ptr<net::CanonicalCookie> cookie =
MakeCanonicalSameSiteNoneCookie("name", kOtherURL);
EXPECT_FALSE(settings.IsCookieAccessible(
*cookie, GURL(kOtherURL), net::SiteForCookies(),
url::Origin::Create(GURL(kURL)), net::FirstPartySetMetadata(), overrides,
&status));
EXPECT_TRUE(
status.HasExclusionReason(net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_THIRD_PARTY_PHASEOUT));
}
TEST_P(CookieSettingsTpcdMetadataGrantsTest,
AnnotateAndMoveUserBlockedCookies) {
CookieSettings settings;
net::CookieInclusionStatus status;
settings.set_block_third_party_cookies(true);
settings.set_mitigations_enabled_for_3pcd(true);
network::tpcd::metadata::Manager manager;
manager.SetGrants({CreateSetting(kOtherURL, kURL, CONTENT_SETTING_ALLOW)});
settings.set_tpcd_metadata_manager(&manager);
net::CookieAccessResultList maybe_included_cookies = {
{*MakeCanonicalSameSiteNoneCookie("third_party", kOtherURL), {}}};
net::CookieAccessResultList excluded_cookies = {
{*MakeCanonicalSameSiteNoneCookie("excluded_other", kOtherURL),
net::CookieAccessResult(
net::CookieInclusionStatus::MakeFromReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}))}};
url::Origin origin = url::Origin::Create(GURL(kURL));
EXPECT_EQ(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kOtherURL), net::SiteForCookies(), &origin,
net::FirstPartySetMetadata(), GetCookieSettingOverrides(),
maybe_included_cookies, excluded_cookies),
IsTpcdMetadataGrantEligible());
if (IsTpcdMetadataGrantEligible()) {
EXPECT_THAT(maybe_included_cookies,
ElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("third_party"),
MatchesCookieAccessResult(
AllOf(net::IsInclude(),
net::HasExactlyExemptionReason(
net::CookieInclusionStatus::ExemptionReason::
k3PCDMetadata)),
_, _, _))));
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("excluded_other"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}),
_, _, _))));
} else {
EXPECT_THAT(maybe_included_cookies, IsEmpty());
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("excluded_other"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY,
net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES}),
_, _, _)),
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("third_party"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_USER_PREFERENCES}),
_, _, _))));
}
}
TEST_P(CookieSettingsTpcdMetadataGrantsTest,
AnnotateAndMoveUserBlockedCookies_OverridesLimitTPC) {
CookieSettings settings;
net::CookieInclusionStatus status;
net::CookieSettingOverrides overrides(
{net::CookieSettingOverride::kForceDisableThirdPartyCookies,
net::CookieSettingOverride::kForceEnableThirdPartyCookieMitigations});
settings.set_block_third_party_cookies(false);
network::tpcd::metadata::Manager manager;
manager.SetGrants({CreateSetting(kOtherURL, kURL, CONTENT_SETTING_ALLOW)});
settings.set_tpcd_metadata_manager(&manager);
net::CookieAccessResultList maybe_included_cookies = {
{*MakeCanonicalSameSiteNoneCookie("third_party", kOtherURL), {}}};
net::CookieAccessResultList excluded_cookies = {
{*MakeCanonicalSameSiteNoneCookie("excluded_other", kOtherURL),
net::CookieAccessResult(
net::CookieInclusionStatus::MakeFromReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}))}};
url::Origin origin = url::Origin::Create(GURL(kURL));
EXPECT_EQ(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kOtherURL), net::SiteForCookies(), &origin,
net::FirstPartySetMetadata(), overrides, maybe_included_cookies,
excluded_cookies),
IsTpcdMetadataGrantEligible());
if (IsTpcdMetadataGrantEligible()) {
EXPECT_THAT(maybe_included_cookies,
ElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("third_party"),
MatchesCookieAccessResult(
AllOf(net::IsInclude(),
net::HasExactlyExemptionReason(
net::CookieInclusionStatus::ExemptionReason::
k3PCDMetadata)),
_, _, _))));
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName("excluded_other"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}),
_, _, _))));
} else {
EXPECT_THAT(maybe_included_cookies, IsEmpty());
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("excluded_other"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}),
_, _, _)),
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("third_party"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_THIRD_PARTY_PHASEOUT}),
_, _, _))));
}
}
TEST_P(CookieSettingsTpcdMetadataGrantsTest,
AnnotateAndMoveUserBlockedCookies_OverridesDisableMetadata) {
CookieSettings settings;
net::CookieInclusionStatus status;
net::CookieSettingOverrides overrides(
{net::CookieSettingOverride::kForceDisableThirdPartyCookies,
net::CookieSettingOverride::kForceEnableThirdPartyCookieMitigations,
net::CookieSettingOverride::kSkipTPCDMetadataGrant});
settings.set_block_third_party_cookies(false);
network::tpcd::metadata::Manager manager;
manager.SetGrants({CreateSetting(kOtherURL, kURL, CONTENT_SETTING_ALLOW)});
settings.set_tpcd_metadata_manager(&manager);
net::CookieAccessResultList maybe_included_cookies = {
{*MakeCanonicalSameSiteNoneCookie("third_party", kOtherURL), {}}};
net::CookieAccessResultList excluded_cookies = {
{*MakeCanonicalSameSiteNoneCookie("excluded_other", kOtherURL),
net::CookieAccessResult(
net::CookieInclusionStatus::MakeFromReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}))}};
url::Origin origin = url::Origin::Create(GURL(kURL));
EXPECT_FALSE(settings.AnnotateAndMoveUserBlockedCookies(
GURL(kOtherURL), net::SiteForCookies(), &origin,
net::FirstPartySetMetadata(), overrides, maybe_included_cookies,
excluded_cookies));
EXPECT_THAT(maybe_included_cookies, IsEmpty());
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("excluded_other"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_SECURE_ONLY}),
_, _, _)),
MatchesCookieWithAccessResult(
net::MatchesCookieWithName("third_party"),
MatchesCookieAccessResult(
net::HasExactlyExclusionReasonsForTesting(
{net::CookieInclusionStatus::ExclusionReason::
EXCLUDE_THIRD_PARTY_PHASEOUT}),
_, _, _))));
}
TEST_P(CookieSettingsTpcdMetadataGrantsTest, ExplicitSettingPreserved) {
GURL first_party_url = GURL(kURL);
GURL third_party_url = GURL(kOtherURL);
base::HistogramTester histogram_tester;
CookieSettings settings;
settings.set_block_third_party_cookies(true);
settings.set_mitigations_enabled_for_3pcd(true);
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", "*", CONTENT_SETTING_ALLOW)});
settings.set_content_settings(
ContentSettingsType::COOKIES,
{CreateSetting("*", first_party_url.GetHost(), CONTENT_SETTING_BLOCK)});
network::tpcd::metadata::Manager manager;
manager.SetGrants(
{CreateSetting(third_party_url.GetHost(), first_party_url.GetHost(),
CONTENT_SETTING_ALLOW)});
settings.set_tpcd_metadata_manager(&manager);
histogram_tester.ExpectTotalCount(kAllowedRequestsHistogram, 0);
EXPECT_EQ(settings.GetCookieSetting(third_party_url, net::SiteForCookies(),
first_party_url,
GetCookieSettingOverrides(), nullptr),
CONTENT_SETTING_BLOCK);
histogram_tester.ExpectUniqueSample(
kAllowedRequestsHistogram,
net::cookie_util::StorageAccessResult::ACCESS_BLOCKED, 1);
}
INSTANTIATE_TEST_SUITE_P(,
CookieSettingsTpcdMetadataGrantsTest,
testing::Bool());
struct CookieSettingsForceEnableOverrideTestData {
std::vector<ContentSettingsType> settings_types;
net::CookieSettingOverrides overrides;
bool cookie_access_allowed;
bool warning_reason_shown;
};
class CookieSettingsForceEnableOverrideTest
: public CookieSettingsTestBase,
public testing::WithParamInterface<
CookieSettingsForceEnableOverrideTestData> {
public:
CookieSettingsForceEnableOverrideTest() {
for (const auto& val : GetParam().settings_types) {
settings_.set_content_settings(
val, {CreateSetting(kOtherURL, kURL, CONTENT_SETTING_ALLOW)});
}
}
net::CookieSettingOverrides overrides() const { return GetParam().overrides; }
bool cookie_access_allowed() const {
return GetParam().cookie_access_allowed;
}
bool warning_reason_shown() const { return GetParam().warning_reason_shown; }
std::vector<ContentSettingsType> settings_types() const {
return GetParam().settings_types;
}
CookieSettings settings_;
};
INSTANTIATE_TEST_SUITE_P(
,
CookieSettingsForceEnableOverrideTest,
testing::ValuesIn(
{
CookieSettingsForceEnableOverrideTestData{
.settings_types = {},
.overrides = {},
.cookie_access_allowed = false,
.warning_reason_shown = false,
},
CookieSettingsForceEnableOverrideTestData{
.settings_types = {},
.overrides =
{net::CookieSettingOverride::kForceEnableThirdPartyCookies},
.cookie_access_allowed = true,
.warning_reason_shown = true,
},
warning*/
CookieSettingsForceEnableOverrideTestData{
.settings_types = {ContentSettingsType::COOKIES},
.overrides =
{net::CookieSettingOverride::kForceEnableThirdPartyCookies},
.cookie_access_allowed = true,
.warning_reason_shown = false,
}}));
TEST_P(CookieSettingsForceEnableOverrideTest, IsCookieAccessible) {
settings_.set_tracking_protection_enabled_for_3pcd(true);
std::unique_ptr<net::CanonicalCookie> cookie =
MakeCanonicalSameSiteNoneCookie(kCookieName, kOtherURL);
net::CookieInclusionStatus status;
EXPECT_EQ(settings_.IsCookieAccessible(
*cookie, GURL(kOtherURL), net::SiteForCookies(),
url::Origin::Create(GURL(kURL)), net::FirstPartySetMetadata(),
overrides(), &status),
cookie_access_allowed());
EXPECT_EQ(
status.HasWarningReason(
net::CookieInclusionStatus::WarningReason::WARN_THIRD_PARTY_PHASEOUT),
warning_reason_shown());
}
TEST_P(CookieSettingsForceEnableOverrideTest,
AnnotateAndMoveUserBlockedCookies) {
settings_.set_tracking_protection_enabled_for_3pcd(true);
net::CookieAccessResultList maybe_included_cookies = {
{*MakeCanonicalSameSiteNoneCookie(kCookieName, kOtherURL)}};
net::CookieAccessResultList excluded_cookies = {};
ASSERT_EQ(settings_.AnnotateAndMoveUserBlockedCookies(
GURL(kOtherURL), net::SiteForCookies(),
url::Origin::Create(GURL(kURL)), net::FirstPartySetMetadata(),
overrides(), maybe_included_cookies, excluded_cookies),
cookie_access_allowed());
if (cookie_access_allowed()) {
EXPECT_THAT(
maybe_included_cookies,
UnorderedElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName(kCookieName),
MatchesCookieAccessResult(
AllOf(
net::IsInclude(),
net::HasExactlyWarningReasonsForTesting(
warning_reason_shown()
? net::CookieInclusionStatus::
WarningReasonBitset{net::CookieInclusionStatus::
WarningReason::
WARN_THIRD_PARTY_PHASEOUT}
: net::CookieInclusionStatus::
WarningReasonBitset{}),
net::HasExactlyExemptionReason(
net::CookieInclusionStatus::ExemptionReason::kNone)),
_, _, _))));
EXPECT_THAT(excluded_cookies, IsEmpty());
} else {
EXPECT_THAT(maybe_included_cookies, IsEmpty());
EXPECT_THAT(excluded_cookies,
UnorderedElementsAre(MatchesCookieWithAccessResult(
net::MatchesCookieWithName(kCookieName), _)));
}
}
}
}