blob: e8a65b6fe54717ece13c3284d2ef95f5a0c24565 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/base/isolation_info.h"
#include <iostream>
#include "base/test/scoped_feature_list.h"
#include "base/unguessable_token.h"
#include "isolation_info.h"
#include "net/base/features.h"
#include "net/base/network_anonymization_key.h"
#include "net/base/network_isolation_key.h"
#include "net/base/schemeful_site.h"
#include "net/cookies/site_for_cookies.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "url/gurl.h"
#include "url/origin.h"
#include "url/url_util.h"
namespace net {
// `IsolationInfoEnabledFeatureFlagsTestingParam ` allows enabling and disabling
// the feature flags that control the key schemes for IsolationInfo,
// NetworkIsolationKey and Network AnonymizationKey. This allows us to test the
// possible combinations of flags that will be allowed for experimentation.
// Those possible combinations are outlined below. When a property is `true` the
// flag that enables this scheme will be enabled for testing. When the bool
// parameter is `false` the flag that enables the scheme will be disabled.
struct IsolationInfoEnabledFeatureFlagsTestingParam {
const bool enableDoubleKeyNetworkAnonymizationKey;
const bool enableDoubleKeyIsolationInfo;
const bool enableDoubleKeyAndCrossSiteBitNetworkAnonymizationKey;
};
// The three cases we need to account for:
// 0. Triple-keying is enabled for both IsolationInfo and
// NetworkAnonymizationKey.
// 1. Double-keying is enabled for both IsolationInfo and
// NetworkAnonymizationKey.
// 2. Triple-keying is enabled for IsolationInfo and double-keying is enabled
// for NetworkAnonymizationKey.
// 3. Triple-keying is enabled for IsolationInfo and double-keying +
// cross-site-bit is enabled for NetworkAnonymizationKey.
// Note: At the current time double-keyed IsolationInfo is only supported when
// double-keying or double-keying + is cross site bit are enabled for
// NetworkAnonymizationKey.
const IsolationInfoEnabledFeatureFlagsTestingParam kFlagsParam[] = {
{/*enableDoubleKeyNetworkAnonymizationKey=*/false,
/*enableDoubleKeyIsolationInfo=*/false,
/*enableDoubleKeyAndCrossSiteBitNetworkAnonymizationKey=*/false},
{/*enableDoubleKeyNetworkAnonymizationKey=*/true,
/*enableDoubleKeyIsolationInfo=*/true,
/*enableDoubleKeyAndCrossSiteBitNetworkAnonymizationKey=*/false},
{/*enableDoubleKeyNetworkAnonymizationKey=*/true,
/*enableDoubleKeyIsolationInfo=*/false,
/*enableDoubleKeyAndCrossSiteBitNetworkAnonymizationKey=*/false},
{/*enableDoubleKeyNetworkAnonymizationKey=*/false,
/*enableDoubleKeyIsolationInfo=*/false,
/*enableDoubleKeyAndCrossSiteBitNetworkAnonymizationKey=*/true}};
namespace {
class IsolationInfoTest : public testing::Test,
public testing::WithParamInterface<
IsolationInfoEnabledFeatureFlagsTestingParam> {
public:
IsolationInfoTest() {
std::vector<base::Feature> enabled_features = {};
std::vector<base::Feature> disabled_features = {};
if (IsDoubleKeyIsolationInfoEnabled()) {
enabled_features.push_back(
net::features::kForceIsolationInfoFrameOriginToTopLevelFrame);
} else {
disabled_features.push_back(
net::features::kForceIsolationInfoFrameOriginToTopLevelFrame);
}
if (IsDoubleKeyNetworkAnonymizationKeyEnabled()) {
enabled_features.push_back(
net::features::kEnableDoubleKeyNetworkAnonymizationKey);
} else {
disabled_features.push_back(
net::features::kEnableDoubleKeyNetworkAnonymizationKey);
}
if (IsDoubleKeyAndCrossSiteBitNetworkAnonymizationKeyEnabled()) {
enabled_features.push_back(
net::features::kEnableCrossSiteFlagNetworkAnonymizationKey);
} else {
disabled_features.push_back(
net::features::kEnableCrossSiteFlagNetworkAnonymizationKey);
}
scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features);
}
static bool IsDoubleKeyIsolationInfoEnabled() {
return GetParam().enableDoubleKeyIsolationInfo;
}
static bool IsDoubleKeyNetworkAnonymizationKeyEnabled() {
return GetParam().enableDoubleKeyNetworkAnonymizationKey;
}
static bool IsDoubleKeyAndCrossSiteBitNetworkAnonymizationKeyEnabled() {
return GetParam().enableDoubleKeyAndCrossSiteBitNetworkAnonymizationKey;
}
const url::Origin kOrigin1 = url::Origin::Create(GURL("https://a.foo.test"));
const url::Origin kSite1 = url::Origin::Create(GURL("https://foo.test"));
const url::Origin kOrigin2 = url::Origin::Create(GURL("https://b.bar.test"));
const url::Origin kSite2 = url::Origin::Create(GURL("https://bar.test"));
const url::Origin kOrigin3 = url::Origin::Create(GURL("https://c.baz.test"));
const url::Origin kOpaqueOrigin;
const absl::optional<std::set<net::SchemefulSite>> kPartyContextNull =
absl::nullopt;
const absl::optional<std::set<net::SchemefulSite>> kPartyContextEmpty =
std::set<net::SchemefulSite>();
const absl::optional<std::set<net::SchemefulSite>> kPartyContext1 =
std::set<net::SchemefulSite>{net::SchemefulSite(kOrigin1)};
const absl::optional<std::set<net::SchemefulSite>> kPartyContext2 =
std::set<net::SchemefulSite>{net::SchemefulSite(kOrigin2)};
const absl::optional<std::set<net::SchemefulSite>> kPartyContext3 =
std::set<net::SchemefulSite>{net::SchemefulSite(kOrigin3)};
const absl::optional<std::set<net::SchemefulSite>> kPartyContextMultiple =
std::set<net::SchemefulSite>{net::SchemefulSite(kOrigin1),
net::SchemefulSite(kOrigin2)};
const base::UnguessableToken kNonce1 = base::UnguessableToken::Create();
const base::UnguessableToken kNonce2 = base::UnguessableToken::Create();
private:
base::test::ScopedFeatureList scoped_feature_list_;
};
INSTANTIATE_TEST_SUITE_P(All,
IsolationInfoTest,
/*IsolationInfoEnabledFeatureFlagsTestingParam */
testing::ValuesIn(kFlagsParam));
void DuplicateAndCompare(const IsolationInfo& isolation_info) {
absl::optional<IsolationInfo> duplicate_isolation_info =
IsolationInfo::CreateIfConsistent(
isolation_info.request_type(), isolation_info.top_frame_origin(),
net::IsolationInfo::IsFrameSiteEnabled()
? isolation_info.frame_origin()
: absl::nullopt,
isolation_info.site_for_cookies(), isolation_info.party_context(),
isolation_info.nonce().has_value() ? &isolation_info.nonce().value()
: nullptr);
ASSERT_TRUE(duplicate_isolation_info);
EXPECT_TRUE(isolation_info.IsEqualForTesting(*duplicate_isolation_info));
}
TEST_P(IsolationInfoTest, IsFrameSiteEnabled) {
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_FALSE(IsolationInfo::IsFrameSiteEnabled());
} else {
EXPECT_TRUE(IsolationInfo::IsFrameSiteEnabled());
}
}
TEST_P(IsolationInfoTest, CreateNetworkAnonymizationKeyForIsolationInfo) {
IsolationInfo isolation_info = IsolationInfo::Create(
IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin2,
SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty, &kNonce1);
NetworkAnonymizationKey nak =
isolation_info.CreateNetworkAnonymizationKeyForIsolationInfo(
kOrigin1, kOrigin2, &kNonce1);
IsolationInfo same_site_isolation_info = IsolationInfo::Create(
IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty, &kNonce1);
// Top frame should be populated regardless of scheme.
EXPECT_EQ(nak.GetTopFrameSite(), SchemefulSite(kOrigin1));
EXPECT_EQ(isolation_info.top_frame_origin(), kOrigin1);
EXPECT_EQ(isolation_info.network_anonymization_key().GetTopFrameSite(),
SchemefulSite(kOrigin1));
// Nonce should be empty regardless of scheme
EXPECT_EQ(nak.GetNonce().value(), kNonce1);
EXPECT_EQ(isolation_info.network_anonymization_key().GetNonce().value(),
kNonce1);
EXPECT_EQ(isolation_info.nonce().value(), kNonce1);
if (IsDoubleKeyNetworkAnonymizationKeyEnabled() &&
!IsDoubleKeyAndCrossSiteBitNetworkAnonymizationKeyEnabled() &&
IsDoubleKeyIsolationInfoEnabled()) {
// Double-keyed IsolationInfo + double-keyed NetworkAnonymizationKey case.
EXPECT_DEATH_IF_SUPPORTED(nak.GetFrameSite(), "");
EXPECT_EQ(absl::nullopt, nak.GetFrameSiteForTesting());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt, isolation_info.frame_origin_for_testing());
EXPECT_DEATH_IF_SUPPORTED(
isolation_info.network_anonymization_key().GetFrameSite(), "");
EXPECT_EQ(
absl::nullopt,
isolation_info.network_anonymization_key().GetFrameSiteForTesting());
EXPECT_DEATH_IF_SUPPORTED(
isolation_info.network_anonymization_key().GetIsCrossSite(), "");
} else if (!IsDoubleKeyIsolationInfoEnabled() &&
!IsDoubleKeyAndCrossSiteBitNetworkAnonymizationKeyEnabled() &&
IsDoubleKeyNetworkAnonymizationKeyEnabled()) {
// Triple-keyed IsolationInfo + double-keyed NetworkAnonymizationKey case.
EXPECT_DEATH_IF_SUPPORTED(nak.GetFrameSite(), "");
EXPECT_EQ(absl::nullopt, nak.GetFrameSiteForTesting());
EXPECT_DEATH_IF_SUPPORTED(
isolation_info.network_anonymization_key().GetFrameSite(), "");
EXPECT_EQ(
absl::nullopt,
isolation_info.network_anonymization_key().GetFrameSiteForTesting());
EXPECT_EQ(isolation_info.frame_origin(), kOrigin2);
EXPECT_DEATH_IF_SUPPORTED(
isolation_info.network_anonymization_key().GetIsCrossSite(), "");
} else if (!IsDoubleKeyIsolationInfoEnabled() &&
!IsDoubleKeyAndCrossSiteBitNetworkAnonymizationKeyEnabled() &&
!IsDoubleKeyNetworkAnonymizationKeyEnabled()) {
// Triple-keyed IsolationInfo + triple-keyed NetworkAnonymizationKey case.
EXPECT_EQ(nak.GetFrameSite(), net::SchemefulSite(kOrigin2));
EXPECT_EQ(isolation_info.network_anonymization_key().GetFrameSite(),
net::SchemefulSite(kOrigin2));
EXPECT_EQ(isolation_info.frame_origin(), kOrigin2);
EXPECT_DEATH_IF_SUPPORTED(
isolation_info.network_anonymization_key().GetIsCrossSite(), "");
} else if (!IsDoubleKeyIsolationInfoEnabled() &&
IsDoubleKeyAndCrossSiteBitNetworkAnonymizationKeyEnabled() &&
!IsDoubleKeyNetworkAnonymizationKeyEnabled()) {
// Triple-keyed IsolationInfo + double-keyed + cross site bit
// NetworkAnonymizationKey case.
EXPECT_DEATH_IF_SUPPORTED(nak.GetFrameSite(), "");
EXPECT_EQ(absl::nullopt, nak.GetFrameSiteForTesting());
EXPECT_DEATH_IF_SUPPORTED(
isolation_info.network_anonymization_key().GetFrameSite(), "");
EXPECT_EQ(
absl::nullopt,
isolation_info.network_anonymization_key().GetFrameSiteForTesting());
EXPECT_EQ(isolation_info.frame_origin(), kOrigin2);
EXPECT_EQ(isolation_info.network_anonymization_key().GetIsCrossSite(),
true);
EXPECT_EQ(
same_site_isolation_info.network_anonymization_key().GetIsCrossSite(),
false);
}
}
TEST_P(IsolationInfoTest, CreateDoubleKey) {
IsolationInfo isolation_info = IsolationInfo::Create(
IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty);
if (IsDoubleKeyIsolationInfoEnabled()) {
IsolationInfo double_key_isolation_info = IsolationInfo::CreateDoubleKey(
IsolationInfo::RequestType::kMainFrame, kOrigin1,
SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty);
EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
double_key_isolation_info.request_type());
EXPECT_EQ(kOrigin1, double_key_isolation_info.top_frame_origin());
EXPECT_DEATH_IF_SUPPORTED(double_key_isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt,
double_key_isolation_info.frame_origin_for_testing());
EXPECT_EQ(
"https://foo.test https://foo.test",
double_key_isolation_info.network_isolation_key().ToCacheKeyString());
EXPECT_EQ(kPartyContextEmpty, double_key_isolation_info.party_context());
EXPECT_FALSE(double_key_isolation_info.nonce().has_value());
// When double keying is enabled Create and CreateDoubleKey should
// create the same key.
EXPECT_EQ(isolation_info.top_frame_origin(),
double_key_isolation_info.top_frame_origin());
EXPECT_EQ(isolation_info.request_type(),
double_key_isolation_info.request_type());
EXPECT_EQ(isolation_info.network_isolation_key(),
double_key_isolation_info.network_isolation_key());
EXPECT_EQ(isolation_info.party_context(),
double_key_isolation_info.party_context());
EXPECT_EQ(isolation_info.nonce(), double_key_isolation_info.nonce());
} else {
// Creating double keyed IsolationInfos is not allowed when frame site is
// enabled.
EXPECT_DEATH_IF_SUPPORTED(
IsolationInfo::CreateDoubleKey(
IsolationInfo::RequestType::kMainFrame, kOrigin1,
SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty),
"");
}
}
TEST_P(IsolationInfoTest, RequestTypeMainFrame) {
IsolationInfo isolation_info = IsolationInfo::Create(
IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty);
EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
isolation_info.request_type());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt, isolation_info.frame_origin_for_testing());
EXPECT_EQ("https://foo.test https://foo.test",
isolation_info.network_isolation_key().ToCacheKeyString());
} else {
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
EXPECT_EQ("https://foo.test https://foo.test",
isolation_info.network_isolation_key().ToCacheKeyString());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
EXPECT_TRUE(
isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
EXPECT_FALSE(isolation_info.nonce().has_value());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
redirected_isolation_info.request_type());
EXPECT_EQ(kOrigin3, redirected_isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(redirected_isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt,
redirected_isolation_info.frame_origin_for_testing());
} else {
EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
}
EXPECT_TRUE(
redirected_isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(redirected_isolation_info.network_isolation_key().IsTransient());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_EQ(
"https://baz.test https://baz.test",
redirected_isolation_info.network_isolation_key().ToCacheKeyString());
} else {
EXPECT_EQ(
"https://baz.test https://baz.test",
redirected_isolation_info.network_isolation_key().ToCacheKeyString());
}
EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
kOrigin3.GetURL()));
EXPECT_EQ(kPartyContextEmpty, redirected_isolation_info.party_context());
EXPECT_FALSE(redirected_isolation_info.nonce().has_value());
}
TEST_P(IsolationInfoTest, RequestTypeSubFrame) {
IsolationInfo isolation_info = IsolationInfo::Create(
IsolationInfo::RequestType::kSubFrame, kOrigin1, kOrigin2,
SiteForCookies::FromOrigin(kOrigin1), kPartyContext1);
EXPECT_EQ(IsolationInfo::RequestType::kSubFrame,
isolation_info.request_type());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt, isolation_info.frame_origin_for_testing());
EXPECT_EQ("https://foo.test https://foo.test",
isolation_info.network_isolation_key().ToCacheKeyString());
} else {
EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
EXPECT_EQ("https://foo.test https://bar.test",
isolation_info.network_isolation_key().ToCacheKeyString());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
EXPECT_TRUE(
isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
EXPECT_EQ(kPartyContext1, isolation_info.party_context());
EXPECT_FALSE(isolation_info.nonce().has_value());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_EQ(IsolationInfo::RequestType::kSubFrame,
redirected_isolation_info.request_type());
EXPECT_EQ(kOrigin1, redirected_isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(redirected_isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt,
redirected_isolation_info.frame_origin_for_testing());
EXPECT_EQ(
"https://foo.test https://foo.test",
redirected_isolation_info.network_isolation_key().ToCacheKeyString());
} else {
EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
EXPECT_EQ(
"https://foo.test https://baz.test",
redirected_isolation_info.network_isolation_key().ToCacheKeyString());
}
EXPECT_TRUE(
redirected_isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(redirected_isolation_info.network_isolation_key().IsTransient());
EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
kOrigin1.GetURL()));
EXPECT_EQ(kPartyContext1, isolation_info.party_context());
EXPECT_FALSE(redirected_isolation_info.nonce().has_value());
}
TEST_P(IsolationInfoTest, RequestTypeMainFrameWithNonce) {
IsolationInfo isolation_info = IsolationInfo::Create(
IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty, &kNonce1);
EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
isolation_info.request_type());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt, isolation_info.frame_origin_for_testing());
} else {
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_TRUE(isolation_info.network_isolation_key().IsTransient());
EXPECT_EQ(absl::nullopt,
isolation_info.network_isolation_key().ToCacheKeyString());
EXPECT_TRUE(
isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
EXPECT_EQ(kNonce1, isolation_info.nonce().value());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
redirected_isolation_info.request_type());
EXPECT_EQ(kOrigin3, redirected_isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(redirected_isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt,
redirected_isolation_info.frame_origin_for_testing());
} else {
EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
}
EXPECT_TRUE(
redirected_isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_TRUE(redirected_isolation_info.network_isolation_key().IsTransient());
EXPECT_EQ(
absl::nullopt,
redirected_isolation_info.network_isolation_key().ToCacheKeyString());
EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
kOrigin3.GetURL()));
EXPECT_EQ(kPartyContextEmpty, redirected_isolation_info.party_context());
EXPECT_EQ(kNonce1, redirected_isolation_info.nonce().value());
}
TEST_P(IsolationInfoTest, RequestTypeSubFrameWithNonce) {
IsolationInfo isolation_info = IsolationInfo::Create(
IsolationInfo::RequestType::kSubFrame, kOrigin1, kOrigin2,
SiteForCookies::FromOrigin(kOrigin1), kPartyContext1, &kNonce1);
EXPECT_EQ(IsolationInfo::RequestType::kSubFrame,
isolation_info.request_type());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt, isolation_info.frame_origin_for_testing());
} else {
EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_TRUE(isolation_info.network_isolation_key().IsTransient());
EXPECT_EQ(absl::nullopt,
isolation_info.network_isolation_key().ToCacheKeyString());
EXPECT_TRUE(
isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
EXPECT_EQ(kPartyContext1, isolation_info.party_context());
EXPECT_EQ(kNonce1, isolation_info.nonce().value());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_EQ(IsolationInfo::RequestType::kSubFrame,
redirected_isolation_info.request_type());
EXPECT_EQ(kOrigin1, redirected_isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(redirected_isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt,
redirected_isolation_info.frame_origin_for_testing());
} else {
EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
}
EXPECT_TRUE(
redirected_isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_TRUE(redirected_isolation_info.network_isolation_key().IsTransient());
EXPECT_EQ(
absl::nullopt,
redirected_isolation_info.network_isolation_key().ToCacheKeyString());
EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
kOrigin1.GetURL()));
EXPECT_EQ(kPartyContext1, redirected_isolation_info.party_context());
EXPECT_EQ(kNonce1, redirected_isolation_info.nonce().value());
}
TEST_P(IsolationInfoTest, RequestTypeOther) {
IsolationInfo isolation_info;
EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
EXPECT_FALSE(isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_FALSE(isolation_info.frame_origin_for_testing());
} else {
EXPECT_FALSE(isolation_info.frame_origin());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsEmpty());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_FALSE(isolation_info.party_context());
EXPECT_FALSE(isolation_info.nonce());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
}
TEST_P(IsolationInfoTest, RequestTypeOtherWithSiteForCookies) {
IsolationInfo isolation_info = IsolationInfo::Create(
IsolationInfo::RequestType::kOther, kOrigin1, kOrigin1,
SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty);
EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt, isolation_info.frame_origin_for_testing());
EXPECT_EQ("https://foo.test https://foo.test",
isolation_info.network_isolation_key().ToCacheKeyString());
} else {
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
EXPECT_EQ("https://foo.test https://foo.test",
isolation_info.network_isolation_key().ToCacheKeyString());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
EXPECT_TRUE(
isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
EXPECT_FALSE(isolation_info.nonce());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
}
// Test case of a subresource for cross-site subframe (which has an empty
// site-for-cookies).
TEST_P(IsolationInfoTest, RequestTypeOtherWithEmptySiteForCookies) {
IsolationInfo isolation_info =
IsolationInfo::Create(IsolationInfo::RequestType::kOther, kOrigin1,
kOrigin2, SiteForCookies(), kPartyContext2);
EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt, isolation_info.frame_origin_for_testing());
EXPECT_EQ("https://foo.test https://foo.test",
isolation_info.network_isolation_key().ToCacheKeyString());
} else {
EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
EXPECT_EQ("https://foo.test https://bar.test",
isolation_info.network_isolation_key().ToCacheKeyString());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_EQ(kPartyContext2, isolation_info.party_context());
EXPECT_FALSE(isolation_info.nonce());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
}
TEST_P(IsolationInfoTest, CreateTransient) {
IsolationInfo isolation_info = IsolationInfo::CreateTransient();
EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
EXPECT_TRUE(isolation_info.top_frame_origin()->opaque());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_FALSE(isolation_info.frame_origin_for_testing().has_value());
} else {
EXPECT_TRUE(isolation_info.frame_origin()->opaque());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_TRUE(isolation_info.network_isolation_key().IsTransient());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_FALSE(isolation_info.party_context());
EXPECT_FALSE(isolation_info.nonce());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
}
TEST_P(IsolationInfoTest, CreateForInternalRequest) {
IsolationInfo isolation_info =
IsolationInfo::CreateForInternalRequest(kOrigin1);
EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt, isolation_info.frame_origin_for_testing());
EXPECT_EQ("https://foo.test https://foo.test",
isolation_info.network_isolation_key().ToCacheKeyString());
} else {
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
EXPECT_EQ("https://foo.test https://foo.test",
isolation_info.network_isolation_key().ToCacheKeyString());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
EXPECT_TRUE(
isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
EXPECT_FALSE(isolation_info.nonce());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
}
TEST_P(IsolationInfoTest, CreatePartialUpdateTopFrame) {
const NetworkIsolationKey kNIK{SchemefulSite(kOrigin1),
SchemefulSite(kOrigin1)};
IsolationInfo isolation_info = IsolationInfo::CreatePartial(
IsolationInfo::RequestType::kMainFrame, kNIK);
EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
isolation_info.request_type());
EXPECT_EQ(kSite1, isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt, isolation_info.frame_origin_for_testing());
} else {
EXPECT_EQ(kSite1, isolation_info.frame_origin());
}
EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_FALSE(isolation_info.party_context());
EXPECT_FALSE(isolation_info.nonce());
DuplicateAndCompare(isolation_info);
}
TEST_P(IsolationInfoTest, CreatePartialUpdateFrameOnly) {
const NetworkIsolationKey kNIK{SchemefulSite(kOrigin1),
SchemefulSite(kOrigin2)};
IsolationInfo isolation_info =
IsolationInfo::CreatePartial(IsolationInfo::RequestType::kSubFrame, kNIK);
EXPECT_EQ(IsolationInfo::RequestType::kSubFrame,
isolation_info.request_type());
EXPECT_EQ(kSite1, isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt, isolation_info.frame_origin_for_testing());
} else {
EXPECT_EQ(kSite2, isolation_info.frame_origin());
}
EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_FALSE(isolation_info.party_context());
EXPECT_FALSE(isolation_info.nonce());
DuplicateAndCompare(isolation_info);
}
TEST_P(IsolationInfoTest, CreatePartialUpdateNothing) {
const NetworkIsolationKey kNIK{SchemefulSite(kOrigin1),
SchemefulSite(kOrigin2)};
IsolationInfo isolation_info =
IsolationInfo::CreatePartial(IsolationInfo::RequestType::kOther, kNIK);
EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
EXPECT_EQ(kSite1, isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt, isolation_info.frame_origin_for_testing());
} else {
EXPECT_EQ(kSite2, isolation_info.frame_origin());
}
EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_FALSE(isolation_info.party_context());
EXPECT_FALSE(isolation_info.nonce());
DuplicateAndCompare(isolation_info);
}
TEST_P(IsolationInfoTest, CreatePartialTransient) {
const NetworkIsolationKey kNIK = NetworkIsolationKey::CreateTransient();
IsolationInfo isolation_info =
IsolationInfo::CreatePartial(IsolationInfo::RequestType::kOther, kNIK);
EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
EXPECT_EQ(kNIK.GetTopFrameSite(),
SchemefulSite(*isolation_info.top_frame_origin()));
EXPECT_EQ(kNIK.GetTopFrameSite(),
isolation_info.network_anonymization_key().GetTopFrameSite());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(kNIK.GetFrameSite(), "");
EXPECT_EQ(kNIK.GetFrameSiteForTesting(), absl::nullopt);
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_EQ(isolation_info.frame_origin_for_testing(), absl::nullopt);
} else {
EXPECT_EQ(kNIK.GetFrameSite(),
SchemefulSite(*isolation_info.frame_origin()));
}
EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_FALSE(isolation_info.party_context());
EXPECT_FALSE(isolation_info.nonce());
DuplicateAndCompare(isolation_info);
}
TEST_P(IsolationInfoTest, CreatePartialEmpty) {
IsolationInfo isolation_info = IsolationInfo::CreatePartial(
IsolationInfo::RequestType::kOther, NetworkIsolationKey());
EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
EXPECT_FALSE(isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_FALSE(isolation_info.frame_origin_for_testing());
} else {
EXPECT_FALSE(isolation_info.frame_origin());
}
EXPECT_EQ(NetworkIsolationKey(), isolation_info.network_isolation_key());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_FALSE(isolation_info.party_context());
EXPECT_FALSE(isolation_info.nonce());
DuplicateAndCompare(isolation_info);
}
// Test that in the UpdateNothing case, the SiteForCookies does not have to
// match the frame origin, unlike in the HTTP/HTTPS case.
TEST_P(IsolationInfoTest, CustomSchemeRequestTypeOther) {
// Have to register the scheme, or url::Origin::Create() will return an
// opaque origin.
url::ScopedSchemeRegistryForTests scoped_registry;
url::AddStandardScheme("foo", url::SCHEME_WITH_HOST);
const GURL kCustomOriginUrl = GURL("foo://a.foo.com");
const url::Origin kCustomOrigin = url::Origin::Create(kCustomOriginUrl);
IsolationInfo isolation_info = IsolationInfo::Create(
IsolationInfo::RequestType::kOther, kCustomOrigin, kOrigin1,
SiteForCookies::FromOrigin(kCustomOrigin), kPartyContext1);
EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
EXPECT_EQ(kCustomOrigin, isolation_info.top_frame_origin());
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_DEATH_IF_SUPPORTED(isolation_info.frame_origin(), "");
EXPECT_EQ(absl::nullopt, isolation_info.frame_origin_for_testing());
EXPECT_EQ("foo://a.foo.com foo://a.foo.com",
isolation_info.network_isolation_key().ToCacheKeyString());
} else {
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
EXPECT_EQ("foo://a.foo.com https://foo.test",
isolation_info.network_isolation_key().ToCacheKeyString());
}
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
EXPECT_TRUE(isolation_info.site_for_cookies().IsFirstParty(kCustomOriginUrl));
EXPECT_EQ(kPartyContext1, isolation_info.party_context());
EXPECT_FALSE(isolation_info.nonce());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin2);
EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
}
// Success cases are covered by other tests, so only need a separate test to
// cover the failure cases.
TEST_P(IsolationInfoTest, CreateIfConsistentFails) {
// Main frames with inconsistent SiteForCookies.
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
SiteForCookies::FromOrigin(kOrigin2)));
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kMainFrame, kOpaqueOrigin, kOpaqueOrigin,
SiteForCookies::FromOrigin(kOrigin1)));
// Sub frame with inconsistent SiteForCookies.
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kSubFrame, kOrigin1, kOrigin2,
SiteForCookies::FromOrigin(kOrigin2)));
// Sub resources with inconsistent SiteForCookies.
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kOther, kOrigin1, kOrigin2,
SiteForCookies::FromOrigin(kOrigin2)));
// Correctly have empty/non-empty origins:
EXPECT_TRUE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kOther, absl::nullopt, absl::nullopt,
SiteForCookies()));
// Incorrectly have empty/non-empty origins:
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kOther, absl::nullopt, kOrigin1,
SiteForCookies()));
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kSubFrame, absl::nullopt, kOrigin2,
SiteForCookies()));
// Empty frame origins are ok when double keying is enabled but incorrect
// when triple key is enabled.
if (IsDoubleKeyIsolationInfoEnabled()) {
EXPECT_TRUE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kOther, kOrigin1, absl::nullopt,
SiteForCookies()));
EXPECT_TRUE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kSubFrame, kOrigin1, absl::nullopt,
SiteForCookies()));
EXPECT_TRUE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kMainFrame, kOrigin1, absl::nullopt,
SiteForCookies::FromOrigin(kOrigin1)));
} else {
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kOther, kOrigin1, absl::nullopt,
SiteForCookies()));
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kSubFrame, kOrigin1, absl::nullopt,
SiteForCookies()));
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kMainFrame, kOrigin1, absl::nullopt,
SiteForCookies::FromOrigin(kOrigin1)));
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kOther, kOrigin1, kOrigin2,
SiteForCookies::FromOrigin(kOrigin1)));
}
// No origins with non-null SiteForCookies.
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kOther, absl::nullopt, absl::nullopt,
SiteForCookies::FromOrigin(kOrigin1)));
// No origins with non-null party_context.
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kOther, absl::nullopt, absl::nullopt,
SiteForCookies(), kPartyContextEmpty));
// No origins with non-null nonce.
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RequestType::kOther, absl::nullopt, absl::nullopt,
SiteForCookies(), absl::nullopt /* party_context */, &kNonce1));
}
TEST_P(IsolationInfoTest, CreateForRedirectPartyContext) {
// RequestTypeMainFrame, PartyContext is empty
{
IsolationInfo isolation_info = IsolationInfo::Create(
IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_EQ(kPartyContextEmpty, redirected_isolation_info.party_context());
}
// RequestTypeSubFrame, PartyContext is empty
{
IsolationInfo isolation_info = IsolationInfo::Create(
IsolationInfo::RequestType::kSubFrame, kOrigin1, kOrigin2,
SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_EQ(kPartyContextEmpty, redirected_isolation_info.party_context());
}
// RequestTypeSubFrame, PartyContext not empty
{
IsolationInfo isolation_info = IsolationInfo::Create(
IsolationInfo::RequestType::kSubFrame, kOrigin1, kOrigin2,
SiteForCookies::FromOrigin(kOrigin1), kPartyContext1);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_EQ(kPartyContext1, redirected_isolation_info.party_context());
}
// RequestTypeOther, PartyContext not empty
{
IsolationInfo isolation_info =
IsolationInfo::Create(IsolationInfo::RequestType::kOther, kOrigin1,
kOrigin2, SiteForCookies(), kPartyContext2);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_EQ(kPartyContext2, redirected_isolation_info.party_context());
}
}
TEST_P(IsolationInfoTest, Serialization) {
EXPECT_FALSE(IsolationInfo::Deserialize(""));
EXPECT_FALSE(IsolationInfo::Deserialize("garbage"));
const IsolationInfo kPositiveTestCases[] = {
IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
kOrigin2, SiteForCookies::FromOrigin(kOrigin1),
kPartyContext1),
// Null party context
IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
kOrigin2, SiteForCookies::FromOrigin(kOrigin1),
kPartyContextNull),
// Empty party context
IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
kOrigin2, SiteForCookies::FromOrigin(kOrigin1),
kPartyContextEmpty),
// Multiple party context entries.
IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
kOrigin2, SiteForCookies::FromOrigin(kOrigin1),
kPartyContextMultiple),
// Without SiteForCookies
IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
kOrigin2, SiteForCookies(), absl::nullopt),
// Request type kOther
IsolationInfo::Create(IsolationInfo::RequestType::kOther, kOrigin1,
kOrigin1, SiteForCookies::FromOrigin(kOrigin1),
absl::nullopt),
// Request type kMainframe
IsolationInfo::Create(IsolationInfo::RequestType::kMainFrame, kOrigin1,
kOrigin1, SiteForCookies::FromOrigin(kOrigin1),
absl::nullopt),
};
for (const auto& info : kPositiveTestCases) {
auto rt = IsolationInfo::Deserialize(info.Serialize());
ASSERT_TRUE(rt);
EXPECT_TRUE(rt->IsEqualForTesting(info));
}
const IsolationInfo kNegativeTestCases[] = {
IsolationInfo::CreateTransient(),
// With nonce (i.e transient).
IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
kOrigin2, SiteForCookies::FromOrigin(kOrigin1),
kPartyContext1, &kNonce1),
// With an opaque origin (i.e transient)
IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
url::Origin(), SiteForCookies::FromOrigin(kOrigin1),
absl::nullopt),
};
const IsolationInfo kNegativeWhenDoubleKeyEnabledTestCases[] = {
IsolationInfo::CreateTransient(),
// With nonce (i.e transient).
IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
kOrigin2, SiteForCookies::FromOrigin(kOrigin1),
kPartyContext1, &kNonce1),
};
if (IsDoubleKeyIsolationInfoEnabled()) {
for (const auto& info : kNegativeWhenDoubleKeyEnabledTestCases) {
EXPECT_TRUE(info.Serialize().empty());
}
} else {
for (const auto& info : kNegativeTestCases) {
EXPECT_TRUE(info.Serialize().empty());
}
}
}
} // namespace
} // namespace net