Skip to content

Commit b436d52

Browse files
committed
ensure every trace defines _length in supplyDefaults, and abort transforms if it's falsy
1 parent e84d4b9 commit b436d52

File tree

26 files changed

+175
-75
lines changed

26 files changed

+175
-75
lines changed

src/plots/plots.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,6 +1178,11 @@ plots.supplyTraceDefaults = function(traceIn, colorIndex, layout, traceInIndex)
11781178
};
11791179

11801180
plots.supplyTransformDefaults = function(traceIn, traceOut, layout) {
1181+
// For now we only allow transforms on 1D traces, ie those that specify a _length.
1182+
// If we were to implement 2D transforms, we'd need to have each transform
1183+
// describe its own applicability and disable itself when it doesn't apply.
1184+
if(!traceOut._length) return;
1185+
11811186
var globalTransforms = layout._globalTransforms || [];
11821187
var transformModules = layout._transformModules || [];
11831188

src/traces/box/calc.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,11 @@ module.exports = function calc(gd, trace) {
4848
var dPos = dv.minDiff / 2;
4949
var posBins = makeBins(posDistinct, dPos);
5050

51-
var vLen = val.length;
5251
var pLen = posDistinct.length;
5352
var ptsPerBin = initNestedArray(pLen);
5453

5554
// bin pts info per position bins
56-
for(i = 0; i < vLen; i++) {
55+
for(i = 0; i < trace._length; i++) {
5756
var v = val[i];
5857
if(!isNumeric(v)) continue;
5958

src/traces/box/defaults.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,28 @@ function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
3838
function handleSampleDefaults(traceIn, traceOut, coerce, layout) {
3939
var y = coerce('y');
4040
var x = coerce('x');
41+
var hasX = x && x.length;
4142

42-
var defaultOrientation;
43+
var defaultOrientation, len;
4344

4445
if(y && y.length) {
4546
defaultOrientation = 'v';
46-
if(!x) coerce('x0');
47+
if(hasX) {
48+
len = Math.min(x.length, y.length);
49+
}
50+
else {
51+
coerce('x0');
52+
len = y.length;
53+
}
4754
} else if(x && x.length) {
4855
defaultOrientation = 'h';
4956
coerce('y0');
57+
len = x.length;
5058
} else {
5159
traceOut.visible = false;
5260
return;
5361
}
62+
traceOut._length = len;
5463

5564
var handleCalendarDefaults = Registry.getComponentMethod('calendars', 'handleTraceDefaults');
5665
handleCalendarDefaults(traceIn, traceOut, ['x', 'y'], layout);

src/traces/carpet/defaults.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,12 @@ module.exports = function supplyDefaults(traceIn, traceOut, dfltColor, fullLayou
4646
// corresponds to b and the second to a. This sounds backwards but ends up making sense
4747
// the important part to know is that when you write y[j][i], j goes from 0 to b.length - 1
4848
// and i goes from 0 to a.length - 1.
49-
var len = handleXYDefaults(traceIn, traceOut, coerce);
49+
var validData = handleXYDefaults(traceIn, traceOut, coerce);
50+
if(!validData) {
51+
traceOut.visible = false;
52+
}
5053

5154
if(traceOut._cheater) {
5255
coerce('cheaterslope');
5356
}
54-
55-
if(!len) {
56-
traceOut.visible = false;
57-
}
5857
};

src/traces/carpet/xy_defaults.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,25 @@
99

1010
'use strict';
1111

12+
var is1D = require('../../lib').is1D;
13+
1214
module.exports = function handleXYDefaults(traceIn, traceOut, coerce) {
1315
var x = coerce('x');
16+
var hasX = x && x.length;
1417
var y = coerce('y');
18+
var hasY = y && y.length;
19+
if(!hasX && !hasY) return false;
1520

1621
traceOut._cheater = !x;
1722

18-
return !!x || !!y;
23+
if((!hasX || is1D(x)) && (!hasY || is1D(y))) {
24+
var len = hasX ? x.length : Infinity;
25+
if(hasY) len = Math.min(len, y.length);
26+
if(traceOut.a && traceOut.a.length) len = Math.min(len, traceOut.a.length);
27+
if(traceOut.b && traceOut.b.length) len = Math.min(len, traceOut.b.length);
28+
traceOut._length = len;
29+
}
30+
else traceOut._length = null;
31+
32+
return true;
1933
};

src/traces/choropleth/calc.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ var arraysToCalcdata = require('../scatter/arrays_to_calcdata');
1717
var calcSelection = require('../scatter/calc_selection');
1818

1919
module.exports = function calc(gd, trace) {
20-
var len = trace.locations.length;
20+
var len = trace._length;
2121
var calcTrace = new Array(len);
2222

2323
for(var i = 0; i < len; i++) {

src/traces/choropleth/defaults.js

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,13 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
1919
}
2020

2121
var locations = coerce('locations');
22-
23-
var len;
24-
if(locations) len = locations.length;
25-
26-
if(!locations || !len) {
27-
traceOut.visible = false;
28-
return;
29-
}
30-
3122
var z = coerce('z');
32-
if(!Lib.isArrayOrTypedArray(z)) {
23+
24+
if(!(locations && locations.length && Lib.isArrayOrTypedArray(z) && z.length)) {
3325
traceOut.visible = false;
3426
return;
3527
}
36-
37-
if(z.length > len) traceOut.z = z.slice(0, len);
28+
traceOut._length = Math.min(locations.length, z.length);
3829

3930
coerce('locationmode');
4031

src/traces/contourcarpet/defaults.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,5 +69,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
6969
}
7070
} else {
7171
traceOut._defaultColor = defaultColor;
72+
traceOut._length = null;
7273
}
7374
};

src/traces/heatmap/convert_column_xyz.js

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,16 @@ var Lib = require('../../lib');
1313
var BADNUM = require('../../constants/numerical').BADNUM;
1414

1515
module.exports = function convertColumnData(trace, ax1, ax2, var1Name, var2Name, arrayVarNames) {
16-
var col1 = trace[var1Name].slice(),
17-
col2 = trace[var2Name].slice(),
18-
textCol = trace.text,
19-
colLen = Math.min(col1.length, col2.length),
20-
hasColumnText = (textCol !== undefined && !Array.isArray(textCol[0])),
21-
col1Calendar = trace[var1Name + 'calendar'],
22-
col2Calendar = trace[var2Name + 'calendar'];
16+
var colLen = trace._length;
17+
var col1 = trace[var1Name].slice(0, colLen);
18+
var col2 = trace[var2Name].slice(0, colLen);
19+
var textCol = trace.text;
20+
var hasColumnText = (textCol !== undefined && Lib.is1D(textCol));
21+
var col1Calendar = trace[var1Name + 'calendar'];
22+
var col2Calendar = trace[var2Name + 'calendar'];
2323

2424
var i, j, arrayVar, newArray, arrayVarName;
2525

26-
for(i = 0; i < arrayVarNames.length; i++) {
27-
arrayVar = trace[arrayVarNames[i]];
28-
if(arrayVar) colLen = Math.min(colLen, arrayVar.length);
29-
}
30-
31-
if(colLen < col1.length) col1 = col1.slice(0, colLen);
32-
if(colLen < col2.length) col2 = col2.slice(0, colLen);
33-
3426
for(i = 0; i < colLen; i++) {
3527
col1[i] = ax1.d2c(col1[i], 0, col1Calendar);
3628
col2[i] = ax2.d2c(col2[i], 0, col2Calendar);

src/traces/heatmap/xyz_defaults.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ module.exports = function handleXYZDefaults(traceIn, traceOut, coerce, layout, x
2727
y = coerce(yName);
2828

2929
// column z must be accompanied by xName and yName arrays
30-
if(!x || !y) return 0;
30+
if(!(x && x.length && y && y.length)) return 0;
31+
32+
traceOut._length = Math.min(x.length, y.length, z.length);
3133
}
3234
else {
3335
x = coordDefaults(xName, coerce);
@@ -37,12 +39,14 @@ module.exports = function handleXYZDefaults(traceIn, traceOut, coerce, layout, x
3739
if(!isValidZ(z)) return 0;
3840

3941
coerce('transpose');
42+
43+
traceOut._length = null;
4044
}
4145

4246
var handleCalendarDefaults = Registry.getComponentMethod('calendars', 'handleTraceDefaults');
4347
handleCalendarDefaults(traceIn, traceOut, [xName, yName], layout);
4448

45-
return traceOut.z.length;
49+
return true;
4650
};
4751

4852
function coordDefaults(coordStr, coerce) {

0 commit comments

Comments
 (0)