@@ -80,9 +80,46 @@ test('unknown header value matches nothing', function () {
8080});
8181
8282
83- test ('no Sec-Fetch-Site returns false ' , function () {
83+ test ('no header, no cookie returns false ' , function () {
8484 $ request = new Http \Request (new Http \UrlScript );
8585
8686 Assert::false ($ request ->isFrom (FetchSite::SameOrigin));
8787 Assert::false ($ request ->isFrom (FetchSite::CrossSite));
8888});
89+
90+
91+ test ('cookie fallback proves only "not cross-site" ' , function () {
92+ $ request = new Http \Request (new Http \UrlScript , cookies: [
93+ Http \Helpers::StrictCookieName => '1 ' ,
94+ ]);
95+
96+ Assert::true ($ request ->isFrom (FetchSite::SameOrigin));
97+ Assert::true ($ request ->isFrom (FetchSite::SameSite));
98+ Assert::true ($ request ->isFrom (FetchSite::None));
99+ Assert::true ($ request ->isFrom ([FetchSite::SameOrigin, FetchSite::CrossSite]));
100+ Assert::false ($ request ->isFrom (FetchSite::CrossSite));
101+ });
102+
103+
104+ test ('cookie fallback fails closed for dest & user ' , function () {
105+ $ request = new Http \Request (new Http \UrlScript , cookies: [
106+ Http \Helpers::StrictCookieName => '1 ' ,
107+ ]);
108+
109+ // dest/user can't be proven by the cookie alone, so a stricter check must not pass
110+ Assert::false ($ request ->isFrom (FetchSite::SameOrigin, FetchDest::Document));
111+ Assert::false ($ request ->isFrom (FetchSite::SameOrigin, user: true ));
112+ Assert::false ($ request ->isFrom (FetchSite::SameOrigin, user: false ));
113+ });
114+
115+
116+ test ('cookie fallback not used when Sec-Fetch-Site present ' , function () {
117+ $ request = new Http \Request (new Http \UrlScript , cookies: [
118+ Http \Helpers::StrictCookieName => '1 ' ,
119+ ], headers: [
120+ 'Sec-Fetch-Site ' => 'cross-site ' ,
121+ ]);
122+
123+ Assert::false ($ request ->isFrom (FetchSite::SameOrigin));
124+ Assert::true ($ request ->isFrom (FetchSite::CrossSite));
125+ });
0 commit comments