diff --git a/package-lock.json b/package-lock.json index 1a57fd85b31..e6f196adeb8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4975,9 +4975,9 @@ } }, "gl-plot3d": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/gl-plot3d/-/gl-plot3d-2.4.1.tgz", - "integrity": "sha512-Xm2VmZL7re85KADU1FBj6qMVLgb3jL1RcoUuQ96BgFJp9I0YiVwA4kCxK9asFhE0I2/J0PAXDtSmqbafvAV9Tw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/gl-plot3d/-/gl-plot3d-2.4.2.tgz", + "integrity": "sha512-nBLTqKCLOlPnf/8kWJdZxZTdcK7U0KqHO13T08dakfv2a1xiiy4qgqjjI42UXZOkthrqyt4VszBQ/D4qBgTHBw==", "requires": { "3d-view": "^2.0.0", "a-big-triangle": "^1.0.3", diff --git a/package.json b/package.json index 98e45f2e3f1..39eedfab985 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "gl-mat4": "^1.2.0", "gl-mesh3d": "^2.3.0", "gl-plot2d": "^1.4.3", - "gl-plot3d": "^2.4.1", + "gl-plot3d": "^2.4.2", "gl-pointcloud2d": "^1.0.2", "gl-scatter3d": "^1.2.2", "gl-select-box": "^1.0.3", diff --git a/src/plots/gl3d/scene.js b/src/plots/gl3d/scene.js index 4f12b0dc4da..1b05755a0cb 100644 --- a/src/plots/gl3d/scene.js +++ b/src/plots/gl3d/scene.js @@ -15,7 +15,6 @@ var createPlot = glPlot3d.createScene; var getContext = require('webgl-context'); var passiveSupported = require('has-passive-events'); -var isMobile = require('is-mobile')({ tablet: true }); var Registry = require('../../registry'); var Lib = require('../../lib'); @@ -31,6 +30,39 @@ var createAxesOptions = require('./layout/convert'); var createSpikeOptions = require('./layout/spikes'); var computeTickMarks = require('./layout/tick_marks'); +var isMobile = require('is-mobile'); +var tablet = isTablet(); + +function isTablet() { + if(!navigator) return false; + + var ua; + // same interface as applied by is-mobile module + if(!ua && typeof navigator !== 'undefined') ua = navigator.userAgent; + if(ua && ua.headers && typeof ua.headers['user-agent'] === 'string') { + ua = ua.headers['user-agent']; + } + if(typeof ua !== 'string') return false; + + var result = isMobile({ + ua: ua, + tablet: true + }); + + // handle iPad pro or iPad with iOs 13 using Safari + // see https://github.com/plotly/plotly.js/issues/4502 + if( + result === false && + ua.indexOf('Macintosh') !== -1 && + ua.indexOf('Safari') !== -1 && + navigator.maxTouchPoints > 1 + ) { + result = true; + } + + return result; +} + var STATIC_CANVAS, STATIC_CONTEXT; @@ -96,7 +128,7 @@ proto.tryCreatePlot = function() { canvas: scene.canvas, gl: scene.gl, glOptions: { - preserveDrawingBuffer: isMobile, + preserveDrawingBuffer: tablet, premultipliedAlpha: true, antialias: true },