1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-08 05:27:14 +09:00
ladybird/Libraries/LibWeb/ResourceTiming/PerformanceResourceTiming.h
2025-03-06 09:00:53 -07:00

90 lines
4.8 KiB
C++

/*
* Copyright (c) 2025, Luke Wilde <luke@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/FlyString.h>
#include <LibWeb/Bindings/PerformanceResourceTimingPrototype.h>
#include <LibWeb/Fetch/Infrastructure/HTTP/Requests.h>
#include <LibWeb/Fetch/Infrastructure/HTTP/Responses.h>
#include <LibWeb/PerformanceTimeline/PerformanceEntry.h>
namespace Web::ResourceTiming {
// https://w3c.github.io/resource-timing/#dom-performanceresourcetiming
class PerformanceResourceTiming : public PerformanceTimeline::PerformanceEntry {
WEB_PLATFORM_OBJECT(PerformanceResourceTiming, PerformanceTimeline::PerformanceEntry);
GC_DECLARE_ALLOCATOR(PerformanceResourceTiming);
public:
virtual ~PerformanceResourceTiming() override;
static void mark_resource_timing(GC::Ref<Fetch::Infrastructure::FetchTimingInfo> timing_info, String const& requested_url, FlyString const& initiator_type, JS::Object& global, Optional<Fetch::Infrastructure::Response::CacheState> const& cache_mode, Fetch::Infrastructure::Response::BodyInfo body_info, Fetch::Infrastructure::Status response_status, FlyString delivery_type = ""_fly_string);
// NOTE: These three functions are answered by the registry for the given entry type.
// https://w3c.github.io/timing-entrytypes-registry/#registry
// https://w3c.github.io/timing-entrytypes-registry/#dfn-availablefromtimeline
static PerformanceTimeline::AvailableFromTimeline available_from_timeline() { return PerformanceTimeline::AvailableFromTimeline::Yes; }
// https://w3c.github.io/timing-entrytypes-registry/#dfn-maxbuffersize
static Optional<u64> max_buffer_size() { return 250; }
// https://w3c.github.io/timing-entrytypes-registry/#dfn-should-add-entry
virtual PerformanceTimeline::ShouldAddEntry should_add_entry(Optional<PerformanceTimeline::PerformanceObserverInit const&> = {}) const override { return PerformanceTimeline::ShouldAddEntry::Yes; }
virtual FlyString const& entry_type() const override;
// https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-initiatortype
FlyString const& initiator_type() const { return m_initiator_type; }
// https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-deliverytype
FlyString const& delivery_type() const { return m_delivery_type; }
FlyString next_hop_protocol() const;
virtual HighResolutionTime::DOMHighResTimeStamp worker_start() const;
virtual HighResolutionTime::DOMHighResTimeStamp redirect_start() const;
virtual HighResolutionTime::DOMHighResTimeStamp redirect_end() const;
virtual HighResolutionTime::DOMHighResTimeStamp fetch_start() const;
HighResolutionTime::DOMHighResTimeStamp domain_lookup_start() const;
HighResolutionTime::DOMHighResTimeStamp domain_lookup_end() const;
HighResolutionTime::DOMHighResTimeStamp connect_start() const;
HighResolutionTime::DOMHighResTimeStamp connect_end() const;
HighResolutionTime::DOMHighResTimeStamp secure_connection_start() const;
HighResolutionTime::DOMHighResTimeStamp request_start() const;
HighResolutionTime::DOMHighResTimeStamp final_response_headers_start() const;
HighResolutionTime::DOMHighResTimeStamp first_interim_response_start() const;
HighResolutionTime::DOMHighResTimeStamp response_start() const;
HighResolutionTime::DOMHighResTimeStamp response_end() const;
u64 encoded_body_size() const;
u64 decoded_body_size() const;
u64 transfer_size() const;
Fetch::Infrastructure::Status response_status() const;
Bindings::RenderBlockingStatusType render_blocking_status() const;
String const& content_type() const;
protected:
PerformanceResourceTiming(JS::Realm&, String const& name, HighResolutionTime::DOMHighResTimeStamp start_time, HighResolutionTime::DOMHighResTimeStamp duration, GC::Ref<Fetch::Infrastructure::FetchTimingInfo> timing_info);
void setup_the_resource_timing_entry(FlyString const& initiator_type, String const& requested_url, GC::Ref<Fetch::Infrastructure::FetchTimingInfo> timing_info, Optional<Fetch::Infrastructure::Response::CacheState> const& cache_mode, Fetch::Infrastructure::Response::BodyInfo body_info, Fetch::Infrastructure::Status response_status, FlyString delivery_type = ""_fly_string);
virtual void initialize(JS::Realm&) override;
virtual void visit_edges(JS::Cell::Visitor&) override;
private:
FlyString m_initiator_type;
String m_requested_url;
GC::Ref<Fetch::Infrastructure::FetchTimingInfo> m_timing_info;
Fetch::Infrastructure::Response::BodyInfo m_response_body_info;
Optional<Fetch::Infrastructure::Response::CacheState> m_cache_mode;
Fetch::Infrastructure::Status m_response_status;
FlyString m_delivery_type;
};
HighResolutionTime::DOMHighResTimeStamp convert_fetch_timestamp(HighResolutionTime::DOMHighResTimeStamp time_stamp, JS::Object const& global);
}