Skip to content

Commit ce6673a

Browse files
committed
forced replacement of Array#{ reduce, reduceRight } in Chrome 80-82, #766
https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
1 parent 8f75f24 commit ce6673a

File tree

9 files changed

+27
-13
lines changed

9 files changed

+27
-13
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
- Fixed microtask implementation in engines with `MutationObserver`, but without `document`, [#865](https://github.com/zloirock/core-js/issues/865), [#866](https://github.com/zloirock/core-js/issues/866)
1111
- Fixed `core-js-builder` with an empty (after the targets engines or another filtration) modules list, [#822](https://github.com/zloirock/core-js/issues/822)
1212
- Added a workaround for 3rd party `Reflect.set` polyfill bug, [#847](https://github.com/zloirock/core-js/issues/847)
13+
- Forced replacement of `Array#{ reduce, reduceRight }` in Chrome 80-82 because of [a bug](https://bugs.chromium.org/p/chromium/issues/detail?id=1049982), [#766](https://github.com/zloirock/core-js/issues/766)
1314
- Updated compat data:
1415
- Chrome up to 86
1516
- FF up to 82

packages/core-js-compat/src/data.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,15 +202,17 @@ const data = {
202202
safari: '9.0',
203203
},
204204
'es.array.reduce': {
205-
chrome: '48',
205+
chrome: '83', // https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
206206
edge: '15',
207207
firefox: '50',
208+
node: '6.0', // ^^^
208209
safari: '9.0',
209210
},
210211
'es.array.reduce-right': {
211-
chrome: '48',
212+
chrome: '83', // https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
212213
edge: '15',
213214
firefox: '50',
215+
node: '6.0', // ^^^
214216
safari: '9.0',
215217
},
216218
'es.array.reverse': {
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
var classof = require('../internals/classof-raw');
2+
var global = require('../internals/global');
3+
4+
module.exports = classof(global.process) == 'process';

packages/core-js/internals/microtask.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
var global = require('../internals/global');
22
var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
3-
var classof = require('../internals/classof-raw');
43
var macrotask = require('../internals/task').set;
54
var IS_IOS = require('../internals/engine-is-ios');
5+
var IS_NODE = require('../internals/engine-is-node');
66

77
var MutationObserver = global.MutationObserver || global.WebKitMutationObserver;
88
var document = global.document;
99
var process = global.process;
1010
var Promise = global.Promise;
11-
var IS_NODE = classof(process) == 'process';
1211
// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`
1312
var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');
1413
var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;

packages/core-js/internals/task.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
var global = require('../internals/global');
22
var fails = require('../internals/fails');
3-
var classof = require('../internals/classof-raw');
43
var bind = require('../internals/function-bind-context');
54
var html = require('../internals/html');
65
var createElement = require('../internals/document-create-element');
76
var IS_IOS = require('../internals/engine-is-ios');
7+
var IS_NODE = require('../internals/engine-is-node');
88

99
var location = global.location;
1010
var set = global.setImmediate;
@@ -58,7 +58,7 @@ if (!set || !clear) {
5858
delete queue[id];
5959
};
6060
// Node.js 0.8-
61-
if (classof(process) == 'process') {
61+
if (IS_NODE) {
6262
defer = function (id) {
6363
process.nextTick(runner(id));
6464
};

packages/core-js/modules/es.array.reduce-right.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,19 @@ var $ = require('../internals/export');
33
var $reduceRight = require('../internals/array-reduce').right;
44
var arrayMethodIsStrict = require('../internals/array-method-is-strict');
55
var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
6+
var CHROME_VERSION = require('../internals/engine-v8-version');
7+
var IS_NODE = require('../internals/engine-is-node');
68

79
var STRICT_METHOD = arrayMethodIsStrict('reduceRight');
810
// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method
911
var USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });
12+
// Chrome 80-82 has a critical bug
13+
// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
14+
var CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;
1015

1116
// `Array.prototype.reduceRight` method
1217
// https://tc39.github.io/ecma262/#sec-array.prototype.reduceright
13-
$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {
18+
$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH || CHROME_BUG }, {
1419
reduceRight: function reduceRight(callbackfn /* , initialValue */) {
1520
return $reduceRight(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
1621
}

packages/core-js/modules/es.array.reduce.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,18 @@ var $ = require('../internals/export');
33
var $reduce = require('../internals/array-reduce').left;
44
var arrayMethodIsStrict = require('../internals/array-method-is-strict');
55
var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
6+
var CHROME_VERSION = require('../internals/engine-v8-version');
7+
var IS_NODE = require('../internals/engine-is-node');
68

79
var STRICT_METHOD = arrayMethodIsStrict('reduce');
810
var USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });
11+
// Chrome 80-82 has a critical bug
12+
// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
13+
var CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;
914

1015
// `Array.prototype.reduce` method
1116
// https://tc39.github.io/ecma262/#sec-array.prototype.reduce
12-
$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {
17+
$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH || CHROME_BUG }, {
1318
reduce: function reduce(callbackfn /* , initialValue */) {
1419
return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
1520
}

packages/core-js/modules/es.promise.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ var setSpecies = require('../internals/set-species');
1111
var isObject = require('../internals/is-object');
1212
var aFunction = require('../internals/a-function');
1313
var anInstance = require('../internals/an-instance');
14-
var classof = require('../internals/classof-raw');
1514
var inspectSource = require('../internals/inspect-source');
1615
var iterate = require('../internals/iterate');
1716
var checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');
@@ -25,6 +24,7 @@ var perform = require('../internals/perform');
2524
var InternalStateModule = require('../internals/internal-state');
2625
var isForced = require('../internals/is-forced');
2726
var wellKnownSymbol = require('../internals/well-known-symbol');
27+
var IS_NODE = require('../internals/engine-is-node');
2828
var V8_VERSION = require('../internals/engine-v8-version');
2929

3030
var SPECIES = wellKnownSymbol('species');
@@ -39,7 +39,6 @@ var process = global.process;
3939
var $fetch = getBuiltIn('fetch');
4040
var newPromiseCapability = newPromiseCapabilityModule.f;
4141
var newGenericPromiseCapability = newPromiseCapability;
42-
var IS_NODE = classof(process) == 'process';
4342
var DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);
4443
var UNHANDLED_REJECTION = 'unhandledrejection';
4544
var REJECTION_HANDLED = 'rejectionhandled';
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
var $ = require('../internals/export');
22
var global = require('../internals/global');
33
var microtask = require('../internals/microtask');
4-
var classof = require('../internals/classof-raw');
4+
var IS_NODE = require('../internals/engine-is-node');
55

66
var process = global.process;
7-
var isNode = classof(process) == 'process';
87

98
// `queueMicrotask` method
109
// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-queuemicrotask
1110
$({ global: true, enumerable: true, noTargetGet: true }, {
1211
queueMicrotask: function queueMicrotask(fn) {
13-
var domain = isNode && process.domain;
12+
var domain = IS_NODE && process.domain;
1413
microtask(domain ? domain.bind(fn) : fn);
1514
}
1615
});

0 commit comments

Comments
 (0)