From bebc14385899be7987cbea4a5c6903861a3a5255 Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Wed, 24 Dec 2025 09:45:38 +0100 Subject: [PATCH] Fix top flamegraph bars disappearing in fullscreen mode Fixed a bug where top flamegraph bars would disappear during pan/zoom operations when the window was in fullscreen or when content fit within the viewport in fixed-height mode. Root cause: In CameraController.ts, the calculateBoundedPosition() method had a gap in its conditional logic. When isFixedHeight was true but isScrollable() was false (content fits in viewport), neither branch executed and camera.y remained unconstrained. This allowed camera.y to become negative during pan/zoom operations, pushing top frames off screen. Fix: Changed 'else if (!this.isFixedHeight)' to just 'else' in the vertical bounds calculation, ensuring Y is always constrained to 0 when vertical scrolling isn't needed. Added two regression tests to prevent this issue from recurring: - Test for drag operations in fixed height mode - Test for fullscreen resize scenarios --- src/renderer/CameraController.ts | 6 +- tests/edge-cases.spec.ts | 66 ++++++++++++++++++ .../chromium-after-drag-fixed-height-.png | Bin 0 -> 9969 bytes .../chromium-after-fullscreen-.png | Bin 0 -> 14284 bytes .../chromium-before-drag-fixed-height-.png | Bin 0 -> 10329 bytes .../chromium-before-fullscreen-.png | Bin 0 -> 10329 bytes 6 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 tests/snapshots/edge-cases.spec.ts/chromium-after-drag-fixed-height-.png create mode 100644 tests/snapshots/edge-cases.spec.ts/chromium-after-fullscreen-.png create mode 100644 tests/snapshots/edge-cases.spec.ts/chromium-before-drag-fixed-height-.png create mode 100644 tests/snapshots/edge-cases.spec.ts/chromium-before-fullscreen-.png diff --git a/src/renderer/CameraController.ts b/src/renderer/CameraController.ts index 7068b92b..18f1a03e 100644 --- a/src/renderer/CameraController.ts +++ b/src/renderer/CameraController.ts @@ -274,12 +274,12 @@ export class CameraController { // Vertical bounds if (this.#isFixedHeight && this.isScrollable()) { - // Fixed height mode with scrollable content + // Fixed height mode with scrollable content - allow vertical panning within bounds const maxY = 0; // Top of content at top of viewport const minY = this.#viewportHeight - this.#contentHeight; // Bottom of content at bottom of viewport boundedY = Math.max(minY, Math.min(maxY, desiredY)) - } else if (!this.#isFixedHeight) { - // Auto-height mode: no vertical panning + } else { + // Auto-height mode OR fixed height but not scrollable - no vertical panning boundedY = 0 } diff --git a/tests/edge-cases.spec.ts b/tests/edge-cases.spec.ts index fbd1f1c5..3b6b45f5 100644 --- a/tests/edge-cases.spec.ts +++ b/tests/edge-cases.spec.ts @@ -8,6 +8,72 @@ test.describe('FlameGraph Edge Cases Tests', () => { utils = new FlameGraphTestUtils(page) }) + test('top frames remain visible after dragging in fixed height mode', async ({ page }) => { + // This tests the fix for the bug where camera.y could become negative + // when in fixed height mode but content fits in viewport (not scrollable), + // causing top flamegraph bars to disappear. + await utils.navigateToTest() + + const canvas = await utils.getCanvasElement() + const box = await canvas.boundingBox() + expect(box).not.toBeNull() + + // Take a screenshot before dragging to capture the initial state + await expect(page).toHaveScreenshot('before-drag-fixed-height.png') + + // Perform a drag operation that would push content up (drag downward) + // In the buggy version, this would set camera.y to a negative value + const startX = box!.x + box!.width / 2 + const startY = box!.y + box!.height / 2 + const endY = box!.y + box!.height - 50 // Drag down significantly + + await page.mouse.move(startX, startY) + await page.mouse.down() + await page.mouse.move(startX, endY, { steps: 10 }) + await page.mouse.up() + + await page.waitForTimeout(500) + + // Take a screenshot after dragging - top frames should still be visible + // The fix ensures camera.y stays at 0 when content fits in viewport + await expect(page).toHaveScreenshot('after-drag-fixed-height.png') + + // Verify the canvas is still fully visible and functional + await expect(canvas).toBeVisible() + + // Click on the root frame area to verify it's still interactive + await utils.clickFrame(COMMON_POSITIONS.ROOT_FRAME.x, COMMON_POSITIONS.ROOT_FRAME.y) + await page.waitForTimeout(500) + + // The flamegraph should still be functional + await expect(canvas).toBeVisible() + }) + + test('top frames remain visible after fullscreen resize', async ({ page }) => { + // Test that going fullscreen doesn't cause top frames to disappear + await utils.navigateToTest() + + const canvas = await utils.getCanvasElement() + + // Initial state + await expect(canvas).toBeVisible() + await expect(page).toHaveScreenshot('before-fullscreen.png') + + // Simulate fullscreen by changing to a larger viewport + await page.setViewportSize({ width: 1920, height: 1080 }) + await page.waitForTimeout(1000) + + // Top frames should still be visible at the top of the canvas + await expect(canvas).toBeVisible() + await expect(page).toHaveScreenshot('after-fullscreen.png') + + // Verify the root frame is still clickable at the top + await utils.clickFrame(COMMON_POSITIONS.ROOT_FRAME.x, COMMON_POSITIONS.ROOT_FRAME.y) + await page.waitForTimeout(500) + + await expect(canvas).toBeVisible() + }) + test('handles extreme zoom levels', async ({ page }) => { await utils.navigateToTest() diff --git a/tests/snapshots/edge-cases.spec.ts/chromium-after-drag-fixed-height-.png b/tests/snapshots/edge-cases.spec.ts/chromium-after-drag-fixed-height-.png new file mode 100644 index 0000000000000000000000000000000000000000..5465f08a67ad08c5fe693cdb2a06859ffad901e3 GIT binary patch literal 9969 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/edge-cases.spec.ts/chromium-after-fullscreen-.png b/tests/snapshots/edge-cases.spec.ts/chromium-after-fullscreen-.png new file mode 100644 index 0000000000000000000000000000000000000000..d026e9430a91fc61558d4767242736cb33f89ff1 GIT binary patch literal 14284 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�eC1boVsdqI>Y+YVU`VH215}CTw17pWafxm(8Y@e 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