OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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); |
OLD | NEW |