mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-06-24 19:21:52 +00:00
LibWeb: Return wall time from PerformanceTiming interface
This matches the behavior of other browsers.
This commit is contained in:
parent
7488136a51
commit
05351dfe45
Notes:
github-actions[bot]
2025-01-27 13:54:29 +00:00
Author: https://github.com/tcl3
Commit: 05351dfe45
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/3341
3 changed files with 52 additions and 18 deletions
|
@ -54,17 +54,17 @@ struct DocumentLoadTimingInfo {
|
||||||
// https://html.spec.whatwg.org/multipage/dom.html#navigation-start-time
|
// https://html.spec.whatwg.org/multipage/dom.html#navigation-start-time
|
||||||
double navigation_start_time { 0 };
|
double navigation_start_time { 0 };
|
||||||
// https://html.spec.whatwg.org/multipage/dom.html#dom-interactive-time
|
// https://html.spec.whatwg.org/multipage/dom.html#dom-interactive-time
|
||||||
double dom_interactive_time { 0 };
|
HighResolutionTime::DOMHighResTimeStamp dom_interactive_time { 0 };
|
||||||
// https://html.spec.whatwg.org/multipage/dom.html#dom-content-loaded-event-start-time
|
// https://html.spec.whatwg.org/multipage/dom.html#dom-content-loaded-event-start-time
|
||||||
double dom_content_loaded_event_start_time { 0 };
|
HighResolutionTime::DOMHighResTimeStamp dom_content_loaded_event_start_time { 0 };
|
||||||
// https://html.spec.whatwg.org/multipage/dom.html#dom-content-loaded-event-end-time
|
// https://html.spec.whatwg.org/multipage/dom.html#dom-content-loaded-event-end-time
|
||||||
double dom_content_loaded_event_end_time { 0 };
|
HighResolutionTime::DOMHighResTimeStamp dom_content_loaded_event_end_time { 0 };
|
||||||
// https://html.spec.whatwg.org/multipage/dom.html#dom-complete-time
|
// https://html.spec.whatwg.org/multipage/dom.html#dom-complete-time
|
||||||
double dom_complete_time { 0 };
|
HighResolutionTime::DOMHighResTimeStamp dom_complete_time { 0 };
|
||||||
// https://html.spec.whatwg.org/multipage/dom.html#load-event-start-time
|
// https://html.spec.whatwg.org/multipage/dom.html#load-event-start-time
|
||||||
double load_event_start_time { 0 };
|
HighResolutionTime::DOMHighResTimeStamp load_event_start_time { 0 };
|
||||||
// https://html.spec.whatwg.org/multipage/dom.html#load-event-end-time
|
// https://html.spec.whatwg.org/multipage/dom.html#load-event-end-time
|
||||||
double load_event_end_time { 0 };
|
HighResolutionTime::DOMHighResTimeStamp load_event_end_time { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/dom.html#document-unload-timing-info
|
// https://html.spec.whatwg.org/multipage/dom.html#document-unload-timing-info
|
||||||
|
|
|
@ -1,14 +1,15 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2021, Andreas Kling <andreas@ladybird.org>
|
* Copyright (c) 2021, Andreas Kling <andreas@ladybird.org>
|
||||||
|
* Copyright (c) 2025, Tim Ledbetter <tim.ledbetter@ladybird.org>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <LibWeb/Bindings/PerformanceTimingPrototype.h>
|
#include <LibWeb/Bindings/PerformanceTimingPrototype.h>
|
||||||
|
#include <LibWeb/HighResolutionTime/TimeOrigin.h>
|
||||||
#include <LibWeb/NavigationTiming/PerformanceTiming.h>
|
#include <LibWeb/NavigationTiming/PerformanceTiming.h>
|
||||||
|
|
||||||
namespace Web::NavigationTiming {
|
namespace Web::NavigationTiming {
|
||||||
|
|
||||||
GC_DEFINE_ALLOCATOR(PerformanceTiming);
|
GC_DEFINE_ALLOCATOR(PerformanceTiming);
|
||||||
|
|
||||||
PerformanceTiming::PerformanceTiming(JS::Realm& realm)
|
PerformanceTiming::PerformanceTiming(JS::Realm& realm)
|
||||||
|
@ -24,13 +25,24 @@ void PerformanceTiming::initialize(JS::Realm& realm)
|
||||||
WEB_SET_PROTOTYPE_FOR_INTERFACE(PerformanceTiming);
|
WEB_SET_PROTOTYPE_FOR_INTERFACE(PerformanceTiming);
|
||||||
}
|
}
|
||||||
|
|
||||||
DOM::DocumentLoadTimingInfo const& PerformanceTiming::document_load_timing_info() const
|
DOM::DocumentLoadTimingInfo const& PerformanceTiming::document_load_timing_info(JS::Object const& global_object) const
|
||||||
{
|
{
|
||||||
auto& global_object = HTML::relevant_global_object(*this);
|
|
||||||
VERIFY(is<HTML::Window>(global_object));
|
VERIFY(is<HTML::Window>(global_object));
|
||||||
auto& window = static_cast<HTML::Window&>(global_object);
|
auto& window = static_cast<HTML::Window const&>(global_object);
|
||||||
auto document = window.document();
|
auto document = window.document();
|
||||||
return document->load_timing_info();
|
return document->load_timing_info();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,10 @@ public:
|
||||||
|
|
||||||
~PerformanceTiming();
|
~PerformanceTiming();
|
||||||
|
|
||||||
u64 navigation_start() { return document_load_timing_info().navigation_start_time; }
|
u64 navigation_start()
|
||||||
|
{
|
||||||
|
return monotonic_timestamp_to_wall_time_milliseconds([](auto& load_info) { return load_info.navigation_start_time; });
|
||||||
|
}
|
||||||
u64 unload_event_start() { return 0; }
|
u64 unload_event_start() { return 0; }
|
||||||
u64 unload_event_end() { return 0; }
|
u64 unload_event_end() { return 0; }
|
||||||
u64 redirect_start() { return 0; }
|
u64 redirect_start() { return 0; }
|
||||||
|
@ -35,17 +38,36 @@ public:
|
||||||
u64 response_start() { return 0; }
|
u64 response_start() { return 0; }
|
||||||
u64 response_end() { return 0; }
|
u64 response_end() { return 0; }
|
||||||
u64 dom_loading() { return 0; }
|
u64 dom_loading() { return 0; }
|
||||||
u64 dom_interactive() { return document_load_timing_info().dom_interactive_time; }
|
u64 dom_interactive()
|
||||||
u64 dom_content_loaded_event_start() { return document_load_timing_info().dom_content_loaded_event_start_time; }
|
{
|
||||||
u64 dom_content_loaded_event_end() { return document_load_timing_info().dom_content_loaded_event_end_time; }
|
return monotonic_timestamp_to_wall_time_milliseconds([](auto& load_info) { return load_info.dom_interactive_time; });
|
||||||
u64 dom_complete() { return document_load_timing_info().dom_complete_time; }
|
}
|
||||||
u64 load_event_start() { return document_load_timing_info().load_event_start_time; }
|
u64 dom_content_loaded_event_start()
|
||||||
u64 load_event_end() { return document_load_timing_info().load_event_end_time; }
|
{
|
||||||
|
return monotonic_timestamp_to_wall_time_milliseconds([](auto& load_info) { return load_info.dom_content_loaded_event_start_time; });
|
||||||
|
}
|
||||||
|
u64 dom_content_loaded_event_end()
|
||||||
|
{
|
||||||
|
return monotonic_timestamp_to_wall_time_milliseconds([](auto& load_info) { return load_info.dom_content_loaded_event_end_time; });
|
||||||
|
}
|
||||||
|
u64 dom_complete()
|
||||||
|
{
|
||||||
|
return monotonic_timestamp_to_wall_time_milliseconds([](auto& load_info) { return load_info.dom_complete_time; });
|
||||||
|
}
|
||||||
|
u64 load_event_start()
|
||||||
|
{
|
||||||
|
return monotonic_timestamp_to_wall_time_milliseconds([](auto& load_info) { return load_info.load_event_start_time; });
|
||||||
|
}
|
||||||
|
u64 load_event_end()
|
||||||
|
{
|
||||||
|
return monotonic_timestamp_to_wall_time_milliseconds([](auto& load_info) { return load_info.load_event_end_time; });
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit PerformanceTiming(JS::Realm&);
|
explicit PerformanceTiming(JS::Realm&);
|
||||||
|
|
||||||
DOM::DocumentLoadTimingInfo const& document_load_timing_info() const;
|
DOM::DocumentLoadTimingInfo const& document_load_timing_info(JS::Object const& global_object) const;
|
||||||
|
u64 monotonic_timestamp_to_wall_time_milliseconds(Function<HighResolutionTime::DOMHighResTimeStamp(DOM::DocumentLoadTimingInfo const&)> selector) const;
|
||||||
|
|
||||||
virtual void initialize(JS::Realm&) override;
|
virtual void initialize(JS::Realm&) override;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue