| 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 |