2021-01-18 11:06:13 -03:00
|
|
|
/*
|
2024-10-04 08:19:50 -03:00
|
|
|
* Copyright (c) 2021, Andreas Kling <andreas@ladybird.org>
|
2025-01-27 06:00:02 -03:00
|
|
|
* Copyright (c) 2025, Tim Ledbetter <tim.ledbetter@ladybird.org>
|
2021-01-18 11:06:13 -03:00
|
|
|
*
|
2021-04-22 05:24:48 -03:00
|
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
2021-01-18 11:06:13 -03:00
|
|
|
*/
|
|
|
|
|
|
2026-04-18 05:54:06 -03:00
|
|
|
#include <LibWeb/Bindings/PerformanceTiming.h>
|
2025-01-27 06:00:02 -03:00
|
|
|
#include <LibWeb/HighResolutionTime/TimeOrigin.h>
|
2021-01-18 11:06:13 -03:00
|
|
|
#include <LibWeb/NavigationTiming/PerformanceTiming.h>
|
|
|
|
|
|
|
|
|
|
namespace Web::NavigationTiming {
|
2025-05-13 08:06:33 -03:00
|
|
|
|
2024-11-14 12:01:23 -03:00
|
|
|
GC_DEFINE_ALLOCATOR(PerformanceTiming);
|
2023-11-19 15:47:52 -03:00
|
|
|
|
2024-04-05 22:04:01 -03:00
|
|
|
PerformanceTiming::PerformanceTiming(JS::Realm& realm)
|
|
|
|
|
: PlatformObject(realm)
|
2021-01-18 11:06:13 -03:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-14 16:21:51 -03:00
|
|
|
PerformanceTiming::~PerformanceTiming() = default;
|
2021-01-18 11:06:13 -03:00
|
|
|
|
2023-08-07 03:41:28 -03:00
|
|
|
void PerformanceTiming::initialize(JS::Realm& realm)
|
2023-01-10 08:28:20 -03:00
|
|
|
{
|
2024-03-16 09:13:08 -03:00
|
|
|
WEB_SET_PROTOTYPE_FOR_INTERFACE(PerformanceTiming);
|
2025-04-20 11:22:57 -03:00
|
|
|
Base::initialize(realm);
|
2023-01-10 08:28:20 -03:00
|
|
|
}
|
|
|
|
|
|
2025-01-27 06:00:02 -03:00
|
|
|
DOM::DocumentLoadTimingInfo const& PerformanceTiming::document_load_timing_info(JS::Object const& global_object) const
|
2025-01-06 07:26:55 -03:00
|
|
|
{
|
|
|
|
|
VERIFY(is<HTML::Window>(global_object));
|
2025-01-27 06:00:02 -03:00
|
|
|
auto& window = static_cast<HTML::Window const&>(global_object);
|
2025-01-06 07:26:55 -03:00
|
|
|
auto document = window.document();
|
|
|
|
|
return document->load_timing_info();
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-27 06:00:02 -03:00
|
|
|
u64 PerformanceTiming::monotonic_timestamp_to_wall_time_milliseconds(Function<HighResolutionTime::DOMHighResTimeStamp(DOM::DocumentLoadTimingInfo const&)> selector) const
|
|
|
|
|
{
|
|
|
|
|
auto& global_object = HTML::relevant_global_object(*this);
|
|
|
|
|
auto timestamp = selector(document_load_timing_info(global_object));
|
|
|
|
|
if (timestamp == 0)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
auto wall_time = timestamp - HighResolutionTime::estimated_monotonic_time_of_the_unix_epoch();
|
|
|
|
|
auto coarsened_time = HighResolutionTime::coarsen_time(wall_time);
|
|
|
|
|
return static_cast<u64>(coarsened_time);
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-18 06:51:25 -03:00
|
|
|
u64 PerformanceTiming::relative_timestamp_to_wall_time_milliseconds(Function<HighResolutionTime::DOMHighResTimeStamp(DOM::DocumentLoadTimingInfo const&)> selector) const
|
|
|
|
|
{
|
|
|
|
|
auto& global_object = HTML::relevant_global_object(*this);
|
|
|
|
|
auto const& load_info = document_load_timing_info(global_object);
|
|
|
|
|
auto relative_timestamp = selector(load_info);
|
|
|
|
|
if (relative_timestamp == 0)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
auto absolute_timestamp = relative_timestamp + load_info.navigation_start_time;
|
|
|
|
|
auto wall_time = absolute_timestamp - HighResolutionTime::estimated_monotonic_time_of_the_unix_epoch();
|
|
|
|
|
auto coarsened_time = HighResolutionTime::coarsen_time(wall_time);
|
|
|
|
|
return static_cast<u64>(coarsened_time);
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-18 11:06:13 -03:00
|
|
|
}
|