summaryrefslogtreecommitdiff
path: root/AK
diff options
context:
space:
mode:
authorIdan Horowitz <idan.horowitz@gmail.com>2021-09-13 22:18:14 +0300
committerAndreas Kling <kling@serenityos.org>2021-09-14 00:14:45 +0200
commit6fa4fc8353d79bebfdbfba0fc4eae22cb5935705 (patch)
tree83d411e90babd99c759f449bc820b53b3406a165 /AK
parentaf5b62d8cd14a06449bb6691744e9a703a4b17b2 (diff)
downloadserenity-6fa4fc8353d79bebfdbfba0fc4eae22cb5935705.zip
AK: Add URL::serialize_origin based on HTML's origin definition
Diffstat (limited to 'AK')
-rw-r--r--AK/URL.cpp28
-rw-r--r--AK/URL.h3
2 files changed, 31 insertions, 0 deletions
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;