From 7cd989133de9ba712d149bf12f15e407c39fa217 Mon Sep 17 00:00:00 2001 From: Jonah <47046556+jwbonner@users.noreply.github.com> Date: Fri, 31 Jan 2025 12:56:05 -0500 Subject: [PATCH] Add additional checks to prevent freezing for invalid timeline ranges --- src/hub/SelectionImpl.ts | 4 +++- src/hub/Timeline.ts | 3 ++- src/shared/renderers/LineGraphRenderer.ts | 12 ++++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/hub/SelectionImpl.ts b/src/hub/SelectionImpl.ts index 2929392a..6fb93ebd 100644 --- a/src/hub/SelectionImpl.ts +++ b/src/hub/SelectionImpl.ts @@ -347,7 +347,9 @@ export default class SelectionImpl implements Selection { /** Returns the visible range for the timeline. */ getTimelineRange(): [number, number] { this.applyTimelineScroll(0, 0, 0); - return [...this.timelineRange]; + let safeTimelineRange = [...this.timelineRange] as [number, number]; + safeTimelineRange[1] = Math.max(safeTimelineRange[1], safeTimelineRange[0] + 1e-3); + return safeTimelineRange; } /** Returns whether the timeline is locked to max zoom. */ diff --git a/src/hub/Timeline.ts b/src/hub/Timeline.ts index ecc27231..d5e910a6 100644 --- a/src/hub/Timeline.ts +++ b/src/hub/Timeline.ts @@ -205,7 +205,8 @@ export default class Timeline { context.textBaseline = "middle"; context.globalAlpha = 0.5; let stepPos = Math.ceil(cleanFloat(timeRange[0] / stepSize)) * stepSize; - while (true) { + let iterCount = 0; + while (iterCount++ < 100) { let x = scaleValue(stepPos, timeRange, [0, width]); if (x > width + 1) { break; diff --git a/src/shared/renderers/LineGraphRenderer.ts b/src/shared/renderers/LineGraphRenderer.ts index 2904a59a..fd0413b4 100644 --- a/src/shared/renderers/LineGraphRenderer.ts +++ b/src/shared/renderers/LineGraphRenderer.ts @@ -281,7 +281,8 @@ export default class LineGraphRenderer implements TabRenderer { context.beginPath(); context.moveTo(graphLeft + graphWidth, yScaler.calculate(field.values[field.values.length - 1])); let i = field.values.length - 1; - while (true) { + let iterCount = 0; + while (iterCount++ < 100) { let x = xScaler.calculate(field.timestamps[i]); // Render start of current data point @@ -529,7 +530,8 @@ export default class LineGraphRenderer implements TabRenderer { if (command.showLeftAxis) { context.textAlign = "right"; let stepPos = Math.floor(command.leftRange[1] / leftStepSize) * leftStepSize; - while (true) { + let iterCount = 0; + while (iterCount++ < 100) { let y = scaleValue(stepPos, command.leftRange, [graphTop + graphHeightOpen, graphTop]); if (y > graphTop + graphHeight) break; @@ -558,7 +560,8 @@ export default class LineGraphRenderer implements TabRenderer { if (command.showRightAxis) { context.textAlign = "left"; let stepPos = Math.floor(command.rightRange[1] / rightStepSize) * rightStepSize; - while (true) { + let iterCount = 0; + while (iterCount++ < 100) { let y = scaleValue(stepPos, command.rightRange, [graphTop + graphHeightOpen, graphTop]); if (y > graphTop + graphHeight) break; @@ -587,7 +590,8 @@ export default class LineGraphRenderer implements TabRenderer { // Render x axis context.textAlign = "center"; let stepPos = Math.ceil(cleanFloat(timeRange[0] / timeStepSize)) * timeStepSize; - while (true) { + let iterCount = 0; + while (iterCount++ < 100) { let x = scaleValue(stepPos, timeRange, [graphLeft, graphLeft + graphWidth]); // Clean up final x (scroll can cause rounding problems)