1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 04:17:35 +00:00

LibWeb: Implement performance.mark and performance.clearMarks

This commit is contained in:
Luke Wilde 2023-03-23 17:07:52 +00:00 committed by Linus Groh
parent 89ebef9730
commit cbe0901706
13 changed files with 341 additions and 0 deletions

View file

@ -11,6 +11,7 @@
#include <LibWeb/HTML/Window.h>
#include <LibWeb/HighResolutionTime/Performance.h>
#include <LibWeb/NavigationTiming/PerformanceTiming.h>
#include <LibWeb/PerformanceTimeline/EntryTypes.h>
namespace Web::HighResolutionTime {
@ -50,6 +51,44 @@ double Performance::time_origin() const
return static_cast<double>(m_timer.origin_time().to_milliseconds());
}
// https://w3c.github.io/user-timing/#mark-method
WebIDL::ExceptionOr<JS::NonnullGCPtr<UserTiming::PerformanceMark>> Performance::mark(String const& mark_name, UserTiming::PerformanceMarkOptions const& mark_options)
{
auto& realm = this->realm();
// 1. Run the PerformanceMark constructor and let entry be the newly created object.
auto entry = TRY(UserTiming::PerformanceMark::construct_impl(realm, mark_name, mark_options));
// 2. Queue entry.
auto* window_or_worker = dynamic_cast<HTML::WindowOrWorkerGlobalScopeMixin*>(&realm.global_object());
VERIFY(window_or_worker);
TRY(window_or_worker->queue_performance_entry(entry));
// 3. Add entry to the performance entry buffer.
// FIXME: This seems to be a holdover from moving to the `queue` structure for PerformanceObserver, as this would cause a double append.
// 4. Return entry.
return entry;
}
void Performance::clear_marks(Optional<String> mark_name)
{
auto& realm = this->realm();
auto* window_or_worker = dynamic_cast<HTML::WindowOrWorkerGlobalScopeMixin*>(&realm.global_object());
VERIFY(window_or_worker);
// 1. If markName is omitted, remove all PerformanceMark objects from the performance entry buffer.
if (!mark_name.has_value()) {
window_or_worker->clear_performance_entry_buffer({}, PerformanceTimeline::EntryTypes::mark);
return;
}
// 2. Otherwise, remove all PerformanceMark objects listed in the performance entry buffer whose name is markName.
window_or_worker->remove_entries_from_performance_entry_buffer({}, PerformanceTimeline::EntryTypes::mark, mark_name.value());
// 3. Return undefined.
}
// https://www.w3.org/TR/performance-timeline/#getentries-method
WebIDL::ExceptionOr<Vector<JS::Handle<PerformanceTimeline::PerformanceEntry>>> Performance::get_entries() const
{