1 | import {svgCreate} from '../layer/vector/SVG.Util';
|
2 |
|
3 | /*
|
4 | * @namespace Browser
|
5 | * @aka L.Browser
|
6 | *
|
7 | * A namespace with static properties for browser/feature detection used by Leaflet internally.
|
8 | *
|
9 | * @example
|
10 | *
|
11 | * ```js
|
12 | * if (L.Browser.ielt9) {
|
13 | * alert('Upgrade your browser, dude!');
|
14 | * }
|
15 | * ```
|
16 | */
|
17 |
|
18 | var style = document.documentElement.style;
|
19 |
|
20 | // @property ie: Boolean; `true` for all Internet Explorer versions (not Edge).
|
21 | export var ie = 'ActiveXObject' in window;
|
22 |
|
23 | // @property ielt9: Boolean; `true` for Internet Explorer versions less than 9.
|
24 | export var ielt9 = ie && !document.addEventListener;
|
25 |
|
26 | // @property edge: Boolean; `true` for the Edge web browser.
|
27 | export var edge = 'msLaunchUri' in navigator && !('documentMode' in document);
|
28 |
|
29 | // @property webkit: Boolean;
|
30 | // `true` for webkit-based browsers like Chrome and Safari (including mobile versions).
|
31 | export var webkit = userAgentContains('webkit');
|
32 |
|
33 | // @property android: Boolean
|
34 | // `true` for any browser running on an Android platform.
|
35 | export var android = userAgentContains('android');
|
36 |
|
37 | // @property android23: Boolean; `true` for browsers running on Android 2 or Android 3.
|
38 | export var android23 = userAgentContains('android 2') || userAgentContains('android 3');
|
39 |
|
40 | /* See https://stackoverflow.com/a/17961266 for details on detecting stock Android */
|
41 | var webkitVer = parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.userAgent)[1], 10); // also matches AppleWebKit
|
42 | // @property androidStock: Boolean; `true` for the Android stock browser (i.e. not Chrome)
|
43 | export var androidStock = android && userAgentContains('Google') && webkitVer < 537 && !('AudioNode' in window);
|
44 |
|
45 | // @property opera: Boolean; `true` for the Opera browser
|
46 | export var opera = !!window.opera;
|
47 |
|
48 | // @property chrome: Boolean; `true` for the Chrome browser.
|
49 | export var chrome = userAgentContains('chrome');
|
50 |
|
51 | // @property gecko: Boolean; `true` for gecko-based browsers like Firefox.
|
52 | export var gecko = userAgentContains('gecko') && !webkit && !opera && !ie;
|
53 |
|
54 | // @property safari: Boolean; `true` for the Safari browser.
|
55 | export var safari = !chrome && userAgentContains('safari');
|
56 |
|
57 | export var phantom = userAgentContains('phantom');
|
58 |
|
59 | // @property opera12: Boolean
|
60 | // `true` for the Opera browser supporting CSS transforms (version 12 or later).
|
61 | export var opera12 = 'OTransition' in style;
|
62 |
|
63 | // @property win: Boolean; `true` when the browser is running in a Windows platform
|
64 | export var win = navigator.platform.indexOf('Win') === 0;
|
65 |
|
66 | // @property ie3d: Boolean; `true` for all Internet Explorer versions supporting CSS transforms.
|
67 | export var ie3d = ie && ('transition' in style);
|
68 |
|
69 | // @property webkit3d: Boolean; `true` for webkit-based browsers supporting CSS transforms.
|
70 | export var webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23;
|
71 |
|
72 | // @property gecko3d: Boolean; `true` for gecko-based browsers supporting CSS transforms.
|
73 | export var gecko3d = 'MozPerspective' in style;
|
74 |
|
75 | // @property any3d: Boolean
|
76 | // `true` for all browsers supporting CSS transforms.
|
77 | export var any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantom;
|
78 |
|
79 | // @property mobile: Boolean; `true` for all browsers running in a mobile device.
|
80 | export var mobile = typeof orientation !== 'undefined' || userAgentContains('mobile');
|
81 |
|
82 | // @property mobileWebkit: Boolean; `true` for all webkit-based browsers in a mobile device.
|
83 | export var mobileWebkit = mobile && webkit;
|
84 |
|
85 | // @property mobileWebkit3d: Boolean
|
86 | // `true` for all webkit-based browsers in a mobile device supporting CSS transforms.
|
87 | export var mobileWebkit3d = mobile && webkit3d;
|
88 |
|
89 | // @property msPointer: Boolean
|
90 | // `true` for browsers implementing the Microsoft touch events model (notably IE10).
|
91 | export var msPointer = !window.PointerEvent && window.MSPointerEvent;
|
92 |
|
93 | // @property pointer: Boolean
|
94 | // `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx).
|
95 | export var pointer = !!(window.PointerEvent || msPointer);
|
96 |
|
97 | // @property touch: Boolean
|
98 | // `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events).
|
99 | // This does not necessarily mean that the browser is running in a computer with
|
100 | // a touchscreen, it only means that the browser is capable of understanding
|
101 | // touch events.
|
102 | export var touch = !window.L_NO_TOUCH && (pointer || 'ontouchstart' in window ||
|
103 | (window.DocumentTouch && document instanceof window.DocumentTouch));
|
104 |
|
105 | // @property mobileOpera: Boolean; `true` for the Opera browser in a mobile device.
|
106 | export var mobileOpera = mobile && opera;
|
107 |
|
108 | // @property mobileGecko: Boolean
|
109 | // `true` for gecko-based browsers running in a mobile device.
|
110 | export var mobileGecko = mobile && gecko;
|
111 |
|
112 | // @property retina: Boolean
|
113 | // `true` for browsers on a high-resolution "retina" screen or on any screen when browser's display zoom is more than 100%.
|
114 | export var retina = (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1;
|
115 |
|
116 |
|
117 | // @property canvas: Boolean
|
118 | // `true` when the browser supports [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).
|
119 | export var canvas = (function () {
|
120 | return !!document.createElement('canvas').getContext;
|
121 | }());
|
122 |
|
123 | // @property svg: Boolean
|
124 | // `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG).
|
125 | export var svg = !!(document.createElementNS && svgCreate('svg').createSVGRect);
|
126 |
|
127 | // @property vml: Boolean
|
128 | // `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language).
|
129 | export var vml = !svg && (function () {
|
130 | try {
|
131 | var div = document.createElement('div');
|
132 | div.innerHTML = '<v:shape adj="1"/>';
|
133 |
|
134 | var shape = div.firstChild;
|
135 | shape.style.behavior = 'url(#default#VML)';
|
136 |
|
137 | return shape && (typeof shape.adj === 'object');
|
138 |
|
139 | } catch (e) {
|
140 | return false;
|
141 | }
|
142 | }());
|
143 |
|
144 |
|
145 | function userAgentContains(str) {
|
146 | return navigator.userAgent.toLowerCase().indexOf(str) >= 0;
|
147 | }
|