Chromium Code Reviews| 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 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 289 delete obj.a; | 289 delete obj.a; |
| 290 obj.a = 4; | 290 obj.a = 4; |
| 291 obj.a = 4; // ignored | 291 obj.a = 4; // ignored |
| 292 obj.a = 5; | 292 obj.a = 5; |
| 293 Object.defineProperty(obj, "a", {value: 6}); | 293 Object.defineProperty(obj, "a", {value: 6}); |
| 294 Object.defineProperty(obj, "a", {writable: false}); | 294 Object.defineProperty(obj, "a", {writable: false}); |
| 295 obj.a = 7; // ignored | 295 obj.a = 7; // ignored |
| 296 Object.defineProperty(obj, "a", {value: 8}); | 296 Object.defineProperty(obj, "a", {value: 8}); |
| 297 Object.defineProperty(obj, "a", {value: 7, writable: true}); | 297 Object.defineProperty(obj, "a", {value: 7, writable: true}); |
| 298 Object.defineProperty(obj, "a", {get: function() {}}); | 298 Object.defineProperty(obj, "a", {get: function() {}}); |
| 299 Object.defineProperty(obj, "a", {get: function() {}}); | 299 Object.defineProperty(obj, "a", {get: frozenFunction}); |
| 300 Object.defineProperty(obj, "a", {get: frozenFunction}); // ignored | |
| 301 Object.defineProperty(obj, "a", {get: frozenFunction, set: frozenFunction}); | |
| 302 Object.defineProperty(obj, "a", {set: frozenFunction}); // ignored | |
| 303 Object.defineProperty(obj, "a", {get: undefined, set: frozenFunction}); | |
| 300 delete obj.a; | 304 delete obj.a; |
| 301 delete obj.a; | 305 delete obj.a; |
| 302 Object.defineProperty(obj, "a", {get: function() {}, configurable: true}); | 306 Object.defineProperty(obj, "a", {get: function() {}, configurable: true}); |
| 303 Object.defineProperty(obj, "a", {value: 9, writable: true}); | 307 Object.defineProperty(obj, "a", {value: 9, writable: true}); |
| 304 obj.a = 10; | 308 obj.a = 10; |
| 305 delete obj.a; | 309 delete obj.a; |
| 306 Object.defineProperty(obj, "a", {value: 11, configurable: true}); | 310 Object.defineProperty(obj, "a", {value: 11, configurable: true}); |
| 307 Object.deliverChangeRecords(observer.callback); | 311 Object.deliverChangeRecords(observer.callback); |
| 308 observer.assertCallbackRecords([ | 312 observer.assertCallbackRecords([ |
| 309 { object: obj, name: "a", type: "updated", oldValue: 1 }, | 313 { object: obj, name: "a", type: "updated", oldValue: 1 }, |
| 310 { object: obj, name: "a", type: "updated", oldValue: 2 }, | 314 { object: obj, name: "a", type: "updated", oldValue: 2 }, |
| 311 { object: obj, name: "a", type: "deleted", oldValue: 3 }, | 315 { object: obj, name: "a", type: "deleted", oldValue: 3 }, |
| 312 { object: obj, name: "a", type: "new" }, | 316 { object: obj, name: "a", type: "new" }, |
| 313 { object: obj, name: "a", type: "updated", oldValue: 4 }, | 317 { object: obj, name: "a", type: "updated", oldValue: 4 }, |
| 314 { object: obj, name: "a", type: "updated", oldValue: 5 }, | 318 { object: obj, name: "a", type: "updated", oldValue: 5 }, |
| 315 { object: obj, name: "a", type: "reconfigured", oldValue: 6 }, | 319 { object: obj, name: "a", type: "reconfigured", oldValue: 6 }, |
| 316 { object: obj, name: "a", type: "updated", oldValue: 6 }, | 320 { object: obj, name: "a", type: "updated", oldValue: 6 }, |
| 317 { object: obj, name: "a", type: "reconfigured", oldValue: 8 }, | 321 { object: obj, name: "a", type: "reconfigured", oldValue: 8 }, |
| 318 { object: obj, name: "a", type: "reconfigured", oldValue: 7 }, | 322 { object: obj, name: "a", type: "reconfigured", oldValue: 7 }, |
| 319 { object: obj, name: "a", type: "reconfigured" }, | 323 { object: obj, name: "a", type: "reconfigured" }, |
| 324 { object: obj, name: "a", type: "reconfigured" }, | |
| 325 { object: obj, name: "a", type: "reconfigured" }, | |
| 320 { object: obj, name: "a", type: "deleted" }, | 326 { object: obj, name: "a", type: "deleted" }, |
| 321 { object: obj, name: "a", type: "new" }, | 327 { object: obj, name: "a", type: "new" }, |
| 322 { object: obj, name: "a", type: "reconfigured" }, | 328 { object: obj, name: "a", type: "reconfigured" }, |
| 323 { object: obj, name: "a", type: "updated", oldValue: 9 }, | 329 { object: obj, name: "a", type: "updated", oldValue: 9 }, |
| 324 { object: obj, name: "a", type: "deleted", oldValue: 10 }, | 330 { object: obj, name: "a", type: "deleted", oldValue: 10 }, |
| 325 { object: obj, name: "a", type: "new" }, | 331 { object: obj, name: "a", type: "new" }, |
| 326 ]); | 332 ]); |
| 327 | 333 |
| 328 // Observing indexed properties. | 334 // Observing indexed properties. |
| 329 reset(); | 335 reset(); |
| 330 var obj = {'1': 1} | 336 var obj = {'1': 1} |
| 331 Object.observe(obj, observer.callback); | 337 Object.observe(obj, observer.callback); |
| 332 obj[1] = 2; | 338 obj[1] = 2; |
| 333 obj[1] = 3; | 339 obj[1] = 3; |
| 334 delete obj[1]; | 340 delete obj[1]; |
| 335 obj[1] = 4; | 341 obj[1] = 4; |
| 336 obj[1] = 4; // ignored | 342 obj[1] = 4; // ignored |
| 337 obj[1] = 5; | 343 obj[1] = 5; |
| 338 Object.defineProperty(obj, "1", {value: 6}); | 344 Object.defineProperty(obj, "1", {value: 6}); |
| 339 Object.defineProperty(obj, "1", {writable: false}); | 345 Object.defineProperty(obj, "1", {writable: false}); |
| 340 obj[1] = 7; // ignored | 346 obj[1] = 7; // ignored |
| 341 Object.defineProperty(obj, "1", {value: 8}); | 347 Object.defineProperty(obj, "1", {value: 8}); |
| 342 Object.defineProperty(obj, "1", {value: 7, writable: true}); | 348 Object.defineProperty(obj, "1", {value: 7, writable: true}); |
| 343 Object.defineProperty(obj, "1", {get: function() {}}); | 349 Object.defineProperty(obj, "1", {get: function() {}}); |
| 344 Object.defineProperty(obj, "1", {get: function() {}}); | 350 Object.defineProperty(obj, "1", {get: frozenFunction}); |
| 351 Object.defineProperty(obj, "1", {get: frozenFunction}); // ignored | |
| 352 Object.defineProperty(obj, "1", {get: frozenFunction, set: frozenFunction}); | |
| 353 Object.defineProperty(obj, "1", {set: frozenFunction}); // ignored | |
| 354 Object.defineProperty(obj, "1", {get: undefined, set: frozenFunction}); | |
| 345 delete obj[1]; | 355 delete obj[1]; |
| 346 delete obj[1]; | 356 delete obj[1]; |
| 347 Object.defineProperty(obj, "1", {get: function() {}, configurable: true}); | 357 Object.defineProperty(obj, "1", {get: function() {}, configurable: true}); |
| 348 Object.defineProperty(obj, "1", {value: 9, writable: true}); | 358 Object.defineProperty(obj, "1", {value: 9, writable: true}); |
| 349 obj[1] = 10; | 359 obj[1] = 10; |
| 350 delete obj[1]; | 360 delete obj[1]; |
| 351 Object.defineProperty(obj, "1", {value: 11, configurable: true}); | 361 Object.defineProperty(obj, "1", {value: 11, configurable: true}); |
| 352 Object.deliverChangeRecords(observer.callback); | 362 Object.deliverChangeRecords(observer.callback); |
| 353 observer.assertCallbackRecords([ | 363 observer.assertCallbackRecords([ |
| 354 { object: obj, name: "1", type: "updated", oldValue: 1 }, | 364 { object: obj, name: "1", type: "updated", oldValue: 1 }, |
| 355 { object: obj, name: "1", type: "updated", oldValue: 2 }, | 365 { object: obj, name: "1", type: "updated", oldValue: 2 }, |
| 356 { object: obj, name: "1", type: "deleted", oldValue: 3 }, | 366 { object: obj, name: "1", type: "deleted", oldValue: 3 }, |
| 357 { object: obj, name: "1", type: "new" }, | 367 { object: obj, name: "1", type: "new" }, |
| 358 { object: obj, name: "1", type: "updated", oldValue: 4 }, | 368 { object: obj, name: "1", type: "updated", oldValue: 4 }, |
| 359 { object: obj, name: "1", type: "updated", oldValue: 5 }, | 369 { object: obj, name: "1", type: "updated", oldValue: 5 }, |
| 360 { object: obj, name: "1", type: "reconfigured", oldValue: 6 }, | 370 { object: obj, name: "1", type: "reconfigured", oldValue: 6 }, |
| 361 { object: obj, name: "1", type: "updated", oldValue: 6 }, | 371 { object: obj, name: "1", type: "updated", oldValue: 6 }, |
| 362 { object: obj, name: "1", type: "reconfigured", oldValue: 8 }, | 372 { object: obj, name: "1", type: "reconfigured", oldValue: 8 }, |
| 363 { object: obj, name: "1", type: "reconfigured", oldValue: 7 }, | 373 { object: obj, name: "1", type: "reconfigured", oldValue: 7 }, |
| 364 { object: obj, name: "1", type: "reconfigured" }, | 374 { object: obj, name: "1", type: "reconfigured" }, |
| 375 { object: obj, name: "1", type: "reconfigured" }, | |
| 376 { object: obj, name: "1", type: "reconfigured" }, | |
| 365 { object: obj, name: "1", type: "deleted" }, | 377 { object: obj, name: "1", type: "deleted" }, |
| 366 { object: obj, name: "1", type: "new" }, | 378 { object: obj, name: "1", type: "new" }, |
| 367 { object: obj, name: "1", type: "reconfigured" }, | 379 { object: obj, name: "1", type: "reconfigured" }, |
| 368 { object: obj, name: "1", type: "updated", oldValue: 9 }, | 380 { object: obj, name: "1", type: "updated", oldValue: 9 }, |
| 369 { object: obj, name: "1", type: "deleted", oldValue: 10 }, | 381 { object: obj, name: "1", type: "deleted", oldValue: 10 }, |
| 370 { object: obj, name: "1", type: "new" }, | 382 { object: obj, name: "1", type: "new" }, |
| 371 ]); | 383 ]); |
| 372 | 384 |
| 373 | 385 |
| 374 // Test all kinds of objects generically. | 386 // Test all kinds of objects generically. |
| 375 function TestObserveConfigurable(obj, prop) { | 387 function TestObserveConfigurable(obj, prop) { |
| 376 reset(); | 388 reset(); |
| 377 obj[prop] = 1; | 389 obj[prop] = 1; |
| 378 Object.observe(obj, observer.callback); | 390 Object.observe(obj, observer.callback); |
| 379 obj[prop] = 2; | 391 obj[prop] = 2; |
| 380 obj[prop] = 3; | 392 obj[prop] = 3; |
| 381 delete obj[prop]; | 393 delete obj[prop]; |
| 382 obj[prop] = 4; | 394 obj[prop] = 4; |
| 383 obj[prop] = 4; // ignored | 395 obj[prop] = 4; // ignored |
| 384 obj[prop] = 5; | 396 obj[prop] = 5; |
| 385 Object.defineProperty(obj, prop, {value: 6}); | 397 Object.defineProperty(obj, prop, {value: 6}); |
| 386 Object.defineProperty(obj, prop, {writable: false}); | 398 Object.defineProperty(obj, prop, {writable: false}); |
| 387 obj[prop] = 7; // ignored | 399 obj[prop] = 7; // ignored |
| 388 Object.defineProperty(obj, prop, {value: 8}); | 400 Object.defineProperty(obj, prop, {value: 8}); |
| 389 Object.defineProperty(obj, prop, {value: 7, writable: true}); | 401 Object.defineProperty(obj, prop, {value: 7, writable: true}); |
| 390 Object.defineProperty(obj, prop, {get: function() {}}); | 402 Object.defineProperty(obj, prop, {get: function() {}}); |
| 391 Object.defineProperty(obj, prop, {get: function() {}}); | 403 Object.defineProperty(obj, prop, {get: frozenFunction}); |
| 404 Object.defineProperty(obj, prop, {get: frozenFunction}); // ignored | |
| 405 Object.defineProperty(obj, prop, {get: frozenFunction, set: frozenFunction}); | |
| 406 Object.defineProperty(obj, prop, {set: frozenFunction}); // ignored | |
| 407 Object.defineProperty(obj, prop, {get: undefined, set: frozenFunction}); | |
| 392 delete obj[prop]; | 408 delete obj[prop]; |
| 393 delete obj[prop]; | 409 delete obj[prop]; |
| 394 Object.defineProperty(obj, prop, {get: function() {}, configurable: true}); | 410 Object.defineProperty(obj, prop, {get: function() {}, configurable: true}); |
| 395 Object.defineProperty(obj, prop, {value: 9, writable: true}); | 411 Object.defineProperty(obj, prop, {value: 9, writable: true}); |
| 396 obj[prop] = 10; | 412 obj[prop] = 10; |
| 397 delete obj[prop]; | 413 delete obj[prop]; |
| 398 Object.defineProperty(obj, prop, {value: 11, configurable: true}); | 414 Object.defineProperty(obj, prop, {value: 11, configurable: true}); |
| 399 Object.deliverChangeRecords(observer.callback); | 415 Object.deliverChangeRecords(observer.callback); |
| 400 observer.assertCallbackRecords([ | 416 observer.assertCallbackRecords([ |
| 401 { object: obj, name: prop, type: "updated", oldValue: 1 }, | 417 { object: obj, name: prop, type: "updated", oldValue: 1 }, |
| 402 { object: obj, name: prop, type: "updated", oldValue: 2 }, | 418 { object: obj, name: prop, type: "updated", oldValue: 2 }, |
| 403 { object: obj, name: prop, type: "deleted", oldValue: 3 }, | 419 { object: obj, name: prop, type: "deleted", oldValue: 3 }, |
| 404 { object: obj, name: prop, type: "new" }, | 420 { object: obj, name: prop, type: "new" }, |
| 405 { object: obj, name: prop, type: "updated", oldValue: 4 }, | 421 { object: obj, name: prop, type: "updated", oldValue: 4 }, |
| 406 { object: obj, name: prop, type: "updated", oldValue: 5 }, | 422 { object: obj, name: prop, type: "updated", oldValue: 5 }, |
| 407 { object: obj, name: prop, type: "reconfigured", oldValue: 6 }, | 423 { object: obj, name: prop, type: "reconfigured", oldValue: 6 }, |
| 408 { object: obj, name: prop, type: "updated", oldValue: 6 }, | 424 { object: obj, name: prop, type: "updated", oldValue: 6 }, |
| 409 { object: obj, name: prop, type: "reconfigured", oldValue: 8 }, | 425 { object: obj, name: prop, type: "reconfigured", oldValue: 8 }, |
| 410 { object: obj, name: prop, type: "reconfigured", oldValue: 7 }, | 426 { object: obj, name: prop, type: "reconfigured", oldValue: 7 }, |
| 411 { object: obj, name: prop, type: "reconfigured" }, | 427 { object: obj, name: prop, type: "reconfigured" }, |
| 428 { object: obj, name: prop, type: "reconfigured" }, | |
| 429 { object: obj, name: prop, type: "reconfigured" }, | |
| 412 { object: obj, name: prop, type: "deleted" }, | 430 { object: obj, name: prop, type: "deleted" }, |
| 413 { object: obj, name: prop, type: "new" }, | 431 { object: obj, name: prop, type: "new" }, |
| 414 { object: obj, name: prop, type: "reconfigured" }, | 432 { object: obj, name: prop, type: "reconfigured" }, |
| 415 { object: obj, name: prop, type: "updated", oldValue: 9 }, | 433 { object: obj, name: prop, type: "updated", oldValue: 9 }, |
| 416 { object: obj, name: prop, type: "deleted", oldValue: 10 }, | 434 { object: obj, name: prop, type: "deleted", oldValue: 10 }, |
| 417 { object: obj, name: prop, type: "new" }, | 435 { object: obj, name: prop, type: "new" }, |
| 418 ]); | 436 ]); |
| 419 Object.unobserve(obj, observer.callback); | 437 Object.unobserve(obj, observer.callback); |
| 420 delete obj[prop]; | 438 delete obj[prop]; |
| 421 } | 439 } |
| 422 | 440 |
| 423 function TestObserveNonConfigurable(obj, prop) { | 441 function TestObserveNonConfigurable(obj, prop) { |
| 424 reset(); | 442 reset(); |
| 425 obj[prop] = 1; | 443 obj[prop] = 1; |
| 426 Object.observe(obj, observer.callback); | 444 Object.observe(obj, observer.callback); |
| 427 obj[prop] = 4; | 445 obj[prop] = 4; |
| 428 obj[prop] = 4; // ignored | 446 obj[prop] = 4; // ignored |
| 429 obj[prop] = 5; | 447 obj[prop] = 5; |
| 430 Object.defineProperty(obj, prop, {value: 6}); | 448 Object.defineProperty(obj, prop, {value: 6}); |
| 431 Object.defineProperty(obj, prop, {value: 6}); // ignored | 449 Object.defineProperty(obj, prop, {value: 6}); // ignored |
| 450 Object.defineProperty(obj, prop, {value: 7}); | |
| 451 Object.defineProperty(obj, prop, {enumerable: true}); // ignored | |
| 432 Object.defineProperty(obj, prop, {writable: false}); | 452 Object.defineProperty(obj, prop, {writable: false}); |
| 433 obj[prop] = 7; // ignored | 453 obj[prop] = 7; // ignored |
| 454 Object.defineProperty(obj, prop, {get: function() {}}); // ignored | |
|
adamk
2012/11/21 16:24:32
This one confuses me, why is it ignored?
rossberg
2012/11/21 16:57:03
Because the object is not configurable. ;)
| |
| 434 Object.deliverChangeRecords(observer.callback); | 455 Object.deliverChangeRecords(observer.callback); |
| 435 observer.assertCallbackRecords([ | 456 observer.assertCallbackRecords([ |
| 436 { object: obj, name: prop, type: "updated", oldValue: 1 }, | 457 { object: obj, name: prop, type: "updated", oldValue: 1 }, |
| 437 { object: obj, name: prop, type: "updated", oldValue: 4 }, | 458 { object: obj, name: prop, type: "updated", oldValue: 4 }, |
| 438 { object: obj, name: prop, type: "updated", oldValue: 5 }, | 459 { object: obj, name: prop, type: "updated", oldValue: 5 }, |
| 439 { object: obj, name: prop, type: "reconfigured", oldValue: 6 }, | 460 { object: obj, name: prop, type: "updated", oldValue: 6 }, |
| 461 { object: obj, name: prop, type: "reconfigured", oldValue: 7 }, | |
| 440 ]); | 462 ]); |
| 441 Object.unobserve(obj, observer.callback); | 463 Object.unobserve(obj, observer.callback); |
| 442 } | 464 } |
| 443 | 465 |
| 444 function createProxy(create, x) { | 466 function createProxy(create, x) { |
| 445 var handler = { | 467 var handler = { |
| 446 getPropertyDescriptor: function(k) { | 468 getPropertyDescriptor: function(k) { |
| 447 return Object.getOwnPropertyDescriptor(this.target, k); | 469 return Object.getOwnPropertyDescriptor(this.target, k); |
| 448 }, | 470 }, |
| 449 getOwnPropertyDescriptor: function(k) { | 471 getOwnPropertyDescriptor: function(k) { |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 769 Object.observe(dummy, observer.callback); | 791 Object.observe(dummy, observer.callback); |
| 770 Object.unobserve(dummy, observer.callback); | 792 Object.unobserve(dummy, observer.callback); |
| 771 var array = [0]; | 793 var array = [0]; |
| 772 Object.observe(array, observer.callback); | 794 Object.observe(array, observer.callback); |
| 773 array.splice(0, 1); | 795 array.splice(0, 1); |
| 774 Object.deliverChangeRecords(observer.callback); | 796 Object.deliverChangeRecords(observer.callback); |
| 775 observer.assertCallbackRecords([ | 797 observer.assertCallbackRecords([ |
| 776 { object: array, name: '0', type: 'deleted', oldValue: 0 }, | 798 { object: array, name: '0', type: 'deleted', oldValue: 0 }, |
| 777 { object: array, name: 'length', type: 'updated', oldValue: 1}, | 799 { object: array, name: 'length', type: 'updated', oldValue: 1}, |
| 778 ]); | 800 ]); |
| OLD | NEW |