diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 54efccac01..7a298890c7 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -124,6 +124,7 @@ set(SOURCES Fetch/Enums.cpp Fetch/Headers.cpp Fetch/HeadersIterator.cpp + Fetch/Infrastructure/ConnectionTimingInfo.cpp Fetch/Infrastructure/HTTP.cpp Fetch/Infrastructure/HTTP/Bodies.cpp Fetch/Infrastructure/HTTP/Headers.cpp diff --git a/Userland/Libraries/LibWeb/Fetch/Infrastructure/ConnectionTimingInfo.cpp b/Userland/Libraries/LibWeb/Fetch/Infrastructure/ConnectionTimingInfo.cpp new file mode 100644 index 0000000000..3658690981 --- /dev/null +++ b/Userland/Libraries/LibWeb/Fetch/Infrastructure/ConnectionTimingInfo.cpp @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2022, Linus Groh + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::Fetch::Infrastructure { + +ConnectionTimingInfo::ConnectionTimingInfo() = default; + +JS::NonnullGCPtr ConnectionTimingInfo::create(JS::VM& vm) +{ + return { *vm.heap().allocate_without_realm() }; +} + +} diff --git a/Userland/Libraries/LibWeb/Fetch/Infrastructure/ConnectionTimingInfo.h b/Userland/Libraries/LibWeb/Fetch/Infrastructure/ConnectionTimingInfo.h new file mode 100644 index 0000000000..9a8686e8f3 --- /dev/null +++ b/Userland/Libraries/LibWeb/Fetch/Infrastructure/ConnectionTimingInfo.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2022, Linus Groh + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Web::Fetch::Infrastructure { + +// https://fetch.spec.whatwg.org/#connection-timing-info +class ConnectionTimingInfo : public JS::Cell { + JS_CELL(ConnectionTimingInfo, JS::Cell); + +public: + [[nodiscard]] static JS::NonnullGCPtr create(JS::VM&); + + [[nodiscard]] HighResolutionTime::DOMHighResTimeStamp domain_lookup_start_time() const { return m_domain_lookup_start_time; } + void set_domain_lookup_start_time(HighResolutionTime::DOMHighResTimeStamp domain_lookup_start_time) { m_domain_lookup_start_time = domain_lookup_start_time; } + + [[nodiscard]] HighResolutionTime::DOMHighResTimeStamp domain_lookup_end_time() const { return m_domain_lookup_end_time; } + void set_domain_lookup_end_time(HighResolutionTime::DOMHighResTimeStamp domain_lookup_end_time) { m_domain_lookup_end_time = domain_lookup_end_time; } + + [[nodiscard]] HighResolutionTime::DOMHighResTimeStamp connection_start_time() const { return m_connection_start_time; } + void set_connection_start_time(HighResolutionTime::DOMHighResTimeStamp connection_start_time) { m_connection_start_time = connection_start_time; } + + [[nodiscard]] HighResolutionTime::DOMHighResTimeStamp connection_end_time() const { return m_connection_end_time; } + void set_connection_end_time(HighResolutionTime::DOMHighResTimeStamp connection_end_time) { m_connection_end_time = connection_end_time; } + + [[nodiscard]] HighResolutionTime::DOMHighResTimeStamp secure_connection_start_time() const { return m_secure_connection_start_time; } + void set_secure_connection_start_time(HighResolutionTime::DOMHighResTimeStamp secure_connection_start_time) { m_secure_connection_start_time = secure_connection_start_time; } + + [[nodiscard]] ReadonlyBytes lpn_negotiated_protocol() const { return m_lpn_negotiated_protocol; } + void set_lpn_negotiated_protocol(ByteBuffer lpn_negotiated_protocol) { m_lpn_negotiated_protocol = move(lpn_negotiated_protocol); } + +private: + ConnectionTimingInfo(); + + // https://fetch.spec.whatwg.org/#connection-timing-info-domain-lookup-start-time + // domain lookup start time (default 0) + // A DOMHighResTimeStamp. + HighResolutionTime::DOMHighResTimeStamp m_domain_lookup_start_time { 0 }; + + // https://fetch.spec.whatwg.org/#connection-timing-info-domain-lookup-end-time + // domain lookup end time (default 0) + // A DOMHighResTimeStamp. + HighResolutionTime::DOMHighResTimeStamp m_domain_lookup_end_time { 0 }; + + // https://fetch.spec.whatwg.org/#connection-timing-info-connection-start-time + // connection start time (default 0) + // A DOMHighResTimeStamp. + HighResolutionTime::DOMHighResTimeStamp m_connection_start_time { 0 }; + + // https://fetch.spec.whatwg.org/#connection-timing-info-connection-end-time + // connection end time (default 0) + // A DOMHighResTimeStamp. + HighResolutionTime::DOMHighResTimeStamp m_connection_end_time { 0 }; + + // https://fetch.spec.whatwg.org/#connection-timing-info-secure-connection-start-time + // secure connection start time (default 0) + // A DOMHighResTimeStamp. + HighResolutionTime::DOMHighResTimeStamp m_secure_connection_start_time { 0 }; + + // https://fetch.spec.whatwg.org/#connection-timing-info-alpn-negotiated-protocol + // ALPN negotiated protocol (default the empty byte sequence) + // A byte sequence. + ByteBuffer m_lpn_negotiated_protocol; +}; + +} diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 17cc491a09..61ca3c1291 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -192,6 +192,7 @@ class Response; namespace Web::Fetch::Infrastructure { class Body; struct BodyWithType; +class ConnectionTimingInfo; struct Header; class HeaderList; class Request;