[2.9] FitBoxes recursion when dimensions are NaN (#7853)

* Infinite recursion when dimensions are NaN

Adding a verification on updateDims that handles a case when dimensions are both
NaN. This caused an infinite recursion on fitBoxes when calculating the layout
for a chart that is mounted on an element that is not yet in DOM.

Fixes #7761
This commit is contained in:
Alessandro Menezes
2020-10-09 10:45:13 -04:00
committed by GitHub
parent 2493cb5a2f
commit 063b7dc075
2 changed files with 42 additions and 1 deletions

View File

@@ -99,7 +99,8 @@ function updateDims(chartArea, params, layout) {
chartArea.h = newHeight;
// return true if chart area changed in layout's direction
return layout.horizontal ? newWidth !== chartArea.w : newHeight !== chartArea.h;
var sizes = layout.horizontal ? [newWidth, chartArea.w] : [newHeight, chartArea.h];
return sizes[0] !== sizes[1] && (!isNaN(sizes[0]) || !isNaN(sizes[1]));
}
}

View File

@@ -653,5 +653,45 @@ describe('Chart.layouts', function() {
expect(yAxis.width).toBeCloseToPixel(33);
expect(yAxis.ticks).toEqual(['2.5', '2.0', '1.5', '1.0', '0.5', '0']);
});
it('should correctly handle NaN dimensions', function() {
// issue #7761: Maximum call stack size exceeded
var chartContainer = document.createElement('div');
chartContainer.style.width = '600px';
chartContainer.style.height = '400px';
var chartCanvas = document.createElement('canvas');
chartContainer.appendChild(chartCanvas);
var chart = new Chart(chartCanvas, {
type: 'line',
responsive: true,
data: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
datasets: [{
label: '# of Votes',
data: [12, 19, 3, 5, 2, 3]
}]
},
options: {
scales: {
yAxes: [{
type: 'linear',
label: 'first axis',
position: 'right'
}, {
type: 'linear',
label: 'second axis',
position: 'right'
}]
}
}
});
expect(chart.width).toBeNaN();
expect(chart.height).toBeNaN();
});
});
});