1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "net/cookies/cookie_util.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <memory>
8*6777b538SAndroid Build Coastguard Worker #include <optional>
9*6777b538SAndroid Build Coastguard Worker #include <string>
10*6777b538SAndroid Build Coastguard Worker #include <tuple>
11*6777b538SAndroid Build Coastguard Worker #include <utility>
12*6777b538SAndroid Build Coastguard Worker #include <vector>
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker #include "base/containers/contains.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/strings/strcat.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_split.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/test/bind.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/test/scoped_feature_list.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/base/features.h"
22*6777b538SAndroid Build Coastguard Worker #include "net/cookies/cookie_constants.h"
23*6777b538SAndroid Build Coastguard Worker #include "net/cookies/cookie_options.h"
24*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
25*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
26*6777b538SAndroid Build Coastguard Worker #include "url/origin.h"
27*6777b538SAndroid Build Coastguard Worker
28*6777b538SAndroid Build Coastguard Worker namespace net {
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Worker namespace {
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker struct RequestCookieParsingTest {
33*6777b538SAndroid Build Coastguard Worker std::string str;
34*6777b538SAndroid Build Coastguard Worker base::StringPairs parsed;
35*6777b538SAndroid Build Coastguard Worker // Used for malformed cookies where the parsed-then-serialized string does not
36*6777b538SAndroid Build Coastguard Worker // match the original string.
37*6777b538SAndroid Build Coastguard Worker std::string serialized;
38*6777b538SAndroid Build Coastguard Worker };
39*6777b538SAndroid Build Coastguard Worker
CheckParse(const std::string & str,const base::StringPairs & parsed_expected)40*6777b538SAndroid Build Coastguard Worker void CheckParse(const std::string& str,
41*6777b538SAndroid Build Coastguard Worker const base::StringPairs& parsed_expected) {
42*6777b538SAndroid Build Coastguard Worker cookie_util::ParsedRequestCookies parsed;
43*6777b538SAndroid Build Coastguard Worker cookie_util::ParseRequestCookieLine(str, &parsed);
44*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(parsed_expected, parsed);
45*6777b538SAndroid Build Coastguard Worker }
46*6777b538SAndroid Build Coastguard Worker
CheckSerialize(const base::StringPairs & parsed,const std::string & str_expected)47*6777b538SAndroid Build Coastguard Worker void CheckSerialize(const base::StringPairs& parsed,
48*6777b538SAndroid Build Coastguard Worker const std::string& str_expected) {
49*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(str_expected, cookie_util::SerializeRequestCookieLine(parsed));
50*6777b538SAndroid Build Coastguard Worker }
51*6777b538SAndroid Build Coastguard Worker
TEST(CookieUtilTest,TestDomainIsHostOnly)52*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, TestDomainIsHostOnly) {
53*6777b538SAndroid Build Coastguard Worker const struct {
54*6777b538SAndroid Build Coastguard Worker const char* str;
55*6777b538SAndroid Build Coastguard Worker const bool is_host_only;
56*6777b538SAndroid Build Coastguard Worker } tests[] = {{"", true}, {"www.foo.com", true}, {".foo.com", false}};
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker for (const auto& test : tests) {
59*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(test.is_host_only, cookie_util::DomainIsHostOnly(test.str));
60*6777b538SAndroid Build Coastguard Worker }
61*6777b538SAndroid Build Coastguard Worker }
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker // A cookie domain containing non-ASCII characters is not allowed, even if it
64*6777b538SAndroid Build Coastguard Worker // matches the domain from the URL.
TEST(CookieUtilTest,GetCookieDomainWithString_NonASCII)65*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_NonASCII) {
66*6777b538SAndroid Build Coastguard Worker base::test::ScopedFeatureList feature_list;
67*6777b538SAndroid Build Coastguard Worker feature_list.InitAndEnableFeature(features::kCookieDomainRejectNonASCII);
68*6777b538SAndroid Build Coastguard Worker
69*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
70*6777b538SAndroid Build Coastguard Worker std::string result;
71*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::GetCookieDomainWithString(
72*6777b538SAndroid Build Coastguard Worker GURL("http://éxample.com"), "éxample.com", status, &result));
73*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting(
74*6777b538SAndroid Build Coastguard Worker {CookieInclusionStatus::EXCLUDE_DOMAIN_NON_ASCII}));
75*6777b538SAndroid Build Coastguard Worker }
76*6777b538SAndroid Build Coastguard Worker
77*6777b538SAndroid Build Coastguard Worker // An empty domain string results in the domain from the URL.
TEST(CookieUtilTest,GetCookieDomainWithString_Empty)78*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_Empty) {
79*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
80*6777b538SAndroid Build Coastguard Worker std::string result;
81*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::GetCookieDomainWithString(GURL("http://example.com"),
82*6777b538SAndroid Build Coastguard Worker "", status, &result));
83*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.IsInclude());
84*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(result, "example.com");
85*6777b538SAndroid Build Coastguard Worker }
86*6777b538SAndroid Build Coastguard Worker
87*6777b538SAndroid Build Coastguard Worker // A cookie domain string equal to the URL host, when that is an IP, results in
88*6777b538SAndroid Build Coastguard Worker // the IP.
TEST(CookieUtilTest,GetCookieDomainWithString_IP)89*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_IP) {
90*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
91*6777b538SAndroid Build Coastguard Worker std::string result;
92*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::GetCookieDomainWithString(
93*6777b538SAndroid Build Coastguard Worker GURL("http://192.0.2.3"), "192.0.2.3", status, &result));
94*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.IsInclude());
95*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(result, "192.0.2.3");
96*6777b538SAndroid Build Coastguard Worker }
97*6777b538SAndroid Build Coastguard Worker
98*6777b538SAndroid Build Coastguard Worker // A cookie domain string equal to a dot prefixed to the URL host, when that is
99*6777b538SAndroid Build Coastguard Worker // an IP, results in the IP, without the dot.
TEST(CookieUtilTest,GetCookieDomainWithString_DotIP)100*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_DotIP) {
101*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
102*6777b538SAndroid Build Coastguard Worker std::string result;
103*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::GetCookieDomainWithString(
104*6777b538SAndroid Build Coastguard Worker GURL("http://192.0.2.3"), ".192.0.2.3", status, &result));
105*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.IsInclude());
106*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(result, "192.0.2.3");
107*6777b538SAndroid Build Coastguard Worker }
108*6777b538SAndroid Build Coastguard Worker
109*6777b538SAndroid Build Coastguard Worker // A cookie domain string containing %-encoding is not allowed.
TEST(CookieUtilTest,GetCookieDomainWithString_PercentEncoded)110*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_PercentEncoded) {
111*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
112*6777b538SAndroid Build Coastguard Worker std::string result;
113*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::GetCookieDomainWithString(
114*6777b538SAndroid Build Coastguard Worker GURL("http://a.test"), "a%2Etest", status, &result));
115*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({}));
116*6777b538SAndroid Build Coastguard Worker }
117*6777b538SAndroid Build Coastguard Worker
118*6777b538SAndroid Build Coastguard Worker // A cookie domain string that cannot be canonicalized is not allowed.
TEST(CookieUtilTest,GetCookieDomainWithString_UnCanonicalizable)119*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_UnCanonicalizable) {
120*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
121*6777b538SAndroid Build Coastguard Worker std::string result;
122*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::GetCookieDomainWithString(
123*6777b538SAndroid Build Coastguard Worker GURL("http://a.test"), "a^test", status, &result));
124*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({}));
125*6777b538SAndroid Build Coastguard Worker }
126*6777b538SAndroid Build Coastguard Worker
127*6777b538SAndroid Build Coastguard Worker // A cookie domain that is an eTLD but matches the URL results in a host cookie
128*6777b538SAndroid Build Coastguard Worker // domain.
TEST(CookieUtilTest,GetCookieDomainWithString_ETldMatchesUrl)129*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_ETldMatchesUrl) {
130*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
131*6777b538SAndroid Build Coastguard Worker std::string result;
132*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::GetCookieDomainWithString(
133*6777b538SAndroid Build Coastguard Worker GURL("http://gov.uk"), "gov.uk", status, &result));
134*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.IsInclude());
135*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(result, "gov.uk");
136*6777b538SAndroid Build Coastguard Worker }
137*6777b538SAndroid Build Coastguard Worker
138*6777b538SAndroid Build Coastguard Worker // A cookie domain that is an eTLD but matches the URL results in a host cookie
139*6777b538SAndroid Build Coastguard Worker // domain, even if it is given with a dot prefix.
TEST(CookieUtilTest,GetCookieDomainWithString_ETldMatchesUrl_DotPrefix)140*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_ETldMatchesUrl_DotPrefix) {
141*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
142*6777b538SAndroid Build Coastguard Worker std::string result;
143*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::GetCookieDomainWithString(
144*6777b538SAndroid Build Coastguard Worker GURL("http://gov.uk"), ".gov.uk", status, &result));
145*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.IsInclude());
146*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(result, "gov.uk");
147*6777b538SAndroid Build Coastguard Worker }
148*6777b538SAndroid Build Coastguard Worker
149*6777b538SAndroid Build Coastguard Worker // A cookie domain that is an eTLD but matches the URL results in a host cookie
150*6777b538SAndroid Build Coastguard Worker // domain, even if its capitalization is non-canonical.
TEST(CookieUtilTest,GetCookieDomainWithString_ETldMatchesUrl_NonCanonical)151*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_ETldMatchesUrl_NonCanonical) {
152*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
153*6777b538SAndroid Build Coastguard Worker std::string result;
154*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::GetCookieDomainWithString(
155*6777b538SAndroid Build Coastguard Worker GURL("http://gov.uk"), "GoV.Uk", status, &result));
156*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.IsInclude());
157*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(result, "gov.uk");
158*6777b538SAndroid Build Coastguard Worker }
159*6777b538SAndroid Build Coastguard Worker
160*6777b538SAndroid Build Coastguard Worker // A cookie domain that is an eTLD but does not match the URL is not allowed.
TEST(CookieUtilTest,GetCookieDomainWithString_ETldDifferentUrl)161*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_ETldDifferentUrl) {
162*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
163*6777b538SAndroid Build Coastguard Worker std::string result;
164*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::GetCookieDomainWithString(
165*6777b538SAndroid Build Coastguard Worker GURL("http://nhs.gov.uk"), "gov.uk", status, &result));
166*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({}));
167*6777b538SAndroid Build Coastguard Worker }
168*6777b538SAndroid Build Coastguard Worker
169*6777b538SAndroid Build Coastguard Worker // A cookie domain with a different eTLD+1 ("organization-identifying host")
170*6777b538SAndroid Build Coastguard Worker // from the URL is not allowed.
TEST(CookieUtilTest,GetCookieDomainWithString_DifferentOrgHost)171*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_DifferentOrgHost) {
172*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
173*6777b538SAndroid Build Coastguard Worker std::string result;
174*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::GetCookieDomainWithString(
175*6777b538SAndroid Build Coastguard Worker GURL("http://portal.globex.com"), "portal.initech.com", status, &result));
176*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({}));
177*6777b538SAndroid Build Coastguard Worker }
178*6777b538SAndroid Build Coastguard Worker
179*6777b538SAndroid Build Coastguard Worker // A cookie domain that matches the URL results in a domain cookie domain.
TEST(CookieUtilTest,GetCookieDomainWithString_MatchesUrl)180*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_MatchesUrl) {
181*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
182*6777b538SAndroid Build Coastguard Worker std::string result;
183*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::GetCookieDomainWithString(
184*6777b538SAndroid Build Coastguard Worker GURL("http://globex.com"), "globex.com", status, &result));
185*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.IsInclude());
186*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(result, ".globex.com");
187*6777b538SAndroid Build Coastguard Worker }
188*6777b538SAndroid Build Coastguard Worker
189*6777b538SAndroid Build Coastguard Worker // A cookie domain that matches the URL but has a `.` prefix results in a domain
190*6777b538SAndroid Build Coastguard Worker // cookie domain.
TEST(CookieUtilTest,GetCookieDomainWithString_MatchesUrlWithDot)191*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_MatchesUrlWithDot) {
192*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
193*6777b538SAndroid Build Coastguard Worker std::string result;
194*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::GetCookieDomainWithString(
195*6777b538SAndroid Build Coastguard Worker GURL("http://globex.com"), ".globex.com", status, &result));
196*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.IsInclude());
197*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(result, ".globex.com");
198*6777b538SAndroid Build Coastguard Worker }
199*6777b538SAndroid Build Coastguard Worker
200*6777b538SAndroid Build Coastguard Worker // A cookie domain that is a subdomain of the URL host is not allowed.
TEST(CookieUtilTest,GetCookieDomainWithString_Subdomain)201*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_Subdomain) {
202*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
203*6777b538SAndroid Build Coastguard Worker std::string result;
204*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::GetCookieDomainWithString(
205*6777b538SAndroid Build Coastguard Worker GURL("http://globex.com"), "mail.globex.com", status, &result));
206*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({}));
207*6777b538SAndroid Build Coastguard Worker }
208*6777b538SAndroid Build Coastguard Worker
209*6777b538SAndroid Build Coastguard Worker // A URL that is a subdomain of the cookie domain results in a domain cookie.
TEST(CookieUtilTest,GetCookieDomainWithString_UrlSubdomain)210*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_UrlSubdomain) {
211*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
212*6777b538SAndroid Build Coastguard Worker std::string result;
213*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::GetCookieDomainWithString(
214*6777b538SAndroid Build Coastguard Worker GURL("http://mail.globex.com"), "globex.com", status, &result));
215*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.IsInclude());
216*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(result, ".globex.com");
217*6777b538SAndroid Build Coastguard Worker }
218*6777b538SAndroid Build Coastguard Worker
219*6777b538SAndroid Build Coastguard Worker // A URL of which the cookie domain is a substring, but not a dotted suffix,
220*6777b538SAndroid Build Coastguard Worker // is not allowed.
TEST(CookieUtilTest,GetCookieDomainWithString_SubstringButUrlNotSubdomain)221*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_SubstringButUrlNotSubdomain) {
222*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
223*6777b538SAndroid Build Coastguard Worker std::string result;
224*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::GetCookieDomainWithString(
225*6777b538SAndroid Build Coastguard Worker GURL("http://myglobex.com"), "globex.com", status, &result));
226*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({}));
227*6777b538SAndroid Build Coastguard Worker }
228*6777b538SAndroid Build Coastguard Worker
229*6777b538SAndroid Build Coastguard Worker // A URL which has a different subdomain of the eTLD+1 than the cookie domain is
230*6777b538SAndroid Build Coastguard Worker // not allowed, regardless of which hostname is longer.
TEST(CookieUtilTest,GetCookieDomainWithString_DifferentSubdomain)231*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_DifferentSubdomain) {
232*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
233*6777b538SAndroid Build Coastguard Worker std::string result;
234*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::GetCookieDomainWithString(
235*6777b538SAndroid Build Coastguard Worker GURL("http://l.globex.com"), "portal.globex.com", status, &result));
236*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({}));
237*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::GetCookieDomainWithString(
238*6777b538SAndroid Build Coastguard Worker GURL("http://portal.globex.com"), "l.globex.com", status, &result));
239*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({}));
240*6777b538SAndroid Build Coastguard Worker }
241*6777b538SAndroid Build Coastguard Worker
242*6777b538SAndroid Build Coastguard Worker // A URL without a host can set a "host" cookie with no cookie domain.
TEST(CookieUtilTest,GetCookieDomainWithString_NoUrlHost)243*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_NoUrlHost) {
244*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
245*6777b538SAndroid Build Coastguard Worker std::string result;
246*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::GetCookieDomainWithString(
247*6777b538SAndroid Build Coastguard Worker GURL("file:///C:/bar.html"), "", status, &result));
248*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(result, "");
249*6777b538SAndroid Build Coastguard Worker }
250*6777b538SAndroid Build Coastguard Worker
251*6777b538SAndroid Build Coastguard Worker // A URL with two trailing dots (which is an invalid hostname per
252*6777b538SAndroid Build Coastguard Worker // rfc6265bis-11#5.1.2 and will cause GetDomainAndRegistry to return an empty
253*6777b538SAndroid Build Coastguard Worker // string) is not allowed.
TEST(CookieUtilTest,GetCookieDomainWithString_TrailingDots)254*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_TrailingDots) {
255*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
256*6777b538SAndroid Build Coastguard Worker std::string result;
257*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::GetCookieDomainWithString(
258*6777b538SAndroid Build Coastguard Worker GURL("http://foo.com../"), "foo.com..", status, &result));
259*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({}));
260*6777b538SAndroid Build Coastguard Worker }
261*6777b538SAndroid Build Coastguard Worker
262*6777b538SAndroid Build Coastguard Worker // A "normal" URL does not match with a cookie containing two trailing dots (or
263*6777b538SAndroid Build Coastguard Worker // just one).
TEST(CookieUtilTest,GetCookieDomainWithString_TrailingDots_NotMatchingUrlHost)264*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest,
265*6777b538SAndroid Build Coastguard Worker GetCookieDomainWithString_TrailingDots_NotMatchingUrlHost) {
266*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
267*6777b538SAndroid Build Coastguard Worker std::string result;
268*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::GetCookieDomainWithString(
269*6777b538SAndroid Build Coastguard Worker GURL("http://foo.com/"), ".foo.com..", status, &result));
270*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({}));
271*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::GetCookieDomainWithString(
272*6777b538SAndroid Build Coastguard Worker GURL("http://foo.com/"), ".foo.com.", status, &result));
273*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({}));
274*6777b538SAndroid Build Coastguard Worker }
275*6777b538SAndroid Build Coastguard Worker
276*6777b538SAndroid Build Coastguard Worker // A URL containing an IP address is allowed, if that IP matches the cookie
277*6777b538SAndroid Build Coastguard Worker // domain.
TEST(CookieUtilTest,GetCookieDomainWithString_UrlHostIP)278*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_UrlHostIP) {
279*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
280*6777b538SAndroid Build Coastguard Worker std::string result;
281*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::GetCookieDomainWithString(
282*6777b538SAndroid Build Coastguard Worker GURL("http://192.0.2.3/"), "192.0.2.3", status, &result));
283*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(result, "192.0.2.3");
284*6777b538SAndroid Build Coastguard Worker }
285*6777b538SAndroid Build Coastguard Worker
286*6777b538SAndroid Build Coastguard Worker // A cookie domain with a dot-prefixed IP is allowed, if the IP matches
287*6777b538SAndroid Build Coastguard Worker // the URL, but is transformed to a host cookie domain.
TEST(CookieUtilTest,GetCookieDomainWithString_UrlHostIP_DomainCookie)288*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_UrlHostIP_DomainCookie) {
289*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
290*6777b538SAndroid Build Coastguard Worker std::string result;
291*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::GetCookieDomainWithString(
292*6777b538SAndroid Build Coastguard Worker GURL("http://192.0.2.3/"), ".192.0.2.3", status, &result));
293*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(result, "192.0.2.3"); // No dot.
294*6777b538SAndroid Build Coastguard Worker }
295*6777b538SAndroid Build Coastguard Worker
296*6777b538SAndroid Build Coastguard Worker // A URL containing a TLD that is unknown as a registry is allowed, if it
297*6777b538SAndroid Build Coastguard Worker // matches the cookie domain.
TEST(CookieUtilTest,GetCookieDomainWithString_UnknownRegistry)298*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, GetCookieDomainWithString_UnknownRegistry) {
299*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus status;
300*6777b538SAndroid Build Coastguard Worker std::string result;
301*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::GetCookieDomainWithString(GURL("http://bar/"), "bar",
302*6777b538SAndroid Build Coastguard Worker status, &result));
303*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(result, "bar");
304*6777b538SAndroid Build Coastguard Worker }
305*6777b538SAndroid Build Coastguard Worker
TEST(CookieUtilTest,TestCookieDateParsing)306*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, TestCookieDateParsing) {
307*6777b538SAndroid Build Coastguard Worker const struct {
308*6777b538SAndroid Build Coastguard Worker const char* str;
309*6777b538SAndroid Build Coastguard Worker const bool valid;
310*6777b538SAndroid Build Coastguard Worker const double epoch;
311*6777b538SAndroid Build Coastguard Worker } tests[] = {
312*6777b538SAndroid Build Coastguard Worker {"Sat, 15-Apr-17 21:01:22 GMT", true, 1492290082},
313*6777b538SAndroid Build Coastguard Worker {"Thu, 19-Apr-2007 16:00:00 GMT", true, 1176998400},
314*6777b538SAndroid Build Coastguard Worker {"Wed, 25 Apr 2007 21:02:13 GMT", true, 1177534933},
315*6777b538SAndroid Build Coastguard Worker {"Thu, 19/Apr\\2007 16:00:00 GMT", true, 1176998400},
316*6777b538SAndroid Build Coastguard Worker {"Fri, 1 Jan 2010 01:01:50 GMT", true, 1262307710},
317*6777b538SAndroid Build Coastguard Worker {"Wednesday, 1-Jan-2003 00:00:00 GMT", true, 1041379200},
318*6777b538SAndroid Build Coastguard Worker {", 1-Jan-2003 00:00:00 GMT", true, 1041379200},
319*6777b538SAndroid Build Coastguard Worker {" 1-Jan-2003 00:00:00 GMT", true, 1041379200},
320*6777b538SAndroid Build Coastguard Worker {"1-Jan-2003 00:00:00 GMT", true, 1041379200},
321*6777b538SAndroid Build Coastguard Worker {"Wed,18-Apr-07 22:50:12 GMT", true, 1176936612},
322*6777b538SAndroid Build Coastguard Worker {"WillyWonka , 18-Apr-07 22:50:12 GMT", true, 1176936612},
323*6777b538SAndroid Build Coastguard Worker {"WillyWonka , 18-Apr-07 22:50:12", true, 1176936612},
324*6777b538SAndroid Build Coastguard Worker {"WillyWonka , 18-apr-07 22:50:12", true, 1176936612},
325*6777b538SAndroid Build Coastguard Worker {"Mon, 18-Apr-1977 22:50:13 GMT", true, 230251813},
326*6777b538SAndroid Build Coastguard Worker {"Mon, 18-Apr-77 22:50:13 GMT", true, 230251813},
327*6777b538SAndroid Build Coastguard Worker // If the cookie came in with the expiration quoted (which in terms of
328*6777b538SAndroid Build Coastguard Worker // the RFC you shouldn't do), we will get string quoted. Bug 1261605.
329*6777b538SAndroid Build Coastguard Worker {"\"Sat, 15-Apr-17\\\"21:01:22\\\"GMT\"", true, 1492290082},
330*6777b538SAndroid Build Coastguard Worker // Test with full month names and partial names.
331*6777b538SAndroid Build Coastguard Worker {"Partyday, 18- April-07 22:50:12", true, 1176936612},
332*6777b538SAndroid Build Coastguard Worker {"Partyday, 18 - Apri-07 22:50:12", true, 1176936612},
333*6777b538SAndroid Build Coastguard Worker {"Wednes, 1-Januar-2003 00:00:00 GMT", true, 1041379200},
334*6777b538SAndroid Build Coastguard Worker // Test that we always take GMT even with other time zones or bogus
335*6777b538SAndroid Build Coastguard Worker // values. The RFC says everything should be GMT, and in the worst case
336*6777b538SAndroid Build Coastguard Worker // we are 24 hours off because of zone issues.
337*6777b538SAndroid Build Coastguard Worker {"Sat, 15-Apr-17 21:01:22", true, 1492290082},
338*6777b538SAndroid Build Coastguard Worker {"Sat, 15-Apr-17 21:01:22 GMT-2", true, 1492290082},
339*6777b538SAndroid Build Coastguard Worker {"Sat, 15-Apr-17 21:01:22 GMT BLAH", true, 1492290082},
340*6777b538SAndroid Build Coastguard Worker {"Sat, 15-Apr-17 21:01:22 GMT-0400", true, 1492290082},
341*6777b538SAndroid Build Coastguard Worker {"Sat, 15-Apr-17 21:01:22 GMT-0400 (EDT)", true, 1492290082},
342*6777b538SAndroid Build Coastguard Worker {"Sat, 15-Apr-17 21:01:22 DST", true, 1492290082},
343*6777b538SAndroid Build Coastguard Worker {"Sat, 15-Apr-17 21:01:22 -0400", true, 1492290082},
344*6777b538SAndroid Build Coastguard Worker {"Sat, 15-Apr-17 21:01:22 (hello there)", true, 1492290082},
345*6777b538SAndroid Build Coastguard Worker // Test that if we encounter multiple : fields, that we take the first
346*6777b538SAndroid Build Coastguard Worker // that correctly parses.
347*6777b538SAndroid Build Coastguard Worker {"Sat, 15-Apr-17 21:01:22 11:22:33", true, 1492290082},
348*6777b538SAndroid Build Coastguard Worker {"Sat, 15-Apr-17 ::00 21:01:22", true, 1492290082},
349*6777b538SAndroid Build Coastguard Worker {"Sat, 15-Apr-17 boink:z 21:01:22", true, 1492290082},
350*6777b538SAndroid Build Coastguard Worker // We take the first, which in this case is invalid.
351*6777b538SAndroid Build Coastguard Worker {"Sat, 15-Apr-17 91:22:33 21:01:22", false, 0},
352*6777b538SAndroid Build Coastguard Worker // amazon.com formats their cookie expiration like this.
353*6777b538SAndroid Build Coastguard Worker {"Thu Apr 18 22:50:12 2007 GMT", true, 1176936612},
354*6777b538SAndroid Build Coastguard Worker // Test that hh:mm:ss can occur anywhere.
355*6777b538SAndroid Build Coastguard Worker {"22:50:12 Thu Apr 18 2007 GMT", true, 1176936612},
356*6777b538SAndroid Build Coastguard Worker {"Thu 22:50:12 Apr 18 2007 GMT", true, 1176936612},
357*6777b538SAndroid Build Coastguard Worker {"Thu Apr 22:50:12 18 2007 GMT", true, 1176936612},
358*6777b538SAndroid Build Coastguard Worker {"Thu Apr 18 22:50:12 2007 GMT", true, 1176936612},
359*6777b538SAndroid Build Coastguard Worker {"Thu Apr 18 2007 22:50:12 GMT", true, 1176936612},
360*6777b538SAndroid Build Coastguard Worker {"Thu Apr 18 2007 GMT 22:50:12", true, 1176936612},
361*6777b538SAndroid Build Coastguard Worker // Test that the day and year can be anywhere if they are unambigious.
362*6777b538SAndroid Build Coastguard Worker {"Sat, 15-Apr-17 21:01:22 GMT", true, 1492290082},
363*6777b538SAndroid Build Coastguard Worker {"15-Sat, Apr-17 21:01:22 GMT", true, 1492290082},
364*6777b538SAndroid Build Coastguard Worker {"15-Sat, Apr 21:01:22 GMT 17", true, 1492290082},
365*6777b538SAndroid Build Coastguard Worker {"15-Sat, Apr 21:01:22 GMT 2017", true, 1492290082},
366*6777b538SAndroid Build Coastguard Worker {"15 Apr 21:01:22 2017", true, 1492290082},
367*6777b538SAndroid Build Coastguard Worker {"15 17 Apr 21:01:22", true, 1492290082},
368*6777b538SAndroid Build Coastguard Worker {"Apr 15 17 21:01:22", true, 1492290082},
369*6777b538SAndroid Build Coastguard Worker {"Apr 15 21:01:22 17", true, 1492290082},
370*6777b538SAndroid Build Coastguard Worker {"2017 April 15 21:01:22", true, 1492290082},
371*6777b538SAndroid Build Coastguard Worker {"15 April 2017 21:01:22", true, 1492290082},
372*6777b538SAndroid Build Coastguard Worker // Test two-digit abbreviated year numbers.
373*6777b538SAndroid Build Coastguard Worker {"1-Jan-71 00:00:00 GMT" /* 1971 */, true, 31536000},
374*6777b538SAndroid Build Coastguard Worker {"1-Jan-70 00:00:00 GMT" /* 1970 */, true, 0},
375*6777b538SAndroid Build Coastguard Worker {"1-Jan-69 00:00:00 GMT" /* 2069 */, true, 3124224000},
376*6777b538SAndroid Build Coastguard Worker {"1-Jan-68 00:00:00 GMT" /* 2068 */, true, 3092601600},
377*6777b538SAndroid Build Coastguard Worker // Some invalid dates
378*6777b538SAndroid Build Coastguard Worker {"98 April 17 21:01:22", false, 0},
379*6777b538SAndroid Build Coastguard Worker {"Thu, 012-Aug-2008 20:49:07 GMT", false, 0},
380*6777b538SAndroid Build Coastguard Worker {"Thu, 12-Aug-9999999999 20:49:07 GMT", false, 0},
381*6777b538SAndroid Build Coastguard Worker {"Thu, 999999999999-Aug-2007 20:49:07 GMT", false, 0},
382*6777b538SAndroid Build Coastguard Worker {"Thu, 12-Aug-2007 20:61:99999999999 GMT", false, 0},
383*6777b538SAndroid Build Coastguard Worker {"IAintNoDateFool", false, 0},
384*6777b538SAndroid Build Coastguard Worker {"1600 April 33 21:01:22", false, 0},
385*6777b538SAndroid Build Coastguard Worker {"1970 April 33 21:01:22", false, 0},
386*6777b538SAndroid Build Coastguard Worker {"Thu, 33-Aug-31841 20:49:07 GMT", false, 0},
387*6777b538SAndroid Build Coastguard Worker };
388*6777b538SAndroid Build Coastguard Worker
389*6777b538SAndroid Build Coastguard Worker base::Time parsed_time;
390*6777b538SAndroid Build Coastguard Worker for (const auto& test : tests) {
391*6777b538SAndroid Build Coastguard Worker parsed_time = cookie_util::ParseCookieExpirationTime(test.str);
392*6777b538SAndroid Build Coastguard Worker if (!test.valid) {
393*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(parsed_time.is_null()) << test.str;
394*6777b538SAndroid Build Coastguard Worker continue;
395*6777b538SAndroid Build Coastguard Worker }
396*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(!parsed_time.is_null()) << test.str;
397*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(test.epoch, parsed_time.InSecondsFSinceUnixEpoch()) << test.str;
398*6777b538SAndroid Build Coastguard Worker }
399*6777b538SAndroid Build Coastguard Worker }
400*6777b538SAndroid Build Coastguard Worker
401*6777b538SAndroid Build Coastguard Worker // Tests parsing dates that are beyond 2038. 32-bit (non-Mac) POSIX systems are
402*6777b538SAndroid Build Coastguard Worker // incapable of doing this, however the expectation is for cookie parsing to
403*6777b538SAndroid Build Coastguard Worker // succeed anyway (and return the minimum value Time::FromUTCExploded() can
404*6777b538SAndroid Build Coastguard Worker // parse on the current platform). Also checks a date outside the limit on
405*6777b538SAndroid Build Coastguard Worker // Windows, which is year 30827.
TEST(CookieUtilTest,ParseCookieExpirationTimeBeyond2038)406*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, ParseCookieExpirationTimeBeyond2038) {
407*6777b538SAndroid Build Coastguard Worker const char* kTests[] = {
408*6777b538SAndroid Build Coastguard Worker "Thu, 12-Aug-31841 20:49:07 GMT", "2039 April 15 21:01:22",
409*6777b538SAndroid Build Coastguard Worker "2039 April 15 21:01:22", "2038 April 15 21:01:22",
410*6777b538SAndroid Build Coastguard Worker "15 April 69 21:01:22", "15 April 68, 21:01:22",
411*6777b538SAndroid Build Coastguard Worker };
412*6777b538SAndroid Build Coastguard Worker
413*6777b538SAndroid Build Coastguard Worker for (auto* test : kTests) {
414*6777b538SAndroid Build Coastguard Worker base::Time parsed_time = cookie_util::ParseCookieExpirationTime(test);
415*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(parsed_time.is_null());
416*6777b538SAndroid Build Coastguard Worker
417*6777b538SAndroid Build Coastguard Worker // It should either have an exact value, or be base::Time::Max(). For
418*6777b538SAndroid Build Coastguard Worker // simplicity just check that it is greater than an arbitray date.
419*6777b538SAndroid Build Coastguard Worker base::Time almost_jan_2038 = base::Time::UnixEpoch() + base::Days(365 * 68);
420*6777b538SAndroid Build Coastguard Worker EXPECT_LT(almost_jan_2038, parsed_time);
421*6777b538SAndroid Build Coastguard Worker }
422*6777b538SAndroid Build Coastguard Worker }
423*6777b538SAndroid Build Coastguard Worker
424*6777b538SAndroid Build Coastguard Worker // Tests parsing dates that are prior to (or around) 1970. Non-Mac POSIX systems
425*6777b538SAndroid Build Coastguard Worker // are incapable of doing this, however the expectation is for cookie parsing to
426*6777b538SAndroid Build Coastguard Worker // succeed anyway (and return a minimal base::Time).
TEST(CookieUtilTest,ParseCookieExpirationTimeBefore1970)427*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, ParseCookieExpirationTimeBefore1970) {
428*6777b538SAndroid Build Coastguard Worker const char* kTests[] = {
429*6777b538SAndroid Build Coastguard Worker // Times around the Unix epoch.
430*6777b538SAndroid Build Coastguard Worker "1970 Jan 1 00:00:00",
431*6777b538SAndroid Build Coastguard Worker "1969 March 3 21:01:22",
432*6777b538SAndroid Build Coastguard Worker // Two digit year abbreviations.
433*6777b538SAndroid Build Coastguard Worker "1-Jan-70 00:00:00",
434*6777b538SAndroid Build Coastguard Worker "Jan 1, 70 00:00:00",
435*6777b538SAndroid Build Coastguard Worker // Times around the Windows epoch.
436*6777b538SAndroid Build Coastguard Worker "1601 Jan 1 00:00:00",
437*6777b538SAndroid Build Coastguard Worker "1600 April 15 21:01:22",
438*6777b538SAndroid Build Coastguard Worker // Times around kExplodedMinYear on Mac.
439*6777b538SAndroid Build Coastguard Worker "1902 Jan 1 00:00:00",
440*6777b538SAndroid Build Coastguard Worker "1901 Jan 1 00:00:00",
441*6777b538SAndroid Build Coastguard Worker };
442*6777b538SAndroid Build Coastguard Worker
443*6777b538SAndroid Build Coastguard Worker for (auto* test : kTests) {
444*6777b538SAndroid Build Coastguard Worker base::Time parsed_time = cookie_util::ParseCookieExpirationTime(test);
445*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(parsed_time.is_null()) << test;
446*6777b538SAndroid Build Coastguard Worker
447*6777b538SAndroid Build Coastguard Worker // It should either have an exact value, or should be base::Time(1)
448*6777b538SAndroid Build Coastguard Worker // For simplicity just check that it is less than the unix epoch.
449*6777b538SAndroid Build Coastguard Worker EXPECT_LE(parsed_time, base::Time::UnixEpoch()) << test;
450*6777b538SAndroid Build Coastguard Worker }
451*6777b538SAndroid Build Coastguard Worker }
452*6777b538SAndroid Build Coastguard Worker
TEST(CookieUtilTest,TestRequestCookieParsing)453*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, TestRequestCookieParsing) {
454*6777b538SAndroid Build Coastguard Worker std::vector<RequestCookieParsingTest> tests;
455*6777b538SAndroid Build Coastguard Worker
456*6777b538SAndroid Build Coastguard Worker // Simple case.
457*6777b538SAndroid Build Coastguard Worker tests.emplace_back();
458*6777b538SAndroid Build Coastguard Worker tests.back().str = "key=value";
459*6777b538SAndroid Build Coastguard Worker tests.back().parsed.emplace_back(std::string("key"), std::string("value"));
460*6777b538SAndroid Build Coastguard Worker // Multiple key/value pairs.
461*6777b538SAndroid Build Coastguard Worker tests.emplace_back();
462*6777b538SAndroid Build Coastguard Worker tests.back().str = "key1=value1; key2=value2";
463*6777b538SAndroid Build Coastguard Worker tests.back().parsed.emplace_back(std::string("key1"), std::string("value1"));
464*6777b538SAndroid Build Coastguard Worker tests.back().parsed.emplace_back(std::string("key2"), std::string("value2"));
465*6777b538SAndroid Build Coastguard Worker // Empty value.
466*6777b538SAndroid Build Coastguard Worker tests.emplace_back();
467*6777b538SAndroid Build Coastguard Worker tests.back().str = "key=; otherkey=1234";
468*6777b538SAndroid Build Coastguard Worker tests.back().parsed.emplace_back(std::string("key"), std::string());
469*6777b538SAndroid Build Coastguard Worker tests.back().parsed.emplace_back(std::string("otherkey"),
470*6777b538SAndroid Build Coastguard Worker std::string("1234"));
471*6777b538SAndroid Build Coastguard Worker // Special characters (including equals signs) in value.
472*6777b538SAndroid Build Coastguard Worker tests.emplace_back();
473*6777b538SAndroid Build Coastguard Worker tests.back().str = "key=; a2=s=(./&t=:&u=a#$; a3=+~";
474*6777b538SAndroid Build Coastguard Worker tests.back().parsed.emplace_back(std::string("key"), std::string());
475*6777b538SAndroid Build Coastguard Worker tests.back().parsed.emplace_back(std::string("a2"),
476*6777b538SAndroid Build Coastguard Worker std::string("s=(./&t=:&u=a#$"));
477*6777b538SAndroid Build Coastguard Worker tests.back().parsed.emplace_back(std::string("a3"), std::string("+~"));
478*6777b538SAndroid Build Coastguard Worker // Quoted value.
479*6777b538SAndroid Build Coastguard Worker tests.emplace_back();
480*6777b538SAndroid Build Coastguard Worker tests.back().str = "key=\"abcdef\"; otherkey=1234";
481*6777b538SAndroid Build Coastguard Worker tests.back().parsed.emplace_back(std::string("key"),
482*6777b538SAndroid Build Coastguard Worker std::string("\"abcdef\""));
483*6777b538SAndroid Build Coastguard Worker tests.back().parsed.emplace_back(std::string("otherkey"),
484*6777b538SAndroid Build Coastguard Worker std::string("1234"));
485*6777b538SAndroid Build Coastguard Worker
486*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < tests.size(); i++) {
487*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(testing::Message() << "Test " << i);
488*6777b538SAndroid Build Coastguard Worker CheckParse(tests[i].str, tests[i].parsed);
489*6777b538SAndroid Build Coastguard Worker CheckSerialize(tests[i].parsed, tests[i].str);
490*6777b538SAndroid Build Coastguard Worker }
491*6777b538SAndroid Build Coastguard Worker }
492*6777b538SAndroid Build Coastguard Worker
TEST(CookieUtilTest,TestRequestCookieParsing_Malformed)493*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, TestRequestCookieParsing_Malformed) {
494*6777b538SAndroid Build Coastguard Worker std::vector<RequestCookieParsingTest> tests;
495*6777b538SAndroid Build Coastguard Worker
496*6777b538SAndroid Build Coastguard Worker // Missing equal sign.
497*6777b538SAndroid Build Coastguard Worker tests.emplace_back();
498*6777b538SAndroid Build Coastguard Worker tests.back().str = "key";
499*6777b538SAndroid Build Coastguard Worker tests.back().parsed.emplace_back(std::string("key"), std::string());
500*6777b538SAndroid Build Coastguard Worker tests.back().serialized = "key=";
501*6777b538SAndroid Build Coastguard Worker
502*6777b538SAndroid Build Coastguard Worker // Quoted value with unclosed quote.
503*6777b538SAndroid Build Coastguard Worker tests.emplace_back();
504*6777b538SAndroid Build Coastguard Worker tests.back().str = "key=\"abcdef";
505*6777b538SAndroid Build Coastguard Worker
506*6777b538SAndroid Build Coastguard Worker // Quoted value with unclosed quote followed by regular value.
507*6777b538SAndroid Build Coastguard Worker tests.emplace_back();
508*6777b538SAndroid Build Coastguard Worker tests.back().str = "key=\"abcdef; otherkey=1234";
509*6777b538SAndroid Build Coastguard Worker
510*6777b538SAndroid Build Coastguard Worker // Quoted value with unclosed quote followed by another quoted value.
511*6777b538SAndroid Build Coastguard Worker tests.emplace_back();
512*6777b538SAndroid Build Coastguard Worker tests.back().str = "key=\"abcdef; otherkey=\"1234\"";
513*6777b538SAndroid Build Coastguard Worker tests.back().parsed.emplace_back(std::string("key"),
514*6777b538SAndroid Build Coastguard Worker std::string("\"abcdef; otherkey=\""));
515*6777b538SAndroid Build Coastguard Worker tests.back().parsed.emplace_back(std::string("234\""), std::string());
516*6777b538SAndroid Build Coastguard Worker tests.back().serialized = "key=\"abcdef; otherkey=\"; 234\"=";
517*6777b538SAndroid Build Coastguard Worker
518*6777b538SAndroid Build Coastguard Worker // Regular value followed by quoted value with unclosed quote.
519*6777b538SAndroid Build Coastguard Worker tests.emplace_back();
520*6777b538SAndroid Build Coastguard Worker tests.back().str = "key=abcdef; otherkey=\"1234";
521*6777b538SAndroid Build Coastguard Worker tests.back().parsed.emplace_back(std::string("key"), std::string("abcdef"));
522*6777b538SAndroid Build Coastguard Worker tests.back().serialized = "key=abcdef";
523*6777b538SAndroid Build Coastguard Worker
524*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < tests.size(); i++) {
525*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(testing::Message() << "Test " << i);
526*6777b538SAndroid Build Coastguard Worker CheckParse(tests[i].str, tests[i].parsed);
527*6777b538SAndroid Build Coastguard Worker CheckSerialize(tests[i].parsed, tests[i].serialized);
528*6777b538SAndroid Build Coastguard Worker }
529*6777b538SAndroid Build Coastguard Worker }
530*6777b538SAndroid Build Coastguard Worker
TEST(CookieUtilTest,CookieDomainAndPathToURL)531*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, CookieDomainAndPathToURL) {
532*6777b538SAndroid Build Coastguard Worker struct {
533*6777b538SAndroid Build Coastguard Worker std::string domain;
534*6777b538SAndroid Build Coastguard Worker std::string path;
535*6777b538SAndroid Build Coastguard Worker bool is_https;
536*6777b538SAndroid Build Coastguard Worker std::string expected_url;
537*6777b538SAndroid Build Coastguard Worker } kTests[]{
538*6777b538SAndroid Build Coastguard Worker {"a.com", "/", true, "https://a.com/"},
539*6777b538SAndroid Build Coastguard Worker {"a.com", "/", false, "http://a.com/"},
540*6777b538SAndroid Build Coastguard Worker {".a.com", "/", true, "https://a.com/"},
541*6777b538SAndroid Build Coastguard Worker {".a.com", "/", false, "http://a.com/"},
542*6777b538SAndroid Build Coastguard Worker {"b.a.com", "/", true, "https://b.a.com/"},
543*6777b538SAndroid Build Coastguard Worker {"b.a.com", "/", false, "http://b.a.com/"},
544*6777b538SAndroid Build Coastguard Worker {"a.com", "/example/path", true, "https://a.com/example/path"},
545*6777b538SAndroid Build Coastguard Worker {".a.com", "/example/path", false, "http://a.com/example/path"},
546*6777b538SAndroid Build Coastguard Worker {"b.a.com", "/example/path", true, "https://b.a.com/example/path"},
547*6777b538SAndroid Build Coastguard Worker {".b.a.com", "/example/path", false, "http://b.a.com/example/path"},
548*6777b538SAndroid Build Coastguard Worker };
549*6777b538SAndroid Build Coastguard Worker
550*6777b538SAndroid Build Coastguard Worker for (auto& test : kTests) {
551*6777b538SAndroid Build Coastguard Worker GURL url1 = cookie_util::CookieDomainAndPathToURL(test.domain, test.path,
552*6777b538SAndroid Build Coastguard Worker test.is_https);
553*6777b538SAndroid Build Coastguard Worker GURL url2 = cookie_util::CookieDomainAndPathToURL(
554*6777b538SAndroid Build Coastguard Worker test.domain, test.path, std::string(test.is_https ? "https" : "http"));
555*6777b538SAndroid Build Coastguard Worker // Test both overloads for equality.
556*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url1, url2);
557*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(url1, GURL(test.expected_url));
558*6777b538SAndroid Build Coastguard Worker }
559*6777b538SAndroid Build Coastguard Worker }
560*6777b538SAndroid Build Coastguard Worker
TEST(CookieUtilTest,SimulatedCookieSource)561*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, SimulatedCookieSource) {
562*6777b538SAndroid Build Coastguard Worker GURL secure_url("https://b.a.com");
563*6777b538SAndroid Build Coastguard Worker GURL insecure_url("http://b.a.com");
564*6777b538SAndroid Build Coastguard Worker
565*6777b538SAndroid Build Coastguard Worker struct {
566*6777b538SAndroid Build Coastguard Worker std::string cookie;
567*6777b538SAndroid Build Coastguard Worker std::string source_scheme;
568*6777b538SAndroid Build Coastguard Worker std::string expected_simulated_source;
569*6777b538SAndroid Build Coastguard Worker } kTests[]{
570*6777b538SAndroid Build Coastguard Worker {"cookie=foo", "http", "http://b.a.com/"},
571*6777b538SAndroid Build Coastguard Worker {"cookie=foo", "https", "https://b.a.com/"},
572*6777b538SAndroid Build Coastguard Worker {"cookie=foo", "wss", "wss://b.a.com/"},
573*6777b538SAndroid Build Coastguard Worker {"cookie=foo", "file", "file://b.a.com/"},
574*6777b538SAndroid Build Coastguard Worker {"cookie=foo; Domain=b.a.com", "https", "https://b.a.com/"},
575*6777b538SAndroid Build Coastguard Worker {"cookie=foo; Domain=a.com", "https", "https://a.com/"},
576*6777b538SAndroid Build Coastguard Worker {"cookie=foo; Domain=.b.a.com", "https", "https://b.a.com/"},
577*6777b538SAndroid Build Coastguard Worker {"cookie=foo; Domain=.a.com", "https", "https://a.com/"},
578*6777b538SAndroid Build Coastguard Worker {"cookie=foo; Path=/", "https", "https://b.a.com/"},
579*6777b538SAndroid Build Coastguard Worker {"cookie=foo; Path=/bar", "https", "https://b.a.com/bar"},
580*6777b538SAndroid Build Coastguard Worker {"cookie=foo; Domain=b.a.com; Path=/", "https", "https://b.a.com/"},
581*6777b538SAndroid Build Coastguard Worker {"cookie=foo; Domain=b.a.com; Path=/bar", "https", "https://b.a.com/bar"},
582*6777b538SAndroid Build Coastguard Worker {"cookie=foo; Domain=a.com; Path=/", "https", "https://a.com/"},
583*6777b538SAndroid Build Coastguard Worker {"cookie=foo; Domain=a.com; Path=/bar", "https", "https://a.com/bar"},
584*6777b538SAndroid Build Coastguard Worker };
585*6777b538SAndroid Build Coastguard Worker
586*6777b538SAndroid Build Coastguard Worker for (const auto& test : kTests) {
587*6777b538SAndroid Build Coastguard Worker std::vector<std::unique_ptr<CanonicalCookie>> cookies;
588*6777b538SAndroid Build Coastguard Worker // It shouldn't depend on the cookie's secureness or actual source scheme.
589*6777b538SAndroid Build Coastguard Worker cookies.push_back(CanonicalCookie::CreateForTesting(
590*6777b538SAndroid Build Coastguard Worker insecure_url, test.cookie, base::Time::Now()));
591*6777b538SAndroid Build Coastguard Worker cookies.push_back(CanonicalCookie::CreateForTesting(secure_url, test.cookie,
592*6777b538SAndroid Build Coastguard Worker base::Time::Now()));
593*6777b538SAndroid Build Coastguard Worker cookies.push_back(CanonicalCookie::CreateForTesting(
594*6777b538SAndroid Build Coastguard Worker secure_url, test.cookie + "; Secure", base::Time::Now()));
595*6777b538SAndroid Build Coastguard Worker for (const auto& cookie : cookies) {
596*6777b538SAndroid Build Coastguard Worker GURL simulated_source =
597*6777b538SAndroid Build Coastguard Worker cookie_util::SimulatedCookieSource(*cookie, test.source_scheme);
598*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(GURL(test.expected_simulated_source), simulated_source);
599*6777b538SAndroid Build Coastguard Worker }
600*6777b538SAndroid Build Coastguard Worker }
601*6777b538SAndroid Build Coastguard Worker }
602*6777b538SAndroid Build Coastguard Worker
TEST(CookieUtilTest,TestGetEffectiveDomain)603*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, TestGetEffectiveDomain) {
604*6777b538SAndroid Build Coastguard Worker // Note: registry_controlled_domains::GetDomainAndRegistry is tested in its
605*6777b538SAndroid Build Coastguard Worker // own unittests.
606*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("example.com",
607*6777b538SAndroid Build Coastguard Worker cookie_util::GetEffectiveDomain("http", "www.example.com"));
608*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("example.com",
609*6777b538SAndroid Build Coastguard Worker cookie_util::GetEffectiveDomain("https", "www.example.com"));
610*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("example.com",
611*6777b538SAndroid Build Coastguard Worker cookie_util::GetEffectiveDomain("ws", "www.example.com"));
612*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("example.com",
613*6777b538SAndroid Build Coastguard Worker cookie_util::GetEffectiveDomain("wss", "www.example.com"));
614*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("www.example.com",
615*6777b538SAndroid Build Coastguard Worker cookie_util::GetEffectiveDomain("ftp", "www.example.com"));
616*6777b538SAndroid Build Coastguard Worker }
617*6777b538SAndroid Build Coastguard Worker
TEST(CookieUtilTest,TestIsDomainMatch)618*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, TestIsDomainMatch) {
619*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::IsDomainMatch("example.com", "example.com"));
620*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::IsDomainMatch("www.example.com", "example.com"));
621*6777b538SAndroid Build Coastguard Worker
622*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::IsDomainMatch(".example.com", "example.com"));
623*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::IsDomainMatch(".example.com", "www.example.com"));
624*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::IsDomainMatch(".www.example.com", "example.com"));
625*6777b538SAndroid Build Coastguard Worker
626*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::IsDomainMatch("example.com", "example.de"));
627*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::IsDomainMatch(".example.com", "example.de"));
628*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::IsDomainMatch(".example.de", "example.de.vu"));
629*6777b538SAndroid Build Coastguard Worker }
630*6777b538SAndroid Build Coastguard Worker
TEST(CookieUtilTest,TestIsOnPath)631*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, TestIsOnPath) {
632*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::IsOnPath("/", "/"));
633*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::IsOnPath("/", "/test"));
634*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::IsOnPath("/", "/test/bar.html"));
635*6777b538SAndroid Build Coastguard Worker
636*6777b538SAndroid Build Coastguard Worker // Test the empty string edge case.
637*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::IsOnPath("/", std::string()));
638*6777b538SAndroid Build Coastguard Worker
639*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::IsOnPath("/test", "/"));
640*6777b538SAndroid Build Coastguard Worker
641*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::IsOnPath("/test", "/test"));
642*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::IsOnPath("/test", "/testtest/"));
643*6777b538SAndroid Build Coastguard Worker
644*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::IsOnPath("/test", "/test/bar.html"));
645*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::IsOnPath("/test", "/test/sample/bar.html"));
646*6777b538SAndroid Build Coastguard Worker }
647*6777b538SAndroid Build Coastguard Worker
TEST(CookieUtilTest,TestIsOnPathCaseSensitive)648*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, TestIsOnPathCaseSensitive) {
649*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::IsOnPath("/test", "/test"));
650*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::IsOnPath("/test", "/TEST"));
651*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::IsOnPath("/TEST", "/test"));
652*6777b538SAndroid Build Coastguard Worker }
653*6777b538SAndroid Build Coastguard Worker
654*6777b538SAndroid Build Coastguard Worker using ::testing::AllOf;
655*6777b538SAndroid Build Coastguard Worker using SameSiteCookieContext = CookieOptions::SameSiteCookieContext;
656*6777b538SAndroid Build Coastguard Worker using ContextType = CookieOptions::SameSiteCookieContext::ContextType;
657*6777b538SAndroid Build Coastguard Worker using ContextRedirectTypeBug1221316 = CookieOptions::SameSiteCookieContext::
658*6777b538SAndroid Build Coastguard Worker ContextMetadata::ContextRedirectTypeBug1221316;
659*6777b538SAndroid Build Coastguard Worker using HttpMethod =
660*6777b538SAndroid Build Coastguard Worker CookieOptions::SameSiteCookieContext::ContextMetadata::HttpMethod;
661*6777b538SAndroid Build Coastguard Worker
662*6777b538SAndroid Build Coastguard Worker MATCHER_P2(ContextTypeIsWithSchemefulMode, context_type, schemeful, "") {
663*6777b538SAndroid Build Coastguard Worker return context_type == (schemeful ? arg.schemeful_context() : arg.context());
664*6777b538SAndroid Build Coastguard Worker }
665*6777b538SAndroid Build Coastguard Worker
666*6777b538SAndroid Build Coastguard Worker // Checks for the expected metadata related to context downgrades from
667*6777b538SAndroid Build Coastguard Worker // cross-site redirects.
668*6777b538SAndroid Build Coastguard Worker MATCHER_P5(CrossSiteRedirectMetadataCorrectWithSchemefulMode,
669*6777b538SAndroid Build Coastguard Worker method,
670*6777b538SAndroid Build Coastguard Worker context_type_without_chain,
671*6777b538SAndroid Build Coastguard Worker context_type_with_chain,
672*6777b538SAndroid Build Coastguard Worker redirect_type_with_chain,
673*6777b538SAndroid Build Coastguard Worker schemeful,
674*6777b538SAndroid Build Coastguard Worker "") {
675*6777b538SAndroid Build Coastguard Worker using ContextDowngradeType = CookieOptions::SameSiteCookieContext::
676*6777b538SAndroid Build Coastguard Worker ContextMetadata::ContextDowngradeType;
677*6777b538SAndroid Build Coastguard Worker
678*6777b538SAndroid Build Coastguard Worker const auto& metadata = schemeful ? arg.schemeful_metadata() : arg.metadata();
679*6777b538SAndroid Build Coastguard Worker
680*6777b538SAndroid Build Coastguard Worker if (metadata.redirect_type_bug_1221316 != redirect_type_with_chain)
681*6777b538SAndroid Build Coastguard Worker return false;
682*6777b538SAndroid Build Coastguard Worker
683*6777b538SAndroid Build Coastguard Worker // http_method_bug_1221316 is only set when there is a context downgrade.
684*6777b538SAndroid Build Coastguard Worker if (metadata.cross_site_redirect_downgrade !=
685*6777b538SAndroid Build Coastguard Worker ContextDowngradeType::kNoDowngrade &&
686*6777b538SAndroid Build Coastguard Worker metadata.http_method_bug_1221316 != method) {
687*6777b538SAndroid Build Coastguard Worker return false;
688*6777b538SAndroid Build Coastguard Worker }
689*6777b538SAndroid Build Coastguard Worker
690*6777b538SAndroid Build Coastguard Worker switch (metadata.cross_site_redirect_downgrade) {
691*6777b538SAndroid Build Coastguard Worker case ContextDowngradeType::kNoDowngrade:
692*6777b538SAndroid Build Coastguard Worker return context_type_without_chain == context_type_with_chain;
693*6777b538SAndroid Build Coastguard Worker case ContextDowngradeType::kStrictToLax:
694*6777b538SAndroid Build Coastguard Worker return context_type_without_chain == ContextType::SAME_SITE_STRICT &&
695*6777b538SAndroid Build Coastguard Worker (context_type_with_chain == ContextType::SAME_SITE_LAX ||
696*6777b538SAndroid Build Coastguard Worker context_type_with_chain ==
697*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX_METHOD_UNSAFE);
698*6777b538SAndroid Build Coastguard Worker case ContextDowngradeType::kStrictToCross:
699*6777b538SAndroid Build Coastguard Worker return context_type_without_chain == ContextType::SAME_SITE_STRICT &&
700*6777b538SAndroid Build Coastguard Worker context_type_with_chain == ContextType::CROSS_SITE;
701*6777b538SAndroid Build Coastguard Worker case ContextDowngradeType::kLaxToCross:
702*6777b538SAndroid Build Coastguard Worker return (context_type_without_chain == ContextType::SAME_SITE_LAX ||
703*6777b538SAndroid Build Coastguard Worker context_type_without_chain ==
704*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX_METHOD_UNSAFE) &&
705*6777b538SAndroid Build Coastguard Worker context_type_with_chain == ContextType::CROSS_SITE;
706*6777b538SAndroid Build Coastguard Worker }
707*6777b538SAndroid Build Coastguard Worker }
708*6777b538SAndroid Build Coastguard Worker
UrlChainToString(const std::vector<GURL> & url_chain)709*6777b538SAndroid Build Coastguard Worker std::string UrlChainToString(const std::vector<GURL>& url_chain) {
710*6777b538SAndroid Build Coastguard Worker std::string s;
711*6777b538SAndroid Build Coastguard Worker for (const GURL& url : url_chain) {
712*6777b538SAndroid Build Coastguard Worker base::StrAppend(&s, {" ", url.spec()});
713*6777b538SAndroid Build Coastguard Worker }
714*6777b538SAndroid Build Coastguard Worker return s;
715*6777b538SAndroid Build Coastguard Worker }
716*6777b538SAndroid Build Coastguard Worker
717*6777b538SAndroid Build Coastguard Worker // Tests for the various ComputeSameSiteContextFor*() functions. The first
718*6777b538SAndroid Build Coastguard Worker // boolean test param is whether the results of the computations are evaluated
719*6777b538SAndroid Build Coastguard Worker // schemefully. The second boolean param is whether SameSite considers redirect
720*6777b538SAndroid Build Coastguard Worker // chains.
721*6777b538SAndroid Build Coastguard Worker class CookieUtilComputeSameSiteContextTest
722*6777b538SAndroid Build Coastguard Worker : public ::testing::TestWithParam<std::tuple<bool, bool>> {
723*6777b538SAndroid Build Coastguard Worker public:
CookieUtilComputeSameSiteContextTest()724*6777b538SAndroid Build Coastguard Worker CookieUtilComputeSameSiteContextTest() {
725*6777b538SAndroid Build Coastguard Worker if (DoesSameSiteConsiderRedirectChain()) {
726*6777b538SAndroid Build Coastguard Worker feature_list_.InitAndEnableFeature(
727*6777b538SAndroid Build Coastguard Worker features::kCookieSameSiteConsidersRedirectChain);
728*6777b538SAndroid Build Coastguard Worker } else {
729*6777b538SAndroid Build Coastguard Worker // No need to explicitly disable the redirect chain feature because it
730*6777b538SAndroid Build Coastguard Worker // is disabled by default.
731*6777b538SAndroid Build Coastguard Worker feature_list_.Init();
732*6777b538SAndroid Build Coastguard Worker }
733*6777b538SAndroid Build Coastguard Worker }
734*6777b538SAndroid Build Coastguard Worker ~CookieUtilComputeSameSiteContextTest() override = default;
735*6777b538SAndroid Build Coastguard Worker
IsSchemeful() const736*6777b538SAndroid Build Coastguard Worker bool IsSchemeful() const { return std::get<0>(GetParam()); }
737*6777b538SAndroid Build Coastguard Worker
DoesSameSiteConsiderRedirectChain() const738*6777b538SAndroid Build Coastguard Worker bool DoesSameSiteConsiderRedirectChain() const {
739*6777b538SAndroid Build Coastguard Worker return std::get<1>(GetParam());
740*6777b538SAndroid Build Coastguard Worker }
741*6777b538SAndroid Build Coastguard Worker
742*6777b538SAndroid Build Coastguard Worker // Returns the proper gtest matcher to use for the schemeless/schemeful mode.
ContextTypeIs(ContextType context_type) const743*6777b538SAndroid Build Coastguard Worker auto ContextTypeIs(ContextType context_type) const {
744*6777b538SAndroid Build Coastguard Worker return ContextTypeIsWithSchemefulMode(context_type, IsSchemeful());
745*6777b538SAndroid Build Coastguard Worker }
746*6777b538SAndroid Build Coastguard Worker
CrossSiteRedirectMetadataCorrect(HttpMethod method,ContextType context_type_without_chain,ContextType context_type_with_chain,ContextRedirectTypeBug1221316 redirect_type_with_chain) const747*6777b538SAndroid Build Coastguard Worker auto CrossSiteRedirectMetadataCorrect(
748*6777b538SAndroid Build Coastguard Worker HttpMethod method,
749*6777b538SAndroid Build Coastguard Worker ContextType context_type_without_chain,
750*6777b538SAndroid Build Coastguard Worker ContextType context_type_with_chain,
751*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316 redirect_type_with_chain) const {
752*6777b538SAndroid Build Coastguard Worker return CrossSiteRedirectMetadataCorrectWithSchemefulMode(
753*6777b538SAndroid Build Coastguard Worker method, context_type_without_chain, context_type_with_chain,
754*6777b538SAndroid Build Coastguard Worker redirect_type_with_chain, IsSchemeful());
755*6777b538SAndroid Build Coastguard Worker }
756*6777b538SAndroid Build Coastguard Worker
757*6777b538SAndroid Build Coastguard Worker // The following methods return the sets of URLs/SiteForCookies/initiators/URL
758*6777b538SAndroid Build Coastguard Worker // chains that are same-site or cross-site with respect to kSiteUrl.
759*6777b538SAndroid Build Coastguard Worker
GetAllUrls() const760*6777b538SAndroid Build Coastguard Worker std::vector<GURL> GetAllUrls() const {
761*6777b538SAndroid Build Coastguard Worker return {kSiteUrl,
762*6777b538SAndroid Build Coastguard Worker kSiteUrlWithPath,
763*6777b538SAndroid Build Coastguard Worker kSecureSiteUrl,
764*6777b538SAndroid Build Coastguard Worker kCrossSiteUrl,
765*6777b538SAndroid Build Coastguard Worker kSecureCrossSiteUrl,
766*6777b538SAndroid Build Coastguard Worker kSubdomainUrl,
767*6777b538SAndroid Build Coastguard Worker kSecureSubdomainUrl,
768*6777b538SAndroid Build Coastguard Worker kWsUrl,
769*6777b538SAndroid Build Coastguard Worker kWssUrl};
770*6777b538SAndroid Build Coastguard Worker }
771*6777b538SAndroid Build Coastguard Worker
GetSameSiteUrls() const772*6777b538SAndroid Build Coastguard Worker std::vector<GURL> GetSameSiteUrls() const {
773*6777b538SAndroid Build Coastguard Worker // Same-site-same-scheme URLs are always same-site. (ws counts as
774*6777b538SAndroid Build Coastguard Worker // same-scheme with http.)
775*6777b538SAndroid Build Coastguard Worker std::vector<GURL> same_site_urls{kSiteUrl, kSiteUrlWithPath, kSubdomainUrl,
776*6777b538SAndroid Build Coastguard Worker kWsUrl};
777*6777b538SAndroid Build Coastguard Worker // If schemeless, the cross-scheme URLs are also same-site.
778*6777b538SAndroid Build Coastguard Worker if (!IsSchemeful()) {
779*6777b538SAndroid Build Coastguard Worker same_site_urls.push_back(kSecureSiteUrl);
780*6777b538SAndroid Build Coastguard Worker same_site_urls.push_back(kSecureSubdomainUrl);
781*6777b538SAndroid Build Coastguard Worker same_site_urls.push_back(kWssUrl);
782*6777b538SAndroid Build Coastguard Worker }
783*6777b538SAndroid Build Coastguard Worker return same_site_urls;
784*6777b538SAndroid Build Coastguard Worker }
785*6777b538SAndroid Build Coastguard Worker
GetCrossSiteUrls() const786*6777b538SAndroid Build Coastguard Worker std::vector<GURL> GetCrossSiteUrls() const {
787*6777b538SAndroid Build Coastguard Worker std::vector<GURL> cross_site_urls;
788*6777b538SAndroid Build Coastguard Worker std::vector<GURL> same_site_urls = GetSameSiteUrls();
789*6777b538SAndroid Build Coastguard Worker for (const GURL& url : GetAllUrls()) {
790*6777b538SAndroid Build Coastguard Worker if (!base::Contains(same_site_urls, url))
791*6777b538SAndroid Build Coastguard Worker cross_site_urls.push_back(url);
792*6777b538SAndroid Build Coastguard Worker }
793*6777b538SAndroid Build Coastguard Worker return cross_site_urls;
794*6777b538SAndroid Build Coastguard Worker }
795*6777b538SAndroid Build Coastguard Worker
GetAllSitesForCookies() const796*6777b538SAndroid Build Coastguard Worker std::vector<SiteForCookies> GetAllSitesForCookies() const {
797*6777b538SAndroid Build Coastguard Worker return {kNullSiteForCookies, kSiteForCookies, kSecureSiteForCookies,
798*6777b538SAndroid Build Coastguard Worker kCrossSiteForCookies, kSecureCrossSiteForCookies};
799*6777b538SAndroid Build Coastguard Worker }
800*6777b538SAndroid Build Coastguard Worker
GetSameSiteSitesForCookies() const801*6777b538SAndroid Build Coastguard Worker std::vector<SiteForCookies> GetSameSiteSitesForCookies() const {
802*6777b538SAndroid Build Coastguard Worker std::vector<SiteForCookies> same_site_sfc = {kSiteForCookies};
803*6777b538SAndroid Build Coastguard Worker // If schemeless, the cross-scheme SFC is also same-site.
804*6777b538SAndroid Build Coastguard Worker if (!IsSchemeful())
805*6777b538SAndroid Build Coastguard Worker same_site_sfc.push_back(kSecureSiteForCookies);
806*6777b538SAndroid Build Coastguard Worker return same_site_sfc;
807*6777b538SAndroid Build Coastguard Worker }
808*6777b538SAndroid Build Coastguard Worker
GetCrossSiteSitesForCookies() const809*6777b538SAndroid Build Coastguard Worker std::vector<SiteForCookies> GetCrossSiteSitesForCookies() const {
810*6777b538SAndroid Build Coastguard Worker std::vector<SiteForCookies> cross_site_sfc;
811*6777b538SAndroid Build Coastguard Worker std::vector<SiteForCookies> same_site_sfc = GetSameSiteSitesForCookies();
812*6777b538SAndroid Build Coastguard Worker for (const SiteForCookies& sfc : GetAllSitesForCookies()) {
813*6777b538SAndroid Build Coastguard Worker if (!base::Contains(same_site_sfc, sfc.RepresentativeUrl(),
814*6777b538SAndroid Build Coastguard Worker &SiteForCookies::RepresentativeUrl)) {
815*6777b538SAndroid Build Coastguard Worker cross_site_sfc.push_back(sfc);
816*6777b538SAndroid Build Coastguard Worker }
817*6777b538SAndroid Build Coastguard Worker }
818*6777b538SAndroid Build Coastguard Worker return cross_site_sfc;
819*6777b538SAndroid Build Coastguard Worker }
820*6777b538SAndroid Build Coastguard Worker
GetAllInitiators() const821*6777b538SAndroid Build Coastguard Worker std::vector<std::optional<url::Origin>> GetAllInitiators() const {
822*6777b538SAndroid Build Coastguard Worker return {kBrowserInitiated, kOpaqueInitiator,
823*6777b538SAndroid Build Coastguard Worker kSiteInitiator, kSecureSiteInitiator,
824*6777b538SAndroid Build Coastguard Worker kCrossSiteInitiator, kSecureCrossSiteInitiator,
825*6777b538SAndroid Build Coastguard Worker kSubdomainInitiator, kSecureSubdomainInitiator,
826*6777b538SAndroid Build Coastguard Worker kUnrelatedInitiator};
827*6777b538SAndroid Build Coastguard Worker }
828*6777b538SAndroid Build Coastguard Worker
GetSameSiteInitiators() const829*6777b538SAndroid Build Coastguard Worker std::vector<std::optional<url::Origin>> GetSameSiteInitiators() const {
830*6777b538SAndroid Build Coastguard Worker std::vector<std::optional<url::Origin>> same_site_initiators{
831*6777b538SAndroid Build Coastguard Worker kBrowserInitiated, kSiteInitiator, kSubdomainInitiator};
832*6777b538SAndroid Build Coastguard Worker // If schemeless, the cross-scheme origins are also same-site.
833*6777b538SAndroid Build Coastguard Worker if (!IsSchemeful()) {
834*6777b538SAndroid Build Coastguard Worker same_site_initiators.push_back(kSecureSiteInitiator);
835*6777b538SAndroid Build Coastguard Worker same_site_initiators.push_back(kSecureSubdomainInitiator);
836*6777b538SAndroid Build Coastguard Worker }
837*6777b538SAndroid Build Coastguard Worker return same_site_initiators;
838*6777b538SAndroid Build Coastguard Worker }
839*6777b538SAndroid Build Coastguard Worker
GetCrossSiteInitiators() const840*6777b538SAndroid Build Coastguard Worker std::vector<std::optional<url::Origin>> GetCrossSiteInitiators() const {
841*6777b538SAndroid Build Coastguard Worker std::vector<std::optional<url::Origin>> cross_site_initiators;
842*6777b538SAndroid Build Coastguard Worker std::vector<std::optional<url::Origin>> same_site_initiators =
843*6777b538SAndroid Build Coastguard Worker GetSameSiteInitiators();
844*6777b538SAndroid Build Coastguard Worker for (const std::optional<url::Origin>& initiator : GetAllInitiators()) {
845*6777b538SAndroid Build Coastguard Worker if (!base::Contains(same_site_initiators, initiator))
846*6777b538SAndroid Build Coastguard Worker cross_site_initiators.push_back(initiator);
847*6777b538SAndroid Build Coastguard Worker }
848*6777b538SAndroid Build Coastguard Worker return cross_site_initiators;
849*6777b538SAndroid Build Coastguard Worker }
850*6777b538SAndroid Build Coastguard Worker
851*6777b538SAndroid Build Coastguard Worker // Returns an assortment of redirect chains that end in `url` as the
852*6777b538SAndroid Build Coastguard Worker // current request URL, and are completely same-site. `url` is expected to be
853*6777b538SAndroid Build Coastguard Worker // same-site to kSiteUrl.
GetSameSiteUrlChains(const GURL & url) const854*6777b538SAndroid Build Coastguard Worker std::vector<std::vector<GURL>> GetSameSiteUrlChains(const GURL& url) const {
855*6777b538SAndroid Build Coastguard Worker std::vector<std::vector<GURL>> same_site_url_chains;
856*6777b538SAndroid Build Coastguard Worker for (const GURL& same_site_url : GetSameSiteUrls()) {
857*6777b538SAndroid Build Coastguard Worker same_site_url_chains.push_back({same_site_url, url});
858*6777b538SAndroid Build Coastguard Worker for (const GURL& other_same_site_url : GetSameSiteUrls()) {
859*6777b538SAndroid Build Coastguard Worker same_site_url_chains.push_back(
860*6777b538SAndroid Build Coastguard Worker {other_same_site_url, same_site_url, url});
861*6777b538SAndroid Build Coastguard Worker }
862*6777b538SAndroid Build Coastguard Worker }
863*6777b538SAndroid Build Coastguard Worker return same_site_url_chains;
864*6777b538SAndroid Build Coastguard Worker }
865*6777b538SAndroid Build Coastguard Worker
866*6777b538SAndroid Build Coastguard Worker // Returns an assortment of redirect chains that end in `url` as the
867*6777b538SAndroid Build Coastguard Worker // current request URL, and are cross-site. `url` is expected to be same-site
868*6777b538SAndroid Build Coastguard Worker // to kSiteUrl.
GetCrossSiteUrlChains(const GURL & url) const869*6777b538SAndroid Build Coastguard Worker std::vector<std::vector<GURL>> GetCrossSiteUrlChains(const GURL& url) const {
870*6777b538SAndroid Build Coastguard Worker std::vector<std::vector<GURL>> cross_site_url_chains;
871*6777b538SAndroid Build Coastguard Worker for (const GURL& cross_site_url : GetCrossSiteUrls()) {
872*6777b538SAndroid Build Coastguard Worker cross_site_url_chains.push_back({cross_site_url, url});
873*6777b538SAndroid Build Coastguard Worker for (const GURL& same_site_url : GetSameSiteUrls()) {
874*6777b538SAndroid Build Coastguard Worker cross_site_url_chains.push_back({cross_site_url, same_site_url, url});
875*6777b538SAndroid Build Coastguard Worker cross_site_url_chains.push_back({same_site_url, cross_site_url, url});
876*6777b538SAndroid Build Coastguard Worker }
877*6777b538SAndroid Build Coastguard Worker }
878*6777b538SAndroid Build Coastguard Worker return cross_site_url_chains;
879*6777b538SAndroid Build Coastguard Worker }
880*6777b538SAndroid Build Coastguard Worker
881*6777b538SAndroid Build Coastguard Worker // Computes possible values of is_main_frame_navigation that are consistent
882*6777b538SAndroid Build Coastguard Worker // with the DCHECKs.
CanBeMainFrameNavigation(const GURL & url,const SiteForCookies & site_for_cookies) const883*6777b538SAndroid Build Coastguard Worker bool CanBeMainFrameNavigation(const GURL& url,
884*6777b538SAndroid Build Coastguard Worker const SiteForCookies& site_for_cookies) const {
885*6777b538SAndroid Build Coastguard Worker return (site_for_cookies.IsNull() ||
886*6777b538SAndroid Build Coastguard Worker site_for_cookies.IsFirstPartyWithSchemefulMode(url, true)) &&
887*6777b538SAndroid Build Coastguard Worker !url.SchemeIsWSOrWSS();
888*6777b538SAndroid Build Coastguard Worker }
889*6777b538SAndroid Build Coastguard Worker
IsMainFrameNavigationPossibleValues(const GURL & url,const SiteForCookies & site_for_cookies) const890*6777b538SAndroid Build Coastguard Worker std::vector<bool> IsMainFrameNavigationPossibleValues(
891*6777b538SAndroid Build Coastguard Worker const GURL& url,
892*6777b538SAndroid Build Coastguard Worker const SiteForCookies& site_for_cookies) const {
893*6777b538SAndroid Build Coastguard Worker return CanBeMainFrameNavigation(url, site_for_cookies)
894*6777b538SAndroid Build Coastguard Worker ? std::vector<bool>{false, true}
895*6777b538SAndroid Build Coastguard Worker : std::vector<bool>{false};
896*6777b538SAndroid Build Coastguard Worker }
897*6777b538SAndroid Build Coastguard Worker
898*6777b538SAndroid Build Coastguard Worker // Request URL.
899*6777b538SAndroid Build Coastguard Worker const GURL kSiteUrl{"http://example.test/"};
900*6777b538SAndroid Build Coastguard Worker const GURL kSiteUrlWithPath{"http://example.test/path"};
901*6777b538SAndroid Build Coastguard Worker const GURL kSecureSiteUrl{"https://example.test/"};
902*6777b538SAndroid Build Coastguard Worker const GURL kCrossSiteUrl{"http://notexample.test/"};
903*6777b538SAndroid Build Coastguard Worker const GURL kSecureCrossSiteUrl{"https://notexample.test/"};
904*6777b538SAndroid Build Coastguard Worker const GURL kSubdomainUrl{"http://subdomain.example.test/"};
905*6777b538SAndroid Build Coastguard Worker const GURL kSecureSubdomainUrl{"https://subdomain.example.test/"};
906*6777b538SAndroid Build Coastguard Worker const GURL kWsUrl{"ws://example.test/"};
907*6777b538SAndroid Build Coastguard Worker const GURL kWssUrl{"wss://example.test/"};
908*6777b538SAndroid Build Coastguard Worker // Site for cookies.
909*6777b538SAndroid Build Coastguard Worker const SiteForCookies kNullSiteForCookies;
910*6777b538SAndroid Build Coastguard Worker const SiteForCookies kSiteForCookies = SiteForCookies::FromUrl(kSiteUrl);
911*6777b538SAndroid Build Coastguard Worker const SiteForCookies kSecureSiteForCookies =
912*6777b538SAndroid Build Coastguard Worker SiteForCookies::FromUrl(kSecureSiteUrl);
913*6777b538SAndroid Build Coastguard Worker const SiteForCookies kCrossSiteForCookies =
914*6777b538SAndroid Build Coastguard Worker SiteForCookies::FromUrl(kCrossSiteUrl);
915*6777b538SAndroid Build Coastguard Worker const SiteForCookies kSecureCrossSiteForCookies =
916*6777b538SAndroid Build Coastguard Worker SiteForCookies::FromUrl(kSecureCrossSiteUrl);
917*6777b538SAndroid Build Coastguard Worker // Initiator origin.
918*6777b538SAndroid Build Coastguard Worker const std::optional<url::Origin> kBrowserInitiated = std::nullopt;
919*6777b538SAndroid Build Coastguard Worker const std::optional<url::Origin> kOpaqueInitiator =
920*6777b538SAndroid Build Coastguard Worker std::make_optional(url::Origin());
921*6777b538SAndroid Build Coastguard Worker const std::optional<url::Origin> kSiteInitiator =
922*6777b538SAndroid Build Coastguard Worker std::make_optional(url::Origin::Create(kSiteUrl));
923*6777b538SAndroid Build Coastguard Worker const std::optional<url::Origin> kSecureSiteInitiator =
924*6777b538SAndroid Build Coastguard Worker std::make_optional(url::Origin::Create(kSecureSiteUrl));
925*6777b538SAndroid Build Coastguard Worker const std::optional<url::Origin> kCrossSiteInitiator =
926*6777b538SAndroid Build Coastguard Worker std::make_optional(url::Origin::Create(kCrossSiteUrl));
927*6777b538SAndroid Build Coastguard Worker const std::optional<url::Origin> kSecureCrossSiteInitiator =
928*6777b538SAndroid Build Coastguard Worker std::make_optional(url::Origin::Create(kSecureCrossSiteUrl));
929*6777b538SAndroid Build Coastguard Worker const std::optional<url::Origin> kSubdomainInitiator =
930*6777b538SAndroid Build Coastguard Worker std::make_optional(url::Origin::Create(kSubdomainUrl));
931*6777b538SAndroid Build Coastguard Worker const std::optional<url::Origin> kSecureSubdomainInitiator =
932*6777b538SAndroid Build Coastguard Worker std::make_optional(url::Origin::Create(kSecureSubdomainUrl));
933*6777b538SAndroid Build Coastguard Worker const std::optional<url::Origin> kUnrelatedInitiator =
934*6777b538SAndroid Build Coastguard Worker std::make_optional(url::Origin::Create(GURL("https://unrelated.test/")));
935*6777b538SAndroid Build Coastguard Worker
936*6777b538SAndroid Build Coastguard Worker protected:
937*6777b538SAndroid Build Coastguard Worker base::test::ScopedFeatureList feature_list_;
938*6777b538SAndroid Build Coastguard Worker };
939*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,UrlAndSiteForCookiesCrossSite)940*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, UrlAndSiteForCookiesCrossSite) {
941*6777b538SAndroid Build Coastguard Worker // If the SiteForCookies and URL are cross-site, then the context is always
942*6777b538SAndroid Build Coastguard Worker // cross-site.
943*6777b538SAndroid Build Coastguard Worker for (const GURL& url : GetSameSiteUrls()) {
944*6777b538SAndroid Build Coastguard Worker for (const SiteForCookies& site_for_cookies :
945*6777b538SAndroid Build Coastguard Worker GetCrossSiteSitesForCookies()) {
946*6777b538SAndroid Build Coastguard Worker for (const std::optional<url::Origin>& initiator : GetAllInitiators()) {
947*6777b538SAndroid Build Coastguard Worker for (const std::string& method : {"GET", "POST", "PUT", "HEAD"}) {
948*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForScriptGet(
949*6777b538SAndroid Build Coastguard Worker url, site_for_cookies, initiator,
950*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
951*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
952*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForScriptSet(
953*6777b538SAndroid Build Coastguard Worker url, site_for_cookies,
954*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
955*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
956*6777b538SAndroid Build Coastguard Worker for (bool is_main_frame_navigation :
957*6777b538SAndroid Build Coastguard Worker IsMainFrameNavigationPossibleValues(url, site_for_cookies)) {
958*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForRequest(
959*6777b538SAndroid Build Coastguard Worker method, {url}, site_for_cookies, initiator,
960*6777b538SAndroid Build Coastguard Worker is_main_frame_navigation,
961*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
962*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
963*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForResponse(
964*6777b538SAndroid Build Coastguard Worker {url}, site_for_cookies, initiator,
965*6777b538SAndroid Build Coastguard Worker is_main_frame_navigation,
966*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
967*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
968*6777b538SAndroid Build Coastguard Worker // If the current request URL is cross-site to the site-for-cookies,
969*6777b538SAndroid Build Coastguard Worker // the request context is always cross-site even if the URL chain
970*6777b538SAndroid Build Coastguard Worker // contains members that are same-site to the site-for-cookies.
971*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(
972*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForRequest(
973*6777b538SAndroid Build Coastguard Worker method, {site_for_cookies.RepresentativeUrl(), url},
974*6777b538SAndroid Build Coastguard Worker site_for_cookies, initiator, is_main_frame_navigation,
975*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
976*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
977*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(
978*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForResponse(
979*6777b538SAndroid Build Coastguard Worker {site_for_cookies.RepresentativeUrl(), url},
980*6777b538SAndroid Build Coastguard Worker site_for_cookies, initiator, is_main_frame_navigation,
981*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
982*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
983*6777b538SAndroid Build Coastguard Worker }
984*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForSubresource(
985*6777b538SAndroid Build Coastguard Worker url, site_for_cookies,
986*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
987*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
988*6777b538SAndroid Build Coastguard Worker }
989*6777b538SAndroid Build Coastguard Worker }
990*6777b538SAndroid Build Coastguard Worker }
991*6777b538SAndroid Build Coastguard Worker }
992*6777b538SAndroid Build Coastguard Worker }
993*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,SiteForCookiesNotSchemefullySame)994*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, SiteForCookiesNotSchemefullySame) {
995*6777b538SAndroid Build Coastguard Worker // If the SiteForCookies is not schemefully_same, even if its value is
996*6777b538SAndroid Build Coastguard Worker // schemefully same-site, the schemeful context type will be cross-site.
997*6777b538SAndroid Build Coastguard Worker if (!IsSchemeful())
998*6777b538SAndroid Build Coastguard Worker return;
999*6777b538SAndroid Build Coastguard Worker
1000*6777b538SAndroid Build Coastguard Worker std::vector<SiteForCookies> sites_for_cookies = GetAllSitesForCookies();
1001*6777b538SAndroid Build Coastguard Worker for (SiteForCookies& sfc : sites_for_cookies) {
1002*6777b538SAndroid Build Coastguard Worker sfc.SetSchemefullySameForTesting(false);
1003*6777b538SAndroid Build Coastguard Worker }
1004*6777b538SAndroid Build Coastguard Worker
1005*6777b538SAndroid Build Coastguard Worker for (const GURL& url : GetSameSiteUrls()) {
1006*6777b538SAndroid Build Coastguard Worker for (const SiteForCookies& site_for_cookies : sites_for_cookies) {
1007*6777b538SAndroid Build Coastguard Worker for (const std::optional<url::Origin>& initiator : GetAllInitiators()) {
1008*6777b538SAndroid Build Coastguard Worker for (const std::string& method : {"GET", "POST", "PUT", "HEAD"}) {
1009*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForScriptGet(
1010*6777b538SAndroid Build Coastguard Worker url, site_for_cookies, initiator,
1011*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1012*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
1013*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForScriptSet(
1014*6777b538SAndroid Build Coastguard Worker url, site_for_cookies,
1015*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1016*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
1017*6777b538SAndroid Build Coastguard Worker
1018*6777b538SAndroid Build Coastguard Worker // If the site-for-cookies isn't schemefully_same, this cannot be a
1019*6777b538SAndroid Build Coastguard Worker // main frame navigation.
1020*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForRequest(
1021*6777b538SAndroid Build Coastguard Worker method, {url}, site_for_cookies, initiator,
1022*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1023*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1024*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
1025*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForResponse(
1026*6777b538SAndroid Build Coastguard Worker {url}, site_for_cookies, initiator,
1027*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1028*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1029*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
1030*6777b538SAndroid Build Coastguard Worker
1031*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForSubresource(
1032*6777b538SAndroid Build Coastguard Worker url, site_for_cookies,
1033*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1034*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
1035*6777b538SAndroid Build Coastguard Worker }
1036*6777b538SAndroid Build Coastguard Worker }
1037*6777b538SAndroid Build Coastguard Worker }
1038*6777b538SAndroid Build Coastguard Worker }
1039*6777b538SAndroid Build Coastguard Worker }
1040*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,ForScriptGet)1041*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForScriptGet) {
1042*6777b538SAndroid Build Coastguard Worker for (const GURL& url : GetSameSiteUrls()) {
1043*6777b538SAndroid Build Coastguard Worker // Same-site site-for-cookies.
1044*6777b538SAndroid Build Coastguard Worker // (Cross-site cases covered above in UrlAndSiteForCookiesCrossSite test.)
1045*6777b538SAndroid Build Coastguard Worker for (const SiteForCookies& site_for_cookies :
1046*6777b538SAndroid Build Coastguard Worker GetSameSiteSitesForCookies()) {
1047*6777b538SAndroid Build Coastguard Worker // Cross-site initiator -> it's same-site lax.
1048*6777b538SAndroid Build Coastguard Worker for (const std::optional<url::Origin>& initiator :
1049*6777b538SAndroid Build Coastguard Worker GetCrossSiteInitiators()) {
1050*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForScriptGet(
1051*6777b538SAndroid Build Coastguard Worker url, site_for_cookies, initiator,
1052*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1053*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_LAX));
1054*6777b538SAndroid Build Coastguard Worker }
1055*6777b538SAndroid Build Coastguard Worker
1056*6777b538SAndroid Build Coastguard Worker // Same-site initiator -> it's same-site strict.
1057*6777b538SAndroid Build Coastguard Worker for (const std::optional<url::Origin>& initiator :
1058*6777b538SAndroid Build Coastguard Worker GetSameSiteInitiators()) {
1059*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForScriptGet(
1060*6777b538SAndroid Build Coastguard Worker url, site_for_cookies, initiator,
1061*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1062*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_STRICT));
1063*6777b538SAndroid Build Coastguard Worker }
1064*6777b538SAndroid Build Coastguard Worker }
1065*6777b538SAndroid Build Coastguard Worker }
1066*6777b538SAndroid Build Coastguard Worker }
1067*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,ForScriptGet_SchemefulDowngrade)1068*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForScriptGet_SchemefulDowngrade) {
1069*6777b538SAndroid Build Coastguard Worker // Some test cases where the context is downgraded when computed schemefully.
1070*6777b538SAndroid Build Coastguard Worker // (Should already be covered above, but just to be explicit.)
1071*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::SAME_SITE_STRICT,
1072*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX),
1073*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForScriptGet(
1074*6777b538SAndroid Build Coastguard Worker kSiteUrl, kSiteForCookies, kSecureSiteInitiator,
1075*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1076*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::SAME_SITE_STRICT,
1077*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX),
1078*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForScriptGet(
1079*6777b538SAndroid Build Coastguard Worker kSecureSiteUrl, kSecureSiteForCookies, kSiteInitiator,
1080*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1081*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::SAME_SITE_LAX,
1082*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE),
1083*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForScriptGet(
1084*6777b538SAndroid Build Coastguard Worker kSecureSiteUrl, kSiteForCookies, kCrossSiteInitiator,
1085*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1086*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::SAME_SITE_LAX,
1087*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE),
1088*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForScriptGet(
1089*6777b538SAndroid Build Coastguard Worker kSiteUrl, kSecureSiteForCookies, kCrossSiteInitiator,
1090*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1091*6777b538SAndroid Build Coastguard Worker }
1092*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,ForScriptGet_WebSocketSchemes)1093*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForScriptGet_WebSocketSchemes) {
1094*6777b538SAndroid Build Coastguard Worker // wss/https and http/ws are considered the same for schemeful purposes.
1095*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForScriptGet(
1096*6777b538SAndroid Build Coastguard Worker kWssUrl, kSecureSiteForCookies, kSecureSiteInitiator,
1097*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1098*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_STRICT));
1099*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForScriptGet(
1100*6777b538SAndroid Build Coastguard Worker kWssUrl, kSecureSiteForCookies, kSecureCrossSiteInitiator,
1101*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1102*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_LAX));
1103*6777b538SAndroid Build Coastguard Worker
1104*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForScriptGet(
1105*6777b538SAndroid Build Coastguard Worker kWsUrl, kSiteForCookies, kSiteInitiator,
1106*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1107*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_STRICT));
1108*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForScriptGet(
1109*6777b538SAndroid Build Coastguard Worker kWsUrl, kSiteForCookies, kCrossSiteInitiator,
1110*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1111*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_LAX));
1112*6777b538SAndroid Build Coastguard Worker }
1113*6777b538SAndroid Build Coastguard Worker
1114*6777b538SAndroid Build Coastguard Worker // Test cases where the URL chain has 1 member (i.e. no redirects).
TEST_P(CookieUtilComputeSameSiteContextTest,ForRequest)1115*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForRequest) {
1116*6777b538SAndroid Build Coastguard Worker for (const GURL& url : GetSameSiteUrls()) {
1117*6777b538SAndroid Build Coastguard Worker // Same-site site-for-cookies.
1118*6777b538SAndroid Build Coastguard Worker // (Cross-site cases covered above in UrlAndSiteForCookiesCrossSite test.)
1119*6777b538SAndroid Build Coastguard Worker for (const SiteForCookies& site_for_cookies :
1120*6777b538SAndroid Build Coastguard Worker GetSameSiteSitesForCookies()) {
1121*6777b538SAndroid Build Coastguard Worker // Same-Site initiator -> it's same-site strict.
1122*6777b538SAndroid Build Coastguard Worker for (const std::optional<url::Origin>& initiator :
1123*6777b538SAndroid Build Coastguard Worker GetSameSiteInitiators()) {
1124*6777b538SAndroid Build Coastguard Worker for (const std::string& method : {"GET", "POST", "PUT", "HEAD"}) {
1125*6777b538SAndroid Build Coastguard Worker for (bool is_main_frame_navigation :
1126*6777b538SAndroid Build Coastguard Worker IsMainFrameNavigationPossibleValues(url, site_for_cookies)) {
1127*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForRequest(
1128*6777b538SAndroid Build Coastguard Worker method, {url}, site_for_cookies, initiator,
1129*6777b538SAndroid Build Coastguard Worker is_main_frame_navigation,
1130*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1131*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_STRICT));
1132*6777b538SAndroid Build Coastguard Worker }
1133*6777b538SAndroid Build Coastguard Worker }
1134*6777b538SAndroid Build Coastguard Worker }
1135*6777b538SAndroid Build Coastguard Worker
1136*6777b538SAndroid Build Coastguard Worker // Cross-Site initiator -> it's same-site lax iff the method is safe.
1137*6777b538SAndroid Build Coastguard Worker for (const std::optional<url::Origin>& initiator :
1138*6777b538SAndroid Build Coastguard Worker GetCrossSiteInitiators()) {
1139*6777b538SAndroid Build Coastguard Worker // For main frame navigations, the context is Lax (or Lax-unsafe).
1140*6777b538SAndroid Build Coastguard Worker for (const std::string& method : {"GET", "HEAD"}) {
1141*6777b538SAndroid Build Coastguard Worker if (!CanBeMainFrameNavigation(url, site_for_cookies))
1142*6777b538SAndroid Build Coastguard Worker break;
1143*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForRequest(
1144*6777b538SAndroid Build Coastguard Worker method, {url}, site_for_cookies, initiator,
1145*6777b538SAndroid Build Coastguard Worker true /* is_main_frame_navigation */,
1146*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1147*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_LAX));
1148*6777b538SAndroid Build Coastguard Worker }
1149*6777b538SAndroid Build Coastguard Worker for (const std::string& method : {"POST", "PUT"}) {
1150*6777b538SAndroid Build Coastguard Worker if (!CanBeMainFrameNavigation(url, site_for_cookies))
1151*6777b538SAndroid Build Coastguard Worker break;
1152*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForRequest(
1153*6777b538SAndroid Build Coastguard Worker method, {url}, site_for_cookies, initiator,
1154*6777b538SAndroid Build Coastguard Worker true /* is_main_frame_navigation */,
1155*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1156*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_LAX_METHOD_UNSAFE));
1157*6777b538SAndroid Build Coastguard Worker }
1158*6777b538SAndroid Build Coastguard Worker
1159*6777b538SAndroid Build Coastguard Worker // For non-main-frame-navigation requests, the context should be
1160*6777b538SAndroid Build Coastguard Worker // cross-site.
1161*6777b538SAndroid Build Coastguard Worker for (const std::string& method : {"GET", "POST", "PUT", "HEAD"}) {
1162*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForRequest(
1163*6777b538SAndroid Build Coastguard Worker method, {url}, site_for_cookies, initiator,
1164*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1165*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1166*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
1167*6777b538SAndroid Build Coastguard Worker }
1168*6777b538SAndroid Build Coastguard Worker }
1169*6777b538SAndroid Build Coastguard Worker }
1170*6777b538SAndroid Build Coastguard Worker }
1171*6777b538SAndroid Build Coastguard Worker }
1172*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,ForRequest_SchemefulDowngrade)1173*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForRequest_SchemefulDowngrade) {
1174*6777b538SAndroid Build Coastguard Worker // Some test cases where the context is downgraded when computed schemefully.
1175*6777b538SAndroid Build Coastguard Worker // (Should already be covered above, but just to be explicit.)
1176*6777b538SAndroid Build Coastguard Worker
1177*6777b538SAndroid Build Coastguard Worker // Cross-scheme URL and site-for-cookies with (schemelessly) same-site
1178*6777b538SAndroid Build Coastguard Worker // initiator.
1179*6777b538SAndroid Build Coastguard Worker // (The request cannot be a main frame navigation if the site-for-cookies is
1180*6777b538SAndroid Build Coastguard Worker // not schemefully same-site).
1181*6777b538SAndroid Build Coastguard Worker for (const std::string& method : {"GET", "POST"}) {
1182*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::SAME_SITE_STRICT,
1183*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE),
1184*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForRequest(
1185*6777b538SAndroid Build Coastguard Worker method, {kSecureSiteUrl}, kSiteForCookies, kSiteInitiator,
1186*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1187*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1188*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::SAME_SITE_STRICT,
1189*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE),
1190*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForRequest(
1191*6777b538SAndroid Build Coastguard Worker method, {kSiteUrl}, kSecureSiteForCookies, kSiteInitiator,
1192*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1193*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1194*6777b538SAndroid Build Coastguard Worker }
1195*6777b538SAndroid Build Coastguard Worker
1196*6777b538SAndroid Build Coastguard Worker // Schemefully same-site URL and site-for-cookies with cross-scheme
1197*6777b538SAndroid Build Coastguard Worker // initiator.
1198*6777b538SAndroid Build Coastguard Worker for (bool is_main_frame_navigation : {false, true}) {
1199*6777b538SAndroid Build Coastguard Worker ContextType lax_if_main_frame = is_main_frame_navigation
1200*6777b538SAndroid Build Coastguard Worker ? ContextType::SAME_SITE_LAX
1201*6777b538SAndroid Build Coastguard Worker : ContextType::CROSS_SITE;
1202*6777b538SAndroid Build Coastguard Worker ContextType lax_unsafe_if_main_frame =
1203*6777b538SAndroid Build Coastguard Worker is_main_frame_navigation ? ContextType::SAME_SITE_LAX_METHOD_UNSAFE
1204*6777b538SAndroid Build Coastguard Worker : ContextType::CROSS_SITE;
1205*6777b538SAndroid Build Coastguard Worker
1206*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(
1207*6777b538SAndroid Build Coastguard Worker SameSiteCookieContext(ContextType::SAME_SITE_STRICT, lax_if_main_frame),
1208*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForRequest(
1209*6777b538SAndroid Build Coastguard Worker "GET", {kSecureSiteUrl}, kSecureSiteForCookies, kSiteInitiator,
1210*6777b538SAndroid Build Coastguard Worker is_main_frame_navigation,
1211*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1212*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(
1213*6777b538SAndroid Build Coastguard Worker SameSiteCookieContext(ContextType::SAME_SITE_STRICT, lax_if_main_frame),
1214*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForRequest(
1215*6777b538SAndroid Build Coastguard Worker "GET", {kSiteUrl}, kSiteForCookies, kSecureSiteInitiator,
1216*6777b538SAndroid Build Coastguard Worker is_main_frame_navigation,
1217*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1218*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::SAME_SITE_STRICT,
1219*6777b538SAndroid Build Coastguard Worker lax_unsafe_if_main_frame),
1220*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForRequest(
1221*6777b538SAndroid Build Coastguard Worker "POST", {kSecureSiteUrl}, kSecureSiteForCookies,
1222*6777b538SAndroid Build Coastguard Worker kSiteInitiator, is_main_frame_navigation,
1223*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1224*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::SAME_SITE_STRICT,
1225*6777b538SAndroid Build Coastguard Worker lax_unsafe_if_main_frame),
1226*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForRequest(
1227*6777b538SAndroid Build Coastguard Worker "POST", {kSiteUrl}, kSiteForCookies, kSecureSiteInitiator,
1228*6777b538SAndroid Build Coastguard Worker is_main_frame_navigation,
1229*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1230*6777b538SAndroid Build Coastguard Worker }
1231*6777b538SAndroid Build Coastguard Worker
1232*6777b538SAndroid Build Coastguard Worker // Cross-scheme URL and site-for-cookies with cross-site initiator.
1233*6777b538SAndroid Build Coastguard Worker // (The request cannot be a main frame navigation if the site-for-cookies is
1234*6777b538SAndroid Build Coastguard Worker // not schemefully same-site).
1235*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::CROSS_SITE),
1236*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForRequest(
1237*6777b538SAndroid Build Coastguard Worker "GET", {kSiteUrl}, kSecureSiteForCookies, kCrossSiteInitiator,
1238*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1239*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1240*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::CROSS_SITE),
1241*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForRequest(
1242*6777b538SAndroid Build Coastguard Worker "GET", {kSecureSiteUrl}, kSiteForCookies, kCrossSiteInitiator,
1243*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1244*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1245*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::CROSS_SITE),
1246*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForRequest(
1247*6777b538SAndroid Build Coastguard Worker "POST", {kSiteUrl}, kSecureSiteForCookies, kCrossSiteInitiator,
1248*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1249*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1250*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::CROSS_SITE),
1251*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForRequest(
1252*6777b538SAndroid Build Coastguard Worker "POST", {kSecureSiteUrl}, kSiteForCookies, kCrossSiteInitiator,
1253*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1254*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1255*6777b538SAndroid Build Coastguard Worker }
1256*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,ForRequest_WebSocketSchemes)1257*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForRequest_WebSocketSchemes) {
1258*6777b538SAndroid Build Coastguard Worker // wss/https and http/ws are considered the same for schemeful purposes.
1259*6777b538SAndroid Build Coastguard Worker // (ws/wss requests cannot be main frame navigations.)
1260*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForRequest(
1261*6777b538SAndroid Build Coastguard Worker "GET", {kWssUrl}, kSecureSiteForCookies, kSecureSiteInitiator,
1262*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1263*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1264*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_STRICT));
1265*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(
1266*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForRequest(
1267*6777b538SAndroid Build Coastguard Worker "GET", {kWssUrl}, kSecureSiteForCookies, kSecureCrossSiteInitiator,
1268*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1269*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1270*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
1271*6777b538SAndroid Build Coastguard Worker
1272*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForRequest(
1273*6777b538SAndroid Build Coastguard Worker "GET", {kWsUrl}, kSiteForCookies, kSiteInitiator,
1274*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1275*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1276*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_STRICT));
1277*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForRequest(
1278*6777b538SAndroid Build Coastguard Worker "GET", {kWsUrl}, kSiteForCookies, kCrossSiteInitiator,
1279*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1280*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1281*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
1282*6777b538SAndroid Build Coastguard Worker }
1283*6777b538SAndroid Build Coastguard Worker
1284*6777b538SAndroid Build Coastguard Worker // Test cases where the URL chain contains multiple members, where the last
1285*6777b538SAndroid Build Coastguard Worker // member (current request URL) is same-site to kSiteUrl. (Everything is listed
1286*6777b538SAndroid Build Coastguard Worker // as same-site or cross-site relative to kSiteUrl.)
TEST_P(CookieUtilComputeSameSiteContextTest,ForRequest_Redirect)1287*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForRequest_Redirect) {
1288*6777b538SAndroid Build Coastguard Worker struct {
1289*6777b538SAndroid Build Coastguard Worker std::string method;
1290*6777b538SAndroid Build Coastguard Worker bool url_chain_is_same_site;
1291*6777b538SAndroid Build Coastguard Worker bool site_for_cookies_is_same_site;
1292*6777b538SAndroid Build Coastguard Worker bool initiator_is_same_site;
1293*6777b538SAndroid Build Coastguard Worker // These are the expected context types considering redirect chains:
1294*6777b538SAndroid Build Coastguard Worker ContextType expected_context_type; // for non-main-frame-nav requests.
1295*6777b538SAndroid Build Coastguard Worker ContextType expected_context_type_for_main_frame_navigation;
1296*6777b538SAndroid Build Coastguard Worker // These are the expected context types not considering redirect chains:
1297*6777b538SAndroid Build Coastguard Worker ContextType expected_context_type_without_chain;
1298*6777b538SAndroid Build Coastguard Worker ContextType expected_context_type_for_main_frame_navigation_without_chain;
1299*6777b538SAndroid Build Coastguard Worker // The expected redirect type (only applicable for chains):
1300*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316 expected_redirect_type_with_chain;
1301*6777b538SAndroid Build Coastguard Worker } kTestCases[] = {
1302*6777b538SAndroid Build Coastguard Worker // If the url chain is same-site, then the result is the same with or
1303*6777b538SAndroid Build Coastguard Worker // without considering the redirect chain.
1304*6777b538SAndroid Build Coastguard Worker {"GET", true, true, true, ContextType::SAME_SITE_STRICT,
1305*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_STRICT, ContextType::SAME_SITE_STRICT,
1306*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_STRICT,
1307*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kAllSameSiteRedirect},
1308*6777b538SAndroid Build Coastguard Worker {"GET", true, true, false, ContextType::CROSS_SITE,
1309*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX, ContextType::CROSS_SITE,
1310*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX,
1311*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1312*6777b538SAndroid Build Coastguard Worker {"GET", true, false, true, ContextType::CROSS_SITE,
1313*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1314*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE,
1315*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1316*6777b538SAndroid Build Coastguard Worker {"GET", true, false, false, ContextType::CROSS_SITE,
1317*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1318*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE,
1319*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1320*6777b538SAndroid Build Coastguard Worker // If the url chain is cross-site, then the result will differ depending
1321*6777b538SAndroid Build Coastguard Worker // on whether the redirect chain is considered, when the site-for-cookies
1322*6777b538SAndroid Build Coastguard Worker // and initiator are both same-site.
1323*6777b538SAndroid Build Coastguard Worker {"GET", false, true, true, ContextType::CROSS_SITE,
1324*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX, ContextType::SAME_SITE_STRICT,
1325*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_STRICT,
1326*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kPartialSameSiteRedirect},
1327*6777b538SAndroid Build Coastguard Worker {"GET", false, true, false, ContextType::CROSS_SITE,
1328*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX, ContextType::CROSS_SITE,
1329*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX,
1330*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1331*6777b538SAndroid Build Coastguard Worker {"GET", false, false, true, ContextType::CROSS_SITE,
1332*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1333*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE,
1334*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1335*6777b538SAndroid Build Coastguard Worker {"GET", false, false, false, ContextType::CROSS_SITE,
1336*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1337*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE,
1338*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1339*6777b538SAndroid Build Coastguard Worker // If the url chain is same-site, then the result is the same with or
1340*6777b538SAndroid Build Coastguard Worker // without considering the redirect chain.
1341*6777b538SAndroid Build Coastguard Worker {"POST", true, true, true, ContextType::SAME_SITE_STRICT,
1342*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_STRICT, ContextType::SAME_SITE_STRICT,
1343*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_STRICT,
1344*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kAllSameSiteRedirect},
1345*6777b538SAndroid Build Coastguard Worker {"POST", true, true, false, ContextType::CROSS_SITE,
1346*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX_METHOD_UNSAFE, ContextType::CROSS_SITE,
1347*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX_METHOD_UNSAFE,
1348*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1349*6777b538SAndroid Build Coastguard Worker {"POST", true, false, true, ContextType::CROSS_SITE,
1350*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1351*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE,
1352*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1353*6777b538SAndroid Build Coastguard Worker {"POST", true, false, false, ContextType::CROSS_SITE,
1354*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1355*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE,
1356*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1357*6777b538SAndroid Build Coastguard Worker // If the url chain is cross-site, then the result will differ depending
1358*6777b538SAndroid Build Coastguard Worker // on whether the redirect chain is considered, when the site-for-cookies
1359*6777b538SAndroid Build Coastguard Worker // and initiator are both same-site.
1360*6777b538SAndroid Build Coastguard Worker {"POST", false, true, true, ContextType::CROSS_SITE,
1361*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX_METHOD_UNSAFE, ContextType::SAME_SITE_STRICT,
1362*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_STRICT,
1363*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kPartialSameSiteRedirect},
1364*6777b538SAndroid Build Coastguard Worker {"POST", false, true, false, ContextType::CROSS_SITE,
1365*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX_METHOD_UNSAFE, ContextType::CROSS_SITE,
1366*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX_METHOD_UNSAFE,
1367*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1368*6777b538SAndroid Build Coastguard Worker {"POST", false, false, true, ContextType::CROSS_SITE,
1369*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1370*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE,
1371*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1372*6777b538SAndroid Build Coastguard Worker {"POST", false, false, false, ContextType::CROSS_SITE,
1373*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1374*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE,
1375*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1376*6777b538SAndroid Build Coastguard Worker };
1377*6777b538SAndroid Build Coastguard Worker
1378*6777b538SAndroid Build Coastguard Worker for (const auto& test_case : kTestCases) {
1379*6777b538SAndroid Build Coastguard Worker std::vector<std::vector<GURL>> url_chains =
1380*6777b538SAndroid Build Coastguard Worker test_case.url_chain_is_same_site ? GetSameSiteUrlChains(kSiteUrl)
1381*6777b538SAndroid Build Coastguard Worker : GetCrossSiteUrlChains(kSiteUrl);
1382*6777b538SAndroid Build Coastguard Worker std::vector<SiteForCookies> sites_for_cookies =
1383*6777b538SAndroid Build Coastguard Worker test_case.site_for_cookies_is_same_site ? GetSameSiteSitesForCookies()
1384*6777b538SAndroid Build Coastguard Worker : GetCrossSiteSitesForCookies();
1385*6777b538SAndroid Build Coastguard Worker std::vector<std::optional<url::Origin>> initiators =
1386*6777b538SAndroid Build Coastguard Worker test_case.initiator_is_same_site ? GetSameSiteInitiators()
1387*6777b538SAndroid Build Coastguard Worker : GetCrossSiteInitiators();
1388*6777b538SAndroid Build Coastguard Worker ContextType expected_context_type =
1389*6777b538SAndroid Build Coastguard Worker DoesSameSiteConsiderRedirectChain()
1390*6777b538SAndroid Build Coastguard Worker ? test_case.expected_context_type
1391*6777b538SAndroid Build Coastguard Worker : test_case.expected_context_type_without_chain;
1392*6777b538SAndroid Build Coastguard Worker ContextType expected_context_type_for_main_frame_navigation =
1393*6777b538SAndroid Build Coastguard Worker DoesSameSiteConsiderRedirectChain()
1394*6777b538SAndroid Build Coastguard Worker ? test_case.expected_context_type_for_main_frame_navigation
1395*6777b538SAndroid Build Coastguard Worker : test_case
1396*6777b538SAndroid Build Coastguard Worker .expected_context_type_for_main_frame_navigation_without_chain;
1397*6777b538SAndroid Build Coastguard Worker for (const std::vector<GURL>& url_chain : url_chains) {
1398*6777b538SAndroid Build Coastguard Worker for (const SiteForCookies& site_for_cookies : sites_for_cookies) {
1399*6777b538SAndroid Build Coastguard Worker for (const std::optional<url::Origin>& initiator : initiators) {
1400*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(
1401*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForRequest(
1402*6777b538SAndroid Build Coastguard Worker test_case.method, url_chain, site_for_cookies, initiator,
1403*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1404*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1405*6777b538SAndroid Build Coastguard Worker AllOf(ContextTypeIs(expected_context_type),
1406*6777b538SAndroid Build Coastguard Worker CrossSiteRedirectMetadataCorrect(
1407*6777b538SAndroid Build Coastguard Worker cookie_util::HttpMethodStringToEnum(test_case.method),
1408*6777b538SAndroid Build Coastguard Worker test_case.expected_context_type_without_chain,
1409*6777b538SAndroid Build Coastguard Worker test_case.expected_context_type,
1410*6777b538SAndroid Build Coastguard Worker test_case.expected_redirect_type_with_chain)))
1411*6777b538SAndroid Build Coastguard Worker << UrlChainToString(url_chain) << " "
1412*6777b538SAndroid Build Coastguard Worker << site_for_cookies.ToDebugString() << " "
1413*6777b538SAndroid Build Coastguard Worker << (initiator ? initiator->Serialize() : "nullopt");
1414*6777b538SAndroid Build Coastguard Worker if (!CanBeMainFrameNavigation(url_chain.back(), site_for_cookies))
1415*6777b538SAndroid Build Coastguard Worker continue;
1416*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(
1417*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForRequest(
1418*6777b538SAndroid Build Coastguard Worker test_case.method, url_chain, site_for_cookies, initiator,
1419*6777b538SAndroid Build Coastguard Worker true /* is_main_frame_navigation */,
1420*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1421*6777b538SAndroid Build Coastguard Worker AllOf(
1422*6777b538SAndroid Build Coastguard Worker ContextTypeIs(
1423*6777b538SAndroid Build Coastguard Worker expected_context_type_for_main_frame_navigation),
1424*6777b538SAndroid Build Coastguard Worker CrossSiteRedirectMetadataCorrect(
1425*6777b538SAndroid Build Coastguard Worker cookie_util::HttpMethodStringToEnum(test_case.method),
1426*6777b538SAndroid Build Coastguard Worker test_case
1427*6777b538SAndroid Build Coastguard Worker .expected_context_type_for_main_frame_navigation_without_chain,
1428*6777b538SAndroid Build Coastguard Worker test_case.expected_context_type_for_main_frame_navigation,
1429*6777b538SAndroid Build Coastguard Worker test_case.expected_redirect_type_with_chain)))
1430*6777b538SAndroid Build Coastguard Worker << UrlChainToString(url_chain) << " "
1431*6777b538SAndroid Build Coastguard Worker << site_for_cookies.ToDebugString() << " "
1432*6777b538SAndroid Build Coastguard Worker << (initiator ? initiator->Serialize() : "nullopt");
1433*6777b538SAndroid Build Coastguard Worker }
1434*6777b538SAndroid Build Coastguard Worker }
1435*6777b538SAndroid Build Coastguard Worker }
1436*6777b538SAndroid Build Coastguard Worker }
1437*6777b538SAndroid Build Coastguard Worker }
1438*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,ForScriptSet)1439*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForScriptSet) {
1440*6777b538SAndroid Build Coastguard Worker for (const GURL& url : GetSameSiteUrls()) {
1441*6777b538SAndroid Build Coastguard Worker for (const SiteForCookies& site_for_cookies :
1442*6777b538SAndroid Build Coastguard Worker GetSameSiteSitesForCookies()) {
1443*6777b538SAndroid Build Coastguard Worker // Same-site site-for-cookies -> it's same-site lax.
1444*6777b538SAndroid Build Coastguard Worker // (Cross-site cases covered above in UrlAndSiteForCookiesCrossSite test.)
1445*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(
1446*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForScriptSet(
1447*6777b538SAndroid Build Coastguard Worker url, site_for_cookies, false /* force_ignore_site_for_cookies */),
1448*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_LAX));
1449*6777b538SAndroid Build Coastguard Worker }
1450*6777b538SAndroid Build Coastguard Worker }
1451*6777b538SAndroid Build Coastguard Worker }
1452*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,ForScriptSet_SchemefulDowngrade)1453*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForScriptSet_SchemefulDowngrade) {
1454*6777b538SAndroid Build Coastguard Worker // Some test cases where the context is downgraded when computed schemefully.
1455*6777b538SAndroid Build Coastguard Worker // (Should already be covered above, but just to be explicit.)
1456*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::SAME_SITE_LAX,
1457*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE),
1458*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForScriptSet(
1459*6777b538SAndroid Build Coastguard Worker kSiteUrl, kSecureSiteForCookies,
1460*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1461*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::SAME_SITE_LAX,
1462*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE),
1463*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForScriptSet(
1464*6777b538SAndroid Build Coastguard Worker kSecureSiteUrl, kSiteForCookies,
1465*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1466*6777b538SAndroid Build Coastguard Worker }
1467*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,ForScriptSet_WebSocketSchemes)1468*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForScriptSet_WebSocketSchemes) {
1469*6777b538SAndroid Build Coastguard Worker // wss/https and http/ws are considered the same for schemeful purposes.
1470*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForScriptSet(
1471*6777b538SAndroid Build Coastguard Worker kWssUrl, kSecureSiteForCookies,
1472*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1473*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_LAX));
1474*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(
1475*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForScriptSet(
1476*6777b538SAndroid Build Coastguard Worker kWsUrl, kSiteForCookies, false /* force_ignore_site_for_cookies */),
1477*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_LAX));
1478*6777b538SAndroid Build Coastguard Worker }
1479*6777b538SAndroid Build Coastguard Worker
1480*6777b538SAndroid Build Coastguard Worker // Test cases where the URL chain has 1 member (i.e. no redirects).
TEST_P(CookieUtilComputeSameSiteContextTest,ForResponse)1481*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForResponse) {
1482*6777b538SAndroid Build Coastguard Worker for (const GURL& url : GetSameSiteUrls()) {
1483*6777b538SAndroid Build Coastguard Worker // Same-site site-for-cookies.
1484*6777b538SAndroid Build Coastguard Worker // (Cross-site cases covered above in UrlAndSiteForCookiesCrossSite test.)
1485*6777b538SAndroid Build Coastguard Worker for (const SiteForCookies& site_for_cookies :
1486*6777b538SAndroid Build Coastguard Worker GetSameSiteSitesForCookies()) {
1487*6777b538SAndroid Build Coastguard Worker // For main frame navigations, setting all SameSite cookies is allowed
1488*6777b538SAndroid Build Coastguard Worker // regardless of initiator.
1489*6777b538SAndroid Build Coastguard Worker for (const std::optional<url::Origin>& initiator : GetAllInitiators()) {
1490*6777b538SAndroid Build Coastguard Worker if (!CanBeMainFrameNavigation(url, site_for_cookies))
1491*6777b538SAndroid Build Coastguard Worker break;
1492*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForResponse(
1493*6777b538SAndroid Build Coastguard Worker {url}, site_for_cookies, initiator,
1494*6777b538SAndroid Build Coastguard Worker true /* is_main_frame_navigation */,
1495*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1496*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_LAX));
1497*6777b538SAndroid Build Coastguard Worker }
1498*6777b538SAndroid Build Coastguard Worker
1499*6777b538SAndroid Build Coastguard Worker // For non-main-frame-navigation requests, the context should be lax iff
1500*6777b538SAndroid Build Coastguard Worker // the initiator is same-site, and cross-site otherwise.
1501*6777b538SAndroid Build Coastguard Worker for (const std::optional<url::Origin>& initiator :
1502*6777b538SAndroid Build Coastguard Worker GetSameSiteInitiators()) {
1503*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForResponse(
1504*6777b538SAndroid Build Coastguard Worker {url}, site_for_cookies, initiator,
1505*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1506*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1507*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_LAX));
1508*6777b538SAndroid Build Coastguard Worker }
1509*6777b538SAndroid Build Coastguard Worker for (const std::optional<url::Origin>& initiator :
1510*6777b538SAndroid Build Coastguard Worker GetCrossSiteInitiators()) {
1511*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForResponse(
1512*6777b538SAndroid Build Coastguard Worker {url}, site_for_cookies, initiator,
1513*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1514*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1515*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
1516*6777b538SAndroid Build Coastguard Worker }
1517*6777b538SAndroid Build Coastguard Worker }
1518*6777b538SAndroid Build Coastguard Worker }
1519*6777b538SAndroid Build Coastguard Worker }
1520*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,ForResponse_SchemefulDowngrade)1521*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForResponse_SchemefulDowngrade) {
1522*6777b538SAndroid Build Coastguard Worker // Some test cases where the context is downgraded when computed schemefully.
1523*6777b538SAndroid Build Coastguard Worker // (Should already be covered above, but just to be explicit.)
1524*6777b538SAndroid Build Coastguard Worker
1525*6777b538SAndroid Build Coastguard Worker // URL and site-for-cookies are cross-scheme.
1526*6777b538SAndroid Build Coastguard Worker // (If the URL and site-for-cookies are not schemefully same-site, this cannot
1527*6777b538SAndroid Build Coastguard Worker // be a main frame navigation.)
1528*6777b538SAndroid Build Coastguard Worker // With same-site initiator:
1529*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::SAME_SITE_LAX,
1530*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE),
1531*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForResponse(
1532*6777b538SAndroid Build Coastguard Worker {kSiteUrl}, kSecureSiteForCookies, kSiteInitiator,
1533*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1534*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1535*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::SAME_SITE_LAX,
1536*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE),
1537*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForResponse(
1538*6777b538SAndroid Build Coastguard Worker {kSecureSiteUrl}, kSiteForCookies, kSecureSiteInitiator,
1539*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1540*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1541*6777b538SAndroid Build Coastguard Worker // With cross-site initiator:
1542*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::CROSS_SITE),
1543*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForResponse(
1544*6777b538SAndroid Build Coastguard Worker {kSiteUrl}, kSecureSiteForCookies, kCrossSiteInitiator,
1545*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1546*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1547*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::CROSS_SITE),
1548*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForResponse(
1549*6777b538SAndroid Build Coastguard Worker {kSecureSiteUrl}, kSiteForCookies, kCrossSiteInitiator,
1550*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1551*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1552*6777b538SAndroid Build Coastguard Worker
1553*6777b538SAndroid Build Coastguard Worker // Schemefully same-site URL and site-for-cookies with cross-scheme
1554*6777b538SAndroid Build Coastguard Worker // initiator.
1555*6777b538SAndroid Build Coastguard Worker for (bool is_main_frame_navigation : {false, true}) {
1556*6777b538SAndroid Build Coastguard Worker ContextType lax_if_main_frame = is_main_frame_navigation
1557*6777b538SAndroid Build Coastguard Worker ? ContextType::SAME_SITE_LAX
1558*6777b538SAndroid Build Coastguard Worker : ContextType::CROSS_SITE;
1559*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(
1560*6777b538SAndroid Build Coastguard Worker SameSiteCookieContext(ContextType::SAME_SITE_LAX, lax_if_main_frame),
1561*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForResponse(
1562*6777b538SAndroid Build Coastguard Worker {kSiteUrl}, kSiteForCookies, kSecureSiteInitiator,
1563*6777b538SAndroid Build Coastguard Worker is_main_frame_navigation,
1564*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1565*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(
1566*6777b538SAndroid Build Coastguard Worker SameSiteCookieContext(ContextType::SAME_SITE_LAX, lax_if_main_frame),
1567*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForResponse(
1568*6777b538SAndroid Build Coastguard Worker {kSecureSiteUrl}, kSecureSiteForCookies, kSiteInitiator,
1569*6777b538SAndroid Build Coastguard Worker is_main_frame_navigation,
1570*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1571*6777b538SAndroid Build Coastguard Worker }
1572*6777b538SAndroid Build Coastguard Worker }
1573*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,ForResponse_WebSocketSchemes)1574*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForResponse_WebSocketSchemes) {
1575*6777b538SAndroid Build Coastguard Worker // wss/https and http/ws are considered the same for schemeful purposes.
1576*6777b538SAndroid Build Coastguard Worker // (ws/wss requests cannot be main frame navigations.)
1577*6777b538SAndroid Build Coastguard Worker
1578*6777b538SAndroid Build Coastguard Worker // Same-site initiators.
1579*6777b538SAndroid Build Coastguard Worker for (const std::optional<url::Origin>& initiator : GetSameSiteInitiators()) {
1580*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForResponse(
1581*6777b538SAndroid Build Coastguard Worker {kWsUrl}, kSiteForCookies, initiator,
1582*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1583*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1584*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_LAX));
1585*6777b538SAndroid Build Coastguard Worker }
1586*6777b538SAndroid Build Coastguard Worker // Cross-site initiators.
1587*6777b538SAndroid Build Coastguard Worker for (const std::optional<url::Origin>& initiator : GetCrossSiteInitiators()) {
1588*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForResponse(
1589*6777b538SAndroid Build Coastguard Worker {kWsUrl}, kSiteForCookies, initiator,
1590*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1591*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1592*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::CROSS_SITE));
1593*6777b538SAndroid Build Coastguard Worker }
1594*6777b538SAndroid Build Coastguard Worker }
1595*6777b538SAndroid Build Coastguard Worker
1596*6777b538SAndroid Build Coastguard Worker // Test cases where the URL chain contains multiple members, where the last
1597*6777b538SAndroid Build Coastguard Worker // member (current request URL) is same-site to kSiteUrl. (Everything is listed
1598*6777b538SAndroid Build Coastguard Worker // as same-site or cross-site relative to kSiteUrl.)
TEST_P(CookieUtilComputeSameSiteContextTest,ForResponse_Redirect)1599*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForResponse_Redirect) {
1600*6777b538SAndroid Build Coastguard Worker struct {
1601*6777b538SAndroid Build Coastguard Worker bool url_chain_is_same_site;
1602*6777b538SAndroid Build Coastguard Worker bool site_for_cookies_is_same_site;
1603*6777b538SAndroid Build Coastguard Worker bool initiator_is_same_site;
1604*6777b538SAndroid Build Coastguard Worker // These are the expected context types considering redirect chains:
1605*6777b538SAndroid Build Coastguard Worker ContextType expected_context_type; // for non-main-frame-nav requests.
1606*6777b538SAndroid Build Coastguard Worker ContextType expected_context_type_for_main_frame_navigation;
1607*6777b538SAndroid Build Coastguard Worker // These are the expected context types not considering redirect chains:
1608*6777b538SAndroid Build Coastguard Worker ContextType expected_context_type_without_chain;
1609*6777b538SAndroid Build Coastguard Worker ContextType expected_context_type_for_main_frame_navigation_without_chain;
1610*6777b538SAndroid Build Coastguard Worker // The expected redirect type (only applicable for chains):
1611*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316 expected_redirect_type_with_chain;
1612*6777b538SAndroid Build Coastguard Worker } kTestCases[] = {
1613*6777b538SAndroid Build Coastguard Worker // If the url chain is same-site, then the result is the same with or
1614*6777b538SAndroid Build Coastguard Worker // without considering the redirect chain.
1615*6777b538SAndroid Build Coastguard Worker {true, true, true, ContextType::SAME_SITE_LAX, ContextType::SAME_SITE_LAX,
1616*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX, ContextType::SAME_SITE_LAX,
1617*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kAllSameSiteRedirect},
1618*6777b538SAndroid Build Coastguard Worker {true, true, false, ContextType::CROSS_SITE, ContextType::SAME_SITE_LAX,
1619*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE, ContextType::SAME_SITE_LAX,
1620*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1621*6777b538SAndroid Build Coastguard Worker {true, false, true, ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1622*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1623*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1624*6777b538SAndroid Build Coastguard Worker {true, false, false, ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1625*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1626*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1627*6777b538SAndroid Build Coastguard Worker // If the url chain is cross-site, then the result will differ depending
1628*6777b538SAndroid Build Coastguard Worker // on whether the redirect chain is considered, when the site-for-cookies
1629*6777b538SAndroid Build Coastguard Worker // and initiator are both same-site.
1630*6777b538SAndroid Build Coastguard Worker {false, true, true, ContextType::CROSS_SITE, ContextType::SAME_SITE_LAX,
1631*6777b538SAndroid Build Coastguard Worker ContextType::SAME_SITE_LAX, ContextType::SAME_SITE_LAX,
1632*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kPartialSameSiteRedirect},
1633*6777b538SAndroid Build Coastguard Worker {false, true, false, ContextType::CROSS_SITE, ContextType::SAME_SITE_LAX,
1634*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE, ContextType::SAME_SITE_LAX,
1635*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1636*6777b538SAndroid Build Coastguard Worker {false, false, true, ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1637*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1638*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1639*6777b538SAndroid Build Coastguard Worker {false, false, false, ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1640*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE, ContextType::CROSS_SITE,
1641*6777b538SAndroid Build Coastguard Worker ContextRedirectTypeBug1221316::kCrossSiteRedirect},
1642*6777b538SAndroid Build Coastguard Worker };
1643*6777b538SAndroid Build Coastguard Worker for (const auto& test_case : kTestCases) {
1644*6777b538SAndroid Build Coastguard Worker std::vector<std::vector<GURL>> url_chains =
1645*6777b538SAndroid Build Coastguard Worker test_case.url_chain_is_same_site ? GetSameSiteUrlChains(kSiteUrl)
1646*6777b538SAndroid Build Coastguard Worker : GetCrossSiteUrlChains(kSiteUrl);
1647*6777b538SAndroid Build Coastguard Worker std::vector<SiteForCookies> sites_for_cookies =
1648*6777b538SAndroid Build Coastguard Worker test_case.site_for_cookies_is_same_site ? GetSameSiteSitesForCookies()
1649*6777b538SAndroid Build Coastguard Worker : GetCrossSiteSitesForCookies();
1650*6777b538SAndroid Build Coastguard Worker std::vector<std::optional<url::Origin>> initiators =
1651*6777b538SAndroid Build Coastguard Worker test_case.initiator_is_same_site ? GetSameSiteInitiators()
1652*6777b538SAndroid Build Coastguard Worker : GetCrossSiteInitiators();
1653*6777b538SAndroid Build Coastguard Worker ContextType expected_context_type =
1654*6777b538SAndroid Build Coastguard Worker DoesSameSiteConsiderRedirectChain()
1655*6777b538SAndroid Build Coastguard Worker ? test_case.expected_context_type
1656*6777b538SAndroid Build Coastguard Worker : test_case.expected_context_type_without_chain;
1657*6777b538SAndroid Build Coastguard Worker ContextType expected_context_type_for_main_frame_navigation =
1658*6777b538SAndroid Build Coastguard Worker DoesSameSiteConsiderRedirectChain()
1659*6777b538SAndroid Build Coastguard Worker ? test_case.expected_context_type_for_main_frame_navigation
1660*6777b538SAndroid Build Coastguard Worker : test_case
1661*6777b538SAndroid Build Coastguard Worker .expected_context_type_for_main_frame_navigation_without_chain;
1662*6777b538SAndroid Build Coastguard Worker for (const std::vector<GURL>& url_chain : url_chains) {
1663*6777b538SAndroid Build Coastguard Worker for (const SiteForCookies& site_for_cookies : sites_for_cookies) {
1664*6777b538SAndroid Build Coastguard Worker for (const std::optional<url::Origin>& initiator : initiators) {
1665*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForResponse(
1666*6777b538SAndroid Build Coastguard Worker url_chain, site_for_cookies, initiator,
1667*6777b538SAndroid Build Coastguard Worker false /* is_main_frame_navigation */,
1668*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1669*6777b538SAndroid Build Coastguard Worker AllOf(ContextTypeIs(expected_context_type),
1670*6777b538SAndroid Build Coastguard Worker // The 'method' field is kept empty because it's
1671*6777b538SAndroid Build Coastguard Worker // only used to check http_method_bug_1221316 which
1672*6777b538SAndroid Build Coastguard Worker // is always empty for responses.
1673*6777b538SAndroid Build Coastguard Worker CrossSiteRedirectMetadataCorrect(
1674*6777b538SAndroid Build Coastguard Worker HttpMethod::kUnset,
1675*6777b538SAndroid Build Coastguard Worker test_case.expected_context_type_without_chain,
1676*6777b538SAndroid Build Coastguard Worker test_case.expected_context_type,
1677*6777b538SAndroid Build Coastguard Worker test_case.expected_redirect_type_with_chain)))
1678*6777b538SAndroid Build Coastguard Worker << UrlChainToString(url_chain) << " "
1679*6777b538SAndroid Build Coastguard Worker << site_for_cookies.ToDebugString() << " "
1680*6777b538SAndroid Build Coastguard Worker << (initiator ? initiator->Serialize() : "nullopt");
1681*6777b538SAndroid Build Coastguard Worker if (!CanBeMainFrameNavigation(url_chain.back(), site_for_cookies))
1682*6777b538SAndroid Build Coastguard Worker continue;
1683*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(
1684*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForResponse(
1685*6777b538SAndroid Build Coastguard Worker url_chain, site_for_cookies, initiator,
1686*6777b538SAndroid Build Coastguard Worker true /* is_main_frame_navigation */,
1687*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1688*6777b538SAndroid Build Coastguard Worker AllOf(
1689*6777b538SAndroid Build Coastguard Worker ContextTypeIs(
1690*6777b538SAndroid Build Coastguard Worker expected_context_type_for_main_frame_navigation),
1691*6777b538SAndroid Build Coastguard Worker CrossSiteRedirectMetadataCorrect(
1692*6777b538SAndroid Build Coastguard Worker HttpMethod::kUnset,
1693*6777b538SAndroid Build Coastguard Worker test_case
1694*6777b538SAndroid Build Coastguard Worker .expected_context_type_for_main_frame_navigation_without_chain,
1695*6777b538SAndroid Build Coastguard Worker test_case.expected_context_type_for_main_frame_navigation,
1696*6777b538SAndroid Build Coastguard Worker test_case.expected_redirect_type_with_chain)))
1697*6777b538SAndroid Build Coastguard Worker << UrlChainToString(url_chain) << " "
1698*6777b538SAndroid Build Coastguard Worker << site_for_cookies.ToDebugString() << " "
1699*6777b538SAndroid Build Coastguard Worker << (initiator ? initiator->Serialize() : "nullopt");
1700*6777b538SAndroid Build Coastguard Worker }
1701*6777b538SAndroid Build Coastguard Worker }
1702*6777b538SAndroid Build Coastguard Worker }
1703*6777b538SAndroid Build Coastguard Worker }
1704*6777b538SAndroid Build Coastguard Worker }
1705*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,ForSubresource)1706*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForSubresource) {
1707*6777b538SAndroid Build Coastguard Worker for (const GURL& url : GetSameSiteUrls()) {
1708*6777b538SAndroid Build Coastguard Worker // Same-site site-for-cookies.
1709*6777b538SAndroid Build Coastguard Worker // (Cross-site cases covered above in UrlAndSiteForCookiesCrossSite test.)
1710*6777b538SAndroid Build Coastguard Worker for (const SiteForCookies& site_for_cookies :
1711*6777b538SAndroid Build Coastguard Worker GetSameSiteSitesForCookies()) {
1712*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(
1713*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForSubresource(
1714*6777b538SAndroid Build Coastguard Worker url, site_for_cookies, false /* force_ignore_site_for_cookies */),
1715*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_STRICT));
1716*6777b538SAndroid Build Coastguard Worker }
1717*6777b538SAndroid Build Coastguard Worker }
1718*6777b538SAndroid Build Coastguard Worker }
1719*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,ForSubresource_SchemefulDowngrade)1720*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest,
1721*6777b538SAndroid Build Coastguard Worker ForSubresource_SchemefulDowngrade) {
1722*6777b538SAndroid Build Coastguard Worker // Some test cases where the context is downgraded when computed schemefully.
1723*6777b538SAndroid Build Coastguard Worker // (Should already be covered above, but just to be explicit.)
1724*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::SAME_SITE_STRICT,
1725*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE),
1726*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForSubresource(
1727*6777b538SAndroid Build Coastguard Worker kSiteUrl, kSecureSiteForCookies,
1728*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1729*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SameSiteCookieContext(ContextType::SAME_SITE_STRICT,
1730*6777b538SAndroid Build Coastguard Worker ContextType::CROSS_SITE),
1731*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForSubresource(
1732*6777b538SAndroid Build Coastguard Worker kSecureSiteUrl, kSiteForCookies,
1733*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */));
1734*6777b538SAndroid Build Coastguard Worker }
1735*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,ForSubresource_WebSocketSchemes)1736*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForSubresource_WebSocketSchemes) {
1737*6777b538SAndroid Build Coastguard Worker // wss/https and http/ws are considered the same for schemeful purposes.
1738*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForSubresource(
1739*6777b538SAndroid Build Coastguard Worker kWssUrl, kSecureSiteForCookies,
1740*6777b538SAndroid Build Coastguard Worker false /* force_ignore_site_for_cookies */),
1741*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_STRICT));
1742*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(
1743*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForSubresource(
1744*6777b538SAndroid Build Coastguard Worker kWsUrl, kSiteForCookies, false /* force_ignore_site_for_cookies */),
1745*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_STRICT));
1746*6777b538SAndroid Build Coastguard Worker }
1747*6777b538SAndroid Build Coastguard Worker
TEST_P(CookieUtilComputeSameSiteContextTest,ForceIgnoreSiteForCookies)1748*6777b538SAndroid Build Coastguard Worker TEST_P(CookieUtilComputeSameSiteContextTest, ForceIgnoreSiteForCookies) {
1749*6777b538SAndroid Build Coastguard Worker // force_ignore_site_for_cookies overrides all checks and returns same-site
1750*6777b538SAndroid Build Coastguard Worker // (STRICT for get or LAX for set).
1751*6777b538SAndroid Build Coastguard Worker for (const GURL& url : GetAllUrls()) {
1752*6777b538SAndroid Build Coastguard Worker for (const SiteForCookies& site_for_cookies : GetAllSitesForCookies()) {
1753*6777b538SAndroid Build Coastguard Worker for (const std::optional<url::Origin>& initiator : GetAllInitiators()) {
1754*6777b538SAndroid Build Coastguard Worker for (const std::string& method : {"GET", "POST", "PUT", "HEAD"}) {
1755*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForScriptGet(
1756*6777b538SAndroid Build Coastguard Worker url, site_for_cookies, initiator,
1757*6777b538SAndroid Build Coastguard Worker true /* force_ignore_site_for_cookies */),
1758*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_STRICT));
1759*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForScriptSet(
1760*6777b538SAndroid Build Coastguard Worker url, site_for_cookies,
1761*6777b538SAndroid Build Coastguard Worker true /* force_ignore_site_for_cookies */),
1762*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_LAX));
1763*6777b538SAndroid Build Coastguard Worker for (bool is_main_frame_navigation :
1764*6777b538SAndroid Build Coastguard Worker IsMainFrameNavigationPossibleValues(url, site_for_cookies)) {
1765*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForRequest(
1766*6777b538SAndroid Build Coastguard Worker method, {url}, site_for_cookies, initiator,
1767*6777b538SAndroid Build Coastguard Worker is_main_frame_navigation,
1768*6777b538SAndroid Build Coastguard Worker true /* force_ignore_site_for_cookies */),
1769*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_STRICT));
1770*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForResponse(
1771*6777b538SAndroid Build Coastguard Worker {url}, site_for_cookies, initiator,
1772*6777b538SAndroid Build Coastguard Worker is_main_frame_navigation,
1773*6777b538SAndroid Build Coastguard Worker true /* force_ignore_site_for_cookies */),
1774*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_LAX));
1775*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(
1776*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForRequest(
1777*6777b538SAndroid Build Coastguard Worker method, {site_for_cookies.RepresentativeUrl(), url},
1778*6777b538SAndroid Build Coastguard Worker site_for_cookies, initiator, is_main_frame_navigation,
1779*6777b538SAndroid Build Coastguard Worker true /* force_ignore_site_for_cookies */),
1780*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_STRICT));
1781*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(
1782*6777b538SAndroid Build Coastguard Worker cookie_util::ComputeSameSiteContextForResponse(
1783*6777b538SAndroid Build Coastguard Worker {site_for_cookies.RepresentativeUrl(), url},
1784*6777b538SAndroid Build Coastguard Worker site_for_cookies, initiator, is_main_frame_navigation,
1785*6777b538SAndroid Build Coastguard Worker true /* force_ignore_site_for_cookies */),
1786*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_LAX));
1787*6777b538SAndroid Build Coastguard Worker }
1788*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cookie_util::ComputeSameSiteContextForSubresource(
1789*6777b538SAndroid Build Coastguard Worker url, site_for_cookies,
1790*6777b538SAndroid Build Coastguard Worker true /* force_ignore_site_for_cookies */),
1791*6777b538SAndroid Build Coastguard Worker ContextTypeIs(ContextType::SAME_SITE_STRICT));
1792*6777b538SAndroid Build Coastguard Worker }
1793*6777b538SAndroid Build Coastguard Worker }
1794*6777b538SAndroid Build Coastguard Worker }
1795*6777b538SAndroid Build Coastguard Worker }
1796*6777b538SAndroid Build Coastguard Worker }
1797*6777b538SAndroid Build Coastguard Worker
1798*6777b538SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(/* no label */,
1799*6777b538SAndroid Build Coastguard Worker CookieUtilComputeSameSiteContextTest,
1800*6777b538SAndroid Build Coastguard Worker ::testing::Combine(::testing::Bool(),
1801*6777b538SAndroid Build Coastguard Worker ::testing::Bool()));
1802*6777b538SAndroid Build Coastguard Worker
TEST(CookieUtilTest,IsCookieAccessResultInclude)1803*6777b538SAndroid Build Coastguard Worker TEST(CookieUtilTest, IsCookieAccessResultInclude) {
1804*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cookie_util::IsCookieAccessResultInclude(CookieAccessResult(
1805*6777b538SAndroid Build Coastguard Worker CookieInclusionStatus(CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR))));
1806*6777b538SAndroid Build Coastguard Worker
1807*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cookie_util::IsCookieAccessResultInclude(CookieAccessResult()));
1808*6777b538SAndroid Build Coastguard Worker }
1809*6777b538SAndroid Build Coastguard Worker
1810*6777b538SAndroid Build Coastguard Worker } // namespace
1811*6777b538SAndroid Build Coastguard Worker
1812*6777b538SAndroid Build Coastguard Worker } // namespace net
1813