| Index: test/mjsunit/harmony/object-observe.js
|
| diff --git a/test/mjsunit/harmony/object-observe.js b/test/mjsunit/harmony/object-observe.js
|
| index 4c75e63965221f8fd93b6c98d708740ac40b5046..0434ccdcb6b9bb46d89bb8364d7bc4164306c9d3 100644
|
| --- a/test/mjsunit/harmony/object-observe.js
|
| +++ b/test/mjsunit/harmony/object-observe.js
|
| @@ -957,15 +957,15 @@ var arr2 = ['alpha', 'beta'];
|
| var arr3 = ['hello'];
|
| arr3[2] = 'goodbye';
|
| arr3.length = 6;
|
| -var slow_arr = new Array(1000000000);
|
| -slow_arr[500000000] = 'hello';
|
| Object.defineProperty(arr, '0', {configurable: false});
|
| Object.defineProperty(arr, '2', {get: function(){}});
|
| Object.defineProperty(arr2, '0', {get: function(){}, configurable: false});
|
| Object.observe(arr, observer.callback);
|
| +Array.observe(arr, observer2.callback);
|
| Object.observe(arr2, observer.callback);
|
| +Array.observe(arr2, observer2.callback);
|
| Object.observe(arr3, observer.callback);
|
| -Object.observe(slow_arr, observer.callback);
|
| +Array.observe(arr3, observer2.callback);
|
| arr.length = 2;
|
| arr.length = 0;
|
| arr.length = 10;
|
| @@ -978,8 +978,8 @@ arr3.length = 0;
|
| arr3.length++;
|
| arr3.length /= 2;
|
| Object.defineProperty(arr3, 'length', {value: 5});
|
| -Object.defineProperty(arr3, 'length', {value: 10, writable: false});
|
| -slow_arr.length = 100;
|
| +arr3[4] = 5;
|
| +Object.defineProperty(arr3, 'length', {value: 1, writable: false});
|
| Object.deliverChangeRecords(observer.callback);
|
| observer.assertCallbackRecords([
|
| { object: arr, name: '3', type: 'deleted', oldValue: 'd' },
|
| @@ -991,7 +991,7 @@ observer.assertCallbackRecords([
|
| { object: arr, name: 'length', type: 'reconfigured' },
|
| { object: arr2, name: '1', type: 'deleted', oldValue: 'beta' },
|
| { object: arr2, name: 'length', type: 'updated', oldValue: 2 },
|
| - { object: arr2, name: 'length', type: 'reconfigured', oldValue: 1 },
|
| + { object: arr2, name: 'length', type: 'reconfigured' },
|
| { object: arr3, name: '2', type: 'deleted', oldValue: 'goodbye' },
|
| { object: arr3, name: '0', type: 'deleted', oldValue: 'hello' },
|
| { object: arr3, name: 'length', type: 'updated', oldValue: 6 },
|
| @@ -999,10 +999,60 @@ observer.assertCallbackRecords([
|
| { object: arr3, name: 'length', type: 'updated', oldValue: 1 },
|
| { object: arr3, name: 'length', type: 'updated', oldValue: 2 },
|
| { object: arr3, name: 'length', type: 'updated', oldValue: 1 },
|
| - { object: arr3, name: 'length', type: 'reconfigured', oldValue: 5 },
|
| + { object: arr3, name: '4', type: 'new' },
|
| + { object: arr3, name: '4', type: 'deleted', oldValue: 5 },
|
| + // TODO(rafaelw): It breaks spec compliance to get two records here.
|
| + // When the TODO in v8natives.js::DefineArrayProperty is addressed
|
| + // which prevents DefineProperty from over-writing the magic length
|
| + // property, these will collapse into a single record.
|
| + { object: arr3, name: 'length', type: 'updated', oldValue: 5 },
|
| + { object: arr3, name: 'length', type: 'reconfigured' }
|
| +]);
|
| +Object.deliverChangeRecords(observer2.callback);
|
| +observer2.assertCallbackRecords([
|
| + { object: arr, type: 'splice', index: 2, removed: [, 'd'], addedCount: 0 },
|
| + { object: arr, type: 'splice', index: 1, removed: ['b'], addedCount: 0 },
|
| + { object: arr, type: 'splice', index: 1, removed: [], addedCount: 9 },
|
| + { object: arr2, type: 'splice', index: 1, removed: ['beta'], addedCount: 0 },
|
| + { object: arr3, type: 'splice', index: 0, removed: ['hello',, 'goodbye',,,,], addedCount: 0 },
|
| + { object: arr3, type: 'splice', index: 0, removed: [], addedCount: 1 },
|
| + { object: arr3, type: 'splice', index: 1, removed: [], addedCount: 1 },
|
| + { object: arr3, type: 'splice', index: 1, removed: [,], addedCount: 0 },
|
| + { object: arr3, type: 'splice', index: 1, removed: [], addedCount: 4 },
|
| + { object: arr3, name: '4', type: 'new' },
|
| + { object: arr3, type: 'splice', index: 1, removed: [,,,5], addedCount: 0 }
|
| +]);
|
| +
|
| +
|
| +// Updating length on large (slow) array
|
| +reset();
|
| +var slow_arr = new Array(1000000000);
|
| +slow_arr[500000000] = 'hello';
|
| +Object.observe(slow_arr, observer.callback);
|
| +var spliceRecords;
|
| +function slowSpliceCallback(records) {
|
| + spliceRecords = records;
|
| +}
|
| +Array.observe(slow_arr, slowSpliceCallback);
|
| +slow_arr.length = 100;
|
| +Object.deliverChangeRecords(observer.callback);
|
| +observer.assertCallbackRecords([
|
| { object: slow_arr, name: '500000000', type: 'deleted', oldValue: 'hello' },
|
| { object: slow_arr, name: 'length', type: 'updated', oldValue: 1000000000 },
|
| ]);
|
| +Object.deliverChangeRecords(slowSpliceCallback);
|
| +assertEquals(spliceRecords.length, 1);
|
| +// Have to custom assert this splice record because the removed array is huge.
|
| +var splice = spliceRecords[0];
|
| +assertSame(splice.object, slow_arr);
|
| +assertEquals(splice.type, 'splice');
|
| +assertEquals(splice.index, 100);
|
| +assertEquals(splice.addedCount, 0);
|
| +var array_keys = %GetArrayKeys(splice.removed, splice.removed.length);
|
| +assertEquals(array_keys.length, 1);
|
| +assertEquals(array_keys[0], 499999900);
|
| +assertEquals(splice.removed[499999900], 'hello');
|
| +assertEquals(splice.removed.length, 999999900);
|
|
|
|
|
| // Assignments in loops (checking different IC states).
|
| @@ -1037,10 +1087,12 @@ observer.assertCallbackRecords([
|
| ]);
|
|
|
|
|
| -// Adding elements past the end of an array should notify on length
|
| +// Adding elements past the end of an array should notify on length for
|
| +// Object.observe and emit "splices" for Array.observe.
|
| reset();
|
| var arr = [1, 2, 3];
|
| Object.observe(arr, observer.callback);
|
| +Array.observe(arr, observer2.callback);
|
| arr[3] = 10;
|
| arr[100] = 20;
|
| Object.defineProperty(arr, '200', {value: 7});
|
| @@ -1058,6 +1110,14 @@ observer.assertCallbackRecords([
|
| { object: arr, name: 'length', type: 'updated', oldValue: 201 },
|
| { object: arr, name: '50', type: 'new' },
|
| ]);
|
| +Object.deliverChangeRecords(observer2.callback);
|
| +observer2.assertCallbackRecords([
|
| + { object: arr, type: 'splice', index: 3, removed: [], addedCount: 1 },
|
| + { object: arr, type: 'splice', index: 4, removed: [], addedCount: 97 },
|
| + { object: arr, type: 'splice', index: 101, removed: [], addedCount: 100 },
|
| + { object: arr, type: 'splice', index: 201, removed: [], addedCount: 200 },
|
| + { object: arr, type: 'new', name: '50' },
|
| +]);
|
|
|
|
|
| // Tests for array methods, first on arrays and then on plain objects
|
|
|