Files
blockly/core/utils/useragent.js
Neil Fraser 90b3f75d82 Remove @author tags (#5601)
Our files are up to a decade old, and have churned so much, that the initial author of the file no longer has much meaning.

Furthermore, this will encourage developers to post to the developer group, rather than emailing Googlers (usually me) directly.
2021-10-15 09:50:46 -07:00

184 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');
const {globalThis} = goog.require('Blockly.utils.global');
/**
* 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;