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): test exception cases. | |
32 // TODO(rossberg): test proxies as prototypes. | |
33 // TODO(rossberg): for-in for proxies not implemented. | 31 // TODO(rossberg): for-in for proxies not implemented. |
32 // TODO(rossberg): inheritance from proxies not implemented. | |
34 // TODO(rossberg): function proxies as constructors not implemented. | 33 // TODO(rossberg): function proxies as constructors not implemented. |
35 | 34 |
36 | 35 |
37 // Helper. | 36 // Helper. |
38 | 37 |
39 function TestWithProxies(test, handler) { | 38 function TestWithProxies(test, handler) { |
40 test(handler, Proxy.create) | 39 test(handler, Proxy.create) |
41 test(handler, function(h) {return Proxy.createFunction(h, function() {})}) | 40 test(handler, function(h) {return Proxy.createFunction(h, function() {})}) |
42 } | 41 } |
43 | 42 |
44 | 43 |
45 // Getters. | 44 // Getters. |
46 | 45 |
47 function TestGet(handler) { | 46 function TestGet(handler) { |
48 TestWithProxies(TestGet2, handler) | 47 TestWithProxies(TestGet2, handler) |
49 } | 48 } |
50 | 49 |
51 function TestGet2(handler, create) { | 50 function TestGet2(handler, create) { |
52 var o = create(handler) | 51 var p = create(handler) |
53 assertEquals(42, o.a) | 52 assertEquals(42, p.a) |
54 assertEquals(42, o["b"]) | 53 assertEquals(42, p["b"]) |
54 | |
55 // TODO(rossberg): inheritance from proxies not yet implemented. | |
56 // var o = Object.create(p, {x: {value: 88}}) | |
57 // assertEquals(42, o.a) | |
58 // assertEquals(42, o["b"]) | |
59 // assertEquals(88, o.x) | |
60 // assertEquals(88, o["x"]) | |
55 } | 61 } |
56 | 62 |
57 TestGet({ | 63 TestGet({ |
58 get: function(r, k) { return 42 } | 64 get: function(r, k) { return 42 } |
59 }) | 65 }) |
60 | 66 |
61 TestGet({ | 67 TestGet({ |
62 get: function(r, k) { return this.get2(r, k) }, | 68 get: function(r, k) { return this.get2(r, k) }, |
63 get2: function(r, k) { return 42 } | 69 get2: function(r, k) { return 42 } |
64 }) | 70 }) |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
151 } | 157 } |
152 }) | 158 }) |
153 | 159 |
154 TestGetCall(Proxy.create({ | 160 TestGetCall(Proxy.create({ |
155 get: function(pr, pk) { | 161 get: function(pr, pk) { |
156 return function(r, k) { return function() { return 55 } } | 162 return function(r, k) { return function() { return 55 } } |
157 } | 163 } |
158 })) | 164 })) |
159 | 165 |
160 | 166 |
167 function TestGetThrow(handler) { | |
168 TestWithProxies(TestGetThrow2, handler) | |
Kevin Millikin (Chromium)
2011/09/07 12:51:36
This is impressively indirect.
rossberg
2011/09/07 14:59:34
And still there is far too much duplication in the
| |
169 } | |
170 | |
171 function TestGetThrow2(handler, create) { | |
172 var p = create(handler) | |
173 assertThrows(function(){ p.a }, "myexn") | |
174 assertThrows(function(){ p["b"] }, "myexn") | |
175 } | |
176 | |
177 TestGetThrow({ | |
178 get: function(r, k) { throw "myexn" } | |
179 }) | |
180 | |
181 TestGetThrow({ | |
182 get: function(r, k) { return this.get2(r, k) }, | |
183 get2: function(r, k) { throw "myexn" } | |
184 }) | |
185 | |
186 TestGetThrow({ | |
187 getPropertyDescriptor: function(k) { throw "myexn" } | |
188 }) | |
189 | |
190 TestGetThrow({ | |
191 getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) }, | |
192 getPropertyDescriptor2: function(k) { throw "myexn" } | |
193 }) | |
194 | |
195 TestGetThrow({ | |
196 getPropertyDescriptor: function(k) { | |
197 return {get value() { throw "myexn" }} | |
198 } | |
199 }) | |
200 | |
201 TestGetThrow({ | |
202 get: undefined, | |
203 getPropertyDescriptor: function(k) { throw "myexn" } | |
204 }) | |
205 | |
206 TestGetThrow(Proxy.create({ | |
207 get: function(pr, pk) { throw "myexn" } | |
208 })) | |
209 | |
210 TestGetThrow(Proxy.create({ | |
211 get: function(pr, pk) { | |
212 return function(r, k) { throw "myexn" } | |
213 } | |
214 })) | |
215 | |
216 | |
161 | 217 |
162 // Setters. | 218 // Setters. |
163 | 219 |
164 var key | 220 var key |
165 var val | 221 var val |
166 | 222 |
167 function TestSet(handler, create) { | 223 function TestSet(handler, create) { |
168 TestWithProxies(TestSet2, handler) | 224 TestWithProxies(TestSet2, handler) |
169 } | 225 } |
170 | 226 |
171 function TestSet2(handler, create) { | 227 function TestSet2(handler, create) { |
172 var o = create(handler) | 228 var p = create(handler) |
173 assertEquals(42, o.a = 42) | 229 assertEquals(42, p.a = 42) |
174 assertEquals("a", key) | 230 assertEquals("a", key) |
175 assertEquals(42, val) | 231 assertEquals(42, val) |
176 assertEquals(43, o["b"] = 43) | 232 assertEquals(43, p["b"] = 43) |
177 assertEquals("b", key) | 233 assertEquals("b", key) |
178 assertEquals(43, val) | 234 assertEquals(43, val) |
179 } | 235 } |
180 | 236 |
181 TestSet({ | 237 TestSet({ |
182 set: function(r, k, v) { key = k; val = v; return true } | 238 set: function(r, k, v) { key = k; val = v; return true } |
183 }) | 239 }) |
184 | 240 |
185 TestSet({ | 241 TestSet({ |
186 set: function(r, k, v) { return this.set2(r, k, v) }, | 242 set: function(r, k, v) { return this.set2(r, k, v) }, |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
242 }) | 298 }) |
243 | 299 |
244 TestSet(Proxy.create({ | 300 TestSet(Proxy.create({ |
245 get: function(pr, pk) { | 301 get: function(pr, pk) { |
246 return function(r, k, v) { key = k; val = v; return true } | 302 return function(r, k, v) { key = k; val = v; return true } |
247 } | 303 } |
248 })) | 304 })) |
249 | 305 |
250 | 306 |
251 | 307 |
308 function TestSetThrow(handler, create) { | |
309 TestWithProxies(TestSetThrow2, handler) | |
310 } | |
311 | |
312 function TestSetThrow2(handler, create) { | |
313 var p = create(handler) | |
314 assertThrows(function(){ p.a = 42 }, "myexn") | |
315 assertThrows(function(){ p["b"] = 42 }, "myexn") | |
316 } | |
317 | |
318 TestSetThrow({ | |
319 set: function(r, k, v) { throw "myexn" } | |
320 }) | |
321 | |
322 TestSetThrow({ | |
323 set: function(r, k, v) { return this.set2(r, k, v) }, | |
324 set2: function(r, k, v) { throw "myexn" } | |
325 }) | |
326 | |
327 TestSetThrow({ | |
328 getOwnPropertyDescriptor: function(k) { throw "myexn" }, | |
329 defineProperty: function(k, desc) { key = k; val = desc.value } | |
330 }) | |
331 | |
332 TestSetThrow({ | |
333 getOwnPropertyDescriptor: function(k) { return {writable: true} }, | |
334 defineProperty: function(k, desc) { throw "myexn" } | |
335 }) | |
336 | |
337 TestSetThrow({ | |
338 getOwnPropertyDescriptor: function(k) { | |
339 return this.getOwnPropertyDescriptor2(k) | |
340 }, | |
341 getOwnPropertyDescriptor2: function(k) { throw "myexn" }, | |
342 defineProperty: function(k, desc) { this.defineProperty2(k, desc) }, | |
343 defineProperty2: function(k, desc) { key = k; val = desc.value } | |
344 }) | |
345 | |
346 TestSetThrow({ | |
347 getOwnPropertyDescriptor: function(k) { | |
348 return this.getOwnPropertyDescriptor2(k) | |
349 }, | |
350 getOwnPropertyDescriptor2: function(k) { return {writable: true} }, | |
351 defineProperty: function(k, desc) { this.defineProperty2(k, desc) }, | |
352 defineProperty2: function(k, desc) { throw "myexn" } | |
353 }) | |
354 | |
355 TestSetThrow({ | |
356 getOwnPropertyDescriptor: function(k) { throw "myexn" }, | |
357 defineProperty: function(k, desc) { key = k; val = desc.value } | |
358 }) | |
359 | |
360 TestSetThrow({ | |
361 getOwnPropertyDescriptor: function(k) { | |
362 return {get writable() { return true }} | |
363 }, | |
364 defineProperty: function(k, desc) { throw "myexn" } | |
365 }) | |
366 | |
367 TestSetThrow({ | |
368 getOwnPropertyDescriptor: function(k) { throw "myexn" } | |
369 }) | |
370 | |
371 TestSetThrow({ | |
372 getOwnPropertyDescriptor: function(k) { | |
373 return {set: function(v) { throw "myexn" }} | |
374 } | |
375 }) | |
376 | |
377 TestSetThrow({ | |
378 getOwnPropertyDescriptor: function(k) { throw "myexn" }, | |
379 getPropertyDescriptor: function(k) { return {writable: true} }, | |
380 defineProperty: function(k, desc) { key = k; val = desc.value } | |
381 }) | |
382 | |
383 TestSetThrow({ | |
384 getOwnPropertyDescriptor: function(k) { return null }, | |
385 getPropertyDescriptor: function(k) { throw "myexn" }, | |
386 defineProperty: function(k, desc) { key = k; val = desc.value } | |
387 }) | |
388 | |
389 TestSetThrow({ | |
390 getOwnPropertyDescriptor: function(k) { return null }, | |
391 getPropertyDescriptor: function(k) { return {writable: true} }, | |
392 defineProperty: function(k, desc) { throw "myexn" } | |
393 }) | |
394 | |
395 TestSetThrow({ | |
396 getOwnPropertyDescriptor: function(k) { return null }, | |
397 getPropertyDescriptor: function(k) { | |
398 return {get writable() { throw "myexn" }} | |
399 }, | |
400 defineProperty: function(k, desc) { key = k; val = desc.value } | |
401 }) | |
402 | |
403 TestSetThrow({ | |
404 getOwnPropertyDescriptor: function(k) { return null }, | |
405 getPropertyDescriptor: function(k) { | |
406 return {set: function(v) { throw "myexn" }} | |
407 } | |
408 }) | |
409 | |
410 TestSetThrow({ | |
411 getOwnPropertyDescriptor: function(k) { return null }, | |
412 getPropertyDescriptor: function(k) { return null }, | |
413 defineProperty: function(k, desc) { throw "myexn" } | |
414 }) | |
415 | |
416 TestSetThrow(Proxy.create({ | |
417 get: function(pr, pk) { throw "myexn" } | |
418 })) | |
419 | |
420 TestSetThrow(Proxy.create({ | |
421 get: function(pr, pk) { | |
422 return function(r, k, v) { throw "myexn" } | |
423 } | |
424 })) | |
425 | |
426 | |
427 | |
252 // Property definition (Object.defineProperty and Object.defineProperties). | 428 // Property definition (Object.defineProperty and Object.defineProperties). |
253 | 429 |
254 var key | 430 var key |
255 var desc | 431 var desc |
256 | 432 |
257 function TestDefine(handler) { | 433 function TestDefine(handler) { |
258 TestWithProxies(TestDefine2, handler) | 434 TestWithProxies(TestDefine2, handler) |
259 } | 435 } |
260 | 436 |
261 function TestDefine2(handler, create) { | 437 function TestDefine2(handler, create) { |
262 var o = create(handler) | 438 var p = create(handler) |
263 assertEquals(o, Object.defineProperty(o, "a", {value: 44})) | 439 assertEquals(p, Object.defineProperty(p, "a", {value: 44})) |
264 assertEquals("a", key) | 440 assertEquals("a", key) |
265 assertEquals(1, Object.getOwnPropertyNames(desc).length) | 441 assertEquals(1, Object.getOwnPropertyNames(desc).length) |
266 assertEquals(44, desc.value) | 442 assertEquals(44, desc.value) |
267 | 443 |
268 assertEquals(o, Object.defineProperty(o, "b", {value: 45, writable: false})) | 444 assertEquals(p, Object.defineProperty(p, "b", {value: 45, writable: false})) |
269 assertEquals("b", key) | 445 assertEquals("b", key) |
270 assertEquals(2, Object.getOwnPropertyNames(desc).length) | 446 assertEquals(2, Object.getOwnPropertyNames(desc).length) |
271 assertEquals(45, desc.value) | 447 assertEquals(45, desc.value) |
272 assertEquals(false, desc.writable) | 448 assertEquals(false, desc.writable) |
273 | 449 |
274 assertEquals(o, Object.defineProperty(o, "c", {value: 46, enumerable: false})) | 450 assertEquals(p, Object.defineProperty(p, "c", {value: 46, enumerable: false})) |
275 assertEquals("c", key) | 451 assertEquals("c", key) |
276 assertEquals(2, Object.getOwnPropertyNames(desc).length) | 452 assertEquals(2, Object.getOwnPropertyNames(desc).length) |
277 assertEquals(46, desc.value) | 453 assertEquals(46, desc.value) |
278 assertEquals(false, desc.enumerable) | 454 assertEquals(false, desc.enumerable) |
279 | 455 |
280 var attributes = {configurable: true, mine: 66, minetoo: 23} | 456 var attributes = {configurable: true, mine: 66, minetoo: 23} |
281 assertEquals(o, Object.defineProperty(o, "d", attributes)) | 457 assertEquals(p, Object.defineProperty(p, "d", attributes)) |
282 assertEquals("d", key) | 458 assertEquals("d", key) |
283 // Modifying the attributes object after the fact should have no effect. | 459 // Modifying the attributes object after the fact should have no effect. |
284 attributes.configurable = false | 460 attributes.configurable = false |
285 attributes.mine = 77 | 461 attributes.mine = 77 |
286 delete attributes.minetoo | 462 delete attributes.minetoo |
287 assertEquals(3, Object.getOwnPropertyNames(desc).length) | 463 assertEquals(3, Object.getOwnPropertyNames(desc).length) |
288 assertEquals(true, desc.configurable) | 464 assertEquals(true, desc.configurable) |
289 assertEquals(66, desc.mine) | 465 assertEquals(66, desc.mine) |
290 assertEquals(23, desc.minetoo) | 466 assertEquals(23, desc.minetoo) |
291 | 467 |
292 assertEquals(o, Object.defineProperty(o, "e", {get: function(){ return 5 }})) | 468 assertEquals(p, Object.defineProperty(p, "e", {get: function(){ return 5 }})) |
293 assertEquals("e", key) | 469 assertEquals("e", key) |
294 assertEquals(1, Object.getOwnPropertyNames(desc).length) | 470 assertEquals(1, Object.getOwnPropertyNames(desc).length) |
295 assertEquals(5, desc.get()) | 471 assertEquals(5, desc.get()) |
296 | 472 |
297 assertEquals(o, Object.defineProperty(o, "zzz", {})) | 473 assertEquals(p, Object.defineProperty(p, "zzz", {})) |
298 assertEquals("zzz", key) | 474 assertEquals("zzz", key) |
299 assertEquals(0, Object.getOwnPropertyNames(desc).length) | 475 assertEquals(0, Object.getOwnPropertyNames(desc).length) |
300 | 476 |
301 // TODO(rossberg): This test requires for-in on proxies. | 477 // TODO(rossberg): This test requires for-in on proxies. |
302 // var d = create({ | 478 // var d = create({ |
303 // get: function(r, k) { return (k === "value") ? 77 : void 0 }, | 479 // get: function(r, k) { return (k === "value") ? 77 : void 0 }, |
304 // getOwnPropertyNames: function() { return ["value"] } | 480 // getOwnPropertyNames: function() { return ["value"] } |
305 // }) | 481 // }) |
306 // assertEquals(1, Object.getOwnPropertyNames(d).length) | 482 // assertEquals(1, Object.getOwnPropertyNames(d).length) |
307 // assertEquals(77, d.value) | 483 // assertEquals(77, d.value) |
308 // assertEquals(o, Object.defineProperty(o, "p", d)) | 484 // assertEquals(p, Object.defineProperty(p, "p", d)) |
309 // assertEquals("p", key) | 485 // assertEquals("p", key) |
310 // assertEquals(1, Object.getOwnPropertyNames(desc).length) | 486 // assertEquals(1, Object.getOwnPropertyNames(desc).length) |
311 // assertEquals(77, desc.value) | 487 // assertEquals(77, desc.value) |
312 | 488 |
313 var props = { | 489 var props = { |
314 'bla': {}, | 490 'bla': {}, |
315 blub: {get: function() { return true }}, | 491 blub: {get: function() { return true }}, |
316 '': {get value() { return 20 }}, | 492 '': {get value() { return 20 }}, |
317 last: {value: 21, configurable: true, mine: "eyes"} | 493 last: {value: 21, configurable: true, mine: "eyes"} |
318 } | 494 } |
319 Object.defineProperty(props, "hidden", {value: "hidden", enumerable: false}) | 495 Object.defineProperty(props, "hidden", {value: "hidden", enumerable: false}) |
320 assertEquals(o, Object.defineProperties(o, props)) | 496 assertEquals(p, Object.defineProperties(p, props)) |
321 assertEquals("last", key) | 497 assertEquals("last", key) |
322 assertEquals(2, Object.getOwnPropertyNames(desc).length) | 498 assertEquals(2, Object.getOwnPropertyNames(desc).length) |
323 assertEquals(21, desc.value) | 499 assertEquals(21, desc.value) |
324 assertEquals(true, desc.configurable) | 500 assertEquals(true, desc.configurable) |
325 assertEquals(undefined, desc.mine) // Arguably a bug in the spec... | 501 assertEquals(undefined, desc.mine) // Arguably a bug in the spec... |
502 | |
503 var props = {bla: {get value() { throw "myexn" }}} | |
504 assertThrows(function(){ Object.defineProperties(p, props) }, "myexn") | |
326 } | 505 } |
327 | 506 |
328 TestDefine({ | 507 TestDefine({ |
329 defineProperty: function(k, d) { key = k; desc = d; return true } | 508 defineProperty: function(k, d) { key = k; desc = d; return true } |
330 }) | 509 }) |
331 | 510 |
332 TestDefine({ | 511 TestDefine({ |
333 defineProperty: function(k, d) { return this.defineProperty2(k, d) }, | 512 defineProperty: function(k, d) { return this.defineProperty2(k, d) }, |
334 defineProperty2: function(k, d) { key = k; desc = d; return true } | 513 defineProperty2: function(k, d) { key = k; desc = d; return true } |
335 }) | 514 }) |
336 | 515 |
337 TestDefine(Proxy.create({ | 516 TestDefine(Proxy.create({ |
338 get: function(pr, pk) { | 517 get: function(pr, pk) { |
339 return function(k, d) { key = k; desc = d; return true } | 518 return function(k, d) { key = k; desc = d; return true } |
340 } | 519 } |
341 })) | 520 })) |
342 | 521 |
343 | 522 |
523 function TestDefineThrow(handler) { | |
524 TestWithProxies(TestDefineThrow2, handler) | |
525 } | |
526 | |
527 function TestDefineThrow2(handler, create) { | |
528 var p = create(handler) | |
529 assertThrows(function(){ Object.defineProperty(p, "a", {value: 44})}, "myexn") | |
530 | |
531 // TODO(rossberg): These tests require for-in on proxies. | |
532 // var d1 = create({ | |
533 // get: function(r, k) { throw "myexn" }, | |
534 // getOwnPropertyNames: function() { return ["value"] } | |
535 // }) | |
536 // assertThrows(function(){ Object.defineProperty(p, "p", d1) }, "myexn") | |
537 // var d2 = create({ | |
538 // get: function(r, k) { return 77 }, | |
539 // getOwnPropertyNames: function() { throw "myexn" } | |
540 // }) | |
541 // assertThrows(function(){ Object.defineProperty(p, "p", d2) }, "myexn") | |
542 | |
543 var props = {bla: {get value() { throw "otherexn" }}} | |
544 assertThrows(function(){ Object.defineProperties(p, props) }, "otherexn") | |
545 } | |
546 | |
547 TestDefineThrow({ | |
548 defineProperty: function(k, d) { throw "myexn" } | |
549 }) | |
550 | |
551 TestDefineThrow({ | |
552 defineProperty: function(k, d) { return this.defineProperty2(k, d) }, | |
553 defineProperty2: function(k, d) { throw "myexn" } | |
554 }) | |
555 | |
556 TestDefineThrow(Proxy.create({ | |
557 get: function(pr, pk) { throw "myexn" } | |
558 })) | |
559 | |
560 TestDefineThrow(Proxy.create({ | |
561 get: function(pr, pk) { | |
562 return function(k, d) { throw "myexn" } | |
563 } | |
564 })) | |
565 | |
566 | |
344 | 567 |
345 // Property deletion (delete). | 568 // Property deletion (delete). |
346 | 569 |
347 var key | 570 var key |
348 | 571 |
349 function TestDelete(handler) { | 572 function TestDelete(handler) { |
350 TestWithProxies(TestDelete2, handler) | 573 TestWithProxies(TestDelete2, handler) |
351 } | 574 } |
352 | 575 |
353 function TestDelete2(handler, create) { | 576 function TestDelete2(handler, create) { |
354 var o = create(handler) | 577 var p = create(handler) |
355 assertEquals(true, delete o.a) | 578 assertEquals(true, delete p.a) |
356 assertEquals("a", key) | 579 assertEquals("a", key) |
357 assertEquals(true, delete o["b"]) | 580 assertEquals(true, delete p["b"]) |
358 assertEquals("b", key) | 581 assertEquals("b", key) |
359 | 582 |
360 assertEquals(false, delete o.z1) | 583 assertEquals(false, delete p.z1) |
361 assertEquals("z1", key) | 584 assertEquals("z1", key) |
362 assertEquals(false, delete o["z2"]) | 585 assertEquals(false, delete p["z2"]) |
363 assertEquals("z2", key); | 586 assertEquals("z2", key); |
364 | 587 |
365 (function() { | 588 (function() { |
366 "use strict" | 589 "use strict" |
367 assertEquals(true, delete o.c) | 590 assertEquals(true, delete p.c) |
368 assertEquals("c", key) | 591 assertEquals("c", key) |
369 assertEquals(true, delete o["d"]) | 592 assertEquals(true, delete p["d"]) |
370 assertEquals("d", key) | 593 assertEquals("d", key) |
371 | 594 |
372 assertThrows(function() { delete o.z3 }, TypeError) | 595 assertThrows(function(){ delete p.z3 }, TypeError) |
373 assertEquals("z3", key) | 596 assertEquals("z3", key) |
374 assertThrows(function() { delete o["z4"] }, TypeError) | 597 assertThrows(function(){ delete p["z4"] }, TypeError) |
375 assertEquals("z4", key) | 598 assertEquals("z4", key) |
376 })() | 599 })() |
377 } | 600 } |
378 | 601 |
379 TestDelete({ | 602 TestDelete({ |
380 'delete': function(k) { key = k; return k < "z" } | 603 delete: function(k) { key = k; return k < "z" } |
381 }) | 604 }) |
382 | 605 |
383 TestDelete({ | 606 TestDelete({ |
384 'delete': function(k) { return this.delete2(k) }, | 607 delete: function(k) { return this.delete2(k) }, |
385 delete2: function(k) { key = k; return k < "z" } | 608 delete2: function(k) { key = k; return k < "z" } |
386 }) | 609 }) |
387 | 610 |
388 TestDelete(Proxy.create({ | 611 TestDelete(Proxy.create({ |
389 get: function(pr, pk) { | 612 get: function(pr, pk) { |
390 return function(k) { key = k; return k < "z" } | 613 return function(k) { key = k; return k < "z" } |
391 } | 614 } |
392 })) | 615 })) |
393 | 616 |
394 | 617 |
618 function TestDeleteThrow(handler) { | |
619 TestWithProxies(TestDeleteThrow2, handler) | |
620 } | |
621 | |
622 function TestDeleteThrow2(handler, create) { | |
623 var p = create(handler) | |
624 assertThrows(function(){ delete p.a }, "myexn") | |
625 assertThrows(function(){ delete p["b"] }, "myexn"); | |
626 | |
627 (function() { | |
628 "use strict" | |
629 assertThrows(function(){ delete p.c }, "myexn") | |
630 assertThrows(function(){ delete p["d"] }, "myexn") | |
631 })() | |
632 } | |
633 | |
634 TestDeleteThrow({ | |
635 delete: function(k) { throw "myexn" } | |
636 }) | |
637 | |
638 TestDeleteThrow({ | |
639 delete: function(k) { return this.delete2(k) }, | |
640 delete2: function(k) { throw "myexn" } | |
641 }) | |
642 | |
643 TestDeleteThrow(Proxy.create({ | |
644 get: function(pr, pk) { throw "myexn" } | |
645 })) | |
646 | |
647 TestDeleteThrow(Proxy.create({ | |
648 get: function(pr, pk) { | |
649 return function(k) { throw "myexn" } | |
650 } | |
651 })) | |
652 | |
653 | |
395 | 654 |
396 // Property descriptors (Object.getOwnPropertyDescriptor). | 655 // Property descriptors (Object.getOwnPropertyDescriptor). |
397 | 656 |
398 function TestDescriptor(handler) { | 657 function TestDescriptor(handler) { |
399 TestWithProxies(TestDescriptor2, handler) | 658 TestWithProxies(TestDescriptor2, handler) |
400 } | 659 } |
401 | 660 |
402 function TestDescriptor2(handler, create) { | 661 function TestDescriptor2(handler, create) { |
403 var o = create(handler) | 662 var p = create(handler) |
404 var descs = [ | 663 var descs = [ |
405 {configurable: true}, | 664 {configurable: true}, |
406 {value: 34, enumerable: true, configurable: true}, | 665 {value: 34, enumerable: true, configurable: true}, |
407 {value: 3, writable: false, mine: "eyes", configurable: true}, | 666 {value: 3, writable: false, mine: "eyes", configurable: true}, |
408 {get value() { return 20 }, get configurable() { return true }}, | 667 {get value() { return 20 }, get configurable() { return true }}, |
409 {get: function() { "get" }, set: function() { "set" }, configurable: true} | 668 {get: function() { "get" }, set: function() { "set" }, configurable: true} |
410 ] | 669 ] |
411 for (var i = 0; i < descs.length; ++i) { | 670 for (var i = 0; i < descs.length; ++i) { |
412 assertEquals(o, Object.defineProperty(o, i, descs[i])) | 671 assertEquals(p, Object.defineProperty(p, i, descs[i])) |
413 var desc = Object.getOwnPropertyDescriptor(o, i) | 672 var desc = Object.getOwnPropertyDescriptor(p, i) |
414 for (p in descs[i]) { | 673 for (prop in descs[i]) { |
415 // TODO(rossberg): Ignore user attributes as long as the spec isn't | 674 // TODO(rossberg): Ignore user attributes as long as the spec isn't |
416 // fixed suitably. | 675 // fixed suitably. |
417 if (p != "mine") assertEquals(descs[i][p], desc[p]) | 676 if (prop != "mine") assertEquals(descs[i][prop], desc[prop]) |
418 } | 677 } |
419 assertEquals(undefined, Object.getOwnPropertyDescriptor(o, "absent")) | 678 assertEquals(undefined, Object.getOwnPropertyDescriptor(p, "absent")) |
420 } | 679 } |
421 } | 680 } |
422 | 681 |
423 TestDescriptor({ | 682 TestDescriptor({ |
424 defineProperty: function(k, d) { this["__" + k] = d; return true }, | 683 defineProperty: function(k, d) { this["__" + k] = d; return true }, |
425 getOwnPropertyDescriptor: function(k) { return this["__" + k] } | 684 getOwnPropertyDescriptor: function(k) { return this["__" + k] } |
426 }) | 685 }) |
427 | 686 |
428 TestDescriptor({ | 687 TestDescriptor({ |
429 defineProperty: function(k, d) { this["__" + k] = d; return true }, | 688 defineProperty: function(k, d) { this["__" + k] = d; return true }, |
430 getOwnPropertyDescriptor: function(k) { | 689 getOwnPropertyDescriptor: function(k) { |
431 return this.getOwnPropertyDescriptor2(k) | 690 return this.getOwnPropertyDescriptor2(k) |
432 }, | 691 }, |
433 getOwnPropertyDescriptor2: function(k) { return this["__" + k] } | 692 getOwnPropertyDescriptor2: function(k) { return this["__" + k] } |
434 }) | 693 }) |
435 | 694 |
436 | 695 |
696 function TestDescriptorThrow(handler) { | |
697 TestWithProxies(TestDescriptorThrow2, handler) | |
698 } | |
699 | |
700 function TestDescriptorThrow2(handler, create) { | |
701 var p = create(handler) | |
702 assertThrows(function(){ Object.getOwnPropertyDescriptor(p, "a") }, "myexn") | |
703 } | |
704 | |
705 TestDescriptorThrow({ | |
706 getOwnPropertyDescriptor: function(k) { throw "myexn" } | |
707 }) | |
708 | |
709 TestDescriptorThrow({ | |
710 getOwnPropertyDescriptor: function(k) { | |
711 return this.getOwnPropertyDescriptor2(k) | |
712 }, | |
713 getOwnPropertyDescriptor2: function(k) { throw "myexn" } | |
714 }) | |
715 | |
716 | |
437 | 717 |
438 // Comparison. | 718 // Comparison. |
439 | 719 |
440 function TestComparison(eq) { | 720 function TestComparison(eq) { |
441 TestWithProxies(TestComparison2, eq) | 721 TestWithProxies(TestComparison2, eq) |
442 } | 722 } |
443 | 723 |
444 function TestComparison2(eq, create) { | 724 function TestComparison2(eq, create) { |
445 var o1 = create({}) | 725 var p1 = create({}) |
446 var o2 = create({}) | 726 var p2 = create({}) |
447 | 727 |
448 assertTrue(eq(o1, o1)) | 728 assertTrue(eq(p1, p1)) |
449 assertTrue(eq(o2, o2)) | 729 assertTrue(eq(p2, p2)) |
450 assertTrue(!eq(o1, o2)) | 730 assertTrue(!eq(p1, p2)) |
451 assertTrue(!eq(o1, {})) | 731 assertTrue(!eq(p1, {})) |
452 assertTrue(!eq({}, o2)) | 732 assertTrue(!eq({}, p2)) |
453 assertTrue(!eq({}, {})) | 733 assertTrue(!eq({}, {})) |
454 } | 734 } |
455 | 735 |
456 TestComparison(function(o1, o2) { return o1 == o2 }) | 736 TestComparison(function(o1, o2) { return o1 == o2 }) |
457 TestComparison(function(o1, o2) { return o1 === o2 }) | 737 TestComparison(function(o1, o2) { return o1 === o2 }) |
458 TestComparison(function(o1, o2) { return !(o1 != o2) }) | 738 TestComparison(function(o1, o2) { return !(o1 != o2) }) |
459 TestComparison(function(o1, o2) { return !(o1 !== o2) }) | 739 TestComparison(function(o1, o2) { return !(o1 !== o2) }) |
460 | 740 |
461 | 741 |
462 | 742 |
(...skipping 15 matching lines...) Expand all Loading... | |
478 | 758 |
479 // Membership test (in). | 759 // Membership test (in). |
480 | 760 |
481 var key | 761 var key |
482 | 762 |
483 function TestIn(handler) { | 763 function TestIn(handler) { |
484 TestWithProxies(TestIn2, handler) | 764 TestWithProxies(TestIn2, handler) |
485 } | 765 } |
486 | 766 |
487 function TestIn2(handler, create) { | 767 function TestIn2(handler, create) { |
488 var o = create(handler) | 768 var p = create(handler) |
489 assertTrue("a" in o) | 769 assertTrue("a" in p) |
490 assertEquals("a", key) | 770 assertEquals("a", key) |
491 assertTrue(99 in o) | 771 assertTrue(99 in p) |
492 assertEquals("99", key) | 772 assertEquals("99", key) |
493 assertFalse("z" in o) | 773 assertFalse("z" in p) |
494 assertEquals("z", key) | 774 assertEquals("z", key) |
495 | 775 |
496 if ("b" in o) { | 776 assertEquals(2, ("a" in p) ? 2 : 0) |
777 assertEquals(0, !("a" in p) ? 2 : 0) | |
778 assertEquals(0, ("zzz" in p) ? 2 : 0) | |
779 assertEquals(2, !("zzz" in p) ? 2 : 0) | |
780 | |
781 if ("b" in p) { | |
497 } else { | 782 } else { |
498 assertTrue(false) | 783 assertTrue(false) |
499 } | 784 } |
500 assertEquals("b", key) | 785 assertEquals("b", key) |
501 | 786 |
502 if ("zz" in o) { | 787 if ("zz" in p) { |
503 assertTrue(false) | 788 assertTrue(false) |
504 } | 789 } |
505 assertEquals("zz", key) | 790 assertEquals("zz", key) |
506 | 791 |
507 if (!("c" in o)) { | 792 if (!("c" in p)) { |
508 assertTrue(false) | 793 assertTrue(false) |
509 } | 794 } |
510 assertEquals("c", key) | 795 assertEquals("c", key) |
511 | 796 |
512 if (!("zzz" in o)) { | 797 if (!("zzz" in p)) { |
513 } else { | 798 } else { |
514 assertTrue(false) | 799 assertTrue(false) |
515 } | 800 } |
516 assertEquals("zzz", key) | 801 assertEquals("zzz", key) |
517 } | 802 } |
518 | 803 |
519 TestIn({ | 804 TestIn({ |
520 has: function(k) { key = k; return k < "z" } | 805 has: function(k) { key = k; return k < "z" } |
521 }) | 806 }) |
522 | 807 |
(...skipping 28 matching lines...) Expand all Loading... | |
551 } | 836 } |
552 }) | 837 }) |
553 | 838 |
554 TestIn(Proxy.create({ | 839 TestIn(Proxy.create({ |
555 get: function(pr, pk) { | 840 get: function(pr, pk) { |
556 return function(k) { key = k; return k < "z" } | 841 return function(k) { key = k; return k < "z" } |
557 } | 842 } |
558 })) | 843 })) |
559 | 844 |
560 | 845 |
846 function TestInThrow(handler) { | |
847 TestWithProxies(TestInThrow2, handler) | |
848 } | |
849 | |
850 function TestInThrow2(handler, create) { | |
851 var p = create(handler) | |
852 assertThrows(function(){ return "a" in o }, "myexn") | |
853 assertThrows(function(){ return !("a" in o) }, "myexn") | |
854 assertThrows(function(){ return ("a" in o) ? 2 : 3 }, "myexn") | |
855 assertThrows(function(){ if ("b" in o) {} }, "myexn") | |
856 assertThrows(function(){ if (!("b" in o)) {} }, "myexn") | |
857 assertThrows(function(){ if ("zzz" in o) {} }, "myexn") | |
858 } | |
859 | |
860 TestInThrow({ | |
861 has: function(k) { throw "myexn" } | |
862 }) | |
863 | |
864 TestInThrow({ | |
865 has: function(k) { return this.has2(k) }, | |
866 has2: function(k) { throw "myexn" } | |
867 }) | |
868 | |
869 TestInThrow({ | |
870 getPropertyDescriptor: function(k) { throw "myexn" } | |
871 }) | |
872 | |
873 TestInThrow({ | |
874 getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) }, | |
875 getPropertyDescriptor2: function(k) { throw "myexn" } | |
876 }) | |
877 | |
878 TestInThrow({ | |
879 get: undefined, | |
880 getPropertyDescriptor: function(k) { throw "myexn" } | |
881 }) | |
882 | |
883 TestInThrow(Proxy.create({ | |
884 get: function(pr, pk) { throw "myexn" } | |
885 })) | |
886 | |
887 TestInThrow(Proxy.create({ | |
888 get: function(pr, pk) { | |
889 return function(k) { throw "myexn" } | |
890 } | |
891 })) | |
892 | |
893 | |
561 | 894 |
562 // Own Properties (Object.prototype.hasOwnProperty). | 895 // Own Properties (Object.prototype.hasOwnProperty). |
563 | 896 |
564 var key | 897 var key |
565 | 898 |
566 function TestHasOwn(handler) { | 899 function TestHasOwn(handler) { |
567 TestWithProxies(TestHasOwn2, handler) | 900 TestWithProxies(TestHasOwn2, handler) |
568 } | 901 } |
569 | 902 |
570 function TestHasOwn2(handler, create) { | 903 function TestHasOwn2(handler, create) { |
571 var o = create(handler) | 904 var p = create(handler) |
572 assertTrue(Object.prototype.hasOwnProperty.call(o, "a")) | 905 assertTrue(Object.prototype.hasOwnProperty.call(p, "a")) |
573 assertEquals("a", key) | 906 assertEquals("a", key) |
574 assertTrue(Object.prototype.hasOwnProperty.call(o, 99)) | 907 assertTrue(Object.prototype.hasOwnProperty.call(p, 99)) |
575 assertEquals("99", key) | 908 assertEquals("99", key) |
576 assertFalse(Object.prototype.hasOwnProperty.call(o, "z")) | 909 assertFalse(Object.prototype.hasOwnProperty.call(p, "z")) |
577 assertEquals("z", key) | 910 assertEquals("z", key) |
578 } | 911 } |
579 | 912 |
580 TestHasOwn({ | 913 TestHasOwn({ |
581 hasOwn: function(k) { key = k; return k < "z" } | 914 hasOwn: function(k) { key = k; return k < "z" } |
582 }) | 915 }) |
583 | 916 |
584 TestHasOwn({ | 917 TestHasOwn({ |
585 hasOwn: function(k) { return this.hasOwn2(k) }, | 918 hasOwn: function(k) { return this.hasOwn2(k) }, |
586 hasOwn2: function(k) { key = k; return k < "z" } | 919 hasOwn2: function(k) { key = k; return k < "z" } |
(...skipping 27 matching lines...) Expand all Loading... | |
614 } | 947 } |
615 }) | 948 }) |
616 | 949 |
617 TestHasOwn(Proxy.create({ | 950 TestHasOwn(Proxy.create({ |
618 get: function(pr, pk) { | 951 get: function(pr, pk) { |
619 return function(k) { key = k; return k < "z" } | 952 return function(k) { key = k; return k < "z" } |
620 } | 953 } |
621 })) | 954 })) |
622 | 955 |
623 | 956 |
957 function TestHasOwnThrow(handler) { | |
958 TestWithProxies(TestHasOwnThrow2, handler) | |
959 } | |
960 | |
961 function TestHasOwnThrow2(handler, create) { | |
962 var p = create(handler) | |
963 assertThrows(function(){ Object.prototype.hasOwnProperty.call(p, "a")}, | |
964 "myexn") | |
965 assertThrows(function(){ Object.prototype.hasOwnProperty.call(p, 99)}, | |
966 "myexn") | |
967 } | |
968 | |
969 TestHasOwnThrow({ | |
970 hasOwn: function(k) { throw "myexn" } | |
971 }) | |
972 | |
973 TestHasOwnThrow({ | |
974 hasOwn: function(k) { return this.hasOwn2(k) }, | |
975 hasOwn2: function(k) { throw "myexn" } | |
976 }) | |
977 | |
978 TestHasOwnThrow({ | |
979 getOwnPropertyDescriptor: function(k) { throw "myexn" } | |
980 }) | |
981 | |
982 TestHasOwnThrow({ | |
983 getOwnPropertyDescriptor: function(k) { | |
984 return this.getOwnPropertyDescriptor2(k) | |
985 }, | |
986 getOwnPropertyDescriptor2: function(k) { throw "myexn" } | |
987 }) | |
988 | |
989 TestHasOwnThrow({ | |
990 hasOwn: undefined, | |
991 getOwnPropertyDescriptor: function(k) { throw "myexn" } | |
992 }) | |
993 | |
994 TestHasOwnThrow(Proxy.create({ | |
995 get: function(pr, pk) { throw "myexn" } | |
996 })) | |
997 | |
998 TestHasOwnThrow(Proxy.create({ | |
999 get: function(pr, pk) { | |
1000 return function(k) { throw "myexn" } | |
1001 } | |
1002 })) | |
1003 | |
1004 | |
624 | 1005 |
625 // Instanceof (instanceof) | 1006 // Instanceof (instanceof) |
626 | 1007 |
627 function TestInstanceof() { | 1008 function TestInstanceof() { |
628 var o = {} | 1009 var o = {} |
629 var p1 = Proxy.create({}) | 1010 var p1 = Proxy.create({}) |
630 var p2 = Proxy.create({}, o) | 1011 var p2 = Proxy.create({}, o) |
631 var p3 = Proxy.create({}, p2) | 1012 var p3 = Proxy.create({}, p2) |
632 | 1013 |
633 var f0 = function() {} | 1014 var f0 = function() {} |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
737 getOwnPropertyNames2: function() { return ["throw", "function "] } | 1118 getOwnPropertyNames2: function() { return ["throw", "function "] } |
738 }) | 1119 }) |
739 | 1120 |
740 TestPropertyNames(["[object Object]"], { | 1121 TestPropertyNames(["[object Object]"], { |
741 get getOwnPropertyNames() { | 1122 get getOwnPropertyNames() { |
742 return function() { return [{}] } | 1123 return function() { return [{}] } |
743 } | 1124 } |
744 }) | 1125 }) |
745 | 1126 |
746 | 1127 |
1128 function TestPropertyNamesThrow(handler) { | |
1129 TestWithProxies(TestPropertyNamesThrow2, handler) | |
1130 } | |
1131 | |
1132 function TestPropertyNamesThrow2(handler, create) { | |
1133 var p = create(handler) | |
1134 assertThrows(function(){ Object.getOwnPropertyNames(p) }, "myexn") | |
1135 } | |
1136 | |
1137 TestPropertyNamesThrow({ | |
1138 getOwnPropertyNames: function() { throw "myexn" } | |
1139 }) | |
1140 | |
1141 TestPropertyNamesThrow({ | |
1142 getOwnPropertyNames: function() { return this.getOwnPropertyNames2() }, | |
1143 getOwnPropertyNames2: function() { throw "myexn" } | |
1144 }) | |
1145 | |
1146 | |
747 function TestKeys(names, handler) { | 1147 function TestKeys(names, handler) { |
748 TestWithProxies(TestKeys2, [names, handler]) | 1148 TestWithProxies(TestKeys2, [names, handler]) |
749 } | 1149 } |
750 | 1150 |
751 function TestKeys2(names_handler, create) { | 1151 function TestKeys2(names_handler, create) { |
752 var p = create(names_handler[1]) | 1152 var p = create(names_handler[1]) |
753 assertArrayEquals(names_handler[0], Object.keys(p)) | 1153 assertArrayEquals(names_handler[0], Object.keys(p)) |
754 } | 1154 } |
755 | 1155 |
756 TestKeys([], { | 1156 TestKeys([], { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
796 }) | 1196 }) |
797 | 1197 |
798 TestKeys([], { | 1198 TestKeys([], { |
799 get getOwnPropertyNames() { | 1199 get getOwnPropertyNames() { |
800 return function() { return ["a", "b", "c"] } | 1200 return function() { return ["a", "b", "c"] } |
801 }, | 1201 }, |
802 getOwnPropertyDescriptor: function(k) { return {} } | 1202 getOwnPropertyDescriptor: function(k) { return {} } |
803 }) | 1203 }) |
804 | 1204 |
805 | 1205 |
1206 function TestKeysThrow(handler) { | |
1207 TestWithProxies(TestKeysThrow2, handler) | |
1208 } | |
1209 | |
1210 function TestKeysThrow2(handler, create) { | |
1211 var p = create(handler) | |
1212 assertThrows(function(){ Object.keys(p) }, "myexn") | |
1213 } | |
1214 | |
1215 TestKeysThrow({ | |
1216 keys: function() { throw "myexn" } | |
1217 }) | |
1218 | |
1219 TestKeysThrow({ | |
1220 keys: function() { return this.keys2() }, | |
1221 keys2: function() { throw "myexn" } | |
1222 }) | |
1223 | |
1224 TestKeysThrow({ | |
1225 getOwnPropertyNames: function() { throw "myexn" }, | |
1226 getOwnPropertyDescriptor: function(k) { return true } | |
1227 }) | |
1228 | |
1229 TestKeysThrow({ | |
1230 getOwnPropertyNames: function() { return [1, 2] }, | |
1231 getOwnPropertyDescriptor: function(k) { throw "myexn" } | |
1232 }) | |
1233 | |
1234 TestKeysThrow({ | |
1235 getOwnPropertyNames: function() { return this.getOwnPropertyNames2() }, | |
1236 getOwnPropertyNames2: function() { throw "myexn" }, | |
1237 }) | |
1238 | |
1239 TestKeysThrow({ | |
1240 getOwnPropertyNames: function() { return this.getOwnPropertyNames2() }, | |
1241 getOwnPropertyNames2: function() { return [1, 2] }, | |
1242 getOwnPropertyDescriptor: function(k) { | |
1243 return this.getOwnPropertyDescriptor2(k) | |
1244 }, | |
1245 getOwnPropertyDescriptor2: function(k) { throw "myexn" } | |
1246 }) | |
1247 | |
1248 TestKeysThrow({ | |
1249 get getOwnPropertyNames() { throw "myexn" } | |
1250 }) | |
1251 | |
1252 TestKeysThrow({ | |
1253 get getOwnPropertyNames() { | |
1254 return function() { throw "myexn" } | |
1255 }, | |
1256 }) | |
1257 | |
1258 TestKeysThrow([], { | |
1259 get getOwnPropertyNames() { | |
1260 return function() { return [1, 2] } | |
1261 }, | |
1262 getOwnPropertyDescriptor: function(k) { throw "myexn" } | |
1263 }) | |
1264 | |
1265 | |
806 | 1266 |
807 // Fixing (Object.freeze, Object.seal, Object.preventExtensions, | 1267 // Fixing (Object.freeze, Object.seal, Object.preventExtensions, |
808 // Object.isFrozen, Object.isSealed, Object.isExtensible) | 1268 // Object.isFrozen, Object.isSealed, Object.isExtensible) |
809 | 1269 |
1270 // TODO(rossberg): use TestWithProxies to include funciton proxies | |
810 function TestFix(names, handler) { | 1271 function TestFix(names, handler) { |
811 var proto = {p: 77} | 1272 var proto = {p: 77} |
812 var assertFixing = function(o, s, f, e) { | 1273 var assertFixing = function(o, s, f, e) { |
813 assertEquals(s, Object.isSealed(o)) | 1274 assertEquals(s, Object.isSealed(o)) |
814 assertEquals(f, Object.isFrozen(o)) | 1275 assertEquals(f, Object.isFrozen(o)) |
815 assertEquals(e, Object.isExtensible(o)) | 1276 assertEquals(e, Object.isExtensible(o)) |
816 } | 1277 } |
817 | 1278 |
818 var o1 = Proxy.create(handler, proto) | 1279 var p1 = Proxy.create(handler, proto) |
819 assertFixing(o1, false, false, true) | 1280 assertFixing(p1, false, false, true) |
820 Object.seal(o1) | 1281 Object.seal(p1) |
821 assertFixing(o1, true, names.length === 0, false) | 1282 assertFixing(p1, true, names.length === 0, false) |
822 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(o1).sort()) | 1283 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p1).sort()) |
823 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), | 1284 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), |
824 Object.keys(o1).sort()) | 1285 Object.keys(p1).sort()) |
825 assertEquals(proto, Object.getPrototypeOf(o1)) | 1286 assertEquals(proto, Object.getPrototypeOf(p1)) |
826 assertEquals(77, o1.p) | 1287 assertEquals(77, p1.p) |
827 for (var n in o1) { | 1288 for (var n in p1) { |
828 var desc = Object.getOwnPropertyDescriptor(o1, n) | 1289 var desc = Object.getOwnPropertyDescriptor(p1, n) |
829 if (desc !== undefined) assertFalse(desc.configurable) | 1290 if (desc !== undefined) assertFalse(desc.configurable) |
830 } | 1291 } |
831 | 1292 |
832 var o2 = Proxy.create(handler, proto) | 1293 var p2 = Proxy.create(handler, proto) |
833 assertFixing(o2, false, false, true) | 1294 assertFixing(p2, false, false, true) |
834 Object.freeze(o2) | 1295 Object.freeze(p2) |
835 assertFixing(o2, true, true, false) | 1296 assertFixing(p2, true, true, false) |
836 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(o2).sort()) | 1297 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p2).sort()) |
837 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), | 1298 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), |
838 Object.keys(o2).sort()) | 1299 Object.keys(p2).sort()) |
839 assertEquals(proto, Object.getPrototypeOf(o2)) | 1300 assertEquals(proto, Object.getPrototypeOf(p2)) |
840 assertEquals(77, o2.p) | 1301 assertEquals(77, p2.p) |
841 for (var n in o2) { | 1302 for (var n in p2) { |
842 var desc = Object.getOwnPropertyDescriptor(o2, n) | 1303 var desc = Object.getOwnPropertyDescriptor(p2, n) |
843 if (desc !== undefined) assertFalse(desc.writable) | 1304 if (desc !== undefined) assertFalse(desc.writable) |
844 if (desc !== undefined) assertFalse(desc.configurable) | 1305 if (desc !== undefined) assertFalse(desc.configurable) |
845 } | 1306 } |
846 | 1307 |
847 var o3 = Proxy.create(handler, proto) | 1308 var p3 = Proxy.create(handler, proto) |
848 assertFixing(o3, false, false, true) | 1309 assertFixing(p3, false, false, true) |
849 Object.preventExtensions(o3) | 1310 Object.preventExtensions(p3) |
850 assertFixing(o3, names.length === 0, names.length === 0, false) | 1311 assertFixing(p3, names.length === 0, names.length === 0, false) |
851 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(o3).sort()) | 1312 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p3).sort()) |
852 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), | 1313 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), |
853 Object.keys(o3).sort()) | 1314 Object.keys(p3).sort()) |
854 assertEquals(proto, Object.getPrototypeOf(o3)) | 1315 assertEquals(proto, Object.getPrototypeOf(p3)) |
855 assertEquals(77, o3.p) | 1316 assertEquals(77, p3.p) |
856 } | 1317 } |
857 | 1318 |
858 TestFix([], { | 1319 TestFix([], { |
859 fix: function() { return {} } | 1320 fix: function() { return {} } |
860 }) | 1321 }) |
861 | 1322 |
862 TestFix(["a", "b", "c", "d", "zz"], { | 1323 TestFix(["a", "b", "c", "d", "zz"], { |
863 fix: function() { | 1324 fix: function() { |
864 return { | 1325 return { |
865 a: {value: "a", writable: true, configurable: false, enumerable: true}, | 1326 a: {value: "a", writable: true, configurable: false, enumerable: true}, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
905 }, function() {}) | 1366 }, function() {}) |
906 fix(f3) | 1367 fix(f3) |
907 assertEquals(0, f1.length) | 1368 assertEquals(0, f1.length) |
908 } | 1369 } |
909 | 1370 |
910 TestFixFunction(Object.seal) | 1371 TestFixFunction(Object.seal) |
911 TestFixFunction(Object.freeze) | 1372 TestFixFunction(Object.freeze) |
912 TestFixFunction(Object.preventExtensions) | 1373 TestFixFunction(Object.preventExtensions) |
913 | 1374 |
914 | 1375 |
1376 function TestFixThrow(handler) { | |
1377 TestWithProxies(TestFixThrow2, handler) | |
1378 } | |
1379 | |
1380 function TestFixThrow2(handler) { | |
1381 var p = Proxy.create(handler, {}) | |
1382 assertThrows(function(){ Object.seal(p) }, "myexn") | |
1383 assertThrows(function(){ Object.freeze(p) }, "myexn") | |
1384 assertThrows(function(){ Object.preventExtensions(p) }, "myexn") | |
1385 } | |
1386 | |
1387 TestFixThrow({ | |
1388 fix: function() { throw "myexn" } | |
1389 }) | |
1390 | |
1391 TestFixThrow({ | |
1392 fix: function() { return this.fix2() }, | |
1393 fix2: function() { throw "myexn" } | |
1394 }) | |
1395 | |
1396 TestFixThrow({ | |
1397 get fix() { throw "myexn" } | |
1398 }) | |
1399 | |
1400 TestFixThrow({ | |
1401 get fix() { | |
1402 return function() { throw "myexn" } | |
1403 } | |
1404 }) | |
1405 | |
1406 | |
915 | 1407 |
916 // String conversion (Object.prototype.toString, Object.prototype.toLocaleString ) | 1408 // String conversion (Object.prototype.toString, Object.prototype.toLocaleString ) |
917 | 1409 |
918 var key | 1410 var key |
919 | 1411 |
920 function TestToString(handler) { | 1412 function TestToString(handler) { |
921 var o = Proxy.create(handler) | 1413 var p = Proxy.create(handler) |
922 key = "" | 1414 key = "" |
923 assertEquals("[object Object]", Object.prototype.toString.call(o)) | 1415 assertEquals("[object Object]", Object.prototype.toString.call(p)) |
924 assertEquals("", key) | 1416 assertEquals("", key) |
925 assertEquals("my_proxy", Object.prototype.toLocaleString.call(o)) | 1417 assertEquals("my_proxy", Object.prototype.toLocaleString.call(p)) |
926 assertEquals("toString", key) | 1418 assertEquals("toString", key) |
927 | 1419 |
928 var f = Proxy.createFunction(handler, function() {}) | 1420 var f = Proxy.createFunction(handler, function() {}) |
929 key = "" | 1421 key = "" |
930 assertEquals("[object Function]", Object.prototype.toString.call(f)) | 1422 assertEquals("[object Function]", Object.prototype.toString.call(f)) |
931 assertEquals("", key) | 1423 assertEquals("", key) |
932 assertEquals("my_proxy", Object.prototype.toLocaleString.call(o)) | 1424 assertEquals("my_proxy", Object.prototype.toLocaleString.call(f)) |
933 assertEquals("toString", key) | 1425 assertEquals("toString", key) |
934 } | 1426 } |
935 | 1427 |
936 TestToString({ | 1428 TestToString({ |
937 get: function(r, k) { key = k; return function() { return "my_proxy" } } | 1429 get: function(r, k) { key = k; return function() { return "my_proxy" } } |
938 }) | 1430 }) |
939 | 1431 |
940 TestToString({ | 1432 TestToString({ |
941 get: function(r, k) { return this.get2(r, k) }, | 1433 get: function(r, k) { return this.get2(r, k) }, |
942 get2: function(r, k) { key = k; return function() { return "my_proxy" } } | 1434 get2: function(r, k) { key = k; return function() { return "my_proxy" } } |
943 }) | 1435 }) |
944 | 1436 |
945 TestToString(Proxy.create({ | 1437 TestToString(Proxy.create({ |
946 get: function(pr, pk) { | 1438 get: function(pr, pk) { |
947 return function(r, k) { key = k; return function() { return "my_proxy" } } | 1439 return function(r, k) { key = k; return function() { return "my_proxy" } } |
948 } | 1440 } |
949 })) | 1441 })) |
950 | 1442 |
951 | 1443 |
1444 function TestToStringThrow(handler) { | |
1445 var p = Proxy.create(handler) | |
1446 assertEquals("[object Object]", Object.prototype.toString.call(p)) | |
1447 assertThrows(function(){ Object.prototype.toLocaleString.call(p) }, "myexn") | |
1448 | |
1449 var f = Proxy.createFunction(handler, function() {}) | |
1450 assertEquals("[object Function]", Object.prototype.toString.call(f)) | |
1451 assertThrows(function(){ Object.prototype.toLocaleString.call(f) }, "myexn") | |
1452 } | |
1453 | |
1454 TestToStringThrow({ | |
1455 get: function(r, k) { throw "myexn" } | |
1456 }) | |
1457 | |
1458 TestToStringThrow({ | |
1459 get: function(r, k) { return function() { throw "myexn" } } | |
1460 }) | |
1461 | |
1462 TestToStringThrow({ | |
1463 get: function(r, k) { return this.get2(r, k) }, | |
1464 get2: function(r, k) { throw "myexn" } | |
1465 }) | |
1466 | |
1467 TestToStringThrow(Proxy.create({ | |
1468 get: function(pr, pk) { throw "myexn" } | |
1469 })) | |
1470 | |
1471 TestToStringThrow(Proxy.create({ | |
1472 get: function(pr, pk) { | |
1473 return function(r, k) { throw "myexn" } | |
1474 } | |
1475 })) | |
1476 | |
1477 | |
952 | 1478 |
953 // Value conversion (Object.prototype.toValue) | 1479 // Value conversion (Object.prototype.toValue) |
954 | 1480 |
955 function TestValueOf(handler) { | 1481 function TestValueOf(handler) { |
956 TestWithProxies(TestValueOf2, handler) | 1482 TestWithProxies(TestValueOf2, handler) |
957 } | 1483 } |
958 | 1484 |
959 function TestValueOf2(handler, create) { | 1485 function TestValueOf2(handler, create) { |
960 var o = create(handler) | 1486 var p = create(handler) |
961 assertSame(o, Object.prototype.valueOf.call(o)) | 1487 assertSame(p, Object.prototype.valueOf.call(p)) |
962 } | 1488 } |
963 | 1489 |
964 TestValueOf({}) | 1490 TestValueOf({}) |
965 | 1491 |
966 | 1492 |
967 | 1493 |
968 // Enumerability (Object.prototype.propertyIsEnumerable) | 1494 // Enumerability (Object.prototype.propertyIsEnumerable) |
969 | 1495 |
970 var key | 1496 var key |
971 | 1497 |
972 function TestIsEnumerable(handler) { | 1498 function TestIsEnumerable(handler) { |
973 TestWithProxies(TestIsEnumerable2, handler) | 1499 TestWithProxies(TestIsEnumerable2, handler) |
974 } | 1500 } |
975 | 1501 |
976 function TestIsEnumerable2(handler, create) { | 1502 function TestIsEnumerable2(handler, create) { |
977 var o = create(handler) | 1503 var p = create(handler) |
978 assertTrue(Object.prototype.propertyIsEnumerable.call(o, "a")) | 1504 assertTrue(Object.prototype.propertyIsEnumerable.call(p, "a")) |
979 assertEquals("a", key) | 1505 assertEquals("a", key) |
980 assertTrue(Object.prototype.propertyIsEnumerable.call(o, 2)) | 1506 assertTrue(Object.prototype.propertyIsEnumerable.call(p, 2)) |
981 assertEquals("2", key) | 1507 assertEquals("2", key) |
982 assertFalse(Object.prototype.propertyIsEnumerable.call(o, "z")) | 1508 assertFalse(Object.prototype.propertyIsEnumerable.call(p, "z")) |
983 assertEquals("z", key) | 1509 assertEquals("z", key) |
984 } | 1510 } |
985 | 1511 |
986 TestIsEnumerable({ | 1512 TestIsEnumerable({ |
987 getOwnPropertyDescriptor: function(k) { | 1513 getOwnPropertyDescriptor: function(k) { |
988 key = k; return {enumerable: k < "z", configurable: true} | 1514 key = k; return {enumerable: k < "z", configurable: true} |
989 }, | 1515 }, |
990 }) | 1516 }) |
991 | 1517 |
992 TestIsEnumerable({ | 1518 TestIsEnumerable({ |
(...skipping 13 matching lines...) Expand all Loading... | |
1006 | 1532 |
1007 TestIsEnumerable(Proxy.create({ | 1533 TestIsEnumerable(Proxy.create({ |
1008 get: function(pr, pk) { | 1534 get: function(pr, pk) { |
1009 return function(k) { | 1535 return function(k) { |
1010 key = k; return {enumerable: k < "z", configurable: true} | 1536 key = k; return {enumerable: k < "z", configurable: true} |
1011 } | 1537 } |
1012 } | 1538 } |
1013 })) | 1539 })) |
1014 | 1540 |
1015 | 1541 |
1542 function TestIsEnumerableThrow(handler) { | |
1543 TestWithProxies(TestIsEnumerableThrow2, handler) | |
1544 } | |
1545 | |
1546 function TestIsEnumerableThrow2(handler, create) { | |
1547 var p = create(handler) | |
1548 assertThrows(function(){ Object.prototype.propertyIsEnumerable.call(p, "a") }, | |
1549 "myexn") | |
1550 assertThrows(function(){ Object.prototype.propertyIsEnumerable.call(p, 11) }, | |
1551 "myexn") | |
1552 } | |
1553 | |
1554 TestIsEnumerableThrow({ | |
1555 getOwnPropertyDescriptor: function(k) { throw "myexn" } | |
1556 }) | |
1557 | |
1558 TestIsEnumerableThrow({ | |
1559 getOwnPropertyDescriptor: function(k) { | |
1560 return this.getOwnPropertyDescriptor2(k) | |
1561 }, | |
1562 getOwnPropertyDescriptor2: function(k) { throw "myexn" } | |
1563 }) | |
1564 | |
1565 TestIsEnumerableThrow({ | |
1566 getOwnPropertyDescriptor: function(k) { | |
1567 return {get enumerable() { throw "myexn" }, configurable: true} | |
1568 }, | |
1569 }) | |
1570 | |
1571 TestIsEnumerableThrow(Proxy.create({ | |
1572 get: function(pr, pk) { throw "myexn" } | |
1573 })) | |
1574 | |
1575 TestIsEnumerableThrow(Proxy.create({ | |
1576 get: function(pr, pk) { | |
1577 return function(k) { throw "myexn" } | |
1578 } | |
1579 })) | |
1580 | |
1581 | |
1016 | 1582 |
1017 // Calling (call, Function.prototype.call, Function.prototype.apply, | 1583 // Calling (call, Function.prototype.call, Function.prototype.apply, |
1018 // Function.prototype.bind). | 1584 // Function.prototype.bind). |
1019 | 1585 |
1020 var global = this | 1586 var global = this |
1021 var receiver | 1587 var receiver |
1022 | 1588 |
1023 function TestCall(isStrict, callTrap) { | 1589 function TestCall(isStrict, callTrap) { |
1024 assertEquals(42, callTrap(5, 37)) | 1590 assertEquals(42, callTrap(5, 37)) |
1025 // TODO(rossberg): unrelated bug: this does not succeed for optimized code. | 1591 // TODO(rossberg): unrelated bug: this does not succeed for optimized code. |
1026 // assertEquals(isStrict ? undefined : global, receiver) | 1592 // assertEquals(isStrict ? undefined : global, receiver) |
1027 | 1593 |
1028 var f = Proxy.createFunction({fix: function() { return {} }}, callTrap) | 1594 var f = Proxy.createFunction({fix: function() { return {} }}, callTrap) |
1029 | |
1030 receiver = 333 | 1595 receiver = 333 |
1031 assertEquals(42, f(11, 31)) | 1596 assertEquals(42, f(11, 31)) |
1032 assertEquals(isStrict ? undefined : global, receiver) | 1597 assertEquals(isStrict ? undefined : global, receiver) |
1033 var o = {} | 1598 var o = {} |
1034 assertEquals(42, Function.prototype.call.call(f, o, 20, 22)) | 1599 assertEquals(42, Function.prototype.call.call(f, o, 20, 22)) |
1035 assertEquals(o, receiver) | 1600 assertEquals(o, receiver) |
1036 receiver = 333 | 1601 receiver = 333 |
1037 assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])) | 1602 assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])) |
1038 assertEquals(o, receiver) | 1603 assertEquals(o, receiver) |
1039 var ff = Function.prototype.bind.call(f, o, 12) | 1604 var ff = Function.prototype.bind.call(f, o, 12) |
1040 receiver = 333 | 1605 receiver = 333 |
1041 assertEquals(42, ff(30)) | 1606 assertEquals(42, ff(30)) |
1042 assertEquals(o, receiver) | 1607 assertEquals(o, receiver) |
1043 receiver = 333 | 1608 receiver = 333 |
1044 assertEquals(32, Function.prototype.apply.call(ff, {}, [20])) | 1609 assertEquals(32, Function.prototype.apply.call(ff, {}, [20])) |
1045 assertEquals(o, receiver) | 1610 assertEquals(o, receiver) |
1046 | 1611 |
1047 Object.freeze(f) | 1612 Object.freeze(f) |
1048 | |
1049 receiver = 333 | 1613 receiver = 333 |
1050 assertEquals(42, f(11, 31)) | 1614 assertEquals(42, f(11, 31)) |
1051 // TODO(rossberg): unrelated bug: this does not succeed for optimized code. | 1615 // TODO(rossberg): unrelated bug: this does not succeed for optimized code. |
1052 // assertEquals(isStrict ? undefined : global, receiver) | 1616 // assertEquals(isStrict ? undefined : global, receiver) |
1053 receiver = 333 | 1617 receiver = 333 |
1054 assertEquals(42, Function.prototype.call.call(f, o, 20, 22)) | 1618 assertEquals(42, Function.prototype.call.call(f, o, 20, 22)) |
1055 assertEquals(o, receiver) | 1619 assertEquals(o, receiver) |
1056 receiver = 333 | 1620 receiver = 333 |
1057 assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])) | 1621 assertEquals(32, Function.prototype.apply.call(f, o, [17, 15])) |
1058 assertEquals(o, receiver) | 1622 assertEquals(o, receiver) |
(...skipping 21 matching lines...) Expand all Loading... | |
1080 TestCall(true, Proxy.createFunction({}, function(x, y) { | 1644 TestCall(true, Proxy.createFunction({}, function(x, y) { |
1081 "use strict"; | 1645 "use strict"; |
1082 receiver = this; return x + y | 1646 receiver = this; return x + y |
1083 })) | 1647 })) |
1084 | 1648 |
1085 var p = Proxy.createFunction({fix: function() {return {}}}, function(x, y) { | 1649 var p = Proxy.createFunction({fix: function() {return {}}}, function(x, y) { |
1086 receiver = this; return x + y | 1650 receiver = this; return x + y |
1087 }) | 1651 }) |
1088 Object.freeze(p) | 1652 Object.freeze(p) |
1089 TestCall(false, p) | 1653 TestCall(false, p) |
1654 | |
1655 | |
1656 function TestCallThrow(callTrap) { | |
1657 var f = Proxy.createFunction({fix: function() {return {}}}, callTrap) | |
1658 assertThrows(function(){ f(11) }, "myexn") | |
1659 assertThrows(function(){ Function.prototype.call.call(f, {}, 2) }, "myexn") | |
1660 assertThrows(function(){ Function.prototype.apply.call(f, {}, [1]) }, "myexn") | |
1661 | |
1662 Object.freeze(f) | |
1663 assertThrows(function(){ f(11) }, "myexn") | |
1664 assertThrows(function(){ Function.prototype.call.call(f, {}, 2) }, "myexn") | |
1665 assertThrows(function(){ Function.prototype.apply.call(f, {}, [1]) }, "myexn") | |
1666 } | |
1667 | |
1668 TestCallThrow(function() { throw "myexn" }) | |
1669 TestCallThrow(Proxy.createFunction({}, function() { throw "myexn" })) | |
1670 | |
1671 var p = Proxy.createFunction( | |
1672 {fix: function() {return {}}}, function() { throw "myexn" }) | |
1673 Object.freeze(p) | |
1674 TestCallThrow(p) | |
OLD | NEW |