| OLD | NEW |
| 1 // Copyright 2008 the V8 project authors. All rights reserved. | 1 // Copyright 2008 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 10 matching lines...) Expand all Loading... |
| 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 | 27 |
| 28 // Flags: --harmony-proxies | 28 // Flags: --harmony-proxies |
| 29 | 29 |
| 30 | 30 |
| 31 // TODO(rossberg): integer-index properties not implemented properly. | |
| 32 // TODO(rossberg): for-in not implemented on proxies. | 31 // TODO(rossberg): for-in not implemented on proxies. |
| 33 | 32 |
| 34 | 33 |
| 35 // Helper. | 34 // Helper. |
| 36 | 35 |
| 37 function TestWithProxies(test, handler) { | 36 function TestWithProxies(test, handler) { |
| 38 test(handler, Proxy.create) | 37 test(handler, Proxy.create) |
| 39 test(handler, function(h) {return Proxy.createFunction(h, function() {})}) | 38 test(handler, function(h) {return Proxy.createFunction(h, function() {})}) |
| 40 } | 39 } |
| 41 | 40 |
| 42 | 41 |
| 43 | 42 |
| 44 // Getting property descriptors (Object.getOwnPropertyDescriptor). | 43 // Getting property descriptors (Object.getOwnPropertyDescriptor). |
| 45 | 44 |
| 46 var key | 45 var key |
| 47 | 46 |
| 48 function TestGetOwnProperty(handler) { | 47 function TestGetOwnProperty(handler) { |
| 49 TestWithProxies(TestGetOwnProperty2, handler) | 48 TestWithProxies(TestGetOwnProperty2, handler) |
| 50 } | 49 } |
| 51 | 50 |
| 52 function TestGetOwnProperty2(handler, create) { | 51 function TestGetOwnProperty2(handler, create) { |
| 53 var p = create(handler) | 52 var p = create(handler) |
| 54 assertEquals(42, Object.getOwnPropertyDescriptor(p, "a").value) | 53 assertEquals(42, Object.getOwnPropertyDescriptor(p, "a").value) |
| 55 assertEquals("a", key) | 54 assertEquals("a", key) |
| 55 assertEquals(42, Object.getOwnPropertyDescriptor(p, 99).value) |
| 56 assertEquals("99", key) |
| 56 } | 57 } |
| 57 | 58 |
| 58 TestGetOwnProperty({ | 59 TestGetOwnProperty({ |
| 59 getOwnPropertyDescriptor: function(k) { | 60 getOwnPropertyDescriptor: function(k) { |
| 60 key = k | 61 key = k |
| 61 return {value: 42, configurable: true} | 62 return {value: 42, configurable: true} |
| 62 } | 63 } |
| 63 }) | 64 }) |
| 64 | 65 |
| 65 TestGetOwnProperty({ | 66 TestGetOwnProperty({ |
| (...skipping 20 matching lines...) Expand all Loading... |
| 86 })) | 87 })) |
| 87 | 88 |
| 88 | 89 |
| 89 function TestGetOwnPropertyThrow(handler) { | 90 function TestGetOwnPropertyThrow(handler) { |
| 90 TestWithProxies(TestGetOwnPropertyThrow2, handler) | 91 TestWithProxies(TestGetOwnPropertyThrow2, handler) |
| 91 } | 92 } |
| 92 | 93 |
| 93 function TestGetOwnPropertyThrow2(handler, create) { | 94 function TestGetOwnPropertyThrow2(handler, create) { |
| 94 var p = create(handler) | 95 var p = create(handler) |
| 95 assertThrows(function(){ Object.getOwnPropertyDescriptor(p, "a") }, "myexn") | 96 assertThrows(function(){ Object.getOwnPropertyDescriptor(p, "a") }, "myexn") |
| 97 assertThrows(function(){ Object.getOwnPropertyDescriptor(p, 77) }, "myexn") |
| 96 } | 98 } |
| 97 | 99 |
| 98 TestGetOwnPropertyThrow({ | 100 TestGetOwnPropertyThrow({ |
| 99 getOwnPropertyDescriptor: function(k) { throw "myexn" } | 101 getOwnPropertyDescriptor: function(k) { throw "myexn" } |
| 100 }) | 102 }) |
| 101 | 103 |
| 102 TestGetOwnPropertyThrow({ | 104 TestGetOwnPropertyThrow({ |
| 103 getOwnPropertyDescriptor: function(k) { | 105 getOwnPropertyDescriptor: function(k) { |
| 104 return this.getPropertyDescriptor2(k) | 106 return this.getPropertyDescriptor2(k) |
| 105 }, | 107 }, |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 TestWithProxies(TestGetCall2, handler) | 191 TestWithProxies(TestGetCall2, handler) |
| 190 } | 192 } |
| 191 | 193 |
| 192 function TestGetCall2(handler, create) { | 194 function TestGetCall2(handler, create) { |
| 193 var p = create(handler) | 195 var p = create(handler) |
| 194 assertEquals(55, p.f()) | 196 assertEquals(55, p.f()) |
| 195 assertEquals(55, p["f"]()) | 197 assertEquals(55, p["f"]()) |
| 196 assertEquals(55, p.f("unused", "arguments")) | 198 assertEquals(55, p.f("unused", "arguments")) |
| 197 assertEquals(55, p.f.call(p)) | 199 assertEquals(55, p.f.call(p)) |
| 198 assertEquals(55, p["f"].call(p)) | 200 assertEquals(55, p["f"].call(p)) |
| 201 assertEquals(55, p[101].call(p)) |
| 199 assertEquals(55, p.withargs(45, 5)) | 202 assertEquals(55, p.withargs(45, 5)) |
| 200 assertEquals(55, p.withargs.call(p, 11, 22)) | 203 assertEquals(55, p.withargs.call(p, 11, 22)) |
| 201 assertEquals("6655", "66" + p) // calls p.toString | 204 assertEquals("6655", "66" + p) // calls p.toString |
| 202 | 205 |
| 203 var o = Object.create(p, {g: {value: function(x) { return x + 88 }}}) | 206 var o = Object.create(p, {g: {value: function(x) { return x + 88 }}}) |
| 204 assertEquals(55, o.f()) | 207 assertEquals(55, o.f()) |
| 205 assertEquals(55, o["f"]()) | 208 assertEquals(55, o["f"]()) |
| 206 assertEquals(55, o.f("unused", "arguments")) | 209 assertEquals(55, o.f("unused", "arguments")) |
| 207 assertEquals(55, o.f.call(o)) | 210 assertEquals(55, o.f.call(o)) |
| 208 assertEquals(55, o.f.call(p)) | 211 assertEquals(55, o.f.call(p)) |
| 209 assertEquals(55, o["f"].call(p)) | 212 assertEquals(55, o["f"].call(p)) |
| 213 assertEquals(55, o[101].call(p)) |
| 210 assertEquals(55, o.withargs(45, 5)) | 214 assertEquals(55, o.withargs(45, 5)) |
| 211 assertEquals(55, o.withargs.call(p, 11, 22)) | 215 assertEquals(55, o.withargs.call(p, 11, 22)) |
| 212 assertEquals(90, o.g(2)) | 216 assertEquals(90, o.g(2)) |
| 213 assertEquals(91, o.g.call(o, 3)) | 217 assertEquals(91, o.g.call(o, 3)) |
| 214 assertEquals(92, o.g.call(p, 4)) | 218 assertEquals(92, o.g.call(p, 4)) |
| 215 assertEquals("6655", "66" + o) // calls o.toString | 219 assertEquals("6655", "66" + o) // calls o.toString |
| 216 } | 220 } |
| 217 | 221 |
| 218 TestGetCall({ | 222 TestGetCall({ |
| 219 get: function(r, k) { return function() { return 55 } } | 223 get: function(r, k) { return function() { return 55 } } |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 | 274 |
| 271 | 275 |
| 272 function TestGetThrow(handler) { | 276 function TestGetThrow(handler) { |
| 273 TestWithProxies(TestGetThrow2, handler) | 277 TestWithProxies(TestGetThrow2, handler) |
| 274 } | 278 } |
| 275 | 279 |
| 276 function TestGetThrow2(handler, create) { | 280 function TestGetThrow2(handler, create) { |
| 277 var p = create(handler) | 281 var p = create(handler) |
| 278 assertThrows(function(){ p.a }, "myexn") | 282 assertThrows(function(){ p.a }, "myexn") |
| 279 assertThrows(function(){ p["b"] }, "myexn") | 283 assertThrows(function(){ p["b"] }, "myexn") |
| 284 assertThrows(function(){ p[3] }, "myexn") |
| 280 | 285 |
| 281 var o = Object.create(p, {x: {value: 88}}) | 286 var o = Object.create(p, {x: {value: 88}, '4': {value: 89}}) |
| 282 assertThrows(function(){ o.a }, "myexn") | 287 assertThrows(function(){ o.a }, "myexn") |
| 283 assertThrows(function(){ o["b"] }, "myexn") | 288 assertThrows(function(){ o["b"] }, "myexn") |
| 289 assertThrows(function(){ o[3] }, "myexn") |
| 284 assertEquals(88, o.x) | 290 assertEquals(88, o.x) |
| 285 assertEquals(88, o["x"]) | 291 assertEquals(88, o["x"]) |
| 292 assertEquals(89, o[4]) |
| 286 } | 293 } |
| 287 | 294 |
| 288 TestGetThrow({ | 295 TestGetThrow({ |
| 289 get: function(r, k) { throw "myexn" } | 296 get: function(r, k) { throw "myexn" } |
| 290 }) | 297 }) |
| 291 | 298 |
| 292 TestGetThrow({ | 299 TestGetThrow({ |
| 293 get: function(r, k) { return this.get2(r, k) }, | 300 get: function(r, k) { return this.get2(r, k) }, |
| 294 get2: function(r, k) { throw "myexn" } | 301 get2: function(r, k) { throw "myexn" } |
| 295 }) | 302 }) |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 } | 343 } |
| 337 | 344 |
| 338 function TestSet2(handler, create) { | 345 function TestSet2(handler, create) { |
| 339 var p = create(handler) | 346 var p = create(handler) |
| 340 assertEquals(42, p.a = 42) | 347 assertEquals(42, p.a = 42) |
| 341 assertEquals("a", key) | 348 assertEquals("a", key) |
| 342 assertEquals(42, val) | 349 assertEquals(42, val) |
| 343 assertEquals(43, p["b"] = 43) | 350 assertEquals(43, p["b"] = 43) |
| 344 assertEquals("b", key) | 351 assertEquals("b", key) |
| 345 assertEquals(43, val) | 352 assertEquals(43, val) |
| 353 assertEquals(44, p[77] = 44) |
| 354 assertEquals("77", key) |
| 355 assertEquals(44, val) |
| 346 } | 356 } |
| 347 | 357 |
| 348 TestSet({ | 358 TestSet({ |
| 349 set: function(r, k, v) { key = k; val = v; return true }, | 359 set: function(r, k, v) { key = k; val = v; return true }, |
| 350 }) | 360 }) |
| 351 | 361 |
| 352 TestSet({ | 362 TestSet({ |
| 353 set: function(r, k, v) { return this.set2(r, k, v) }, | 363 set: function(r, k, v) { return this.set2(r, k, v) }, |
| 354 set2: function(r, k, v) { key = k; val = v; return true } | 364 set2: function(r, k, v) { key = k; val = v; return true } |
| 355 }) | 365 }) |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 | 426 |
| 417 | 427 |
| 418 function TestSetThrow(handler, create) { | 428 function TestSetThrow(handler, create) { |
| 419 TestWithProxies(TestSetThrow2, handler) | 429 TestWithProxies(TestSetThrow2, handler) |
| 420 } | 430 } |
| 421 | 431 |
| 422 function TestSetThrow2(handler, create) { | 432 function TestSetThrow2(handler, create) { |
| 423 var p = create(handler) | 433 var p = create(handler) |
| 424 assertThrows(function(){ p.a = 42 }, "myexn") | 434 assertThrows(function(){ p.a = 42 }, "myexn") |
| 425 assertThrows(function(){ p["b"] = 42 }, "myexn") | 435 assertThrows(function(){ p["b"] = 42 }, "myexn") |
| 436 assertThrows(function(){ p[22] = 42 }, "myexn") |
| 426 } | 437 } |
| 427 | 438 |
| 428 TestSetThrow({ | 439 TestSetThrow({ |
| 429 set: function(r, k, v) { throw "myexn" } | 440 set: function(r, k, v) { throw "myexn" } |
| 430 }) | 441 }) |
| 431 | 442 |
| 432 TestSetThrow({ | 443 TestSetThrow({ |
| 433 set: function(r, k, v) { return this.set2(r, k, v) }, | 444 set: function(r, k, v) { return this.set2(r, k, v) }, |
| 434 set2: function(r, k, v) { throw "myexn" } | 445 set2: function(r, k, v) { throw "myexn" } |
| 435 }) | 446 }) |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 | 547 |
| 537 var key | 548 var key |
| 538 var val | 549 var val |
| 539 | 550 |
| 540 function TestSetForDerived(handler, create) { | 551 function TestSetForDerived(handler, create) { |
| 541 TestWithProxies(TestSetForDerived2, handler) | 552 TestWithProxies(TestSetForDerived2, handler) |
| 542 } | 553 } |
| 543 | 554 |
| 544 function TestSetForDerived2(handler, create) { | 555 function TestSetForDerived2(handler, create) { |
| 545 var p = create(handler) | 556 var p = create(handler) |
| 546 var o = Object.create(p, {x: {value: 88, writable: true}}) | 557 var o = Object.create(p, {x: {value: 88, writable: true}, |
| 558 '1': {value: 89, writable: true}}) |
| 547 | 559 |
| 548 key = "" | 560 key = "" |
| 549 assertEquals(48, o.x = 48) | 561 assertEquals(48, o.x = 48) |
| 550 assertEquals("", key) // trap not invoked | 562 assertEquals("", key) // trap not invoked |
| 551 assertEquals(48, o.x) | 563 assertEquals(48, o.x) |
| 552 | 564 |
| 565 assertEquals(47, o[1] = 47) |
| 566 assertEquals("", key) // trap not invoked |
| 567 assertEquals(47, o[1]) |
| 568 |
| 553 assertEquals(49, o.y = 49) | 569 assertEquals(49, o.y = 49) |
| 554 assertEquals("y", key) | 570 assertEquals("y", key) |
| 555 assertEquals(49, o.y) | 571 assertEquals(49, o.y) |
| 556 | 572 |
| 573 assertEquals(50, o[2] = 50) |
| 574 assertEquals("2", key) |
| 575 assertEquals(50, o[2]) |
| 576 |
| 557 assertEquals(44, o.p_writable = 44) | 577 assertEquals(44, o.p_writable = 44) |
| 558 assertEquals("p_writable", key) | 578 assertEquals("p_writable", key) |
| 559 assertEquals(44, o.p_writable) | 579 assertEquals(44, o.p_writable) |
| 560 | 580 |
| 561 assertEquals(45, o.p_nonwritable = 45) | 581 assertEquals(45, o.p_nonwritable = 45) |
| 562 assertEquals("p_nonwritable", key) | 582 assertEquals("p_nonwritable", key) |
| 563 assertEquals(45, o.p_nonwritable) | 583 assertEquals(45, o.p_nonwritable) |
| 564 | 584 |
| 565 assertEquals(46, o.p_setter = 46) | 585 assertEquals(46, o.p_setter = 46) |
| 566 assertEquals("p_setter", key) | 586 assertEquals("p_setter", key) |
| 567 assertEquals(46, val) // written to parent | 587 assertEquals(46, val) // written to parent |
| 568 assertFalse(Object.prototype.hasOwnProperty.call(o, "p_setter")) | 588 assertFalse(Object.prototype.hasOwnProperty.call(o, "p_setter")) |
| 569 | 589 |
| 570 val = "" | 590 val = "" |
| 571 assertEquals(47, o.p_nosetter = 47) | 591 assertEquals(47, o.p_nosetter = 47) |
| 572 assertEquals("p_nosetter", key) | 592 assertEquals("p_nosetter", key) |
| 573 assertEquals("", val) // not written at all | 593 assertEquals("", val) // not written at all |
| 574 assertFalse(Object.prototype.hasOwnProperty.call(o, "p_nosetter")); | 594 assertFalse(Object.prototype.hasOwnProperty.call(o, "p_nosetter")); |
| 575 | 595 |
| 576 key = "" | 596 key = "" |
| 577 assertThrows(function(){ "use strict"; o.p_nosetter = 50 }, TypeError) | 597 assertThrows(function(){ "use strict"; o.p_nosetter = 50 }, TypeError) |
| 578 assertEquals("p_nosetter", key) | 598 assertEquals("p_nosetter", key) |
| 579 assertEquals("", val) // not written at all | 599 assertEquals("", val) // not written at all |
| 580 | 600 |
| 601 assertThrows(function(){ o.p_nonconf = 53 }, TypeError) |
| 602 assertEquals("p_nonconf", key) |
| 603 |
| 581 assertThrows(function(){ o.p_throw = 51 }, "myexn") | 604 assertThrows(function(){ o.p_throw = 51 }, "myexn") |
| 582 assertEquals("p_throw", key) | 605 assertEquals("p_throw", key) |
| 583 | 606 |
| 584 assertThrows(function(){ o.p_setterthrow = 52 }, "myexn") | 607 assertThrows(function(){ o.p_setterthrow = 52 }, "myexn") |
| 585 assertEquals("p_setterthrow", key) | 608 assertEquals("p_setterthrow", key) |
| 586 } | 609 } |
| 587 | 610 |
| 588 TestSetForDerived({ | 611 TestSetForDerived({ |
| 589 getOwnPropertyDescriptor: function(k) { | 612 getOwnPropertyDescriptor: function(k) { |
| 590 key = k; | 613 key = k; |
| 591 switch (k) { | 614 switch (k) { |
| 592 case "p_writable": return {writable: true} | 615 case "p_writable": return {writable: true, configurable: true} |
| 593 case "p_nonwritable": return {writable: false} | 616 case "p_nonwritable": return {writable: false, configurable: true} |
| 594 case "p_setter":return {set: function(x) { val = x }} | 617 case "p_setter":return {set: function(x) { val = x }, configurable: true} |
| 595 case "p_nosetter": return {get: function() { return 1 }} | 618 case "p_nosetter": return {get: function() { return 1 }, configurable: tru
e} |
| 619 case "p_nonconf":return {} |
| 596 case "p_throw": throw "myexn" | 620 case "p_throw": throw "myexn" |
| 597 case "p_setterthrow": return {set: function(x) { throw "myexn" }} | 621 case "p_setterthrow": return {set: function(x) { throw "myexn" }} |
| 598 default: return undefined | 622 default: return undefined |
| 599 } | 623 } |
| 600 } | 624 } |
| 601 }) | 625 }) |
| 602 | 626 |
| 603 | 627 |
| 604 // TODO(rossberg): TestSetReject, returning false | 628 // TODO(rossberg): TestSetReject, returning false |
| 605 // TODO(rossberg): TestGetProperty, TestSetProperty | 629 // TODO(rossberg): TestGetProperty, TestSetProperty |
| (...skipping 21 matching lines...) Expand all Loading... |
| 627 assertEquals(2, Object.getOwnPropertyNames(desc).length) | 651 assertEquals(2, Object.getOwnPropertyNames(desc).length) |
| 628 assertEquals(45, desc.value) | 652 assertEquals(45, desc.value) |
| 629 assertEquals(false, desc.writable) | 653 assertEquals(false, desc.writable) |
| 630 | 654 |
| 631 assertEquals(p, Object.defineProperty(p, "c", {value: 46, enumerable: false})) | 655 assertEquals(p, Object.defineProperty(p, "c", {value: 46, enumerable: false})) |
| 632 assertEquals("c", key) | 656 assertEquals("c", key) |
| 633 assertEquals(2, Object.getOwnPropertyNames(desc).length) | 657 assertEquals(2, Object.getOwnPropertyNames(desc).length) |
| 634 assertEquals(46, desc.value) | 658 assertEquals(46, desc.value) |
| 635 assertEquals(false, desc.enumerable) | 659 assertEquals(false, desc.enumerable) |
| 636 | 660 |
| 661 assertEquals(p, Object.defineProperty(p, 101, {value: 47, enumerable: false})) |
| 662 assertEquals("101", key) |
| 663 assertEquals(2, Object.getOwnPropertyNames(desc).length) |
| 664 assertEquals(47, desc.value) |
| 665 assertEquals(false, desc.enumerable) |
| 666 |
| 637 var attributes = {configurable: true, mine: 66, minetoo: 23} | 667 var attributes = {configurable: true, mine: 66, minetoo: 23} |
| 638 assertEquals(p, Object.defineProperty(p, "d", attributes)) | 668 assertEquals(p, Object.defineProperty(p, "d", attributes)) |
| 639 assertEquals("d", key) | 669 assertEquals("d", key) |
| 640 // Modifying the attributes object after the fact should have no effect. | 670 // Modifying the attributes object after the fact should have no effect. |
| 641 attributes.configurable = false | 671 attributes.configurable = false |
| 642 attributes.mine = 77 | 672 attributes.mine = 77 |
| 643 delete attributes.minetoo | 673 delete attributes.minetoo |
| 644 assertEquals(3, Object.getOwnPropertyNames(desc).length) | 674 assertEquals(3, Object.getOwnPropertyNames(desc).length) |
| 645 assertEquals(true, desc.configurable) | 675 assertEquals(true, desc.configurable) |
| 646 assertEquals(66, desc.mine) | 676 assertEquals(66, desc.mine) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 661 // getOwnPropertyNames: function() { return ["value"] } | 691 // getOwnPropertyNames: function() { return ["value"] } |
| 662 // }) | 692 // }) |
| 663 // assertEquals(1, Object.getOwnPropertyNames(d).length) | 693 // assertEquals(1, Object.getOwnPropertyNames(d).length) |
| 664 // assertEquals(77, d.value) | 694 // assertEquals(77, d.value) |
| 665 // assertEquals(p, Object.defineProperty(p, "p", d)) | 695 // assertEquals(p, Object.defineProperty(p, "p", d)) |
| 666 // assertEquals("p", key) | 696 // assertEquals("p", key) |
| 667 // assertEquals(1, Object.getOwnPropertyNames(desc).length) | 697 // assertEquals(1, Object.getOwnPropertyNames(desc).length) |
| 668 // assertEquals(77, desc.value) | 698 // assertEquals(77, desc.value) |
| 669 | 699 |
| 670 var props = { | 700 var props = { |
| 671 'bla': {}, | 701 '11': {}, |
| 672 blub: {get: function() { return true }}, | 702 blub: {get: function() { return true }}, |
| 673 '': {get value() { return 20 }}, | 703 '': {get value() { return 20 }}, |
| 674 last: {value: 21, configurable: true, mine: "eyes"} | 704 last: {value: 21, configurable: true, mine: "eyes"} |
| 675 } | 705 } |
| 676 Object.defineProperty(props, "hidden", {value: "hidden", enumerable: false}) | 706 Object.defineProperty(props, "hidden", {value: "hidden", enumerable: false}) |
| 677 assertEquals(p, Object.defineProperties(p, props)) | 707 assertEquals(p, Object.defineProperties(p, props)) |
| 678 assertEquals("last", key) | 708 assertEquals("last", key) |
| 679 assertEquals(2, Object.getOwnPropertyNames(desc).length) | 709 assertEquals(2, Object.getOwnPropertyNames(desc).length) |
| 680 assertEquals(21, desc.value) | 710 assertEquals(21, desc.value) |
| 681 assertEquals(true, desc.configurable) | 711 assertEquals(true, desc.configurable) |
| (...skipping 19 matching lines...) Expand all Loading... |
| 701 })) | 731 })) |
| 702 | 732 |
| 703 | 733 |
| 704 function TestDefineThrow(handler) { | 734 function TestDefineThrow(handler) { |
| 705 TestWithProxies(TestDefineThrow2, handler) | 735 TestWithProxies(TestDefineThrow2, handler) |
| 706 } | 736 } |
| 707 | 737 |
| 708 function TestDefineThrow2(handler, create) { | 738 function TestDefineThrow2(handler, create) { |
| 709 var p = create(handler) | 739 var p = create(handler) |
| 710 assertThrows(function(){ Object.defineProperty(p, "a", {value: 44})}, "myexn") | 740 assertThrows(function(){ Object.defineProperty(p, "a", {value: 44})}, "myexn") |
| 741 assertThrows(function(){ Object.defineProperty(p, 0, {value: 44})}, "myexn") |
| 711 | 742 |
| 712 // TODO(rossberg): These tests require for-in on proxies. | 743 // TODO(rossberg): These tests require for-in on proxies. |
| 713 // var d1 = create({ | 744 // var d1 = create({ |
| 714 // get: function(r, k) { throw "myexn" }, | 745 // get: function(r, k) { throw "myexn" }, |
| 715 // getOwnPropertyNames: function() { return ["value"] } | 746 // getOwnPropertyNames: function() { return ["value"] } |
| 716 // }) | 747 // }) |
| 717 // assertThrows(function(){ Object.defineProperty(p, "p", d1) }, "myexn") | 748 // assertThrows(function(){ Object.defineProperty(p, "p", d1) }, "myexn") |
| 718 // var d2 = create({ | 749 // var d2 = create({ |
| 719 // get: function(r, k) { return 77 }, | 750 // get: function(r, k) { return 77 }, |
| 720 // getOwnPropertyNames: function() { throw "myexn" } | 751 // getOwnPropertyNames: function() { throw "myexn" } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 753 function TestDelete(handler) { | 784 function TestDelete(handler) { |
| 754 TestWithProxies(TestDelete2, handler) | 785 TestWithProxies(TestDelete2, handler) |
| 755 } | 786 } |
| 756 | 787 |
| 757 function TestDelete2(handler, create) { | 788 function TestDelete2(handler, create) { |
| 758 var p = create(handler) | 789 var p = create(handler) |
| 759 assertEquals(true, delete p.a) | 790 assertEquals(true, delete p.a) |
| 760 assertEquals("a", key) | 791 assertEquals("a", key) |
| 761 assertEquals(true, delete p["b"]) | 792 assertEquals(true, delete p["b"]) |
| 762 assertEquals("b", key) | 793 assertEquals("b", key) |
| 794 assertEquals(true, delete p[1]) |
| 795 assertEquals("1", key) |
| 763 | 796 |
| 764 assertEquals(false, delete p.z1) | 797 assertEquals(false, delete p.z1) |
| 765 assertEquals("z1", key) | 798 assertEquals("z1", key) |
| 766 assertEquals(false, delete p["z2"]) | 799 assertEquals(false, delete p["z2"]) |
| 767 assertEquals("z2", key); | 800 assertEquals("z2", key); |
| 768 | 801 |
| 769 (function() { | 802 (function() { |
| 770 "use strict" | 803 "use strict" |
| 771 assertEquals(true, delete p.c) | 804 assertEquals(true, delete p.c) |
| 772 assertEquals("c", key) | 805 assertEquals("c", key) |
| 773 assertEquals(true, delete p["d"]) | 806 assertEquals(true, delete p["d"]) |
| 774 assertEquals("d", key) | 807 assertEquals("d", key) |
| 808 assertEquals(true, delete p[2]) |
| 809 assertEquals("2", key) |
| 775 | 810 |
| 776 assertThrows(function(){ delete p.z3 }, TypeError) | 811 assertThrows(function(){ delete p.z3 }, TypeError) |
| 777 assertEquals("z3", key) | 812 assertEquals("z3", key) |
| 778 assertThrows(function(){ delete p["z4"] }, TypeError) | 813 assertThrows(function(){ delete p["z4"] }, TypeError) |
| 779 assertEquals("z4", key) | 814 assertEquals("z4", key) |
| 780 })() | 815 })() |
| 781 } | 816 } |
| 782 | 817 |
| 783 TestDelete({ | 818 TestDelete({ |
| 784 delete: function(k) { key = k; return k < "z" } | 819 delete: function(k) { key = k; return k < "z" } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 797 | 832 |
| 798 | 833 |
| 799 function TestDeleteThrow(handler) { | 834 function TestDeleteThrow(handler) { |
| 800 TestWithProxies(TestDeleteThrow2, handler) | 835 TestWithProxies(TestDeleteThrow2, handler) |
| 801 } | 836 } |
| 802 | 837 |
| 803 function TestDeleteThrow2(handler, create) { | 838 function TestDeleteThrow2(handler, create) { |
| 804 var p = create(handler) | 839 var p = create(handler) |
| 805 assertThrows(function(){ delete p.a }, "myexn") | 840 assertThrows(function(){ delete p.a }, "myexn") |
| 806 assertThrows(function(){ delete p["b"] }, "myexn"); | 841 assertThrows(function(){ delete p["b"] }, "myexn"); |
| 842 assertThrows(function(){ delete p[3] }, "myexn"); |
| 807 | 843 |
| 808 (function() { | 844 (function() { |
| 809 "use strict" | 845 "use strict" |
| 810 assertThrows(function(){ delete p.c }, "myexn") | 846 assertThrows(function(){ delete p.c }, "myexn") |
| 811 assertThrows(function(){ delete p["d"] }, "myexn") | 847 assertThrows(function(){ delete p["d"] }, "myexn") |
| 848 assertThrows(function(){ delete p[4] }, "myexn"); |
| 812 })() | 849 })() |
| 813 } | 850 } |
| 814 | 851 |
| 815 TestDeleteThrow({ | 852 TestDeleteThrow({ |
| 816 delete: function(k) { throw "myexn" } | 853 delete: function(k) { throw "myexn" } |
| 817 }) | 854 }) |
| 818 | 855 |
| 819 TestDeleteThrow({ | 856 TestDeleteThrow({ |
| 820 delete: function(k) { return this.delete2(k) }, | 857 delete: function(k) { return this.delete2(k) }, |
| 821 delete2: function(k) { throw "myexn" } | 858 delete2: function(k) { throw "myexn" } |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1024 })) | 1061 })) |
| 1025 | 1062 |
| 1026 | 1063 |
| 1027 function TestInThrow(handler) { | 1064 function TestInThrow(handler) { |
| 1028 TestWithProxies(TestInThrow2, handler) | 1065 TestWithProxies(TestInThrow2, handler) |
| 1029 } | 1066 } |
| 1030 | 1067 |
| 1031 function TestInThrow2(handler, create) { | 1068 function TestInThrow2(handler, create) { |
| 1032 var p = create(handler) | 1069 var p = create(handler) |
| 1033 assertThrows(function(){ return "a" in o }, "myexn") | 1070 assertThrows(function(){ return "a" in o }, "myexn") |
| 1071 assertThrows(function(){ return 99 in o }, "myexn") |
| 1034 assertThrows(function(){ return !("a" in o) }, "myexn") | 1072 assertThrows(function(){ return !("a" in o) }, "myexn") |
| 1035 assertThrows(function(){ return ("a" in o) ? 2 : 3 }, "myexn") | 1073 assertThrows(function(){ return ("a" in o) ? 2 : 3 }, "myexn") |
| 1036 assertThrows(function(){ if ("b" in o) {} }, "myexn") | 1074 assertThrows(function(){ if ("b" in o) {} }, "myexn") |
| 1037 assertThrows(function(){ if (!("b" in o)) {} }, "myexn") | 1075 assertThrows(function(){ if (!("b" in o)) {} }, "myexn") |
| 1038 assertThrows(function(){ if ("zzz" in o) {} }, "myexn") | 1076 assertThrows(function(){ if ("zzz" in o) {} }, "myexn") |
| 1039 } | 1077 } |
| 1040 | 1078 |
| 1041 TestInThrow({ | 1079 TestInThrow({ |
| 1042 has: function(k) { throw "myexn" } | 1080 has: function(k) { throw "myexn" } |
| 1043 }) | 1081 }) |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1072 })) | 1110 })) |
| 1073 | 1111 |
| 1074 | 1112 |
| 1075 function TestInForDerived(handler) { | 1113 function TestInForDerived(handler) { |
| 1076 TestWithProxies(TestInForDerived2, handler) | 1114 TestWithProxies(TestInForDerived2, handler) |
| 1077 } | 1115 } |
| 1078 | 1116 |
| 1079 function TestInForDerived2(handler, create) { | 1117 function TestInForDerived2(handler, create) { |
| 1080 var p = create(handler) | 1118 var p = create(handler) |
| 1081 var o = Object.create(p) | 1119 var o = Object.create(p) |
| 1120 |
| 1082 assertTrue("a" in o) | 1121 assertTrue("a" in o) |
| 1083 assertEquals("a", key) | 1122 assertEquals("a", key) |
| 1084 // TODO(rossberg): integer indexes not correctly implemeted yet | 1123 assertTrue(99 in o) |
| 1085 // assertTrue(99 in o) | 1124 assertEquals("99", key) |
| 1086 // assertEquals("99", key) | |
| 1087 assertFalse("z" in o) | 1125 assertFalse("z" in o) |
| 1088 assertEquals("z", key) | 1126 assertEquals("z", key) |
| 1089 | 1127 |
| 1090 assertEquals(2, ("a" in o) ? 2 : 0) | 1128 assertEquals(2, ("a" in o) ? 2 : 0) |
| 1091 assertEquals(0, !("a" in o) ? 2 : 0) | 1129 assertEquals(0, !("a" in o) ? 2 : 0) |
| 1092 assertEquals(0, ("zzz" in o) ? 2 : 0) | 1130 assertEquals(0, ("zzz" in o) ? 2 : 0) |
| 1093 assertEquals(2, !("zzz" in o) ? 2 : 0) | 1131 assertEquals(2, !("zzz" in o) ? 2 : 0) |
| 1094 | 1132 |
| 1095 if ("b" in o) { | 1133 if ("b" in o) { |
| 1096 } else { | 1134 } else { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1110 | 1148 |
| 1111 if (!("zzz" in o)) { | 1149 if (!("zzz" in o)) { |
| 1112 } else { | 1150 } else { |
| 1113 assertTrue(false) | 1151 assertTrue(false) |
| 1114 } | 1152 } |
| 1115 assertEquals("zzz", key) | 1153 assertEquals("zzz", key) |
| 1116 } | 1154 } |
| 1117 | 1155 |
| 1118 TestInForDerived({ | 1156 TestInForDerived({ |
| 1119 getPropertyDescriptor: function(k) { | 1157 getPropertyDescriptor: function(k) { |
| 1120 key = k; return k < "z" ? {value: 42} : void 0 | 1158 key = k; return k < "z" ? {value: 42, configurable: true} : void 0 |
| 1121 } | 1159 } |
| 1122 }) | 1160 }) |
| 1123 | 1161 |
| 1124 TestInForDerived({ | 1162 TestInForDerived({ |
| 1125 getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) }, | 1163 getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) }, |
| 1126 getPropertyDescriptor2: function(k) { | 1164 getPropertyDescriptor2: function(k) { |
| 1127 key = k; return k < "z" ? {value: 42} : void 0 | 1165 key = k; return k < "z" ? {value: 42, configurable: true} : void 0 |
| 1128 } | 1166 } |
| 1129 }) | 1167 }) |
| 1130 | 1168 |
| 1131 TestInForDerived({ | 1169 TestInForDerived({ |
| 1132 getPropertyDescriptor: function(k) { | 1170 getPropertyDescriptor: function(k) { |
| 1133 key = k; return k < "z" ? {get value() { return 42 }} : void 0 | 1171 key = k; |
| 1172 return k < "z" ? {get value() { return 42 }, configurable: true} : void 0 |
| 1134 } | 1173 } |
| 1135 }) | 1174 }) |
| 1136 | 1175 |
| 1137 /* TODO(rossberg): this will work once we implement the newest proposal | 1176 /* TODO(rossberg): this will work once we implement the newest proposal |
| 1138 * regarding default traps for getPropertyDescriptor. | 1177 * regarding default traps for getPropertyDescriptor. |
| 1139 TestInForDerived({ | 1178 TestInForDerived({ |
| 1140 getOwnPropertyDescriptor: function(k) { | 1179 getOwnPropertyDescriptor: function(k) { |
| 1141 key = k; return k < "z" ? {value: 42} : void 0 | 1180 key = k; return k < "z" ? {value: 42, configurable: true} : void 0 |
| 1142 } | 1181 } |
| 1143 }) | 1182 }) |
| 1144 | 1183 |
| 1145 TestInForDerived({ | 1184 TestInForDerived({ |
| 1146 getOwnPropertyDescriptor: function(k) { | 1185 getOwnPropertyDescriptor: function(k) { |
| 1147 return this.getOwnPropertyDescriptor2(k) | 1186 return this.getOwnPropertyDescriptor2(k) |
| 1148 }, | 1187 }, |
| 1149 getOwnPropertyDescriptor2: function(k) { | 1188 getOwnPropertyDescriptor2: function(k) { |
| 1150 key = k; return k < "z" ? {value: 42} : void 0 | 1189 key = k; return k < "z" ? {value: 42, configurable: true} : void 0 |
| 1151 } | 1190 } |
| 1152 }) | 1191 }) |
| 1153 | 1192 |
| 1154 TestInForDerived({ | 1193 TestInForDerived({ |
| 1155 getOwnPropertyDescriptor: function(k) { | 1194 getOwnPropertyDescriptor: function(k) { |
| 1156 key = k; return k < "z" ? {get value() { return 42 }} : void 0 | 1195 key = k; |
| 1196 return k < "z" ? {get value() { return 42 }, configurable: true} : void 0 |
| 1157 } | 1197 } |
| 1158 }) | 1198 }) |
| 1159 */ | 1199 */ |
| 1160 | 1200 |
| 1161 TestInForDerived(Proxy.create({ | 1201 TestInForDerived(Proxy.create({ |
| 1162 get: function(pr, pk) { | 1202 get: function(pr, pk) { |
| 1163 return function(k) { key = k; return k < "z" ? {value: 42} : void 0 } | 1203 return function(k) { |
| 1204 key = k; return k < "z" ? {value: 42, configurable: true} : void 0 |
| 1205 } |
| 1164 } | 1206 } |
| 1165 })) | 1207 })) |
| 1166 | 1208 |
| 1167 | 1209 |
| 1168 | 1210 |
| 1169 // Property descriptor conversion. | 1211 // Property descriptor conversion. |
| 1170 | 1212 |
| 1171 var descget | 1213 var descget |
| 1172 | 1214 |
| 1173 function TestDescriptorGetOrder(handler) { | 1215 function TestDescriptorGetOrder(handler) { |
| 1174 var p = Proxy.create(handler) | 1216 var p = Proxy.create(handler) |
| 1175 var o = Object.create(p, {b: {value: 0}}) | 1217 var o = Object.create(p, {b: {value: 0}}) |
| 1176 TestDescriptorGetOrder2(function(n) { p[n] }, "vV") | 1218 TestDescriptorGetOrder2(function(n) { return p[n] }, "vV") |
| 1177 TestDescriptorGetOrder2(function(n) { n in p }, "") | 1219 TestDescriptorGetOrder2(function(n) { return n in p }, "") |
| 1178 TestDescriptorGetOrder2(function(n) { o[n] }, "vV") | 1220 TestDescriptorGetOrder2(function(n) { return o[n] }, "vV") |
| 1179 TestDescriptorGetOrder2(function(n) { n in o }, "eEcCvVwWgs") | 1221 TestDescriptorGetOrder2(function(n) { return n in o }, "eEcCvVwWgs") |
| 1180 } | 1222 } |
| 1181 | 1223 |
| 1182 function TestDescriptorGetOrder2(f, access) { | 1224 function TestDescriptorGetOrder2(f, access) { |
| 1183 descget = "" | 1225 descget = "" |
| 1184 f("a") | 1226 assertTrue(f("a")) |
| 1185 assertEquals(access, descget) | 1227 assertEquals(access, descget) |
| 1186 // TODO(rossberg): integer indexes not correctly implemented yet. | |
| 1187 // descget = "" | |
| 1188 // f(99) | |
| 1189 // assertEquals(access, descget) | |
| 1190 descget = "" | 1228 descget = "" |
| 1191 f("z") | 1229 assertTrue(f(99)) |
| 1230 assertEquals(access, descget) |
| 1231 descget = "" |
| 1232 assertFalse(!!f("z")) |
| 1192 assertEquals("", descget) | 1233 assertEquals("", descget) |
| 1193 } | 1234 } |
| 1194 | 1235 |
| 1195 TestDescriptorGetOrder({ | 1236 TestDescriptorGetOrder({ |
| 1196 getPropertyDescriptor: function(k) { | 1237 getPropertyDescriptor: function(k) { |
| 1197 if (k >= "z") return void 0 | 1238 if (k >= "z") return void 0 |
| 1198 // Return a proxy as property descriptor, so that we can log accesses. | 1239 // Return a proxy as property descriptor, so that we can log accesses. |
| 1199 return Proxy.create({ | 1240 return Proxy.create({ |
| 1200 get: function(r, attr) { | 1241 get: function(r, attr) { |
| 1201 descget += attr[0].toUpperCase() | 1242 descget += attr[0].toUpperCase() |
| (...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1677 assertFixing(o, false, false, true) | 1718 assertFixing(o, false, false, true) |
| 1678 Object.freeze(o) | 1719 Object.freeze(o) |
| 1679 assertFixing(p, false, false, true) | 1720 assertFixing(p, false, false, true) |
| 1680 assertFixing(o, true, true, false) | 1721 assertFixing(o, true, true, false) |
| 1681 } | 1722 } |
| 1682 | 1723 |
| 1683 TestFix([], { | 1724 TestFix([], { |
| 1684 fix: function() { return {} } | 1725 fix: function() { return {} } |
| 1685 }) | 1726 }) |
| 1686 | 1727 |
| 1687 TestFix(["a", "b", "c", "d", "zz"], { | 1728 TestFix(["a", "b", "c", "3", "zz"], { |
| 1688 fix: function() { | 1729 fix: function() { |
| 1689 return { | 1730 return { |
| 1690 a: {value: "a", writable: true, configurable: false, enumerable: true}, | 1731 a: {value: "a", writable: true, configurable: false, enumerable: true}, |
| 1691 b: {value: 33, writable: false, configurable: false, enumerable: true}, | 1732 b: {value: 33, writable: false, configurable: false, enumerable: true}, |
| 1692 c: {value: 0, writable: true, configurable: true, enumerable: true}, | 1733 c: {value: 0, writable: true, configurable: true, enumerable: true}, |
| 1693 d: {value: true, writable: false, configurable: true, enumerable: true}, | 1734 '3': {value: true, writable: false, configurable: true, enumerable: true}, |
| 1694 zz: {value: 0, enumerable: false} | 1735 zz: {value: 0, enumerable: false} |
| 1695 } | 1736 } |
| 1696 } | 1737 } |
| 1697 }) | 1738 }) |
| 1698 | 1739 |
| 1699 TestFix(["a"], { | 1740 TestFix(["a"], { |
| 1700 fix: function() { return this.fix2() }, | 1741 fix: function() { return this.fix2() }, |
| 1701 fix2: function() { | 1742 fix2: function() { |
| 1702 return {a: {value: 4, writable: true, configurable: true, enumerable: true}} | 1743 return {a: {value: 4, writable: true, configurable: true, enumerable: true}} |
| 1703 } | 1744 } |
| (...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2185 | 2226 |
| 2186 function TestConstructThrow2(f) { | 2227 function TestConstructThrow2(f) { |
| 2187 assertThrows(function(){ new f(11) }, "myexn") | 2228 assertThrows(function(){ new f(11) }, "myexn") |
| 2188 Object.freeze(f) | 2229 Object.freeze(f) |
| 2189 assertThrows(function(){ new f(11) }, "myexn") | 2230 assertThrows(function(){ new f(11) }, "myexn") |
| 2190 } | 2231 } |
| 2191 | 2232 |
| 2192 TestConstructThrow(function() { throw "myexn" }) | 2233 TestConstructThrow(function() { throw "myexn" }) |
| 2193 TestConstructThrow(Proxy.createFunction({}, function() { throw "myexn" })) | 2234 TestConstructThrow(Proxy.createFunction({}, function() { throw "myexn" })) |
| 2194 TestConstructThrow(CreateFrozen({}, function() { throw "myexn" })) | 2235 TestConstructThrow(CreateFrozen({}, function() { throw "myexn" })) |
| OLD | NEW |