diff --git a/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Requests.h b/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Requests.h index c0261d685d4..03f568bde29 100644 --- a/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Requests.h +++ b/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Requests.h @@ -228,6 +228,9 @@ public: [[nodiscard]] OriginType const& origin() const { return m_origin; } void set_origin(OriginType origin) { m_origin = move(origin); } + [[nodiscard]] Optional const& top_level_navigation_initiator_origin() const { return m_top_level_navigation_initiator_origin; } + void set_top_level_navigation_initiator_origin(Optional top_level_navigation_initiator_origin) { m_top_level_navigation_initiator_origin = move(top_level_navigation_initiator_origin); } + [[nodiscard]] PolicyContainerType const& policy_container() const { return m_policy_container; } void set_policy_container(PolicyContainerType policy_container) { m_policy_container = move(policy_container); } @@ -417,6 +420,10 @@ private: // A request has an associated origin, which is "client" or an origin. Unless stated otherwise it is "client". OriginType m_origin { Origin::Client }; + // https://fetch.spec.whatwg.org/#request-top-level-navigation-initiator-origin + // A request has an associated top-level navigation initiator origin, which is an origin or null. Unless stated otherwise it is null. + Optional m_top_level_navigation_initiator_origin; + // https://fetch.spec.whatwg.org/#concept-request-policy-container // A request has an associated policy container, which is "client" or a policy container. Unless stated otherwise // it is "client". diff --git a/Libraries/LibWeb/HTML/Navigable.cpp b/Libraries/LibWeb/HTML/Navigable.cpp index 511df6241ec..1062aa373e4 100644 --- a/Libraries/LibWeb/HTML/Navigable.cpp +++ b/Libraries/LibWeb/HTML/Navigable.cpp @@ -866,7 +866,10 @@ static WebIDL::ExceptionOr create_navigation request->set_referrer(entry->document_state()->request_referrer()); request->set_policy_container(source_snapshot_params.source_policy_container); - // FIXME: 4. If navigable is a top-level traversable, then set request's top-level navigation initiator origin to entry's document state's initiator origin. + // 4. If navigable is a top-level traversable, then set request's top-level navigation initiator origin to entry's + // document state's initiator origin. + if (navigable->top_level_traversable()->parent() == nullptr) + request->set_top_level_navigation_initiator_origin(entry->document_state()->origin()); // 5. If request's client is null: if (request->client() == nullptr) {