1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-08 05:27:14 +09:00
ladybird/Libraries/LibURL/Origin.h
Shannon Booth 40d21e343f LibURL: Add FIXME's for testing equality of opaque origins
The spec seems to indicate in its wording that while opaque
origins only serialize to 'null', they can still be tested
for equality with one another. Probably we will need to
generate some unique ID which is unique across processes.
2025-05-24 09:51:44 -04:00

122 lines
3.8 KiB
C++

/*
* Copyright (c) 2020, Andreas Kling <andreas@ladybird.org>
* Copyright (c) 2022, Linus Groh <linusg@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/ByteString.h>
#include <LibURL/Forward.h>
#include <LibURL/Host.h>
namespace URL {
class Origin {
public:
// FIXME: This should be generating a unique origin identifer that can be used for equality checks.
// Probably we should remove the default constructor, and instead expose this as a factory method.
Origin() = default;
Origin(Optional<String> const& scheme, Host const& host, Optional<u16> port)
: m_state(State {
.scheme = scheme,
.host = host,
.port = move(port),
})
{
}
// https://html.spec.whatwg.org/multipage/origin.html#concept-origin-opaque
bool is_opaque() const { return !m_state.has_value(); }
Optional<String> const& scheme() const { return m_state->scheme; }
Host const& host() const { return m_state->host; }
Optional<u16> port() const { return m_state->port; }
// https://html.spec.whatwg.org/multipage/origin.html#same-origin
bool is_same_origin(Origin const& other) const
{
// 1. If A and B are the same opaque origin, then return true.
// FIXME: What about opaque origins that are not equal to one another?
if (is_opaque() && other.is_opaque())
return true;
// 2. If A and B are both tuple origins and their schemes, hosts, and port are identical, then return true.
if (!is_opaque() && !other.is_opaque()
&& scheme() == other.scheme()
&& host() == other.host()
&& port() == other.port()) {
return true;
}
// 3. Return false.
return false;
}
// https://html.spec.whatwg.org/multipage/origin.html#same-origin-domain
bool is_same_origin_domain(Origin const& other) const
{
// 1. If A and B are the same opaque origin, then return true.
// FIXME: What about opaque origins that are not equal to one another?
if (is_opaque() && other.is_opaque())
return true;
// 2. If A and B are both tuple origins, run these substeps:
if (!is_opaque() && !other.is_opaque()) {
// 1. If A and B's schemes are identical, and their domains are identical and non-null, then return true.
// FIXME: Check domains once supported.
if (scheme() == other.scheme())
return true;
// 2. Otherwise, if A and B are same origin and their domains are identical and null, then return true.
// FIXME: Check domains once supported.
if (is_same_origin(other))
return true;
}
// 3. Return false.
return false;
}
// https://html.spec.whatwg.org/multipage/browsers.html#same-site
bool is_same_site(Origin const&) const;
// https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin
String serialize() const;
// https://html.spec.whatwg.org/multipage/origin.html#concept-origin-effective-domain
Optional<Host> effective_domain() const
{
// 1. If origin is an opaque origin, then return null.
if (is_opaque())
return {};
// FIXME: 2. If origin's domain is non-null, then return origin's domain.
// 3. Return origin's host.
return m_state->host;
}
bool operator==(Origin const& other) const { return is_same_origin(other); }
private:
struct State {
Optional<String> scheme;
Host host;
Optional<u16> port;
};
Optional<State> m_state;
};
}
namespace AK {
template<>
struct Traits<URL::Origin> : public DefaultTraits<URL::Origin> {
static unsigned hash(URL::Origin const& origin);
};
} // namespace AK