From 978aaddc54bb78a304d3541d5bb09eb9a1cea2ab Mon Sep 17 00:00:00 2001 From: Jackie Chan Date: Tue, 7 May 2024 09:58:21 -0700 Subject: [PATCH] fix(polyfill): Remove IE11 polyfills (#1515) * fix(polyfill): Remove IE11 polyfills * fix(polyfill): Remove additional IE11 polyfill * fix(polyfill): Remove unneeded polyfills * fix(polyfill): Remove polyfill.js --- babel.config.js | 1 - src/lib/Preview.js | 1 - src/lib/__tests__/Preview-test.js | 4 + src/lib/polyfill.js | 411 ------------------------------ 4 files changed, 4 insertions(+), 413 deletions(-) delete mode 100644 src/lib/polyfill.js diff --git a/babel.config.js b/babel.config.js index d39f4685d..950ba191d 100644 --- a/babel.config.js +++ b/babel.config.js @@ -39,7 +39,6 @@ module.exports = api => { exclude: [ '**/*-test.js', 'build/**', - 'src/lib/polyfill.js', 'src/lib/browser.js', 'src/lib/viewers/box3d/model3d/Model3DAnimationClipsPullup.js', 'src/lib/viewers/box3d/model3d/model3DSettingsPullup.js', diff --git a/src/lib/Preview.js b/src/lib/Preview.js index afeb4bb0f..58f2eae3e 100644 --- a/src/lib/Preview.js +++ b/src/lib/Preview.js @@ -1,5 +1,4 @@ /* eslint-disable import/first */ -import './polyfill'; import EventEmitter from 'events'; import cloneDeep from 'lodash/cloneDeep'; import throttle from 'lodash/throttle'; diff --git a/src/lib/__tests__/Preview-test.js b/src/lib/__tests__/Preview-test.js index ab1c17630..08e229dd2 100644 --- a/src/lib/__tests__/Preview-test.js +++ b/src/lib/__tests__/Preview-test.js @@ -50,6 +50,10 @@ describe('lib/Preview', () => { preview.logger = new Logger(); stubs = {}; stubs.api = new Api(); + window.PerformanceObserver = jest.fn(() => ({ + disconnect: jest.fn(), + observe: jest.fn(), + })); }); afterEach(() => { diff --git a/src/lib/polyfill.js b/src/lib/polyfill.js deleted file mode 100644 index 3fc3f7e23..000000000 --- a/src/lib/polyfill.js +++ /dev/null @@ -1,411 +0,0 @@ -/* eslint-disable */ -(function() { - var testObject = {}; - - if (!(Object.setPrototypeOf || testObject.__proto__)) { - var nativeGetPrototypeOf = Object.getPrototypeOf; - - Object.getPrototypeOf = function(object) { - if (object.__proto__) { - return object.__proto__; - } else { - return nativeGetPrototypeOf.call(Object, object); - } - }; - } -})(); - -if (typeof Object.assign != 'function') { - (function() { - Object.assign = function(target) { - 'use strict'; - if (target === undefined || target === null) { - throw new TypeError('Cannot convert undefined or null to object'); - } - - var output = Object(target); - for (var index = 1; index < arguments.length; index += 1) { - var source = arguments[index]; - if (source !== undefined && source !== null) { - for (var nextKey in source) { - if (source.hasOwnProperty(nextKey)) { - output[nextKey] = source[nextKey]; - } - } - } - } - return output; - }; - })(); -} - -// https://tc39.github.io/ecma262/#sec-array.prototype.find -if (!Array.prototype.find) { - Object.defineProperty(Array.prototype, 'find', { - configurable: true, - enumerable: false, - writable: true, - value: function(predicate) { - // 1. Let O be ? ToObject(this value). - if (this == null) { - throw new TypeError('"this" is null or not defined'); - } - - var o = Object(this); - - // 2. Let len be ? ToLength(? Get(O, "length")). - var len = o.length >>> 0; - - // 3. If IsCallable(predicate) is false, throw a TypeError exception. - if (typeof predicate !== 'function') { - throw new TypeError('predicate must be a function'); - } - - // 4. If thisArg was supplied, let T be thisArg; else let T be undefined. - var thisArg = arguments[1]; - - // 5. Let k be 0. - var k = 0; - - // 6. Repeat, while k < len - while (k < len) { - // a. Let Pk be ! ToString(k). - // b. Let kValue be ? Get(O, Pk). - // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)). - // d. If testResult is true, return kValue. - var kValue = o[k]; - if (predicate.call(thisArg, kValue, k, o)) { - return kValue; - } - // e. Increase k by 1. - k++; - } - - // 7. Return undefined. - return undefined; - }, - }); -} - -// https://tc39.github.io/ecma262/#sec-array.prototype.findIndex -if (!Array.prototype.findIndex) { - Object.defineProperty(Array.prototype, 'findIndex', { - configurable: true, - enumerable: false, - writable: true, - value: function(predicate) { - // 1. Let O be ? ToObject(this value). - if (this == null) { - throw new TypeError('"this" is null or not defined'); - } - - var o = Object(this); - - // 2. Let len be ? ToLength(? Get(O, "length")). - var len = o.length >>> 0; - - // 3. If IsCallable(predicate) is false, throw a TypeError exception. - if (typeof predicate !== 'function') { - throw new TypeError('predicate must be a function'); - } - - // 4. If thisArg was supplied, let T be thisArg; else let T be undefined. - var thisArg = arguments[1]; - - // 5. Let k be 0. - var k = 0; - - // 6. Repeat, while k < len - while (k < len) { - // a. Let Pk be ! ToString(k). - // b. Let kValue be ? Get(O, Pk). - // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)). - // d. If testResult is true, return k. - var kValue = o[k]; - if (predicate.call(thisArg, kValue, k, o)) { - return k; - } - // e. Increase k by 1. - k++; - } - - // 7. Return -1. - return -1; - }, - }); -} - -// https://tc39.github.io/ecma262/#sec-array.prototype.includes -if (!Array.prototype.includes) { - Object.defineProperty(Array.prototype, 'includes', { - configurable: true, - enumerable: false, - writable: true, - value: function(searchElement, fromIndex) { - // 1. Let O be ? ToObject(this value). - if (this == null) { - throw new TypeError('"this" is null or not defined'); - } - - var o = Object(this); - - // 2. Let len be ? ToLength(? Get(O, "length")). - var len = o.length >>> 0; - - // 3. If len is 0, return false. - if (len === 0) { - return false; - } - - // 4. Let n be ? ToInteger(fromIndex). - // (If fromIndex is undefined, this step produces the value 0.) - var n = fromIndex | 0; - - // 5. If n ≥ 0, then - // a. Let k be n. - // 6. Else n < 0, - // a. Let k be len + n. - // b. If k < 0, let k be 0. - var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); - - function sameValueZero(x, y) { - return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y)); - } - - // 7. Repeat, while k < len - while (k < len) { - // a. Let elementK be the result of ? Get(O, ! ToString(k)). - // b. If SameValueZero(searchElement, elementK) is true, return true. - // c. Increase k by 1. - if (sameValueZero(o[k], searchElement)) { - return true; - } - k++; - } - - // 8. Return false - return false; - }, - }); -} - -if (!String.prototype.endsWith) { - Object.defineProperty(String.prototype, 'endsWith', { - configurable: true, - enumerable: false, - writable: true, - value: function(searchString, position) { - var subjectString = this.toString(); - if ( - typeof position !== 'number' || - !isFinite(position) || - Math.floor(position) !== position || - position > subjectString.length - ) { - position = subjectString.length; - } - position -= searchString.length; - var lastIndex = subjectString.indexOf(searchString, position); - return lastIndex !== -1 && lastIndex === position; - }, - }); -} - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN -Number.isNaN = - Number.isNaN || - function(value) { - return value !== value; - }; - -// Reflect.construct polyfill for IE11, adapted from -// https://github.com/zloirock/core-js/blob/master/modules/es6.reflect.construct.js -(function() { - function aFunction(it) { - if (typeof it != 'function') throw TypeError(it + ' is not a function!'); - return it; - } - function isObject(it) { - return typeof it === 'object' ? it !== null : typeof it === 'function'; - } - function anObject(it) { - if (!isObject(it)) throw TypeError(it + ' is not an object!'); - return it; - } - function fails(exec) { - try { - return !!exec(); - } catch (e) { - return true; - } - } - var rConstruct = (typeof Reflect !== 'undefined' ? Reflect : {}).construct; - - // MS Edge supports only 2 arguments and argumentsList argument is optional - // FF Nightly sets third argument as `new.target`, but does not create `this` from it - var NEW_TARGET_BUG = fails(function() { - function F() { - /* empty */ - } - return !( - rConstruct( - function() { - /* empty */ - }, - [], - F, - ) instanceof F - ); - }); - var ARGS_BUG = !fails(function() { - rConstruct(function() { - /* empty */ - }); - }); - function construct(Target, args /* , newTarget */) { - aFunction(Target); - anObject(args); - var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]); - if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget); - if (Target == newTarget) { - // w/o altered newTarget, optimization for 0-4 arguments - switch (args.length) { - case 0: - return new Target(); - case 1: - return new Target(args[0]); - case 2: - return new Target(args[0], args[1]); - case 3: - return new Target(args[0], args[1], args[2]); - case 4: - return new Target(args[0], args[1], args[2], args[3]); - } - // w/o altered newTarget, lot of arguments case - var $args = [null]; - $args.push.apply($args, args); - return new (Function.bind.apply(Target, $args))(); - } - // with altered newTarget, not support built-in constructors - var proto = newTarget.prototype; - var instance = Object.create(isObject(proto) ? proto : Object.prototype); - var result = Function.apply.call(Target, instance, args); - return isObject(result) ? result : instance; - } - - if (typeof Reflect !== 'undefined') { - Reflect.construct = construct; - } else { - Reflect = { - construct, - }; - } -})(); - -// Production steps of ECMA-262, Edition 6, 22.1.2.1 -if (!Array.from) { - Array.from = (function() { - var toStr = Object.prototype.toString; - var isCallable = function(fn) { - return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; - }; - var toInteger = function(value) { - var number = Number(value); - if (isNaN(number)) { - return 0; - } - if (number === 0 || !isFinite(number)) { - return number; - } - return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); - }; - var maxSafeInteger = Math.pow(2, 53) - 1; - var toLength = function(value) { - var len = toInteger(value); - return Math.min(Math.max(len, 0), maxSafeInteger); - }; - - // The length property of the from method is 1. - return function from(arrayLike /*, mapFn, thisArg */) { - // 1. Let C be the this value. - var C = this; - - // 2. Let items be ToObject(arrayLike). - var items = Object(arrayLike); - - // 3. ReturnIfAbrupt(items). - if (arrayLike == null) { - throw new TypeError('Array.from requires an array-like object - not null or undefined'); - } - - // 4. If mapfn is undefined, then let mapping be false. - var mapFn = arguments.length > 1 ? arguments[1] : void undefined; - var T; - if (typeof mapFn !== 'undefined') { - // 5. else - // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. - if (!isCallable(mapFn)) { - throw new TypeError('Array.from: when provided, the second argument must be a function'); - } - - // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. - if (arguments.length > 2) { - T = arguments[2]; - } - } - - // 10. Let lenValue be Get(items, "length"). - // 11. Let len be ToLength(lenValue). - var len = toLength(items.length); - - // 13. If IsConstructor(C) is true, then - // 13. a. Let A be the result of calling the [[Construct]] internal method - // of C with an argument list containing the single item len. - // 14. a. Else, Let A be ArrayCreate(len). - var A = isCallable(C) ? Object(new C(len)) : new Array(len); - - // 16. Let k be 0. - var k = 0; - // 17. Repeat, while k < len… (also steps a - h) - var kValue; - while (k < len) { - kValue = items[k]; - if (mapFn) { - A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); - } else { - A[k] = kValue; - } - k += 1; - } - // 18. Let putStatus be Put(A, "length", len, true). - A.length = len; - // 20. Return A. - return A; - }; - })(); -} - -// startsWith polyfill for IE 11 -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith -if (!String.prototype.startsWith) { - String.prototype.startsWith = function(search, pos) { - return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; - }; -} - -// NodeList.prototype.forEach polyfill for IE11 -// https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach -if (window.NodeList && !NodeList.prototype.forEach) { - NodeList.prototype.forEach = Array.prototype.forEach; -} - -// PerformanceObserver no-op polyfill for IE11 and Edge (not supported) -if (!window.PerformanceObserver) { - window.PerformanceObserver = function PerformanceObserverNoop() { - return { - disconnect: () => {}, - observe: () => {}, - }; - }; -} -/* eslint-enable */