Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(101)

Side by Side Diff: test/mjsunit/harmony/object-observe.js

Issue 46043020: [Object.observe] rename intrinsic change record types for consitency. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: sync Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « test/cctest/test-object-observe.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 ); 180 );
181 notifier.notify({ type: 'foo', protoExpando: 'val'}); 181 notifier.notify({ type: 'foo', protoExpando: 'val'});
182 assertFalse(protoExpandoAccessed); 182 assertFalse(protoExpandoAccessed);
183 delete Object.prototype.protoExpando; 183 delete Object.prototype.protoExpando;
184 Object.deliverChangeRecords(observer.callback); 184 Object.deliverChangeRecords(observer.callback);
185 185
186 186
187 // Multiple records are delivered. 187 // Multiple records are delivered.
188 reset(); 188 reset();
189 notifier.notify({ 189 notifier.notify({
190 type: 'updated', 190 type: 'update',
191 name: 'foo', 191 name: 'foo',
192 expando: 1 192 expando: 1
193 }); 193 });
194 194
195 notifier.notify({ 195 notifier.notify({
196 object: notifier, // object property is ignored 196 object: notifier, // object property is ignored
197 type: 'deleted', 197 type: 'delete',
198 name: 'bar', 198 name: 'bar',
199 expando2: 'str' 199 expando2: 'str'
200 }); 200 });
201 Object.deliverChangeRecords(observer.callback); 201 Object.deliverChangeRecords(observer.callback);
202 observer.assertCallbackRecords([ 202 observer.assertCallbackRecords([
203 { object: obj, name: 'foo', type: 'updated', expando: 1 }, 203 { object: obj, name: 'foo', type: 'update', expando: 1 },
204 { object: obj, name: 'bar', type: 'deleted', expando2: 'str' } 204 { object: obj, name: 'bar', type: 'delete', expando2: 'str' }
205 ]); 205 ]);
206 206
207 // Non-string accept values are coerced to strings 207 // Non-string accept values are coerced to strings
208 reset(); 208 reset();
209 Object.observe(obj, observer.callback, [true, 1, null, undefined]); 209 Object.observe(obj, observer.callback, [true, 1, null, undefined]);
210 notifier = Object.getNotifier(obj); 210 notifier = Object.getNotifier(obj);
211 notifier.notify({ type: 'true' }); 211 notifier.notify({ type: 'true' });
212 notifier.notify({ type: 'false' }); 212 notifier.notify({ type: 'false' });
213 notifier.notify({ type: '1' }); 213 notifier.notify({ type: '1' });
214 notifier.notify({ type: '-1' }); 214 notifier.notify({ type: '-1' });
(...skipping 13 matching lines...) Expand all
228 reset(); 228 reset();
229 Object.deliverChangeRecords(observer.callback); 229 Object.deliverChangeRecords(observer.callback);
230 observer.assertNotCalled(); 230 observer.assertNotCalled();
231 231
232 232
233 // Multiple observation has no effect. 233 // Multiple observation has no effect.
234 reset(); 234 reset();
235 Object.observe(obj, observer.callback); 235 Object.observe(obj, observer.callback);
236 Object.observe(obj, observer.callback); 236 Object.observe(obj, observer.callback);
237 Object.getNotifier(obj).notify({ 237 Object.getNotifier(obj).notify({
238 type: 'updated', 238 type: 'update',
239 }); 239 });
240 Object.deliverChangeRecords(observer.callback); 240 Object.deliverChangeRecords(observer.callback);
241 observer.assertCalled(); 241 observer.assertCalled();
242 242
243 243
244 // Observation can be stopped. 244 // Observation can be stopped.
245 reset(); 245 reset();
246 Object.unobserve(obj, observer.callback); 246 Object.unobserve(obj, observer.callback);
247 Object.getNotifier(obj).notify({ 247 Object.getNotifier(obj).notify({
248 type: 'updated', 248 type: 'update',
249 }); 249 });
250 Object.deliverChangeRecords(observer.callback); 250 Object.deliverChangeRecords(observer.callback);
251 observer.assertNotCalled(); 251 observer.assertNotCalled();
252 252
253 253
254 // Multiple unobservation has no effect 254 // Multiple unobservation has no effect
255 reset(); 255 reset();
256 Object.unobserve(obj, observer.callback); 256 Object.unobserve(obj, observer.callback);
257 Object.unobserve(obj, observer.callback); 257 Object.unobserve(obj, observer.callback);
258 Object.getNotifier(obj).notify({ 258 Object.getNotifier(obj).notify({
259 type: 'updated', 259 type: 'update',
260 }); 260 });
261 Object.deliverChangeRecords(observer.callback); 261 Object.deliverChangeRecords(observer.callback);
262 observer.assertNotCalled(); 262 observer.assertNotCalled();
263 263
264 264
265 // Re-observation works and only includes changeRecords after of call. 265 // Re-observation works and only includes changeRecords after of call.
266 reset(); 266 reset();
267 Object.getNotifier(obj).notify({ 267 Object.getNotifier(obj).notify({
268 type: 'updated', 268 type: 'update',
269 }); 269 });
270 Object.observe(obj, observer.callback); 270 Object.observe(obj, observer.callback);
271 Object.getNotifier(obj).notify({ 271 Object.getNotifier(obj).notify({
272 type: 'updated', 272 type: 'update',
273 }); 273 });
274 records = undefined; 274 records = undefined;
275 Object.deliverChangeRecords(observer.callback); 275 Object.deliverChangeRecords(observer.callback);
276 observer.assertRecordCount(1); 276 observer.assertRecordCount(1);
277 277
278 // Get notifier prior to observing 278 // Get notifier prior to observing
279 reset(); 279 reset();
280 var obj = {}; 280 var obj = {};
281 Object.getNotifier(obj); 281 Object.getNotifier(obj);
282 Object.observe(obj, observer.callback); 282 Object.observe(obj, observer.callback);
283 obj.id = 1; 283 obj.id = 1;
284 Object.deliverChangeRecords(observer.callback); 284 Object.deliverChangeRecords(observer.callback);
285 observer.assertCallbackRecords([ 285 observer.assertCallbackRecords([
286 { object: obj, type: 'new', name: 'id' }, 286 { object: obj, type: 'add', name: 'id' },
287 ]); 287 ]);
288 288
289 // The empty-string property is observable 289 // The empty-string property is observable
290 reset(); 290 reset();
291 var obj = {}; 291 var obj = {};
292 Object.observe(obj, observer.callback); 292 Object.observe(obj, observer.callback);
293 obj[''] = ''; 293 obj[''] = '';
294 obj[''] = ' '; 294 obj[''] = ' ';
295 delete obj['']; 295 delete obj[''];
296 Object.deliverChangeRecords(observer.callback); 296 Object.deliverChangeRecords(observer.callback);
297 observer.assertCallbackRecords([ 297 observer.assertCallbackRecords([
298 { object: obj, type: 'new', name: '' }, 298 { object: obj, type: 'add', name: '' },
299 { object: obj, type: 'updated', name: '', oldValue: '' }, 299 { object: obj, type: 'update', name: '', oldValue: '' },
300 { object: obj, type: 'deleted', name: '', oldValue: ' ' }, 300 { object: obj, type: 'delete', name: '', oldValue: ' ' },
301 ]); 301 ]);
302 302
303 // Object.preventExtensions 303 // Object.preventExtensions
304 reset(); 304 reset();
305 var obj = { foo: 'bar'}; 305 var obj = { foo: 'bar'};
306 Object.observe(obj, observer.callback); 306 Object.observe(obj, observer.callback);
307 obj.baz = 'bat'; 307 obj.baz = 'bat';
308 Object.preventExtensions(obj); 308 Object.preventExtensions(obj);
309 309
310 Object.deliverChangeRecords(observer.callback); 310 Object.deliverChangeRecords(observer.callback);
311 observer.assertCallbackRecords([ 311 observer.assertCallbackRecords([
312 { object: obj, type: 'new', name: 'baz' }, 312 { object: obj, type: 'add', name: 'baz' },
313 { object: obj, type: 'preventExtensions' }, 313 { object: obj, type: 'preventExtensions' },
314 ]); 314 ]);
315 315
316 reset(); 316 reset();
317 var obj = { foo: 'bar'}; 317 var obj = { foo: 'bar'};
318 Object.preventExtensions(obj); 318 Object.preventExtensions(obj);
319 Object.observe(obj, observer.callback); 319 Object.observe(obj, observer.callback);
320 Object.preventExtensions(obj); 320 Object.preventExtensions(obj);
321 Object.deliverChangeRecords(observer.callback); 321 Object.deliverChangeRecords(observer.callback);
322 observer.assertNotCalled(); 322 observer.assertNotCalled();
(...skipping 14 matching lines...) Expand all
337 Object.defineProperty(obj, 'd', { 337 Object.defineProperty(obj, 'd', {
338 writable: false, 338 writable: false,
339 configurable: false, 339 configurable: false,
340 value: 'd' 340 value: 'd'
341 }); 341 });
342 Object.observe(obj, observer.callback); 342 Object.observe(obj, observer.callback);
343 Object.freeze(obj); 343 Object.freeze(obj);
344 344
345 Object.deliverChangeRecords(observer.callback); 345 Object.deliverChangeRecords(observer.callback);
346 observer.assertCallbackRecords([ 346 observer.assertCallbackRecords([
347 { object: obj, type: 'reconfigured', name: 'a' }, 347 { object: obj, type: 'reconfigure', name: 'a' },
348 { object: obj, type: 'reconfigured', name: 'b' }, 348 { object: obj, type: 'reconfigure', name: 'b' },
349 { object: obj, type: 'reconfigured', name: 'c' }, 349 { object: obj, type: 'reconfigure', name: 'c' },
350 { object: obj, type: 'preventExtensions' }, 350 { object: obj, type: 'preventExtensions' },
351 ]); 351 ]);
352 352
353 reset(); 353 reset();
354 var obj = { foo: 'bar'}; 354 var obj = { foo: 'bar'};
355 Object.freeze(obj); 355 Object.freeze(obj);
356 Object.observe(obj, observer.callback); 356 Object.observe(obj, observer.callback);
357 Object.freeze(obj); 357 Object.freeze(obj);
358 Object.deliverChangeRecords(observer.callback); 358 Object.deliverChangeRecords(observer.callback);
359 observer.assertNotCalled(); 359 observer.assertNotCalled();
(...skipping 14 matching lines...) Expand all
374 Object.defineProperty(obj, 'd', { 374 Object.defineProperty(obj, 'd', {
375 writable: false, 375 writable: false,
376 configurable: false, 376 configurable: false,
377 value: 'd' 377 value: 'd'
378 }); 378 });
379 Object.observe(obj, observer.callback); 379 Object.observe(obj, observer.callback);
380 Object.seal(obj); 380 Object.seal(obj);
381 381
382 Object.deliverChangeRecords(observer.callback); 382 Object.deliverChangeRecords(observer.callback);
383 observer.assertCallbackRecords([ 383 observer.assertCallbackRecords([
384 { object: obj, type: 'reconfigured', name: 'a' }, 384 { object: obj, type: 'reconfigure', name: 'a' },
385 { object: obj, type: 'reconfigured', name: 'b' }, 385 { object: obj, type: 'reconfigure', name: 'b' },
386 { object: obj, type: 'preventExtensions' }, 386 { object: obj, type: 'preventExtensions' },
387 ]); 387 ]);
388 388
389 reset(); 389 reset();
390 var obj = { foo: 'bar'}; 390 var obj = { foo: 'bar'};
391 Object.seal(obj); 391 Object.seal(obj);
392 Object.observe(obj, observer.callback); 392 Object.observe(obj, observer.callback);
393 Object.seal(obj); 393 Object.seal(obj);
394 Object.deliverChangeRecords(observer.callback); 394 Object.deliverChangeRecords(observer.callback);
395 observer.assertNotCalled(); 395 observer.assertNotCalled();
396 396
397 // Observing a continuous stream of changes, while itermittantly unobserving. 397 // Observing a continuous stream of changes, while itermittantly unobserving.
398 reset(); 398 reset();
399 var obj = {}; 399 var obj = {};
400 Object.observe(obj, observer.callback); 400 Object.observe(obj, observer.callback);
401 Object.getNotifier(obj).notify({ 401 Object.getNotifier(obj).notify({
402 type: 'updated', 402 type: 'update',
403 val: 1 403 val: 1
404 }); 404 });
405 405
406 Object.unobserve(obj, observer.callback); 406 Object.unobserve(obj, observer.callback);
407 Object.getNotifier(obj).notify({ 407 Object.getNotifier(obj).notify({
408 type: 'updated', 408 type: 'update',
409 val: 2 409 val: 2
410 }); 410 });
411 411
412 Object.observe(obj, observer.callback); 412 Object.observe(obj, observer.callback);
413 Object.getNotifier(obj).notify({ 413 Object.getNotifier(obj).notify({
414 type: 'updated', 414 type: 'update',
415 val: 3 415 val: 3
416 }); 416 });
417 417
418 Object.unobserve(obj, observer.callback); 418 Object.unobserve(obj, observer.callback);
419 Object.getNotifier(obj).notify({ 419 Object.getNotifier(obj).notify({
420 type: 'updated', 420 type: 'update',
421 val: 4 421 val: 4
422 }); 422 });
423 423
424 Object.observe(obj, observer.callback); 424 Object.observe(obj, observer.callback);
425 Object.getNotifier(obj).notify({ 425 Object.getNotifier(obj).notify({
426 type: 'updated', 426 type: 'update',
427 val: 5 427 val: 5
428 }); 428 });
429 429
430 Object.unobserve(obj, observer.callback); 430 Object.unobserve(obj, observer.callback);
431 Object.deliverChangeRecords(observer.callback); 431 Object.deliverChangeRecords(observer.callback);
432 observer.assertCallbackRecords([ 432 observer.assertCallbackRecords([
433 { object: obj, type: 'updated', val: 1 }, 433 { object: obj, type: 'update', val: 1 },
434 { object: obj, type: 'updated', val: 3 }, 434 { object: obj, type: 'update', val: 3 },
435 { object: obj, type: 'updated', val: 5 } 435 { object: obj, type: 'update', val: 5 }
436 ]); 436 ]);
437 437
438 // Accept 438 // Accept
439 reset(); 439 reset();
440 Object.observe(obj, observer.callback, ['somethingElse']); 440 Object.observe(obj, observer.callback, ['somethingElse']);
441 Object.getNotifier(obj).notify({ 441 Object.getNotifier(obj).notify({
442 type: 'new' 442 type: 'add'
443 }); 443 });
444 Object.getNotifier(obj).notify({ 444 Object.getNotifier(obj).notify({
445 type: 'updated' 445 type: 'update'
446 }); 446 });
447 Object.getNotifier(obj).notify({ 447 Object.getNotifier(obj).notify({
448 type: 'deleted' 448 type: 'delete'
449 }); 449 });
450 Object.getNotifier(obj).notify({ 450 Object.getNotifier(obj).notify({
451 type: 'reconfigured' 451 type: 'reconfigure'
452 }); 452 });
453 Object.getNotifier(obj).notify({ 453 Object.getNotifier(obj).notify({
454 type: 'prototype' 454 type: 'setPrototype'
455 }); 455 });
456 Object.deliverChangeRecords(observer.callback); 456 Object.deliverChangeRecords(observer.callback);
457 observer.assertNotCalled(); 457 observer.assertNotCalled();
458 458
459 reset(); 459 reset();
460 Object.observe(obj, observer.callback, ['new', 'deleted', 'prototype']); 460 Object.observe(obj, observer.callback, ['add', 'delete', 'setPrototype']);
461 Object.getNotifier(obj).notify({ 461 Object.getNotifier(obj).notify({
462 type: 'new' 462 type: 'add'
463 }); 463 });
464 Object.getNotifier(obj).notify({ 464 Object.getNotifier(obj).notify({
465 type: 'updated' 465 type: 'update'
466 }); 466 });
467 Object.getNotifier(obj).notify({ 467 Object.getNotifier(obj).notify({
468 type: 'deleted' 468 type: 'delete'
469 }); 469 });
470 Object.getNotifier(obj).notify({ 470 Object.getNotifier(obj).notify({
471 type: 'deleted' 471 type: 'delete'
472 }); 472 });
473 Object.getNotifier(obj).notify({ 473 Object.getNotifier(obj).notify({
474 type: 'reconfigured' 474 type: 'reconfigure'
475 }); 475 });
476 Object.getNotifier(obj).notify({ 476 Object.getNotifier(obj).notify({
477 type: 'prototype' 477 type: 'setPrototype'
478 }); 478 });
479 Object.deliverChangeRecords(observer.callback); 479 Object.deliverChangeRecords(observer.callback);
480 observer.assertCallbackRecords([ 480 observer.assertCallbackRecords([
481 { object: obj, type: 'new' }, 481 { object: obj, type: 'add' },
482 { object: obj, type: 'deleted' }, 482 { object: obj, type: 'delete' },
483 { object: obj, type: 'deleted' }, 483 { object: obj, type: 'delete' },
484 { object: obj, type: 'prototype' } 484 { object: obj, type: 'setPrototype' }
485 ]); 485 ]);
486 486
487 reset(); 487 reset();
488 Object.observe(obj, observer.callback, ['updated', 'foo']); 488 Object.observe(obj, observer.callback, ['update', 'foo']);
489 Object.getNotifier(obj).notify({ 489 Object.getNotifier(obj).notify({
490 type: 'new' 490 type: 'add'
491 }); 491 });
492 Object.getNotifier(obj).notify({ 492 Object.getNotifier(obj).notify({
493 type: 'updated' 493 type: 'update'
494 }); 494 });
495 Object.getNotifier(obj).notify({ 495 Object.getNotifier(obj).notify({
496 type: 'deleted' 496 type: 'delete'
497 }); 497 });
498 Object.getNotifier(obj).notify({ 498 Object.getNotifier(obj).notify({
499 type: 'foo' 499 type: 'foo'
500 }); 500 });
501 Object.getNotifier(obj).notify({ 501 Object.getNotifier(obj).notify({
502 type: 'bar' 502 type: 'bar'
503 }); 503 });
504 Object.getNotifier(obj).notify({ 504 Object.getNotifier(obj).notify({
505 type: 'foo' 505 type: 'foo'
506 }); 506 });
507 Object.deliverChangeRecords(observer.callback); 507 Object.deliverChangeRecords(observer.callback);
508 observer.assertCallbackRecords([ 508 observer.assertCallbackRecords([
509 { object: obj, type: 'updated' }, 509 { object: obj, type: 'update' },
510 { object: obj, type: 'foo' }, 510 { object: obj, type: 'foo' },
511 { object: obj, type: 'foo' } 511 { object: obj, type: 'foo' }
512 ]); 512 ]);
513 513
514 reset(); 514 reset();
515 function Thingy(a, b, c) { 515 function Thingy(a, b, c) {
516 this.a = a; 516 this.a = a;
517 this.b = b; 517 this.b = b;
518 } 518 }
519 519
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 multiplied: multAmount 563 multiplied: multAmount
564 }; // implicit notify 564 }; // implicit notify
565 }); 565 });
566 } 566 }
567 } 567 }
568 568
569 Thingy.observe = function(thingy, callback) { 569 Thingy.observe = function(thingy, callback) {
570 Object.observe(thingy, callback, [Thingy.INCREMENT, 570 Object.observe(thingy, callback, [Thingy.INCREMENT,
571 Thingy.MULTIPLY, 571 Thingy.MULTIPLY,
572 Thingy.INCREMENT_AND_MULTIPLY, 572 Thingy.INCREMENT_AND_MULTIPLY,
573 'updated']); 573 'update']);
574 } 574 }
575 575
576 Thingy.unobserve = function(thingy, callback) { 576 Thingy.unobserve = function(thingy, callback) {
577 Object.unobserve(thingy); 577 Object.unobserve(thingy);
578 } 578 }
579 579
580 var thingy = new Thingy(2, 4); 580 var thingy = new Thingy(2, 4);
581 581
582 Object.observe(thingy, observer.callback); 582 Object.observe(thingy, observer.callback);
583 Thingy.observe(thingy, observer2.callback); 583 Thingy.observe(thingy, observer2.callback);
584 thingy.increment(3); // { a: 5, b: 7 } 584 thingy.increment(3); // { a: 5, b: 7 }
585 thingy.b++; // { a: 5, b: 8 } 585 thingy.b++; // { a: 5, b: 8 }
586 thingy.multiply(2); // { a: 10, b: 16 } 586 thingy.multiply(2); // { a: 10, b: 16 }
587 thingy.a++; // { a: 11, b: 16 } 587 thingy.a++; // { a: 11, b: 16 }
588 thingy.incrementAndMultiply(2, 2); // { a: 26, b: 36 } 588 thingy.incrementAndMultiply(2, 2); // { a: 26, b: 36 }
589 589
590 Object.deliverChangeRecords(observer.callback); 590 Object.deliverChangeRecords(observer.callback);
591 Object.deliverChangeRecords(observer2.callback); 591 Object.deliverChangeRecords(observer2.callback);
592 observer.assertCallbackRecords([ 592 observer.assertCallbackRecords([
593 { object: thingy, type: 'updated', name: 'a', oldValue: 2 }, 593 { object: thingy, type: 'update', name: 'a', oldValue: 2 },
594 { object: thingy, type: 'updated', name: 'b', oldValue: 4 }, 594 { object: thingy, type: 'update', name: 'b', oldValue: 4 },
595 { object: thingy, type: 'updated', name: 'b', oldValue: 7 }, 595 { object: thingy, type: 'update', name: 'b', oldValue: 7 },
596 { object: thingy, type: 'updated', name: 'a', oldValue: 5 }, 596 { object: thingy, type: 'update', name: 'a', oldValue: 5 },
597 { object: thingy, type: 'updated', name: 'b', oldValue: 8 }, 597 { object: thingy, type: 'update', name: 'b', oldValue: 8 },
598 { object: thingy, type: 'updated', name: 'a', oldValue: 10 }, 598 { object: thingy, type: 'update', name: 'a', oldValue: 10 },
599 { object: thingy, type: 'updated', name: 'a', oldValue: 11 }, 599 { object: thingy, type: 'update', name: 'a', oldValue: 11 },
600 { object: thingy, type: 'updated', name: 'b', oldValue: 16 }, 600 { object: thingy, type: 'update', name: 'b', oldValue: 16 },
601 { object: thingy, type: 'updated', name: 'a', oldValue: 13 }, 601 { object: thingy, type: 'update', name: 'a', oldValue: 13 },
602 { object: thingy, type: 'updated', name: 'b', oldValue: 18 }, 602 { object: thingy, type: 'update', name: 'b', oldValue: 18 },
603 ]); 603 ]);
604 observer2.assertCallbackRecords([ 604 observer2.assertCallbackRecords([
605 { object: thingy, type: Thingy.INCREMENT, incremented: 3 }, 605 { object: thingy, type: Thingy.INCREMENT, incremented: 3 },
606 { object: thingy, type: 'updated', name: 'b', oldValue: 7 }, 606 { object: thingy, type: 'update', name: 'b', oldValue: 7 },
607 { object: thingy, type: Thingy.MULTIPLY, multiplied: 2 }, 607 { object: thingy, type: Thingy.MULTIPLY, multiplied: 2 },
608 { object: thingy, type: 'updated', name: 'a', oldValue: 10 }, 608 { object: thingy, type: 'update', name: 'a', oldValue: 10 },
609 { 609 {
610 object: thingy, 610 object: thingy,
611 type: Thingy.INCREMENT_AND_MULTIPLY, 611 type: Thingy.INCREMENT_AND_MULTIPLY,
612 incremented: 2, 612 incremented: 2,
613 multiplied: 2 613 multiplied: 2
614 } 614 }
615 ]); 615 ]);
616 616
617 617
618 reset(); 618 reset();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 var thingy = new RecursiveThingy; 652 var thingy = new RecursiveThingy;
653 thingy.push(1, 2, 3, 4); 653 thingy.push(1, 2, 3, 4);
654 654
655 Object.observe(thingy, observer.callback); 655 Object.observe(thingy, observer.callback);
656 RecursiveThingy.observe(thingy, observer2.callback); 656 RecursiveThingy.observe(thingy, observer2.callback);
657 thingy.multiplyFirstN(2, 3); // [2, 4, 6, 4] 657 thingy.multiplyFirstN(2, 3); // [2, 4, 6, 4]
658 658
659 Object.deliverChangeRecords(observer.callback); 659 Object.deliverChangeRecords(observer.callback);
660 Object.deliverChangeRecords(observer2.callback); 660 Object.deliverChangeRecords(observer2.callback);
661 observer.assertCallbackRecords([ 661 observer.assertCallbackRecords([
662 { object: thingy, type: 'updated', name: '2', oldValue: 3 }, 662 { object: thingy, type: 'update', name: '2', oldValue: 3 },
663 { object: thingy, type: 'updated', name: '1', oldValue: 2 }, 663 { object: thingy, type: 'update', name: '1', oldValue: 2 },
664 { object: thingy, type: 'updated', name: '0', oldValue: 1 } 664 { object: thingy, type: 'update', name: '0', oldValue: 1 }
665 ]); 665 ]);
666 observer2.assertCallbackRecords([ 666 observer2.assertCallbackRecords([
667 { object: thingy, type: RecursiveThingy.MULTIPLY_FIRST_N, multiplied: 2, n: 3 } 667 { object: thingy, type: RecursiveThingy.MULTIPLY_FIRST_N, multiplied: 2, n: 3 }
668 ]); 668 ]);
669 669
670 reset(); 670 reset();
671 function DeckSuit() { 671 function DeckSuit() {
672 this.push('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'A', 'Q', 'K'); 672 this.push('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'A', 'Q', 'K');
673 } 673 }
674 674
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 ]); 718 ]);
719 719
720 // Observing multiple objects; records appear in order. 720 // Observing multiple objects; records appear in order.
721 reset(); 721 reset();
722 var obj2 = {}; 722 var obj2 = {};
723 var obj3 = {} 723 var obj3 = {}
724 Object.observe(obj, observer.callback); 724 Object.observe(obj, observer.callback);
725 Object.observe(obj3, observer.callback); 725 Object.observe(obj3, observer.callback);
726 Object.observe(obj2, observer.callback); 726 Object.observe(obj2, observer.callback);
727 Object.getNotifier(obj).notify({ 727 Object.getNotifier(obj).notify({
728 type: 'new', 728 type: 'add',
729 }); 729 });
730 Object.getNotifier(obj2).notify({ 730 Object.getNotifier(obj2).notify({
731 type: 'updated', 731 type: 'update',
732 }); 732 });
733 Object.getNotifier(obj3).notify({ 733 Object.getNotifier(obj3).notify({
734 type: 'deleted', 734 type: 'delete',
735 }); 735 });
736 Object.observe(obj3, observer.callback); 736 Object.observe(obj3, observer.callback);
737 Object.deliverChangeRecords(observer.callback); 737 Object.deliverChangeRecords(observer.callback);
738 observer.assertCallbackRecords([ 738 observer.assertCallbackRecords([
739 { object: obj, type: 'new' }, 739 { object: obj, type: 'add' },
740 { object: obj2, type: 'updated' }, 740 { object: obj2, type: 'update' },
741 { object: obj3, type: 'deleted' } 741 { object: obj3, type: 'delete' }
742 ]); 742 ]);
743 743
744 744
745 // Recursive observation. 745 // Recursive observation.
746 var obj = {a: 1}; 746 var obj = {a: 1};
747 var callbackCount = 0; 747 var callbackCount = 0;
748 function recursiveObserver(r) { 748 function recursiveObserver(r) {
749 assertEquals(1, r.length); 749 assertEquals(1, r.length);
750 ++callbackCount; 750 ++callbackCount;
751 if (r[0].oldValue < 100) ++obj[r[0].name]; 751 if (r[0].oldValue < 100) ++obj[r[0].name];
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 Object.defineProperty(obj, "a", {get: function() {}, configurable: true}); 798 Object.defineProperty(obj, "a", {get: function() {}, configurable: true});
799 Object.defineProperty(obj, "a", {value: 9, writable: true}); 799 Object.defineProperty(obj, "a", {value: 9, writable: true});
800 obj.a = 10; 800 obj.a = 10;
801 ++obj.a; 801 ++obj.a;
802 obj.a++; 802 obj.a++;
803 obj.a *= 3; 803 obj.a *= 3;
804 delete obj.a; 804 delete obj.a;
805 Object.defineProperty(obj, "a", {value: 11, configurable: true}); 805 Object.defineProperty(obj, "a", {value: 11, configurable: true});
806 Object.deliverChangeRecords(observer.callback); 806 Object.deliverChangeRecords(observer.callback);
807 observer.assertCallbackRecords([ 807 observer.assertCallbackRecords([
808 { object: obj, name: "a", type: "updated", oldValue: 1 }, 808 { object: obj, name: "a", type: "update", oldValue: 1 },
809 { object: obj, name: "a", type: "updated", oldValue: 2 }, 809 { object: obj, name: "a", type: "update", oldValue: 2 },
810 { object: obj, name: "a", type: "deleted", oldValue: 3 }, 810 { object: obj, name: "a", type: "delete", oldValue: 3 },
811 { object: obj, name: "a", type: "new" }, 811 { object: obj, name: "a", type: "add" },
812 { object: obj, name: "a", type: "updated", oldValue: 4 }, 812 { object: obj, name: "a", type: "update", oldValue: 4 },
813 { object: obj, name: "a", type: "updated", oldValue: 5 }, 813 { object: obj, name: "a", type: "update", oldValue: 5 },
814 { object: obj, name: "a", type: "reconfigured" }, 814 { object: obj, name: "a", type: "reconfigure" },
815 { object: obj, name: "a", type: "updated", oldValue: 6 }, 815 { object: obj, name: "a", type: "update", oldValue: 6 },
816 { object: obj, name: "a", type: "reconfigured", oldValue: 8 }, 816 { object: obj, name: "a", type: "reconfigure", oldValue: 8 },
817 { object: obj, name: "a", type: "reconfigured", oldValue: 7 }, 817 { object: obj, name: "a", type: "reconfigure", oldValue: 7 },
818 { object: obj, name: "a", type: "reconfigured" }, 818 { object: obj, name: "a", type: "reconfigure" },
819 { object: obj, name: "a", type: "reconfigured" }, 819 { object: obj, name: "a", type: "reconfigure" },
820 { object: obj, name: "a", type: "reconfigured" }, 820 { object: obj, name: "a", type: "reconfigure" },
821 { object: obj, name: "a", type: "deleted" }, 821 { object: obj, name: "a", type: "delete" },
822 { object: obj, name: "a", type: "new" }, 822 { object: obj, name: "a", type: "add" },
823 { object: obj, name: "a", type: "reconfigured" }, 823 { object: obj, name: "a", type: "reconfigure" },
824 { object: obj, name: "a", type: "updated", oldValue: 9 }, 824 { object: obj, name: "a", type: "update", oldValue: 9 },
825 { object: obj, name: "a", type: "updated", oldValue: 10 }, 825 { object: obj, name: "a", type: "update", oldValue: 10 },
826 { object: obj, name: "a", type: "updated", oldValue: 11 }, 826 { object: obj, name: "a", type: "update", oldValue: 11 },
827 { object: obj, name: "a", type: "updated", oldValue: 12 }, 827 { object: obj, name: "a", type: "update", oldValue: 12 },
828 { object: obj, name: "a", type: "deleted", oldValue: 36 }, 828 { object: obj, name: "a", type: "delete", oldValue: 36 },
829 { object: obj, name: "a", type: "new" }, 829 { object: obj, name: "a", type: "add" },
830 ]); 830 ]);
831 831
832 832
833 // Observing indexed properties. 833 // Observing indexed properties.
834 reset(); 834 reset();
835 var obj = {'1': 1} 835 var obj = {'1': 1}
836 Object.observe(obj, observer.callback); 836 Object.observe(obj, observer.callback);
837 obj[1] = 2; 837 obj[1] = 2;
838 obj[1] = 3; 838 obj[1] = 3;
839 delete obj[1]; 839 delete obj[1];
(...skipping 16 matching lines...) Expand all
856 Object.defineProperty(obj, "1", {get: function() {}, configurable: true}); 856 Object.defineProperty(obj, "1", {get: function() {}, configurable: true});
857 Object.defineProperty(obj, "1", {value: 9, writable: true}); 857 Object.defineProperty(obj, "1", {value: 9, writable: true});
858 obj[1] = 10; 858 obj[1] = 10;
859 ++obj[1]; 859 ++obj[1];
860 obj[1]++; 860 obj[1]++;
861 obj[1] *= 3; 861 obj[1] *= 3;
862 delete obj[1]; 862 delete obj[1];
863 Object.defineProperty(obj, "1", {value: 11, configurable: true}); 863 Object.defineProperty(obj, "1", {value: 11, configurable: true});
864 Object.deliverChangeRecords(observer.callback); 864 Object.deliverChangeRecords(observer.callback);
865 observer.assertCallbackRecords([ 865 observer.assertCallbackRecords([
866 { object: obj, name: "1", type: "updated", oldValue: 1 }, 866 { object: obj, name: "1", type: "update", oldValue: 1 },
867 { object: obj, name: "1", type: "updated", oldValue: 2 }, 867 { object: obj, name: "1", type: "update", oldValue: 2 },
868 { object: obj, name: "1", type: "deleted", oldValue: 3 }, 868 { object: obj, name: "1", type: "delete", oldValue: 3 },
869 { object: obj, name: "1", type: "new" }, 869 { object: obj, name: "1", type: "add" },
870 { object: obj, name: "1", type: "updated", oldValue: 4 }, 870 { object: obj, name: "1", type: "update", oldValue: 4 },
871 { object: obj, name: "1", type: "updated", oldValue: 5 }, 871 { object: obj, name: "1", type: "update", oldValue: 5 },
872 { object: obj, name: "1", type: "reconfigured" }, 872 { object: obj, name: "1", type: "reconfigure" },
873 { object: obj, name: "1", type: "updated", oldValue: 6 }, 873 { object: obj, name: "1", type: "update", oldValue: 6 },
874 { object: obj, name: "1", type: "reconfigured", oldValue: 8 }, 874 { object: obj, name: "1", type: "reconfigure", oldValue: 8 },
875 { object: obj, name: "1", type: "reconfigured", oldValue: 7 }, 875 { object: obj, name: "1", type: "reconfigure", oldValue: 7 },
876 { object: obj, name: "1", type: "reconfigured" }, 876 { object: obj, name: "1", type: "reconfigure" },
877 { object: obj, name: "1", type: "reconfigured" }, 877 { object: obj, name: "1", type: "reconfigure" },
878 { object: obj, name: "1", type: "reconfigured" }, 878 { object: obj, name: "1", type: "reconfigure" },
879 { object: obj, name: "1", type: "deleted" }, 879 { object: obj, name: "1", type: "delete" },
880 { object: obj, name: "1", type: "new" }, 880 { object: obj, name: "1", type: "add" },
881 { object: obj, name: "1", type: "reconfigured" }, 881 { object: obj, name: "1", type: "reconfigure" },
882 { object: obj, name: "1", type: "updated", oldValue: 9 }, 882 { object: obj, name: "1", type: "update", oldValue: 9 },
883 { object: obj, name: "1", type: "updated", oldValue: 10 }, 883 { object: obj, name: "1", type: "update", oldValue: 10 },
884 { object: obj, name: "1", type: "updated", oldValue: 11 }, 884 { object: obj, name: "1", type: "update", oldValue: 11 },
885 { object: obj, name: "1", type: "updated", oldValue: 12 }, 885 { object: obj, name: "1", type: "update", oldValue: 12 },
886 { object: obj, name: "1", type: "deleted", oldValue: 36 }, 886 { object: obj, name: "1", type: "delete", oldValue: 36 },
887 { object: obj, name: "1", type: "new" }, 887 { object: obj, name: "1", type: "add" },
888 ]); 888 ]);
889 889
890 890
891 // Observing symbol properties (not). 891 // Observing symbol properties (not).
892 print("*****") 892 print("*****")
893 reset(); 893 reset();
894 var obj = {} 894 var obj = {}
895 var symbol = Symbol("secret"); 895 var symbol = Symbol("secret");
896 Object.observe(obj, observer.callback); 896 Object.observe(obj, observer.callback);
897 obj[symbol] = 3; 897 obj[symbol] = 3;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
945 Object.defineProperty(obj, prop, {get: function() {}, configurable: true}); 945 Object.defineProperty(obj, prop, {get: function() {}, configurable: true});
946 Object.defineProperty(obj, prop, {value: 9, writable: true}); 946 Object.defineProperty(obj, prop, {value: 9, writable: true});
947 obj[prop] = 10; 947 obj[prop] = 10;
948 ++obj[prop]; 948 ++obj[prop];
949 obj[prop]++; 949 obj[prop]++;
950 obj[prop] *= 3; 950 obj[prop] *= 3;
951 delete obj[prop]; 951 delete obj[prop];
952 Object.defineProperty(obj, prop, {value: 11, configurable: true}); 952 Object.defineProperty(obj, prop, {value: 11, configurable: true});
953 Object.deliverChangeRecords(observer.callback); 953 Object.deliverChangeRecords(observer.callback);
954 observer.assertCallbackRecords([ 954 observer.assertCallbackRecords([
955 { object: obj, name: prop, type: "updated", oldValue: 1 }, 955 { object: obj, name: prop, type: "update", oldValue: 1 },
956 { object: obj, name: prop, type: "updated", oldValue: 2 }, 956 { object: obj, name: prop, type: "update", oldValue: 2 },
957 { object: obj, name: prop, type: "deleted", oldValue: 3 }, 957 { object: obj, name: prop, type: "delete", oldValue: 3 },
958 { object: obj, name: prop, type: "new" }, 958 { object: obj, name: prop, type: "add" },
959 { object: obj, name: prop, type: "updated", oldValue: 4 }, 959 { object: obj, name: prop, type: "update", oldValue: 4 },
960 { object: obj, name: prop, type: "updated", oldValue: 5 }, 960 { object: obj, name: prop, type: "update", oldValue: 5 },
961 { object: obj, name: prop, type: "reconfigured" }, 961 { object: obj, name: prop, type: "reconfigure" },
962 { object: obj, name: prop, type: "updated", oldValue: 6 }, 962 { object: obj, name: prop, type: "update", oldValue: 6 },
963 { object: obj, name: prop, type: "reconfigured", oldValue: 8 }, 963 { object: obj, name: prop, type: "reconfigure", oldValue: 8 },
964 { object: obj, name: prop, type: "reconfigured", oldValue: 7 }, 964 { object: obj, name: prop, type: "reconfigure", oldValue: 7 },
965 { object: obj, name: prop, type: "reconfigured" }, 965 { object: obj, name: prop, type: "reconfigure" },
966 { object: obj, name: prop, type: "reconfigured" }, 966 { object: obj, name: prop, type: "reconfigure" },
967 { object: obj, name: prop, type: "reconfigured" }, 967 { object: obj, name: prop, type: "reconfigure" },
968 { object: obj, name: prop, type: "reconfigured" }, 968 { object: obj, name: prop, type: "reconfigure" },
969 { object: obj, name: prop, type: "reconfigured" }, 969 { object: obj, name: prop, type: "reconfigure" },
970 { object: obj, name: prop, type: "deleted" }, 970 { object: obj, name: prop, type: "delete" },
971 { object: obj, name: prop, type: "new" }, 971 { object: obj, name: prop, type: "add" },
972 { object: obj, name: prop, type: "deleted" }, 972 { object: obj, name: prop, type: "delete" },
973 { object: obj, name: prop, type: "new" }, 973 { object: obj, name: prop, type: "add" },
974 { object: obj, name: prop, type: "reconfigured" }, 974 { object: obj, name: prop, type: "reconfigure" },
975 { object: obj, name: prop, type: "updated", oldValue: 9 }, 975 { object: obj, name: prop, type: "update", oldValue: 9 },
976 { object: obj, name: prop, type: "updated", oldValue: 10 }, 976 { object: obj, name: prop, type: "update", oldValue: 10 },
977 { object: obj, name: prop, type: "updated", oldValue: 11 }, 977 { object: obj, name: prop, type: "update", oldValue: 11 },
978 { object: obj, name: prop, type: "updated", oldValue: 12 }, 978 { object: obj, name: prop, type: "update", oldValue: 12 },
979 { object: obj, name: prop, type: "deleted", oldValue: 36 }, 979 { object: obj, name: prop, type: "delete", oldValue: 36 },
980 { object: obj, name: prop, type: "new" }, 980 { object: obj, name: prop, type: "add" },
981 ]); 981 ]);
982 Object.unobserve(obj, observer.callback); 982 Object.unobserve(obj, observer.callback);
983 delete obj[prop]; 983 delete obj[prop];
984 } 984 }
985 985
986 function TestObserveNonConfigurable(obj, prop, desc) { 986 function TestObserveNonConfigurable(obj, prop, desc) {
987 reset(); 987 reset();
988 Object.observe(obj, observer.callback); 988 Object.observe(obj, observer.callback);
989 Object.unobserve(obj, observer.callback); 989 Object.unobserve(obj, observer.callback);
990 obj[prop] = 1; 990 obj[prop] = 1;
991 Object.observe(obj, observer.callback); 991 Object.observe(obj, observer.callback);
992 obj[prop] = 4; 992 obj[prop] = 4;
993 obj[prop] = 4; // ignored 993 obj[prop] = 4; // ignored
994 obj[prop] = 5; 994 obj[prop] = 5;
995 Object.defineProperty(obj, prop, {value: 6}); 995 Object.defineProperty(obj, prop, {value: 6});
996 Object.defineProperty(obj, prop, {value: 6}); // ignored 996 Object.defineProperty(obj, prop, {value: 6}); // ignored
997 Object.defineProperty(obj, prop, {value: 7}); 997 Object.defineProperty(obj, prop, {value: 7});
998 Object.defineProperty(obj, prop, {enumerable: desc.enumerable}); // ignored 998 Object.defineProperty(obj, prop, {enumerable: desc.enumerable}); // ignored
999 Object.defineProperty(obj, prop, {writable: false}); 999 Object.defineProperty(obj, prop, {writable: false});
1000 obj[prop] = 7; // ignored 1000 obj[prop] = 7; // ignored
1001 Object.deliverChangeRecords(observer.callback); 1001 Object.deliverChangeRecords(observer.callback);
1002 observer.assertCallbackRecords([ 1002 observer.assertCallbackRecords([
1003 { object: obj, name: prop, type: "updated", oldValue: 1 }, 1003 { object: obj, name: prop, type: "update", oldValue: 1 },
1004 { object: obj, name: prop, type: "updated", oldValue: 4 }, 1004 { object: obj, name: prop, type: "update", oldValue: 4 },
1005 { object: obj, name: prop, type: "updated", oldValue: 5 }, 1005 { object: obj, name: prop, type: "update", oldValue: 5 },
1006 { object: obj, name: prop, type: "updated", oldValue: 6 }, 1006 { object: obj, name: prop, type: "update", oldValue: 6 },
1007 { object: obj, name: prop, type: "reconfigured" }, 1007 { object: obj, name: prop, type: "reconfigure" },
1008 ]); 1008 ]);
1009 Object.unobserve(obj, observer.callback); 1009 Object.unobserve(obj, observer.callback);
1010 } 1010 }
1011 1011
1012 function createProxy(create, x) { 1012 function createProxy(create, x) {
1013 var handler = { 1013 var handler = {
1014 getPropertyDescriptor: function(k) { 1014 getPropertyDescriptor: function(k) {
1015 for (var o = this.target; o; o = Object.getPrototypeOf(o)) { 1015 for (var o = this.target; o; o = Object.getPrototypeOf(o)) {
1016 var desc = Object.getOwnPropertyDescriptor(o, k); 1016 var desc = Object.getOwnPropertyDescriptor(o, k);
1017 if (desc) return desc; 1017 if (desc) return desc;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1057 (function(){ return arguments })(), 1057 (function(){ return arguments })(),
1058 (function(){ "use strict"; return arguments })(), 1058 (function(){ "use strict"; return arguments })(),
1059 Object(1), Object(true), Object("bla"), 1059 Object(1), Object(true), Object("bla"),
1060 new Date(), 1060 new Date(),
1061 Object, Function, Date, RegExp, 1061 Object, Function, Date, RegExp,
1062 new Set, new Map, new WeakMap, 1062 new Set, new Map, new WeakMap,
1063 new ArrayBuffer(10), new Int32Array(5), 1063 new ArrayBuffer(10), new Int32Array(5),
1064 createProxy(Proxy.create, null), 1064 createProxy(Proxy.create, null),
1065 createProxy(Proxy.createFunction, function(){}), 1065 createProxy(Proxy.createFunction, function(){}),
1066 ]; 1066 ];
1067 var properties = ["a", "1", 1, "length", "prototype", "name", "caller"]; 1067 var properties = ["a", "1", 1, "length", "setPrototype", "name", "caller"];
1068 1068
1069 // Cases that yield non-standard results. 1069 // Cases that yield non-standard results.
1070 function blacklisted(obj, prop) { 1070 function blacklisted(obj, prop) {
1071 return (obj instanceof Int32Array && prop == 1) || 1071 return (obj instanceof Int32Array && prop == 1) ||
1072 (obj instanceof Int32Array && prop === "length") || 1072 (obj instanceof Int32Array && prop === "length") ||
1073 (obj instanceof ArrayBuffer && prop == 1) 1073 (obj instanceof ArrayBuffer && prop == 1)
1074 } 1074 }
1075 1075
1076 for (var i in objects) for (var j in properties) { 1076 for (var i in objects) for (var j in properties) {
1077 var obj = objects[i]; 1077 var obj = objects[i];
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1111 Object.defineProperty(arr2, 'length', {value: 1, writable: false}); 1111 Object.defineProperty(arr2, 'length', {value: 1, writable: false});
1112 arr3.length = 0; 1112 arr3.length = 0;
1113 ++arr3.length; 1113 ++arr3.length;
1114 arr3.length++; 1114 arr3.length++;
1115 arr3.length /= 2; 1115 arr3.length /= 2;
1116 Object.defineProperty(arr3, 'length', {value: 5}); 1116 Object.defineProperty(arr3, 'length', {value: 5});
1117 arr3[4] = 5; 1117 arr3[4] = 5;
1118 Object.defineProperty(arr3, 'length', {value: 1, writable: false}); 1118 Object.defineProperty(arr3, 'length', {value: 1, writable: false});
1119 Object.deliverChangeRecords(observer.callback); 1119 Object.deliverChangeRecords(observer.callback);
1120 observer.assertCallbackRecords([ 1120 observer.assertCallbackRecords([
1121 { object: arr, name: '3', type: 'deleted', oldValue: 'd' }, 1121 { object: arr, name: '3', type: 'delete', oldValue: 'd' },
1122 { object: arr, name: '2', type: 'deleted' }, 1122 { object: arr, name: '2', type: 'delete' },
1123 { object: arr, name: 'length', type: 'updated', oldValue: 4 }, 1123 { object: arr, name: 'length', type: 'update', oldValue: 4 },
1124 { object: arr, name: '1', type: 'deleted', oldValue: 'b' }, 1124 { object: arr, name: '1', type: 'delete', oldValue: 'b' },
1125 { object: arr, name: 'length', type: 'updated', oldValue: 2 }, 1125 { object: arr, name: 'length', type: 'update', oldValue: 2 },
1126 { object: arr, name: 'length', type: 'updated', oldValue: 1 }, 1126 { object: arr, name: 'length', type: 'update', oldValue: 1 },
1127 { object: arr, name: 'length', type: 'reconfigured' }, 1127 { object: arr, name: 'length', type: 'reconfigure' },
1128 { object: arr2, name: '1', type: 'deleted', oldValue: 'beta' }, 1128 { object: arr2, name: '1', type: 'delete', oldValue: 'beta' },
1129 { object: arr2, name: 'length', type: 'updated', oldValue: 2 }, 1129 { object: arr2, name: 'length', type: 'update', oldValue: 2 },
1130 { object: arr2, name: 'length', type: 'reconfigured' }, 1130 { object: arr2, name: 'length', type: 'reconfigure' },
1131 { object: arr3, name: '2', type: 'deleted', oldValue: 'goodbye' }, 1131 { object: arr3, name: '2', type: 'delete', oldValue: 'goodbye' },
1132 { object: arr3, name: '0', type: 'deleted', oldValue: 'hello' }, 1132 { object: arr3, name: '0', type: 'delete', oldValue: 'hello' },
1133 { object: arr3, name: 'length', type: 'updated', oldValue: 6 }, 1133 { object: arr3, name: 'length', type: 'update', oldValue: 6 },
1134 { object: arr3, name: 'length', type: 'updated', oldValue: 0 }, 1134 { object: arr3, name: 'length', type: 'update', oldValue: 0 },
1135 { object: arr3, name: 'length', type: 'updated', oldValue: 1 }, 1135 { object: arr3, name: 'length', type: 'update', oldValue: 1 },
1136 { object: arr3, name: 'length', type: 'updated', oldValue: 2 }, 1136 { object: arr3, name: 'length', type: 'update', oldValue: 2 },
1137 { object: arr3, name: 'length', type: 'updated', oldValue: 1 }, 1137 { object: arr3, name: 'length', type: 'update', oldValue: 1 },
1138 { object: arr3, name: '4', type: 'new' }, 1138 { object: arr3, name: '4', type: 'add' },
1139 { object: arr3, name: '4', type: 'deleted', oldValue: 5 }, 1139 { object: arr3, name: '4', type: 'delete', oldValue: 5 },
1140 // TODO(rafaelw): It breaks spec compliance to get two records here. 1140 // TODO(rafaelw): It breaks spec compliance to get two records here.
1141 // When the TODO in v8natives.js::DefineArrayProperty is addressed 1141 // When the TODO in v8natives.js::DefineArrayProperty is addressed
1142 // which prevents DefineProperty from over-writing the magic length 1142 // which prevents DefineProperty from over-writing the magic length
1143 // property, these will collapse into a single record. 1143 // property, these will collapse into a single record.
1144 { object: arr3, name: 'length', type: 'updated', oldValue: 5 }, 1144 { object: arr3, name: 'length', type: 'update', oldValue: 5 },
1145 { object: arr3, name: 'length', type: 'reconfigured' } 1145 { object: arr3, name: 'length', type: 'reconfigure' }
1146 ]); 1146 ]);
1147 Object.deliverChangeRecords(observer2.callback); 1147 Object.deliverChangeRecords(observer2.callback);
1148 observer2.assertCallbackRecords([ 1148 observer2.assertCallbackRecords([
1149 { object: arr, type: 'splice', index: 2, removed: [, 'd'], addedCount: 0 }, 1149 { object: arr, type: 'splice', index: 2, removed: [, 'd'], addedCount: 0 },
1150 { object: arr, type: 'splice', index: 1, removed: ['b'], addedCount: 0 }, 1150 { object: arr, type: 'splice', index: 1, removed: ['b'], addedCount: 0 },
1151 { object: arr, type: 'splice', index: 1, removed: [], addedCount: 9 }, 1151 { object: arr, type: 'splice', index: 1, removed: [], addedCount: 9 },
1152 { object: arr2, type: 'splice', index: 1, removed: ['beta'], addedCount: 0 }, 1152 { object: arr2, type: 'splice', index: 1, removed: ['beta'], addedCount: 0 },
1153 { object: arr3, type: 'splice', index: 0, removed: ['hello',, 'goodbye',,,,], addedCount: 0 }, 1153 { object: arr3, type: 'splice', index: 0, removed: ['hello',, 'goodbye',,,,], addedCount: 0 },
1154 { object: arr3, type: 'splice', index: 0, removed: [], addedCount: 1 }, 1154 { object: arr3, type: 'splice', index: 0, removed: [], addedCount: 1 },
1155 { object: arr3, type: 'splice', index: 1, removed: [], addedCount: 1 }, 1155 { object: arr3, type: 'splice', index: 1, removed: [], addedCount: 1 },
1156 { object: arr3, type: 'splice', index: 1, removed: [,], addedCount: 0 }, 1156 { object: arr3, type: 'splice', index: 1, removed: [,], addedCount: 0 },
1157 { object: arr3, type: 'splice', index: 1, removed: [], addedCount: 4 }, 1157 { object: arr3, type: 'splice', index: 1, removed: [], addedCount: 4 },
1158 { object: arr3, name: '4', type: 'new' }, 1158 { object: arr3, name: '4', type: 'add' },
1159 { object: arr3, type: 'splice', index: 1, removed: [,,,5], addedCount: 0 } 1159 { object: arr3, type: 'splice', index: 1, removed: [,,,5], addedCount: 0 }
1160 ]); 1160 ]);
1161 1161
1162 1162
1163 // Updating length on large (slow) array 1163 // Updating length on large (slow) array
1164 reset(); 1164 reset();
1165 var slow_arr = new Array(1000000000); 1165 var slow_arr = new Array(1000000000);
1166 slow_arr[500000000] = 'hello'; 1166 slow_arr[500000000] = 'hello';
1167 Object.observe(slow_arr, observer.callback); 1167 Object.observe(slow_arr, observer.callback);
1168 var spliceRecords; 1168 var spliceRecords;
1169 function slowSpliceCallback(records) { 1169 function slowSpliceCallback(records) {
1170 spliceRecords = records; 1170 spliceRecords = records;
1171 } 1171 }
1172 Array.observe(slow_arr, slowSpliceCallback); 1172 Array.observe(slow_arr, slowSpliceCallback);
1173 slow_arr.length = 100; 1173 slow_arr.length = 100;
1174 Object.deliverChangeRecords(observer.callback); 1174 Object.deliverChangeRecords(observer.callback);
1175 observer.assertCallbackRecords([ 1175 observer.assertCallbackRecords([
1176 { object: slow_arr, name: '500000000', type: 'deleted', oldValue: 'hello' }, 1176 { object: slow_arr, name: '500000000', type: 'delete', oldValue: 'hello' },
1177 { object: slow_arr, name: 'length', type: 'updated', oldValue: 1000000000 }, 1177 { object: slow_arr, name: 'length', type: 'update', oldValue: 1000000000 },
1178 ]); 1178 ]);
1179 Object.deliverChangeRecords(slowSpliceCallback); 1179 Object.deliverChangeRecords(slowSpliceCallback);
1180 assertEquals(spliceRecords.length, 1); 1180 assertEquals(spliceRecords.length, 1);
1181 // Have to custom assert this splice record because the removed array is huge. 1181 // Have to custom assert this splice record because the removed array is huge.
1182 var splice = spliceRecords[0]; 1182 var splice = spliceRecords[0];
1183 assertSame(splice.object, slow_arr); 1183 assertSame(splice.object, slow_arr);
1184 assertEquals(splice.type, 'splice'); 1184 assertEquals(splice.type, 'splice');
1185 assertEquals(splice.index, 100); 1185 assertEquals(splice.index, 100);
1186 assertEquals(splice.addedCount, 0); 1186 assertEquals(splice.addedCount, 0);
1187 var array_keys = %GetArrayKeys(splice.removed, splice.removed.length); 1187 var array_keys = %GetArrayKeys(splice.removed, splice.removed.length);
1188 assertEquals(array_keys.length, 1); 1188 assertEquals(array_keys.length, 1);
1189 assertEquals(array_keys[0], 499999900); 1189 assertEquals(array_keys[0], 499999900);
1190 assertEquals(splice.removed[499999900], 'hello'); 1190 assertEquals(splice.removed[499999900], 'hello');
1191 assertEquals(splice.removed.length, 999999900); 1191 assertEquals(splice.removed.length, 999999900);
1192 1192
1193 1193
1194 // Assignments in loops (checking different IC states). 1194 // Assignments in loops (checking different IC states).
1195 reset(); 1195 reset();
1196 var obj = {}; 1196 var obj = {};
1197 Object.observe(obj, observer.callback); 1197 Object.observe(obj, observer.callback);
1198 for (var i = 0; i < 5; i++) { 1198 for (var i = 0; i < 5; i++) {
1199 obj["a" + i] = i; 1199 obj["a" + i] = i;
1200 } 1200 }
1201 Object.deliverChangeRecords(observer.callback); 1201 Object.deliverChangeRecords(observer.callback);
1202 observer.assertCallbackRecords([ 1202 observer.assertCallbackRecords([
1203 { object: obj, name: "a0", type: "new" }, 1203 { object: obj, name: "a0", type: "add" },
1204 { object: obj, name: "a1", type: "new" }, 1204 { object: obj, name: "a1", type: "add" },
1205 { object: obj, name: "a2", type: "new" }, 1205 { object: obj, name: "a2", type: "add" },
1206 { object: obj, name: "a3", type: "new" }, 1206 { object: obj, name: "a3", type: "add" },
1207 { object: obj, name: "a4", type: "new" }, 1207 { object: obj, name: "a4", type: "add" },
1208 ]); 1208 ]);
1209 1209
1210 reset(); 1210 reset();
1211 var obj = {}; 1211 var obj = {};
1212 Object.observe(obj, observer.callback); 1212 Object.observe(obj, observer.callback);
1213 for (var i = 0; i < 5; i++) { 1213 for (var i = 0; i < 5; i++) {
1214 obj[i] = i; 1214 obj[i] = i;
1215 } 1215 }
1216 Object.deliverChangeRecords(observer.callback); 1216 Object.deliverChangeRecords(observer.callback);
1217 observer.assertCallbackRecords([ 1217 observer.assertCallbackRecords([
1218 { object: obj, name: "0", type: "new" }, 1218 { object: obj, name: "0", type: "add" },
1219 { object: obj, name: "1", type: "new" }, 1219 { object: obj, name: "1", type: "add" },
1220 { object: obj, name: "2", type: "new" }, 1220 { object: obj, name: "2", type: "add" },
1221 { object: obj, name: "3", type: "new" }, 1221 { object: obj, name: "3", type: "add" },
1222 { object: obj, name: "4", type: "new" }, 1222 { object: obj, name: "4", type: "add" },
1223 ]); 1223 ]);
1224 1224
1225 1225
1226 // Adding elements past the end of an array should notify on length for 1226 // Adding elements past the end of an array should notify on length for
1227 // Object.observe and emit "splices" for Array.observe. 1227 // Object.observe and emit "splices" for Array.observe.
1228 reset(); 1228 reset();
1229 var arr = [1, 2, 3]; 1229 var arr = [1, 2, 3];
1230 Object.observe(arr, observer.callback); 1230 Object.observe(arr, observer.callback);
1231 Array.observe(arr, observer2.callback); 1231 Array.observe(arr, observer2.callback);
1232 arr[3] = 10; 1232 arr[3] = 10;
1233 arr[100] = 20; 1233 arr[100] = 20;
1234 Object.defineProperty(arr, '200', {value: 7}); 1234 Object.defineProperty(arr, '200', {value: 7});
1235 Object.defineProperty(arr, '400', {get: function(){}}); 1235 Object.defineProperty(arr, '400', {get: function(){}});
1236 arr[50] = 30; // no length change expected 1236 arr[50] = 30; // no length change expected
1237 Object.deliverChangeRecords(observer.callback); 1237 Object.deliverChangeRecords(observer.callback);
1238 observer.assertCallbackRecords([ 1238 observer.assertCallbackRecords([
1239 { object: arr, name: '3', type: 'new' }, 1239 { object: arr, name: '3', type: 'add' },
1240 { object: arr, name: 'length', type: 'updated', oldValue: 3 }, 1240 { object: arr, name: 'length', type: 'update', oldValue: 3 },
1241 { object: arr, name: '100', type: 'new' }, 1241 { object: arr, name: '100', type: 'add' },
1242 { object: arr, name: 'length', type: 'updated', oldValue: 4 }, 1242 { object: arr, name: 'length', type: 'update', oldValue: 4 },
1243 { object: arr, name: '200', type: 'new' }, 1243 { object: arr, name: '200', type: 'add' },
1244 { object: arr, name: 'length', type: 'updated', oldValue: 101 }, 1244 { object: arr, name: 'length', type: 'update', oldValue: 101 },
1245 { object: arr, name: '400', type: 'new' }, 1245 { object: arr, name: '400', type: 'add' },
1246 { object: arr, name: 'length', type: 'updated', oldValue: 201 }, 1246 { object: arr, name: 'length', type: 'update', oldValue: 201 },
1247 { object: arr, name: '50', type: 'new' }, 1247 { object: arr, name: '50', type: 'add' },
1248 ]); 1248 ]);
1249 Object.deliverChangeRecords(observer2.callback); 1249 Object.deliverChangeRecords(observer2.callback);
1250 observer2.assertCallbackRecords([ 1250 observer2.assertCallbackRecords([
1251 { object: arr, type: 'splice', index: 3, removed: [], addedCount: 1 }, 1251 { object: arr, type: 'splice', index: 3, removed: [], addedCount: 1 },
1252 { object: arr, type: 'splice', index: 4, removed: [], addedCount: 97 }, 1252 { object: arr, type: 'splice', index: 4, removed: [], addedCount: 97 },
1253 { object: arr, type: 'splice', index: 101, removed: [], addedCount: 100 }, 1253 { object: arr, type: 'splice', index: 101, removed: [], addedCount: 100 },
1254 { object: arr, type: 'splice', index: 201, removed: [], addedCount: 200 }, 1254 { object: arr, type: 'splice', index: 201, removed: [], addedCount: 200 },
1255 { object: arr, type: 'new', name: '50' }, 1255 { object: arr, type: 'add', name: '50' },
1256 ]); 1256 ]);
1257 1257
1258 1258
1259 // Tests for array methods, first on arrays and then on plain objects 1259 // Tests for array methods, first on arrays and then on plain objects
1260 // 1260 //
1261 // === ARRAYS === 1261 // === ARRAYS ===
1262 // 1262 //
1263 // Push 1263 // Push
1264 reset(); 1264 reset();
1265 var array = [1, 2]; 1265 var array = [1, 2];
1266 Object.observe(array, observer.callback); 1266 Object.observe(array, observer.callback);
1267 Array.observe(array, observer2.callback); 1267 Array.observe(array, observer2.callback);
1268 array.push(3, 4); 1268 array.push(3, 4);
1269 array.push(5); 1269 array.push(5);
1270 Object.deliverChangeRecords(observer.callback); 1270 Object.deliverChangeRecords(observer.callback);
1271 observer.assertCallbackRecords([ 1271 observer.assertCallbackRecords([
1272 { object: array, name: '2', type: 'new' }, 1272 { object: array, name: '2', type: 'add' },
1273 { object: array, name: 'length', type: 'updated', oldValue: 2 }, 1273 { object: array, name: 'length', type: 'update', oldValue: 2 },
1274 { object: array, name: '3', type: 'new' }, 1274 { object: array, name: '3', type: 'add' },
1275 { object: array, name: 'length', type: 'updated', oldValue: 3 }, 1275 { object: array, name: 'length', type: 'update', oldValue: 3 },
1276 { object: array, name: '4', type: 'new' }, 1276 { object: array, name: '4', type: 'add' },
1277 { object: array, name: 'length', type: 'updated', oldValue: 4 }, 1277 { object: array, name: 'length', type: 'update', oldValue: 4 },
1278 ]); 1278 ]);
1279 Object.deliverChangeRecords(observer2.callback); 1279 Object.deliverChangeRecords(observer2.callback);
1280 observer2.assertCallbackRecords([ 1280 observer2.assertCallbackRecords([
1281 { object: array, type: 'splice', index: 2, removed: [], addedCount: 2 }, 1281 { object: array, type: 'splice', index: 2, removed: [], addedCount: 2 },
1282 { object: array, type: 'splice', index: 4, removed: [], addedCount: 1 } 1282 { object: array, type: 'splice', index: 4, removed: [], addedCount: 1 }
1283 ]); 1283 ]);
1284 1284
1285 // Pop 1285 // Pop
1286 reset(); 1286 reset();
1287 var array = [1, 2]; 1287 var array = [1, 2];
1288 Object.observe(array, observer.callback); 1288 Object.observe(array, observer.callback);
1289 array.pop(); 1289 array.pop();
1290 array.pop(); 1290 array.pop();
1291 Object.deliverChangeRecords(observer.callback); 1291 Object.deliverChangeRecords(observer.callback);
1292 observer.assertCallbackRecords([ 1292 observer.assertCallbackRecords([
1293 { object: array, name: '1', type: 'deleted', oldValue: 2 }, 1293 { object: array, name: '1', type: 'delete', oldValue: 2 },
1294 { object: array, name: 'length', type: 'updated', oldValue: 2 }, 1294 { object: array, name: 'length', type: 'update', oldValue: 2 },
1295 { object: array, name: '0', type: 'deleted', oldValue: 1 }, 1295 { object: array, name: '0', type: 'delete', oldValue: 1 },
1296 { object: array, name: 'length', type: 'updated', oldValue: 1 }, 1296 { object: array, name: 'length', type: 'update', oldValue: 1 },
1297 ]); 1297 ]);
1298 1298
1299 // Shift 1299 // Shift
1300 reset(); 1300 reset();
1301 var array = [1, 2]; 1301 var array = [1, 2];
1302 Object.observe(array, observer.callback); 1302 Object.observe(array, observer.callback);
1303 array.shift(); 1303 array.shift();
1304 array.shift(); 1304 array.shift();
1305 Object.deliverChangeRecords(observer.callback); 1305 Object.deliverChangeRecords(observer.callback);
1306 observer.assertCallbackRecords([ 1306 observer.assertCallbackRecords([
1307 { object: array, name: '0', type: 'updated', oldValue: 1 }, 1307 { object: array, name: '0', type: 'update', oldValue: 1 },
1308 { object: array, name: '1', type: 'deleted', oldValue: 2 }, 1308 { object: array, name: '1', type: 'delete', oldValue: 2 },
1309 { object: array, name: 'length', type: 'updated', oldValue: 2 }, 1309 { object: array, name: 'length', type: 'update', oldValue: 2 },
1310 { object: array, name: '0', type: 'deleted', oldValue: 2 }, 1310 { object: array, name: '0', type: 'delete', oldValue: 2 },
1311 { object: array, name: 'length', type: 'updated', oldValue: 1 }, 1311 { object: array, name: 'length', type: 'update', oldValue: 1 },
1312 ]); 1312 ]);
1313 1313
1314 // Unshift 1314 // Unshift
1315 reset(); 1315 reset();
1316 var array = [1, 2]; 1316 var array = [1, 2];
1317 Object.observe(array, observer.callback); 1317 Object.observe(array, observer.callback);
1318 array.unshift(3, 4); 1318 array.unshift(3, 4);
1319 Object.deliverChangeRecords(observer.callback); 1319 Object.deliverChangeRecords(observer.callback);
1320 observer.assertCallbackRecords([ 1320 observer.assertCallbackRecords([
1321 { object: array, name: '3', type: 'new' }, 1321 { object: array, name: '3', type: 'add' },
1322 { object: array, name: 'length', type: 'updated', oldValue: 2 }, 1322 { object: array, name: 'length', type: 'update', oldValue: 2 },
1323 { object: array, name: '2', type: 'new' }, 1323 { object: array, name: '2', type: 'add' },
1324 { object: array, name: '0', type: 'updated', oldValue: 1 }, 1324 { object: array, name: '0', type: 'update', oldValue: 1 },
1325 { object: array, name: '1', type: 'updated', oldValue: 2 }, 1325 { object: array, name: '1', type: 'update', oldValue: 2 },
1326 ]); 1326 ]);
1327 1327
1328 // Splice 1328 // Splice
1329 reset(); 1329 reset();
1330 var array = [1, 2, 3]; 1330 var array = [1, 2, 3];
1331 Object.observe(array, observer.callback); 1331 Object.observe(array, observer.callback);
1332 array.splice(1, 1, 4, 5); 1332 array.splice(1, 1, 4, 5);
1333 Object.deliverChangeRecords(observer.callback); 1333 Object.deliverChangeRecords(observer.callback);
1334 observer.assertCallbackRecords([ 1334 observer.assertCallbackRecords([
1335 { object: array, name: '3', type: 'new' }, 1335 { object: array, name: '3', type: 'add' },
1336 { object: array, name: 'length', type: 'updated', oldValue: 3 }, 1336 { object: array, name: 'length', type: 'update', oldValue: 3 },
1337 { object: array, name: '1', type: 'updated', oldValue: 2 }, 1337 { object: array, name: '1', type: 'update', oldValue: 2 },
1338 { object: array, name: '2', type: 'updated', oldValue: 3 }, 1338 { object: array, name: '2', type: 'update', oldValue: 3 },
1339 ]); 1339 ]);
1340 1340
1341 // Sort 1341 // Sort
1342 reset(); 1342 reset();
1343 var array = [3, 2, 1]; 1343 var array = [3, 2, 1];
1344 Object.observe(array, observer.callback); 1344 Object.observe(array, observer.callback);
1345 array.sort(); 1345 array.sort();
1346 assertEquals(1, array[0]); 1346 assertEquals(1, array[0]);
1347 assertEquals(2, array[1]); 1347 assertEquals(2, array[1]);
1348 assertEquals(3, array[2]); 1348 assertEquals(3, array[2]);
1349 Object.deliverChangeRecords(observer.callback); 1349 Object.deliverChangeRecords(observer.callback);
1350 observer.assertCallbackRecords([ 1350 observer.assertCallbackRecords([
1351 { object: array, name: '1', type: 'updated', oldValue: 2 }, 1351 { object: array, name: '1', type: 'update', oldValue: 2 },
1352 { object: array, name: '0', type: 'updated', oldValue: 3 }, 1352 { object: array, name: '0', type: 'update', oldValue: 3 },
1353 { object: array, name: '2', type: 'updated', oldValue: 1 }, 1353 { object: array, name: '2', type: 'update', oldValue: 1 },
1354 { object: array, name: '1', type: 'updated', oldValue: 3 }, 1354 { object: array, name: '1', type: 'update', oldValue: 3 },
1355 { object: array, name: '0', type: 'updated', oldValue: 2 }, 1355 { object: array, name: '0', type: 'update', oldValue: 2 },
1356 ]); 1356 ]);
1357 1357
1358 // Splice emitted after Array mutation methods 1358 // Splice emitted after Array mutation methods
1359 function MockArray(initial, observer) { 1359 function MockArray(initial, observer) {
1360 for (var i = 0; i < initial.length; i++) 1360 for (var i = 0; i < initial.length; i++)
1361 this[i] = initial[i]; 1361 this[i] = initial[i];
1362 1362
1363 this.length_ = initial.length; 1363 this.length_ = initial.length;
1364 this.observer = observer; 1364 this.observer = observer;
1365 } 1365 }
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1427 // 1427 //
1428 // === PLAIN OBJECTS === 1428 // === PLAIN OBJECTS ===
1429 // 1429 //
1430 // Push 1430 // Push
1431 reset() 1431 reset()
1432 var array = {0: 1, 1: 2, length: 2} 1432 var array = {0: 1, 1: 2, length: 2}
1433 Object.observe(array, observer.callback); 1433 Object.observe(array, observer.callback);
1434 Array.prototype.push.call(array, 3, 4); 1434 Array.prototype.push.call(array, 3, 4);
1435 Object.deliverChangeRecords(observer.callback); 1435 Object.deliverChangeRecords(observer.callback);
1436 observer.assertCallbackRecords([ 1436 observer.assertCallbackRecords([
1437 { object: array, name: '2', type: 'new' }, 1437 { object: array, name: '2', type: 'add' },
1438 { object: array, name: '3', type: 'new' }, 1438 { object: array, name: '3', type: 'add' },
1439 { object: array, name: 'length', type: 'updated', oldValue: 2 }, 1439 { object: array, name: 'length', type: 'update', oldValue: 2 },
1440 ]); 1440 ]);
1441 1441
1442 // Pop 1442 // Pop
1443 reset(); 1443 reset();
1444 var array = [1, 2]; 1444 var array = [1, 2];
1445 Object.observe(array, observer.callback); 1445 Object.observe(array, observer.callback);
1446 Array.observe(array, observer2.callback); 1446 Array.observe(array, observer2.callback);
1447 array.pop(); 1447 array.pop();
1448 array.pop(); 1448 array.pop();
1449 array.pop(); 1449 array.pop();
1450 Object.deliverChangeRecords(observer.callback); 1450 Object.deliverChangeRecords(observer.callback);
1451 observer.assertCallbackRecords([ 1451 observer.assertCallbackRecords([
1452 { object: array, name: '1', type: 'deleted', oldValue: 2 }, 1452 { object: array, name: '1', type: 'delete', oldValue: 2 },
1453 { object: array, name: 'length', type: 'updated', oldValue: 2 }, 1453 { object: array, name: 'length', type: 'update', oldValue: 2 },
1454 { object: array, name: '0', type: 'deleted', oldValue: 1 }, 1454 { object: array, name: '0', type: 'delete', oldValue: 1 },
1455 { object: array, name: 'length', type: 'updated', oldValue: 1 }, 1455 { object: array, name: 'length', type: 'update', oldValue: 1 },
1456 ]); 1456 ]);
1457 Object.deliverChangeRecords(observer2.callback); 1457 Object.deliverChangeRecords(observer2.callback);
1458 observer2.assertCallbackRecords([ 1458 observer2.assertCallbackRecords([
1459 { object: array, type: 'splice', index: 1, removed: [2], addedCount: 0 }, 1459 { object: array, type: 'splice', index: 1, removed: [2], addedCount: 0 },
1460 { object: array, type: 'splice', index: 0, removed: [1], addedCount: 0 } 1460 { object: array, type: 'splice', index: 0, removed: [1], addedCount: 0 }
1461 ]); 1461 ]);
1462 1462
1463 // Shift 1463 // Shift
1464 reset(); 1464 reset();
1465 var array = [1, 2]; 1465 var array = [1, 2];
1466 Object.observe(array, observer.callback); 1466 Object.observe(array, observer.callback);
1467 Array.observe(array, observer2.callback); 1467 Array.observe(array, observer2.callback);
1468 array.shift(); 1468 array.shift();
1469 array.shift(); 1469 array.shift();
1470 array.shift(); 1470 array.shift();
1471 Object.deliverChangeRecords(observer.callback); 1471 Object.deliverChangeRecords(observer.callback);
1472 observer.assertCallbackRecords([ 1472 observer.assertCallbackRecords([
1473 { object: array, name: '0', type: 'updated', oldValue: 1 }, 1473 { object: array, name: '0', type: 'update', oldValue: 1 },
1474 { object: array, name: '1', type: 'deleted', oldValue: 2 }, 1474 { object: array, name: '1', type: 'delete', oldValue: 2 },
1475 { object: array, name: 'length', type: 'updated', oldValue: 2 }, 1475 { object: array, name: 'length', type: 'update', oldValue: 2 },
1476 { object: array, name: '0', type: 'deleted', oldValue: 2 }, 1476 { object: array, name: '0', type: 'delete', oldValue: 2 },
1477 { object: array, name: 'length', type: 'updated', oldValue: 1 }, 1477 { object: array, name: 'length', type: 'update', oldValue: 1 },
1478 ]); 1478 ]);
1479 Object.deliverChangeRecords(observer2.callback); 1479 Object.deliverChangeRecords(observer2.callback);
1480 observer2.assertCallbackRecords([ 1480 observer2.assertCallbackRecords([
1481 { object: array, type: 'splice', index: 0, removed: [1], addedCount: 0 }, 1481 { object: array, type: 'splice', index: 0, removed: [1], addedCount: 0 },
1482 { object: array, type: 'splice', index: 0, removed: [2], addedCount: 0 } 1482 { object: array, type: 'splice', index: 0, removed: [2], addedCount: 0 }
1483 ]); 1483 ]);
1484 1484
1485 // Unshift 1485 // Unshift
1486 reset(); 1486 reset();
1487 var array = [1, 2]; 1487 var array = [1, 2];
1488 Object.observe(array, observer.callback); 1488 Object.observe(array, observer.callback);
1489 Array.observe(array, observer2.callback); 1489 Array.observe(array, observer2.callback);
1490 array.unshift(3, 4); 1490 array.unshift(3, 4);
1491 array.unshift(5); 1491 array.unshift(5);
1492 Object.deliverChangeRecords(observer.callback); 1492 Object.deliverChangeRecords(observer.callback);
1493 observer.assertCallbackRecords([ 1493 observer.assertCallbackRecords([
1494 { object: array, name: '3', type: 'new' }, 1494 { object: array, name: '3', type: 'add' },
1495 { object: array, name: 'length', type: 'updated', oldValue: 2 }, 1495 { object: array, name: 'length', type: 'update', oldValue: 2 },
1496 { object: array, name: '2', type: 'new' }, 1496 { object: array, name: '2', type: 'add' },
1497 { object: array, name: '0', type: 'updated', oldValue: 1 }, 1497 { object: array, name: '0', type: 'update', oldValue: 1 },
1498 { object: array, name: '1', type: 'updated', oldValue: 2 }, 1498 { object: array, name: '1', type: 'update', oldValue: 2 },
1499 { object: array, name: '4', type: 'new' }, 1499 { object: array, name: '4', type: 'add' },
1500 { object: array, name: 'length', type: 'updated', oldValue: 4 }, 1500 { object: array, name: 'length', type: 'update', oldValue: 4 },
1501 { object: array, name: '3', type: 'updated', oldValue: 2 }, 1501 { object: array, name: '3', type: 'update', oldValue: 2 },
1502 { object: array, name: '2', type: 'updated', oldValue: 1 }, 1502 { object: array, name: '2', type: 'update', oldValue: 1 },
1503 { object: array, name: '1', type: 'updated', oldValue: 4 }, 1503 { object: array, name: '1', type: 'update', oldValue: 4 },
1504 { object: array, name: '0', type: 'updated', oldValue: 3 }, 1504 { object: array, name: '0', type: 'update', oldValue: 3 },
1505 ]); 1505 ]);
1506 Object.deliverChangeRecords(observer2.callback); 1506 Object.deliverChangeRecords(observer2.callback);
1507 observer2.assertCallbackRecords([ 1507 observer2.assertCallbackRecords([
1508 { object: array, type: 'splice', index: 0, removed: [], addedCount: 2 }, 1508 { object: array, type: 'splice', index: 0, removed: [], addedCount: 2 },
1509 { object: array, type: 'splice', index: 0, removed: [], addedCount: 1 } 1509 { object: array, type: 'splice', index: 0, removed: [], addedCount: 1 }
1510 ]); 1510 ]);
1511 1511
1512 // Splice 1512 // Splice
1513 reset(); 1513 reset();
1514 var array = [1, 2, 3]; 1514 var array = [1, 2, 3];
1515 Object.observe(array, observer.callback); 1515 Object.observe(array, observer.callback);
1516 Array.observe(array, observer2.callback); 1516 Array.observe(array, observer2.callback);
1517 array.splice(1, 0, 4, 5); // 1 4 5 2 3 1517 array.splice(1, 0, 4, 5); // 1 4 5 2 3
1518 array.splice(0, 2); // 5 2 3 1518 array.splice(0, 2); // 5 2 3
1519 array.splice(1, 2, 6, 7); // 5 6 7 1519 array.splice(1, 2, 6, 7); // 5 6 7
1520 array.splice(2, 0); 1520 array.splice(2, 0);
1521 Object.deliverChangeRecords(observer.callback); 1521 Object.deliverChangeRecords(observer.callback);
1522 observer.assertCallbackRecords([ 1522 observer.assertCallbackRecords([
1523 { object: array, name: '4', type: 'new' }, 1523 { object: array, name: '4', type: 'add' },
1524 { object: array, name: 'length', type: 'updated', oldValue: 3 }, 1524 { object: array, name: 'length', type: 'update', oldValue: 3 },
1525 { object: array, name: '3', type: 'new' }, 1525 { object: array, name: '3', type: 'add' },
1526 { object: array, name: '1', type: 'updated', oldValue: 2 }, 1526 { object: array, name: '1', type: 'update', oldValue: 2 },
1527 { object: array, name: '2', type: 'updated', oldValue: 3 }, 1527 { object: array, name: '2', type: 'update', oldValue: 3 },
1528 1528
1529 { object: array, name: '0', type: 'updated', oldValue: 1 }, 1529 { object: array, name: '0', type: 'update', oldValue: 1 },
1530 { object: array, name: '1', type: 'updated', oldValue: 4 }, 1530 { object: array, name: '1', type: 'update', oldValue: 4 },
1531 { object: array, name: '2', type: 'updated', oldValue: 5 }, 1531 { object: array, name: '2', type: 'update', oldValue: 5 },
1532 { object: array, name: '4', type: 'deleted', oldValue: 3 }, 1532 { object: array, name: '4', type: 'delete', oldValue: 3 },
1533 { object: array, name: '3', type: 'deleted', oldValue: 2 }, 1533 { object: array, name: '3', type: 'delete', oldValue: 2 },
1534 { object: array, name: 'length', type: 'updated', oldValue: 5 }, 1534 { object: array, name: 'length', type: 'update', oldValue: 5 },
1535 1535
1536 { object: array, name: '1', type: 'updated', oldValue: 2 }, 1536 { object: array, name: '1', type: 'update', oldValue: 2 },
1537 { object: array, name: '2', type: 'updated', oldValue: 3 }, 1537 { object: array, name: '2', type: 'update', oldValue: 3 },
1538 ]); 1538 ]);
1539 Object.deliverChangeRecords(observer2.callback); 1539 Object.deliverChangeRecords(observer2.callback);
1540 observer2.assertCallbackRecords([ 1540 observer2.assertCallbackRecords([
1541 { object: array, type: 'splice', index: 1, removed: [], addedCount: 2 }, 1541 { object: array, type: 'splice', index: 1, removed: [], addedCount: 2 },
1542 { object: array, type: 'splice', index: 0, removed: [1, 4], addedCount: 0 }, 1542 { object: array, type: 'splice', index: 0, removed: [1, 4], addedCount: 0 },
1543 { object: array, type: 'splice', index: 1, removed: [2, 3], addedCount: 2 }, 1543 { object: array, type: 'splice', index: 1, removed: [2, 3], addedCount: 2 },
1544 ]); 1544 ]);
1545 1545
1546 // Exercise StoreIC_ArrayLength 1546 // Exercise StoreIC_ArrayLength
1547 reset(); 1547 reset();
1548 var dummy = {}; 1548 var dummy = {};
1549 Object.observe(dummy, observer.callback); 1549 Object.observe(dummy, observer.callback);
1550 Object.unobserve(dummy, observer.callback); 1550 Object.unobserve(dummy, observer.callback);
1551 var array = [0]; 1551 var array = [0];
1552 Object.observe(array, observer.callback); 1552 Object.observe(array, observer.callback);
1553 array.splice(0, 1); 1553 array.splice(0, 1);
1554 Object.deliverChangeRecords(observer.callback); 1554 Object.deliverChangeRecords(observer.callback);
1555 observer.assertCallbackRecords([ 1555 observer.assertCallbackRecords([
1556 { object: array, name: '0', type: 'deleted', oldValue: 0 }, 1556 { object: array, name: '0', type: 'delete', oldValue: 0 },
1557 { object: array, name: 'length', type: 'updated', oldValue: 1}, 1557 { object: array, name: 'length', type: 'update', oldValue: 1},
1558 ]); 1558 ]);
1559 1559
1560 1560
1561 // __proto__ 1561 // __proto__
1562 reset(); 1562 reset();
1563 var obj = {}; 1563 var obj = {};
1564 Object.observe(obj, observer.callback); 1564 Object.observe(obj, observer.callback);
1565 var p = {foo: 'yes'}; 1565 var p = {foo: 'yes'};
1566 var q = {bar: 'no'}; 1566 var q = {bar: 'no'};
1567 obj.__proto__ = p; 1567 obj.__proto__ = p;
1568 obj.__proto__ = p; // ignored 1568 obj.__proto__ = p; // ignored
1569 obj.__proto__ = null; 1569 obj.__proto__ = null;
1570 obj.__proto__ = q; // the __proto__ accessor is gone 1570 obj.__proto__ = q; // the __proto__ accessor is gone
1571 // TODO(adamk): Add tests for objects with hidden prototypes 1571 // TODO(adamk): Add tests for objects with hidden prototypes
1572 // once we support observing the global object. 1572 // once we support observing the global object.
1573 Object.deliverChangeRecords(observer.callback); 1573 Object.deliverChangeRecords(observer.callback);
1574 observer.assertCallbackRecords([ 1574 observer.assertCallbackRecords([
1575 { object: obj, name: '__proto__', type: 'prototype', 1575 { object: obj, name: '__proto__', type: 'setPrototype',
1576 oldValue: Object.prototype }, 1576 oldValue: Object.prototype },
1577 { object: obj, name: '__proto__', type: 'prototype', oldValue: p }, 1577 { object: obj, name: '__proto__', type: 'setPrototype', oldValue: p },
1578 { object: obj, name: '__proto__', type: 'new' }, 1578 { object: obj, name: '__proto__', type: 'add' },
1579 ]); 1579 ]);
1580 1580
1581 1581
1582 // Function.prototype 1582 // Function.prototype
1583 reset(); 1583 reset();
1584 var fun = function(){}; 1584 var fun = function(){};
1585 Object.observe(fun, observer.callback); 1585 Object.observe(fun, observer.callback);
1586 var myproto = {foo: 'bar'}; 1586 var myproto = {foo: 'bar'};
1587 fun.prototype = myproto; 1587 fun.prototype = myproto;
1588 fun.prototype = 7; 1588 fun.prototype = 7;
1589 fun.prototype = 7; // ignored 1589 fun.prototype = 7; // ignored
1590 Object.defineProperty(fun, 'prototype', {value: 8}); 1590 Object.defineProperty(fun, 'prototype', {value: 8});
1591 Object.deliverChangeRecords(observer.callback); 1591 Object.deliverChangeRecords(observer.callback);
1592 observer.assertRecordCount(3); 1592 observer.assertRecordCount(3);
1593 // Manually examine the first record in order to test 1593 // Manually examine the first record in order to test
1594 // lazy creation of oldValue 1594 // lazy creation of oldValue
1595 assertSame(fun, observer.records[0].object); 1595 assertSame(fun, observer.records[0].object);
1596 assertEquals('prototype', observer.records[0].name); 1596 assertEquals('prototype', observer.records[0].name);
1597 assertEquals('updated', observer.records[0].type); 1597 assertEquals('update', observer.records[0].type);
1598 // The only existing reference to the oldValue object is in this 1598 // The only existing reference to the oldValue object is in this
1599 // record, so to test that lazy creation happened correctly 1599 // record, so to test that lazy creation happened correctly
1600 // we compare its constructor to our function (one of the invariants 1600 // we compare its constructor to our function (one of the invariants
1601 // ensured when creating an object via AllocateFunctionPrototype). 1601 // ensured when creating an object via AllocateFunctionPrototype).
1602 assertSame(fun, observer.records[0].oldValue.constructor); 1602 assertSame(fun, observer.records[0].oldValue.constructor);
1603 observer.records.splice(0, 1); 1603 observer.records.splice(0, 1);
1604 observer.assertCallbackRecords([ 1604 observer.assertCallbackRecords([
1605 { object: fun, name: 'prototype', type: 'updated', oldValue: myproto }, 1605 { object: fun, name: 'prototype', type: 'update', oldValue: myproto },
1606 { object: fun, name: 'prototype', type: 'updated', oldValue: 7 }, 1606 { object: fun, name: 'prototype', type: 'update', oldValue: 7 },
1607 ]); 1607 ]);
1608 1608
1609 // Function.prototype should not be observable except on the object itself 1609 // Function.prototype should not be observable except on the object itself
1610 reset(); 1610 reset();
1611 var fun = function(){}; 1611 var fun = function(){};
1612 var obj = { __proto__: fun }; 1612 var obj = { __proto__: fun };
1613 Object.observe(obj, observer.callback); 1613 Object.observe(obj, observer.callback);
1614 obj.prototype = 7; 1614 obj.prototype = 7;
1615 Object.deliverChangeRecords(observer.callback); 1615 Object.deliverChangeRecords(observer.callback);
1616 observer.assertNotCalled(); 1616 observer.assertNotCalled();
(...skipping 25 matching lines...) Expand all
1642 setElement(arr, prop, 4); 1642 setElement(arr, prop, 4);
1643 if (polymorphic) setElement(["M", "i", "l", "n", "e", "r"], 0, "m"); 1643 if (polymorphic) setElement(["M", "i", "l", "n", "e", "r"], 0, "m");
1644 if (optimize) %OptimizeFunctionOnNextCall(setElement); 1644 if (optimize) %OptimizeFunctionOnNextCall(setElement);
1645 setElement(arr, prop, 5); 1645 setElement(arr, prop, 5);
1646 1646
1647 reset(); 1647 reset();
1648 Object.observe(arr, observer.callback); 1648 Object.observe(arr, observer.callback);
1649 setElement(arr, prop, 989898); 1649 setElement(arr, prop, 989898);
1650 Object.deliverChangeRecords(observer.callback); 1650 Object.deliverChangeRecords(observer.callback);
1651 observer.assertCallbackRecords([ 1651 observer.assertCallbackRecords([
1652 { object: arr, name: "" + prop, type: 'updated', oldValue: 5 } 1652 { object: arr, name: "" + prop, type: 'update', oldValue: 5 }
1653 ]); 1653 ]);
1654 } 1654 }
1655 1655
1656 for (var b1 = 0; b1 < 2; ++b1) 1656 for (var b1 = 0; b1 < 2; ++b1)
1657 for (var b2 = 0; b2 < 2; ++b2) 1657 for (var b2 = 0; b2 < 2; ++b2)
1658 for (var b3 = 0; b3 < 2; ++b3) 1658 for (var b3 = 0; b3 < 2; ++b3)
1659 for (var i in props) 1659 for (var i in props)
1660 for (var j in mutation) 1660 for (var j in mutation)
1661 TestFastElements(props[i], mutation[j], b1 != 0, b2 != 0, b3 != 0); 1661 TestFastElements(props[i], mutation[j], b1 != 0, b2 != 0, b3 != 0);
1662 1662
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1699 setLength(arr, newSize); 1699 setLength(arr, newSize);
1700 Object.deliverChangeRecords(observer.callback); 1700 Object.deliverChangeRecords(observer.callback);
1701 if (oldSize === newSize) { 1701 if (oldSize === newSize) {
1702 observer.assertNotCalled(); 1702 observer.assertNotCalled();
1703 } else { 1703 } else {
1704 var count = oldSize > newSize ? oldSize - newSize : 0; 1704 var count = oldSize > newSize ? oldSize - newSize : 0;
1705 observer.assertRecordCount(count + 1); 1705 observer.assertRecordCount(count + 1);
1706 var lengthRecord = observer.records[count]; 1706 var lengthRecord = observer.records[count];
1707 assertSame(arr, lengthRecord.object); 1707 assertSame(arr, lengthRecord.object);
1708 assertEquals('length', lengthRecord.name); 1708 assertEquals('length', lengthRecord.name);
1709 assertEquals('updated', lengthRecord.type); 1709 assertEquals('update', lengthRecord.type);
1710 assertSame(oldSize, lengthRecord.oldValue); 1710 assertSame(oldSize, lengthRecord.oldValue);
1711 } 1711 }
1712 } 1712 }
1713 1713
1714 for (var b1 = 0; b1 < 2; ++b1) 1714 for (var b1 = 0; b1 < 2; ++b1)
1715 for (var b2 = 0; b2 < 2; ++b2) 1715 for (var b2 = 0; b2 < 2; ++b2)
1716 for (var n1 = 0; n1 < 3; ++n1) 1716 for (var n1 = 0; n1 < 3; ++n1)
1717 for (var n2 = 0; n2 < 3; ++n2) 1717 for (var n2 = 0; n2 < 3; ++n2)
1718 for (var i in mutation) 1718 for (var i in mutation)
1719 TestFastElementsLength(mutation[i], b1 != 0, b2 != 0, 20*n1, 20*n2); 1719 TestFastElementsLength(mutation[i], b1 != 0, b2 != 0, 20*n1, 20*n2);
1720 1720
1721 for (var b1 = 0; b1 < 2; ++b1) 1721 for (var b1 = 0; b1 < 2; ++b1)
1722 for (var b2 = 0; b2 < 2; ++b2) 1722 for (var b2 = 0; b2 < 2; ++b2)
1723 for (var n = 0; n < 3; ++n) 1723 for (var n = 0; n < 3; ++n)
1724 for (var i in mutationByIncr) 1724 for (var i in mutationByIncr)
1725 TestFastElementsLength(mutationByIncr[i], b1 != 0, b2 != 0, 7*n, 7*n+1); 1725 TestFastElementsLength(mutationByIncr[i], b1 != 0, b2 != 0, 7*n, 7*n+1);
OLDNEW
« no previous file with comments | « test/cctest/test-object-observe.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698