diff --git a/src/browser/Page.zig b/src/browser/Page.zig index 5940d2c5..40b73618 100644 --- a/src/browser/Page.zig +++ b/src/browser/Page.zig @@ -1243,6 +1243,11 @@ pub fn notifyPerformanceObservers(self: *Page, entry: *Performance.Entry) !void } } + try self.schedulePerformanceObserverDelivery(); +} + +/// Schedules async delivery of performance observer records. +pub fn schedulePerformanceObserverDelivery(self: *Page) !void { // Already scheduled. if (self._performance_delivery_scheduled) { return; diff --git a/src/browser/tests/performance_observer/performance_observer.html b/src/browser/tests/performance_observer/performance_observer.html index c1c546b7..3289ab41 100644 --- a/src/browser/tests/performance_observer/performance_observer.html +++ b/src/browser/tests/performance_observer/performance_observer.html @@ -68,3 +68,31 @@ + + diff --git a/src/browser/webapi/PerformanceObserver.zig b/src/browser/webapi/PerformanceObserver.zig index ad130c97..cfabaebb 100644 --- a/src/browser/webapi/PerformanceObserver.zig +++ b/src/browser/webapi/PerformanceObserver.zig @@ -113,6 +113,20 @@ pub fn observe( // Update interests. self._interests = interests; + + // Deliver existing entries if buffered option is set. + // Per spec, buffered is only valid with the type option, not entryTypes. + // Delivery is async via a queued task, not synchronous. + if (options.buffered and options.type != null and !self.hasRecords()) { + for (page.window._performance._entries.items) |entry| { + if (self.interested(entry)) { + try self._entries.append(page.arena, entry); + } + } + if (self.hasRecords()) { + try page.schedulePerformanceObserverDelivery(); + } + } } pub fn disconnect(self: *PerformanceObserver, page: *Page) void {