summaryrefslogtreecommitdiff
path: root/internal/flamegraph/livehtml.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-02-27 18:26:00 +0200
committerPaul Buetow <paul@buetow.org>2026-02-27 18:26:00 +0200
commitdab0a1a62e3a51cfe1c45001e10311cf369519c8 (patch)
tree863c90ef3480d86ca7b61c1eafb3fbaa6b19573b /internal/flamegraph/livehtml.go
parent62fc446d15cbf038a12feb4d36ae97a663904d63 (diff)
flamegraph: preserve zoom/search state across updates
Diffstat (limited to 'internal/flamegraph/livehtml.go')
-rw-r--r--internal/flamegraph/livehtml.go40
1 files changed, 40 insertions, 0 deletions
diff --git a/internal/flamegraph/livehtml.go b/internal/flamegraph/livehtml.go
index 7facd7c..b2ea36a 100644
--- a/internal/flamegraph/livehtml.go
+++ b/internal/flamegraph/livehtml.go
@@ -325,6 +325,45 @@ const liveHTML = `<!doctype html>
fgApplyZoom();
}
+ function fgFindFrameByPath(path) {
+ for (var i = 0; i < fg.frames.length; i++) {
+ if ((fg.frames[i].dataset.path || '') === path) {
+ return fg.frames[i];
+ }
+ }
+ return null;
+ }
+
+ function fgRefreshZoomRange() {
+ if (!fg.zoomRange || !fg.zoomRange.path) {
+ return;
+ }
+ var candidatePath = fg.zoomRange.path;
+ var match = null;
+ while (candidatePath) {
+ match = fgFindFrameByPath(candidatePath);
+ if (match) {
+ break;
+ }
+ var cut = candidatePath.lastIndexOf('\u001f');
+ if (cut < 0) {
+ break;
+ }
+ candidatePath = candidatePath.slice(0, cut);
+ }
+ if (!match) {
+ return;
+ }
+ var width = fgOriginalW(match);
+ if (width <= 0) {
+ return;
+ }
+ fg.zoomRange.path = match.dataset.path || candidatePath;
+ fg.zoomRange.x = fgOriginalX(match);
+ fg.zoomRange.w = width;
+ fg.zoomRange.depth = Number(match.dataset.depth || String(fg.zoomRange.depth || 0));
+ }
+
function fgApplyZoom() {
if (!fg.zoomRange) {
for (var i = 0; i < fg.frames.length; i++) {
@@ -333,6 +372,7 @@ const liveHTML = `<!doctype html>
}
return;
}
+ fgRefreshZoomRange();
var x = fg.zoomRange.x;
var end = x + fg.zoomRange.w;
var width = fg.zoomRange.w;