diff --git a/Libraries/LibWeb/HTML/WindowOrWorkerGlobalScope.cpp b/Libraries/LibWeb/HTML/WindowOrWorkerGlobalScope.cpp index e334051634f..ce192ee89fe 100644 --- a/Libraries/LibWeb/HTML/WindowOrWorkerGlobalScope.cpp +++ b/Libraries/LibWeb/HTML/WindowOrWorkerGlobalScope.cpp @@ -435,24 +435,44 @@ void WindowOrWorkerGlobalScopeMixin::queue_performance_entry(GC::Refappend_to_observer_buffer({}, new_entry); } - // 6. Let tuple be the relevant performance entry tuple of entryType and relevantGlobal. - auto& tuple = relevant_performance_entry_tuple(entry_type); - - // 7. Let isBufferFull be the return value of the determine if a performance entry buffer is full algorithm with tuple - // as input. - bool is_buffer_full = tuple.is_full(); - - // 8. Let shouldAdd be the result of should add entry with newEntry as input. - auto should_add = new_entry->should_add_entry(); - - // 9. If isBufferFull is false and shouldAdd is true, append newEntry to tuple's performance entry buffer. - if (!is_buffer_full && should_add == PerformanceTimeline::ShouldAddEntry::Yes) - tuple.performance_entry_buffer.append(new_entry); + // AD-HOC: Steps 6-9 are not here because other engines do not add to the performance entry buffer when queuing + // the performance observer task. The users of the Performance Timeline specification also do not expect + // this function to add to the entry buffer, instead queuing the observer task, then adding to the entry + // buffer separately. // 10. Queue the PerformanceObserver task with relevantGlobal as input. queue_the_performance_observer_task(); } +// https://www.w3.org/TR/performance-timeline/#dfn-queue-a-performanceentry +// AD-HOC: This is a separate function because the users of this specification queues PerformanceObserver tasks and add +// to the entry buffer separately. +void WindowOrWorkerGlobalScopeMixin::add_performance_entry(GC::Ref new_entry, CheckIfPerformanceBufferIsFull check_if_performance_buffer_is_full) +{ + // 6. Let tuple be the relevant performance entry tuple of entryType and relevantGlobal. + auto& tuple = relevant_performance_entry_tuple(new_entry->entry_type()); + + // AD-HOC: We have a custom flag to always append to the buffer by default, as other performance specs do this by default + // (either they don't have a limit, or they check the limit themselves). This flag allows compatibility for specs + // that rely do and don't rely on this. + bool is_buffer_full = false; + auto should_add = PerformanceTimeline::ShouldAddEntry::Yes; + + if (check_if_performance_buffer_is_full == CheckIfPerformanceBufferIsFull::Yes) { + // 7. Let isBufferFull be the return value of the determine if a performance entry buffer is full algorithm with tuple + // as input. + is_buffer_full = tuple.is_full(); + + // 8. Let shouldAdd be the result of should add entry with newEntry as input. + should_add = new_entry->should_add_entry(); + } + + // 9. If isBufferFull is false and shouldAdd is true, append newEntry to tuple's performance entry buffer. + if (!is_buffer_full && should_add == PerformanceTimeline::ShouldAddEntry::Yes) + tuple.performance_entry_buffer.append(new_entry); +} + + void WindowOrWorkerGlobalScopeMixin::clear_performance_entry_buffer(Badge, FlyString const& entry_type) { auto& tuple = relevant_performance_entry_tuple(entry_type); diff --git a/Libraries/LibWeb/HTML/WindowOrWorkerGlobalScope.h b/Libraries/LibWeb/HTML/WindowOrWorkerGlobalScope.h index a593755a55f..154574f992c 100644 --- a/Libraries/LibWeb/HTML/WindowOrWorkerGlobalScope.h +++ b/Libraries/LibWeb/HTML/WindowOrWorkerGlobalScope.h @@ -47,8 +47,14 @@ public: void clear_interval(i32); void clear_map_of_active_timers(); + enum class CheckIfPerformanceBufferIsFull { + No, + Yes, + }; + PerformanceTimeline::PerformanceEntryTuple& relevant_performance_entry_tuple(FlyString const& entry_type); void queue_performance_entry(GC::Ref new_entry); + void add_performance_entry(GC::Ref new_entry, CheckIfPerformanceBufferIsFull check_if_performance_buffer_is_full = CheckIfPerformanceBufferIsFull::No); void clear_performance_entry_buffer(Badge, FlyString const& entry_type); void remove_entries_from_performance_entry_buffer(Badge, FlyString const& entry_type, String entry_name); diff --git a/Libraries/LibWeb/HighResolutionTime/Performance.cpp b/Libraries/LibWeb/HighResolutionTime/Performance.cpp index 08aa5b947d9..d9be79f28e0 100644 --- a/Libraries/LibWeb/HighResolutionTime/Performance.cpp +++ b/Libraries/LibWeb/HighResolutionTime/Performance.cpp @@ -89,7 +89,7 @@ WebIDL::ExceptionOr> Performance::mark(Stri 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. + window_or_worker().add_performance_entry(entry); // 4. Return entry. return entry; @@ -309,7 +309,7 @@ WebIDL::ExceptionOr> Performance::measur window_or_worker().queue_performance_entry(entry); // 11. 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. + window_or_worker().add_performance_entry(entry); // 12. Return entry. return entry;