diff --git a/src/browser/Browser.zig b/src/browser/Browser.zig index 519c6a4a0..5c3d94879 100644 --- a/src/browser/Browser.zig +++ b/src/browser/Browser.zig @@ -55,6 +55,7 @@ arena_account: lp.Arena.Account = .{}, // Our isolate's heap size as of the last reportJsHeap(). last_reported_js_bytes: usize = 0, +last_js_heap_sample_ms: u64 = 0, // Permission state set via CDP Browser.grantPermissions / setPermission / // resetPermissions, keyed by permission name (e.g. "geolocation"). Read back @@ -236,6 +237,18 @@ pub fn reportJsHeap(self: *Browser) void { self.last_reported_js_bytes = bytes; } +// Called every Runner tick +pub fn sampleJsHeap(self: *Browser) void { + const now = lp.datetime.milliTimestamp(.boot); + if (now - self.last_js_heap_sample_ms < 1000) { + // a busy page ticks often, we don't need to track this more than once + // per second + return; + } + self.last_js_heap_sample_ms = now; + self.reportJsHeap(); +} + pub fn runMicrotasks(self: *Browser) void { self.env.runMicrotasks(); } diff --git a/src/browser/Frame.zig b/src/browser/Frame.zig index b44b99059..57b4f626f 100644 --- a/src/browser/Frame.zig +++ b/src/browser/Frame.zig @@ -498,11 +498,6 @@ pub fn init(self: *Frame, frame_id: u32, page: *Page, opts: InitOpts) !void { }.runIdleTasks, 200, .{ .name = "frame.runIdleTasks", .blocks_done = false }); } } - - if (parent == null) { - // no point reporting this for each child page - session.browser.reportJsHeap(); - } } pub fn deinit(self: *Frame) void { @@ -576,9 +571,6 @@ pub fn deinit(self: *Frame) void { const browser = page.session.browser; browser.http_client.abortOwner(&self._http_owner); - if (self.parent == null) { - browser.reportJsHeap(); - } // fired the last moment the js context is still alive page.session.notification.dispatch(.frame_destroyed, self); @@ -1313,10 +1305,6 @@ pub fn documentIsComplete(self: *Frame) void { self._maybe_meta_refresh = false; self.metaRefreshOnLoad(); } - - if (self.parent == null) { - self._session.browser.reportJsHeap(); - } } fn _documentIsComplete(self: *Frame) !void { diff --git a/src/browser/Runner.zig b/src/browser/Runner.zig index 72428f453..2f0820fd0 100644 --- a/src/browser/Runner.zig +++ b/src/browser/Runner.zig @@ -204,7 +204,10 @@ fn _tick(self: *Runner, comptime is_cdp: bool, timeout_ms: u32, conditions: []Wa const session = self.session; const browser = self.browser; const http_client = self.http_client; - defer browser.flushArenaMemory(); + defer { + browser.flushArenaMemory(); + browser.sampleJsHeap(); + } // Arms the watchdog (and proves liveness): a stall anywhere in this tick // ages this stamp until the watchdog fires.