From 7e277797ad8e4df20205657560a6266c42fceaa6 Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Fri, 22 Sep 2023 17:31:25 -0600 Subject: [PATCH] LibWeb: Add about base url to the various AOs that construct documents And some assorted cleanup along the way. The browsing context and document AOs in particular need re-alignment with the spec. --- Userland/Libraries/LibWeb/DOM/Document.cpp | 1 + Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp | 9 +++++++++ Userland/Libraries/LibWeb/HTML/Navigable.cpp | 1 + Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp | 10 ++++++++-- .../Libraries/LibWeb/HTML/TraversableNavigable.cpp | 9 +++++++++ 5 files changed, 28 insertions(+), 2 deletions(-) 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);