From 6e75440d5a73d44ecb0456550ab0aa483ca763ee Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Sun, 4 Feb 2024 03:41:07 -0700 Subject: [PATCH] LibWeb: Bring Document::fallback_base_url closer to the spec --- Userland/Libraries/LibWeb/DOM/Document.cpp | 15 +++++++++++---- .../Libraries/LibWeb/HTML/BrowsingContext.cpp | 12 ++++++++++++ Userland/Libraries/LibWeb/HTML/BrowsingContext.h | 3 ++- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibWeb/DOM/Document.cpp b/Userland/Libraries/LibWeb/DOM/Document.cpp index 3db7e97d52b..0082073eef7 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.cpp +++ b/Userland/Libraries/LibWeb/DOM/Document.cpp @@ -910,11 +910,18 @@ JS::GCPtr Document::first_base_element_with_href_in // https://html.spec.whatwg.org/multipage/urls-and-fetching.html#fallback-base-url AK::URL Document::fallback_base_url() const { - // FIXME: 1. If document is an iframe srcdoc document, then return the document base URL of document's browsing context's container document. + // 1. If document is an iframe srcdoc document, then: + if (HTML::url_matches_about_srcdoc(m_url)) { + // 1. Assert: document's about base URL is non-null. + VERIFY(m_about_base_url.has_value()); - // 2. If document's URL is about:blank, and document's browsing context's creator base URL is non-null, then return that creator base URL. - if (m_url == "about:blank"sv && browsing_context() && browsing_context()->creator_url().has_value()) - return browsing_context()->creator_url().value(); + // 2. Return document's about base URL. + return m_about_base_url.value(); + } + + // 2. If document's URL matches about:blank and document's about base URL is non-null, then return document's about base URL. + if (HTML::url_matches_about_blank(m_url) && m_about_base_url.has_value()) + return m_about_base_url.value(); // 3. Return document's URL. return m_url; diff --git a/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp b/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp index 76741dc9cbb..1d2650c99bf 100644 --- a/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp +++ b/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp @@ -51,6 +51,18 @@ bool url_matches_about_blank(AK::URL const& url) && url.host().has(); } +// https://html.spec.whatwg.org/multipage/urls-and-fetching.html#matches-about:srcdoc +bool url_matches_about_srcdoc(AK::URL const& url) +{ + // A URL matches about:srcdoc if its scheme is "about", its path contains a single string "srcdoc", its query is null, its username and password are the empty string, and its host is null. + return url.scheme() == "about"sv + && url.serialize_path() == "srcdoc"sv + && !url.query().has_value() + && url.raw_username().is_empty() + && url.raw_password().is_empty() + && url.host().has(); +} + // https://html.spec.whatwg.org/multipage/document-sequences.html#determining-the-origin HTML::Origin determine_the_origin(AK::URL const& url, SandboxingFlagSet sandbox_flags, Optional source_origin) { diff --git a/Userland/Libraries/LibWeb/HTML/BrowsingContext.h b/Userland/Libraries/LibWeb/HTML/BrowsingContext.h index 9f1407c4ca2..5e96971028e 100644 --- a/Userland/Libraries/LibWeb/HTML/BrowsingContext.h +++ b/Userland/Libraries/LibWeb/HTML/BrowsingContext.h @@ -236,7 +236,8 @@ HTML::Origin determine_the_origin(AK::URL const& url, SandboxingFlagSet sandbox_ SandboxingFlagSet determine_the_creation_sandboxing_flags(BrowsingContext const&, JS::GCPtr embedder); -// FIXME: Find a better home for this +// FIXME: Find a better home for these bool url_matches_about_blank(AK::URL const& url); +bool url_matches_about_srcdoc(AK::URL const& url); }