From 3503758599ae451b962afa4e05c8e88dcb0f021a Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Sat, 10 Aug 2019 20:39:04 +0200 Subject: [PATCH] FIX: polyfills String.prototype.repeat for IE (#7994) --- app/assets/javascripts/polyfills.js | 40 +++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/app/assets/javascripts/polyfills.js b/app/assets/javascripts/polyfills.js index 073503317f1..49cc9bef303 100644 --- a/app/assets/javascripts/polyfills.js +++ b/app/assets/javascripts/polyfills.js @@ -316,4 +316,44 @@ if (!Array.from) { })(); } +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat#Polyfill +if (!String.prototype.repeat) { + String.prototype.repeat = function(count) { + "use strict"; + if (this == null) + throw new TypeError("can't convert " + this + " to object"); + + var str = "" + this; + // To convert string to integer. + count = +count; + // Check NaN + if (count != count) count = 0; + + if (count < 0) throw new RangeError("repeat count must be non-negative"); + + if (count == Infinity) + throw new RangeError("repeat count must be less than infinity"); + + count = Math.floor(count); + if (str.length == 0 || count == 0) return ""; + + // Ensuring count is a 31-bit integer allows us to heavily optimize the + // main part. But anyway, most current (August 2014) browsers can't handle + // strings 1 << 28 chars or longer, so: + if (str.length * count >= 1 << 28) + throw new RangeError( + "repeat count must not overflow maximum string size" + ); + + var maxCount = str.length * count; + count = Math.floor(Math.log(count) / Math.log(2)); + while (count) { + str += str; + count--; + } + str += str.substring(0, maxCount - str.length); + return str; + }; +} + /* eslint-enable */