From 66be5f0b673714bc7cc72a3b5e437fe277465973 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Thu, 28 Apr 2022 09:09:37 +0700 Subject: [PATCH] add a fix for FF99+ `Array.prototype.includes` broken on sparse arrays --- CHANGELOG.md | 2 +- packages/core-js-compat/src/data.mjs | 3 ++- packages/core-js/modules/es.array.includes.js | 8 +++++++- tests/compat/tests.js | 3 ++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91c7743f5842..650b3bac54bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ## Changelog ##### Unreleased -- Nothing +- Added a fix for FF99+ `Array.prototype.includes` broken on sparse arrays ##### 3.22.2 - 2022.04.21 - Fixed `URLSearchParams` in IE8- that was broken in the previous release diff --git a/packages/core-js-compat/src/data.mjs b/packages/core-js-compat/src/data.mjs index 60091ff4dbe1..121e874a9b43 100644 --- a/packages/core-js-compat/src/data.mjs +++ b/packages/core-js-compat/src/data.mjs @@ -211,7 +211,8 @@ export const data = { 'es.array.includes': { chrome: '53', edge: '14', - firefox: '48', + // FF99+ broken on sparse arrays + // firefox: '48', safari: '10.0', }, 'es.array.index-of': { diff --git a/packages/core-js/modules/es.array.includes.js b/packages/core-js/modules/es.array.includes.js index 01288c2edbd7..8ed177c39f34 100644 --- a/packages/core-js/modules/es.array.includes.js +++ b/packages/core-js/modules/es.array.includes.js @@ -1,11 +1,17 @@ 'use strict'; var $ = require('../internals/export'); var $includes = require('../internals/array-includes').includes; +var fails = require('../internals/fails'); var addToUnscopables = require('../internals/add-to-unscopables'); +// FF99+ bug +var BROKEN_ON_SPARSE = fails(function () { + return !Array(1).includes(); +}); + // `Array.prototype.includes` method // https://tc39.es/ecma262/#sec-array.prototype.includes -$({ target: 'Array', proto: true }, { +$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE }, { includes: function includes(el /* , fromIndex = 0 */) { return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); } diff --git a/tests/compat/tests.js b/tests/compat/tests.js index e03048e60c1b..a98d7af8bb63 100644 --- a/tests/compat/tests.js +++ b/tests/compat/tests.js @@ -352,7 +352,8 @@ GLOBAL.tests = { }, 'es.array.from': SAFE_ITERATION_CLOSING_SUPPORT, 'es.array.includes': function () { - return Array.prototype[Symbol.unscopables].includes; + return Array(1).includes() + && Array.prototype[Symbol.unscopables].includes; }, 'es.array.index-of': function () { try {