123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791 |
- // 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 <optional>
- #include "base/test/scoped_feature_list.h"
- #include "base/unguessable_token.h"
- #include "net/base/features.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 {
- namespace {
- class IsolationInfoTest : public testing::Test,
- public testing::WithParamInterface<bool> {
- public:
- IsolationInfoTest() {
- if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- scoped_feature_list_.InitAndEnableFeature(
- net::features::kForceIsolationInfoFrameOriginToTopLevelFrame);
- } else {
- scoped_feature_list_.InitAndDisableFeature(
- net::features::kForceIsolationInfoFrameOriginToTopLevelFrame);
- }
- }
- static bool ForceIsolationInfoFrameOriginToTopLevelFrameEnabled() {
- return GetParam();
- }
- 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,
- /*force_isolation_info_frame_origin_to_top_level_frame=*/testing::Bool());
- void DuplicateAndCompare(const IsolationInfo& isolation_info) {
- absl::optional<IsolationInfo> duplicate_isolation_info =
- IsolationInfo::CreateIfConsistent(
- isolation_info.request_type(), isolation_info.top_frame_origin(),
- IsolationInfoTest::
- ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()
- ? absl::nullopt
- : isolation_info.frame_origin(),
- 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_FALSE(IsolationInfo::IsFrameSiteEnabled());
- } else {
- EXPECT_TRUE(IsolationInfo::IsFrameSiteEnabled());
- }
- }
- TEST_P(IsolationInfoTest, CreateDoubleKey) {
- IsolationInfo isolation_info = IsolationInfo::Create(
- IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
- SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty);
- if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- 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_EQ(absl::nullopt, double_key_isolation_info.frame_origin());
- 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.frame_origin(),
- double_key_isolation_info.frame_origin());
- 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
- 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(absl::nullopt, redirected_isolation_info.frame_origin());
- } 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
- 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(absl::nullopt, redirected_isolation_info.frame_origin());
- 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
- } 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(absl::nullopt, redirected_isolation_info.frame_origin());
- } 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
- } 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(absl::nullopt, redirected_isolation_info.frame_origin());
- } 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_FALSE(isolation_info.frame_origin());
- } 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
- 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
- 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_FALSE(isolation_info.frame_origin().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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
- 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
- } 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
- } 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
- } 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()));
- if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(kNIK.GetFrameSite(), 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_FALSE(isolation_info.frame_origin());
- } 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
- 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- 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 (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
- for (const auto& info : kNegativeWhenDoubleKeyEnabledTestCases) {
- EXPECT_TRUE(info.Serialize().empty());
- }
- } else {
- for (const auto& info : kNegativeTestCases) {
- EXPECT_TRUE(info.Serialize().empty());
- }
- }
- }
- } // namespace
- } // namespace net
|