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.
This commit is contained in:
Andrew Kaster 2023-09-22 17:31:25 -06:00 committed by Andrew Kaster
parent dc0f7c4c54
commit 7e277797ad
5 changed files with 28 additions and 2 deletions

View file

@ -269,6 +269,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Document>> 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;

View file

@ -121,11 +121,17 @@ WebIDL::ExceptionOr<BrowsingContext::BrowsingContextAndDocument> BrowsingContext
// 3. Let creatorOrigin be null.
Optional<Origin> creator_origin = {};
// FIXME: This algorithm needs re-aligned with the spec
Optional<AK::URL> 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::BrowsingContextAndDocument> 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.

View file

@ -1531,6 +1531,7 @@ WebIDL::ExceptionOr<void> 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());

View file

@ -80,12 +80,18 @@ WebIDL::ExceptionOr<void> 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<DocumentState> document_state = *heap().allocate_without_realm<HTML::DocumentState>();
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> navigable = *heap().allocate_without_realm<Navigable>();

View file

@ -71,9 +71,18 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<TraversableNavigable>> 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<Origin> {} : 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<TraversableNavigable>(page);