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 {