Skip to content

Commit 9523d2c

Browse files
committedDec 17, 2020
preserve drawing buffer for gl3d scenes using Safari 14
1 parent d45eef5 commit 9523d2c

File tree

1 file changed

+50
-7
lines changed

1 file changed

+50
-7
lines changed
 

‎src/plots/gl3d/scene.js

+50-7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
'use strict';
1111

12+
var isNumeric = require('fast-isnumeric');
13+
1214
var glPlot3d = require('gl-plot3d');
1315
var createCamera = glPlot3d.createCamera;
1416
var createPlot = glPlot3d.createScene;
@@ -30,7 +32,48 @@ var createAxesOptions = require('./layout/convert');
3032
var createSpikeOptions = require('./layout/spikes');
3133
var computeTickMarks = require('./layout/tick_marks');
3234

33-
var isMobile = require('is-mobile')({ tablet: true, featureDetect: true });
35+
var isMobileOrTablet = require('is-mobile')({ tablet: true, featureDetect: true });
36+
var preserveDrawingBuffer = handleSafari14(isMobileOrTablet);
37+
38+
function handleSafari14(hasDrawingBuffer) {
39+
if(!hasDrawingBuffer) {
40+
var ua = getUserAgent();
41+
if(typeof ua !== 'string') return false;
42+
43+
var allParts = ua.split('/');
44+
for(var i = 0; i < allParts.length; i++) {
45+
var part = allParts[i];
46+
if(part.indexOf('Safari') !== -1) {
47+
// find Safari version
48+
var v = part.split('.')[0];
49+
if(isNumeric(v)) v = +v;
50+
51+
// to fix https://github.com/plotly/plotly.js/issues/5158
52+
if(v >= 14) return true;
53+
}
54+
}
55+
}
56+
57+
return hasDrawingBuffer;
58+
}
59+
60+
function getUserAgent() {
61+
// similar to https://github.com/juliangruber/is-mobile/blob/91ca39ccdd4cfc5edfb5391e2515b923a730fbea/index.js#L14-L17
62+
var ua;
63+
if(typeof navigator !== 'undefined') {
64+
ua = navigator.userAgent;
65+
}
66+
67+
if(
68+
ua &&
69+
ua.headers &&
70+
typeof ua.headers['user-agent'] === 'string'
71+
) {
72+
ua = ua.headers['user-agent'];
73+
}
74+
75+
return ua;
76+
}
3477

3578

3679
var STATIC_CANVAS, STATIC_CONTEXT;
@@ -98,7 +141,7 @@ proto.prepareOptions = function() {
98141
canvas: scene.canvas,
99142
gl: scene.gl,
100143
glOptions: {
101-
preserveDrawingBuffer: isMobile,
144+
preserveDrawingBuffer: preserveDrawingBuffer,
102145
premultipliedAlpha: true,
103146
antialias: true
104147
},
@@ -155,19 +198,19 @@ proto.tryCreatePlot = function() {
155198
// invert preserveDrawingBuffer setup which could be resulted from is-mobile not detecting the right device
156199
Lib.warn([
157200
'webgl setup failed possibly due to',
158-
isMobile ? 'disabling' : 'enabling',
201+
preserveDrawingBuffer ? 'disabling' : 'enabling',
159202
'preserveDrawingBuffer config.',
160203
'The device may not be supported by is-mobile module!',
161204
'Inverting preserveDrawingBuffer option in second attempt to create webgl scene.'
162205
].join(' '));
163206

164-
// invert is-mobile
165-
isMobile = opts.glOptions.preserveDrawingBuffer = !opts.glOptions.preserveDrawingBuffer;
207+
// invert preserveDrawingBuffer
208+
preserveDrawingBuffer = opts.glOptions.preserveDrawingBuffer = !opts.glOptions.preserveDrawingBuffer;
166209

167210
scene.glplot = createPlot(opts);
168211
} catch(e) {
169-
// revert changes to is-mobile
170-
isMobile = opts.glOptions.preserveDrawingBuffer = !opts.glOptions.preserveDrawingBuffer;
212+
// revert changes to preserveDrawingBuffer
213+
preserveDrawingBuffer = opts.glOptions.preserveDrawingBuffer = !opts.glOptions.preserveDrawingBuffer;
171214

172215
success = false;
173216
}

0 commit comments

Comments
 (0)
Please sign in to comment.