Files
blockly/core/utils/useragent.js
Neil Fraser b7cd2e187b chore: Remove Blockly.utils.global (#6120)
The Closure Compiler creates globalThis as a pollyfill.
2022-04-28 12:39:52 -07:00

196 lines
4.1 KiB
JavaScript

/**
* @license
* Copyright 2019 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @fileoverview Useragent detection.
* These methods are not specific to Blockly, and could be factored out into
* a JavaScript framework such as Closure.
*/
'use strict';
/**
* Useragent detection.
* These methods are not specific to Blockly, and could be factored out into
* a JavaScript framework such as Closure.
* @namespace Blockly.utils.userAgent
*/
goog.module('Blockly.utils.userAgent');
/**
* The raw useragent string.
* @type {string}
*/
let rawUserAgent;
/** @type {boolean} */
let isIe;
/** @type {boolean} */
let isEdge;
/** @type {boolean} */
let isJavaFx;
/** @type {boolean} */
let isChrome;
/** @type {boolean} */
let isWebKit;
/** @type {boolean} */
let isGecko;
/** @type {boolean} */
let isAndroid;
/** @type {boolean} */
let isIPad;
/** @type {boolean} */
let isIPod;
/** @type {boolean} */
let isIPhone;
/** @type {boolean} */
let isMac;
/** @type {boolean} */
let isTablet;
/** @type {boolean} */
let isMobile;
(function(raw) {
rawUserAgent = raw;
const rawUpper = rawUserAgent.toUpperCase();
/**
* Case-insensitive test of whether name is in the useragent string.
* @param {string} name Name to test.
* @return {boolean} True if name is present.
*/
function has(name) {
return rawUpper.indexOf(name.toUpperCase()) !== -1;
}
// Browsers. Logic from:
// https://github.com/google/closure-library/blob/master/closure/goog/labs/useragent/browser.js
isIe = has('Trident') || has('MSIE');
isEdge = has('Edge');
// Useragent for JavaFX:
// Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.44
// (KHTML, like Gecko) JavaFX/8.0 Safari/537.44
isJavaFx = has('JavaFX');
isChrome = (has('Chrome') || has('CriOS')) && !isEdge;
// Engines. Logic from:
// https://github.com/google/closure-library/blob/master/closure/goog/labs/useragent/engine.js
isWebKit = has('WebKit') && !isEdge;
isGecko = has('Gecko') && !isWebKit && !isIe && !isEdge;
// Platforms. Logic from:
// https://github.com/google/closure-library/blob/master/closure/goog/labs/useragent/platform.js
// and
// https://github.com/google/closure-library/blob/master/closure/goog/labs/useragent/extra.js
isAndroid = has('Android');
const maxTouchPoints =
globalThis['navigator'] && globalThis['navigator']['maxTouchPoints'];
isIPad = has('iPad') || has('Macintosh') && maxTouchPoints > 0;
isIPod = has('iPod');
isIPhone = has('iPhone') && !isIPad && !isIPod;
isMac = has('Macintosh');
// Devices. Logic from:
// https://github.com/google/closure-library/blob/master/closure/goog/labs/useragent/device.js
isTablet = isIPad || (isAndroid && !has('Mobile')) || has('Silk');
isMobile = !isTablet && (isIPod || isIPhone || isAndroid || has('IEMobile'));
})((globalThis['navigator'] && globalThis['navigator']['userAgent']) || '');
/**
* @const {string}
* @alias Blockly.utils.userAgent.raw
*/
exports.raw = rawUserAgent;
/**
* @const {boolean}
* @alias Blockly.utils.userAgent.IE
*/
exports.IE = isIe;
/**
* @const {boolean}
* @alias Blockly.utils.userAgent.EDGE
*/
exports.EDGE = isEdge;
/**
* @const {boolean}
* @alias Blockly.utils.userAgent.JavaFx
*/
exports.JavaFx = isJavaFx;
/**
* @const {boolean}
* @alias Blockly.utils.userAgent.CHROME
*/
exports.CHROME = isChrome;
/**
* @const {boolean}
* @alias Blockly.utils.userAgent.WEBKIT
*/
exports.WEBKIT = isWebKit;
/**
* @const {boolean}
* @alias Blockly.utils.userAgent.GECKO
*/
exports.GECKO = isGecko;
/**
* @const {boolean}
* @alias Blockly.utils.userAgent.ANDROID
*/
exports.ANDROID = isAndroid;
/**
* @const {boolean}
* @alias Blockly.utils.userAgent.IPAD
*/
exports.IPAD = isIPad;
/**
* @const {boolean}
* @alias Blockly.utils.userAgent.IPOD
*/
exports.IPOD = isIPod;
/**
* @const {boolean}
* @alias Blockly.utils.userAgent.IPHONE
*/
exports.IPHONE = isIPhone;
/**
* @const {boolean}
* @alias Blockly.utils.userAgent.MAC
*/
exports.MAC = isMac;
/**
* @const {boolean}
* @alias Blockly.utils.userAgent.TABLET
*/
exports.TABLET = isTablet;
/**
* @const {boolean}
* @alias Blockly.utils.userAgent.MOBILE
*/
exports.MOBILE = isMobile;