| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421 | import defaultValue from "./defaultValue.js";import defer from "./defer.js";import defined from "./defined.js";import DeveloperError from "./DeveloperError.js";import Fullscreen from "./Fullscreen.js";let theNavigator;if (typeof navigator !== "undefined") {  theNavigator = navigator;} else {  theNavigator = {};}function extractVersion(versionString) {  const parts = versionString.split(".");  for (let i = 0, len = parts.length; i < len; ++i) {    parts[i] = parseInt(parts[i], 10);  }  return parts;}let isChromeResult;let chromeVersionResult;function isChrome() {  if (!defined(isChromeResult)) {    isChromeResult = false;    // Edge contains Chrome in the user agent too    if (!isEdge()) {      const fields = / Chrome\/([\.0-9]+)/.exec(theNavigator.userAgent);      if (fields !== null) {        isChromeResult = true;        chromeVersionResult = extractVersion(fields[1]);      }    }  }  return isChromeResult;}function chromeVersion() {  return isChrome() && chromeVersionResult;}let isSafariResult;let safariVersionResult;function isSafari() {  if (!defined(isSafariResult)) {    isSafariResult = false;    // Chrome and Edge contain Safari in the user agent too    if (      !isChrome() &&      !isEdge() &&      / Safari\/[\.0-9]+/.test(theNavigator.userAgent)    ) {      const fields = / Version\/([\.0-9]+)/.exec(theNavigator.userAgent);      if (fields !== null) {        isSafariResult = true;        safariVersionResult = extractVersion(fields[1]);      }    }  }  return isSafariResult;}function safariVersion() {  return isSafari() && safariVersionResult;}let isWebkitResult;let webkitVersionResult;function isWebkit() {  if (!defined(isWebkitResult)) {    isWebkitResult = false;    const fields = / AppleWebKit\/([\.0-9]+)(\+?)/.exec(theNavigator.userAgent);    if (fields !== null) {      isWebkitResult = true;      webkitVersionResult = extractVersion(fields[1]);      webkitVersionResult.isNightly = !!fields[2];    }  }  return isWebkitResult;}function webkitVersion() {  return isWebkit() && webkitVersionResult;}let isInternetExplorerResult;let internetExplorerVersionResult;function isInternetExplorer() {  if (!defined(isInternetExplorerResult)) {    isInternetExplorerResult = false;    let fields;    if (theNavigator.appName === "Microsoft Internet Explorer") {      fields = /MSIE ([0-9]{1,}[\.0-9]{0,})/.exec(theNavigator.userAgent);      if (fields !== null) {        isInternetExplorerResult = true;        internetExplorerVersionResult = extractVersion(fields[1]);      }    } else if (theNavigator.appName === "Netscape") {      fields = /Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/.exec(        theNavigator.userAgent      );      if (fields !== null) {        isInternetExplorerResult = true;        internetExplorerVersionResult = extractVersion(fields[1]);      }    }  }  return isInternetExplorerResult;}function internetExplorerVersion() {  return isInternetExplorer() && internetExplorerVersionResult;}let isEdgeResult;let edgeVersionResult;function isEdge() {  if (!defined(isEdgeResult)) {    isEdgeResult = false;    const fields = / Edge\/([\.0-9]+)/.exec(theNavigator.userAgent);    if (fields !== null) {      isEdgeResult = true;      edgeVersionResult = extractVersion(fields[1]);    }  }  return isEdgeResult;}function edgeVersion() {  return isEdge() && edgeVersionResult;}let isFirefoxResult;let firefoxVersionResult;function isFirefox() {  if (!defined(isFirefoxResult)) {    isFirefoxResult = false;    const fields = /Firefox\/([\.0-9]+)/.exec(theNavigator.userAgent);    if (fields !== null) {      isFirefoxResult = true;      firefoxVersionResult = extractVersion(fields[1]);    }  }  return isFirefoxResult;}let isWindowsResult;function isWindows() {  if (!defined(isWindowsResult)) {    isWindowsResult = /Windows/i.test(theNavigator.appVersion);  }  return isWindowsResult;}let isIPadOrIOSResult;function isIPadOrIOS() {  if (!defined(isIPadOrIOSResult)) {    isIPadOrIOSResult =      navigator.platform === "iPhone" ||      navigator.platform === "iPod" ||      navigator.platform === "iPad";  }  return isIPadOrIOSResult;}function firefoxVersion() {  return isFirefox() && firefoxVersionResult;}let hasPointerEvents;function supportsPointerEvents() {  if (!defined(hasPointerEvents)) {    //While navigator.pointerEnabled is deprecated in the W3C specification    //we still need to use it if it exists in order to support browsers    //that rely on it, such as the Windows WebBrowser control which defines    //PointerEvent but sets navigator.pointerEnabled to false.    //Firefox disabled because of https://github.com/CesiumGS/cesium/issues/6372    hasPointerEvents =      !isFirefox() &&      typeof PointerEvent !== "undefined" &&      (!defined(theNavigator.pointerEnabled) || theNavigator.pointerEnabled);  }  return hasPointerEvents;}let imageRenderingValueResult;let supportsImageRenderingPixelatedResult;function supportsImageRenderingPixelated() {  if (!defined(supportsImageRenderingPixelatedResult)) {    const canvas = document.createElement("canvas");    canvas.setAttribute(      "style",      "image-rendering: -moz-crisp-edges;" + "image-rendering: pixelated;"    );    //canvas.style.imageRendering will be undefined, null or an empty string on unsupported browsers.    const tmp = canvas.style.imageRendering;    supportsImageRenderingPixelatedResult = defined(tmp) && tmp !== "";    if (supportsImageRenderingPixelatedResult) {      imageRenderingValueResult = tmp;    }  }  return supportsImageRenderingPixelatedResult;}function imageRenderingValue() {  return supportsImageRenderingPixelated()    ? imageRenderingValueResult    : undefined;}function supportsWebP() {  //>>includeStart('debug', pragmas.debug);  if (!supportsWebP.initialized) {    throw new DeveloperError(      "You must call FeatureDetection.supportsWebP.initialize and wait for the promise to resolve before calling FeatureDetection.supportsWebP"    );  }  //>>includeEnd('debug');  return supportsWebP._result;}supportsWebP._promise = undefined;supportsWebP._result = undefined;supportsWebP.initialize = function () {  // From https://developers.google.com/speed/webp/faq#how_can_i_detect_browser_support_for_webp  if (defined(supportsWebP._promise)) {    return supportsWebP._promise;  }  const supportsWebPDeferred = defer();  supportsWebP._promise = supportsWebPDeferred.promise;  if (isEdge()) {    // Edge's WebP support with WebGL is incomplete.    // See bug report: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/19221241/    supportsWebP._result = false;    supportsWebPDeferred.resolve(supportsWebP._result);    return supportsWebPDeferred.promise;  }  const image = new Image();  image.onload = function () {    supportsWebP._result = image.width > 0 && image.height > 0;    supportsWebPDeferred.resolve(supportsWebP._result);  };  image.onerror = function () {    supportsWebP._result = false;    supportsWebPDeferred.resolve(supportsWebP._result);  };  image.src =    "data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA";  return supportsWebPDeferred.promise;};Object.defineProperties(supportsWebP, {  initialized: {    get: function () {      return defined(supportsWebP._result);    },  },});const typedArrayTypes = [];if (typeof ArrayBuffer !== "undefined") {  typedArrayTypes.push(    Int8Array,    Uint8Array,    Int16Array,    Uint16Array,    Int32Array,    Uint32Array,    Float32Array,    Float64Array  );  if (typeof Uint8ClampedArray !== "undefined") {    typedArrayTypes.push(Uint8ClampedArray);  }  if (typeof Uint8ClampedArray !== "undefined") {    typedArrayTypes.push(Uint8ClampedArray);  }  if (typeof BigInt64Array !== "undefined") {    // eslint-disable-next-line no-undef    typedArrayTypes.push(BigInt64Array);  }  if (typeof BigUint64Array !== "undefined") {    // eslint-disable-next-line no-undef    typedArrayTypes.push(BigUint64Array);  }}/** * A set of functions to detect whether the current browser supports * various features. * * @namespace FeatureDetection */const FeatureDetection = {  isChrome: isChrome,  chromeVersion: chromeVersion,  isSafari: isSafari,  safariVersion: safariVersion,  isWebkit: isWebkit,  webkitVersion: webkitVersion,  isInternetExplorer: isInternetExplorer,  internetExplorerVersion: internetExplorerVersion,  isEdge: isEdge,  edgeVersion: edgeVersion,  isFirefox: isFirefox,  firefoxVersion: firefoxVersion,  isWindows: isWindows,  isIPadOrIOS: isIPadOrIOS,  hardwareConcurrency: defaultValue(theNavigator.hardwareConcurrency, 3),  supportsPointerEvents: supportsPointerEvents,  supportsImageRenderingPixelated: supportsImageRenderingPixelated,  supportsWebP: supportsWebP,  imageRenderingValue: imageRenderingValue,  typedArrayTypes: typedArrayTypes,};/** * Detects whether the current browser supports Basis Universal textures and the web assembly modules needed to transcode them. * * @param {Scene} scene * @returns {Boolean} true if the browser supports web assembly modules and the scene supports Basis Universal textures, false if not. */FeatureDetection.supportsBasis = function (scene) {  return FeatureDetection.supportsWebAssembly() && scene.context.supportsBasis;};/** * Detects whether the current browser supports the full screen standard. * * @returns {Boolean} true if the browser supports the full screen standard, false if not. * * @see Fullscreen * @see {@link http://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html|W3C Fullscreen Living Specification} */FeatureDetection.supportsFullscreen = function () {  return Fullscreen.supportsFullscreen();};/** * Detects whether the current browser supports typed arrays. * * @returns {Boolean} true if the browser supports typed arrays, false if not. * * @see {@link https://tc39.es/ecma262/#sec-typedarray-objects|Typed Array Specification} */FeatureDetection.supportsTypedArrays = function () {  return typeof ArrayBuffer !== "undefined";};/** * Detects whether the current browser supports BigInt64Array typed arrays. * * @returns {Boolean} true if the browser supports BigInt64Array typed arrays, false if not. * * @see {@link https://tc39.es/ecma262/#sec-typedarray-objects|Typed Array Specification} */FeatureDetection.supportsBigInt64Array = function () {  return typeof BigInt64Array !== "undefined";};/** * Detects whether the current browser supports BigUint64Array typed arrays. * * @returns {Boolean} true if the browser supports BigUint64Array typed arrays, false if not. * * @see {@link https://tc39.es/ecma262/#sec-typedarray-objects|Typed Array Specification} */FeatureDetection.supportsBigUint64Array = function () {  return typeof BigUint64Array !== "undefined";};/** * Detects whether the current browser supports BigInt. * * @returns {Boolean} true if the browser supports BigInt, false if not. * * @see {@link https://tc39.es/ecma262/#sec-bigint-objects|BigInt Specification} */FeatureDetection.supportsBigInt = function () {  return typeof BigInt !== "undefined";};/** * Detects whether the current browser supports Web Workers. * * @returns {Boolean} true if the browsers supports Web Workers, false if not. * * @see {@link http://www.w3.org/TR/workers/} */FeatureDetection.supportsWebWorkers = function () {  return typeof Worker !== "undefined";};/** * Detects whether the current browser supports Web Assembly. * * @returns {Boolean} true if the browsers supports Web Assembly, false if not. * * @see {@link https://developer.mozilla.org/en-US/docs/WebAssembly} */FeatureDetection.supportsWebAssembly = function () {  return typeof WebAssembly !== "undefined" && !FeatureDetection.isEdge();};export default FeatureDetection;
 |