diff --git a/Userland/Libraries/LibWeb/DOM/Document.cpp b/Userland/Libraries/LibWeb/DOM/Document.cpp index e90c60bc81..abd3bb2c56 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.cpp +++ b/Userland/Libraries/LibWeb/DOM/Document.cpp @@ -269,6 +269,7 @@ WebIDL::ExceptionOr> Document::create_and_initialize( document->set_url(*creation_url); document->m_navigation_id = navigation_params.id; document->m_readiness = HTML::DocumentReadyState::Loading; + document->m_about_base_url = navigation_params.about_base_url; document->m_window = window; diff --git a/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp b/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp index 782b5c4bdc..a8a0225a79 100644 --- a/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp +++ b/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp @@ -121,11 +121,17 @@ WebIDL::ExceptionOr BrowsingContext // 3. Let creatorOrigin be null. Optional creator_origin = {}; + // FIXME: This algorithm needs re-aligned with the spec + Optional creator_base_url = {}; + // 4. If creator is non-null, then: if (creator) { // 1. Set creatorOrigin to creator's origin. creator_origin = creator->origin(); + // FIXME: This algorithm needs re-aligned with the spec + creator_base_url = creator->base_url(); + // FIXME: 2. Set browsingContext's creator base URL to an algorithm which returns creator's base URL. // FIXME: 3. Set browsingContext's virtual browsing context group ID to creator's browsing context's top-level browsing context's virtual browsing context group ID. @@ -211,6 +217,9 @@ WebIDL::ExceptionOr BrowsingContext // is initial about:blank: true document->set_is_initial_about_blank(true); + // about base URL: creatorBaseURL + document->set_about_base_url(creator_base_url); + // 15. If creator is non-null, then: if (creator) { // 1. Set document's referrer to the serialization of creator's URL. diff --git a/Userland/Libraries/LibWeb/HTML/Navigable.cpp b/Userland/Libraries/LibWeb/HTML/Navigable.cpp index a9d83dad54..c5844cb150 100644 --- a/Userland/Libraries/LibWeb/HTML/Navigable.cpp +++ b/Userland/Libraries/LibWeb/HTML/Navigable.cpp @@ -1531,6 +1531,7 @@ WebIDL::ExceptionOr Navigable::navigate_to_a_javascript_url(AK::URL const& document_state->set_request_referrer_policy(old_doc_state->request_referrer_policy()); document_state->set_initiator_origin(initiator_origin); document_state->set_origin(initiator_origin); + document_state->set_about_base_url(old_doc_state->about_base_url()); document_state->set_ever_populated(true); document_state->set_navigable_target_name(old_doc_state->navigable_target_name()); diff --git a/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp b/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp index afbb0d12c6..ef108fe8b5 100644 --- a/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp +++ b/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp @@ -80,12 +80,18 @@ WebIDL::ExceptionOr NavigableContainer::create_new_child_navigable() target_name = String::from_deprecated_string(value).release_value_but_fixme_should_propagate_errors(); // 6. Let documentState be a new document state, with - // document: document - // navigable target name: targetName + // - document: document + // - initiator origin: document's origin + // - origin: document's origin + // - navigable target name: targetName + // - about base URL: document's about base URL JS::NonnullGCPtr document_state = *heap().allocate_without_realm(); document_state->set_document(document); + document_state->set_initiator_origin(document->origin()); + document_state->set_origin(document->origin()); if (target_name.has_value()) document_state->set_navigable_target_name(*target_name); + document_state->set_about_base_url(document->about_base_url()); // 7. Let navigable be a new navigable. JS::NonnullGCPtr navigable = *heap().allocate_without_realm(); diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp index 1c05d49391..bf4c866c95 100644 --- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp +++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp @@ -71,9 +71,18 @@ WebIDL::ExceptionOr> TraversableNavigable // document: document document_state->set_document(document); + // initiator origin: null if opener is null; otherwise, document's origin + document_state->set_initiator_origin(opener ? Optional {} : document->origin()); + + // origin: document's origin + document_state->set_origin(document->origin()); + // navigable target name: targetName document_state->set_navigable_target_name(target_name); + // about base URL: document's about base URL + document_state->set_about_base_url(document->about_base_url()); + // 5. Let traversable be a new traversable navigable. auto traversable = vm.heap().allocate_without_realm(page);