From 6fa4fc8353d79bebfdbfba0fc4eae22cb5935705 Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Mon, 13 Sep 2021 22:18:14 +0300 Subject: [PATCH] AK: Add URL::serialize_origin based on HTML's origin definition --- AK/URL.cpp | 28 ++++++++++++++++++++++++++++ AK/URL.h | 3 +++ 2 files changed, 31 insertions(+) diff --git a/AK/URL.cpp b/AK/URL.cpp index b3f46ad3a2..66fbecb520 100644 --- a/AK/URL.cpp +++ b/AK/URL.cpp @@ -306,6 +306,34 @@ String URL::serialize_for_display() const return builder.to_string(); } +// https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin +// https://url.spec.whatwg.org/#concept-url-origin +String URL::serialize_origin() const +{ + VERIFY(m_valid); + + if (m_scheme == "blob"sv) { + // TODO: 1. If URL’s blob URL entry is non-null, then return URL’s blob URL entry’s environment’s origin. + // 2. Let url be the result of parsing URL’s path[0]. + VERIFY(!m_paths.is_empty()); + URL url = m_paths[0]; + // 3. Return a new opaque origin, if url is failure, and url’s origin otherwise. + if (!url.is_valid()) + return "null"; + return url.serialize_origin(); + } else if (!m_scheme.is_one_of("ftp"sv, "http"sv, "https"sv, "ws"sv, "wss"sv)) { // file: "Unfortunate as it is, this is left as an exercise to the reader. When in doubt, return a new opaque origin." + return "null"; + } + + StringBuilder builder; + builder.append(m_scheme); + builder.append("://"sv); + builder.append(m_host); + if (m_port != 0) + builder.append(":{}", m_port); + return builder.build(); +} + bool URL::equals(URL const& other, ExcludeFragment exclude_fragments) const { if (this == &other) diff --git a/AK/URL.h b/AK/URL.h index f4c1d9e351..895d292c03 100644 --- a/AK/URL.h +++ b/AK/URL.h @@ -81,6 +81,9 @@ public: String serialize_for_display() const; String to_string() const { return serialize(); } + // HTML origin + String serialize_origin() const; + bool equals(URL const& other, ExcludeFragment = ExcludeFragment::No) const; URL complete_url(String const&) const;