LibWeb: Bring Document::fallback_base_url closer to the spec

This commit is contained in:
Andrew Kaster 2024-02-04 03:41:07 -07:00 committed by Andrew Kaster
parent 5d9d0aa267
commit 6e75440d5a
Notes: sideshowbarker 2024-07-18 04:38:32 +09:00
3 changed files with 25 additions and 5 deletions

View File

@ -910,11 +910,18 @@ JS::GCPtr<HTML::HTMLBaseElement const> 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;

View File

@ -51,6 +51,18 @@ bool url_matches_about_blank(AK::URL const& url)
&& url.host().has<Empty>();
}
// 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<Empty>();
}
// 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<HTML::Origin> source_origin)
{

View File

@ -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<DOM::Element> 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);
}