diff --git a/src/scales/scale.linearbase.js b/src/scales/scale.linearbase.js index dc00265ee19..0930d38f554 100644 --- a/src/scales/scale.linearbase.js +++ b/src/scales/scale.linearbase.js @@ -222,6 +222,10 @@ export default class LinearScaleBase extends Scale { if (stepSize) { maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1; + if (maxTicks > 1000) { + console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`); + maxTicks = 1000; + } } else { maxTicks = this.computeTickLimit(); maxTicksLimit = maxTicksLimit || 11; diff --git a/test/specs/scale.linear.tests.js b/test/specs/scale.linear.tests.js index e2ad37e41a2..3307c39621a 100644 --- a/test/specs/scale.linear.tests.js +++ b/test/specs/scale.linear.tests.js @@ -639,6 +639,29 @@ describe('Linear Scale', function() { expect(getLabels(chart.scales.y)).toEqual(['1', '3', '5', '7', '9', '11']); }); + it('Should not generate insane amounts of ticks with small stepSize and large range', function() { + var chart = window.acquireChart({ + type: 'bar', + options: { + scales: { + y: { + type: 'linear', + min: 1, + max: 1E10, + ticks: { + stepSize: 2, + autoSkip: false + } + } + } + } + }); + + expect(chart.scales.y.min).toBe(1); + expect(chart.scales.y.max).toBe(1E10); + expect(chart.scales.y.ticks.length).toBeLessThanOrEqual(1000); + }); + it('Should create decimal steps if stepSize is a decimal number', function() { var chart = window.acquireChart({ type: 'bar',