blob: 60c8debeada4c6780651cab3caed65443cd2b76a [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 "base/optional.h"
#include "base/test/scoped_feature_list.h"
#include "net/base/features.h"
#include "net/cookies/site_for_cookies.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
#include "url/origin.h"
#include "url/url_util.h"
namespace net {
namespace {
void DuplicateAndCompare(const IsolationInfo& isolation_info) {
base::Optional<IsolationInfo> duplicate_isolation_info =
IsolationInfo::CreateIfConsistent(
isolation_info.redirect_mode(), isolation_info.top_frame_origin(),
isolation_info.frame_origin(), isolation_info.site_for_cookies(),
isolation_info.opaque_and_non_transient());
ASSERT_TRUE(duplicate_isolation_info);
EXPECT_TRUE(isolation_info.IsEqualForTesting(*duplicate_isolation_info));
}
class IsolationInfoTest : public testing::Test {
public:
IsolationInfoTest() {
// Only test the case where NIK modifies the top frame origins, since
// IsolationInfo doesn't enforce the flag itself.
feature_list_.InitAndEnableFeature(
features::kUseRegistrableDomainInNetworkIsolationKey);
}
const url::Origin kOrigin1 = url::Origin::Create(GURL("https://a.foo.test"));
const url::Origin kOrigin2 = url::Origin::Create(GURL("https://b.bar.test"));
const url::Origin kOrigin3 = url::Origin::Create(GURL("https://c.baz.test"));
const url::Origin kOpaqueOrigin;
base::test::ScopedFeatureList feature_list_;
};
TEST_F(IsolationInfoTest, UpdateTopFrame) {
IsolationInfo isolation_info = IsolationInfo::Create(
IsolationInfo::RedirectMode::kUpdateTopFrame, kOrigin1, kOrigin1,
SiteForCookies::FromOrigin(kOrigin1));
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateTopFrame,
isolation_info.redirect_mode());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
EXPECT_EQ("https://foo.test https://foo.test",
isolation_info.network_isolation_key().ToString());
EXPECT_TRUE(
isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
EXPECT_FALSE(isolation_info.opaque_and_non_transient());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateTopFrame,
redirected_isolation_info.redirect_mode());
EXPECT_EQ(kOrigin3, redirected_isolation_info.top_frame_origin());
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());
EXPECT_EQ("https://baz.test https://baz.test",
redirected_isolation_info.network_isolation_key().ToString());
EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
kOrigin3.GetURL()));
EXPECT_FALSE(redirected_isolation_info.opaque_and_non_transient());
}
TEST_F(IsolationInfoTest, UpdateFrameOnly) {
IsolationInfo isolation_info = IsolationInfo::Create(
IsolationInfo::RedirectMode::kUpdateFrameOnly, kOrigin1, kOrigin2,
SiteForCookies::FromOrigin(kOrigin1));
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateFrameOnly,
isolation_info.redirect_mode());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
EXPECT_EQ("https://foo.test https://bar.test",
isolation_info.network_isolation_key().ToString());
EXPECT_TRUE(
isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
EXPECT_FALSE(isolation_info.opaque_and_non_transient());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateFrameOnly,
redirected_isolation_info.redirect_mode());
EXPECT_EQ(kOrigin1, redirected_isolation_info.top_frame_origin());
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());
EXPECT_EQ("https://foo.test https://baz.test",
redirected_isolation_info.network_isolation_key().ToString());
EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
kOrigin1.GetURL()));
EXPECT_FALSE(redirected_isolation_info.opaque_and_non_transient());
}
TEST_F(IsolationInfoTest, UpdateNothing) {
IsolationInfo isolation_info;
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateNothing,
isolation_info.redirect_mode());
EXPECT_FALSE(isolation_info.top_frame_origin());
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.opaque_and_non_transient());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
}
TEST_F(IsolationInfoTest, UpdateNothingWithSiteForCookies) {
IsolationInfo isolation_info = IsolationInfo::Create(
IsolationInfo::RedirectMode::kUpdateNothing, kOrigin1, kOrigin1,
SiteForCookies::FromOrigin(kOrigin1));
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateNothing,
isolation_info.redirect_mode());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
EXPECT_EQ("https://foo.test https://foo.test",
isolation_info.network_isolation_key().ToString());
EXPECT_TRUE(
isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
EXPECT_FALSE(isolation_info.opaque_and_non_transient());
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_F(IsolationInfoTest, UpdateNothingWithEmptySiteForCookies) {
IsolationInfo isolation_info =
IsolationInfo::Create(IsolationInfo::RedirectMode::kUpdateNothing,
kOrigin1, kOrigin2, SiteForCookies());
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateNothing,
isolation_info.redirect_mode());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
EXPECT_EQ("https://foo.test https://bar.test",
isolation_info.network_isolation_key().ToString());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_FALSE(isolation_info.opaque_and_non_transient());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
}
TEST_F(IsolationInfoTest, CreateTransient) {
IsolationInfo isolation_info = IsolationInfo::CreateTransient();
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateNothing,
isolation_info.redirect_mode());
EXPECT_TRUE(isolation_info.top_frame_origin()->opaque());
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.opaque_and_non_transient());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
}
TEST_F(IsolationInfoTest, CreateOpaqueAndNonTransient) {
IsolationInfo isolation_info = IsolationInfo::CreateOpaqueAndNonTransient();
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateNothing,
isolation_info.redirect_mode());
EXPECT_TRUE(isolation_info.top_frame_origin()->opaque());
EXPECT_TRUE(isolation_info.frame_origin()->opaque());
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
EXPECT_TRUE(
isolation_info.network_isolation_key().GetTopFrameOrigin()->opaque());
EXPECT_TRUE(
isolation_info.network_isolation_key().GetFrameOrigin()->opaque());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_TRUE(isolation_info.opaque_and_non_transient());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
}
TEST_F(IsolationInfoTest, CreateForInternalRequest) {
IsolationInfo isolation_info =
IsolationInfo::CreateForInternalRequest(kOrigin1);
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateNothing,
isolation_info.redirect_mode());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
EXPECT_EQ("https://foo.test https://foo.test",
isolation_info.network_isolation_key().ToString());
EXPECT_TRUE(
isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
EXPECT_FALSE(isolation_info.opaque_and_non_transient());
DuplicateAndCompare(isolation_info);
IsolationInfo redirected_isolation_info =
isolation_info.CreateForRedirect(kOrigin3);
EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
}
TEST_F(IsolationInfoTest, CreatePartialUpdateTopFrame) {
const NetworkIsolationKey kNIK(kOrigin1, kOrigin1);
IsolationInfo isolation_info = IsolationInfo::CreatePartial(
IsolationInfo::RedirectMode::kUpdateTopFrame, kNIK);
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateTopFrame,
isolation_info.redirect_mode());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_FALSE(isolation_info.opaque_and_non_transient());
DuplicateAndCompare(isolation_info);
}
TEST_F(IsolationInfoTest, CreatePartialUpdateFrameOnly) {
const NetworkIsolationKey kNIK(kOrigin1, kOrigin2);
IsolationInfo isolation_info = IsolationInfo::CreatePartial(
IsolationInfo::RedirectMode::kUpdateFrameOnly, kNIK);
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateFrameOnly,
isolation_info.redirect_mode());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_FALSE(isolation_info.opaque_and_non_transient());
DuplicateAndCompare(isolation_info);
}
TEST_F(IsolationInfoTest, CreatePartialUpdateNothing) {
const NetworkIsolationKey kNIK(kOrigin1, kOrigin2);
IsolationInfo isolation_info = IsolationInfo::CreatePartial(
IsolationInfo::RedirectMode::kUpdateNothing, kNIK);
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateNothing,
isolation_info.redirect_mode());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_FALSE(isolation_info.opaque_and_non_transient());
DuplicateAndCompare(isolation_info);
}
TEST_F(IsolationInfoTest, CreatePartialTransient) {
const NetworkIsolationKey kNIK = NetworkIsolationKey::CreateTransient();
IsolationInfo isolation_info = IsolationInfo::CreatePartial(
IsolationInfo::RedirectMode::kUpdateNothing, kNIK);
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateNothing,
isolation_info.redirect_mode());
EXPECT_EQ(*kNIK.GetTopFrameOrigin(), isolation_info.top_frame_origin());
EXPECT_EQ(*kNIK.GetFrameOrigin(), isolation_info.frame_origin());
EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_FALSE(isolation_info.opaque_and_non_transient());
DuplicateAndCompare(isolation_info);
}
TEST_F(IsolationInfoTest, CreatePartialOpaqueAndNonTransient) {
const NetworkIsolationKey kNIK =
NetworkIsolationKey::CreateOpaqueAndNonTransient();
IsolationInfo isolation_info = IsolationInfo::CreatePartial(
IsolationInfo::RedirectMode::kUpdateNothing, kNIK);
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateNothing,
isolation_info.redirect_mode());
EXPECT_EQ(*kNIK.GetTopFrameOrigin(), isolation_info.top_frame_origin());
EXPECT_EQ(*kNIK.GetFrameOrigin(), isolation_info.frame_origin());
EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_TRUE(isolation_info.opaque_and_non_transient());
DuplicateAndCompare(isolation_info);
}
TEST_F(IsolationInfoTest, CreatePartialEmpty) {
IsolationInfo isolation_info = IsolationInfo::CreatePartial(
IsolationInfo::RedirectMode::kUpdateNothing, NetworkIsolationKey());
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateNothing,
isolation_info.redirect_mode());
EXPECT_FALSE(isolation_info.top_frame_origin());
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.opaque_and_non_transient());
DuplicateAndCompare(isolation_info);
}
TEST_F(IsolationInfoTest,
CreatePartialEmptyNoFrameOriginRedirectModeUpdateTopFrame) {
base::test::ScopedFeatureList feature_list;
feature_list.InitAndDisableFeature(
features::kAppendFrameOriginToNetworkIsolationKey);
const NetworkIsolationKey kNIK(kOrigin1, kOrigin1);
EXPECT_FALSE(kNIK.GetFrameOrigin());
IsolationInfo isolation_info = IsolationInfo::CreatePartial(
IsolationInfo::RedirectMode::kUpdateTopFrame, kNIK);
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateTopFrame,
isolation_info.redirect_mode());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_FALSE(isolation_info.opaque_and_non_transient());
DuplicateAndCompare(isolation_info);
}
TEST_F(IsolationInfoTest,
CreatePartialEmptyNoFrameOriginRedirectModeUpdateFrameOnly) {
base::test::ScopedFeatureList feature_list;
feature_list.InitAndDisableFeature(
features::kAppendFrameOriginToNetworkIsolationKey);
const NetworkIsolationKey kNIK(kOrigin1, kOrigin2);
EXPECT_FALSE(kNIK.GetFrameOrigin());
IsolationInfo isolation_info = IsolationInfo::CreatePartial(
IsolationInfo::RedirectMode::kUpdateFrameOnly, kNIK);
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateFrameOnly,
isolation_info.redirect_mode());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
ASSERT_TRUE(isolation_info.frame_origin());
EXPECT_TRUE(isolation_info.frame_origin()->opaque());
EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_FALSE(isolation_info.opaque_and_non_transient());
DuplicateAndCompare(isolation_info);
}
TEST_F(IsolationInfoTest,
CreatePartialEmptyNoFrameOriginRedirectModeUpdateNothing) {
base::test::ScopedFeatureList feature_list;
feature_list.InitAndDisableFeature(
features::kAppendFrameOriginToNetworkIsolationKey);
const NetworkIsolationKey kNIK(kOrigin1, kOrigin2);
EXPECT_FALSE(kNIK.GetFrameOrigin());
IsolationInfo isolation_info = IsolationInfo::CreatePartial(
IsolationInfo::RedirectMode::kUpdateNothing, kNIK);
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateNothing,
isolation_info.redirect_mode());
EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
ASSERT_TRUE(isolation_info.frame_origin());
EXPECT_TRUE(isolation_info.frame_origin()->opaque());
EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
EXPECT_FALSE(isolation_info.opaque_and_non_transient());
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_F(IsolationInfoTest, CustomSchemeUpdateNothing) {
// 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::RedirectMode::kUpdateNothing, kCustomOrigin, kOrigin1,
SiteForCookies::FromOrigin(kCustomOrigin));
EXPECT_EQ(IsolationInfo::RedirectMode::kUpdateNothing,
isolation_info.redirect_mode());
EXPECT_EQ(kCustomOrigin, isolation_info.top_frame_origin());
EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
EXPECT_EQ("foo://a.foo.com https://foo.test",
isolation_info.network_isolation_key().ToString());
EXPECT_TRUE(isolation_info.site_for_cookies().IsFirstParty(kCustomOriginUrl));
EXPECT_FALSE(isolation_info.opaque_and_non_transient());
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_F(IsolationInfoTest, CreateIfConsistentFails) {
// Main frames with inconsistent SiteForCookies.
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateTopFrame, kOrigin1, kOrigin1,
SiteForCookies::FromOrigin(kOrigin2),
false /* opaque_and_non_transient */));
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateTopFrame, kOpaqueOrigin,
kOpaqueOrigin, SiteForCookies::FromOrigin(kOrigin1),
false /* opaque_and_non_transient */));
// Sub frame with inconsistent SiteForCookies.
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateFrameOnly, kOrigin1, kOrigin2,
SiteForCookies::FromOrigin(kOrigin2),
false /* opaque_and_non_transient */));
// Sub resources with inconsistent SiteForCookies.
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateNothing, kOrigin1, kOrigin2,
SiteForCookies::FromOrigin(kOrigin1),
false /* opaque_and_non_transient */));
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateNothing, kOrigin1, kOrigin2,
SiteForCookies::FromOrigin(kOrigin2),
false /* opaque_and_non_transient */));
// |opaque_and_non_transient| for wrong RedirectModes.
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateTopFrame, kOpaqueOrigin,
kOpaqueOrigin, SiteForCookies(), true /* opaque_and_non_transient */));
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateFrameOnly, kOpaqueOrigin,
kOpaqueOrigin, SiteForCookies(), true /* opaque_and_non_transient */));
// |opaque_and_non_transient| with empty origins.
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateNothing, base::nullopt, base::nullopt,
SiteForCookies(), true /* opaque_and_non_transient */));
// |opaque_and_non_transient| with non-opaque origins.
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateNothing, kOrigin1, kOrigin1,
SiteForCookies(), true /* opaque_and_non_transient */));
// Incorrectly have empty/non-empty origins:
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateNothing, base::nullopt, kOrigin1,
SiteForCookies(), false /* opaque_and_non_transient */));
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateNothing, kOrigin1, base::nullopt,
SiteForCookies(), false /* opaque_and_non_transient */));
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateTopFrame, base::nullopt, kOrigin1,
SiteForCookies::FromOrigin(kOrigin1),
false /* opaque_and_non_transient */));
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateTopFrame, kOrigin1, base::nullopt,
SiteForCookies::FromOrigin(kOrigin1),
false /* opaque_and_non_transient */));
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateFrameOnly, base::nullopt, kOrigin2,
SiteForCookies(), false /* opaque_and_non_transient */));
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateFrameOnly, kOrigin1, base::nullopt,
SiteForCookies(), false /* opaque_and_non_transient */));
// No origins with non-null SiteForCookies.
EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
IsolationInfo::RedirectMode::kUpdateNothing, base::nullopt, base::nullopt,
SiteForCookies::FromOrigin(kOrigin1),
false /* opaque_and_non_transient */));
}
} // namespace
} // namespace net