diff --git a/package-lock.json b/package-lock.json index e8413e901b..5b328de1c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -111,6 +111,7 @@ "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", @@ -3875,6 +3876,7 @@ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -4298,6 +4300,7 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.21" @@ -4714,8 +4717,7 @@ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/doctrine": { "version": "0.0.1", @@ -5239,6 +5241,7 @@ "integrity": "sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.29.1", "@typescript-eslint/types": "8.29.1", @@ -5820,6 +5823,7 @@ "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6994,9 +6998,9 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -7056,6 +7060,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -8342,6 +8347,26 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-europe-js": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/detect-europe-js/-/detect-europe-js-0.1.2.tgz", + "integrity": "sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "license": "MIT" + }, "node_modules/detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", @@ -8369,7 +8394,8 @@ "version": "0.0.1425554", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz", "integrity": "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==", - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/diff": { "version": "5.2.0", @@ -8827,6 +8853,7 @@ "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -11404,6 +11431,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-standalone-pwa": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-standalone-pwa/-/is-standalone-pwa-0.1.1.tgz", + "integrity": "sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "license": "MIT" + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -11907,9 +11954,9 @@ } }, "node_modules/koa": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.1.tgz", - "integrity": "sha512-umfX9d3iuSxTQP4pnzLOz0HKnPg0FaUUIKcye2lOiz3KPu1Y3M3xlz76dISdFPQs37P9eJz1wUpcTS6KDPn9fA==", + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.3.tgz", + "integrity": "sha512-zPPuIt+ku1iCpFBRwseMcPYQ1cJL8l60rSmKeOuGfOXyE6YnTBmf2aEFNL2HQGrD0cPcLO/t+v9RTgC+fwEh/g==", "dev": true, "license": "MIT", "dependencies": { @@ -13096,9 +13143,9 @@ } }, "node_modules/npm-run-all/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -13906,13 +13953,13 @@ } }, "node_modules/playwright": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.1.tgz", - "integrity": "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", + "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.51.1" + "playwright-core": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -13925,9 +13972,9 @@ } }, "node_modules/playwright-core": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.1.tgz", - "integrity": "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", + "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -15211,7 +15258,8 @@ "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/redux-devtools-core": { "version": "0.2.1", @@ -15766,6 +15814,7 @@ "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.7" }, @@ -16970,9 +17019,9 @@ } }, "node_modules/tar-fs": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", - "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "license": "MIT", "dependencies": { "pump": "^3.0.0", @@ -17230,7 +17279,8 @@ "version": "0.174.0", "resolved": "https://registry.npmjs.org/three/-/three-0.174.0.tgz", "integrity": "sha512-p+WG3W6Ov74alh3geCMkGK9NWuT62ee21cV3jEnun201zodVF4tCE5aZa2U122/mkLRmhJJUQmLLW1BH00uQJQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/through2": { "version": "2.0.5", @@ -17528,6 +17578,7 @@ "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -17546,6 +17597,26 @@ "node": ">=8" } }, + "node_modules/ua-is-frozen": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ua-is-frozen/-/ua-is-frozen-0.1.2.tgz", + "integrity": "sha512-RwKDW2p3iyWn4UbaxpP2+VxwqXh0jpvdxsYpZ5j/MLLiQOfbsV5shpgQiw93+KMYQPcteeMQ289MaAFzs3G9pw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "license": "MIT" + }, "node_modules/ua-parser-js": { "version": "0.7.40", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz", @@ -18680,7 +18751,8 @@ "license": "Apache-2.0", "dependencies": { "@monogrid/gainmap-js": "^3.1.0", - "lit": "^3.2.1" + "lit": "^3.2.1", + "ua-parser-js": "^2.0.6" }, "devDependencies": { "@rollup/plugin-commonjs": "^28.0.3", @@ -18754,6 +18826,37 @@ "@google/model-viewer": "^4.1.0" } }, + "packages/model-viewer/node_modules/ua-parser-js": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-2.0.6.tgz", + "integrity": "sha512-EmaxXfltJaDW75SokrY4/lXMrVyXomE/0FpIIqP2Ctic93gK7rlme55Cwkz8l3YZ6gqf94fCU7AnIkidd/KXPg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "AGPL-3.0-or-later", + "dependencies": { + "detect-europe-js": "^0.1.2", + "is-standalone-pwa": "^0.1.1", + "ua-is-frozen": "^0.1.2" + }, + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, "packages/modelviewer.dev": { "name": "@google/model-viewer-docs", "version": "0.0.1", diff --git a/packages/model-viewer/package.json b/packages/model-viewer/package.json index f0cf30ccd7..0ee2b11379 100644 --- a/packages/model-viewer/package.json +++ b/packages/model-viewer/package.json @@ -83,8 +83,9 @@ "3d" ], "dependencies": { + "@monogrid/gainmap-js": "^3.1.0", "lit": "^3.2.1", - "@monogrid/gainmap-js": "^3.1.0" + "ua-parser-js": "^2.0.6" }, "peerDependencies": { "three": "^0.174.0" @@ -93,13 +94,14 @@ "@rollup/plugin-commonjs": "^28.0.3", "@rollup/plugin-node-resolve": "^16.0.0", "@rollup/plugin-replace": "^6.0.2", + "@rollup/plugin-swc": "^0.4.0", + "@rollup/plugin-terser": "^0.4.4", + "@swc/core": "^1.11.8", "@types/mocha": "^10.0.10", "@types/pngjs": "^6.0.5", "@types/three": "^0.174.0", "@ungap/event-target": "^0.2.4", "@web/test-runner": "^0.20.0", - "@rollup/plugin-swc": "^0.4.0", - "@swc/core": "^1.11.8", "@web/test-runner-playwright": "^0.11.0", "chai": "^5.2.0", "http-server": "^14.1.1", @@ -109,11 +111,10 @@ "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-dts": "^6.1.1", "rollup-plugin-polyfill": "^4.2.0", - "@rollup/plugin-terser": "^0.4.4", - "typescript": "5.8.2", - "three": "^0.174.0" + "three": "^0.174.0", + "typescript": "5.8.2" }, "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/model-viewer/src/constants.ts b/packages/model-viewer/src/constants.ts index aeb57e1ad3..ccbf4b51f2 100644 --- a/packages/model-viewer/src/constants.ts +++ b/packages/model-viewer/src/constants.ts @@ -16,88 +16,51 @@ // NOTE(cdata): The HAS_WEBXR_* constants can be enabled in Chrome by turning on // the appropriate flags. However, just because we have the API does not // guarantee that AR will work. -export const HAS_WEBXR_DEVICE_API = navigator.xr != null && - (self as any).XRSession != null && navigator.xr.isSessionSupported != null; -export const HAS_WEBXR_HIT_TEST_API = HAS_WEBXR_DEVICE_API && - (self as any).XRSession.prototype.requestHitTestSource != null; +import { UAParser } from 'ua-parser-js'; -export const HAS_RESIZE_OBSERVER = self.ResizeObserver != null; +const { browser, os } = UAParser(); -export const HAS_INTERSECTION_OBSERVER = self.IntersectionObserver != null; +export const IS_ANDROID = os.is('android'); +export const IS_IOS = os.is('ios'); +export const IS_CHROMEOS = os.is('chrome os') || os.is('chromium os'); +export const IS_FIREFOX = browser.is('firefox'); +export const IS_SAFARI = browser.is('safari'); +export const IS_OCULUS = browser.is('oculus browser'); +export const IS_IOS_CHROME = IS_IOS && browser.is('chrome'); +export const IS_IOS_SAFARI = IS_IOS && IS_SAFARI; -export const IS_WEBXR_AR_CANDIDATE = HAS_WEBXR_HIT_TEST_API; +export const IS_MOBILE = IS_ANDROID || IS_IOS; -export const IS_MOBILE = (() => { - const userAgent = - navigator.userAgent || navigator.vendor || (self as any).opera; - let check = false; - // eslint-disable-next-line - if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i - .test(userAgent) || - /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i - .test(userAgent.substr(0, 4))) { - check = true; - } - return check; -})(); +export const IS_SCENEVIEWER_CANDIDATE = IS_ANDROID && !IS_FIREFOX && !IS_OCULUS; -export const IS_CHROMEOS = /\bCrOS\b/.test(navigator.userAgent); +export const HAS_WEBXR_DEVICE_API = navigator.xr != null && + (self as any).XRSession != null && navigator.xr.isSessionSupported != null; -export const IS_ANDROID = /android/i.test(navigator.userAgent); +export const HAS_WEBXR_HIT_TEST_API = HAS_WEBXR_DEVICE_API && + (self as any).XRSession.prototype.requestHitTestSource != null; -// Prior to iOS 13, detecting iOS Safari was relatively straight-forward. -// As of iOS 13, Safari on iPad (in its default configuration) reports the same -// user-agent string as Safari on desktop MacOS. Strictly speaking, we only care -// about iOS for the purposes if selecting for cases where Quick Look is known -// to be supported. However, for API correctness purposes, we must rely on -// known, detectable signals to distinguish iOS Safari from MacOS Safari. At the -// time of this writing, there are no non-iOS/iPadOS Apple devices with -// multi-touch displays. -// @see https://stackoverflow.com/questions/57765958/how-to-detect-ipad-and-ipad-os-version-in-ios-13-and-up -// @see https://forums.developer.apple.com/thread/119186 -// @see https://github.com/google/model-viewer/issues/758 -export const IS_IOS = - (/iPad|iPhone|iPod/.test(navigator.userAgent) && !(self as any).MSStream) || - (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1); +export const HAS_RESIZE_OBSERVER = typeof ResizeObserver !== 'undefined'; -// @see https://developer.chrome.com/multidevice/user-agent -export const IS_SAFARI = /Safari\//.test(navigator.userAgent); -export const IS_FIREFOX = /firefox/i.test(navigator.userAgent); -export const IS_OCULUS = /OculusBrowser/.test(navigator.userAgent); -export const IS_IOS_CHROME = IS_IOS && /CriOS\//.test(navigator.userAgent); -export const IS_IOS_SAFARI = IS_IOS && IS_SAFARI; +export const HAS_INTERSECTION_OBSERVER = + typeof IntersectionObserver !== 'undefined'; -export const IS_SCENEVIEWER_CANDIDATE = IS_ANDROID && !IS_FIREFOX && !IS_OCULUS; +export const IS_WEBXR_AR_CANDIDATE = HAS_WEBXR_HIT_TEST_API; -// Extend Window type with webkit property, -// required to check if iOS is running within a WKWebView browser instance. declare global { interface Window { webkit?: any; } } -export const IS_WKWEBVIEW = - Boolean(window.webkit && window.webkit.messageHandlers); +export const IS_WKWEBVIEW = !!(window.webkit && window.webkit.messageHandlers); -// If running in iOS Safari proper, and not within a WKWebView component -// instance, check for ARQL feature support. Otherwise, if running in a -// WKWebView instance, check for known ARQL compatible iOS browsers, including: -// Chrome (CriOS), Edge (EdgiOS), Firefox (FxiOS), Google App (GSA), DuckDuckGo -// (DuckDuckGo). All other iOS browsers / apps will fail by default. export const IS_AR_QUICKLOOK_CANDIDATE = (() => { - if (IS_IOS) { - if (!IS_WKWEBVIEW) { - const tempAnchor = document.createElement('a'); - return Boolean( - tempAnchor.relList && tempAnchor.relList.supports && - tempAnchor.relList.supports('ar')); - } else { - return Boolean(/CriOS\/|EdgiOS\/|FxiOS\/|GSA\/|DuckDuckGo\//.test( - navigator.userAgent)); - } - } else { - return false; + if (IS_IOS && !IS_WKWEBVIEW) { + const tempAnchor = document.createElement('a'); + return Boolean( + tempAnchor.relList && tempAnchor.relList.supports && + tempAnchor.relList.supports('ar')); } -})(); + return false; +})(); \ No newline at end of file