isolation_info_unittest.cc 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/base/isolation_info.h"
  5. #include <optional>
  6. #include "base/test/scoped_feature_list.h"
  7. #include "base/unguessable_token.h"
  8. #include "net/base/features.h"
  9. #include "net/base/network_isolation_key.h"
  10. #include "net/base/schemeful_site.h"
  11. #include "net/cookies/site_for_cookies.h"
  12. #include "testing/gtest/include/gtest/gtest.h"
  13. #include "third_party/abseil-cpp/absl/types/optional.h"
  14. #include "url/gurl.h"
  15. #include "url/origin.h"
  16. #include "url/url_util.h"
  17. namespace net {
  18. namespace {
  19. class IsolationInfoTest : public testing::Test,
  20. public testing::WithParamInterface<bool> {
  21. public:
  22. IsolationInfoTest() {
  23. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  24. scoped_feature_list_.InitAndEnableFeature(
  25. net::features::kForceIsolationInfoFrameOriginToTopLevelFrame);
  26. } else {
  27. scoped_feature_list_.InitAndDisableFeature(
  28. net::features::kForceIsolationInfoFrameOriginToTopLevelFrame);
  29. }
  30. }
  31. static bool ForceIsolationInfoFrameOriginToTopLevelFrameEnabled() {
  32. return GetParam();
  33. }
  34. const url::Origin kOrigin1 = url::Origin::Create(GURL("https://a.foo.test"));
  35. const url::Origin kSite1 = url::Origin::Create(GURL("https://foo.test"));
  36. const url::Origin kOrigin2 = url::Origin::Create(GURL("https://b.bar.test"));
  37. const url::Origin kSite2 = url::Origin::Create(GURL("https://bar.test"));
  38. const url::Origin kOrigin3 = url::Origin::Create(GURL("https://c.baz.test"));
  39. const url::Origin kOpaqueOrigin;
  40. const absl::optional<std::set<net::SchemefulSite>> kPartyContextNull =
  41. absl::nullopt;
  42. const absl::optional<std::set<net::SchemefulSite>> kPartyContextEmpty =
  43. std::set<net::SchemefulSite>();
  44. const absl::optional<std::set<net::SchemefulSite>> kPartyContext1 =
  45. std::set<net::SchemefulSite>{net::SchemefulSite(kOrigin1)};
  46. const absl::optional<std::set<net::SchemefulSite>> kPartyContext2 =
  47. std::set<net::SchemefulSite>{net::SchemefulSite(kOrigin2)};
  48. const absl::optional<std::set<net::SchemefulSite>> kPartyContext3 =
  49. std::set<net::SchemefulSite>{net::SchemefulSite(kOrigin3)};
  50. const absl::optional<std::set<net::SchemefulSite>> kPartyContextMultiple =
  51. std::set<net::SchemefulSite>{net::SchemefulSite(kOrigin1),
  52. net::SchemefulSite(kOrigin2)};
  53. const base::UnguessableToken kNonce1 = base::UnguessableToken::Create();
  54. const base::UnguessableToken kNonce2 = base::UnguessableToken::Create();
  55. private:
  56. base::test::ScopedFeatureList scoped_feature_list_;
  57. };
  58. INSTANTIATE_TEST_SUITE_P(
  59. All,
  60. IsolationInfoTest,
  61. /*force_isolation_info_frame_origin_to_top_level_frame=*/testing::Bool());
  62. void DuplicateAndCompare(const IsolationInfo& isolation_info) {
  63. absl::optional<IsolationInfo> duplicate_isolation_info =
  64. IsolationInfo::CreateIfConsistent(
  65. isolation_info.request_type(), isolation_info.top_frame_origin(),
  66. IsolationInfoTest::
  67. ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()
  68. ? absl::nullopt
  69. : isolation_info.frame_origin(),
  70. isolation_info.site_for_cookies(), isolation_info.party_context(),
  71. isolation_info.nonce().has_value() ? &isolation_info.nonce().value()
  72. : nullptr);
  73. ASSERT_TRUE(duplicate_isolation_info);
  74. EXPECT_TRUE(isolation_info.IsEqualForTesting(*duplicate_isolation_info));
  75. }
  76. TEST_P(IsolationInfoTest, IsFrameSiteEnabled) {
  77. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  78. EXPECT_FALSE(IsolationInfo::IsFrameSiteEnabled());
  79. } else {
  80. EXPECT_TRUE(IsolationInfo::IsFrameSiteEnabled());
  81. }
  82. }
  83. TEST_P(IsolationInfoTest, CreateDoubleKey) {
  84. IsolationInfo isolation_info = IsolationInfo::Create(
  85. IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
  86. SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty);
  87. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  88. IsolationInfo double_key_isolation_info = IsolationInfo::CreateDoubleKey(
  89. IsolationInfo::RequestType::kMainFrame, kOrigin1,
  90. SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty);
  91. EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
  92. double_key_isolation_info.request_type());
  93. EXPECT_EQ(kOrigin1, double_key_isolation_info.top_frame_origin());
  94. EXPECT_EQ(absl::nullopt, double_key_isolation_info.frame_origin());
  95. EXPECT_EQ(
  96. "https://foo.test https://foo.test",
  97. double_key_isolation_info.network_isolation_key().ToCacheKeyString());
  98. EXPECT_EQ(kPartyContextEmpty, double_key_isolation_info.party_context());
  99. EXPECT_FALSE(double_key_isolation_info.nonce().has_value());
  100. // When double keying is enabled Create and CreateDoubleKey should
  101. // create the same key.
  102. EXPECT_EQ(isolation_info.frame_origin(),
  103. double_key_isolation_info.frame_origin());
  104. EXPECT_EQ(isolation_info.top_frame_origin(),
  105. double_key_isolation_info.top_frame_origin());
  106. EXPECT_EQ(isolation_info.request_type(),
  107. double_key_isolation_info.request_type());
  108. EXPECT_EQ(isolation_info.network_isolation_key(),
  109. double_key_isolation_info.network_isolation_key());
  110. EXPECT_EQ(isolation_info.party_context(),
  111. double_key_isolation_info.party_context());
  112. EXPECT_EQ(isolation_info.nonce(), double_key_isolation_info.nonce());
  113. } else {
  114. // Creating double keyed IsolationInfos is not allowed when frame site is
  115. // enabled.
  116. EXPECT_DEATH_IF_SUPPORTED(
  117. IsolationInfo::CreateDoubleKey(
  118. IsolationInfo::RequestType::kMainFrame, kOrigin1,
  119. SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty),
  120. "");
  121. }
  122. }
  123. TEST_P(IsolationInfoTest, RequestTypeMainFrame) {
  124. IsolationInfo isolation_info = IsolationInfo::Create(
  125. IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
  126. SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty);
  127. EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
  128. isolation_info.request_type());
  129. EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
  130. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  131. EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
  132. EXPECT_EQ("https://foo.test https://foo.test",
  133. isolation_info.network_isolation_key().ToCacheKeyString());
  134. } else {
  135. EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
  136. EXPECT_EQ("https://foo.test https://foo.test",
  137. isolation_info.network_isolation_key().ToCacheKeyString());
  138. }
  139. EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
  140. EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
  141. EXPECT_TRUE(
  142. isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
  143. EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
  144. EXPECT_FALSE(isolation_info.nonce().has_value());
  145. DuplicateAndCompare(isolation_info);
  146. IsolationInfo redirected_isolation_info =
  147. isolation_info.CreateForRedirect(kOrigin3);
  148. EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
  149. redirected_isolation_info.request_type());
  150. EXPECT_EQ(kOrigin3, redirected_isolation_info.top_frame_origin());
  151. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  152. EXPECT_EQ(absl::nullopt, redirected_isolation_info.frame_origin());
  153. } else {
  154. EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
  155. }
  156. EXPECT_TRUE(
  157. redirected_isolation_info.network_isolation_key().IsFullyPopulated());
  158. EXPECT_FALSE(redirected_isolation_info.network_isolation_key().IsTransient());
  159. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  160. EXPECT_EQ(
  161. "https://baz.test https://baz.test",
  162. redirected_isolation_info.network_isolation_key().ToCacheKeyString());
  163. } else {
  164. EXPECT_EQ(
  165. "https://baz.test https://baz.test",
  166. redirected_isolation_info.network_isolation_key().ToCacheKeyString());
  167. }
  168. EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
  169. kOrigin3.GetURL()));
  170. EXPECT_EQ(kPartyContextEmpty, redirected_isolation_info.party_context());
  171. EXPECT_FALSE(redirected_isolation_info.nonce().has_value());
  172. }
  173. TEST_P(IsolationInfoTest, RequestTypeSubFrame) {
  174. IsolationInfo isolation_info = IsolationInfo::Create(
  175. IsolationInfo::RequestType::kSubFrame, kOrigin1, kOrigin2,
  176. SiteForCookies::FromOrigin(kOrigin1), kPartyContext1);
  177. EXPECT_EQ(IsolationInfo::RequestType::kSubFrame,
  178. isolation_info.request_type());
  179. EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
  180. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  181. EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
  182. EXPECT_EQ("https://foo.test https://foo.test",
  183. isolation_info.network_isolation_key().ToCacheKeyString());
  184. } else {
  185. EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
  186. EXPECT_EQ("https://foo.test https://bar.test",
  187. isolation_info.network_isolation_key().ToCacheKeyString());
  188. }
  189. EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
  190. EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
  191. EXPECT_TRUE(
  192. isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
  193. EXPECT_EQ(kPartyContext1, isolation_info.party_context());
  194. EXPECT_FALSE(isolation_info.nonce().has_value());
  195. DuplicateAndCompare(isolation_info);
  196. IsolationInfo redirected_isolation_info =
  197. isolation_info.CreateForRedirect(kOrigin3);
  198. EXPECT_EQ(IsolationInfo::RequestType::kSubFrame,
  199. redirected_isolation_info.request_type());
  200. EXPECT_EQ(kOrigin1, redirected_isolation_info.top_frame_origin());
  201. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  202. EXPECT_EQ(absl::nullopt, redirected_isolation_info.frame_origin());
  203. EXPECT_EQ(
  204. "https://foo.test https://foo.test",
  205. redirected_isolation_info.network_isolation_key().ToCacheKeyString());
  206. } else {
  207. EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
  208. EXPECT_EQ(
  209. "https://foo.test https://baz.test",
  210. redirected_isolation_info.network_isolation_key().ToCacheKeyString());
  211. }
  212. EXPECT_TRUE(
  213. redirected_isolation_info.network_isolation_key().IsFullyPopulated());
  214. EXPECT_FALSE(redirected_isolation_info.network_isolation_key().IsTransient());
  215. EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
  216. kOrigin1.GetURL()));
  217. EXPECT_EQ(kPartyContext1, isolation_info.party_context());
  218. EXPECT_FALSE(redirected_isolation_info.nonce().has_value());
  219. }
  220. TEST_P(IsolationInfoTest, RequestTypeMainFrameWithNonce) {
  221. IsolationInfo isolation_info = IsolationInfo::Create(
  222. IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
  223. SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty, &kNonce1);
  224. EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
  225. isolation_info.request_type());
  226. EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
  227. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  228. EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
  229. } else {
  230. EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
  231. }
  232. EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
  233. EXPECT_TRUE(isolation_info.network_isolation_key().IsTransient());
  234. EXPECT_EQ(absl::nullopt,
  235. isolation_info.network_isolation_key().ToCacheKeyString());
  236. EXPECT_TRUE(
  237. isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
  238. EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
  239. EXPECT_EQ(kNonce1, isolation_info.nonce().value());
  240. DuplicateAndCompare(isolation_info);
  241. IsolationInfo redirected_isolation_info =
  242. isolation_info.CreateForRedirect(kOrigin3);
  243. EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
  244. redirected_isolation_info.request_type());
  245. EXPECT_EQ(kOrigin3, redirected_isolation_info.top_frame_origin());
  246. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  247. EXPECT_EQ(absl::nullopt, redirected_isolation_info.frame_origin());
  248. } else {
  249. EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
  250. }
  251. EXPECT_TRUE(
  252. redirected_isolation_info.network_isolation_key().IsFullyPopulated());
  253. EXPECT_TRUE(redirected_isolation_info.network_isolation_key().IsTransient());
  254. EXPECT_EQ(
  255. absl::nullopt,
  256. redirected_isolation_info.network_isolation_key().ToCacheKeyString());
  257. EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
  258. kOrigin3.GetURL()));
  259. EXPECT_EQ(kPartyContextEmpty, redirected_isolation_info.party_context());
  260. EXPECT_EQ(kNonce1, redirected_isolation_info.nonce().value());
  261. }
  262. TEST_P(IsolationInfoTest, RequestTypeSubFrameWithNonce) {
  263. IsolationInfo isolation_info = IsolationInfo::Create(
  264. IsolationInfo::RequestType::kSubFrame, kOrigin1, kOrigin2,
  265. SiteForCookies::FromOrigin(kOrigin1), kPartyContext1, &kNonce1);
  266. EXPECT_EQ(IsolationInfo::RequestType::kSubFrame,
  267. isolation_info.request_type());
  268. EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
  269. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  270. EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
  271. } else {
  272. EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
  273. }
  274. EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
  275. EXPECT_TRUE(isolation_info.network_isolation_key().IsTransient());
  276. EXPECT_EQ(absl::nullopt,
  277. isolation_info.network_isolation_key().ToCacheKeyString());
  278. EXPECT_TRUE(
  279. isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
  280. EXPECT_EQ(kPartyContext1, isolation_info.party_context());
  281. EXPECT_EQ(kNonce1, isolation_info.nonce().value());
  282. DuplicateAndCompare(isolation_info);
  283. IsolationInfo redirected_isolation_info =
  284. isolation_info.CreateForRedirect(kOrigin3);
  285. EXPECT_EQ(IsolationInfo::RequestType::kSubFrame,
  286. redirected_isolation_info.request_type());
  287. EXPECT_EQ(kOrigin1, redirected_isolation_info.top_frame_origin());
  288. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  289. EXPECT_EQ(absl::nullopt, redirected_isolation_info.frame_origin());
  290. } else {
  291. EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
  292. }
  293. EXPECT_TRUE(
  294. redirected_isolation_info.network_isolation_key().IsFullyPopulated());
  295. EXPECT_TRUE(redirected_isolation_info.network_isolation_key().IsTransient());
  296. EXPECT_EQ(
  297. absl::nullopt,
  298. redirected_isolation_info.network_isolation_key().ToCacheKeyString());
  299. EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
  300. kOrigin1.GetURL()));
  301. EXPECT_EQ(kPartyContext1, redirected_isolation_info.party_context());
  302. EXPECT_EQ(kNonce1, redirected_isolation_info.nonce().value());
  303. }
  304. TEST_P(IsolationInfoTest, RequestTypeOther) {
  305. IsolationInfo isolation_info;
  306. EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
  307. EXPECT_FALSE(isolation_info.top_frame_origin());
  308. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  309. EXPECT_FALSE(isolation_info.frame_origin());
  310. } else {
  311. EXPECT_FALSE(isolation_info.frame_origin());
  312. }
  313. EXPECT_TRUE(isolation_info.network_isolation_key().IsEmpty());
  314. EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
  315. EXPECT_FALSE(isolation_info.party_context());
  316. EXPECT_FALSE(isolation_info.nonce());
  317. DuplicateAndCompare(isolation_info);
  318. IsolationInfo redirected_isolation_info =
  319. isolation_info.CreateForRedirect(kOrigin3);
  320. EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
  321. }
  322. TEST_P(IsolationInfoTest, RequestTypeOtherWithSiteForCookies) {
  323. IsolationInfo isolation_info = IsolationInfo::Create(
  324. IsolationInfo::RequestType::kOther, kOrigin1, kOrigin1,
  325. SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty);
  326. EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
  327. EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
  328. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  329. EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
  330. EXPECT_EQ("https://foo.test https://foo.test",
  331. isolation_info.network_isolation_key().ToCacheKeyString());
  332. } else {
  333. EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
  334. EXPECT_EQ("https://foo.test https://foo.test",
  335. isolation_info.network_isolation_key().ToCacheKeyString());
  336. }
  337. EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
  338. EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
  339. EXPECT_TRUE(
  340. isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
  341. EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
  342. EXPECT_FALSE(isolation_info.nonce());
  343. DuplicateAndCompare(isolation_info);
  344. IsolationInfo redirected_isolation_info =
  345. isolation_info.CreateForRedirect(kOrigin3);
  346. EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
  347. }
  348. // Test case of a subresource for cross-site subframe (which has an empty
  349. // site-for-cookies).
  350. TEST_P(IsolationInfoTest, RequestTypeOtherWithEmptySiteForCookies) {
  351. IsolationInfo isolation_info =
  352. IsolationInfo::Create(IsolationInfo::RequestType::kOther, kOrigin1,
  353. kOrigin2, SiteForCookies(), kPartyContext2);
  354. EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
  355. EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
  356. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  357. EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
  358. EXPECT_EQ("https://foo.test https://foo.test",
  359. isolation_info.network_isolation_key().ToCacheKeyString());
  360. } else {
  361. EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
  362. EXPECT_EQ("https://foo.test https://bar.test",
  363. isolation_info.network_isolation_key().ToCacheKeyString());
  364. }
  365. EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
  366. EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
  367. EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
  368. EXPECT_EQ(kPartyContext2, isolation_info.party_context());
  369. EXPECT_FALSE(isolation_info.nonce());
  370. DuplicateAndCompare(isolation_info);
  371. IsolationInfo redirected_isolation_info =
  372. isolation_info.CreateForRedirect(kOrigin3);
  373. EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
  374. }
  375. TEST_P(IsolationInfoTest, CreateTransient) {
  376. IsolationInfo isolation_info = IsolationInfo::CreateTransient();
  377. EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
  378. EXPECT_TRUE(isolation_info.top_frame_origin()->opaque());
  379. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  380. EXPECT_FALSE(isolation_info.frame_origin().has_value());
  381. } else {
  382. EXPECT_TRUE(isolation_info.frame_origin()->opaque());
  383. }
  384. EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
  385. EXPECT_TRUE(isolation_info.network_isolation_key().IsTransient());
  386. EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
  387. EXPECT_FALSE(isolation_info.party_context());
  388. EXPECT_FALSE(isolation_info.nonce());
  389. DuplicateAndCompare(isolation_info);
  390. IsolationInfo redirected_isolation_info =
  391. isolation_info.CreateForRedirect(kOrigin3);
  392. EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
  393. }
  394. TEST_P(IsolationInfoTest, CreateForInternalRequest) {
  395. IsolationInfo isolation_info =
  396. IsolationInfo::CreateForInternalRequest(kOrigin1);
  397. EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
  398. EXPECT_EQ(kOrigin1, isolation_info.top_frame_origin());
  399. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  400. EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
  401. EXPECT_EQ("https://foo.test https://foo.test",
  402. isolation_info.network_isolation_key().ToCacheKeyString());
  403. } else {
  404. EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
  405. EXPECT_EQ("https://foo.test https://foo.test",
  406. isolation_info.network_isolation_key().ToCacheKeyString());
  407. }
  408. EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
  409. EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
  410. EXPECT_TRUE(
  411. isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
  412. EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
  413. EXPECT_FALSE(isolation_info.nonce());
  414. DuplicateAndCompare(isolation_info);
  415. IsolationInfo redirected_isolation_info =
  416. isolation_info.CreateForRedirect(kOrigin3);
  417. EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
  418. }
  419. TEST_P(IsolationInfoTest, CreatePartialUpdateTopFrame) {
  420. const NetworkIsolationKey kNIK{SchemefulSite(kOrigin1),
  421. SchemefulSite(kOrigin1)};
  422. IsolationInfo isolation_info = IsolationInfo::CreatePartial(
  423. IsolationInfo::RequestType::kMainFrame, kNIK);
  424. EXPECT_EQ(IsolationInfo::RequestType::kMainFrame,
  425. isolation_info.request_type());
  426. EXPECT_EQ(kSite1, isolation_info.top_frame_origin());
  427. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  428. EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
  429. } else {
  430. EXPECT_EQ(kSite1, isolation_info.frame_origin());
  431. }
  432. EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
  433. EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
  434. EXPECT_FALSE(isolation_info.party_context());
  435. EXPECT_FALSE(isolation_info.nonce());
  436. DuplicateAndCompare(isolation_info);
  437. }
  438. TEST_P(IsolationInfoTest, CreatePartialUpdateFrameOnly) {
  439. const NetworkIsolationKey kNIK{SchemefulSite(kOrigin1),
  440. SchemefulSite(kOrigin2)};
  441. IsolationInfo isolation_info =
  442. IsolationInfo::CreatePartial(IsolationInfo::RequestType::kSubFrame, kNIK);
  443. EXPECT_EQ(IsolationInfo::RequestType::kSubFrame,
  444. isolation_info.request_type());
  445. EXPECT_EQ(kSite1, isolation_info.top_frame_origin());
  446. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  447. EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
  448. } else {
  449. EXPECT_EQ(kSite2, isolation_info.frame_origin());
  450. }
  451. EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
  452. EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
  453. EXPECT_FALSE(isolation_info.party_context());
  454. EXPECT_FALSE(isolation_info.nonce());
  455. DuplicateAndCompare(isolation_info);
  456. }
  457. TEST_P(IsolationInfoTest, CreatePartialUpdateNothing) {
  458. const NetworkIsolationKey kNIK{SchemefulSite(kOrigin1),
  459. SchemefulSite(kOrigin2)};
  460. IsolationInfo isolation_info =
  461. IsolationInfo::CreatePartial(IsolationInfo::RequestType::kOther, kNIK);
  462. EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
  463. EXPECT_EQ(kSite1, isolation_info.top_frame_origin());
  464. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  465. EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
  466. } else {
  467. EXPECT_EQ(kSite2, isolation_info.frame_origin());
  468. }
  469. EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
  470. EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
  471. EXPECT_FALSE(isolation_info.party_context());
  472. EXPECT_FALSE(isolation_info.nonce());
  473. DuplicateAndCompare(isolation_info);
  474. }
  475. TEST_P(IsolationInfoTest, CreatePartialTransient) {
  476. const NetworkIsolationKey kNIK = NetworkIsolationKey::CreateTransient();
  477. IsolationInfo isolation_info =
  478. IsolationInfo::CreatePartial(IsolationInfo::RequestType::kOther, kNIK);
  479. EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
  480. EXPECT_EQ(kNIK.GetTopFrameSite(),
  481. SchemefulSite(*isolation_info.top_frame_origin()));
  482. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  483. EXPECT_EQ(kNIK.GetFrameSite(), absl::nullopt);
  484. } else {
  485. EXPECT_EQ(kNIK.GetFrameSite(),
  486. SchemefulSite(*isolation_info.frame_origin()));
  487. }
  488. EXPECT_EQ(kNIK, isolation_info.network_isolation_key());
  489. EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
  490. EXPECT_FALSE(isolation_info.party_context());
  491. EXPECT_FALSE(isolation_info.nonce());
  492. DuplicateAndCompare(isolation_info);
  493. }
  494. TEST_P(IsolationInfoTest, CreatePartialEmpty) {
  495. IsolationInfo isolation_info = IsolationInfo::CreatePartial(
  496. IsolationInfo::RequestType::kOther, NetworkIsolationKey());
  497. EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
  498. EXPECT_FALSE(isolation_info.top_frame_origin());
  499. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  500. EXPECT_FALSE(isolation_info.frame_origin());
  501. } else {
  502. EXPECT_FALSE(isolation_info.frame_origin());
  503. }
  504. EXPECT_EQ(NetworkIsolationKey(), isolation_info.network_isolation_key());
  505. EXPECT_TRUE(isolation_info.site_for_cookies().IsNull());
  506. EXPECT_FALSE(isolation_info.party_context());
  507. EXPECT_FALSE(isolation_info.nonce());
  508. DuplicateAndCompare(isolation_info);
  509. }
  510. // Test that in the UpdateNothing case, the SiteForCookies does not have to
  511. // match the frame origin, unlike in the HTTP/HTTPS case.
  512. TEST_P(IsolationInfoTest, CustomSchemeRequestTypeOther) {
  513. // Have to register the scheme, or url::Origin::Create() will return an opaque
  514. // origin.
  515. url::ScopedSchemeRegistryForTests scoped_registry;
  516. url::AddStandardScheme("foo", url::SCHEME_WITH_HOST);
  517. const GURL kCustomOriginUrl = GURL("foo://a.foo.com");
  518. const url::Origin kCustomOrigin = url::Origin::Create(kCustomOriginUrl);
  519. IsolationInfo isolation_info = IsolationInfo::Create(
  520. IsolationInfo::RequestType::kOther, kCustomOrigin, kOrigin1,
  521. SiteForCookies::FromOrigin(kCustomOrigin), kPartyContext1);
  522. EXPECT_EQ(IsolationInfo::RequestType::kOther, isolation_info.request_type());
  523. EXPECT_EQ(kCustomOrigin, isolation_info.top_frame_origin());
  524. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  525. EXPECT_EQ(absl::nullopt, isolation_info.frame_origin());
  526. EXPECT_EQ("foo://a.foo.com foo://a.foo.com",
  527. isolation_info.network_isolation_key().ToCacheKeyString());
  528. } else {
  529. EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
  530. EXPECT_EQ("foo://a.foo.com https://foo.test",
  531. isolation_info.network_isolation_key().ToCacheKeyString());
  532. }
  533. EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
  534. EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
  535. EXPECT_TRUE(isolation_info.site_for_cookies().IsFirstParty(kCustomOriginUrl));
  536. EXPECT_EQ(kPartyContext1, isolation_info.party_context());
  537. EXPECT_FALSE(isolation_info.nonce());
  538. DuplicateAndCompare(isolation_info);
  539. IsolationInfo redirected_isolation_info =
  540. isolation_info.CreateForRedirect(kOrigin2);
  541. EXPECT_TRUE(isolation_info.IsEqualForTesting(redirected_isolation_info));
  542. }
  543. // Success cases are covered by other tests, so only need a separate test to
  544. // cover the failure cases.
  545. TEST_P(IsolationInfoTest, CreateIfConsistentFails) {
  546. // Main frames with inconsistent SiteForCookies.
  547. EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
  548. IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
  549. SiteForCookies::FromOrigin(kOrigin2)));
  550. EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
  551. IsolationInfo::RequestType::kMainFrame, kOpaqueOrigin, kOpaqueOrigin,
  552. SiteForCookies::FromOrigin(kOrigin1)));
  553. // Sub frame with inconsistent SiteForCookies.
  554. EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
  555. IsolationInfo::RequestType::kSubFrame, kOrigin1, kOrigin2,
  556. SiteForCookies::FromOrigin(kOrigin2)));
  557. // Sub resources with inconsistent SiteForCookies.
  558. EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
  559. IsolationInfo::RequestType::kOther, kOrigin1, kOrigin2,
  560. SiteForCookies::FromOrigin(kOrigin2)));
  561. // Correctly have empty/non-empty origins:
  562. EXPECT_TRUE(IsolationInfo::CreateIfConsistent(
  563. IsolationInfo::RequestType::kOther, absl::nullopt, absl::nullopt,
  564. SiteForCookies()));
  565. // Incorrectly have empty/non-empty origins:
  566. EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
  567. IsolationInfo::RequestType::kOther, absl::nullopt, kOrigin1,
  568. SiteForCookies()));
  569. EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
  570. IsolationInfo::RequestType::kSubFrame, absl::nullopt, kOrigin2,
  571. SiteForCookies()));
  572. // Empty frame origins are ok when double keying is enabled but incorrect when
  573. // triple key is enabled.
  574. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  575. EXPECT_TRUE(IsolationInfo::CreateIfConsistent(
  576. IsolationInfo::RequestType::kOther, kOrigin1, absl::nullopt,
  577. SiteForCookies()));
  578. EXPECT_TRUE(IsolationInfo::CreateIfConsistent(
  579. IsolationInfo::RequestType::kSubFrame, kOrigin1, absl::nullopt,
  580. SiteForCookies()));
  581. EXPECT_TRUE(IsolationInfo::CreateIfConsistent(
  582. IsolationInfo::RequestType::kMainFrame, kOrigin1, absl::nullopt,
  583. SiteForCookies::FromOrigin(kOrigin1)));
  584. } else {
  585. EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
  586. IsolationInfo::RequestType::kOther, kOrigin1, absl::nullopt,
  587. SiteForCookies()));
  588. EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
  589. IsolationInfo::RequestType::kSubFrame, kOrigin1, absl::nullopt,
  590. SiteForCookies()));
  591. EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
  592. IsolationInfo::RequestType::kMainFrame, kOrigin1, absl::nullopt,
  593. SiteForCookies::FromOrigin(kOrigin1)));
  594. EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
  595. IsolationInfo::RequestType::kOther, kOrigin1, kOrigin2,
  596. SiteForCookies::FromOrigin(kOrigin1)));
  597. }
  598. // No origins with non-null SiteForCookies.
  599. EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
  600. IsolationInfo::RequestType::kOther, absl::nullopt, absl::nullopt,
  601. SiteForCookies::FromOrigin(kOrigin1)));
  602. // No origins with non-null party_context.
  603. EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
  604. IsolationInfo::RequestType::kOther, absl::nullopt, absl::nullopt,
  605. SiteForCookies(), kPartyContextEmpty));
  606. // No origins with non-null nonce.
  607. EXPECT_FALSE(IsolationInfo::CreateIfConsistent(
  608. IsolationInfo::RequestType::kOther, absl::nullopt, absl::nullopt,
  609. SiteForCookies(), absl::nullopt /* party_context */, &kNonce1));
  610. }
  611. TEST_P(IsolationInfoTest, CreateForRedirectPartyContext) {
  612. // RequestTypeMainFrame, PartyContext is empty
  613. {
  614. IsolationInfo isolation_info = IsolationInfo::Create(
  615. IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
  616. SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty);
  617. IsolationInfo redirected_isolation_info =
  618. isolation_info.CreateForRedirect(kOrigin3);
  619. EXPECT_EQ(kPartyContextEmpty, redirected_isolation_info.party_context());
  620. }
  621. // RequestTypeSubFrame, PartyContext is empty
  622. {
  623. IsolationInfo isolation_info = IsolationInfo::Create(
  624. IsolationInfo::RequestType::kSubFrame, kOrigin1, kOrigin2,
  625. SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty);
  626. IsolationInfo redirected_isolation_info =
  627. isolation_info.CreateForRedirect(kOrigin3);
  628. EXPECT_EQ(kPartyContextEmpty, redirected_isolation_info.party_context());
  629. }
  630. // RequestTypeSubFrame, PartyContext not empty
  631. {
  632. IsolationInfo isolation_info = IsolationInfo::Create(
  633. IsolationInfo::RequestType::kSubFrame, kOrigin1, kOrigin2,
  634. SiteForCookies::FromOrigin(kOrigin1), kPartyContext1);
  635. IsolationInfo redirected_isolation_info =
  636. isolation_info.CreateForRedirect(kOrigin3);
  637. EXPECT_EQ(kPartyContext1, redirected_isolation_info.party_context());
  638. }
  639. // RequestTypeOther, PartyContext not empty
  640. {
  641. IsolationInfo isolation_info =
  642. IsolationInfo::Create(IsolationInfo::RequestType::kOther, kOrigin1,
  643. kOrigin2, SiteForCookies(), kPartyContext2);
  644. IsolationInfo redirected_isolation_info =
  645. isolation_info.CreateForRedirect(kOrigin3);
  646. EXPECT_EQ(kPartyContext2, redirected_isolation_info.party_context());
  647. }
  648. }
  649. TEST_P(IsolationInfoTest, Serialization) {
  650. EXPECT_FALSE(IsolationInfo::Deserialize(""));
  651. EXPECT_FALSE(IsolationInfo::Deserialize("garbage"));
  652. const IsolationInfo kPositiveTestCases[] = {
  653. IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
  654. kOrigin2, SiteForCookies::FromOrigin(kOrigin1),
  655. kPartyContext1),
  656. // Null party context
  657. IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
  658. kOrigin2, SiteForCookies::FromOrigin(kOrigin1),
  659. kPartyContextNull),
  660. // Empty party context
  661. IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
  662. kOrigin2, SiteForCookies::FromOrigin(kOrigin1),
  663. kPartyContextEmpty),
  664. // Multiple party context entries.
  665. IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
  666. kOrigin2, SiteForCookies::FromOrigin(kOrigin1),
  667. kPartyContextMultiple),
  668. // Without SiteForCookies
  669. IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
  670. kOrigin2, SiteForCookies(), absl::nullopt),
  671. // Request type kOther
  672. IsolationInfo::Create(IsolationInfo::RequestType::kOther, kOrigin1,
  673. kOrigin1, SiteForCookies::FromOrigin(kOrigin1),
  674. absl::nullopt),
  675. // Request type kMainframe
  676. IsolationInfo::Create(IsolationInfo::RequestType::kMainFrame, kOrigin1,
  677. kOrigin1, SiteForCookies::FromOrigin(kOrigin1),
  678. absl::nullopt),
  679. };
  680. for (const auto& info : kPositiveTestCases) {
  681. auto rt = IsolationInfo::Deserialize(info.Serialize());
  682. ASSERT_TRUE(rt);
  683. EXPECT_TRUE(rt->IsEqualForTesting(info));
  684. }
  685. const IsolationInfo kNegativeTestCases[] = {
  686. IsolationInfo::CreateTransient(),
  687. // With nonce (i.e transient).
  688. IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
  689. kOrigin2, SiteForCookies::FromOrigin(kOrigin1),
  690. kPartyContext1, &kNonce1),
  691. // With an opaque origin (i.e transient)
  692. IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
  693. url::Origin(), SiteForCookies::FromOrigin(kOrigin1),
  694. absl::nullopt),
  695. };
  696. const IsolationInfo kNegativeWhenDoubleKeyEnabledTestCases[] = {
  697. IsolationInfo::CreateTransient(),
  698. // With nonce (i.e transient).
  699. IsolationInfo::Create(IsolationInfo::RequestType::kSubFrame, kOrigin1,
  700. kOrigin2, SiteForCookies::FromOrigin(kOrigin1),
  701. kPartyContext1, &kNonce1),
  702. };
  703. if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
  704. for (const auto& info : kNegativeWhenDoubleKeyEnabledTestCases) {
  705. EXPECT_TRUE(info.Serialize().empty());
  706. }
  707. } else {
  708. for (const auto& info : kNegativeTestCases) {
  709. EXPECT_TRUE(info.Serialize().empty());
  710. }
  711. }
  712. }
  713. } // namespace
  714. } // namespace net