Reviewers: danno, rossberg, arv,
Description:
Don't expose Array.prototype.values as it breaks webcompat
Some versions of Outlook Web Access test for the existence of a 'values'
property on Array instances, so adding the 'values' iterator to the
prototype
(even with @@unscopeables) causes breakage.
This matches Gecko: they ship Array.prototype.{keys,entries} but
not 'values'.
BUG=409858
Please review this at https://codereview.chromium.org/647703003/
Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+20, -24 lines):
M src/array.js
M src/array-iterator.js
M test/mjsunit/es6/arguments-iterator.js
M test/mjsunit/es6/array-iterator.js
M test/mjsunit/es6/typed-array-iterator.js
Index: src/array-iterator.js
diff --git a/src/array-iterator.js b/src/array-iterator.js
index
82779bc22872f60a4ff6cbf08909d10822d660ec..5ced9da17cf5f654bd27e7031734743277260054
100644
--- a/src/array-iterator.js
+++ b/src/array-iterator.js
@@ -120,8 +120,8 @@ function ExtendArrayPrototype() {
%CheckIsBootstrapping();
InstallFunctions($Array.prototype, DONT_ENUM, $Array(
+ // No 'values' since it breaks webcompat: http://crbug.com/409858
'entries', ArrayEntries,
- 'values', ArrayValues,
'keys', ArrayKeys
));
Index: src/array.js
diff --git a/src/array.js b/src/array.js
index
b6f3a89d698fee679b4ae1a6e9c5c2eb9d8da969..35fd54540d0424ca4162f27523aa044317988e0b
100644
--- a/src/array.js
+++ b/src/array.js
@@ -1499,7 +1499,6 @@ function SetUpArray() {
find: true,
findIndex: true,
keys: true,
- values: true,
};
%AddNamedProperty($Array.prototype, symbolUnscopables, unscopables,
DONT_ENUM | READ_ONLY);
Index: test/mjsunit/es6/arguments-iterator.js
diff --git a/test/mjsunit/es6/arguments-iterator.js
b/test/mjsunit/es6/arguments-iterator.js
index
a65bf8bad5d6350110e3397ab9deec60a2cde998..32d4b11ee1f58427dca47bfc6a8496ad3f3e8c8b
100644
--- a/test/mjsunit/es6/arguments-iterator.js
+++ b/test/mjsunit/es6/arguments-iterator.js
@@ -16,8 +16,8 @@ function TestDirectArgumentsIteratorProperty() {
assertTrue(descriptor.writable);
assertFalse(descriptor.enumerable);
assertTrue(descriptor.configurable);
- assertEquals(descriptor.value, [].values);
- assertEquals(arguments[Symbol.iterator], [].values);
+ assertEquals(descriptor.value, [][Symbol.iterator]);
+ assertEquals(arguments[Symbol.iterator], [][Symbol.iterator]);
}
TestDirectArgumentsIteratorProperty();
@@ -26,7 +26,7 @@ function TestIndirectArgumentsIteratorProperty() {
var o = arguments;
assertTrue(o.hasOwnProperty(Symbol.iterator));
assertFalse(o.propertyIsEnumerable(Symbol.iterator));
- assertEquals(o[Symbol.iterator], [].values);
+ assertEquals(o[Symbol.iterator], [][Symbol.iterator]);
}
TestIndirectArgumentsIteratorProperty();
@@ -204,27 +204,27 @@ function TestArgumentsAsProto() {
"use strict";
var o = {__proto__:arguments};
- assertSame([].values, o[Symbol.iterator]);
+ assertSame([][Symbol.iterator], o[Symbol.iterator]);
// Make o dict-mode.
%OptimizeObjectForAddingMultipleProperties(o, 0);
assertFalse(o.hasOwnProperty(Symbol.iterator));
- assertSame([].values, o[Symbol.iterator]);
+ assertSame([][Symbol.iterator], o[Symbol.iterator]);
o[Symbol.iterator] = 10;
assertTrue(o.hasOwnProperty(Symbol.iterator));
assertEquals(10, o[Symbol.iterator]);
- assertSame([].values, arguments[Symbol.iterator]);
+ assertSame([][Symbol.iterator], arguments[Symbol.iterator]);
// Frozen o.
o = Object.freeze({__proto__:arguments});
- assertSame([].values, o[Symbol.iterator]);
+ assertSame([][Symbol.iterator], o[Symbol.iterator]);
assertFalse(o.hasOwnProperty(Symbol.iterator));
- assertSame([].values, o[Symbol.iterator]);
+ assertSame([][Symbol.iterator], o[Symbol.iterator]);
// This should throw, but currently it doesn't, because
// ExecutableAccessorInfo callbacks don't see the current strict mode.
// See note in accessors.cc:SetPropertyOnInstanceIfInherited.
o[Symbol.iterator] = 10;
assertFalse(o.hasOwnProperty(Symbol.iterator));
- assertEquals([].values, o[Symbol.iterator]);
- assertSame([].values, arguments[Symbol.iterator]);
+ assertEquals([][Symbol.iterator], o[Symbol.iterator]);
+ assertSame([][Symbol.iterator], arguments[Symbol.iterator]);
}
TestArgumentsAsProto();
Index: test/mjsunit/es6/array-iterator.js
diff --git a/test/mjsunit/es6/array-iterator.js
b/test/mjsunit/es6/array-iterator.js
index
b24ee5712fb71c595014189b2258a776e80381a7..96122cd9999941155e457a6b664c917389512c13
100644
--- a/test/mjsunit/es6/array-iterator.js
+++ b/test/mjsunit/es6/array-iterator.js
@@ -45,11 +45,8 @@ function assertHasOwnProperty(object, name, attrs) {
function TestArrayPrototype() {
assertHasOwnProperty(Array.prototype, 'entries', DONT_ENUM);
- assertHasOwnProperty(Array.prototype, 'values', DONT_ENUM);
assertHasOwnProperty(Array.prototype, 'keys', DONT_ENUM);
assertHasOwnProperty(Array.prototype, Symbol.iterator, DONT_ENUM);
-
- assertEquals(Array.prototype.values, Array.prototype[Symbol.iterator]);
}
TestArrayPrototype();
@@ -61,7 +58,7 @@ function assertIteratorResult(value, done, result) {
function TestValues() {
var array = ['a', 'b', 'c'];
- var iterator = array.values();
+ var iterator = array[Symbol.iterator]();
assertIteratorResult('a', false, iterator.next());
assertIteratorResult('b', false, iterator.next());
assertIteratorResult('c', false, iterator.next());
@@ -75,7 +72,7 @@ TestValues();
function TestValuesMutate() {
var array = ['a', 'b', 'c'];
- var iterator = array.values();
+ var iterator = array[Symbol.iterator]();
assertIteratorResult('a', false, iterator.next());
assertIteratorResult('b', false, iterator.next());
assertIteratorResult('c', false, iterator.next());
@@ -142,17 +139,17 @@ TestEntriesMutate();
function TestArrayIteratorPrototype() {
var array = [];
- var iterator = array.values();
+ var iterator = array.keys();
var ArrayIteratorPrototype = iterator.__proto__;
- assertEquals(ArrayIteratorPrototype, array.values().__proto__);
+ assertEquals(ArrayIteratorPrototype, array[Symbol.iterator]().__proto__);
assertEquals(ArrayIteratorPrototype, array.keys().__proto__);
assertEquals(ArrayIteratorPrototype, array.entries().__proto__);
assertEquals(Object.prototype, ArrayIteratorPrototype.__proto__);
- assertEquals('Array Iterator', %_ClassOf(array.values()));
+ assertEquals('Array Iterator', %_ClassOf(array[Symbol.iterator]()));
assertEquals('Array Iterator', %_ClassOf(array.keys()));
assertEquals('Array Iterator', %_ClassOf(array.entries()));
@@ -169,7 +166,7 @@ function TestForArrayValues() {
var buffer = [];
var array = [0, 'a', true, false, null, /* hole */, undefined, NaN];
var i = 0;
- for (var value of array.values()) {
+ for (var value of array[Symbol.iterator]()) {
buffer[i++] = value;
}
@@ -239,7 +236,7 @@ TestForArrayValues();
function TestNonOwnSlots() {
var array = [0];
- var iterator = array.values();
+ var iterator = array[Symbol.iterator]();
var object = {__proto__: iterator};
assertThrows(function() {
Index: test/mjsunit/es6/typed-array-iterator.js
diff --git a/test/mjsunit/es6/typed-array-iterator.js
b/test/mjsunit/es6/typed-array-iterator.js
index
a2e4906c191c7b81137052da7e027aea15185c3c..9903b0abaee75cb4cda98b246d5899f9d50450b0
100644
--- a/test/mjsunit/es6/typed-array-iterator.js
+++ b/test/mjsunit/es6/typed-array-iterator.js
@@ -21,9 +21,9 @@ function TestTypedArrayPrototype(constructor) {
assertFalse(constructor.prototype.propertyIsEnumerable(Symbol.iterator));
assertEquals(Array.prototype.entries, constructor.prototype.entries);
- assertEquals(Array.prototype.values, constructor.prototype.values);
+ assertEquals(Array.prototype[Symbol.iterator],
constructor.prototype.values);
assertEquals(Array.prototype.keys, constructor.prototype.keys);
- assertEquals(Array.prototype.values,
constructor.prototype[Symbol.iterator]);
+ assertEquals(Array.prototype[Symbol.iterator],
constructor.prototype[Symbol.iterator]);
}
constructors.forEach(TestTypedArrayPrototype);
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.