diff --git a/src/components/colorbar/has_colorbar.js b/src/components/colorbar/has_colorbar.js index e7c750933a7..40990086b43 100644 --- a/src/components/colorbar/has_colorbar.js +++ b/src/components/colorbar/has_colorbar.js @@ -9,10 +9,9 @@ 'use strict'; +var Lib = require('../../lib'); + module.exports = function hasColorbar(container) { - return ( - typeof container.colorbar === 'object' && - container.colorbar !== null - ); + return Lib.isPlainObject(container.colorbar); }; diff --git a/src/components/colorscale/has_colorscale.js b/src/components/colorscale/has_colorscale.js index 9e28d51f5de..5cbce08634d 100644 --- a/src/components/colorscale/has_colorscale.js +++ b/src/components/colorscale/has_colorscale.js @@ -33,12 +33,12 @@ module.exports = function hasColorscale(trace, containerStr) { } return ( - (typeof container === 'object' && container !== null) && ( + Lib.isPlainObject(container) && ( isArrayWithOneNumber || container.showscale === true || (isNumeric(container.cmin) && isNumeric(container.cmax)) || isValidScale(container.colorscale) || - (typeof container.colorbar === 'object' && container.colorbar !== null) + Lib.isPlainObject(container.colorbar) ) ); }; diff --git a/src/components/rangeslider/defaults.js b/src/components/rangeslider/defaults.js index 0095c7b243e..c06502b7068 100644 --- a/src/components/rangeslider/defaults.js +++ b/src/components/rangeslider/defaults.js @@ -13,10 +13,9 @@ var attributes = require('./attributes'); module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, axName, counterAxes) { - if(!layoutIn[axName].rangeslider) return; - var containerIn = typeof layoutIn[axName].rangeslider === 'object' ? + var containerIn = Lib.isPlainObject(layoutIn[axName].rangeslider) ? layoutIn[axName].rangeslider : {}, containerOut = layoutOut[axName].rangeslider = {}; diff --git a/src/lib/is_plain_object.js b/src/lib/is_plain_object.js index ced058e1bb5..1f0748e8e27 100644 --- a/src/lib/is_plain_object.js +++ b/src/lib/is_plain_object.js @@ -11,6 +11,15 @@ // more info: http://stackoverflow.com/questions/18531624/isplainobject-thing module.exports = function isPlainObject(obj) { + + // We need to be a little less strict in the `imagetest` container because + // of how async image requests are handled. + // + // N.B. isPlainObject(new Constructor()) will return true in `imagetest` + if(window && window.process && window.process.versions) { + return Object.prototype.toString.call(obj) === '[object Object]'; + } + return ( Object.prototype.toString.call(obj) === '[object Object]' && Object.getPrototypeOf(obj) === Object.prototype diff --git a/src/plots/mapbox/layers.js b/src/plots/mapbox/layers.js index 8fa4890d384..c5de5901a5c 100644 --- a/src/plots/mapbox/layers.js +++ b/src/plots/mapbox/layers.js @@ -131,11 +131,8 @@ proto.dispose = function dispose() { function isVisible(opts) { var source = opts.source; - // For some weird reason Lib.isPlainObject fails - // to detect `source` as a plain object in nw.js 0.12. - return ( - typeof source === 'object' || + Lib.isPlainObject(source) || (typeof source === 'string' && source.length > 0) ); } diff --git a/src/traces/scatter/subtypes.js b/src/traces/scatter/subtypes.js index 56814679824..b79b420a4f3 100644 --- a/src/traces/scatter/subtypes.js +++ b/src/traces/scatter/subtypes.js @@ -9,6 +9,8 @@ 'use strict'; +var Lib = require('../../lib'); + module.exports = { hasLines: function(trace) { return trace.visible && trace.mode && @@ -26,7 +28,7 @@ module.exports = { }, isBubble: function(trace) { - return (typeof trace.marker === 'object' && - Array.isArray(trace.marker.size)); + return Lib.isPlainObject(trace.marker) && + Array.isArray(trace.marker.size); } };