@@ -164,44 +164,61 @@ bool Request::is_navigation_request() const
164164}
165165
166166// https://fetch.spec.whatwg.org/#concept-request-tainted-origin
167- bool Request::has_redirect_tainted_origin () const
167+ RedirectTaint Request::redirect_taint () const
168168{
169- // A request request has a redirect-tainted origin if these steps return true:
169+ // 1. Assert: request’s origin is not "client".
170+ if (auto const * origin = m_origin.get_pointer <Origin>())
171+ VERIFY (*origin != Origin::Client);
170172
171- // 1 . Let lastURL be null.
173+ // 2 . Let lastURL be null.
172174 Optional<URL::URL const &> last_url;
173175
174- // 2. For each url of request’s URL list:
176+ // 3. Let taint be "same-origin".
177+ auto taint = RedirectTaint::SameOrigin;
178+
179+ // 4. For each url of request’s URL list:
175180 for (auto const & url : m_url_list) {
176181 // 1. If lastURL is null, then set lastURL to url and continue.
177182 if (!last_url.has_value ()) {
178183 last_url = url;
179184 continue ;
180185 }
181186
182- // 2. If url’s origin is not same origin with lastURL’s origin and request’s origin is not same origin with lastURL’s origin, then return true.
187+ // 2. If url’s origin is not same site with lastURL’s origin and request’s origin is not same site with
188+ // lastURL’s origin, then return "cross-site".
183189 auto const * request_origin = m_origin.get_pointer <URL::Origin>();
190+ if (!url.origin ().is_same_site (last_url->origin ())
191+ && (request_origin == nullptr || !request_origin->is_same_site (last_url->origin ()))) {
192+ return RedirectTaint::CrossSite;
193+ }
194+
195+ // 3. If url’s origin is not same origin with lastURL’s origin and request’s origin is not same origin with
196+ // lastURL’s origin, then set taint to "same-site".
184197 if (!url.origin ().is_same_origin (last_url->origin ())
185198 && (request_origin == nullptr || !request_origin->is_same_origin (last_url->origin ()))) {
186- return true ;
199+ taint = RedirectTaint::SameSite ;
187200 }
188201
189- // 3 . Set lastURL to url.
202+ // 4 . Set lastURL to url.
190203 last_url = url;
191204 }
192205
193- // 3 . Return false .
194- return false ;
206+ // 5 . Return taint .
207+ return taint ;
195208}
196209
197210// https://fetch.spec.whatwg.org/#serializing-a-request-origin
198211String Request::serialize_origin () const
199212{
200- // 1. If request has a redirect-tainted origin, then return "null".
201- if (has_redirect_tainted_origin ())
213+ // 1. Assert: request’s origin is not "client".
214+ if (auto const * origin = m_origin.get_pointer <Origin>())
215+ VERIFY (*origin != Origin::Client);
216+
217+ // 2. If request’s redirect-taint is not "same-origin", then return "null".
218+ if (redirect_taint () != RedirectTaint::SameOrigin)
202219 return " null" _string;
203220
204- // 2 . Return request’s origin, serialized.
221+ // 3 . Return request’s origin, serialized.
205222 return m_origin.get <URL::Origin>().serialize ();
206223}
207224
@@ -358,25 +375,30 @@ void Request::add_origin_header()
358375// https://fetch.spec.whatwg.org/#cross-origin-embedder-policy-allows-credentials
359376bool Request::cross_origin_embedder_policy_allows_credentials () const
360377{
361- // 1. If request’s mode is not "no-cors", then return true.
378+ // 1. Assert: request’s origin is not "client".
379+ if (auto const * origin = m_origin.get_pointer <Origin>())
380+ VERIFY (*origin != Origin::Client);
381+
382+ // 2. If request’s mode is not "no-cors", then return true.
362383 if (m_mode != Mode::NoCORS)
363384 return true ;
364385
365- // 2 . If request’s client is null, then return true.
386+ // 3 . If request’s client is null, then return true.
366387 if (m_client == nullptr )
367388 return true ;
368389
369- // 3 . If request’s client’s policy container’s embedder policy’s value is not "credentialless", then return true.
390+ // 4 . If request’s client’s policy container’s embedder policy’s value is not "credentialless", then return true.
370391 if (m_policy_container.has <GC::Ref<HTML::PolicyContainer>>() && m_policy_container.get <GC::Ref<HTML::PolicyContainer>>()->embedder_policy .value != HTML::EmbedderPolicyValue::Credentialless)
371392 return true ;
372393
373- // 4. If request’s origin is same origin with request’s current URL’s origin and request does not have a redirect-tainted origin, then return true.
374- // 5. Return false.
394+ // 5. If request’s origin is same origin with request’s current URL’s origin and request’s redirect-taint is not
395+ // "same-origin", then return true.
396+ // 6. Return false.
375397 auto const * request_origin = m_origin.get_pointer <URL::Origin>();
376398 if (request_origin == nullptr )
377399 return false ;
378400
379- return request_origin->is_same_origin (current_url ().origin ()) && ! has_redirect_tainted_origin () ;
401+ return request_origin->is_same_origin (current_url ().origin ()) && redirect_taint () != RedirectTaint::SameOrigin ;
380402}
381403
382404StringView request_destination_to_string (Request::Destination destination)
0 commit comments