diff options
| author | Paul Buetow <paul@buetow.org> | 2026-02-27 18:26:00 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-02-27 18:26:00 +0200 |
| commit | dab0a1a62e3a51cfe1c45001e10311cf369519c8 (patch) | |
| tree | 863c90ef3480d86ca7b61c1eafb3fbaa6b19573b /internal/flamegraph/livehtml.go | |
| parent | 62fc446d15cbf038a12feb4d36ae97a663904d63 (diff) | |
flamegraph: preserve zoom/search state across updates
Diffstat (limited to 'internal/flamegraph/livehtml.go')
| -rw-r--r-- | internal/flamegraph/livehtml.go | 40 |
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; |
