UNPKG

445 kBJavaScriptView Raw
1// exports browsers and tests
2
3require('object.assign').shim();
4
5var temp = {};
6var flag = "flagged";
7var very = "very";
8var strict = "strict";
9var fallthrough = "needs-polyfill-or-native";
10
11var babel = {
12 regenerator: {
13 val: true,
14 note_id: "babel-regenerator",
15 note_html: "This feature requires <code>regenerator-runtime</code>, it's a part of <code>babel-polyfill</code> or <code>babel-runtime</code>."
16 }
17};
18
19var typescript = {
20 corejs: {
21 val: true,
22 note_id: "typescript-core-js",
23 note_html: "This feature is supported when using TypeScript with <a href='https://github.com/zloirock/core-js'>core-js</a>, or when a native ES6 host is used."
24 },
25 fallthrough: {
26 val: fallthrough,
27 note_id: "typescript-es6",
28 note_html: "TypeScript's compiler will accept code using this feature if the <code>--target ES6</code> flag is set, but passes it through unmodified and does not supply a runtime polyfill."
29 }
30};
31
32exports.name = 'ES6';
33exports.target_file = 'es6/index.html';
34exports.skeleton_file = 'es6/skeleton.html';
35
36exports.browsers = {
37 tr: {
38 full: 'Traceur',
39 short: 'Traceur',
40 obsolete: false,
41 platformtype: 'compiler',
42 },
43 babel: {
44 full: 'Babel 6.5 + core-js 2.2',
45 short: 'Babel +<br><nobr>core-js</nobr>',
46 obsolete: false,
47 platformtype: 'compiler',
48 note_id: 'babel-optional',
49 note_html: 'Flagged features require an optional transformer setting.',
50 },
51 es6tr: {
52 full: 'ES6 Transpiler',
53 short: 'ES6<br>Trans-<br>piler',
54 obsolete: true,
55 platformtype: 'compiler',
56 },
57 closure: {
58 full: 'Closure Compiler v20160713',
59 short: 'Closure',
60 obsolete: false,
61 platformtype: 'compiler',
62 },
63 jsx: {
64 full: 'JSX',
65 short: 'JSX',
66 obsolete: true,
67 platformtype: 'compiler',
68 note_id: 'jsx-flag',
69 note_html: 'Have to be enabled via <code>harmony</code> option'
70 },
71 typescript: {
72 full: 'TypeScript 1.8 + core-js 2.2',
73 short: 'Type-<br />Script +<br /><nobr>core-js</nobr>',
74 obsolete: false,
75 platformtype: 'compiler'
76 },
77 es6shim: {
78 full: 'es6-shim',
79 short: 'es6-<br>shim',
80 obsolete: false,
81 platformtype: 'compiler',
82 },
83 ie10: {
84 full: 'Internet Explorer',
85 family: 'Chakra',
86 short: 'IE 10',
87 obsolete: true
88 },
89 ie11: {
90 full: 'Internet Explorer',
91 family: 'Chakra',
92 short: 'IE 11',
93 obsolete: false // no EOL any time soon
94 },
95 edge12: {
96 full: 'Microsoft Edge',
97 family: 'Chakra',
98 short: 'Edge 12',
99 note_id: 'edge-experimental-flag',
100 note_html: 'Flagged features have to be enabled via "Enable experimental Javascript features" setting under about:flags',
101 obsolete: true
102 },
103 edge13: {
104 full: 'Microsoft Edge',
105 family: 'Chakra',
106 short: 'Edge 13',
107 note_id: 'edge-experimental-flag',
108 note_html: 'Flagged features have to be enabled via "Enable experimental Javascript features" setting under about:flags',
109 },
110 edge14: {
111 full: 'Microsoft Edge',
112 family: 'Chakra',
113 short: 'Edge 14',
114 note_id: 'edge-experimental-flag',
115 note_html: 'Flagged features have to be enabled via "Enable experimental Javascript features" setting under about:flags',
116 },
117 firefox2: {
118 full: 'Firefox',
119 short: 'FF 2',
120 obsolete: very
121 },
122 firefox3: {
123 full: 'Firefox',
124 short: 'FF 3',
125 obsolete: very
126 },
127 firefox3_5: {
128 full: 'Firefox',
129 short: 'FF 3.5',
130 obsolete: very
131 },
132 firefox3_6: {
133 full: 'Firefox',
134 short: 'FF 3.6',
135 obsolete: very
136 },
137 firefox4:{
138 full: 'Firefox',
139 short: 'FF 4',
140 obsolete: very
141 },
142 firefox6:{
143 full: 'Firefox',
144 short: 'FF 6',
145 obsolete: very
146 },
147 firefox7: {
148 full: 'Firefox',
149 short: 'FF 7',
150 obsolete: very
151 },
152 firefox10: {
153 full: 'Firefox',
154 short: 'FF 10<br> ESR',
155 obsolete: very // ESR (EOL on February 12, 2013)
156 },
157 firefox13: {
158 full: 'Firefox',
159 short: 'FF 13',
160 obsolete: very
161 },
162 firefox16: {
163 full: 'Firefox',
164 short: 'FF 16',
165 obsolete: very
166 },
167 firefox17: {
168 full: 'Firefox',
169 short: 'FF 17<br> ESR',
170 obsolete: very // ESR (EOL on December 3, 2013)
171 },
172 firefox18: {
173 full: 'Firefox',
174 short: 'FF 18',
175 obsolete: very
176 },
177 firefox23: {
178 full: 'Firefox',
179 short: 'FF 23',
180 obsolete: very
181 },
182 firefox24: {
183 full: 'Firefox',
184 short: 'FF 24<br> ESR',
185 obsolete: very // ESR (EOL on October 14, 2014)
186 },
187 firefox25: {
188 full: 'Firefox',
189 short: 'FF 25',
190 obsolete: very
191 },
192 firefox27: {
193 full: 'Firefox',
194 short: 'FF 27',
195 obsolete: very
196 },
197 firefox28: {
198 full: 'Firefox',
199 short: 'FF 28',
200 obsolete: very
201 },
202 firefox29: {
203 full: 'Firefox',
204 short: 'FF 29',
205 obsolete: very
206 },
207 firefox30: {
208 full: 'Firefox',
209 short: 'FF 30',
210 obsolete: very
211 },
212 firefox31: {
213 full: 'Firefox',
214 short: 'FF 31<br> ESR',
215 obsolete: true // ESR (EOL on August 11, 2015)
216 },
217 firefox32: {
218 full: 'Firefox',
219 short: 'FF 32',
220 obsolete: very
221 },
222 firefox33: {
223 full: 'Firefox',
224 short: 'FF 33',
225 obsolete: very
226 },
227 firefox34: {
228 full: 'Firefox',
229 short: 'FF 34',
230 obsolete: very
231 },
232 firefox35: {
233 full: 'Firefox',
234 short: 'FF 35',
235 obsolete: very
236 },
237 firefox36: {
238 full: 'Firefox',
239 short: 'FF 36',
240 obsolete: very
241 },
242 firefox37: {
243 full: 'Firefox',
244 short: 'FF 37',
245 obsolete: very,
246 },
247 firefox38: {
248 full: 'Firefox',
249 short: 'FF 38<br> ESR',
250 obsolete: true, // ESR (EOL on June 7, 2016)
251 },
252 firefox39: {
253 full: 'Firefox',
254 short: 'FF 39',
255 obsolete: true,
256 },
257 firefox40: {
258 full: 'Firefox',
259 short: 'FF 40',
260 obsolete: true,
261 },
262 firefox41: {
263 full: 'Firefox',
264 short: 'FF 41',
265 obsolete: true,
266 },
267 firefox42: {
268 full: 'Firefox',
269 short: 'FF 42',
270 obsolete: true,
271 },
272 firefox43: {
273 full: 'Firefox',
274 short: 'FF 43',
275 obsolete: true,
276 },
277 firefox44: {
278 full: 'Firefox',
279 short: 'FF 44',
280 obsolete: true,
281 },
282 firefox45: {
283 full: 'Firefox',
284 short: 'FF 45 ESR',
285 obsolete: false, // ESR (EOL at Mar 2017)
286 },
287 firefox46: {
288 full: 'Firefox',
289 short: 'FF 46',
290 obsolete: true,
291 },
292 firefox47: {
293 full: 'Firefox',
294 short: 'FF 47',
295 obsolete: true,
296 },
297 firefox48: {
298 full: 'Firefox',
299 short: 'FF 48',
300 },
301 firefox49: {
302 full: 'Firefox',
303 short: 'FF 49',
304 unstable: true,
305 },
306 firefox50: {
307 full: 'Firefox',
308 short: 'FF 50',
309 unstable: true,
310 },
311 firefox51: {
312 full: 'Firefox',
313 short: 'FF 51',
314 unstable: true,
315 },
316 chrome: {
317 full: 'Chrome',
318 short: 'CH &lt;19',
319 obsolete: true
320 },
321 chrome19dev: {
322 full: 'Chrome',
323 short: 'CH 19',
324 obsolete: very,
325 note_id: 'experimental-flag',
326 note_html: 'Flagged features have to be enabled via "Experimental Javascript features" flag'
327 },
328 chrome21dev: {
329 full: 'Chrome',
330 short: 'CH 21-29',
331 obsolete: very,
332 note_id: 'experimental-flag',
333 },
334 chrome30: {
335 full: 'Chrome, Opera',
336 short: 'CH&nbsp;30,<br>OP&nbsp;17',
337 obsolete: very,
338 note_id: 'experimental-flag',
339 },
340 chrome31: {
341 full: 'Chrome, Opera',
342 short: 'CH&nbsp;31,<br>OP&nbsp;18',
343 obsolete: very,
344 note_id: 'experimental-flag',
345 },
346 chrome33: {
347 full: 'Chrome, Opera',
348 short: 'CH&nbsp;32-33,<br>OP&nbsp;19-20',
349 obsolete: very,
350 note_id: 'experimental-flag',
351 },
352 chrome34: {
353 full: 'Chrome, Opera',
354 short: 'CH&nbsp;34,<br>OP&nbsp;21',
355 obsolete: very,
356 note_id: 'experimental-flag',
357 },
358 chrome35: {
359 full: 'Chrome, Opera',
360 short: 'CH&nbsp;35,<br>OP&nbsp;22',
361 obsolete: very,
362 note_id: 'experimental-flag',
363 },
364 chrome36: {
365 full: 'Chrome, Opera',
366 short: 'CH&nbsp;36,<br>OP&nbsp;23',
367 obsolete: very,
368 note_id: 'experimental-flag',
369 },
370 chrome37: {
371 full: 'Chrome, Opera',
372 short: 'CH&nbsp;37,<br>OP&nbsp;24',
373 obsolete: very,
374 note_id: 'experimental-flag',
375 },
376 chrome38: {
377 full: 'Chrome, Opera',
378 short: 'CH&nbsp;38,<br>OP&nbsp;25',
379 obsolete: very,
380 note_id: 'experimental-flag',
381 },
382 chrome39: {
383 full: 'Chrome, Opera',
384 short: 'CH 39,<br>OP&nbsp;26',
385 obsolete: true,
386 note_id: 'experimental-flag',
387 },
388 chrome40: {
389 full: 'Chrome, Opera',
390 short: 'CH 40,<br>OP&nbsp;27',
391 obsolete: true,
392 note_id: 'experimental-flag',
393 },
394 chrome41: {
395 full: 'Chrome, Opera',
396 short: 'CH 41,<br>OP&nbsp;28',
397 obsolete: true,
398 note_id: 'experimental-flag',
399 },
400 chrome42: {
401 full: 'Chrome, Opera',
402 short: 'CH 42,<br>OP&nbsp;29',
403 obsolete: true,
404 note_id: 'experimental-flag',
405 },
406 chrome43: {
407 full: 'Chrome, Opera',
408 short: 'CH 43,<br>OP&nbsp;30',
409 obsolete: true,
410 note_id: 'experimental-flag',
411 },
412 chrome44: {
413 full: 'Chrome, Opera',
414 short: 'CH 44,<br>OP&nbsp;31',
415 obsolete: true,
416 note_id: 'experimental-flag',
417 },
418 chrome45: {
419 full: 'Chrome, Opera',
420 short: 'CH 45,<br>OP&nbsp;32',
421 obsolete: true,
422 note_id: 'experimental-flag',
423 },
424 chrome46: {
425 full: 'Chrome, Opera',
426 short: 'CH 46,<br>OP&nbsp;33',
427 obsolete: true,
428 note_id: 'experimental-flag',
429 },
430 chrome47: {
431 full: 'Chrome, Opera',
432 short: 'CH 47,<br>OP&nbsp;34',
433 obsolete: true,
434 note_id: 'experimental-flag',
435 },
436 chrome48: {
437 full: 'Chrome, Opera',
438 short: 'CH 48,<br>OP&nbsp;35',
439 obsolete: true,
440 note_id: 'experimental-flag',
441 },
442 chrome49: {
443 full: 'Chrome, Opera',
444 short: 'CH 49,<br>OP&nbsp;36',
445 obsolete: true,
446 note_id: 'experimental-flag',
447 },
448 chrome50: {
449 full: 'Chrome, Opera',
450 short: 'CH 50,<br>OP&nbsp;37',
451 obsolete: true,
452 note_id: 'experimental-flag',
453 },
454 chrome51: {
455 full: 'Chrome, Opera',
456 short: 'CH 51,<br>OP&nbsp;38',
457 obsolete: true,
458 note_id: 'experimental-flag',
459 },
460 chrome52: {
461 full: 'Chrome, Opera',
462 short: 'CH&nbsp;52+,<br>OP&nbsp;39+',
463 note_id: 'experimental-flag',
464 },
465 safari51: {
466 full: 'Safari',
467 short: 'SF 5.1',
468 obsolete: true
469 },
470 safari6: {
471 full: 'Safari',
472 short: 'SF 6',
473 obsolete: true
474 },
475 safari7: {
476 full: 'Safari',
477 short: 'SF 6.1,<br>SF 7',
478 obsolete: true
479 },
480 safari71_8: {
481 full: 'Safari',
482 short: 'SF 7.1,<br>SF 8',
483 obsolete: false
484 },
485 safari9: {
486 full: 'Safari',
487 short: 'SF 9',
488 },
489 safari10: {
490 full: 'Safari',
491 short: 'SF 10',
492 unstable: true,
493 },
494 safaritp: {
495 full: 'Safari Technology Preview Release 12',
496 short: 'SF TP',
497 unstable: true
498 },
499 webkit: {
500 full: 'WebKit r204915 (August 24, 2016)',
501 short: 'WK',
502 unstable: true,
503 },
504 opera: {
505 full: 'Opera 12.16',
506 short: 'OP 12',
507 obsolete: true
508 },
509 konq49: {
510 full: 'Konqueror 4.14',
511 short: 'KQ<br>4.14',
512 note_id: 'khtml',
513 note_html: 'Results are only applicable for the KHTML rendering engine.'
514 },
515 rhino17: {
516 full: 'Rhino 1.7',
517 short: 'RH',
518 platformtype: 'engine',
519 obsolete: true,
520 },
521 phantom: {
522 full: 'PhantomJS 2.0',
523 short: 'PJS',
524 platformtype: 'engine',
525 equals: 'safari6',
526 // As PJS is a "headless browser" that emulates a real browser, it technically should support annex B.
527 needs_annex_b: true,
528 },
529 node012: {
530 full: 'Node.js',
531 family: 'Node.js',
532 short: 'Node<br>0.12',
533 platformtype: 'engine',
534 note_id: 'harmony-flag',
535 note_html: 'Flagged features have to be enabled via <code>--harmony</code> or <code>--es_staging</code> flag',
536 obsolete: false // Long-term support ends April 2017.
537 },
538 iojs: {
539 full: 'io.js',
540 family: 'Node.js',
541 short: 'io.js<br>3.3',
542 platformtype: 'engine',
543 note_id: 'harmony-flag',
544 equals: 'chrome44',
545 obsolete: true,
546 },
547 node4: {
548 full: 'Node.js',
549 family: 'Node.js',
550 short: 'Node<br>4',
551 platformtype: 'engine',
552 note_id: 'harmony-flag',
553 obsolete: false // Long-term support ends April 2018.
554 },
555 node5: {
556 full: 'Node.js',
557 family: 'Node.js',
558 short: 'Node<br>5',
559 platformtype: 'engine',
560 note_id: 'harmony-flag',
561 obsolete: true,
562 },
563 node6: {
564 full: 'Node.js',
565 family: 'Node.js',
566 short: 'Node<br>6',
567 platformtype: 'engine',
568 note_id: 'harmony-flag',
569 equals: 'chrome50',
570 obsolete: false,
571 },
572 ejs: {
573 full: 'Echo JS',
574 short: 'Echo JS',
575 unstable: true,
576 platformtype: 'engine',
577 },
578 xs6: {
579 full: 'Kinoma XS6',
580 short: 'XS6',
581 platformtype: 'engine'
582 },
583 jxa: {
584 full: 'JavaScript Automation for OS X',
585 short: 'JXA',
586 platformtype: 'engine'
587 },
588 android40: {
589 full: 'Android Browser',
590 short: 'AN 4.0',
591 platformtype: 'mobile',
592 obsolete: true,
593 },
594 android41: {
595 full: 'Android Browser',
596 short: 'AN 4.1',
597 platformtype: 'mobile',
598 obsolete: true,
599 },
600 android42: {
601 full: 'Android Browser',
602 short: 'AN 4.2',
603 platformtype: 'mobile',
604 obsolete: true,
605 },
606 android43: {
607 full: 'Android Browser',
608 short: 'AN 4.3',
609 platformtype: 'mobile',
610 obsolete: true,
611 },
612 android44: {
613 full: 'Android Browser',
614 short: 'AN 4.4',
615 platformtype: 'mobile',
616 equals: 'chrome30',
617 ignore_flagged: true,
618 },
619 android50: {
620 full: 'Android Browser',
621 short: 'AN 5.0',
622 platformtype: 'mobile',
623 equals: 'chrome37',
624 ignore_flagged: true,
625 },
626 android51: {
627 full: 'Android Browser',
628 short: 'AN 5.1',
629 platformtype: 'mobile',
630 equals: 'chrome39',
631 ignore_flagged: true,
632 },
633 ios7: {
634 full: 'iOS Safari',
635 short: 'iOS 7',
636 platformtype: 'mobile',
637 equals: 'safari7',
638 obsolete: true,
639 },
640 ios8: {
641 full: 'iOS Safari',
642 short: 'iOS 8',
643 platformtype: 'mobile',
644 equals: 'safari71_8',
645 obsolete: true,
646 },
647 ios9: {
648 full: 'iOS Safari',
649 short: 'iOS 9',
650 platformtype: 'mobile',
651 equals: 'safari9',
652 }
653};
654
655exports.tests = [
656{
657 name: 'proper tail calls (tail call optimisation)',
658 category: 'optimisation',
659 significance: 'medium',
660 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-tail-position-calls',
661 subtests: [
662 {
663 name: 'direct recursion',
664 exec: function() {/*
665 "use strict";
666 return (function f(n){
667 if (n <= 0) {
668 return "foo";
669 }
670 return f(n - 1);
671 }(1e6)) === "foo";
672 */},
673 res: {
674 tr: {
675 val: flag,
676 note_id: 'tr-tco',
677 note_html: 'Requires the <code>properTailCalls</code> compile option.'
678 },
679 babel: false,
680 typescript: typescript.fallthrough,
681 chrome51: flag,
682 safaritp: true,
683 safari10: true,
684 webkit: true,
685 xs6: true,
686 },
687 },
688 {
689 name: 'mutual recursion',
690 exec: function() {/*
691 "use strict";
692 function f(n){
693 if (n <= 0) {
694 return "foo";
695 }
696 return g(n - 1);
697 }
698 function g(n){
699 if (n <= 0) {
700 return "bar";
701 }
702 return f(n - 1);
703 }
704 return f(1e6) === "foo" && f(1e6+1) === "bar";
705 */},
706 res: {
707 tr: { val: flag, note_id: 'tr-tco' },
708 typescript: typescript.fallthrough,
709 chrome51: flag,
710 safaritp: true,
711 safari10: true,
712 webkit: true,
713 xs6: true,
714 },
715 }
716 ]
717},
718{
719 name: 'arrow functions',
720 category: 'functions',
721 significance: 'large',
722 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-arrow-function-definitions',
723 subtests: [
724 {
725 name: '0 parameters',
726 exec: function(){/*
727 return (() => 5)() === 5;
728 */},
729 res: {
730 tr: true,
731 babel: true,
732 es6tr: true,
733 jsx: true,
734 typescript: true,
735 ejs: true,
736 closure: true,
737 edge12: true,
738 firefox23: true,
739 chrome38: flag,
740 chrome40: false,
741 chrome45: true,
742 safaritp: true,
743 safari10: true,
744 webkit: true,
745 node012: flag,
746 node4: true,
747 xs6: true,
748 },
749 },
750 {
751 name: '1 parameter, no brackets',
752 exec: function(){/*
753 var b = x => x + "foo";
754 return (b("fee fie foe ") === "fee fie foe foo");
755 */},
756 res: {
757 tr: true,
758 babel: true,
759 es6tr: true,
760 jsx: true,
761 typescript: true,
762 ejs: true,
763 closure: true,
764 edge12: true,
765 firefox23: true,
766 chrome38: flag,
767 chrome40: false,
768 chrome45: true,
769 safaritp: true,
770 safari10: true,
771 webkit: true,
772 node012: flag,
773 node4: true,
774 xs6: true,
775 },
776 },
777 {
778 name: 'multiple parameters',
779 exec: function(){/*
780 var c = (v, w, x, y, z) => "" + v + w + x + y + z;
781 return (c(6, 5, 4, 3, 2) === "65432");
782 */},
783 res: {
784 tr: true,
785 babel: true,
786 es6tr: true,
787 jsx: true,
788 typescript: true,
789 ejs: true,
790 closure: true,
791 edge12: true,
792 firefox23: true,
793 chrome38: flag,
794 chrome40: false,
795 chrome45: true,
796 safaritp: true,
797 safari10: true,
798 webkit: true,
799 node012: flag,
800 node4: true,
801 xs6: true,
802 },
803 },
804 {
805 name: 'lexical "this" binding',
806 exec: function(){/*
807 var d = { x : "bar", y : function() { return z => this.x + z; }}.y();
808 var e = { x : "baz", y : d };
809 return d("ley") === "barley" && e.y("ley") === "barley";
810 */},
811 res: {
812 tr: true,
813 babel: true,
814 es6tr: true,
815 jsx: true,
816 typescript: true,
817 ejs: true,
818 closure: true,
819 edge12: true,
820 firefox23: true,
821 chrome45: true,
822 safaritp: true,
823 safari10: true,
824 webkit: true,
825 node4: true,
826 xs6: true,
827 },
828 },
829 {
830 name: '"this" unchanged by call or apply',
831 exec: function(){/*
832 var d = { x : "foo", y : function() { return () => this.x; }};
833 var e = { x : "bar" };
834 return d.y().call(e) === "foo" && d.y().apply(e) === "foo";
835 */},
836 res: {
837 tr: true,
838 closure: true,
839 babel: true,
840 es6tr: true,
841 jsx: true,
842 typescript: true,
843 ejs: true,
844 edge12: true,
845 firefox23: true,
846 chrome45: true,
847 safaritp: true,
848 safari10: true,
849 webkit: true,
850 node4: true,
851 xs6: true,
852 },
853 },
854 {
855 name: 'can\'t be bound, can be curried',
856 exec: function(){/*
857 var d = { x : "bar", y : function() { return z => this.x + z; }};
858 var e = { x : "baz" };
859 return d.y().bind(e, "ley")() === "barley";
860 */},
861 res: {
862 tr: true,
863 babel: true,
864 es6tr: true,
865 jsx: true,
866 typescript: true,
867 ejs: true,
868 closure: true,
869 edge12: true,
870 firefox23: true,
871 chrome45: true,
872 safaritp: true,
873 safari10: true,
874 webkit: true,
875 node4: true,
876 xs6: true,
877 },
878 },
879 {
880 name: 'lexical "arguments" binding',
881 exec: function(){/*
882 var f = (function() { return z => arguments[0]; }(5));
883 return f(6) === 5;
884 */},
885 res: {
886 tr: true,
887 ejs: true,
888 babel: true,
889 closure: true,
890 edge12: true,
891 firefox23: true,
892 firefox24: false,
893 firefox43: true,
894 chrome45: true,
895 node4: true,
896 xs6: true,
897 safaritp: true,
898 safari10: true,
899 webkit: true,
900 },
901 },
902 {
903 name: 'no line break between params and <code>=></code>',
904 exec: function(){/*
905 return (() => {
906 try { Function("x\n => 2")(); } catch(e) { return true; }
907 })();
908 */},
909 res: {
910 babel: true,
911 closure: true,
912 tr: true,
913 typescript: true,
914 edge12: true,
915 firefox39: true,
916 safaritp: true,
917 safari10: true,
918 webkit: true,
919 chrome45: true,
920 node4: true,
921 xs6: true,
922 },
923 },
924 {
925 name: 'correct precedence',
926 exec: function(){/*
927 return (() => {
928 try { Function("0 || () => 2")(); } catch(e) { return true; }
929 })();
930 */},
931 res: {
932 closure: true,
933 tr: true,
934 firefox23: true,
935 safaritp: true,
936 safari10: true,
937 webkit: true,
938 chrome47: true,
939 edge13: true,
940 xs6: false,
941 },
942 },
943 {
944 name: 'no "prototype" property',
945 exec: function(){/*
946 var a = () => 5;
947 return !a.hasOwnProperty("prototype");
948 */},
949 res: {
950 firefox23: true,
951 chrome39: flag,
952 chrome40: false,
953 chrome45: true,
954 edge13: true,
955 safaritp: true,
956 safari10: true,
957 webkit: true,
958 node4: true,
959 xs6: true,
960 },
961 },
962 {
963 name: 'lexical "super" binding in constructors',
964 exec: function(){/*
965 var received;
966
967 class B {
968 constructor (arg) {
969 received = arg;
970 }
971 }
972 class C extends B {
973 constructor () {
974 var callSuper = () => super('foo');
975 callSuper();
976 }
977 }
978 return new C instanceof C && received === 'foo'
979 */},
980 res: {
981 tr: true,
982 babel: false,
983 closure: false,
984 es6tr: true,
985 jsx: true,
986 typescript: true,
987 edge12: flag,
988 edge13: true,
989 firefox45: true,
990 chrome45: strict,
991 chrome49: true,
992 node4: strict,
993 xs6: true,
994 safaritp: true,
995 safari10: true,
996 webkit: true,
997 },
998 },
999 {
1000 name: 'lexical "super" binding in methods',
1001 exec: function(){/*
1002 class B {
1003 qux() {
1004 return "quux";
1005 }
1006 }
1007 class C extends B {
1008 baz() {
1009 return x => super.qux();
1010 }
1011 }
1012 var arrow = new C().baz();
1013 return arrow() === "quux";
1014 */},
1015 res: {
1016 tr: true,
1017 babel: true,
1018 closure: true,
1019 es6tr: true,
1020 jsx: true,
1021 typescript: true,
1022 edge12: flag,
1023 edge13: true,
1024 firefox45: true,
1025 chrome45: strict,
1026 chrome49: true,
1027 node4: strict,
1028 xs6: true,
1029 safaritp: true,
1030 safari10: true,
1031 webkit: true,
1032 },
1033 },
1034 {
1035 name: 'lexical "new.target" binding',
1036 exec: function(){/*
1037 function C() {
1038 return x => new.target;
1039 }
1040 return new C()() === C && C()() === undefined;
1041 */},
1042 res: {
1043 firefox41: true,
1044 chrome46: true,
1045 edge13: true,
1046 node5: true,
1047 xs6: true,
1048 safaritp: true,
1049 safari10: true,
1050 webkit: true,
1051 },
1052 },
1053 ],
1054},
1055{
1056 name: 'const',
1057 category: 'bindings',
1058 significance: 'medium',
1059 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-let-and-const-declarations',
1060 subtests: [
1061 {
1062 name: 'basic support',
1063 exec: function() {/*
1064 const foo = 123;
1065 return (foo === 123);
1066 */},
1067 res: {
1068 tr: true,
1069 babel: true,
1070 typescript: true,
1071 es6tr: true,
1072 ejs: true,
1073 closure: true,
1074 ie11: true,
1075 firefox3: true,
1076 chrome: true,
1077 safari51: true,
1078 safaritp: true,
1079 safari10: true,
1080 webkit: true,
1081 opera: true,
1082 konq49: true,
1083 node012: true,
1084 android40: true,
1085 xs6: true,
1086 jxa: true,
1087 }
1088 },
1089 {
1090 name: 'is block-scoped',
1091 exec: function() {/*
1092 const bar = 123;
1093 { const bar = 456; }
1094 return bar === 123;
1095 */},
1096 res: {
1097 babel: true,
1098 typescript: true,
1099 es6tr: true,
1100 tr: true,
1101 ejs: true,
1102 closure: true,
1103 ie11: true,
1104 firefox36: true,
1105 chrome48: flag,
1106 chrome49: true,
1107 safaritp: true,
1108 safari10: true,
1109 webkit: true,
1110 xs6: true,
1111 jxa: true,
1112 }
1113 },
1114 {
1115 name: 'cannot be in statements',
1116 exec: function() {/*
1117 const bar = 1;
1118 try {
1119 Function("if(true) const baz = 1;")();
1120 } catch(e) {
1121 return true;
1122 }
1123 */},
1124 res: {
1125 babel: true,
1126 typescript: true,
1127 es6tr: true,
1128 tr: true,
1129 ejs: true,
1130 closure: true,
1131 ie11: true,
1132 firefox36: true,
1133 chrome48: flag,
1134 chrome49: true,
1135 safaritp: true,
1136 safari10: true,
1137 webkit: true,
1138 xs6: true,
1139 jxa: true,
1140 }
1141 },
1142 {
1143 name: 'redefining a const is an error',
1144 exec: function() {/*
1145 const baz = 1;
1146 try {
1147 Function("const foo = 1; foo = 2;")();
1148 } catch(e) {
1149 return true;
1150 }
1151 */},
1152 res: {
1153 tr: true,
1154 babel: true,
1155 typescript: true,
1156 es6tr: true,
1157 closure: true,
1158 ie11: true,
1159 firefox36: true,
1160 chrome48: flag,
1161 chrome49: true,
1162 safaritp: true,
1163 safari10: true,
1164 webkit: true,
1165 xs6: true,
1166 jxa: true,
1167 }
1168 },
1169 {
1170 name: 'for loop statement scope',
1171 exec: function(){/*
1172 const baz = 1;
1173 for(const baz = 0; false;) {}
1174 return baz === 1;
1175 */},
1176 res: {
1177 tr: true,
1178 ejs: true,
1179 es6tr: true,
1180 babel: true,
1181 typescript: true,
1182 closure: true,
1183 ie11: true,
1184 firefox4: { val: flag, note_id: 'fx-let', },
1185 firefox44: true,
1186 safaritp: true,
1187 safari10: true,
1188 webkit: true,
1189 chrome48: flag,
1190 chrome49: true,
1191 xs6: true,
1192 },
1193 },
1194 {
1195 name: 'for-in loop iteration scope',
1196 exec: function(){/*
1197 var scopes = [];
1198 for(const i in { a:1, b:1 }) {
1199 scopes.push(function(){ return i; });
1200 }
1201 return (scopes[0]() === "a" && scopes[1]() === "b");
1202 */},
1203 res: {
1204 tr: true,
1205 babel: true,
1206 typescript: true,
1207 closure: true,
1208 safaritp: true,
1209 safari10: true,
1210 webkit: true,
1211 edge14: true,
1212 firefox51: true,
1213 chrome48: flag,
1214 chrome49: true,
1215 xs6: true,
1216 },
1217 },
1218 {
1219 name: 'for-of loop iteration scope',
1220 exec: function(){/*
1221 var scopes = [];
1222 for(const i of ['a','b']) {
1223 scopes.push(function(){ return i; });
1224 }
1225 return (scopes[0]() === "a" && scopes[1]() === "b");
1226 */},
1227 res: {
1228 tr: true,
1229 babel: true,
1230 typescript: true,
1231 closure: true,
1232 safaritp: true,
1233 safari10: true,
1234 webkit: true,
1235 edge14: true,
1236 firefox51: true,
1237 chrome48: flag,
1238 chrome49: true,
1239 xs6: true,
1240 },
1241 },
1242 {
1243 name: 'temporal dead zone',
1244 exec: function(){/*
1245 var passed = (function(){ try { qux; } catch(e) { return true; }}());
1246 function fn() { passed &= qux === 456; }
1247 const qux = 456;
1248 fn();
1249 return passed;
1250 */},
1251 res: {
1252 babel: flag,
1253 ie11: true,
1254 firefox36: true,
1255 chrome48: flag,
1256 chrome49: true,
1257 safaritp: true,
1258 safari10: true,
1259 webkit: true,
1260 xs6: true,
1261 jxa: true,
1262 },
1263 },
1264 {
1265 name: 'basic support (strict mode)',
1266 exec: function() {/*
1267 "use strict";
1268 const foo = 123;
1269 return (foo === 123);
1270 */},
1271 res: {
1272 tr: true,
1273 babel: true,
1274 typescript: true,
1275 es6tr: true,
1276 ejs: true,
1277 closure: true,
1278 ie11: true,
1279 firefox3: true,
1280 chrome: flag,
1281 chrome41: true,
1282 safaritp: true,
1283 safari10: true,
1284 webkit: true,
1285 konq49: true,
1286 node012: flag,
1287 node4: true,
1288 xs6: true,
1289 jxa: true,
1290 }
1291 },
1292 {
1293 name: 'is block-scoped (strict mode)',
1294 exec: function() {/*
1295 'use strict';
1296 const bar = 123;
1297 { const bar = 456; }
1298 return bar === 123;
1299 */},
1300 res: {
1301 babel: true,
1302 typescript: true,
1303 es6tr: true,
1304 tr: true,
1305 ejs: true,
1306 closure: true,
1307 chrome19dev: flag,
1308 chrome41: true,
1309 ie11: true,
1310 firefox36: true,
1311 safaritp: true,
1312 safari10: true,
1313 webkit: true,
1314 node012: flag,
1315 node4: true,
1316 xs6: true,
1317 jxa: true,
1318 }
1319 },
1320 {
1321 name: 'cannot be in statements (strict mode)',
1322 exec: function() {/*
1323 'use strict';
1324 const bar = 1;
1325 try {
1326 Function("'use strict'; if(true) const baz = 1;")();
1327 } catch(e) {
1328 return true;
1329 }
1330 */},
1331 res: {
1332 babel: true,
1333 typescript: true,
1334 es6tr: true,
1335 tr: true,
1336 ejs: true,
1337 closure: true,
1338 chrome19dev: flag,
1339 chrome41: true,
1340 ie11: true,
1341 firefox36: true,
1342 safaritp: true,
1343 safari10: true,
1344 webkit: true,
1345 node012: flag,
1346 node4: true,
1347 xs6: true,
1348 jxa: true,
1349 }
1350 },
1351 {
1352 name: 'redefining a const (strict mode)',
1353 exec: function() {/*
1354 'use strict';
1355 const baz = 1;
1356 try {
1357 Function("'use strict'; const foo = 1; foo = 2;")();
1358 } catch(e) {
1359 return true;
1360 }
1361 */},
1362 res: {
1363 tr: true,
1364 babel: true,
1365 typescript: true,
1366 es6tr: true,
1367 closure: true,
1368 ie11: true,
1369 firefox7: true,
1370 chrome21dev: flag,
1371 chrome41: true,
1372 safaritp: true,
1373 safari10: true,
1374 webkit: true,
1375 node012: flag,
1376 node4: true,
1377 xs6: true,
1378 jxa: true,
1379 }
1380 },
1381 {
1382 name: 'for loop statement scope (strict mode)',
1383 exec: function(){/*
1384 'use strict';
1385 const baz = 1;
1386 for(const baz = 0; false;) {}
1387 return baz === 1;
1388 */},
1389 res: {
1390 tr: true,
1391 ejs: true,
1392 babel: true,
1393 typescript: true,
1394 es6tr: true,
1395 closure: true,
1396 ie11: true,
1397 firefox4: { val: flag, note_id: 'fx-let', },
1398 firefox44: true,
1399 chrome19dev: flag,
1400 chrome41: true,
1401 safaritp: true,
1402 safari10: true,
1403 webkit: true,
1404 node012: flag,
1405 node4: true,
1406 xs6: true,
1407 },
1408 },
1409 {
1410 name: 'for-in loop iteration scope (strict mode)',
1411 exec: function(){/*
1412 'use strict';
1413 var scopes = [];
1414 for(const i in { a:1, b:1 }) {
1415 scopes.push(function(){ return i; });
1416 }
1417 return (scopes[0]() === "a" && scopes[1]() === "b");
1418 */},
1419 res: {
1420 tr: true,
1421 babel: true,
1422 typescript: true,
1423 closure: true,
1424 chrome40: flag,
1425 chrome41: true,
1426 safaritp: true,
1427 safari10: true,
1428 webkit: true,
1429 edge14: true,
1430 firefox51: true,
1431 node012: flag,
1432 node4: true,
1433 xs6: true,
1434 },
1435 },
1436 {
1437 name: 'for-of loop iteration scope (strict mode)',
1438 exec: function(){/*
1439 'use strict';
1440 var scopes = [];
1441 for(const i of ['a','b']) {
1442 scopes.push(function(){ return i; });
1443 }
1444 return (scopes[0]() === "a" && scopes[1]() === "b");
1445 */},
1446 res: {
1447 tr: true,
1448 babel: true,
1449 typescript: true,
1450 closure: true,
1451 safaritp: true,
1452 safari10: true,
1453 webkit: true,
1454 edge14: true,
1455 firefox51: true,
1456 chrome40: flag,
1457 chrome41: true,
1458 xs6: true,
1459 },
1460 },
1461 {
1462 name: 'temporal dead zone (strict mode)',
1463 exec: function(){/*
1464 'use strict';
1465 var passed = (function(){ try { qux; } catch(e) { return true; }}());
1466 function fn() { passed &= qux === 456; }
1467 const qux = 456;
1468 fn();
1469 return passed;
1470 */},
1471 res: {
1472 babel: flag,
1473 ie11: true,
1474 firefox36: true,
1475 chrome19dev: flag,
1476 chrome41: true,
1477 safaritp: true,
1478 safari10: true,
1479 webkit: true,
1480 node012: flag,
1481 node4: true,
1482 xs6: true,
1483 jxa: true,
1484 },
1485 },
1486 ]
1487},
1488{
1489 name: 'let',
1490 category: 'bindings',
1491 significance: 'medium',
1492 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-let-and-const-declarations',
1493 subtests: [
1494 {
1495 name: 'basic support',
1496 exec: function(){/*
1497 let foo = 123;
1498 return (foo === 123);
1499 */},
1500 res: {
1501 tr: true,
1502 babel: true,
1503 typescript: true,
1504 es6tr: true,
1505 ejs: true,
1506 closure: true,
1507 ie11: true,
1508 firefox4: {
1509 val: flag,
1510 note_id: 'fx-let',
1511 note_html: 'Available for code in a <code>&lt;script type="application/javascript;version=1.7"></code> (or <code>version=1.8</code>) tag.'
1512 },
1513 firefox44: true,
1514 safaritp: true,
1515 safari10: true,
1516 webkit: true,
1517 chrome48: flag,
1518 chrome49: true,
1519 xs6: true,
1520 },
1521 },
1522 {
1523 name: 'is block-scoped',
1524 exec: function(){/*
1525 let bar = 123;
1526 { let bar = 456; }
1527 return bar === 123;
1528 */},
1529 res: {
1530 tr: true,
1531 babel: true,
1532 typescript: true,
1533 es6tr: true,
1534 ejs: true,
1535 closure: true,
1536 ie11: true,
1537 firefox4: { val: flag, note_id: 'fx-let', },
1538 firefox44: true,
1539 safaritp: true,
1540 safari10: true,
1541 webkit: true,
1542 chrome48: flag,
1543 chrome49: true,
1544 xs6: true,
1545 },
1546 },
1547 {
1548 name: 'cannot be in statements',
1549 exec: function(){/*
1550 let bar = 1;
1551 try {
1552 Function("if(true) let baz = 1;")();
1553 } catch(e) {
1554 return true;
1555 }
1556 */},
1557 res: {
1558 tr: true,
1559 babel: true,
1560 typescript: true,
1561 es6tr: true,
1562 ejs: true,
1563 closure: true,
1564 ie11: true,
1565 firefox4: { val: flag, note_id: 'fx-let', },
1566 firefox44: true,
1567 safaritp: true,
1568 safari10: true,
1569 webkit: true,
1570 chrome48: flag,
1571 chrome49: true,
1572 xs6: true,
1573 },
1574 },
1575 {
1576 name: 'for loop statement scope',
1577 exec: function(){/*
1578 let baz = 1;
1579 for(let baz = 0; false;) {}
1580 return baz === 1;
1581 */},
1582 res: {
1583 tr: true,
1584 ejs: true,
1585 es6tr: true,
1586 babel: true,
1587 typescript: true,
1588 closure: true,
1589 ie11: true,
1590 firefox4: { val: flag, note_id: 'fx-let', },
1591 firefox44: true,
1592 safaritp: true,
1593 safari10: true,
1594 webkit: true,
1595 chrome48: flag,
1596 chrome49: true,
1597 xs6: true,
1598 },
1599 },
1600 {
1601 name: 'temporal dead zone',
1602 exec: function(){/*
1603 var passed = (function(){ try { qux; } catch(e) { return true; }}());
1604 function fn() { passed &= qux === 456; }
1605 let qux = 456;
1606 fn();
1607 return passed;
1608 */},
1609 res: {
1610 babel: flag,
1611 ie11: true,
1612 firefox35: { val: flag, note_id: 'fx-let', },
1613 firefox44: true,
1614 safaritp: true,
1615 safari10: true,
1616 webkit: true,
1617 chrome48: flag,
1618 chrome49: true,
1619 xs6: true,
1620 },
1621 },
1622 {
1623 name: 'for/for-in loop iteration scope',
1624 exec: function(){/*
1625 let scopes = [];
1626 for(let i = 0; i < 2; i++) {
1627 scopes.push(function(){ return i; });
1628 }
1629 let passed = (scopes[0]() === 0 && scopes[1]() === 1);
1630
1631 scopes = [];
1632 for(let i in { a:1, b:1 }) {
1633 scopes.push(function(){ return i; });
1634 }
1635 passed &= (scopes[0]() === "a" && scopes[1]() === "b");
1636 return passed;
1637 */},
1638 res: {
1639 tr: true,
1640 babel: true,
1641 typescript: true,
1642 closure: true,
1643 safaritp: true,
1644 safari10: true,
1645 webkit: true,
1646 edge14: true,
1647 firefox51: true,
1648 chrome48: flag,
1649 chrome49: true,
1650 xs6: true,
1651 },
1652 },
1653 {
1654 name: 'basic support (strict mode)',
1655 exec: function(){/*
1656 'use strict';
1657 let foo = 123;
1658 return (foo === 123);
1659 */},
1660 res: {
1661 tr: true,
1662 babel: true,
1663 typescript: true,
1664 es6tr: true,
1665 ejs: true,
1666 closure: true,
1667 ie11: true,
1668 chrome19dev: flag,
1669 chrome41: true,
1670 node012: flag,
1671 node4: true,
1672 firefox4: { val: flag, note_id: 'fx-let' },
1673 firefox44: true,
1674 safaritp: true,
1675 safari10: true,
1676 webkit: true,
1677 xs6: true,
1678 },
1679 },
1680 {
1681 name: 'is block-scoped (strict mode)',
1682 exec: function(){/*
1683 'use strict';
1684 let bar = 123;
1685 { let bar = 456; }
1686 return bar === 123;
1687 */},
1688 res: {
1689 tr: true,
1690 babel: true,
1691 typescript: true,
1692 es6tr: true,
1693 ejs: true,
1694 closure: true,
1695 ie11: true,
1696 firefox4: { val: flag, note_id: 'fx-let', },
1697 firefox44: true,
1698 chrome19dev: flag,
1699 chrome41: true,
1700 safaritp: true,
1701 safari10: true,
1702 webkit: true,
1703 node012: flag,
1704 node4: true,
1705 xs6: true,
1706 },
1707 },
1708 {
1709 name: 'cannot be in statements (strict mode)',
1710 exec: function(){/*
1711 'use strict';
1712 let bar = 1;
1713 try {
1714 Function("'use strict'; if(true) let baz = 1;")();
1715 } catch(e) {
1716 return true;
1717 }
1718 */},
1719 res: {
1720 tr: true,
1721 babel: true,
1722 typescript: true,
1723 es6tr: true,
1724 ejs: true,
1725 closure: true,
1726 ie11: true,
1727 firefox4: { val: flag, note_id: 'fx-let', },
1728 firefox44: true,
1729 safaritp: true,
1730 safari10: true,
1731 webkit: true,
1732 chrome19dev: flag,
1733 chrome41: true,
1734 node012: flag,
1735 node4: true,
1736 xs6: true,
1737 },
1738 },
1739 {
1740 name: 'for loop statement scope (strict mode)',
1741 exec: function(){/*
1742 'use strict';
1743 let baz = 1;
1744 for(let baz = 0; false;) {}
1745 return baz === 1;
1746 */},
1747 res: {
1748 tr: true,
1749 ejs: true,
1750 babel: true,
1751 typescript: true,
1752 es6tr: true,
1753 closure: true,
1754 ie11: true,
1755 firefox4: { val: flag, note_id: 'fx-let', },
1756 firefox44: true,
1757 chrome19dev: flag,
1758 chrome41: true,
1759 safaritp: true,
1760 safari10: true,
1761 webkit: true,
1762 node012: flag,
1763 node4: true,
1764 xs6: true,
1765 },
1766 },
1767 {
1768 name: 'temporal dead zone (strict mode)',
1769 exec: function(){/*
1770 'use strict';
1771 var passed = (function(){ try { qux; } catch(e) { return true; }}());
1772 function fn() { passed &= qux === 456; }
1773 let qux = 456;
1774 fn();
1775 return passed;
1776 */},
1777 res: {
1778 babel: flag,
1779 ie11: true,
1780 firefox35: { val: flag, note_id: 'fx-let', },
1781 firefox44: true,
1782 chrome19dev: flag,
1783 chrome41: true,
1784 safaritp: true,
1785 safari10: true,
1786 webkit: true,
1787 node012: flag,
1788 node4: true,
1789 xs6: true,
1790 },
1791 },
1792 {
1793 name: 'for/for-in loop iteration scope (strict mode)',
1794 exec: function(){/*
1795 'use strict';
1796 let scopes = [];
1797 for(let i = 0; i < 2; i++) {
1798 scopes.push(function(){ return i; });
1799 }
1800 let passed = (scopes[0]() === 0 && scopes[1]() === 1);
1801
1802 scopes = [];
1803 for(let i in { a:1, b:1 }) {
1804 scopes.push(function(){ return i; });
1805 }
1806 passed &= (scopes[0]() === "a" && scopes[1]() === "b");
1807 return passed;
1808 */},
1809 res: {
1810 tr: true,
1811 babel: true,
1812 typescript: true,
1813 closure: true,
1814 chrome37: flag,
1815 chrome41: true,
1816 safaritp: true,
1817 safari10: true,
1818 webkit: true,
1819 edge14: true,
1820 firefox51: true,
1821 node012: flag,
1822 node4: true,
1823 xs6: true,
1824 },
1825 },
1826 ],
1827},
1828{
1829 name: 'default function parameters',
1830 category: 'syntax',
1831 significance: 'medium',
1832 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-functiondeclarationinstantiation',
1833 subtests: [
1834 {
1835 name: 'basic functionality',
1836 exec: function(){/*
1837 return (function (a = 1, b = 2) { return a === 3 && b === 2; }(3));
1838 */},
1839 res: {
1840 tr: true,
1841 babel: true,
1842 es6tr: true,
1843 ejs: true,
1844 closure: true,
1845 typescript: true,
1846 firefox16: true,
1847 chrome48: flag,
1848 chrome49: true,
1849 safaritp: true,
1850 safari10: true,
1851 webkit: true,
1852 edge12: flag,
1853 edge14: true,
1854 xs6: true,
1855 },
1856 },
1857 {
1858 name: 'explicit undefined defers to the default',
1859 exec: function(){/*
1860 return (function (a = 1, b = 2) { return a === 1 && b === 3; }(undefined, 3));
1861 */},
1862 res: {
1863 tr: true,
1864 babel: true,
1865 es6tr: true,
1866 ejs: true,
1867 closure: true,
1868 typescript: true,
1869 firefox18: true,
1870 chrome48: flag,
1871 chrome49: true,
1872 safaritp: true,
1873 safari10: true,
1874 webkit: true,
1875 edge12: flag,
1876 edge14: true,
1877 xs6: true,
1878 },
1879 },
1880 {
1881 name: 'defaults can refer to previous params',
1882 exec: function(){/*
1883 return (function (a, b = a) { return b === 5; }(5));
1884 */},
1885 res: {
1886 tr: true,
1887 babel: true,
1888 es6tr: true,
1889 ejs: true,
1890 closure: true,
1891 typescript: true,
1892 firefox16: true,
1893 chrome48: flag,
1894 chrome49: true,
1895 safaritp: true,
1896 safari10: true,
1897 webkit: true,
1898 edge12: flag,
1899 edge14: true,
1900 xs6: true,
1901 },
1902 },
1903 {
1904 name: 'arguments object interaction',
1905 exec: function(){/*
1906 return (function (a = "baz", b = "qux", c = "quux") {
1907 a = "corge";
1908 // The arguments object is not mapped to the
1909 // parameters, even outside of strict mode.
1910 return arguments.length === 2
1911 && arguments[0] === "foo"
1912 && arguments[1] === "bar";
1913 }("foo", "bar"));
1914 */},
1915 res: {
1916 tr: true,
1917 babel: true,
1918 typescript: true,
1919 es6tr: true,
1920 ejs: true,
1921 safaritp: true,
1922 safari10: true,
1923 webkit: true,
1924 edge13: flag,
1925 edge14: true,
1926 firefox43: true,
1927 chrome48: flag,
1928 chrome49: true,
1929 xs6: true,
1930 },
1931 },
1932 {
1933 name: 'temporal dead zone',
1934 exec: function(){/*
1935 return (function(x = 1) {
1936 try {
1937 eval("(function(a=a){}())");
1938 return false;
1939 } catch(e) {}
1940 try {
1941 eval("(function(a=b,b){}())");
1942 return false;
1943 } catch(e) {}
1944 return true;
1945 }());
1946 */},
1947 res: {
1948 babel: false,
1949 typescript: true,
1950 safaritp: true,
1951 safari10: true,
1952 webkit: true,
1953 edge12: flag,
1954 edge14: true,
1955 firefox51: true,
1956 xs6: true,
1957 chrome49: true,
1958 },
1959 },
1960 {
1961 name: 'separate scope',
1962 exec: function(){/*
1963 return (function(a=function(){
1964 return typeof b === 'undefined';
1965 }){
1966 var b = 1;
1967 return a();
1968 }());
1969 */},
1970 res: {
1971 babel: false,
1972 closure: true,
1973 safaritp: true,
1974 safari10: true,
1975 webkit: true,
1976 edge12: flag,
1977 edge14: true,
1978 firefox51: true,
1979 chrome48: flag,
1980 chrome49: true,
1981 xs6: true,
1982 },
1983 },
1984 {
1985 name: 'new Function() support',
1986 exec: function() {/*
1987 return new Function("a = 1", "b = 2",
1988 "return a === 3 && b === 2;"
1989 )(3);
1990 */},
1991 res: {
1992 typescript: typescript.fallthrough,
1993 safaritp: true,
1994 safari10: true,
1995 webkit: true,
1996 chrome48: flag,
1997 chrome49: true,
1998 edge12: flag,
1999 edge14: true,
2000 xs6: true,
2001 ejs: { val: false, note_id: 'ejs-no-function-ctor' },
2002 },
2003 },
2004 ]
2005},
2006{
2007 name: 'rest parameters',
2008 category: 'syntax',
2009 significance: 'medium',
2010 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-function-definitions',
2011 subtests: [
2012 {
2013 name: 'basic functionality',
2014 exec: function() {/*
2015 return (function (foo, ...args) {
2016 return args instanceof Array && args + "" === "bar,baz";
2017 }("foo", "bar", "baz"));
2018 */},
2019 res: {
2020 tr: true,
2021 babel: true,
2022 es6tr: true,
2023 ejs: true,
2024 closure: true,
2025 jsx: true,
2026 typescript: true,
2027 edge12: true,
2028 firefox16: true,
2029 chrome44: flag,
2030 chrome47: true,
2031 node4: flag,
2032 xs6: true,
2033 safaritp: true,
2034 safari10: true,
2035 webkit: true,
2036 },
2037 },
2038 {
2039 name: 'function \'length\' property',
2040 exec: function() {/*
2041 return function(a, ...b){}.length === 1 && function(...c){}.length === 0;
2042 */},
2043 res: {
2044 tr: true,
2045 babel: true,
2046 es6tr: true,
2047 jsx: true,
2048 typescript: true,
2049 edge12: true,
2050 firefox16: true,
2051 chrome44: flag,
2052 chrome47: true,
2053 node4: flag,
2054 xs6: true,
2055 safaritp: true,
2056 safari10: true,
2057 webkit: true,
2058 },
2059 },
2060 {
2061 name: 'arguments object interaction',
2062 exec: function() {/*
2063 return (function (foo, ...args) {
2064 foo = "qux";
2065 // The arguments object is not mapped to the
2066 // parameters, even outside of strict mode.
2067 return arguments.length === 3
2068 && arguments[0] === "foo"
2069 && arguments[1] === "bar"
2070 && arguments[2] === "baz";
2071 }("foo", "bar", "baz"));
2072 */},
2073 res: {
2074 babel: true,
2075 typescript: true,
2076 tr: true,
2077 ejs: true,
2078 chrome44: flag,
2079 chrome47: true,
2080 edge12: true,
2081 node4: flag,
2082 firefox43: true,
2083 xs6: true,
2084 safaritp: true,
2085 safari10: true,
2086 webkit: true,
2087 },
2088 },
2089 {
2090 name: 'can\'t be used in setters',
2091 exec: function() {/*
2092 return (function (...args) {
2093 try {
2094 eval("({set e(...args){}})");
2095 } catch(e) {
2096 return true;
2097 }
2098 }());
2099 */},
2100 res: {
2101 babel: false,
2102 tr: true,
2103 ejs: true,
2104 closure: true,
2105 jsx: true,
2106 typescript: true,
2107 edge12: true,
2108 firefox38: true,
2109 chrome47: true,
2110 node4: flag,
2111 xs6: true,
2112 safaritp: true,
2113 safari10: true,
2114 webkit: true,
2115 },
2116 },
2117 {
2118 name: 'new Function() support',
2119 exec: function() {/*
2120 return new Function("a", "...b",
2121 "return b instanceof Array && a+b === 'foobar,baz';"
2122 )('foo','bar','baz');
2123 */},
2124 res: {
2125 edge12: true,
2126 firefox16: true,
2127 chrome44: flag,
2128 chrome47: true,
2129 node4: flag,
2130 xs6: true,
2131 ejs: { val: false, note_id: 'ejs-no-function-ctor' },
2132 safaritp: true,
2133 safari10: true,
2134 webkit: true,
2135 },
2136 },
2137 ],
2138},
2139{
2140 name: 'spread (...) operator',
2141 category: 'syntax',
2142 significance: 'large',
2143 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-argument-lists-runtime-semantics-argumentlistevaluation',
2144 subtests: [
2145 {
2146 name: 'with arrays, in function calls',
2147 exec: function () {/*
2148 return Math.max(...[1, 2, 3]) === 3
2149 */},
2150 res: {
2151 tr: true,
2152 babel: true,
2153 typescript: true,
2154 es6tr: true,
2155 jsx: true,
2156 ejs: true,
2157 closure: true,
2158 edge12: true,
2159 firefox27: true,
2160 safari71_8: true,
2161 safaritp: true,
2162 safari10: true,
2163 webkit: true,
2164 chrome44: flag,
2165 chrome46: true,
2166 node4: flag,
2167 node5: true,
2168 xs6: true,
2169 jxa: true,
2170 },
2171 },
2172 {
2173 name: 'with arrays, in array literals',
2174 exec: function() {/*
2175 return [...[1, 2, 3]][2] === 3;
2176 */},
2177 res: {
2178 tr: true,
2179 babel: true,
2180 typescript: true,
2181 es6tr: true,
2182 ejs: true,
2183 closure: true,
2184 edge12: true,
2185 firefox16: true,
2186 safari71_8: true,
2187 safaritp: true,
2188 safari10: true,
2189 webkit: true,
2190 chrome46: true,
2191 node4: flag,
2192 node5: true,
2193 xs6: true,
2194 jxa: true,
2195 },
2196 },
2197 {
2198 name: 'with sparse arrays, in function calls',
2199 exec: function () {/*
2200 var a = Array(...[,,]);
2201 return "0" in a && "1" in a && '' + a[0] + a[1] === "undefinedundefined";
2202 */},
2203 res: {
2204 tr: true,
2205 ejs: true,
2206 babel: true,
2207 typescript: true,
2208 es6tr: true,
2209 jsx: true,
2210 closure: true,
2211 edge12: true,
2212 firefox27: true,
2213 safari71_8: true,
2214 safaritp: true,
2215 safari10: true,
2216 webkit: true,
2217 chrome44: flag,
2218 chrome46: true,
2219 node4: flag,
2220 node5: true,
2221 xs6: true,
2222 jxa: true,
2223 },
2224 },
2225 {
2226 name: 'with sparse arrays, in array literals',
2227 exec: function() {/*
2228 var a = [...[,,]];
2229 return "0" in a && "1" in a && '' + a[0] + a[1] === "undefinedundefined";
2230 */},
2231 res: {
2232 tr: true,
2233 firefox16: true,
2234 safari71_8: true,
2235 safaritp: true,
2236 safari10: true,
2237 webkit: true,
2238 chrome46: true,
2239 node4: flag,
2240 node5: true,
2241 edge13: true,
2242 xs6: true,
2243 jxa: true,
2244 },
2245 },
2246 {
2247 name: 'with strings, in function calls',
2248 exec: function() {/*
2249 return Math.max(..."1234") === 4;
2250 */},
2251 res: {
2252 tr: true,
2253 ejs: true,
2254 babel: true,
2255 closure: true,
2256 edge12: true,
2257 firefox27: true,
2258 chrome44: flag,
2259 chrome46: true,
2260 node4: flag,
2261 node5: true,
2262 xs6: true,
2263 safaritp: true,
2264 safari10: true,
2265 webkit: true,
2266 },
2267 },
2268 {
2269 name: 'with strings, in array literals',
2270 exec: function() {/*
2271 return ["a", ..."bcd", "e"][3] === "d";
2272 */},
2273 res: {
2274 tr: true,
2275 babel: true,
2276 closure: true,
2277 edge12: true,
2278 firefox17: true,
2279 safari9: true,
2280 safaritp: true,
2281 webkit: true,
2282 chrome46: true,
2283 node4: flag,
2284 node5: true,
2285 xs6: true,
2286 jxa: true,
2287 },
2288 },
2289 {
2290 name: 'with astral plane strings, in function calls',
2291 exec: function() {/*
2292 return Array(..."𠮷𠮶")[0] === "𠮷";
2293 */},
2294 res: {
2295 tr: true,
2296 ejs: true,
2297 babel: true,
2298 firefox27: true,
2299 chrome44: flag,
2300 chrome46: true,
2301 edge12: true,
2302 node4: flag,
2303 node5: true,
2304 xs6: true,
2305 safaritp: true,
2306 safari10: true,
2307 webkit: true,
2308 },
2309 },
2310 {
2311 name: 'with astral plane strings, in array literals',
2312 exec: function() {/*
2313 return [..."𠮷𠮶"][0] === "𠮷";
2314 */},
2315 res: {
2316 tr: true,
2317 babel: true,
2318 firefox27: true,
2319 safari9: true,
2320 safaritp: true,
2321 webkit: true,
2322 edge12: true,
2323 chrome46: true,
2324 node4: flag,
2325 node5: true,
2326 xs6: true,
2327 jxa: true,
2328 },
2329 },
2330 {
2331 name: 'with generator instances, in calls',
2332 exec: function () {/*
2333 var iterable = (function*(){ yield 1; yield 2; yield 3; }());
2334 return Math.max(...iterable) === 3;
2335 */},
2336 res: {
2337 tr: true,
2338 babel: true,
2339 closure: true,
2340 ejs: true,
2341 firefox27: true,
2342 chrome44: flag,
2343 chrome46: true,
2344 edge12: flag,
2345 node4: flag,
2346 edge13: true,
2347 node5: true,
2348 xs6: true,
2349 safaritp: true,
2350 safari10: true,
2351 webkit: true,
2352 },
2353 },
2354 {
2355 name: 'with generator instances, in arrays',
2356 exec: function () {/*
2357 var iterable = (function*(){ yield "b"; yield "c"; yield "d"; }());
2358 return ["a", ...iterable, "e"][3] === "d";
2359 */},
2360 res: {
2361 tr: true,
2362 babel: true,
2363 closure: true,
2364 firefox27: true,
2365 chrome46: true,
2366 edge12: flag,
2367 node4: flag,
2368 edge13: true,
2369 node5: true,
2370 xs6: true,
2371 safaritp: true,
2372 safari10: true,
2373 webkit: true,
2374 },
2375 },
2376 {
2377 name: 'with generic iterables, in calls',
2378 exec: function () {/*
2379 var iterable = global.__createIterableObject([1, 2, 3]);
2380 return Math.max(...iterable) === 3;
2381 */},
2382 res: {
2383 tr: true,
2384 babel: true,
2385 closure: true,
2386 es6tr: {
2387 val: true,
2388 note_id: 'compiler-iterable',
2389 note_html: 'This compiler requires generic iterables have either a <code>Symbol.iterator</code> or non-standard <code>"@@iterator"</code> method.'
2390 },
2391 ejs: true,
2392 firefox36: true,
2393 chrome44: flag,
2394 chrome46: true,
2395 edge12: true,
2396 node4: flag,
2397 node5: true,
2398 xs6: true,
2399 safaritp: true,
2400 safari10: true,
2401 webkit: true,
2402 jxa: true,
2403 },
2404 },
2405 {
2406 name: 'with generic iterables, in arrays',
2407 exec: function () {/*
2408 var iterable = global.__createIterableObject(["b", "c", "d"]);
2409 return ["a", ...iterable, "e"][3] === "d";
2410 */},
2411 res: {
2412 tr: true,
2413 babel: true,
2414 closure: true,
2415 es6tr: { val: true, note_id: 'compiler-iterable' },
2416 ejs: true,
2417 edge12: true,
2418 firefox36: true,
2419 safari9: true,
2420 safaritp: true,
2421 webkit: true,
2422 chrome46: true,
2423 node4: flag,
2424 node5: true,
2425 xs6: true,
2426 jxa: true,
2427 },
2428 },
2429 {
2430 name: 'with instances of iterables, in calls',
2431 exec: function () {/*
2432 var iterable = global.__createIterableObject([1, 2, 3]);
2433 return Math.max(...Object.create(iterable)) === 3;
2434 */},
2435 res: {
2436 tr: true,
2437 babel: true,
2438 closure: true,
2439 ejs: true,
2440 es6tr: { val: true, note_id: 'compiler-iterable' },
2441 firefox36: true,
2442 chrome44: flag,
2443 chrome46: true,
2444 edge12: true,
2445 node4: flag,
2446 node5: true,
2447 xs6: true,
2448 safaritp: true,
2449 safari10: true,
2450 webkit: true,
2451 jxa: true,
2452 },
2453 },
2454 {
2455 name: 'with instances of iterables, in arrays',
2456 exec: function () {/*
2457 var iterable = global.__createIterableObject(["b", "c", "d"]);
2458 return ["a", ...Object.create(iterable), "e"][3] === "d";
2459 */},
2460 res: {
2461 tr: true,
2462 babel: true,
2463 closure: true,
2464 ejs: true,
2465 es6tr: { val: true, note_id: 'compiler-iterable' },
2466 edge12: true,
2467 firefox36: true,
2468 chrome46: true,
2469 safari9: true,
2470 safaritp: true,
2471 webkit: true,
2472 node4: flag,
2473 node5: true,
2474 xs6: true,
2475 jxa: true,
2476 },
2477 },
2478 {
2479 name: 'spreading non-iterables is a runtime error',
2480 exec: function () {/*
2481 try {
2482 Math.max(...2);
2483 } catch(e) {
2484 return Math.max(...[1, 2, 3]) === 3;
2485 }
2486 */},
2487 res: {
2488 tr: true,
2489 closure: true,
2490 typescript: true,
2491 es6tr: true,
2492 edge12: true,
2493 firefox27: true,
2494 safari71_8: true,
2495 safaritp: true,
2496 safari10: true,
2497 webkit: true,
2498 chrome44: flag,
2499 chrome46: true,
2500 node4: flag,
2501 node5: true,
2502 xs6: true,
2503 jxa: true,
2504 },
2505 },
2506 ]
2507},
2508{
2509 name: 'class',
2510 category: 'functions',
2511 significance: 'large',
2512 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-class-definitions',
2513 subtests: [
2514 {
2515 name: 'class statement',
2516 exec: function () {/*
2517 class C {}
2518 return typeof C === "function";
2519 */},
2520 res: {
2521 tr: true,
2522 babel: true,
2523 es6tr: true,
2524 ejs: true,
2525 jsx: true,
2526 closure: true,
2527 edge12: flag,
2528 edge13: true,
2529 firefox45: true,
2530 safari9: true,
2531 safaritp: true,
2532 webkit: true,
2533 node4: strict,
2534 chrome41: strict,
2535 chrome49: true,
2536 typescript: true,
2537 xs6: true,
2538 jxa: true,
2539 },
2540 },
2541 {
2542 name: 'is block-scoped',
2543 exec: function () {/*
2544 class C {}
2545 var c1 = C;
2546 {
2547 class C {}
2548 var c2 = C;
2549 }
2550 return C === c1;
2551 */},
2552 res: {
2553 babel: true,
2554 typescript: true,
2555 jsx: true,
2556 closure: true,
2557 ejs: true,
2558 edge12: flag,
2559 edge13: true,
2560 firefox45: true,
2561 chrome41: strict,
2562 chrome49: true,
2563 node4: strict,
2564 safaritp: true,
2565 safari10: true,
2566 webkit: true,
2567 xs6: true,
2568 jxa: true,
2569 },
2570 },
2571 {
2572 name: 'class expression',
2573 exec: function () {/*
2574 return typeof class C {} === "function";
2575 */},
2576 res: {
2577 tr: true,
2578 babel: true,
2579 typescript: true,
2580 es6tr: true,
2581 jsx: true,
2582 closure: true,
2583 ejs: true,
2584 edge12: flag,
2585 edge13: true,
2586 firefox45: true,
2587 safari9: true,
2588 safaritp: true,
2589 webkit: true,
2590 chrome41: strict,
2591 chrome49: true,
2592 node4: strict,
2593 xs6: true,
2594 jxa: true,
2595 },
2596 },
2597 {
2598 name: 'anonymous class',
2599 exec: function () {/*
2600 return typeof class {} === "function";
2601 */},
2602 res: {
2603 tr: true,
2604 babel: true,
2605 typescript: true,
2606 es6tr: true,
2607 jsx: true,
2608 closure: true,
2609 ejs: true,
2610 edge12: flag,
2611 edge13: true,
2612 firefox45: true,
2613 safari9: true,
2614 safaritp: true,
2615 webkit: true,
2616 chrome41: strict,
2617 chrome49: true,
2618 node4: strict,
2619 xs6: true,
2620 jxa: true,
2621 },
2622 },
2623 {
2624 name: 'constructor',
2625 exec: function () {/*
2626 class C {
2627 constructor() { this.x = 1; }
2628 }
2629 return C.prototype.constructor === C
2630 && new C().x === 1;
2631 */},
2632 res: {
2633 tr: true,
2634 babel: true,
2635 typescript: true,
2636 es6tr: true,
2637 jsx: true,
2638 ejs: true,
2639 closure: true,
2640 edge12: flag,
2641 edge13: true,
2642 firefox45: true,
2643 safari9: true,
2644 safaritp: true,
2645 webkit: true,
2646 chrome41: strict,
2647 chrome49: true,
2648 node4: strict,
2649 xs6: true,
2650 jxa: true,
2651 },
2652 },
2653 {
2654 name: 'prototype methods',
2655 exec: function () {/*
2656 class C {
2657 method() { return 2; }
2658 }
2659 return typeof C.prototype.method === "function"
2660 && new C().method() === 2;
2661 */},
2662 res: {
2663 tr: true,
2664 babel: true,
2665 typescript: true,
2666 es6tr: true,
2667 jsx: true,
2668 ejs: true,
2669 closure: true,
2670 edge12: flag,
2671 edge13: true,
2672 firefox45: true,
2673 safari9: true,
2674 safaritp: true,
2675 webkit: true,
2676 chrome41: strict,
2677 chrome49: true,
2678 node4: strict,
2679 xs6: true,
2680 jxa: true,
2681 },
2682 },
2683 {
2684 name: 'string-keyed methods',
2685 exec: function () {/*
2686 class C {
2687 "foo bar"() { return 2; }
2688 }
2689 return typeof C.prototype["foo bar"] === "function"
2690 && new C()["foo bar"]() === 2;
2691 */},
2692 res: {
2693 tr: true,
2694 babel: true,
2695 ejs: true,
2696 typescript: true,
2697 es6tr: true,
2698 jsx: true,
2699 edge12: flag,
2700 edge13: true,
2701 firefox45: true,
2702 safari9: true,
2703 safaritp: true,
2704 webkit: true,
2705 chrome41: strict,
2706 chrome49: true,
2707 node4: strict,
2708 xs6: true,
2709 jxa: true,
2710 },
2711 },
2712 {
2713 name: 'computed prototype methods',
2714 exec: function () {/*
2715 var foo = "method";
2716 class C {
2717 [foo]() { return 2; }
2718 }
2719 return typeof C.prototype.method === "function"
2720 && new C().method() === 2;
2721 */},
2722 res: {
2723 tr: true,
2724 babel: true,
2725 typescript: true,
2726 es6tr: true,
2727 jsx: true,
2728 ejs: true,
2729 closure: true,
2730 edge12: flag,
2731 edge13: true,
2732 firefox45: true,
2733 chrome45: strict,
2734 chrome49: true,
2735 node4: strict,
2736 safaritp: true,
2737 safari10: true,
2738 webkit: true,
2739 xs6: true,
2740 },
2741 },
2742 {
2743 name: 'optional semicolons',
2744 exec: function () {/*
2745 class C {
2746 ;
2747 method() { return 2; };
2748 method2() { return 2; }
2749 method3() { return 2; };
2750 }
2751 return typeof C.prototype.method === "function"
2752 && typeof C.prototype.method2 === "function"
2753 && typeof C.prototype.method3 === "function";
2754 */},
2755 res: {
2756 tr: true,
2757 babel: true,
2758 typescript: true,
2759 es6tr: true,
2760 jsx: true,
2761 ejs: true,
2762 closure: true,
2763 edge12: flag,
2764 edge13: true,
2765 firefox45: true,
2766 safari9: true,
2767 safaritp: true,
2768 webkit: true,
2769 chrome41: strict,
2770 chrome49: true,
2771 node4: strict,
2772 xs6: true,
2773 jxa: true,
2774 },
2775 },
2776 {
2777 name: 'static methods',
2778 exec: function () {/*
2779 class C {
2780 static method() { return 3; }
2781 }
2782 return typeof C.method === "function"
2783 && C.method() === 3;
2784 */},
2785 res: {
2786 tr: true,
2787 babel: true,
2788 typescript: true,
2789 es6tr: true,
2790 jsx: true,
2791 ejs: true,
2792 closure: true,
2793 edge12: flag,
2794 edge13: true,
2795 firefox45: true,
2796 safari9: true,
2797 safaritp: true,
2798 webkit: true,
2799 chrome41: strict,
2800 chrome49: true,
2801 node4: strict,
2802 xs6: true,
2803 jxa: true,
2804 },
2805 },
2806 {
2807 name: 'computed static methods',
2808 exec: function () {/*
2809 var foo = "method";
2810 class C {
2811 static [foo]() { return 3; }
2812 }
2813 return typeof C.method === "function"
2814 && C.method() === 3;
2815 */},
2816 res: {
2817 tr: true,
2818 babel: true,
2819 typescript: true,
2820 es6tr: true,
2821 jsx: true,
2822 ejs: true,
2823 closure: true,
2824 edge12: flag,
2825 edge13: true,
2826 firefox45: true,
2827 chrome45: strict,
2828 chrome49: true,
2829 node4: strict,
2830 safaritp: true,
2831 safari10: true,
2832 webkit: true,
2833 xs6: true,
2834 },
2835 },
2836 {
2837 name: 'accessor properties',
2838 exec: function () {/*
2839 var baz = false;
2840 class C {
2841 get foo() { return "foo"; }
2842 set bar(x) { baz = x; }
2843 }
2844 new C().bar = true;
2845 return new C().foo === "foo" && baz;
2846 */},
2847 res: {
2848 tr: true,
2849 babel: true,
2850 closure: true,
2851 typescript: true,
2852 jsx: true,
2853 es6tr: true,
2854 ejs: true,
2855 edge12: flag,
2856 edge13: true,
2857 firefox45: true,
2858 safari9: true,
2859 safaritp: true,
2860 webkit: true,
2861 node4: strict,
2862 chrome41: strict,
2863 chrome49: true,
2864 xs6: true,
2865 jxa: true,
2866 },
2867 },
2868 {
2869 name: 'computed accessor properties',
2870 exec: function () {/*
2871 var garply = "foo", grault = "bar", baz = false;
2872 class C {
2873 get [garply]() { return "foo"; }
2874 set [grault](x) { baz = x; }
2875 }
2876 new C().bar = true;
2877 return new C().foo === "foo" && baz;
2878 */},
2879 res: {
2880 tr: true,
2881 babel: true,
2882 closure: true,
2883 typescript: true,
2884 es6tr: true,
2885 ejs: true,
2886 edge12: flag,
2887 edge13: true,
2888 firefox45: true,
2889 chrome45: strict,
2890 chrome49: true,
2891 node4: strict,
2892 safaritp: true,
2893 safari10: true,
2894 webkit: true,
2895 xs6: true,
2896 },
2897 },
2898 {
2899 name: 'static accessor properties',
2900 exec: function () {/*
2901 var baz = false;
2902 class C {
2903 static get foo() { return "foo"; }
2904 static set bar(x) { baz = x; }
2905 }
2906 C.bar = true;
2907 return C.foo === "foo" && baz;
2908 */},
2909 res: {
2910 tr: true,
2911 babel: true,
2912 closure: true,
2913 typescript: true,
2914 jsx: true,
2915 es6tr: true,
2916 ejs: true,
2917 edge12: flag,
2918 edge13: true,
2919 firefox45: true,
2920 node4: strict,
2921 chrome41: strict,
2922 chrome49: true,
2923 safari9: true,
2924 safaritp: true,
2925 webkit: true,
2926 xs6: true,
2927 jxa: true,
2928 },
2929 },
2930 {
2931 name: 'computed static accessor properties',
2932 exec: function () {/*
2933 var garply = "foo", grault = "bar", baz = false;
2934 class C {
2935 static get [garply]() { return "foo"; }
2936 static set [grault](x) { baz = x; }
2937 }
2938 C.bar = true;
2939 return C.foo === "foo" && baz;
2940 */},
2941 res: {
2942 tr: true,
2943 babel: true,
2944 typescript: true,
2945 es6tr: true,
2946 ejs: true,
2947 edge12: flag,
2948 edge13: true,
2949 firefox45: true,
2950 chrome45: strict,
2951 chrome49: true,
2952 node4: strict,
2953 safaritp: true,
2954 safari10: true,
2955 webkit: true,
2956 xs6: true,
2957 },
2958 },
2959 {
2960 name: 'class name is lexically scoped',
2961 exec: function () {/*
2962 class C {
2963 method() { return typeof C === "function"; }
2964 }
2965 var M = C.prototype.method;
2966 C = undefined;
2967 return C === undefined && M();
2968 */},
2969 res: {
2970 tr: true,
2971 babel: true,
2972 ejs: true,
2973 typescript: true,
2974 es6tr: true,
2975 edge12: flag,
2976 edge13: true,
2977 firefox45: true,
2978 safaritp: true,
2979 safari10: true,
2980 webkit: true,
2981 chrome41: strict,
2982 chrome49: true,
2983 node4: strict,
2984 xs6: true,
2985 jxa: true,
2986 },
2987 },
2988 {
2989 name: 'computed names, temporal dead zone',
2990 exec: function () {/*
2991 try {
2992 var B = class C {
2993 [C](){}
2994 }
2995 } catch(e) {
2996 return true;
2997 }
2998 */},
2999 res: {
3000 typescript: true,
3001 edge12: flag,
3002 edge13: true,
3003 firefox45: true,
3004 chrome45: strict,
3005 chrome49: true,
3006 node4: strict,
3007 safaritp: true,
3008 safari10: true,
3009 webkit: true,
3010 xs6: true,
3011 },
3012 },
3013 {
3014 name: 'methods aren\'t enumerable',
3015 exec: function () {/*
3016 class C {
3017 foo() {}
3018 static bar() {}
3019 }
3020 return !C.prototype.propertyIsEnumerable("foo") && !C.propertyIsEnumerable("bar");
3021 */},
3022 res: {
3023 babel: true,
3024 ejs: true,
3025 jsx: true,
3026 chrome42: strict,
3027 chrome49: true,
3028 safari9: true,
3029 safaritp: true,
3030 webkit: true,
3031 node4: strict,
3032 edge13: true,
3033 firefox45: true,
3034 xs6: true,
3035 jxa: true,
3036 },
3037 },
3038 {
3039 name: 'implicit strict mode',
3040 exec: function () {/*
3041 class C {
3042 static method() { return this === undefined; }
3043 }
3044 return (0,C.method)();
3045 */},
3046 res: {
3047 tr: true,
3048 babel: true,
3049 typescript: true,
3050 es6tr: true,
3051 jsx: true,
3052 ejs: true,
3053 edge12: flag,
3054 edge13: true,
3055 firefox45: true,
3056 safari9: true,
3057 safaritp: true,
3058 webkit: true,
3059 chrome41: strict,
3060 chrome49: true,
3061 node4: strict,
3062 xs6: true,
3063 jxa: true,
3064 },
3065 },
3066 {
3067 name: 'constructor requires new',
3068 exec: function () {/*
3069 class C {}
3070 try {
3071 C();
3072 }
3073 catch(e) {
3074 return true;
3075 }
3076 */},
3077 res: {
3078 babel: true,
3079 safari9: true,
3080 safaritp: true,
3081 webkit: true,
3082 chrome43: strict,
3083 chrome49: true,
3084 node4: strict,
3085 edge13: true,
3086 firefox45: true,
3087 xs6: true,
3088 ejs: true,
3089 jxa: true,
3090 },
3091 },
3092 {
3093 name: 'extends',
3094 exec: function () {/*
3095 class B {}
3096 class C extends B {}
3097 return new C() instanceof B
3098 && B.isPrototypeOf(C);
3099 */},
3100 res: (temp.extendsRes = {
3101 es6tr: {
3102 val: false,
3103 note_id: 'compiler-proto',
3104 note_html: 'Requires native support for <code>Object.prototype.__proto__</code>',
3105 },
3106 babel: { val: false, note_id: 'compiler-proto' },
3107 tr: { val: false, note_id: 'compiler-proto' },
3108 typescript: {
3109 val: false,
3110 note_id: 'typescript-extends',
3111 note_html: 'TypeScript transforms <code>extends</code> into code that copies static properties from the superclass (but uses the prototype chain for instance properties).'},
3112 ejs: true,
3113 closure: {
3114 val: false,
3115 note_id: 'compiled-extends',
3116 note_html: 'This compiler transforms <code>extends</code> into code that copies properties from the superclass, instead of using the prototype chain.'
3117 },
3118 jsx: { val: false, note_id: 'compiled-extends' },
3119 edge12: flag,
3120 edge13: true,
3121 firefox45: true,
3122 safari9: true,
3123 safaritp: true,
3124 webkit: true,
3125 node4: strict,
3126 chrome41: strict,
3127 chrome49: true,
3128 xs6: true,
3129 jxa: true,
3130 }),
3131 },
3132 {
3133 name: 'extends expressions',
3134 exec: function () {/*
3135 var B;
3136 class C extends (B = class {}) {}
3137 return new C() instanceof B
3138 && B.isPrototypeOf(C);
3139 */},
3140 res: {
3141 es6tr: { val: false, note_id: 'compiler-proto' },
3142 babel: { val: false, note_id: 'compiler-proto' },
3143 tr: { val: false, note_id: 'compiler-proto' },
3144 typescript: {
3145 val: false,
3146 note_id: 'typescript-extends',
3147 },
3148 ejs: true,
3149 jsx: { val: false, note_id: 'compiled-extends' },
3150 edge12: flag,
3151 edge13: true,
3152 firefox45: true,
3153 safari9: true,
3154 safaritp: true,
3155 webkit: true,
3156 node4: strict,
3157 chrome41: strict,
3158 chrome49: true,
3159 xs6: true,
3160 jxa: true,
3161 },
3162 },
3163 {
3164 name: 'extends null',
3165 exec: function () {/*
3166 class C extends null {
3167 constructor() { return Object.create(null); }
3168 }
3169 return Function.prototype.isPrototypeOf(C)
3170 && Object.getPrototypeOf(C.prototype) === null;
3171 */},
3172 res: {
3173 babel: false,
3174 typescript: true,
3175 tr: true,
3176 es6tr: true,
3177 jsx: true,
3178 edge12: flag,
3179 edge13: true,
3180 firefox45: true,
3181 node4: strict,
3182 chrome41: strict,
3183 chrome49: true,
3184 safari9: true,
3185 safaritp: true,
3186 webkit: true,
3187 xs6: true,
3188 jxa: true,
3189 },
3190 },
3191 {
3192 name: 'new.target',
3193 exec: function () {/*
3194 var passed = false;
3195 new function f() {
3196 passed = new.target === f;
3197 }();
3198
3199 class A {
3200 constructor() {
3201 passed &= new.target === B;
3202 }
3203 }
3204 class B extends A {}
3205 new B();
3206 return passed;
3207 */},
3208 res: {
3209 safaritp: true,
3210 safari10: true,
3211 webkit: true,
3212 chrome46: strict,
3213 chrome49: true,
3214 edge13: true,
3215 firefox45: true,
3216 node5: strict,
3217 xs6: true,
3218 ejs: true,
3219 },
3220 },
3221 ],
3222},
3223{
3224 name: 'super',
3225 category: 'functions',
3226 significance: 'medium',
3227 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-super-keyword',
3228 subtests: [
3229 {
3230 name: 'statement in constructors',
3231 exec: function() {/*
3232 var passed = false;
3233 class B {
3234 constructor(a) { passed = (a === "barbaz"); }
3235 }
3236 class C extends B {
3237 constructor(a) { super("bar" + a); }
3238 }
3239 new C("baz");
3240 return passed;
3241 */},
3242 res: {
3243 tr: true,
3244 babel: false,
3245 jsx: true,
3246 typescript: true,
3247 closure: true,
3248 es6tr: true,
3249 edge12: flag,
3250 edge13: true,
3251 firefox45: true,
3252 safari9: true,
3253 safaritp: true,
3254 webkit: true,
3255 node4: strict,
3256 chrome41: strict,
3257 chrome49: true,
3258 xs6: true,
3259 jxa: true,
3260 },
3261 },
3262 {
3263 name: 'expression in constructors',
3264 exec: function() {/*
3265 class B {
3266 constructor(a) { return ["foo" + a]; }
3267 }
3268 class C extends B {
3269 constructor(a) { return super("bar" + a); }
3270 }
3271 return new C("baz")[0] === "foobarbaz";
3272 */},
3273 res: {
3274 tr: true,
3275 babel: false,
3276 jsx: true,
3277 typescript: true,
3278 closure: true,
3279 es6tr: true,
3280 edge12: flag,
3281 edge13: true,
3282 firefox45: true,
3283 safaritp: true,
3284 safari10: true,
3285 webkit: true,
3286 safari9: true,
3287 chrome43: strict,
3288 chrome49: true,
3289 node4: strict,
3290 xs6: true,
3291 jxa: true,
3292 },
3293 },
3294 {
3295 name: 'in methods, property access',
3296 exec: function() {/*
3297 class B {}
3298 B.prototype.qux = "foo";
3299 B.prototype.corge = "baz";
3300 class C extends B {
3301 quux(a) { return super.qux + a + super["corge"]; }
3302 }
3303 C.prototype.qux = "garply";
3304 return new C().quux("bar") === "foobarbaz";
3305 */},
3306 res: {
3307 tr: true,
3308 babel: true,
3309 jsx: true,
3310 typescript: true,
3311 es6tr: true,
3312 ejs: true,
3313 edge12: flag,
3314 edge13: true,
3315 firefox45: true,
3316 safari9: true,
3317 safaritp: true,
3318 webkit: true,
3319 node4: strict,
3320 chrome41: strict,
3321 chrome49: true,
3322 xs6: true,
3323 jxa: true,
3324 },
3325 },
3326 {
3327 name: 'in methods, method calls',
3328 exec: function() {/*
3329 class B {
3330 qux(a) { return "foo" + a; }
3331 }
3332 class C extends B {
3333 qux(a) { return super.qux("bar" + a); }
3334 }
3335 return new C().qux("baz") === "foobarbaz";
3336 */},
3337 res: {
3338 tr: true,
3339 babel: true,
3340 jsx: true,
3341 typescript: true,
3342 closure: true,
3343 es6tr: true,
3344 ejs: true,
3345 edge12: flag,
3346 edge13: true,
3347 firefox45: true,
3348 safari9: true,
3349 safaritp: true,
3350 webkit: true,
3351 node4: strict,
3352 chrome41: strict,
3353 chrome49: true,
3354 xs6: true,
3355 jxa: true,
3356 },
3357 },
3358 {
3359 name: 'method calls use correct "this" binding',
3360 exec: function() {/*
3361 class B {
3362 qux(a) { return this.foo + a; }
3363 }
3364 class C extends B {
3365 qux(a) { return super.qux("bar" + a); }
3366 }
3367 var obj = new C();
3368 obj.foo = "foo";
3369 return obj.qux("baz") === "foobarbaz";
3370 */},
3371 res: {
3372 tr: true,
3373 babel: true,
3374 jsx: true,
3375 typescript: true,
3376 closure: true,
3377 es6tr: true,
3378 ejs: true,
3379 edge12: flag,
3380 edge13: true,
3381 firefox45: true,
3382 safari9: true,
3383 safaritp: true,
3384 webkit: true,
3385 node4: strict,
3386 chrome41: strict,
3387 chrome49: true,
3388 xs6: true,
3389 jxa: true,
3390 },
3391 },
3392 {
3393 name: 'constructor calls use correct "new.target" binding',
3394 exec: function() {/*
3395 var passed;
3396 class B {
3397 constructor() { passed = (new.target === C); }
3398 }
3399 class C extends B {
3400 constructor() { super(); }
3401 }
3402 new C();
3403 return passed;
3404 */},
3405 res: {
3406 safaritp: true,
3407 safari10: true,
3408 webkit: true,
3409 chrome46: strict,
3410 chrome49: true,
3411 edge13: true,
3412 firefox45: true,
3413 node5: strict,
3414 xs6: true,
3415 ejs: true,
3416 },
3417 },
3418 {
3419 name: 'is statically bound',
3420 exec: function() {/*
3421 class B {
3422 qux() { return "bar"; }
3423 }
3424 class C extends B {
3425 qux() { return super.qux() + this.corge; }
3426 }
3427 var obj = {
3428 qux: C.prototype.qux,
3429 corge: "ley"
3430 };
3431 return obj.qux() === "barley";
3432 */},
3433 res: {
3434 tr: true,
3435 babel: true,
3436 jsx: true,
3437 typescript: true,
3438 es6tr: true,
3439 ejs: true,
3440 edge12: flag,
3441 edge13: true,
3442 firefox45: true,
3443 safari9: true,
3444 safaritp: true,
3445 webkit: true,
3446 node4: strict,
3447 chrome41: strict,
3448 chrome49: true,
3449 xs6: true,
3450 jxa: true,
3451 },
3452 },
3453 {
3454 name: 'super() invokes the correct constructor',
3455 exec: function() {/*
3456 // checks that super() is *not* a synonym of super.constructor()
3457 var passed;
3458 class B {
3459 constructor() {
3460 passed = true;
3461 }
3462 };
3463 B.prototype.constructor = function () {
3464 passed = false;
3465 };
3466 class C extends B { };
3467 new C;
3468 return passed;
3469 */},
3470 res: {
3471 closure: true,
3472 node4: strict,
3473 chrome41: strict,
3474 chrome49: true,
3475 edge13: true,
3476 firefox45: true,
3477 tr: true,
3478 ejs: true,
3479 jsx: true,
3480 es6tr: true,
3481 typescript: true,
3482 safaritp: true,
3483 safari10: true,
3484 webkit: true,
3485 xs6: true,
3486 jxa: true,
3487 },
3488 },
3489 ],
3490},
3491{
3492 name: 'object literal extensions',
3493 category: 'syntax',
3494 significance: 'large',
3495 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-object-initialiser',
3496 subtests: [
3497 {
3498 name: 'computed properties',
3499 exec: function() {/*
3500 var x = 'y';
3501 return ({ [x]: 1 }).y === 1;
3502 */},
3503 res: {
3504 tr: true,
3505 babel: true,
3506 typescript: true,
3507 es6tr: true,
3508 ejs: true,
3509 jsx: true,
3510 closure: true,
3511 edge12: true,
3512 firefox34: true,
3513 safari71_8: true,
3514 safaritp: true,
3515 safari10: true,
3516 webkit: true,
3517 chrome44: true,
3518 node4: true,
3519 xs6: true,
3520 jxa: true,
3521 },
3522 },
3523 {
3524 name: 'shorthand properties',
3525 exec: function () {/*
3526 var a = 7, b = 8, c = {a,b};
3527 return c.a === 7 && c.b === 8;
3528 */},
3529 res: {
3530 tr: true,
3531 babel: true,
3532 es6tr: true,
3533 jsx: true,
3534 ejs: true,
3535 closure: true,
3536 typescript: true,
3537 edge12: true,
3538 firefox33: true,
3539 chrome41: flag,
3540 chrome43: true,
3541 node4: true,
3542 safari9: true,
3543 safaritp: true,
3544 webkit: true,
3545 xs6: true,
3546 jxa: true,
3547 },
3548 },
3549 {
3550 name: 'shorthand methods',
3551 exec: function() {/*
3552 return ({ y() { return 2; } }).y() === 2;
3553 */},
3554 res: (temp.shorthandMethodsResults = {
3555 tr: true,
3556 babel: true,
3557 es6tr: true,
3558 jsx: true,
3559 ejs: true,
3560 closure: true,
3561 typescript: true,
3562 edge12: true,
3563 firefox34: { val: true, note_id: "ff-shorthand-methods", note_html: 'Firefox incorrectly produces an error in strict mode if the method is named <code>"arguments"</code>, <code>"eval"</code>, or <code>"delete"</code>.' },
3564 chrome41: flag,
3565 chrome43: true,
3566 node4: true,
3567 safari9: true,
3568 safaritp: true,
3569 webkit: true,
3570 xs6: true,
3571 jxa: true,
3572 }),
3573 },
3574 {
3575 name: 'string-keyed shorthand methods',
3576 exec: function() {/*
3577 return ({ "foo bar"() { return 4; } })["foo bar"]() === 4;
3578 */},
3579 res: Object.assign({}, temp.shorthandMethodsResults, {
3580 closure: false,
3581 ejs: true,
3582 firefox34: true,
3583 xs6: true,
3584 jxa: true,
3585 }),
3586 },
3587 {
3588 name: 'computed shorthand methods',
3589 exec: function() {/*
3590 var x = 'y';
3591 return ({ [x](){ return 1 } }).y() === 1;
3592 */},
3593 res: {
3594 edge12: true,
3595 tr: true,
3596 closure: true,
3597 babel: true,
3598 ejs: true,
3599 typescript: true,
3600 jsx: true,
3601 es6tr: true,
3602 firefox34: true,
3603 safari9: true,
3604 safaritp: true,
3605 webkit: true,
3606 chrome44: true,
3607 node4: true,
3608 xs6: true,
3609 jxa: true,
3610 }
3611 },
3612 {
3613 name: 'computed accessors',
3614 exec: function() {/*
3615 var x = 'y',
3616 valueSet,
3617 obj = {
3618 get [x] () { return 1 },
3619 set [x] (value) { valueSet = value }
3620 };
3621 obj.y = 'foo';
3622 return obj.y === 1 && valueSet === 'foo';
3623 */},
3624 res: {
3625 babel: true,
3626 typescript: true,
3627 edge12: true,
3628 tr: true,
3629 es6tr: true,
3630 firefox34: true,
3631 chrome44: true,
3632 node4: true,
3633 safaritp: true,
3634 safari10: true,
3635 webkit: true,
3636 xs6: true,
3637 }
3638 }
3639 ]
3640},
3641{
3642 name: 'non-strict function semantics',
3643 note_id: 'hoisted-block-functions',
3644 note_html: 'The 2015 version of the specification contains <a href="https://esdiscuss.org/topic/block-level-function-declarations-web-legacy-compatibility-bug">multiple bugs</a> for hoisted block-level function declaration semantics, which these tests disregard.',
3645 category: 'annex b',
3646 significance: 'tiny',
3647 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-labelled-function-declarations',
3648 subtests: [
3649 {
3650 name: 'hoisted block-level function declaration',
3651 exec: function () {/*
3652 // Note: only available outside of strict mode.
3653 if (!this) return false;
3654 var passed = f() === 1;
3655 function f() { return 1; }
3656
3657 passed &= typeof g === 'undefined';
3658 { function g() { return 1; } }
3659 passed &= g() === 1;
3660
3661 passed &= h() === 2;
3662 { function h() { return 1; } }
3663 function h() { return 2; }
3664 passed &= h() === 1;
3665
3666 return passed;
3667 */},
3668 res: {
3669 ie11: true,
3670 firefox3_5: true,
3671 rhino17: true,
3672 chrome49: true,
3673 jxa: true,
3674 safaritp: true,
3675 safari10: true,
3676 webkit: true,
3677 },
3678 },
3679 {
3680 name: 'labeled function statements',
3681 exec: function() {/*
3682 // Note: only available outside of strict mode.
3683 if (!this) return false;
3684
3685 label: function foo() { return 2; }
3686 return foo() === 2;
3687 */},
3688 res: {
3689 ie10: true,
3690 firefox2: true,
3691 chrome: true,
3692 safari51: true,
3693 safaritp: true,
3694 safari10: true,
3695 webkit: true,
3696 opera: true,
3697 konq49: true,
3698 rhino17: true,
3699 node012: true,
3700 android40: true,
3701 xs6: true,
3702 jxa: true,
3703 },
3704 },
3705 {
3706 name: 'function statements in if-statement clauses',
3707 exec: function() {/*
3708 // Note: only available outside of strict mode.
3709 if (!this) return false;
3710
3711 if(true) function foo() { return 2; }
3712 if(false) {} else function bar() { return 3; }
3713 if(true) function baz() { return 4; } else {}
3714 if(false) function qux() { return 5; } else function qux() { return 6; }
3715 return foo() === 2 && bar() === 3 && baz() === 4 && qux() === 6;
3716 */},
3717 res: {
3718 ie10: true,
3719 firefox2: true,
3720 chrome: true,
3721 safari51: true,
3722 safaritp: true,
3723 safari10: true,
3724 webkit: true,
3725 opera: true,
3726 konq49: true,
3727 rhino17: true,
3728 node012: true,
3729 android40: true,
3730 xs6: true,
3731 jxa: true,
3732 },
3733 },
3734 ],
3735},
3736{
3737 name: '__proto__ in object literals',
3738 category: 'annex b',
3739 significance: 'tiny',
3740 note_id: 'proto-in-object-literals',
3741 note_html: 'Note that this is distinct from the existence or functionality of <code>Object.prototype.__proto__</code>.',
3742 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-__proto__-property-names-in-object-initializers',
3743 subtests: [
3744 {
3745 name: 'basic support',
3746 exec: function() {/*
3747 return { __proto__ : [] } instanceof Array
3748 && !({ __proto__ : null } instanceof Object);
3749 */},
3750 res: {
3751 ie11: true,
3752 firefox2: true,
3753 chrome: true,
3754 safari51: true,
3755 safari9: true,
3756 safaritp: true,
3757 webkit: true,
3758 opera: true,
3759 konq49: true,
3760 rhino17: true,
3761 node012: true,
3762 android40: true,
3763 xs6: true,
3764 jxa: true,
3765 },
3766 },
3767 {
3768 name: 'multiple __proto__ is an error',
3769 exec: function() {/*
3770 try {
3771 eval("({ __proto__ : [], __proto__: {} })");
3772 }
3773 catch(e) {
3774 return true;
3775 }
3776 */},
3777 res: {
3778 edge12: true,
3779 firefox35: true,
3780 safari9: true,
3781 safaritp: true,
3782 webkit: true,
3783 chrome42: true,
3784 node4: true,
3785 xs6: true,
3786 jxa: true,
3787 },
3788 },
3789 {
3790 name: 'not a computed property',
3791 exec: function() {/*
3792 if (!({ __proto__ : [] } instanceof Array)) {
3793 return false;
3794 }
3795 var a = "__proto__";
3796 return !({ [a] : [] } instanceof Array);
3797 */},
3798 res: {
3799 edge12: true,
3800 firefox34: true,
3801 safari71_8: true,
3802 safaritp: true,
3803 safari10: true,
3804 webkit: true,
3805 chrome44: true,
3806 node4: true,
3807 xs6: true,
3808 jxa: true,
3809 },
3810 },
3811 {
3812 name: 'not a shorthand property',
3813 exec: function() {/*
3814 if (!({ __proto__ : [] } instanceof Array)) {
3815 return false;
3816 }
3817 var __proto__ = [];
3818 return !({ __proto__ } instanceof Array);
3819 */},
3820 res: {
3821 firefox35: true,
3822 safari9: true,
3823 safaritp: true,
3824 webkit: true,
3825 chrome42: true,
3826 node4: true,
3827 edge13: true,
3828 xs6: true,
3829 jxa: true,
3830 },
3831 },
3832 {
3833 name: 'not a shorthand method',
3834 exec: function() {/*
3835 if (!({ __proto__ : [] } instanceof Array)) {
3836 return false;
3837 }
3838 return !({ __proto__(){} } instanceof Function);
3839 */},
3840 res: {
3841 firefox35: true,
3842 safari9: true,
3843 safaritp: true,
3844 webkit: true,
3845 chrome42: true,
3846 node4: true,
3847 edge13: true,
3848 xs6: true,
3849 jxa: true,
3850 },
3851 },
3852 ],
3853},
3854{
3855 name: 'for..of loops',
3856 category: 'syntax',
3857 significance: 'large',
3858 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-for-in-and-for-of-statements',
3859 subtests: [
3860 {
3861 name: 'with arrays',
3862 exec: function () {/*
3863 var arr = [5];
3864 for (var item of arr)
3865 return item === 5;
3866 */},
3867 res: (temp.basicForOf = {
3868 tr: true,
3869 babel: true,
3870 typescript: true,
3871 es6tr: true,
3872 ejs: true,
3873 jsx: true,
3874 closure: true,
3875 edge12: true,
3876 firefox13: true,
3877 chrome38: true,
3878 safari71_8: true,
3879 safaritp: true,
3880 safari10: true,
3881 webkit: true,
3882 node012: true,
3883 xs6: true,
3884 jxa: true,
3885 }),
3886 },
3887 {
3888 name: 'with sparse arrays',
3889 exec: function () {/*
3890 var arr = [,,];
3891 var count = 0;
3892 for (var item of arr)
3893 count += (item === undefined);
3894 return count === 2;
3895 */},
3896 res: temp.basicForOf,
3897 },
3898 {
3899 name: 'with strings',
3900 exec: function () {/*
3901 var str = "";
3902 for (var item of "foo")
3903 str += item;
3904 return str === "foo";
3905 */},
3906 res: {
3907 tr: true,
3908 babel: true,
3909 typescript: true,
3910 ejs: true,
3911 closure: true,
3912 edge12: true,
3913 firefox17: true,
3914 chrome38: true,
3915 safari9: true,
3916 safaritp: true,
3917 webkit: true,
3918 node012: true,
3919 xs6: true,
3920 jxa: true,
3921 },
3922 },
3923 {
3924 name: 'with astral plane strings',
3925 exec: function () {/*
3926 var str = "";
3927 for (var item of "𠮷𠮶")
3928 str += item + " ";
3929 return str === "𠮷 𠮶 ";
3930 */},
3931 res: {
3932 tr: true,
3933 babel: true,
3934 typescript: false,
3935 ejs: true,
3936 edge12: true,
3937 firefox25: true,
3938 chrome38: true,
3939 safari9: true,
3940 safaritp: true,
3941 webkit: true,
3942 node012: true,
3943 xs6: true,
3944 jxa: true,
3945 },
3946 },
3947 {
3948 name: 'with generator instances',
3949 exec: function () {/*
3950 var result = "";
3951 var iterable = (function*(){ yield 1; yield 2; yield 3; }());
3952 for (var item of iterable) {
3953 result += item;
3954 }
3955 return result === "123";
3956 */},
3957 res: {
3958 tr: true,
3959 babel: true,
3960 ejs: true,
3961 closure: true,
3962 edge12: flag,
3963 typescript: false,
3964 firefox27: true,
3965 chrome21dev: flag,
3966 chrome38: true,
3967 node012: true,
3968 edge13: true,
3969 xs6: true,
3970 safaritp: true,
3971 safari10: true,
3972 webkit: true,
3973 },
3974 },
3975 {
3976 name: 'with generic iterables',
3977 exec: function () {/*
3978 var result = "";
3979 var iterable = global.__createIterableObject([1, 2, 3]);
3980 for (var item of iterable) {
3981 result += item;
3982 }
3983 return result === "123";
3984 */},
3985 res: {
3986 tr: true,
3987 babel: true,
3988 closure: true,
3989 typescript: false,
3990 es6tr: { val: true, note_id: 'compiler-iterable' },
3991 ejs: true,
3992 edge12: true,
3993 firefox36: true,
3994 safari9: true,
3995 safaritp: true,
3996 webkit: true,
3997 chrome21dev: flag,
3998 chrome38: true,
3999 node012: true,
4000 xs6: true,
4001 jxa: true,
4002 },
4003 },
4004 {
4005 name: 'with instances of generic iterables',
4006 exec: function () {/*
4007 var result = "";
4008 var iterable = global.__createIterableObject([1, 2, 3]);
4009 for (var item of Object.create(iterable)) {
4010 result += item;
4011 }
4012 return result === "123";
4013 */},
4014 res: {
4015 tr: true,
4016 babel: true,
4017 closure: true,
4018 ejs: true,
4019 typescript: false,
4020 es6tr: { val: true, note_id: 'compiler-iterable' },
4021 edge12: true,
4022 firefox36: true,
4023 safari9: true,
4024 safaritp: true,
4025 webkit: true,
4026 chrome35: flag,
4027 chrome38: true,
4028 node012: true,
4029 xs6: true,
4030 jxa: true,
4031 },
4032 },
4033 {
4034 name: 'iterator closing, break',
4035 exec: function () {/*
4036 var closed = false;
4037 var iter = __createIterableObject([1, 2, 3], {
4038 'return': function(){ closed = true; return {}; }
4039 });
4040 for (var it of iter) break;
4041 return closed;
4042 */},
4043 res: {
4044 tr: true,
4045 babel: true,
4046 typescript: false,
4047 edge14: true,
4048 safari9: true,
4049 safaritp: true,
4050 webkit: true,
4051 xs6: true,
4052 chrome51: true,
4053 jxa: true,
4054 },
4055 },
4056 {
4057 name: 'iterator closing, throw',
4058 exec: function () {/*
4059 var closed = false;
4060 var iter = __createIterableObject([1, 2, 3], {
4061 'return': function(){ closed = true; return {}; }
4062 });
4063 try {
4064 for (var it of iter) throw 0;
4065 } catch(e){}
4066 return closed;
4067 */},
4068 res: {
4069 tr: true,
4070 babel: true,
4071 typescript: false,
4072 edge14: true,
4073 safari9: true,
4074 safaritp: true,
4075 webkit: true,
4076 xs6: true,
4077 chrome51: true,
4078 jxa: true,
4079 },
4080 },
4081 ],
4082},
4083{
4084 name: 'generators',
4085 category: 'functions',
4086 significance: 'large',
4087 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-generator-function-definitions',
4088 subtests: [
4089 {
4090 name: 'basic functionality',
4091 exec: function() {/*
4092 function * generator(){
4093 yield 5; yield 6;
4094 };
4095 var iterator = generator();
4096 var item = iterator.next();
4097 var passed = item.value === 5 && item.done === false;
4098 item = iterator.next();
4099 passed &= item.value === 6 && item.done === false;
4100 item = iterator.next();
4101 passed &= item.value === undefined && item.done === true;
4102 return passed;
4103 */},
4104 res: (temp.basicGenerators = {
4105 tr: true,
4106 babel: babel.regenerator,
4107 closure: true,
4108 firefox27: true,
4109 chrome21dev: flag,
4110 chrome39: true,
4111 node012: flag,
4112 node4: true,
4113 ejs: true,
4114 edge12: flag,
4115 edge13: true,
4116 xs6: true,
4117 safaritp: true,
4118 safari10: true,
4119 webkit: true,
4120 }),
4121 },
4122 {
4123 name: 'generator function expressions',
4124 exec: function() {/*
4125 var generator = function * (){
4126 yield 5; yield 6;
4127 };
4128 var iterator = generator();
4129 var item = iterator.next();
4130 var passed = item.value === 5 && item.done === false;
4131 item = iterator.next();
4132 passed &= item.value === 6 && item.done === false;
4133 item = iterator.next();
4134 passed &= item.value === undefined && item.done === true;
4135 return passed;
4136 */},
4137 res: temp.basicGenerators,
4138 },
4139 {
4140 name: 'correct "this" binding',
4141 exec: function() {/*
4142 function * generator(){
4143 yield this.x; yield this.y;
4144 };
4145 var iterator = { g: generator, x: 5, y: 6 }.g();
4146 var item = iterator.next();
4147 var passed = item.value === 5 && item.done === false;
4148 item = iterator.next();
4149 passed &= item.value === 6 && item.done === false;
4150 item = iterator.next();
4151 passed &= item.value === undefined && item.done === true;
4152 return passed;
4153 */},
4154 res: temp.basicGenerators,
4155 },
4156 {
4157 name: 'can\'t use "this" with new',
4158 exec: function() {/*
4159 function * generator(){
4160 yield this.x; yield this.y;
4161 };
4162 try {
4163 (new generator()).next();
4164 }
4165 catch (e) {
4166 return true;
4167 }
4168 */},
4169 res: {
4170 firefox43: true,
4171 chrome50: true,
4172 edge13: true,
4173 xs6: true,
4174 safaritp: true,
4175 safari10: true,
4176 webkit: true,
4177 },
4178 },
4179 {
4180 name: 'sending',
4181 exec: function() {/*
4182 var sent;
4183 function * generator(){
4184 sent = [yield 5, yield 6];
4185 };
4186 var iterator = generator();
4187 iterator.next();
4188 iterator.next("foo");
4189 iterator.next("bar");
4190 return sent[0] === "foo" && sent[1] === "bar";
4191 */},
4192 res: {
4193 tr: true,
4194 babel: babel.regenerator,
4195 ejs: true,
4196 closure: true,
4197 firefox27: true,
4198 chrome21dev: flag,
4199 chrome39: true,
4200 node012: flag,
4201 node4: true,
4202 edge12: flag,
4203 edge13: true,
4204 xs6: true,
4205 safaritp: true,
4206 safari10: true,
4207 webkit: true,
4208 },
4209 },
4210 {
4211 name: '%GeneratorPrototype%',
4212 exec: function() {/*
4213 function * generatorFn(){}
4214 var ownProto = Object.getPrototypeOf(generatorFn());
4215 var passed = ownProto === generatorFn.prototype;
4216
4217 var sharedProto = Object.getPrototypeOf(ownProto);
4218 passed &= sharedProto !== Object.prototype &&
4219 sharedProto === Object.getPrototypeOf(function*(){}.prototype) &&
4220 sharedProto.hasOwnProperty('next');
4221
4222 return passed;
4223 */},
4224 res: {
4225 tr: true,
4226 babel: babel.regenerator,
4227 firefox27: true,
4228 chrome21dev: flag,
4229 chrome39: true,
4230 node012: flag,
4231 node4: true,
4232 edge12: flag,
4233 edge13: true,
4234 xs6: true,
4235 safaritp: true,
4236 safari10: true,
4237 webkit: true,
4238 },
4239 },
4240 {
4241 name: '%GeneratorPrototype% prototype chain',
4242 exec: function () {/*
4243 function * generatorFn(){}
4244 var g = generatorFn();
4245 var ownProto = Object.getPrototypeOf(g);
4246 var passed = ownProto === generatorFn.prototype;
4247
4248 var sharedProto = Object.getPrototypeOf(ownProto);
4249 var iterProto = Object.getPrototypeOf(sharedProto);
4250
4251 passed &= iterProto.hasOwnProperty(Symbol.iterator) &&
4252 !sharedProto .hasOwnProperty(Symbol.iterator) &&
4253 !ownProto .hasOwnProperty(Symbol.iterator) &&
4254 g[Symbol.iterator]() === g;
4255
4256 return passed;
4257 */},
4258 res: {
4259 tr: true,
4260 babel: babel.regenerator,
4261 firefox45: true,
4262 chrome45: true,
4263 node012: flag,
4264 node4: true,
4265 edge12: flag,
4266 edge13: true,
4267 xs6: true,
4268 safaritp: true,
4269 safari10: true,
4270 webkit: true,
4271 },
4272 },
4273 {
4274 name: '%GeneratorPrototype%.constructor',
4275 exec: function () {/*
4276 function * g (){}
4277 var iterator = new g.constructor("a","b","c","yield a; yield b; yield c;")(5,6,7);
4278 var item = iterator.next();
4279 var passed = item.value === 5 && item.done === false;
4280 item = iterator.next();
4281 passed &= item.value === 6 && item.done === false;
4282 item = iterator.next();
4283 passed &= item.value === 7 && item.done === false;
4284 item = iterator.next();
4285 passed &= item.value === undefined && item.done === true;
4286
4287 passed &= g.constructor === (function*(){}).constructor;
4288 return passed;
4289 */},
4290 res: {
4291 firefox27: true,
4292 chrome21dev: flag,
4293 chrome39: true,
4294 node012: flag,
4295 node4: true,
4296 edge12: flag,
4297 edge13: true,
4298 xs6: true,
4299 safaritp: true,
4300 safari10: true,
4301 webkit: true,
4302 },
4303 },
4304 {
4305 name: '%GeneratorPrototype%.throw',
4306 exec: function() {/*
4307 var passed = false;
4308 function * generator(){
4309 try {
4310 yield 5; yield 6;
4311 } catch(e) {
4312 passed = (e === "foo");
4313 }
4314 };
4315 var iterator = generator();
4316 iterator.next();
4317 iterator.throw("foo");
4318 return passed;
4319 */},
4320 res: {
4321 tr: true,
4322 babel: babel.regenerator,
4323 closure: true,
4324 firefox27: true,
4325 chrome21dev: flag,
4326 chrome39: true,
4327 node012: flag,
4328 node4: true,
4329 ejs: true,
4330 edge12: flag,
4331 edge13: true,
4332 xs6: true,
4333 safaritp: true,
4334 safari10: true,
4335 webkit: true,
4336 },
4337 },
4338 {
4339 name: '%GeneratorPrototype%.return',
4340 exec: function() {/*
4341 function * generator(){
4342 yield 5; yield 6;
4343 };
4344 var iterator = generator();
4345 var item = iterator.next();
4346 var passed = item.value === 5 && item.done === false;
4347 item = iterator.return("quxquux");
4348 passed &= item.value === "quxquux" && item.done === true;
4349 item = iterator.next();
4350 passed &= item.value === undefined && item.done === true;
4351 return passed;
4352 */},
4353 res: {
4354 tr: true,
4355 babel: babel.regenerator,
4356 firefox38: true,
4357 edge12: flag,
4358 edge13: true,
4359 chrome50: true,
4360 xs6: true,
4361 safaritp: true,
4362 safari10: true,
4363 webkit: true,
4364 },
4365 },
4366 {
4367 name: 'yield operator precedence',
4368 exec: function() {/*
4369 var passed;
4370 function * generator(){
4371 passed = yield 0 ? true : false;
4372 };
4373 var iterator = generator();
4374 iterator.next();
4375 iterator.next(true);
4376 return passed;
4377 */},
4378 res: {
4379 tr: true,
4380 babel: babel.regenerator,
4381 closure: true,
4382 firefox27: true,
4383 chrome21dev: flag,
4384 chrome39: true,
4385 node012: flag,
4386 node4: true,
4387 ejs: true,
4388 edge12: flag,
4389 edge13: true,
4390 xs6: true,
4391 safaritp: true,
4392 safari10: true,
4393 webkit: true,
4394 },
4395 },
4396 {
4397 name: 'yield *, arrays',
4398 exec: function () {/*
4399 var iterator = (function * generator() {
4400 yield * [5, 6];
4401 }());
4402 var item = iterator.next();
4403 var passed = item.value === 5 && item.done === false;
4404 item = iterator.next();
4405 passed &= item.value === 6 && item.done === false;
4406 item = iterator.next();
4407 passed &= item.value === undefined && item.done === true;
4408 return passed;
4409 */},
4410 res: (temp.yieldArrays = {
4411 tr: true,
4412 babel: babel.regenerator,
4413 closure: true,
4414 firefox27: true,
4415 chrome38: flag,
4416 chrome39: true,
4417 node012: flag,
4418 node4: true,
4419 ejs: true,
4420 edge12: flag,
4421 edge13: true,
4422 xs6: true,
4423 safaritp: true,
4424 safari10: true,
4425 webkit: true,
4426 }),
4427 },
4428 {
4429 name: 'yield *, sparse arrays',
4430 exec: function () {/*
4431 var iterator = (function * generator() {
4432 yield * [,,];
4433 }());
4434 var item = iterator.next();
4435 var passed = item.value === undefined && item.done === false;
4436 item = iterator.next();
4437 passed &= item.value === undefined && item.done === false;
4438 item = iterator.next();
4439 passed &= item.value === undefined && item.done === true;
4440 return passed;
4441 */},
4442 res: temp.yieldArrays,
4443 },
4444 {
4445 name: 'yield *, strings',
4446 exec: function () {/*
4447 var iterator = (function * generator() {
4448 yield * "56";
4449 }());
4450 var item = iterator.next();
4451 var passed = item.value === "5" && item.done === false;
4452 item = iterator.next();
4453 passed &= item.value === "6" && item.done === false;
4454 item = iterator.next();
4455 passed &= item.value === undefined && item.done === true;
4456 return passed;
4457 */},
4458 res: {
4459 babel: babel.regenerator,
4460 closure: true,
4461 tr: true,
4462 firefox27: true,
4463 chrome38: flag,
4464 chrome39: true,
4465 node012: flag,
4466 node4: true,
4467 ejs: true,
4468 edge12: flag,
4469 edge13: true,
4470 xs6: true,
4471 safaritp: true,
4472 safari10: true,
4473 webkit: true,
4474 },
4475 },
4476 {
4477 name: 'yield *, astral plane strings',
4478 exec: function () {/*
4479 var iterator = (function * generator() {
4480 yield * "𠮷𠮶";
4481 }());
4482 var item = iterator.next();
4483 var passed = item.value === "𠮷" && item.done === false;
4484 item = iterator.next();
4485 passed &= item.value === "𠮶" && item.done === false;
4486 item = iterator.next();
4487 passed &= item.value === undefined && item.done === true;
4488 return passed;
4489 */},
4490 res: {
4491 babel: babel.regenerator,
4492 ejs: true,
4493 tr: true,
4494 firefox27: true,
4495 chrome38: flag,
4496 chrome39: true,
4497 node012: flag,
4498 node4: true,
4499 edge12: flag,
4500 edge13: true,
4501 xs6: true,
4502 safaritp: true,
4503 safari10: true,
4504 webkit: true,
4505 },
4506 },
4507 {
4508 name: 'yield *, generator instances',
4509 exec: function () {/*
4510 var iterator = (function * generator() {
4511 yield * (function*(){ yield 5; yield 6; yield 7; }());
4512 }());
4513 var item = iterator.next();
4514 var passed = item.value === 5 && item.done === false;
4515 item = iterator.next();
4516 passed &= item.value === 6 && item.done === false;
4517 item = iterator.next();
4518 passed &= item.value === 7 && item.done === false;
4519 item = iterator.next();
4520 passed &= item.value === undefined && item.done === true;
4521 return passed;
4522 */},
4523 res: {
4524 tr: true,
4525 babel: babel.regenerator,
4526 ejs: true,
4527 closure: true,
4528 firefox27: true,
4529 chrome21dev: flag,
4530 chrome39: true,
4531 node012: flag,
4532 node4: true,
4533 edge12: flag,
4534 edge13: true,
4535 xs6: true,
4536 safaritp: true,
4537 safari10: true,
4538 webkit: true,
4539 },
4540 },
4541 {
4542 name: 'yield *, generic iterables',
4543 exec: function () {/*
4544 var iterator = (function * generator() {
4545 yield * global.__createIterableObject([5, 6, 7]);
4546 }());
4547 var item = iterator.next();
4548 var passed = item.value === 5 && item.done === false;
4549 item = iterator.next();
4550 passed &= item.value === 6 && item.done === false;
4551 item = iterator.next();
4552 passed &= item.value === 7 && item.done === false;
4553 item = iterator.next();
4554 passed &= item.value === undefined && item.done === true;
4555 return passed;
4556 */},
4557 res: {
4558 tr: true,
4559 babel: babel.regenerator,
4560 ejs: true,
4561 closure: true,
4562 firefox36: true,
4563 chrome21dev: flag,
4564 chrome39: true,
4565 node012: flag,
4566 node4: true,
4567 edge12: flag,
4568 edge13: true,
4569 xs6: true,
4570 safaritp: true,
4571 safari10: true,
4572 webkit: true,
4573 },
4574 },
4575 {
4576 name: 'yield *, instances of iterables',
4577 exec: function () {/*
4578 var iterator = (function * generator() {
4579 yield * Object.create(__createIterableObject([5, 6, 7]));
4580 }());
4581 var item = iterator.next();
4582 var passed = item.value === 5 && item.done === false;
4583 item = iterator.next();
4584 passed &= item.value === 6 && item.done === false;
4585 item = iterator.next();
4586 passed &= item.value === 7 && item.done === false;
4587 item = iterator.next();
4588 passed &= item.value === undefined && item.done === true;
4589 return passed;
4590 */},
4591 res: {
4592 tr: true,
4593 ejs: true,
4594 babel: babel.regenerator,
4595 closure: true,
4596 firefox36: true,
4597 chrome35: flag,
4598 chrome39: true,
4599 node012: flag,
4600 node4: true,
4601 edge12: flag,
4602 edge13: true,
4603 xs6: true,
4604 safaritp: true,
4605 safari10: true,
4606 webkit: true,
4607 },
4608 },
4609 {
4610 name: 'yield * on non-iterables is a runtime error',
4611 exec: function () {/*
4612 var iterator = (function * generator() {
4613 yield * [5];
4614 }());
4615 var item = iterator.next();
4616 var passed = item.value === 5 && item.done === false;
4617 iterator = (function * generator() {
4618 yield * 5;
4619 }());
4620 try {
4621 iterator.next();
4622 } catch (e) {
4623 return passed;
4624 }
4625 */},
4626 res: {
4627 tr: true,
4628 babel: false,
4629 firefox31: true,
4630 chrome35: flag,
4631 chrome39: true,
4632 node012: flag,
4633 node4: true,
4634 edge12: flag,
4635 edge13: true,
4636 xs6: true,
4637 safaritp: true,
4638 safari10: true,
4639 webkit: true,
4640 },
4641 },
4642 {
4643 name: 'yield *, iterator closing',
4644 exec: function () {/*
4645 var closed = '';
4646 var iter = __createIterableObject([1, 2, 3], {
4647 'return': function(){
4648 closed += 'a';
4649 return {done: true};
4650 }
4651 });
4652 var gen = (function* generator(){
4653 try {
4654 yield *iter;
4655 } finally {
4656 closed += 'b';
4657 }
4658 })();
4659 gen.next();
4660 gen['return']();
4661 return closed === 'ab';
4662 */},
4663 res: {
4664 tr: true,
4665 babel: babel.regenerator,
4666 edge12: flag,
4667 edge13: true,
4668 chrome50: true,
4669 xs6: true,
4670 safaritp: true,
4671 safari10: true,
4672 webkit: true,
4673 },
4674 },
4675 {
4676 name: 'yield *, iterator closing via throw()',
4677 exec: function () {/*
4678 var closed = false;
4679 var iter = global.__createIterableObject([1, 2, 3], {
4680 'throw': undefined,
4681 'return': function() {
4682 closed = true;
4683 return {done: true};
4684 }
4685 });
4686 var gen = (function*(){
4687 try {
4688 yield *iter;
4689 } catch(e){}
4690 })();
4691 gen.next();
4692 gen['throw']();
4693 return closed;
4694 */},
4695 res: {
4696 tr: true,
4697 babel: babel.regenerator,
4698 edge13: true,
4699 chrome50: true,
4700 xs6: true,
4701 safaritp: true,
4702 safari10: true,
4703 webkit: true,
4704 },
4705 },
4706 {
4707 name: 'shorthand generator methods',
4708 exec: function() {/*
4709 var o = {
4710 * generator() {
4711 yield 5; yield 6;
4712 },
4713 };
4714 var iterator = o.generator();
4715 var item = iterator.next();
4716 var passed = item.value === 5 && item.done === false;
4717 item = iterator.next();
4718 passed &= item.value === 6 && item.done === false;
4719 item = iterator.next();
4720 passed &= item.value === undefined && item.done === true;
4721 return passed;
4722 */},
4723 res: {
4724 tr: true,
4725 babel: babel.regenerator,
4726 closure: true,
4727 chrome41: flag,
4728 chrome42: true,
4729 firefox34: true,
4730 node4: true,
4731 ejs: true,
4732 edge12: flag,
4733 edge13: true,
4734 xs6: true,
4735 safaritp: true,
4736 safari10: true,
4737 webkit: true,
4738 },
4739 },
4740 {
4741 name: 'string-keyed shorthand generator methods',
4742 exec: function() {/*
4743 var o = {
4744 * "foo bar"() {
4745 yield 5; yield 6;
4746 },
4747 };
4748 var iterator = o["foo bar"]();
4749 var item = iterator.next();
4750 var passed = item.value === 5 && item.done === false;
4751 item = iterator.next();
4752 passed &= item.value === 6 && item.done === false;
4753 item = iterator.next();
4754 passed &= item.value === undefined && item.done === true;
4755 return passed;
4756 */},
4757 res: {
4758 tr: true,
4759 babel: babel.regenerator,
4760 chrome41: flag,
4761 chrome42: true,
4762 firefox34: true,
4763 node4: true,
4764 ejs: true,
4765 edge12: flag,
4766 edge13: true,
4767 xs6: true,
4768 safaritp: true,
4769 safari10: true,
4770 webkit: true,
4771 },
4772 },
4773 {
4774 name: 'computed shorthand generators',
4775 exec: function() {/*
4776 var garply = "generator";
4777 var o = {
4778 * [garply] () {
4779 yield 5; yield 6;
4780 },
4781 };
4782 var iterator = o.generator();
4783 var item = iterator.next();
4784 var passed = item.value === 5 && item.done === false;
4785 item = iterator.next();
4786 passed &= item.value === 6 && item.done === false;
4787 item = iterator.next();
4788 passed &= item.value === undefined && item.done === true;
4789 return passed;
4790 */},
4791 res: {
4792 tr: true,
4793 babel: babel.regenerator,
4794 closure: true,
4795 firefox34: true,
4796 ejs: true,
4797 chrome44: true,
4798 edge12: flag,
4799 node4: true,
4800 edge13: true,
4801 xs6: true,
4802 safaritp: true,
4803 safari10: true,
4804 webkit: true,
4805 },
4806 },
4807 {
4808 name: 'shorthand generator methods, classes',
4809 exec: function() {/*
4810 class C {
4811 * generator() {
4812 yield 5; yield 6;
4813 }
4814 };
4815 var iterator = new C().generator();
4816 var item = iterator.next();
4817 var passed = item.value === 5 && item.done === false;
4818 item = iterator.next();
4819 passed &= item.value === 6 && item.done === false;
4820 item = iterator.next();
4821 passed &= item.value === undefined && item.done === true;
4822 return passed;
4823 */},
4824 res: {
4825 tr: true,
4826 babel: babel.regenerator,
4827 closure: true,
4828 chrome41: strict,
4829 chrome49: true,
4830 node4: strict,
4831 edge12: flag,
4832 edge13: true,
4833 firefox45: true,
4834 xs6: true,
4835 safaritp: true,
4836 safari10: true,
4837 webkit: true,
4838 },
4839 },
4840 {
4841 name: 'computed shorthand generators, classes',
4842 exec: function() {/*
4843 var garply = "generator";
4844 class C {
4845 * [garply] () {
4846 yield 5; yield 6;
4847 }
4848 }
4849 var iterator = new C().generator();
4850 var item = iterator.next();
4851 var passed = item.value === 5 && item.done === false;
4852 item = iterator.next();
4853 passed &= item.value === 6 && item.done === false;
4854 item = iterator.next();
4855 passed &= item.value === undefined && item.done === true;
4856 return passed;
4857 */},
4858 res: {
4859 tr: true,
4860 babel: babel.regenerator,
4861 closure: true,
4862 edge12: flag,
4863 chrome45: strict,
4864 chrome49: true,
4865 node4: strict,
4866 edge13: true,
4867 firefox45: true,
4868 xs6: true,
4869 safaritp: true,
4870 safari10: true,
4871 webkit: true,
4872 },
4873 },
4874 {
4875 name: 'shorthand generators can\'t be constructors',
4876 exec: function() {/*
4877 class C {
4878 * generator() {
4879 yield 5; yield 6;
4880 }
4881 };
4882 try {
4883 Function("class D { * constructor() { return {}; } }");
4884 } catch(e) {
4885 return true;
4886 }
4887 */},
4888 res: {
4889 babel: babel.regenerator,
4890 chrome41: strict,
4891 chrome49: true,
4892 node4: strict,
4893 edge12: flag,
4894 edge13: true,
4895 firefox45: true,
4896 xs6: true,
4897 safaritp: true,
4898 safari10: true,
4899 webkit: true,
4900 },
4901 },
4902 ],
4903},
4904{
4905 name: 'prototype of bound functions',
4906 category: 'misc',
4907 significance: 'tiny',
4908 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-boundfunctioncreate',
4909 subtests: [
4910 {
4911 name: 'basic functions',
4912 exec: function () {/*
4913 function correctProtoBound(proto) {
4914 var f = function(){};
4915 if (Object.setPrototypeOf) {
4916 Object.setPrototypeOf(f, proto);
4917 }
4918 else {
4919 f.__proto__ = proto;
4920 }
4921 var boundF = Function.prototype.bind.call(f, null);
4922 return Object.getPrototypeOf(boundF) === proto;
4923 }
4924 return correctProtoBound(Function.prototype)
4925 && correctProtoBound({})
4926 && correctProtoBound(null);
4927 */},
4928 res: {
4929 chrome46: true,
4930 edge13: true,
4931 firefox45: true,
4932 node5: true,
4933 xs6: true,
4934 ejs: true,
4935 safaritp: true,
4936 safari10: true,
4937 webkit: true,
4938 jxa: true,
4939 },
4940 },
4941 {
4942 name: 'generator functions',
4943 exec: function() {/*
4944 function correctProtoBound(proto) {
4945 var f = function*(){};
4946 if (Object.setPrototypeOf) {
4947 Object.setPrototypeOf(f, proto);
4948 }
4949 else {
4950 f.__proto__ = proto;
4951 }
4952 var boundF = Function.prototype.bind.call(f, null);
4953 return Object.getPrototypeOf(boundF) === proto;
4954 }
4955 return correctProtoBound(Function.prototype)
4956 && correctProtoBound({})
4957 && correctProtoBound(null);
4958 */},
4959 res: {
4960 chrome46: true,
4961 edge13: true,
4962 firefox45: true,
4963 node5: true,
4964 xs6: true,
4965 ejs: true,
4966 safaritp: true,
4967 safari10: true,
4968 webkit: true,
4969 },
4970 },
4971 {
4972 name: 'arrow functions',
4973 exec: function() {/*
4974 function correctProtoBound(proto) {
4975 var f = ()=>5;
4976 if (Object.setPrototypeOf) {
4977 Object.setPrototypeOf(f, proto);
4978 }
4979 else {
4980 f.__proto__ = proto;
4981 }
4982 var boundF = Function.prototype.bind.call(f, null);
4983 return Object.getPrototypeOf(boundF) === proto;
4984 }
4985 return correctProtoBound(Function.prototype)
4986 && correctProtoBound({})
4987 && correctProtoBound(null);
4988 */},
4989 res: {
4990 chrome46: true,
4991 edge13: true,
4992 firefox45: true,
4993 node5: true,
4994 xs6: true,
4995 ejs: true,
4996 safaritp: true,
4997 safari10: true,
4998 webkit: true,
4999 },
5000 },
5001 {
5002 name: 'classes',
5003 exec: function() {/*
5004 function correctProtoBound(proto) {
5005 class C {}
5006 if (Object.setPrototypeOf) {
5007 Object.setPrototypeOf(C, proto);
5008 }
5009 else {
5010 C.__proto__ = proto;
5011 }
5012 var boundF = Function.prototype.bind.call(C, null);
5013 return Object.getPrototypeOf(boundF) === proto;
5014 }
5015 return correctProtoBound(Function.prototype)
5016 && correctProtoBound({})
5017 && correctProtoBound(null);
5018 */},
5019 res: {
5020 chrome46: strict,
5021 chrome49: true,
5022 edge13: true,
5023 firefox45: true,
5024 node5: strict,
5025 xs6: true,
5026 ejs: true,
5027 safaritp: true,
5028 safari10: true,
5029 webkit: true,
5030 jxa: true,
5031 },
5032 },
5033 {
5034 name: 'subclasses',
5035 exec: function() {/*
5036 function correctProtoBound(superclass) {
5037 class C extends superclass {
5038 constructor() {
5039 return Object.create(null);
5040 }
5041 }
5042 var boundF = Function.prototype.bind.call(C, null);
5043 return Object.getPrototypeOf(boundF) === Object.getPrototypeOf(C);
5044 }
5045 return correctProtoBound(function(){})
5046 && correctProtoBound(Array)
5047 && correctProtoBound(null);
5048 */},
5049 res: {
5050 chrome46: strict,
5051 chrome49: true,
5052 edge13: true,
5053 firefox45: true,
5054 node5: strict,
5055 xs6: true,
5056 safaritp: true,
5057 safari10: true,
5058 webkit: true,
5059 jxa: true,
5060 },
5061 },
5062 ],
5063},
5064{
5065 name: 'octal and binary literals',
5066 category: 'syntax',
5067 significance: 'small',
5068 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-literals-numeric-literals',
5069 subtests: [
5070 {
5071 name: 'octal literals',
5072 exec: function () {/*
5073 return 0o10 === 8 && 0O10 === 8;
5074 */},
5075 res: {
5076 tr: true,
5077 babel: true,
5078 es6tr: true,
5079 ejs: true,
5080 closure: true,
5081 typescript: true,
5082 edge12: true,
5083 firefox25: true,
5084 chrome30: flag,
5085 chrome41: true,
5086 safari9: true,
5087 safaritp: true,
5088 webkit: true,
5089 node012: flag,
5090 node4: true,
5091 xs6: true,
5092 jxa: true,
5093 },
5094 },
5095 {
5096 name: 'binary literals',
5097 exec: function () {/*
5098 return 0b10 === 2 && 0B10 === 2;
5099 */},
5100 res: {
5101 tr: true,
5102 babel: true,
5103 es6tr: true,
5104 ejs: true,
5105 closure: true,
5106 typescript: true,
5107 edge12: true,
5108 firefox25: true,
5109 chrome30: flag,
5110 chrome41: true,
5111 safari9: true,
5112 safaritp: true,
5113 webkit: true,
5114 node012: flag,
5115 node4: true,
5116 xs6: true,
5117 jxa: true,
5118 },
5119 },
5120 {
5121 name: 'octal supported by Number()',
5122 exec: function () {/*
5123 return Number('0o1') === 1;
5124 */},
5125 res: {
5126 babel: true,
5127 typescript: typescript.corejs,
5128 closure: true,
5129 edge12: true,
5130 es6shim: true,
5131 firefox36: true,
5132 chrome30: flag,
5133 chrome41: true,
5134 safari9: true,
5135 safaritp: true,
5136 webkit: true,
5137 node012: flag,
5138 node4: true,
5139 xs6: true,
5140 jxa: true,
5141 },
5142 },
5143 {
5144 name: 'binary supported by Number()',
5145 exec: function () {/*
5146 return Number('0b1') === 1;
5147 */},
5148 res: {
5149 babel: true,
5150 typescript: typescript.corejs,
5151 closure: true,
5152 edge12: true,
5153 es6shim: true,
5154 firefox36: true,
5155 chrome30: flag,
5156 chrome41: true,
5157 safari9: true,
5158 safaritp: true,
5159 webkit: true,
5160 node012: flag,
5161 node4: true,
5162 xs6: true,
5163 jxa: true,
5164 },
5165 },
5166 ],
5167},
5168{
5169 name: 'template literals',
5170 category: 'syntax',
5171 significance: 'large',
5172 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-template-literals',
5173 subtests: [
5174 {
5175 name: 'basic functionality',
5176 exec: function () {/*
5177 var a = "ba", b = "QUX";
5178 return `foo bar
5179 ${a + "z"} ${b.toLowerCase()}` === "foo bar\nbaz qux";
5180 */},
5181 res: {
5182 tr: true,
5183 babel: true,
5184 es6tr: true,
5185 jsx: true,
5186 closure: true,
5187 typescript: true,
5188 edge12: true,
5189 firefox34: true,
5190 chrome41: true,
5191 safari9: true,
5192 safaritp: true,
5193 webkit: true,
5194 node4: true,
5195 xs6: true,
5196 jxa: true,
5197 },
5198 },
5199 {
5200 name: 'toString conversion',
5201 exec: function () {/*
5202 var a = {
5203 toString: function() { return "foo"; },
5204 valueOf: function() { return "bar"; },
5205 };
5206 return `${a}` === "foo";
5207 */},
5208 res: {
5209 ejs: true,
5210 firefox34: true,
5211 chrome41: true,
5212 safari9: true,
5213 safaritp: true,
5214 webkit: true,
5215 node4: true,
5216 edge13: true,
5217 xs6: true,
5218 jxa: true,
5219 },
5220 },
5221 {
5222 name: 'tagged template literals',
5223 exec: function () {/*
5224 var called = false;
5225 function fn(parts, a, b) {
5226 called = true;
5227 return parts instanceof Array &&
5228 parts[0] === "foo" &&
5229 parts[1] === "bar\n" &&
5230 parts.raw[0] === "foo" &&
5231 parts.raw[1] === "bar\\n" &&
5232 a === 123 &&
5233 b === 456;
5234 }
5235 return fn `foo${123}bar\n${456}` && called;
5236 */},
5237 res: {
5238 tr: true,
5239 babel: true,
5240 es6tr: true,
5241 jsx: true,
5242 ejs: true,
5243 closure: true,
5244 typescript: true,
5245 edge12: true,
5246 firefox34: true,
5247 chrome41: true,
5248 safari9: true,
5249 safaritp: true,
5250 webkit: true,
5251 node4: true,
5252 xs6: true,
5253 jxa: true,
5254 },
5255 },
5256 {
5257 name: 'passed array is frozen',
5258 exec: function () {/*
5259 return (function(parts) {
5260 return Object.isFrozen(parts) && Object.isFrozen(parts.raw);
5261 }) `foo${0}bar${0}baz`;
5262 */},
5263 res: {
5264 tr: true,
5265 ejs: true,
5266 babel: true,
5267 es6tr: true,
5268 jsx: true,
5269 edge12: true,
5270 firefox34: true,
5271 chrome41: true,
5272 safari9: true,
5273 safaritp: true,
5274 webkit: true,
5275 node4: true,
5276 xs6: true,
5277 jxa: true,
5278 },
5279 },
5280 {
5281 name: 'line break normalisation',
5282 /* For some reason, this .fromCharCode stuff is necessary instead of \r\n. */
5283 exec: function () {/*
5284 var cr = eval("`x" + String.fromCharCode(13) + "y`");
5285 var lf = eval("`x" + String.fromCharCode(10) + "y`");
5286 var crlf = eval("`x" + String.fromCharCode(13,10) + "y`");
5287
5288 return cr.length === 3 && lf.length === 3 && crlf.length === 3
5289 && cr[1] === lf[1] && lf[1] === crlf[1] && crlf[1] === '\n';
5290 */},
5291 res: {
5292 tr: true,
5293 babel: true,
5294 jsx: true,
5295 ejs: true,
5296 closure: true,
5297 typescript: true,
5298 firefox34: true,
5299 edge12: true,
5300 chrome41: true,
5301 safari9: true,
5302 safaritp: true,
5303 webkit: true,
5304 node4: true,
5305 xs6: true,
5306 jxa: true,
5307 },
5308 },
5309 ],
5310},
5311{
5312 name: 'RegExp "y" and "u" flags',
5313 category: 'syntax',
5314 significance: 'medium',
5315 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-get-regexp.prototype.sticky',
5316 subtests: [
5317 {
5318 name: '"y" flag',
5319 exec: function () {/*
5320 var re = new RegExp('\\w', 'y');
5321 re.exec('xy');
5322 return (re.exec('xy')[0] === 'y');
5323 */},
5324 res: {
5325 firefox3: true,
5326 chrome39: flag,
5327 chrome40: false,
5328 chrome49: true,
5329 ejs: true,
5330 edge12: flag,
5331 typescript: typescript.fallthrough,
5332 edge13: true,
5333 xs6: true,
5334 safaritp: true,
5335 safari10: true,
5336 webkit: true,
5337 },
5338 },
5339 {
5340 name: '"y" flag, lastIndex',
5341 exec: function () {/*
5342 var re = new RegExp('yy', 'y');
5343 re.lastIndex = 3;
5344 var result = re.exec('xxxyyxx')[0];
5345 return result === 'yy' && re.lastIndex === 5;
5346 */},
5347 res: {
5348 firefox3: true,
5349 chrome39: flag,
5350 chrome40: false,
5351 chrome49: true,
5352 ejs: true,
5353 edge12: flag,
5354 typescript: typescript.fallthrough,
5355 edge13: true,
5356 xs6: true,
5357 safaritp: true,
5358 safari10: true,
5359 webkit: true,
5360 },
5361 },
5362 {
5363 name: '"u" flag',
5364 exec: function() {/*
5365 return "𠮷".match(/^.$/u)[0].length === 2;
5366 */},
5367 res: {
5368 tr: true,
5369 babel: true,
5370 typescript: typescript.fallthrough,
5371 edge12: true,
5372 edge13: true,
5373 firefox46: true,
5374 chrome50: true,
5375 safaritp: true,
5376 safari10: true,
5377 webkit: true,
5378 },
5379 },
5380 {
5381 name: '"u" flag, Unicode code point escapes',
5382 exec: function() {/*
5383 return "𝌆".match(/\u{1d306}/u)[0].length === 2;
5384 */},
5385 res: {
5386 tr: true,
5387 babel: true,
5388 typescript: typescript.fallthrough,
5389 edge12: true,
5390 edge13: true,
5391 firefox46: true,
5392 chrome50: true,
5393 safaritp: true,
5394 safari10: true,
5395 webkit: true,
5396 },
5397 },
5398 {
5399 name: '"u" flag, case folding',
5400 exec: function() {/*
5401 return "ſ".match(/S/iu) && "S".match(/ſ/iu);
5402 */},
5403 res: {
5404 tr: true,
5405 babel: true,
5406 typescript: typescript.fallthrough,
5407 edge13: true,
5408 firefox46: true,
5409 chrome50: true,
5410 safaritp: true,
5411 safari10: true,
5412 webkit: true,
5413 },
5414 },
5415 ],
5416},
5417{
5418 name: 'typed arrays',
5419 category: 'built-ins',
5420 significance: 'large',
5421 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-typedarray-objects',
5422 subtests: [
5423 {
5424 name: 'Int8Array',
5425 exec: function(){/*
5426 var buffer = new ArrayBuffer(64);
5427 var view = new Int8Array(buffer); view[0] = 0x80;
5428 return view[0] === -0x80;
5429 */},
5430 res: (temp.basicTypedArrayResults = {
5431 babel: true,
5432 typescript: typescript.corejs,
5433 ejs: true,
5434 ie10: true,
5435 firefox4: true,
5436 chrome: true,
5437 safari51: true,
5438 safaritp: true,
5439 safari10: true,
5440 webkit: true,
5441 opera: true,
5442 konq49: true,
5443 node012: true,
5444 android40: true,
5445 xs6: true,
5446 jxa: true,
5447 }),
5448 },
5449 {
5450 name: 'Uint8Array',
5451 exec: function(){/*
5452 var buffer = new ArrayBuffer(64);
5453 var view = new Uint8Array(buffer); view[0] = 0x100;
5454 return view[0] === 0;
5455 */},
5456 res: temp.basicTypedArrayResults,
5457 },
5458 {
5459 name: 'Uint8ClampedArray',
5460 exec: function(){/*
5461 var buffer = new ArrayBuffer(64);
5462 var view = new Uint8ClampedArray(buffer); view[0] = 0x100;
5463 return view[0] === 0xFF;
5464 */},
5465 res: (temp.clampedArrayResults = {
5466 babel: true,
5467 typescript: typescript.corejs,
5468 firefox4: true,
5469 edge12: true,
5470 chrome: true,
5471 safari6: true,
5472 safaritp: true,
5473 safari10: true,
5474 webkit: true,
5475 opera: true,
5476 node012: true,
5477 xs6: true,
5478 jxa: true,
5479 }),
5480 },
5481 {
5482 name: 'Int16Array',
5483 exec: function(){/*
5484 var buffer = new ArrayBuffer(64);
5485 var view = new Int16Array(buffer); view[0] = 0x8000;
5486 return view[0] === -0x8000;
5487 */},
5488 res: temp.basicTypedArrayResults,
5489 },
5490 {
5491 name: 'Uint16Array',
5492 exec: function(){/*
5493 var buffer = new ArrayBuffer(64);
5494 var view = new Uint16Array(buffer); view[0] = 0x10000;
5495 return view[0] === 0;
5496 */},
5497 res: temp.basicTypedArrayResults,
5498 },
5499 {
5500 name: 'Int32Array',
5501 exec: function(){/*
5502 var buffer = new ArrayBuffer(64);
5503 var view = new Int32Array(buffer); view[0] = 0x80000000;
5504 return view[0] === -0x80000000;
5505 */},
5506 res: temp.basicTypedArrayResults,
5507 },
5508 {
5509 name: 'Uint32Array',
5510 exec: function(){/*
5511 var buffer = new ArrayBuffer(64);
5512 var view = new Uint32Array(buffer); view[0] = 0x100000000;
5513 return view[0] === 0;
5514 */},
5515 res: temp.basicTypedArrayResults,
5516 },
5517 {
5518 name: 'Float32Array',
5519 exec: function(){/*
5520 var buffer = new ArrayBuffer(64);
5521 var view = new Float32Array(buffer); view[0] = 0.1;
5522 return view[0] === 0.10000000149011612;
5523 */},
5524 res: temp.basicTypedArrayResults,
5525 },
5526 {
5527 name: 'Float64Array',
5528 exec: function(){/*
5529 var buffer = new ArrayBuffer(64);
5530 var view = new Float64Array(buffer); view[0] = 0.1;
5531 return view[0] === 0.1;
5532 */},
5533 res: Object.assign({}, temp.basicTypedArrayResults, {
5534 android40: false,
5535 android41: true,
5536 xs6: true,
5537 }),
5538 },
5539 {
5540 name: 'DataView (Int8)',
5541 exec: function(){/*
5542 var buffer = new ArrayBuffer(64);
5543 var view = new DataView(buffer);
5544 view.setInt8 (0, 0x80);
5545 return view.getInt8(0) === -0x80;
5546 */},
5547 res: (temp.basicDataViewResults = {
5548 babel: true,
5549 typescript: typescript.corejs,
5550 ejs: true,
5551 ie10: true,
5552 firefox16: true,
5553 chrome: true,
5554 safari51: true,
5555 safaritp: true,
5556 safari10: true,
5557 webkit: true,
5558 opera: true,
5559 node012: true,
5560 android40: true,
5561 xs6: true,
5562 jxa: true,
5563 }),
5564 },
5565 {
5566 name: 'DataView (Uint8)',
5567 exec: function(){/*
5568 var buffer = new ArrayBuffer(64);
5569 var view = new DataView(buffer);
5570 view.setUint8(0, 0x100);
5571 return view.getUint8(0) === 0;
5572 */},
5573 res: temp.basicDataViewResults,
5574 },
5575 {
5576 name: 'DataView (Int16)',
5577 exec: function(){/*
5578 var buffer = new ArrayBuffer(64);
5579 var view = new DataView(buffer);
5580 view.setInt16(0, 0x8000);
5581 return view.getInt16(0) === -0x8000;
5582 */},
5583 res: temp.basicDataViewResults,
5584 },
5585 {
5586 name: 'DataView (Uint16)',
5587 exec: function(){/*
5588 var buffer = new ArrayBuffer(64);
5589 var view = new DataView(buffer);
5590 view.setUint16(0, 0x10000);
5591 return view.getUint16(0) === 0;
5592 */},
5593 res: temp.basicDataViewResults,
5594 },
5595 {
5596 name: 'DataView (Int32)',
5597 exec: function(){/*
5598 var buffer = new ArrayBuffer(64);
5599 var view = new DataView(buffer);
5600 view.setInt32(0, 0x80000000);
5601 return view.getInt32(0) === -0x80000000;
5602 */},
5603 res: temp.basicDataViewResults,
5604 },
5605 {
5606 name: 'DataView (Uint32)',
5607 exec: function(){/*
5608 var buffer = new ArrayBuffer(64);
5609 var view = new DataView(buffer);
5610 view.setUint32(0, 0x100000000);
5611 return view.getUint32(0) === 0;
5612 */},
5613 res: temp.basicDataViewResults,
5614 },
5615 {
5616 name: 'DataView (Float32)',
5617 exec: function(){/*
5618 var buffer = new ArrayBuffer(64);
5619 var view = new DataView(buffer);
5620 view.setFloat32(0, 0.1);
5621 return view.getFloat32(0) === 0.10000000149011612;
5622 */},
5623 res: temp.basicDataViewResults,
5624 },
5625 {
5626 name: 'DataView (Float64)',
5627 exec: function(){/*
5628 var buffer = new ArrayBuffer(64);
5629 var view = new DataView(buffer);
5630 view.setFloat64(0, 0.1);
5631 return view.getFloat64(0) === 0.1;
5632 */},
5633 res: temp.basicDataViewResults,
5634 },
5635 {
5636 name: 'ArrayBuffer[Symbol.species]',
5637 exec: function(){/*
5638 return typeof ArrayBuffer[Symbol.species] === 'function';
5639 */},
5640 res: {
5641 babel: true,
5642 typescript: typescript.corejs,
5643 edge13: true,
5644 firefox48: true,
5645 xs6: true,
5646 ejs: true,
5647 safaritp: true,
5648 safari10: true,
5649 webkit: true,
5650 chrome50: flag,
5651 chrome51: true,
5652 jxa: true,
5653 },
5654 },
5655 {
5656 name: 'constructors require new',
5657 exec: function(){/*
5658 var buffer = new ArrayBuffer(64);
5659 var constructors = [
5660 'ArrayBuffer',
5661 'DataView',
5662 'Int8Array',
5663 'Uint8Array',
5664 'Uint8ClampedArray',
5665 'Int16Array',
5666 'Uint16Array',
5667 'Int32Array',
5668 'Uint32Array',
5669 'Float32Array',
5670 'Float64Array'
5671 ];
5672 return constructors.every(function (constructor) {
5673 try {
5674 if (constructor in global) {
5675 global[constructor](constructor === "ArrayBuffer" ? 64 : buffer);
5676 }
5677 return false;
5678 } catch(e) {
5679 return true;
5680 }
5681 });
5682 */},
5683 res: Object.assign({}, temp.clampedArrayResults, {
5684 edge12: false,
5685 edge14: true,
5686 safari6: false,
5687 safaritp: true,
5688 safari10: true,
5689 webkit: true,
5690 firefox4: false,
5691 firefox44:true,
5692 xs6: true,
5693 ejs: true,
5694 }),
5695 },
5696 {
5697 name: 'constructors accept generic iterables',
5698 exec: function(){/*
5699 var constructors = [
5700 'Int8Array',
5701 'Uint8Array',
5702 'Uint8ClampedArray',
5703 'Int16Array',
5704 'Uint16Array',
5705 'Int32Array',
5706 'Uint32Array',
5707 'Float32Array',
5708 'Float64Array'
5709 ];
5710 for(var i = 0; i < constructors.length; i++){
5711 var arr = new global[constructors[i]](__createIterableObject([1, 2, 3]));
5712 if(arr.length !== 3 || arr[0] !== 1 || arr[1] !== 2 || arr[2] !== 3)return false;
5713 }
5714 return true;
5715 */},
5716 res: {
5717 babel: true,
5718 typescript: typescript.corejs,
5719 chrome45: true,
5720 edge14: true,
5721 node4: true,
5722 safaritp: true,
5723 safari10: true,
5724 webkit: true,
5725 xs6: true,
5726 jxa: true,
5727 },
5728 },
5729 {
5730 name: 'correct prototype chains',
5731 exec: function(){/*
5732 var constructors = [
5733 'Int8Array',
5734 'Uint8Array',
5735 'Uint8ClampedArray',
5736 'Int16Array',
5737 'Uint16Array',
5738 'Int32Array',
5739 'Uint32Array',
5740 'Float32Array',
5741 'Float64Array'
5742 ];
5743 var constructor = Object.getPrototypeOf(Int8Array);
5744 var prototype = Object.getPrototypeOf(Int8Array.prototype);
5745 if(constructor === Function.prototype || prototype === Object.prototype)return false;
5746 for(var i = 0; i < constructors.length; i+=1) {
5747 if (!(constructors[i] in global
5748 && Object.getPrototypeOf(global[constructors[i]]) === constructor
5749 && Object.getPrototypeOf(global[constructors[i]].prototype) === prototype
5750 && Object.getOwnPropertyNames(global[constructors[i]].prototype).sort() + ''
5751 === "BYTES_PER_ELEMENT,constructor")) {
5752 return false;
5753 }
5754 }
5755 return true;
5756 */},
5757 res: {
5758 firefox35: true,
5759 edge12: true,
5760 chrome51: true,
5761 safaritp: true,
5762 safari10: true,
5763 webkit: true,
5764 xs6: true,
5765 jxa: true,
5766 },
5767 },
5768 ].concat([ //@@ jph
5769 { name: '.from', res: {
5770 babel: true,
5771 typescript: typescript.corejs,
5772 edge12: true,
5773 firefox38: true,
5774 chrome45: true,
5775 node4: true,
5776 safaritp: true,
5777 safari10: true,
5778 webkit: true,
5779 xs6: true,
5780 jxa: true,
5781 }},
5782 { name: '.of', res: {
5783 babel: true,
5784 typescript: typescript.corejs,
5785 edge12: true,
5786 firefox38: true,
5787 chrome45: true,
5788 node4: true,
5789 safaritp: true,
5790 safari10: true,
5791 webkit: true,
5792 xs6: true,
5793 ejs: true,
5794 jxa: true,
5795 }},
5796 { name: '.prototype.subarray', res: {
5797 babel: true,
5798 typescript: typescript.corejs,
5799 ejs: true,
5800 edge12: true,
5801 firefox4: true,
5802 chrome: true,
5803 safari6: true,
5804 safaritp: true,
5805 safari10: true,
5806 webkit: true,
5807 opera: true,
5808 node012: true,
5809 xs6: true,
5810 jxa: true,
5811 }},
5812 { name: '.prototype.join', res: {
5813 babel: true,
5814 typescript: typescript.corejs,
5815 edge12: true,
5816 firefox37: true,
5817 ejs: true,
5818 chrome45: true,
5819 node4: true,
5820 safaritp: true,
5821 safari10: true,
5822 webkit: true,
5823 xs6: true,
5824 jxa: true,
5825 }},
5826 { name: '.prototype.indexOf', res: {
5827 babel: true,
5828 typescript: typescript.corejs,
5829 edge12: true,
5830 firefox37: true,
5831 ejs: true,
5832 chrome45: true,
5833 node4: true,
5834 safaritp: true,
5835 safari10: true,
5836 webkit: true,
5837 xs6: true,
5838 jxa: true,
5839 }},
5840 { name: '.prototype.lastIndexOf', res: {
5841 babel: true,
5842 typescript: typescript.corejs,
5843 edge12: true,
5844 firefox37: true,
5845 ejs: true,
5846 chrome45: true,
5847 node4: true,
5848 safaritp: true,
5849 safari10: true,
5850 webkit: true,
5851 xs6: true,
5852 jxa: true,
5853 }},
5854 { name: '.prototype.slice', res: {
5855 babel: true,
5856 typescript: typescript.corejs,
5857 edge12: true,
5858 firefox38: true,
5859 chrome45: true,
5860 node4: true,
5861 safaritp: true,
5862 safari10: true,
5863 webkit: true,
5864 xs6: true,
5865 jxa: true,
5866 }},
5867 { name: '.prototype.every', res: {
5868 babel: true,
5869 typescript: typescript.corejs,
5870 edge12: true,
5871 firefox37: true,
5872 ejs: true,
5873 chrome45: true,
5874 node4: true,
5875 safaritp: true,
5876 safari10: true,
5877 webkit: true,
5878 xs6: true,
5879 jxa: true,
5880 }},
5881 { name: '.prototype.filter', res: {
5882 babel: true,
5883 typescript: typescript.corejs,
5884 edge12: true,
5885 firefox38: true,
5886 chrome45: true,
5887 node4: true,
5888 safaritp: true,
5889 safari10: true,
5890 webkit: true,
5891 xs6: true,
5892 jxa: true,
5893 }},
5894 { name: '.prototype.forEach', res: {
5895 babel: true,
5896 typescript: typescript.corejs,
5897 edge12: true,
5898 firefox38: true,
5899 ejs: true,
5900 chrome45: true,
5901 node4: true,
5902 safaritp: true,
5903 safari10: true,
5904 webkit: true,
5905 xs6: true,
5906 jxa: true,
5907 }},
5908 { name: '.prototype.map', res: {
5909 babel: true,
5910 typescript: typescript.corejs,
5911 edge12: true,
5912 firefox38: true,
5913 chrome45: true,
5914 node4: true,
5915 safaritp: true,
5916 safari10: true,
5917 webkit: true,
5918 xs6: true,
5919 jxa: true,
5920 }},
5921 { name: '.prototype.reduce', res: {
5922 babel: true,
5923 typescript: typescript.corejs,
5924 edge12: true,
5925 firefox37: true,
5926 ejs: true,
5927 chrome45: true,
5928 node4: true,
5929 safaritp: true,
5930 safari10: true,
5931 webkit: true,
5932 xs6: true,
5933 jxa: true,
5934 }},
5935 { name: '.prototype.reduceRight', res: {
5936 babel: true,
5937 typescript: typescript.corejs,
5938 edge12: true,
5939 firefox37: true,
5940 ejs: true,
5941 chrome45: true,
5942 node4: true,
5943 safaritp: true,
5944 safari10: true,
5945 webkit: true,
5946 xs6: true,
5947 jxa: true,
5948 }},
5949 { name: '.prototype.reverse', res: {
5950 babel: true,
5951 typescript: typescript.corejs,
5952 edge12: true,
5953 firefox37: true,
5954 ejs: true,
5955 chrome45: true,
5956 node4: true,
5957 safaritp: true,
5958 safari10: true,
5959 webkit: true,
5960 xs6: true,
5961 jxa: true,
5962 }},
5963 { name: '.prototype.some', res: {
5964 babel: true,
5965 typescript: typescript.corejs,
5966 edge12: true,
5967 firefox37: true,
5968 ejs: true,
5969 chrome45: true,
5970 node4: true,
5971 safaritp: true,
5972 safari10: true,
5973 webkit: true,
5974 xs6: true,
5975 jxa: true,
5976 }},
5977 { name: '.prototype.sort', res: {
5978 babel: true,
5979 typescript: typescript.corejs,
5980 edge12: true,
5981 firefox46: true,
5982 chrome45: true,
5983 node4: true,
5984 safaritp: true,
5985 safari10: true,
5986 webkit: true,
5987 xs6: true,
5988 jxa: true,
5989 }},
5990 { name: '.prototype.copyWithin', res: {
5991 babel: true,
5992 typescript: typescript.corejs,
5993 edge12: true,
5994 firefox34: true,
5995 ejs: true,
5996 chrome45: true,
5997 node4: true,
5998 safaritp: true,
5999 safari10: true,
6000 webkit: true,
6001 xs6: true,
6002 jxa: true,
6003 }},
6004 { name: '.prototype.find', res: {
6005 babel: true,
6006 typescript: typescript.corejs,
6007 edge12: true,
6008 firefox37: true,
6009 ejs: true,
6010 chrome45: true,
6011 node4: true,
6012 safaritp: true,
6013 safari10: true,
6014 webkit: true,
6015 xs6: true,
6016 jxa: true,
6017 }},
6018 { name: '.prototype.findIndex', res: {
6019 babel: true,
6020 typescript: typescript.corejs,
6021 edge12: true,
6022 firefox37: true,
6023 ejs: true,
6024 chrome45: true,
6025 node4: true,
6026 safaritp: true,
6027 safari10: true,
6028 webkit: true,
6029 xs6: true,
6030 jxa: true,
6031 }},
6032 { name: '.prototype.fill', res: {
6033 babel: true,
6034 typescript: typescript.corejs,
6035 edge12: true,
6036 firefox37: true,
6037 ejs: true,
6038 chrome45: true,
6039 node4: true,
6040 safaritp: true,
6041 safari10: true,
6042 webkit: true,
6043 xs6: true,
6044 jxa: true,
6045 }},
6046 { name: '.prototype.keys', res: {
6047 babel: true,
6048 typescript: typescript.corejs,
6049 edge12: true,
6050 chrome38: true,
6051 node012: true,
6052 firefox37: true,
6053 ejs: true,
6054 safaritp: true,
6055 safari10: true,
6056 webkit: true,
6057 xs6: true,
6058 jxa: true,
6059 }},
6060 { name: '.prototype.values', res: {
6061 babel: true,
6062 typescript: typescript.corejs,
6063 edge12: true,
6064 chrome38: true,
6065 node012: true,
6066 firefox37: true,
6067 ejs: true,
6068 safaritp: true,
6069 safari10: true,
6070 webkit: true,
6071 xs6: true,
6072 jxa: true,
6073 }},
6074 { name: '.prototype.entries', res: {
6075 babel: true,
6076 typescript: typescript.corejs,
6077 edge12: true,
6078 chrome38: true,
6079 node012: true,
6080 firefox37: true,
6081 safaritp: true,
6082 safari10: true,
6083 webkit: true,
6084 xs6: true,
6085 jxa: true,
6086 }},
6087 { name: '.prototype[Symbol.iterator]', res: {
6088 babel: true,
6089 typescript: typescript.corejs,
6090 edge12: true,
6091 chrome38: true,
6092 node012: true,
6093 firefox37: true,
6094 ejs: true,
6095 safaritp: true,
6096 safari10: true,
6097 webkit: true,
6098 xs6: true,
6099 jxa: true,
6100 }},
6101 { name: '[Symbol.species]', res: {
6102 babel: true,
6103 typescript: typescript.corejs,
6104 edge13: true,
6105 firefox48: true,
6106 xs6: true,
6107 ejs: true,
6108 chrome50: flag,
6109 chrome51: true,
6110 safaritp: true,
6111 safari10: true,
6112 webkit: true,
6113 jxa: true,
6114 }},
6115 ].map(function(m) {
6116 var eqFn = ' === "function"';
6117 var name = m.name;
6118 m.name = '%TypedArray%' + name;
6119 m.exec = eval('0,function(){/*\nreturn typeof '
6120 + [
6121 'Int8Array',
6122 'Uint8Array',
6123 'Uint8ClampedArray',
6124 'Int16Array',
6125 'Uint16Array',
6126 'Int32Array',
6127 'Uint32Array',
6128 'Float32Array',
6129 'Float64Array'
6130 ].join(name + eqFn + ' &&\n typeof ') + name + eqFn + ';\n*/}');
6131 return m;
6132 })
6133 ),
6134},
6135{
6136 name: 'Map',
6137 category: 'built-ins',
6138 significance: 'medium',
6139 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-map-objects',
6140 subtests: [
6141 {
6142 name: 'basic functionality',
6143 exec: function () {/*
6144 var key = {};
6145 var map = new Map();
6146
6147 map.set(key, 123);
6148
6149 return map.has(key) && map.get(key) === 123;
6150 */},
6151 res: (temp.basicMap = {
6152 tr: true,
6153 babel: true,
6154 typescript: typescript.corejs,
6155 closure: true,
6156 ejs: true,
6157 es6shim: true,
6158 ie11: true,
6159 firefox16: true,
6160 chrome21dev: flag,
6161 chrome38: true,
6162 safari71_8: true,
6163 safaritp: true,
6164 safari10: true,
6165 webkit: true,
6166 node012: true,
6167 xs6: true,
6168 jxa: true,
6169 }),
6170 },
6171 {
6172 name: 'constructor arguments',
6173 exec: function () {/*
6174 var key1 = {};
6175 var key2 = {};
6176 var map = new Map([[key1, 123], [key2, 456]]);
6177
6178 return map.has(key1) && map.get(key1) === 123 &&
6179 map.has(key2) && map.get(key2) === 456;
6180 */},
6181 res: {
6182 tr: true,
6183 babel: true,
6184 typescript: typescript.corejs,
6185 closure: true,
6186 ejs: true,
6187 es6shim: true,
6188 edge12: true,
6189 firefox16: true,
6190 chrome38: true,
6191 safari9: true,
6192 safaritp: true,
6193 webkit: true,
6194 node012: true,
6195 xs6: true,
6196 jxa: true,
6197 },
6198 },
6199 {
6200 name: 'constructor requires new',
6201 exec: function () {/*
6202 new Map();
6203 try {
6204 Map();
6205 return false;
6206 } catch(e) {
6207 return true;
6208 }
6209 */},
6210 res: {
6211 babel: true,
6212 ejs: true,
6213 typescript: typescript.corejs,
6214 es6shim: true,
6215 ie11: true,
6216 chrome38: true,
6217 safari9: true,
6218 safaritp: true,
6219 webkit: true,
6220 node4: true,
6221 firefox42: true,
6222 xs6: true,
6223 jxa: true,
6224 },
6225 },
6226 {
6227 name: 'constructor accepts null',
6228 exec: function () {/*
6229 new Map(null);
6230 return true;
6231 */},
6232 res: Object.assign({}, temp.basicMap, {
6233 firefox16: false,
6234 firefox32: true,
6235 }),
6236 },
6237 {
6238 name: 'constructor invokes set',
6239 exec: function () {/*
6240 var passed = false;
6241 var _set = Map.prototype.set;
6242
6243 Map.prototype.set = function(k, v) {
6244 passed = true;
6245 };
6246
6247 new Map([ [1, 2] ]);
6248 Map.prototype.set = _set;
6249
6250 return passed;
6251 */},
6252 res: {
6253 ejs: true,
6254 babel: true,
6255 typescript: typescript.corejs,
6256 closure: true,
6257 es6shim: true,
6258 edge12: true,
6259 firefox37: true,
6260 chrome38: true,
6261 safari9: true,
6262 safaritp: true,
6263 webkit: true,
6264 node4: true,
6265 xs6: true,
6266 jxa: true,
6267 },
6268 },
6269 {
6270 name: 'iterator closing',
6271 exec: function () {/*
6272 var closed = false;
6273 var iter = global.__createIterableObject([1, 2, 3], {
6274 'return': function(){ closed = true; return {}; }
6275 });
6276 try {
6277 new Map(iter);
6278 } catch(e){}
6279 return closed;
6280 */},
6281 res: {
6282 babel: true,
6283 typescript: typescript.corejs,
6284 edge14: true,
6285 chrome51: true,
6286 safari9: true,
6287 safaritp: true,
6288 webkit: true,
6289 xs6: true,
6290 jxa: true,
6291 },
6292 },
6293 {
6294 name: 'Map.prototype.set returns this',
6295 exec: function () {/*
6296 var map = new Map();
6297 return map.set(0, 0) === map;
6298 */},
6299 res: {
6300 tr: true,
6301 babel: true,
6302 typescript: typescript.corejs,
6303 closure: true,
6304 ejs: true,
6305 es6shim: true,
6306 edge12: true,
6307 firefox33: true,
6308 chrome38: true,
6309 safari71_8: true,
6310 safaritp: true,
6311 safari10: true,
6312 webkit: true,
6313 node012: true,
6314 node4: true,
6315 xs6: true,
6316 jxa: true,
6317 },
6318 },
6319 {
6320 name: '-0 key converts to +0',
6321 exec: function () {/*
6322 var map = new Map();
6323 map.set(-0, "foo");
6324 var k;
6325 map.forEach(function (value, key) {
6326 k = 1 / key;
6327 });
6328 return k === Infinity && map.get(+0) == "foo";
6329 */},
6330 res: {
6331 babel: true,
6332 typescript: typescript.corejs,
6333 es6shim: true,
6334 edge12: true,
6335 firefox29: true,
6336 chrome39: true,
6337 safari9: true,
6338 safaritp: true,
6339 webkit: true,
6340 node012: flag,
6341 node4: true,
6342 xs6: true,
6343 jxa: true,
6344 },
6345 },
6346 {
6347 name: 'Map.prototype.size',
6348 exec: function () {/*
6349 var key = {};
6350 var map = new Map();
6351
6352 map.set(key, 123);
6353
6354 return map.size === 1;
6355 */},
6356 res: {
6357 tr: true,
6358 babel: true,
6359 typescript: typescript.corejs,
6360 closure: true,
6361 ejs: true,
6362 es6shim: true,
6363 ie11: true,
6364 firefox23: true,
6365 chrome21dev: flag,
6366 chrome38: true,
6367 safari71_8: true,
6368 safaritp: true,
6369 safari10: true,
6370 webkit: true,
6371 node012: true,
6372 xs6: true,
6373 jxa: true,
6374 },
6375 },
6376 {
6377 name: 'Map.prototype.delete',
6378 exec: function () {/*
6379 return typeof Map.prototype.delete === "function";
6380 */},
6381 res: {
6382 tr: true,
6383 babel: true,
6384 typescript: typescript.corejs,
6385 closure: true,
6386 ejs: true,
6387 es6shim: true,
6388 ie11: true,
6389 firefox16: true,
6390 chrome21dev: flag,
6391 chrome38: true,
6392 safari71_8: true,
6393 safaritp: true,
6394 safari10: true,
6395 webkit: true,
6396 node012: true,
6397 xs6: true,
6398 jxa: true,
6399 },
6400 },
6401 {
6402 name: 'Map.prototype.clear',
6403 exec: function () {/*
6404 return typeof Map.prototype.clear === "function";
6405 */},
6406 res: {
6407 tr: true,
6408 babel: true,
6409 typescript: typescript.corejs,
6410 closure: true,
6411 ejs: true,
6412 es6shim: true,
6413 ie11: true,
6414 firefox23: true,
6415 chrome21dev: flag,
6416 chrome38: true,
6417 safari71_8: true,
6418 safaritp: true,
6419 safari10: true,
6420 webkit: true,
6421 node012: true,
6422 xs6: true,
6423 jxa: true,
6424 },
6425 },
6426 {
6427 name: 'Map.prototype.forEach',
6428 exec: function () {/*
6429 return typeof Map.prototype.forEach === "function";
6430 */},
6431 res: {
6432 tr: true,
6433 babel: true,
6434 typescript: typescript.corejs,
6435 closure: true,
6436 ejs: true,
6437 es6shim: true,
6438 ie11: true,
6439 firefox25: true,
6440 chrome36: flag,
6441 chrome38: true,
6442 safari71_8: true,
6443 safaritp: true,
6444 safari10: true,
6445 webkit: true,
6446 node012: true,
6447 xs6: true,
6448 jxa: true,
6449 },
6450 },
6451 {
6452 name: 'Map.prototype.keys',
6453 exec: function () {/*
6454 return typeof Map.prototype.keys === "function";
6455 */},
6456 res: {
6457 tr: true,
6458 babel: true,
6459 typescript: typescript.corejs,
6460 closure: true,
6461 ejs: true,
6462 es6shim: true,
6463 edge12: true,
6464 firefox23: true,
6465 safari71_8: true,
6466 safaritp: true,
6467 safari10: true,
6468 webkit: true,
6469 chrome37: flag,
6470 chrome38: true,
6471 node012: true,
6472 xs6: true,
6473 jxa: true,
6474 },
6475 },
6476 {
6477 name: 'Map.prototype.values',
6478 exec: function () {/*
6479 return typeof Map.prototype.values === "function";
6480 */},
6481 res: {
6482 tr: true,
6483 babel: true,
6484 typescript: typescript.corejs,
6485 closure: true,
6486 ejs: true,
6487 es6shim: true,
6488 edge12: true,
6489 firefox23: true,
6490 safari71_8: true,
6491 safaritp: true,
6492 safari10: true,
6493 webkit: true,
6494 chrome36: flag,
6495 chrome38: true,
6496 node012: true,
6497 xs6: true,
6498 jxa: true,
6499 },
6500 },
6501 {
6502 name: 'Map.prototype.entries',
6503 exec: function () {/*
6504 return typeof Map.prototype.entries === "function";
6505 */},
6506 res: {
6507 tr: true,
6508 babel: true,
6509 typescript: typescript.corejs,
6510 closure: true,
6511 ejs: true,
6512 es6shim: true,
6513 edge12: true,
6514 firefox23: true,
6515 safari71_8: true,
6516 safaritp: true,
6517 safari10: true,
6518 webkit: true,
6519 chrome36: flag,
6520 chrome38: true,
6521 node012: true,
6522 xs6: true,
6523 jxa: true,
6524 },
6525 },
6526 {
6527 name: 'Map.prototype[Symbol.iterator]',
6528 exec: function () {/*
6529 return typeof Map.prototype[Symbol.iterator] === "function";
6530 */},
6531 res: {
6532 tr: true,
6533 babel: true,
6534 typescript: typescript.corejs,
6535 closure: true,
6536 ejs: true,
6537 firefox36: true,
6538 chrome37: flag,
6539 chrome38: true,
6540 safari9: true,
6541 safaritp: true,
6542 webkit: true,
6543 edge12: true,
6544 node012: true,
6545 xs6: true,
6546 jxa: true,
6547 },
6548 },
6549 {
6550 name: 'Map.prototype isn\'t an instance',
6551 exec: function () {/*
6552 new Map();
6553 var obj = {};
6554 try {
6555 Map.prototype.has(obj);
6556 }
6557 catch(e) {
6558 return true;
6559 }
6560 */},
6561 res: temp.basicMap,
6562 },
6563 {
6564 name: 'Map iterator prototype chain',
6565 exec: function () {/*
6566 // Iterator instance
6567 var iterator = new Map()[Symbol.iterator]();
6568 // %MapIteratorPrototype%
6569 var proto1 = Object.getPrototypeOf(iterator);
6570 // %IteratorPrototype%
6571 var proto2 = Object.getPrototypeOf(proto1);
6572
6573 return proto2.hasOwnProperty(Symbol.iterator) &&
6574 !proto1 .hasOwnProperty(Symbol.iterator) &&
6575 !iterator .hasOwnProperty(Symbol.iterator) &&
6576 iterator[Symbol.iterator]() === iterator;
6577 */},
6578 res: {
6579 tr: true,
6580 babel: true,
6581 ejs: true,
6582 typescript: typescript.corejs,
6583 safari9: true,
6584 safaritp: true,
6585 webkit: true,
6586 chrome45: true,
6587 node4: true,
6588 edge13: true,
6589 firefox45: true,
6590 xs6: true,
6591 jxa: true,
6592 },
6593 },
6594 {
6595 name: 'Map[Symbol.species]',
6596 exec: function () {/*
6597 var prop = Object.getOwnPropertyDescriptor(Map, Symbol.species);
6598 return 'get' in prop && Map[Symbol.species] === Map;
6599 */},
6600 res: {
6601 babel: true,
6602 ejs: true,
6603 typescript: typescript.corejs,
6604 firefox41: true,
6605 chrome50: flag,
6606 chrome51: true,
6607 edge13: true,
6608 xs6: true,
6609 safaritp: true,
6610 safari10: true,
6611 webkit: true,
6612 },
6613 },
6614 ],
6615},
6616{
6617 name: 'Set',
6618 category: 'built-ins',
6619 significance: 'medium',
6620 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-set-objects',
6621 subtests: [
6622 {
6623 name: 'basic functionality',
6624 exec: function () {/*
6625 var obj = {};
6626 var set = new Set();
6627
6628 set.add(123);
6629 set.add(123);
6630
6631 return set.has(123);
6632 */},
6633 res: (temp.basicSet = {
6634 tr: true,
6635 babel: true,
6636 typescript: typescript.corejs,
6637 closure: true,
6638 ejs: true,
6639 es6shim: true,
6640 ie11: true,
6641 firefox16: true,
6642 chrome21dev: flag,
6643 chrome38: true,
6644 safari71_8: true,
6645 safaritp: true,
6646 safari10: true,
6647 webkit: true,
6648 node012: true,
6649 xs6: true,
6650 jxa: true,
6651 }),
6652 },
6653 {
6654 name: 'constructor arguments',
6655 exec: function () {/*
6656 var obj1 = {};
6657 var obj2 = {};
6658 var set = new Set([obj1, obj2]);
6659
6660 return set.has(obj1) && set.has(obj2);
6661 */},
6662 res: {
6663 tr: true,
6664 babel: true,
6665 typescript: typescript.corejs,
6666 closure: true,
6667 ejs: true,
6668 es6shim: true,
6669 edge12: true,
6670 firefox16: true,
6671 chrome38: true,
6672 safari9: true,
6673 safaritp: true,
6674 webkit: true,
6675 node012: true,
6676 xs6: true,
6677 jxa: true,
6678 },
6679 },
6680 {
6681 name: 'constructor requires new',
6682 exec: function () {/*
6683 new Set();
6684 try {
6685 Set();
6686 return false;
6687 } catch(e) {
6688 return true;
6689 }
6690 */},
6691 res: {
6692 babel: true,
6693 ejs: true,
6694 typescript: typescript.corejs,
6695 es6shim: true,
6696 ie11: true,
6697 chrome38: true,
6698 safari9: true,
6699 safaritp: true,
6700 webkit: true,
6701 node4: true,
6702 firefox42: true,
6703 xs6: true,
6704 jxa: true,
6705 },
6706 },
6707 {
6708 name: 'constructor accepts null',
6709 exec: function () {/*
6710 new Set(null);
6711 return true;
6712 */},
6713 res: Object.assign({}, temp.basicSet, {
6714 firefox16: false,
6715 firefox32: true,
6716 }),
6717 },
6718 {
6719 name: 'constructor invokes add',
6720 exec: function () {/*
6721 var passed = false;
6722 var _add = Set.prototype.add;
6723
6724 Set.prototype.add = function(v) {
6725 passed = true;
6726 };
6727
6728 new Set([1]);
6729 Set.prototype.add = _add;
6730
6731 return passed;
6732 */},
6733 res: {
6734 babel: true,
6735 ejs: true,
6736 typescript: typescript.corejs,
6737 closure: true,
6738 es6shim: true,
6739 edge12: true,
6740 firefox37: true,
6741 chrome38: true,
6742 safari9: true,
6743 safaritp: true,
6744 webkit: true,
6745 node4: true,
6746 xs6: true,
6747 jxa: true,
6748 },
6749 },
6750 {
6751 name: 'iterator closing',
6752 exec: function () {/*
6753 var closed = false;
6754 var iter = global.__createIterableObject([1, 2, 3], {
6755 'return': function(){ closed = true; return {}; }
6756 });
6757 var add = Set.prototype.add;
6758 Set.prototype.add = function(){ throw 0 };
6759 try {
6760 new Set(iter);
6761 } catch(e){}
6762 Set.prototype.add = add;
6763 return closed;
6764 */},
6765 res: {
6766 babel: true,
6767 typescript: typescript.corejs,
6768 edge14: true,
6769 chrome51: true,
6770 safari9: true,
6771 safaritp: true,
6772 webkit: true,
6773 xs6: true,
6774 jxa: true,
6775 },
6776 },
6777 {
6778 name: 'Set.prototype.add returns this',
6779 exec: function () {/*
6780 var set = new Set();
6781 return set.add(0) === set;
6782 */},
6783 res: {
6784 tr: true,
6785 babel: true,
6786 typescript: typescript.corejs,
6787 closure: true,
6788 ejs: true,
6789 es6shim: true,
6790 edge12: true,
6791 firefox33: true,
6792 chrome38: true,
6793 safari71_8: true,
6794 safaritp: true,
6795 safari10: true,
6796 webkit: true,
6797 node012: true,
6798 xs6: true,
6799 jxa: true,
6800 },
6801 },
6802 {
6803 name: '-0 key converts to +0',
6804 exec: function () {/*
6805 var set = new Set();
6806 set.add(-0);
6807 var k;
6808 set.forEach(function (value) {
6809 k = 1 / value;
6810 });
6811 return k === Infinity && set.has(+0);
6812 */},
6813 res: {
6814 babel: true,
6815 es6shim: true,
6816 typescript: typescript.corejs,
6817 edge12: true,
6818 firefox29: true,
6819 chrome39: true,
6820 safari9: true,
6821 safaritp: true,
6822 webkit: true,
6823 node012: flag,
6824 node4: true,
6825 ejs: true,
6826 xs6: true,
6827 jxa: true,
6828 },
6829 },
6830 {
6831 name: 'Set.prototype.size',
6832 exec: function () {/*
6833 var obj = {};
6834 var set = new Set();
6835
6836 set.add(123);
6837 set.add(123);
6838 set.add(456);
6839
6840 return set.size === 2;
6841 */},
6842 res: {
6843 tr: true,
6844 babel: true,
6845 typescript: typescript.corejs,
6846 closure: true,
6847 ejs: true,
6848 es6shim: true,
6849 ie11: true,
6850 firefox23: true,
6851 chrome21dev: flag,
6852 chrome38: true,
6853 safari71_8: true,
6854 safaritp: true,
6855 safari10: true,
6856 webkit: true,
6857 node012: true,
6858 xs6: true,
6859 jxa: true,
6860 },
6861 },
6862 {
6863 name: 'Set.prototype.delete',
6864 exec: function () {/*
6865 return typeof Set.prototype.delete === "function";
6866 */},
6867 res: {
6868 tr: true,
6869 babel: true,
6870 typescript: typescript.corejs,
6871 closure: true,
6872 ejs: true,
6873 es6shim: true,
6874 ie11: true,
6875 firefox16: true,
6876 chrome21dev: flag,
6877 chrome38: true,
6878 safari71_8: true,
6879 safaritp: true,
6880 safari10: true,
6881 webkit: true,
6882 node012: true,
6883 xs6: true,
6884 jxa: true,
6885 },
6886 },
6887 {
6888 name: 'Set.prototype.clear',
6889 exec: function () {/*
6890 return typeof Set.prototype.clear === "function";
6891 */},
6892 res: {
6893 tr: true,
6894 babel: true,
6895 typescript: typescript.corejs,
6896 closure: true,
6897 ejs: true,
6898 es6shim: true,
6899 ie11: true,
6900 firefox23: true,
6901 chrome21dev: flag,
6902 chrome38: true,
6903 safari71_8: true,
6904 safaritp: true,
6905 safari10: true,
6906 webkit: true,
6907 node012: true,
6908 xs6: true,
6909 jxa: true,
6910 },
6911 },
6912 {
6913 name: 'Set.prototype.forEach',
6914 exec: function () {/*
6915 return typeof Set.prototype.forEach === "function";
6916 */},
6917 res: {
6918 tr: true,
6919 babel: true,
6920 typescript: typescript.corejs,
6921 closure: true,
6922 ejs: true,
6923 es6shim: true,
6924 ie11: true,
6925 firefox25: true,
6926 chrome36: flag,
6927 chrome38: true,
6928 safari71_8: true,
6929 safaritp: true,
6930 safari10: true,
6931 webkit: true,
6932 node012: true,
6933 xs6: true,
6934 jxa: true,
6935 },
6936 },
6937 {
6938 name: 'Set.prototype.keys',
6939 exec: function () {/*
6940 return typeof Set.prototype.keys === "function";
6941 */},
6942 res: {
6943 tr: true,
6944 babel: true,
6945 typescript: typescript.corejs,
6946 closure: true,
6947 ejs: true,
6948 es6shim: true,
6949 edge12: true,
6950 firefox24: true,
6951 safari71_8: true,
6952 safaritp: true,
6953 safari10: true,
6954 webkit: true,
6955 chrome38: true,
6956 node012: true,
6957 xs6: true,
6958 jxa: true,
6959 },
6960 },
6961 {
6962 name: 'Set.prototype.values',
6963 exec: function () {/*
6964 return typeof Set.prototype.values === "function";
6965 */},
6966 res: {
6967 tr: true,
6968 babel: true,
6969 typescript: typescript.corejs,
6970 closure: true,
6971 ejs: true,
6972 es6shim: true,
6973 edge12: true,
6974 firefox24: true,
6975 safari71_8: true,
6976 safaritp: true,
6977 safari10: true,
6978 webkit: true,
6979 chrome37: flag,
6980 chrome38: true,
6981 node012: true,
6982 xs6: true,
6983 jxa: true,
6984 },
6985 },
6986 {
6987 name: 'Set.prototype.entries',
6988 exec: function () {/*
6989 return typeof Set.prototype.entries === "function";
6990 */},
6991 res: {
6992 tr: true,
6993 babel: true,
6994 typescript: typescript.corejs,
6995 closure: true,
6996 ejs: true,
6997 es6shim: true,
6998 edge12: true,
6999 firefox24: true,
7000 safari71_8: true,
7001 safaritp: true,
7002 safari10: true,
7003 webkit: true,
7004 chrome37: flag,
7005 chrome38: true,
7006 node012: true,
7007 xs6: true,
7008 jxa: true,
7009 },
7010 },
7011 {
7012 name: 'Set.prototype[Symbol.iterator]',
7013 exec: function () {/*
7014 return typeof Set.prototype[Symbol.iterator] === "function";
7015 */},
7016 res: {
7017 tr: true,
7018 babel: true,
7019 typescript: typescript.corejs,
7020 closure: true,
7021 chrome51: true,
7022 ejs: true,
7023 firefox36: true,
7024 chrome37: flag,
7025 chrome38: true,
7026 safari9: true,
7027 safaritp: true,
7028 webkit: true,
7029 edge12: true,
7030 node012: true,
7031 xs6: true,
7032 jxa: true,
7033 },
7034 },
7035 {
7036 name: 'Set.prototype isn\'t an instance',
7037 exec: function () {/*
7038 new Set();
7039 var obj = {};
7040 try {
7041 Set.prototype.has(obj);
7042 }
7043 catch(e) {
7044 return true;
7045 }
7046 */},
7047 res: temp.basicSet,
7048 },
7049 {
7050 name: 'Set iterator prototype chain',
7051 exec: function () {/*
7052 // Iterator instance
7053 var iterator = new Set()[Symbol.iterator]();
7054 // %SetIteratorPrototype%
7055 var proto1 = Object.getPrototypeOf(iterator);
7056 // %IteratorPrototype%
7057 var proto2 = Object.getPrototypeOf(proto1);
7058
7059 return proto2.hasOwnProperty(Symbol.iterator) &&
7060 !proto1 .hasOwnProperty(Symbol.iterator) &&
7061 !iterator .hasOwnProperty(Symbol.iterator) &&
7062 iterator[Symbol.iterator]() === iterator;
7063 */},
7064 res: {
7065 tr: true,
7066 babel: true,
7067 typescript: typescript.corejs,
7068 ejs: true,
7069 safari9: true,
7070 safaritp: true,
7071 webkit: true,
7072 chrome45: true,
7073 node4: true,
7074 edge13: true,
7075 firefox45: true,
7076 xs6: true,
7077 jxa: true,
7078 },
7079 },
7080 {
7081 name: 'Set[Symbol.species]',
7082 exec: function () {/*
7083 var prop = Object.getOwnPropertyDescriptor(Set, Symbol.species);
7084 return 'get' in prop && Set[Symbol.species] === Set;
7085 */},
7086 res: {
7087 babel: true,
7088 ejs: true,
7089 typescript: typescript.corejs,
7090 chrome50: flag,
7091 chrome51: true,
7092 firefox41: true,
7093 edge13: true,
7094 xs6: true,
7095 safaritp: true,
7096 safari10: true,
7097 webkit: true,
7098 },
7099 },
7100 ],
7101},
7102{
7103 name: 'WeakMap',
7104 category: 'built-ins',
7105 significance: 'medium',
7106 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-weakmap-objects',
7107 subtests: [
7108 {
7109 name: 'basic functionality',
7110 exec: function () {/*
7111 var key = {};
7112 var weakmap = new WeakMap();
7113
7114 weakmap.set(key, 123);
7115
7116 return weakmap.has(key) && weakmap.get(key) === 123;
7117 */},
7118 res: (temp.basicWeakMap = {
7119 tr: true,
7120 babel: true,
7121 closure: true,
7122 ejs: true,
7123 typescript: typescript.corejs,
7124 ie11: true,
7125 firefox6: true,
7126 chrome21dev: flag,
7127 chrome36: true,
7128 safari71_8: true,
7129 safaritp: true,
7130 safari10: true,
7131 webkit: true,
7132 node012: true,
7133 xs6: true,
7134 jxa: true,
7135 }),
7136 },
7137 {
7138 name: 'constructor arguments',
7139 exec: function () {/*
7140 var key1 = {};
7141 var key2 = {};
7142 var weakmap = new WeakMap([[key1, 123], [key2, 456]]);
7143
7144 return weakmap.has(key1) && weakmap.get(key1) === 123 &&
7145 weakmap.has(key2) && weakmap.get(key2) === 456;
7146 */},
7147 res: {
7148 babel: true,
7149 closure: true,
7150 ejs: true,
7151 typescript: typescript.corejs,
7152 edge12: true,
7153 firefox36: true,
7154 chrome38: true,
7155 safari9: true,
7156 safaritp: true,
7157 webkit: true,
7158 node012: true,
7159 xs6: true,
7160 jxa: true,
7161 },
7162 },
7163 {
7164 name: 'constructor requires new',
7165 exec: function () {/*
7166 new WeakMap();
7167 try {
7168 WeakMap();
7169 return false;
7170 } catch(e) {
7171 return true;
7172 }
7173 */},
7174 res: {
7175 babel: true,
7176 ejs: true,
7177 typescript: typescript.corejs,
7178 ie11: true,
7179 chrome36: true,
7180 safari71_8: true,
7181 safaritp: true,
7182 safari10: true,
7183 webkit: true,
7184 node4: true,
7185 firefox42: true,
7186 xs6: true,
7187 jxa: true,
7188 },
7189 },
7190 {
7191 name: 'constructor accepts null',
7192 exec: function () {/*
7193 new WeakMap(null);
7194 return true;
7195 */},
7196 res: temp.basicWeakMap,
7197 },
7198 {
7199 name: 'constructor invokes set',
7200 exec: function () {/*
7201 var passed = false;
7202 var _set = WeakMap.prototype.set;
7203
7204 WeakMap.prototype.set = function(k, v) {
7205 passed = true;
7206 };
7207
7208 new WeakMap([ [{ }, 42] ]);
7209 WeakMap.prototype.set = _set;
7210
7211 return passed;
7212 */},
7213 res: {
7214 babel: true,
7215 closure: true,
7216 ejs: true,
7217 typescript: typescript.corejs,
7218 edge12: true,
7219 firefox37: true,
7220 chrome38: true,
7221 safari9: true,
7222 safaritp: true,
7223 webkit: true,
7224 node4: true,
7225 xs6: true,
7226 jxa: true,
7227 },
7228 },
7229 {
7230 name: 'frozen objects as keys',
7231 exec: function () {/*
7232 var f = Object.freeze({});
7233 var m = new WeakMap;
7234 m.set(f, 42);
7235 return m.get(f) === 42;
7236 */},
7237 res: {
7238 tr: true,
7239 babel: true,
7240 closure: true,
7241 typescript: typescript.corejs,
7242 edge12: true,
7243 firefox6: true,
7244 chrome21dev: flag,
7245 chrome36: true,
7246 safari71_8: true,
7247 safaritp: true,
7248 safari10: true,
7249 webkit: true,
7250 node012: true,
7251 xs6: true,
7252 jxa: true,
7253 },
7254 },
7255 {
7256 name: 'iterator closing',
7257 exec: function () {/*
7258 var closed = false;
7259 var iter = global.__createIterableObject([1, 2, 3], {
7260 'return': function(){ closed = true; return {}; }
7261 });
7262 try {
7263 new WeakMap(iter);
7264 } catch(e){}
7265 return closed;
7266 */},
7267 res: {
7268 babel: true,
7269 typescript: typescript.corejs,
7270 edge14: true,
7271 chrome51: true,
7272 safari9: true,
7273 safaritp: true,
7274 webkit: true,
7275 xs6: true,
7276 jxa: true,
7277 },
7278 },
7279 {
7280 name: 'WeakMap.prototype.set returns this',
7281 exec: function () {/*
7282 var weakmap = new WeakMap();
7283 var key = {};
7284 return weakmap.set(key, 0) === weakmap;
7285 */},
7286 res: {
7287 tr: true,
7288 babel: true,
7289 closure: true,
7290 typescript: typescript.corejs,
7291 ejs: true,
7292 edge12: true,
7293 chrome38: true,
7294 firefox33: true,
7295 safari71_8: true,
7296 safaritp: true,
7297 safari10: true,
7298 webkit: true,
7299 node012: true,
7300 xs6: true,
7301 jxa: true,
7302 },
7303 },
7304 {
7305 name: 'WeakMap.prototype.delete',
7306 exec: function () {/*
7307 return typeof WeakMap.prototype.delete === "function";
7308 */},
7309 res: {
7310 tr: true,
7311 babel: true,
7312 closure: true,
7313 ejs: true,
7314 typescript: typescript.corejs,
7315 ie11: true,
7316 firefox6: true,
7317 chrome21dev: flag,
7318 chrome36: true,
7319 safari71_8: true,
7320 safaritp: true,
7321 safari10: true,
7322 webkit: true,
7323 node012: true,
7324 xs6: true,
7325 jxa: true,
7326 },
7327 },
7328 {
7329 name: 'no WeakMap.prototype.clear method',
7330 exec: function () {/*
7331 if (!("clear" in WeakMap.prototype)) {
7332 return true;
7333 }
7334 var m = new WeakMap();
7335 var key = {};
7336 m.set(key, 2);
7337 m.clear();
7338 return m.has(key);
7339 */},
7340 res: {
7341 babel: true,
7342 closure: true,
7343 ejs: true,
7344 typescript: typescript.corejs,
7345 chrome43: true,
7346 edge12: true,
7347 firefox6: true,
7348 firefox18: false,
7349 firefox46: true,
7350 safari9: true,
7351 safaritp: true,
7352 webkit: true,
7353 node4: true,
7354 xs6: true,
7355 jxa: true,
7356 },
7357 },
7358 {
7359 name: '.has, .get and .delete methods accept primitives',
7360 exec: function () {/*
7361 var m = new WeakMap;
7362 return m.has(1) === false
7363 && m.get(1) === undefined
7364 && m.delete(1) === false;
7365 */},
7366 res: {
7367 babel: true,
7368 closure: true,
7369 typescript: typescript.corejs,
7370 ie11: true,
7371 firefox38: true,
7372 chrome41: true,
7373 safari9: true,
7374 safaritp: true,
7375 webkit: true,
7376 iojs: true,
7377 ejs: null,
7378 xs6: null,
7379 jxa: null,
7380 },
7381 },
7382 {
7383 name: 'WeakMap.prototype isn\'t an instance',
7384 exec: function () {/*
7385 new WeakMap();
7386 var obj = {};
7387 try {
7388 WeakMap.prototype.has(obj);
7389 }
7390 catch(e) {
7391 return true;
7392 }
7393 */},
7394 res: Object.assign({}, temp.basicWeakMap, {
7395 closure: false,
7396 firefox6: false,
7397 firefox40: true,
7398 }),
7399 },
7400 ],
7401},
7402{
7403 name: 'WeakSet',
7404 category: 'built-ins',
7405 significance: 'small',
7406 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-weakset-objects',
7407 subtests: [
7408 {
7409 name: 'basic functionality',
7410 exec: function () {/*
7411 var obj1 = {};
7412 var weakset = new WeakSet();
7413
7414 weakset.add(obj1);
7415 weakset.add(obj1);
7416
7417 return weakset.has(obj1);
7418 */},
7419 res: (temp.basicWeakSet = {
7420 tr: true,
7421 babel: true,
7422 closure: true,
7423 typescript: typescript.corejs,
7424 ejs: true,
7425 edge12: true,
7426 firefox34: true,
7427 chrome30: flag,
7428 chrome36: true,
7429 safari9: true,
7430 safaritp: true,
7431 webkit: true,
7432 node012: true,
7433 xs6: true,
7434 jxa: true,
7435 }),
7436 },
7437 {
7438 name: 'constructor arguments',
7439 exec: function () {/*
7440 var obj1 = {}, obj2 = {};
7441 var weakset = new WeakSet([obj1, obj2]);
7442
7443 return weakset.has(obj1) && weakset.has(obj2);
7444 */},
7445 res: {
7446 babel: true,
7447 closure: true,
7448 typescript: typescript.corejs,
7449 ejs: true,
7450 edge12: true,
7451 firefox34: true,
7452 chrome38: true,
7453 safari9: true,
7454 safaritp: true,
7455 webkit: true,
7456 node012: true,
7457 xs6: true,
7458 jxa: true,
7459 },
7460 },
7461 {
7462 name: 'constructor requires new',
7463 exec: function () {/*
7464 new WeakSet();
7465 try {
7466 WeakSet();
7467 return false;
7468 } catch(e) {
7469 return true;
7470 }
7471 */},
7472 res: {
7473 babel: true,
7474 typescript: typescript.corejs,
7475 ejs: true,
7476 firefox37: true,
7477 edge12: true,
7478 chrome36: true,
7479 safari9: true,
7480 safaritp: true,
7481 webkit: true,
7482 node4: true,
7483 xs6: true,
7484 jxa: true,
7485 },
7486 },
7487 {
7488 name: 'constructor accepts null',
7489 exec: function () {/*
7490 new WeakSet(null);
7491 return true;
7492 */},
7493 res: temp.basicWeakSet,
7494 },
7495 {
7496 name: 'constructor invokes add',
7497 exec: function () {/*
7498 var passed = false;
7499 var _add = WeakSet.prototype.add;
7500
7501 WeakSet.prototype.add = function(v) {
7502 passed = true;
7503 };
7504
7505 new WeakSet([ { } ]);
7506 WeakSet.prototype.add = _add;
7507
7508 return passed;
7509 */},
7510 res: {
7511 babel: true,
7512 closure: true,
7513 ejs: true,
7514 typescript: typescript.corejs,
7515 edge12: true,
7516 firefox37: true,
7517 chrome38: true,
7518 safari9: true,
7519 safaritp: true,
7520 webkit: true,
7521 node4: true,
7522 xs6: true,
7523 jxa: true,
7524 },
7525 },
7526 {
7527 name: 'iterator closing',
7528 exec: function () {/*
7529 var closed = false;
7530 var iter = global.__createIterableObject([1, 2, 3], {
7531 'return': function(){ closed = true; return {}; }
7532 });
7533 try {
7534 new WeakSet(iter);
7535 } catch(e){}
7536 return closed;
7537 */},
7538 res: {
7539 babel: true,
7540 typescript: typescript.corejs,
7541 edge14: true,
7542 chrome51: true,
7543 safari9: true,
7544 safaritp: true,
7545 webkit: true,
7546 xs6: true,
7547 jxa: true,
7548 },
7549 },
7550 {
7551 name: 'WeakSet.prototype.add returns this',
7552 exec: function () {/*
7553 var weakset = new WeakSet();
7554 var obj = {};
7555 return weakset.add(obj) === weakset;
7556 */},
7557 res: {
7558 tr: true,
7559 babel: true,
7560 closure: true,
7561 typescript: typescript.corejs,
7562 ejs: true,
7563 edge12: true,
7564 chrome38: true,
7565 safari9: true,
7566 safaritp: true,
7567 webkit: true,
7568 firefox34: true,
7569 node012: true,
7570 xs6: true,
7571 jxa: true,
7572 },
7573 },
7574 {
7575 name: 'WeakSet.prototype.delete',
7576 exec: function () {/*
7577 return typeof WeakSet.prototype.delete === "function";
7578 */},
7579 res: {
7580 tr: true,
7581 babel: true,
7582 closure: true,
7583 typescript: typescript.corejs,
7584 ejs: true,
7585 edge12: true,
7586 firefox34: true,
7587 chrome30: flag,
7588 chrome36: true,
7589 safari9: true,
7590 safaritp: true,
7591 webkit: true,
7592 node012: true,
7593 xs6: true,
7594 jxa: true,
7595 },
7596 },
7597 {
7598 name: 'no WeakSet.prototype.clear method',
7599 exec: function () {/*
7600 if (!("clear" in WeakSet.prototype)) {
7601 return true;
7602 }
7603 var s = new WeakSet();
7604 var key = {};
7605 s.add(key);
7606 s.clear();
7607 return s.has(key);
7608 */},
7609 res: {
7610 babel: true,
7611 closure: true,
7612 typescript: typescript.corejs,
7613 ejs: true,
7614 chrome43: true,
7615 safari9: true,
7616 safaritp: true,
7617 webkit: true,
7618 edge12: true,
7619 firefox46: true,
7620 node4: true,
7621 xs6: true,
7622 jxa: true,
7623 },
7624 },
7625 {
7626 name: '.has and .delete methods accept primitives',
7627 exec: function () {/*
7628 var s = new WeakSet;
7629 return s.has(1) === false
7630 && s.delete(1) === false;
7631 */},
7632 res: {
7633 babel: true,
7634 closure: true,
7635 typescript: typescript.corejs,
7636 edge12: true,
7637 firefox36: true,
7638 chrome41: true,
7639 safari9: true,
7640 safaritp: true,
7641 webkit: true,
7642 iojs: true,
7643 ejs: null,
7644 xs6: null,
7645 jxa: null,
7646 },
7647 },
7648 {
7649 name: 'WeakSet.prototype isn\'t an instance',
7650 exec: function () {/*
7651 new WeakSet();
7652 var obj = {};
7653 try {
7654 WeakSet.prototype.has(obj);
7655 }
7656 catch(e) {
7657 return true;
7658 }
7659 */},
7660 res: Object.assign({}, temp.basicWeakSet, {
7661 closure: false,
7662 }),
7663 },
7664 ],
7665},
7666{
7667 name: 'Proxy',
7668 category: 'built-ins',
7669 significance: 'large',
7670 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots',
7671 note_id: 'proxy-enumerate',
7672 note_html: 'The 2015 version of the specification also specifies an <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots-enumerate">"enumerate" handler</a>, which was removed in the 2016 version.',
7673 subtests: [
7674 {
7675 name: 'constructor requires new',
7676 exec: function () {/*
7677 new Proxy({}, {});
7678 try {
7679 Proxy({}, {});
7680 return false;
7681 } catch(e) {
7682 return true;
7683 }
7684 */},
7685 res: {
7686 ejs: true,
7687 typescript: typescript.fallthrough,
7688 edge12: true,
7689 firefox18: true,
7690 xs6: true,
7691 chrome49: true,
7692 safaritp: true,
7693 safari10: true,
7694 webkit: true,
7695 },
7696 },
7697 {
7698 name: 'no "prototype" property',
7699 exec: function () {/*
7700 new Proxy({}, {});
7701 return !Proxy.hasOwnProperty('prototype');
7702 */},
7703 res: {
7704 ejs: true,
7705 typescript: typescript.fallthrough,
7706 edge12: true,
7707 firefox18: true,
7708 xs6: true,
7709 chrome49: true,
7710 safaritp: true,
7711 safari10: true,
7712 webkit: true,
7713 },
7714 },
7715 {
7716 name: '"get" handler',
7717 exec: function () {/*
7718 var proxied = { };
7719 var proxy = new Proxy(proxied, {
7720 get: function (t, k, r) {
7721 return t === proxied && k === "foo" && r === proxy && 5;
7722 }
7723 });
7724 return proxy.foo === 5;
7725 */},
7726 res: {
7727 ejs: true,
7728 typescript: typescript.fallthrough,
7729 edge12: true,
7730 firefox18: true,
7731 xs6: true,
7732 chrome49: true,
7733 safaritp: true,
7734 safari10: true,
7735 webkit: true,
7736 },
7737 },
7738 {
7739 name: '"get" handler, instances of proxies',
7740 exec: function () {/*
7741 var proxied = { };
7742 var proxy = Object.create(new Proxy(proxied, {
7743 get: function (t, k, r) {
7744 return t === proxied && k === "foo" && r === proxy && 5;
7745 }
7746 }));
7747 return proxy.foo === 5;
7748 */},
7749 res: {
7750 ejs: true,
7751 typescript: typescript.fallthrough,
7752 edge12: true,
7753 firefox18: {
7754 val: false,
7755 note_id: 'fx-proxy-get',
7756 note_html: 'Firefox 18 up to 37 doesn\'t allow a proxy\'s <code>"get"</code> handler to be triggered via the prototype chain, unless the proxied object does possess the named property (or the proxy\'s <code>"has"</code> handler reports it as present).'
7757 },
7758 firefox38: true,
7759 xs6: true,
7760 chrome49: true,
7761 safaritp: true,
7762 safari10: true,
7763 webkit: true,
7764 },
7765 },
7766 {
7767 name: '"get" handler invariants',
7768 exec: function () {/*
7769 var passed = false;
7770 var proxied = { };
7771 var proxy = new Proxy(proxied, {
7772 get: function () {
7773 passed = true;
7774 return 4;
7775 }
7776 });
7777 // The value reported for a property must be the same as the value of the corresponding
7778 // target object property if the target object property is a non-writable,
7779 // non-configurable own data property.
7780 Object.defineProperty(proxied, "foo", { value: 5, enumerable: true });
7781 try {
7782 proxy.foo;
7783 return false;
7784 }
7785 catch(e) {}
7786 // The value reported for a property must be undefined if the corresponding target
7787 // object property is a non-configurable own accessor property that has undefined
7788 // as its [[Get]] attribute.
7789 Object.defineProperty(proxied, "bar",
7790 { set: function(){}, enumerable: true });
7791 try {
7792 proxy.bar;
7793 return false;
7794 }
7795 catch(e) {}
7796 return passed;
7797 */},
7798 res: {
7799 ejs: true,
7800 typescript: typescript.fallthrough,
7801 edge12: true,
7802 firefox18: true,
7803 xs6: true,
7804 chrome49: true,
7805 safaritp: true,
7806 safari10: true,
7807 webkit: true,
7808 },
7809 },
7810 {
7811 name: '"set" handler',
7812 exec: function () {/*
7813 var proxied = { };
7814 var passed = false;
7815 var proxy = new Proxy(proxied, {
7816 set: function (t, k, v, r) {
7817 passed = t === proxied && k + v === "foobar" && r === proxy;
7818 }
7819 });
7820 proxy.foo = "bar";
7821 return passed;
7822 */},
7823 res: {
7824 ejs: true,
7825 typescript: typescript.fallthrough,
7826 edge12: true,
7827 firefox18: true,
7828 xs6: true,
7829 chrome49: true,
7830 safaritp: true,
7831 safari10: true,
7832 webkit: true,
7833 },
7834 },
7835 {
7836 name: '"set" handler, instances of proxies',
7837 exec: function () {/*
7838 var proxied = { };
7839 var passed = false;
7840 var proxy = Object.create(new Proxy(proxied, {
7841 set: function (t, k, v, r) {
7842 passed = t === proxied && k + v === "foobar" && r === proxy;
7843 }
7844 }));
7845 proxy.foo = "bar";
7846 return passed;
7847 */},
7848 res: {
7849 ejs: true,
7850 typescript: typescript.fallthrough,
7851 edge12: true,
7852 firefox37: true,
7853 xs6: true,
7854 chrome49: true,
7855 safaritp: true,
7856 safari10: true,
7857 webkit: true,
7858 },
7859 },
7860 {
7861 name: '"set" handler invariants',
7862 exec: function () {/*
7863 var passed = false;
7864 new Proxy({},{});
7865 // Cannot change the value of a property to be different from the value of
7866 // the corresponding target object if the corresponding target object
7867 // property is a non-writable, non-configurable own data property.
7868 var proxied = {};
7869 var proxy = new Proxy(proxied, {
7870 set: function () {
7871 passed = true;
7872 return true;
7873 }
7874 });
7875 Object.defineProperty(proxied, "foo", { value: 2, enumerable: true });
7876 proxy.foo = 2;
7877 try {
7878 proxy.foo = 4;
7879 return false;
7880 } catch(e) {}
7881 // Cannot set the value of a property if the corresponding target
7882 // object property is a non-configurable own accessor property
7883 // that has undefined as its [[Set]] attribute.
7884 Object.defineProperty(proxied, "bar",
7885 { get: function(){}, enumerable: true });
7886 try {
7887 proxy.bar = 2;
7888 return false;
7889 } catch(e) {}
7890 return passed;
7891 */},
7892 res: {
7893 ejs: true,
7894 typescript: typescript.fallthrough,
7895 edge12: true,
7896 firefox18: true,
7897 xs6: true,
7898 chrome49: true,
7899 safaritp: true,
7900 safari10: true,
7901 webkit: true,
7902 },
7903 },
7904 {
7905 name: '"has" handler',
7906 exec: function () {/*
7907 var proxied = {};
7908 var passed = false;
7909 "foo" in new Proxy(proxied, {
7910 has: function (t, k) {
7911 passed = t === proxied && k === "foo";
7912 }
7913 });
7914 return passed;
7915 */},
7916 res: {
7917 ejs: true,
7918 typescript: typescript.fallthrough,
7919 edge12: true,
7920 firefox18: true,
7921 xs6: true,
7922 chrome49: true,
7923 safaritp: true,
7924 safari10: true,
7925 webkit: true,
7926 },
7927 },
7928 {
7929 name: '"has" handler, instances of proxies',
7930 exec: function () {/*
7931 var proxied = {};
7932 var passed = false;
7933 "foo" in Object.create(new Proxy(proxied, {
7934 has: function (t, k) {
7935 passed = t === proxied && k === "foo";
7936 }
7937 }));
7938 return passed;
7939 */},
7940 res: {
7941 ejs: true,
7942 typescript: typescript.fallthrough,
7943 edge12: true,
7944 firefox18: true,
7945 xs6: true,
7946 chrome49: true,
7947 safaritp: true,
7948 safari10: true,
7949 webkit: true,
7950 },
7951 },
7952 {
7953 name: '"has" handler invariants',
7954 exec: function () {/*
7955 var passed = false;
7956 new Proxy({},{});
7957 // A property cannot be reported as non-existent, if it exists as a
7958 // non-configurable own property of the target object.
7959 var proxied = {};
7960 var proxy = new Proxy(proxied, {
7961 has: function () {
7962 passed = true;
7963 return false;
7964 }
7965 });
7966 Object.defineProperty(proxied, "foo", { value: 2, writable: true, enumerable: true });
7967 try {
7968 'foo' in proxy;
7969 return false;
7970 } catch(e) {}
7971 // A property cannot be reported as non-existent, if it exists as an
7972 // own property of the target object and the target object is not extensible.
7973 proxied.bar = 2;
7974 Object.preventExtensions(proxied);
7975 try {
7976 'bar' in proxy;
7977 return false;
7978 } catch(e) {}
7979 return passed;
7980 */},
7981 res: {
7982 ejs: true,
7983 typescript: typescript.fallthrough,
7984 edge12: true,
7985 firefox18: true,
7986 xs6: true,
7987 chrome49: true,
7988 safaritp: true,
7989 safari10: true,
7990 webkit: true,
7991 },
7992 },
7993 {
7994 name: '"deleteProperty" handler',
7995 exec: function () {/*
7996 var proxied = {};
7997 var passed = false;
7998 delete new Proxy(proxied, {
7999 deleteProperty: function (t, k) {
8000 passed = t === proxied && k === "foo";
8001 }
8002 }).foo;
8003 return passed;
8004 */},
8005 res: {
8006 ejs: true,
8007 typescript: typescript.fallthrough,
8008 edge12: true,
8009 firefox18: true,
8010 xs6: true,
8011 chrome49: true,
8012 safaritp: true,
8013 safari10: true,
8014 webkit: true,
8015 },
8016 },
8017 {
8018 name: '"deleteProperty" handler invariant',
8019 exec: function () {/*
8020 var passed = false;
8021 new Proxy({},{});
8022 // A property cannot be reported as deleted, if it exists as a non-configurable
8023 // own property of the target object.
8024 var proxied = {};
8025 Object.defineProperty(proxied, "foo", { value: 2, writable: true, enumerable: true });
8026 try {
8027 delete new Proxy(proxied, {
8028 deleteProperty: function () {
8029 passed = true;
8030 return true;
8031 }
8032 }).foo;
8033 return false;
8034 } catch(e) {}
8035 return passed;
8036 */},
8037 res: {
8038 ejs: true,
8039 typescript: typescript.fallthrough,
8040 edge12: true,
8041 firefox18: true,
8042 xs6: true,
8043 chrome49: true,
8044 safaritp: true,
8045 safari10: true,
8046 webkit: true,
8047 },
8048 },
8049 {
8050 name: '"getOwnPropertyDescriptor" handler',
8051 exec: function () {/*
8052 var proxied = {};
8053 var fakeDesc = { value: "foo", configurable: true };
8054 var returnedDesc = Object.getOwnPropertyDescriptor(
8055 new Proxy(proxied, {
8056 getOwnPropertyDescriptor: function (t, k) {
8057 return t === proxied && k === "foo" && fakeDesc;
8058 }
8059 }),
8060 "foo"
8061 );
8062 return (returnedDesc.value === fakeDesc.value
8063 && returnedDesc.configurable === fakeDesc.configurable
8064 && returnedDesc.writable === false
8065 && returnedDesc.enumerable === false);
8066 */},
8067 res: {
8068 typescript: typescript.fallthrough,
8069 edge12: true,
8070 firefox18: {
8071 val: false,
8072 note_id: 'fx-proxy-getown',
8073 note_html: 'From Firefox 18 up to 29, the <code>getOwnPropertyDescriptor</code> handler can only report non-existent properties if the proxy target is non-extensible rather than extensible'
8074 },
8075 firefox23: { val: false, note_id: 'fx-proxy-getown' },
8076 firefox30: true,
8077 xs6: true,
8078 chrome49: true,
8079 safaritp: true,
8080 safari10: true,
8081 webkit: true,
8082 },
8083 },
8084 {
8085 name: '"getOwnPropertyDescriptor" handler invariants',
8086 exec: function () {/*
8087 var passed = false;
8088 new Proxy({},{});
8089 // A property cannot be reported as non-existent, if it exists as a non-configurable
8090 // own property of the target object.
8091 var proxied = {};
8092 var proxy = new Proxy(proxied, {
8093 getOwnPropertyDescriptor: function () {
8094 passed = true;
8095 return undefined;
8096 }
8097 });
8098 Object.defineProperty(proxied, "foo", { value: 2, writable: true, enumerable: true });
8099 try {
8100 Object.getOwnPropertyDescriptor(proxy, "foo");
8101 return false;
8102 } catch(e) {}
8103 // A property cannot be reported as non-existent, if it exists as an own property
8104 // of the target object and the target object is not extensible.
8105 proxied.bar = 3;
8106 Object.preventExtensions(proxied);
8107 try {
8108 Object.getOwnPropertyDescriptor(proxy, "bar");
8109 return false;
8110 } catch(e) {}
8111 // A property cannot be reported as existent, if it does not exists as an own property
8112 // of the target object and the target object is not extensible.
8113 try {
8114 Object.getOwnPropertyDescriptor(new Proxy(proxied, {
8115 getOwnPropertyDescriptor: function() {
8116 return { value: 2, configurable: true, writable: true, enumerable: true };
8117 }}), "baz");
8118 return false;
8119 } catch(e) {}
8120 // A property cannot be reported as non-configurable, if it does not exists as an own
8121 // property of the target object or if it exists as a configurable own property of
8122 // the target object.
8123 try {
8124 Object.getOwnPropertyDescriptor(new Proxy({}, {
8125 getOwnPropertyDescriptor: function() {
8126 return { value: 2, configurable: false, writable: true, enumerable: true };
8127 }}), "baz");
8128 return false;
8129 } catch(e) {}
8130 try {
8131 Object.getOwnPropertyDescriptor(new Proxy({baz:1}, {
8132 getOwnPropertyDescriptor: function() {
8133 return { value: 1, configurable: false, writable: true, enumerable: true };
8134 }}), "baz");
8135 return false;
8136 } catch(e) {}
8137 return passed;
8138 */},
8139 res: {
8140 typescript: typescript.fallthrough,
8141 edge12: true,
8142 firefox32: true,
8143 xs6: true,
8144 chrome49: true,
8145 safaritp: true,
8146 safari10: true,
8147 webkit: true,
8148 },
8149 },
8150 {
8151 name: '"defineProperty" handler',
8152 exec: function () {/*
8153 var proxied = {};
8154 var passed = false;
8155 Object.defineProperty(
8156 new Proxy(proxied, {
8157 defineProperty: function (t, k, d) {
8158 passed = t === proxied && k === "foo" && d.value === 5;
8159 return true;
8160 }
8161 }),
8162 "foo",
8163 { value: 5, configurable: true }
8164 );
8165 return passed;
8166 */},
8167 res: {
8168 ejs: true,
8169 typescript: typescript.fallthrough,
8170 edge12: true,
8171 firefox18: true,
8172 xs6: true,
8173 chrome49: true,
8174 safaritp: true,
8175 safari10: true,
8176 webkit: true,
8177 },
8178 },
8179 {
8180 name: '"defineProperty" handler invariants',
8181 exec: function () {/*
8182 var passed = false;
8183 new Proxy({},{});
8184 // A property cannot be added, if the target object is not extensible.
8185 var proxied = Object.preventExtensions({});
8186 var proxy = new Proxy(proxied, {
8187 defineProperty: function() {
8188 passed = true;
8189 return true;
8190 }
8191 });
8192 try {
8193 Object.defineProperty(proxy, "foo", { value: 2 });
8194 return false;
8195 } catch(e) {}
8196 // A property cannot be non-configurable, unless there exists a corresponding
8197 // non-configurable own property of the target object.
8198 try {
8199 Object.defineProperty(
8200 new Proxy({ bar: true }, {
8201 defineProperty: function () {
8202 return true;
8203 }
8204 }),
8205 "bar",
8206 { value: 5, configurable: false, writable: true, enumerable: true }
8207 );
8208 return false;
8209 } catch(e) {}
8210 return passed;
8211 */},
8212 res: {
8213 ejs: true,
8214 typescript: typescript.fallthrough,
8215 edge12: true,
8216 firefox32: true,
8217 xs6: true,
8218 chrome49: true,
8219 safaritp: true,
8220 safari10: true,
8221 webkit: true,
8222 },
8223 },
8224 {
8225 name: '"getPrototypeOf" handler',
8226 exec: function () {/*
8227 var proxied = {};
8228 var fakeProto = {};
8229 var proxy = new Proxy(proxied, {
8230 getPrototypeOf: function (t) {
8231 return t === proxied && fakeProto;
8232 }
8233 });
8234 return Object.getPrototypeOf(proxy) === fakeProto;
8235 */},
8236 res: {
8237 ejs: true,
8238 typescript: typescript.fallthrough,
8239 edge12: true,
8240 firefox49: true,
8241 xs6: true,
8242 chrome49: true,
8243 safaritp: true,
8244 safari10: true,
8245 webkit: true,
8246 },
8247 },
8248 {
8249 name: '"getPrototypeOf" handler invariant',
8250 exec: function () {/*
8251 var passed = false;
8252 new Proxy({},{});
8253 // If the target object is not extensible, [[GetPrototypeOf]] applied to the proxy object
8254 // must return the same value as [[GetPrototypeOf]] applied to the proxy object's target object.
8255 try {
8256 Object.getPrototypeOf(new Proxy(Object.preventExtensions({}), {
8257 getPrototypeOf: function () {
8258 passed = true;
8259 return {};
8260 }
8261 }));
8262 return false;
8263 } catch(e) {}
8264 return passed;
8265 */},
8266 res: {
8267 ejs: true,
8268 typescript: typescript.fallthrough,
8269 edge12: true,
8270 firefox49: true,
8271 xs6: true,
8272 chrome49: true,
8273 safaritp: true,
8274 safari10: true,
8275 webkit: true,
8276 },
8277 },
8278 {
8279 name: '"setPrototypeOf" handler',
8280 exec: function () {/*
8281 var proxied = {};
8282 var newProto = {};
8283 var passed = false;
8284 Object.setPrototypeOf(
8285 new Proxy(proxied, {
8286 setPrototypeOf: function (t, p) {
8287 passed = t === proxied && p === newProto;
8288 return true;
8289 }
8290 }),
8291 newProto
8292 );
8293 return passed;
8294 */},
8295 res: {
8296 ejs: true,
8297 typescript: typescript.fallthrough,
8298 edge12: true,
8299 firefox49: true,
8300 xs6: true,
8301 chrome49: true,
8302 safaritp: true,
8303 safari10: true,
8304 webkit: true,
8305 },
8306 },
8307 {
8308 name: '"setPrototypeOf" handler invariant',
8309 exec: function () {/*
8310 var passed = false;
8311 new Proxy({},{});
8312 Object.setPrototypeOf({},{});
8313 // If the target object is not extensible, the argument value must be the
8314 // same as the result of [[GetPrototypeOf]] applied to target object.
8315 try {
8316 Object.setPrototypeOf(
8317 new Proxy(Object.preventExtensions({}), {
8318 setPrototypeOf: function () {
8319 passed = true;
8320 return true;
8321 }
8322 }),{});
8323 return false;
8324 } catch(e) {}
8325 return passed;
8326 */},
8327 res: {
8328 ejs: true,
8329 typescript: typescript.fallthrough,
8330 edge12: true,
8331 firefox49: true,
8332 xs6: true,
8333 chrome49: true,
8334 safaritp: true,
8335 safari10: true,
8336 webkit: true,
8337 },
8338 },
8339 {
8340 name: '"isExtensible" handler',
8341 exec: function () {/*
8342 var proxied = {};
8343 var passed = false;
8344 Object.isExtensible(
8345 new Proxy(proxied, {
8346 isExtensible: function (t) {
8347 passed = t === proxied; return true;
8348 }
8349 })
8350 );
8351 return passed;
8352 */},
8353 res: {
8354 ejs: true,
8355 typescript: typescript.fallthrough,
8356 firefox31: true,
8357 edge12: true,
8358 xs6: true,
8359 chrome49: true,
8360 safaritp: true,
8361 safari10: true,
8362 webkit: true,
8363 },
8364 },
8365 {
8366 name: '"isExtensible" handler invariant',
8367 exec: function () {/*
8368 var passed = false;
8369 new Proxy({},{});
8370 // [[IsExtensible]] applied to the proxy object must return the same value
8371 // as [[IsExtensible]] applied to the proxy object's target object with the same argument.
8372 try {
8373 Object.isExtensible(new Proxy({}, {
8374 isExtensible: function (t) {
8375 passed = true;
8376 return false;
8377 }
8378 }));
8379 return false;
8380 } catch(e) {}
8381 try {
8382 Object.isExtensible(new Proxy(Object.preventExtensions({}), {
8383 isExtensible: function (t) {
8384 return true;
8385 }
8386 }));
8387 return false;
8388 } catch(e) {}
8389 return true;
8390 */},
8391 res: {
8392 ejs: true,
8393 typescript: typescript.fallthrough,
8394 firefox31: true,
8395 edge12: true,
8396 xs6: true,
8397 chrome49: true,
8398 safaritp: true,
8399 safari10: true,
8400 webkit: true,
8401 },
8402 },
8403 {
8404 name: '"preventExtensions" handler',
8405 exec: function () {/*
8406 var proxied = {};
8407 var passed = false;
8408 Object.preventExtensions(
8409 new Proxy(proxied, {
8410 preventExtensions: function (t) {
8411 passed = t === proxied;
8412 return Object.preventExtensions(proxied);
8413 }
8414 })
8415 );
8416 return passed;
8417 */},
8418 res: {
8419 ejs: true,
8420 typescript: typescript.fallthrough,
8421 firefox23: true,
8422 edge12: true,
8423 xs6: true,
8424 chrome49: true,
8425 safaritp: true,
8426 safari10: true,
8427 webkit: true,
8428 },
8429 },
8430 {
8431 name: '"preventExtensions" handler invariant',
8432 exec: function () {/*
8433 var passed = false;
8434 new Proxy({},{});
8435 // [[PreventExtensions]] applied to the proxy object only returns true
8436 // if [[IsExtensible]] applied to the proxy object's target object is false.
8437 try {
8438 Object.preventExtensions(new Proxy({}, {
8439 preventExtensions: function () {
8440 passed = true;
8441 return true;
8442 }
8443 }));
8444 return false;
8445 } catch(e) {}
8446 return passed;
8447 */},
8448 res: {
8449 ejs: true,
8450 typescript: typescript.fallthrough,
8451 firefox23: true,
8452 edge12: true,
8453 xs6: true,
8454 chrome49: true,
8455 safaritp: true,
8456 safari10: true,
8457 webkit: true,
8458 },
8459 },
8460 {
8461 name: '"ownKeys" handler',
8462 exec: function () {/*
8463 var proxied = {};
8464 var passed = false;
8465 Object.keys(
8466 new Proxy(proxied, {
8467 ownKeys: function (t) {
8468 passed = t === proxied; return [];
8469 }
8470 })
8471 );
8472 return passed;
8473 */},
8474 res: {
8475 typescript: typescript.fallthrough,
8476 firefox18: {
8477 val: false,
8478 note_id: 'fx-proxy-ownkeys',
8479 note_html: 'Available from Firefox 18 up to 33 as the draft standard <code>keys</code> handler'
8480 },
8481 firefox23: { val: false, note_id: 'fx-proxy-ownkeys' },
8482 firefox33: true,
8483 edge12: true,
8484 xs6: true,
8485 ejs: true,
8486 chrome49: true,
8487 safaritp: true,
8488 safari10: true,
8489 webkit: true,
8490 },
8491 },
8492 {
8493 name: '"ownKeys" handler invariant',
8494 exec: function () {/*
8495 var passed = false;
8496 new Proxy({},{});
8497 // The Type of each result List element is either String or Symbol.
8498 try {
8499 Object.keys(new Proxy({}, {
8500 ownKeys: function () {
8501 passed = true;
8502 return [2];
8503 }}));
8504 return false;
8505 } catch(e) {}
8506 // The result List must contain the keys of all non-configurable own properties of the target object.
8507 var proxied = {};
8508 Object.defineProperty(proxied, "foo", { value: 2, writable: true, enumerable: true });
8509 try {
8510 Object.keys(new Proxy(proxied, {
8511 ownKeys: function () {
8512 return [];
8513 }}));
8514 return false;
8515 } catch(e) {}
8516 // If the target object is not extensible, then the result List must contain all the keys
8517 // of the own properties of the target object and no other values.
8518 try {
8519 Object.keys(new Proxy(Object.preventExtensions({b:1}), {
8520 ownKeys: function () {
8521 return ['a'];
8522 }}));
8523 return false;
8524 } catch(e) {}
8525 return passed;
8526 */},
8527 res: {
8528 typescript: typescript.fallthrough,
8529 firefox18: { val: false, note_id: 'fx-proxy-ownkeys' },
8530 firefox33: true,
8531 edge12: true,
8532 xs6: true,
8533 ejs: true,
8534 chrome49: true,
8535 safaritp: true,
8536 safari10: true,
8537 webkit: true,
8538 },
8539 },
8540 {
8541 name: '"apply" handler',
8542 exec: function () {/*
8543 var proxied = function(){};
8544 var passed = false;
8545 var host = {
8546 method: new Proxy(proxied, {
8547 apply: function (t, thisArg, args) {
8548 passed = t === proxied && thisArg === host && args + "" === "foo,bar";
8549 }
8550 })
8551 };
8552 host.method("foo", "bar");
8553 return passed;
8554 */},
8555 res: {
8556 typescript: typescript.fallthrough,
8557 edge12: true,
8558 firefox18: true,
8559 xs6: true,
8560 chrome49: true,
8561 safaritp: true,
8562 safari10: true,
8563 webkit: true,
8564 },
8565 },
8566 {
8567 name: '"apply" handler invariant',
8568 exec: function () {/*
8569 var passed = false;
8570 new Proxy(function(){}, {
8571 apply: function () { passed = true; }
8572 })();
8573 // A Proxy exotic object only has a [[Call]] internal method if the
8574 // initial value of its [[ProxyTarget]] internal slot is an object
8575 // that has a [[Call]] internal method.
8576 try {
8577 new Proxy({}, {
8578 apply: function () {}
8579 })();
8580 return false;
8581 } catch(e) {}
8582 return passed;
8583 */},
8584 res: {
8585 typescript: typescript.fallthrough,
8586 edge12: true,
8587 firefox18: true,
8588 chrome50: true,
8589 xs6: true,
8590 safaritp: true,
8591 safari10: true,
8592 webkit: true,
8593 },
8594 },
8595 {
8596 name: '"construct" handler',
8597 exec: function () {/*
8598 var proxied = function(){};
8599 var passed = false;
8600 new new Proxy(proxied, {
8601 construct: function (t, args) {
8602 passed = t === proxied && args + "" === "foo,bar";
8603 return {};
8604 }
8605 })("foo","bar");
8606 return passed;
8607 */},
8608 res: {
8609 typescript: typescript.fallthrough,
8610 edge12: true,
8611 firefox18: true,
8612 xs6: true,
8613 chrome49: true,
8614 safaritp: true,
8615 safari10: true,
8616 webkit: true,
8617 },
8618 },
8619 {
8620 name: '"construct" handler invariants',
8621 exec: function () {/*
8622 var passed = false;
8623 new Proxy({},{});
8624 // A Proxy exotic object only has a [[Construct]] internal method if the
8625 // initial value of its [[ProxyTarget]] internal slot is an object
8626 // that has a [[Construct]] internal method.
8627 try {
8628 new new Proxy({}, {
8629 construct: function (t, args) {
8630 return {};
8631 }
8632 })();
8633 return false;
8634 } catch(e) {}
8635 // The result of [[Construct]] must be an Object.
8636 try {
8637 new new Proxy(function(){}, {
8638 construct: function (t, args) {
8639 passed = true;
8640 return 5;
8641 }
8642 })();
8643 return false;
8644 } catch(e) {}
8645 return passed;
8646 */},
8647 res: {
8648 typescript: typescript.fallthrough,
8649 edge12: true,
8650 firefox45: true,
8651 xs6: true,
8652 chrome49: true,
8653 safaritp: true,
8654 safari10: true,
8655 webkit: true,
8656 },
8657 },
8658 {
8659 name: 'Proxy.revocable',
8660 exec: function () {/*
8661 var obj = Proxy.revocable({}, { get: function() { return 5; } });
8662 var passed = (obj.proxy.foo === 5);
8663 obj.revoke();
8664 try {
8665 obj.proxy.foo;
8666 } catch(e) {
8667 passed &= e instanceof TypeError;
8668 }
8669 return passed;
8670 */},
8671 res: {
8672 typescript: typescript.fallthrough,
8673 edge12: true,
8674 firefox34: true,
8675 xs6: true,
8676 chrome49: true,
8677 safaritp: true,
8678 safari10: true,
8679 webkit: true,
8680 },
8681 },
8682 {
8683 name: 'Array.isArray support',
8684 exec: function () {/*
8685 return Array.isArray(new Proxy([], {}));
8686 */},
8687 res: {
8688 ejs: true,
8689 typescript: typescript.fallthrough,
8690 firefox18: true,
8691 edge12: true,
8692 xs6: true,
8693 chrome49: true,
8694 safaritp: true,
8695 safari10: true,
8696 webkit: true,
8697 },
8698 },
8699 {
8700 name: 'JSON.stringify support',
8701 exec: function () {/*
8702 return JSON.stringify(new Proxy(['foo'], {})) === '["foo"]';
8703 */},
8704 res: {
8705 ejs: true,
8706 typescript: typescript.fallthrough,
8707 firefox18: true, // a bug in FF18
8708 firefox23: false,
8709 firefox40: true,
8710 edge12: true,
8711 xs6: true,
8712 chrome49: true,
8713 safaritp: true,
8714 safari10: true,
8715 webkit: true,
8716 },
8717 },
8718 ],
8719},
8720{
8721 name: 'Proxy, internal \'get\' calls',
8722 category: 'misc',
8723 significance: 'tiny',
8724 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots',
8725 subtests: [
8726 {
8727 name: 'ToPrimitive',
8728 exec: function() {/*
8729 // ToPrimitive -> Get -> [[Get]]
8730 var get = [];
8731 var p = new Proxy({toString:Function()}, { get: function(o, k) { get.push(k); return o[k]; }});
8732 p + 3;
8733 return get[0] === Symbol.toPrimitive && get.slice(1) + '' === "valueOf,toString";
8734 */},
8735 res: {
8736 xs6: true,
8737 firefox44: true,
8738 ejs: true,
8739 chrome49: true,
8740 safaritp: true,
8741 safari10: true,
8742 webkit: true,
8743 },
8744 },
8745 {
8746 name: 'CreateListFromArrayLike',
8747 exec: function() {/*
8748 // CreateListFromArrayLike -> Get -> [[Get]]
8749 var get = [];
8750 var p = new Proxy({length:2, 0:0, 1:0}, { get: function(o, k) { get.push(k); return o[k]; }});
8751 Function.prototype.apply({}, p);
8752 return get + '' === "length,0,1";
8753 */},
8754 res: {
8755 ejs: true,
8756 edge12: true,
8757 firefox18: true,
8758 xs6: true,
8759 chrome49: true,
8760 safaritp: true,
8761 safari10: true,
8762 webkit: true,
8763 },
8764 },
8765 {
8766 name: 'instanceof operator',
8767 exec: function() {/*
8768 // InstanceofOperator -> GetMethod -> GetV -> [[Get]]
8769 // InstanceofOperator -> OrdinaryHasInstance -> Get -> [[Get]]
8770 var get = [];
8771 var p = new Proxy(Function(), { get: function(o, k) { get.push(k); return o[k]; }});
8772 ({}) instanceof p;
8773 return get[0] === Symbol.hasInstance && get.slice(1) + '' === "prototype";
8774 */},
8775 res: {
8776 edge14: flag,
8777 firefox50: true,
8778 chrome50: flag,
8779 chrome51: true,
8780 xs6: true,
8781 safaritp: true,
8782 safari10: true,
8783 webkit: true,
8784 },
8785 },
8786 {
8787 name: 'HasBinding',
8788 exec: function() {/*
8789 // HasBinding -> Get -> [[Get]]
8790 var get = [];
8791 var p = new Proxy({foo:1}, { get: function(o, k) { get.push(k); return o[k]; }});
8792 p[Symbol.unscopables] = p;
8793 with(p) {
8794 typeof foo;
8795 }
8796 return get[0] === Symbol.unscopables && get.slice(1) + '' === "foo";
8797 */},
8798 res: {
8799 xs6: true,
8800 ejs: { val: false, note_id: 'ejs-no-with' },
8801 firefox48: true,
8802 chrome49: true,
8803 safaritp: true,
8804 safari10: true,
8805 webkit: true,
8806 edge14: true,
8807 },
8808 },
8809 {
8810 name: 'CreateDynamicFunction',
8811 exec: function() {/*
8812 // CreateDynamicFunction -> GetPrototypeFromConstructor -> Get -> [[Get]]
8813 var get = [];
8814 var p = new Proxy(Function, { get: function(o, k) { get.push(k); return o[k]; }});
8815 new p;
8816 return get + '' === "prototype";
8817 */},
8818 res: {
8819 edge13: true,
8820 firefox45: true,
8821 xs6: true,
8822 chrome49: true,
8823 safaritp: true,
8824 safari10: true,
8825 webkit: true,
8826 },
8827 },
8828 {
8829 name: 'ClassDefinitionEvaluation',
8830 exec: function() {/*
8831 // ClassDefinitionEvaluation -> Get -> [[Get]]
8832 var get = [];
8833 var p = new Proxy(Function(), { get: function(o, k) { get.push(k); return o[k]; }});
8834 class C extends p {}
8835 return get + '' === "prototype";
8836 */},
8837 res: {
8838 edge12: flag,
8839 edge13: true,
8840 firefox45: true,
8841 xs6: true,
8842 ejs: true,
8843 chrome49: true,
8844 safaritp: true,
8845 safari10: true,
8846 webkit: true,
8847 },
8848 },
8849 {
8850 name: 'IteratorComplete, IteratorValue',
8851 exec: function() {/*
8852 // IteratorComplete -> Get -> [[Get]]
8853 // IteratorValue -> Get -> [[Get]]
8854 var get = [];
8855 var iterable = {};
8856 iterable[Symbol.iterator] = function() {
8857 return {
8858 next: function() {
8859 return new Proxy({ value: 2, done: false }, { get: function(o, k) { get.push(k); return o[k]; }});
8860 }
8861 };
8862 }
8863 var i = 0;
8864 for(var e of iterable) {
8865 if (++i >= 2) break;
8866 }
8867 return get + '' === "done,value,done,value";
8868 */},
8869 res: {
8870 ejs: true,
8871 edge12: true,
8872 firefox36: true,
8873 xs6: true,
8874 chrome49: true,
8875 safaritp: true,
8876 safari10: true,
8877 webkit: true,
8878 },
8879 },
8880 {
8881 name: 'ToPropertyDescriptor',
8882 exec: function() {/*
8883 // ToPropertyDescriptor -> Get -> [[Get]]
8884 var get = [];
8885 var p = new Proxy({
8886 enumerable: true, configurable: true, value: true,
8887 writable: true, get: Function(), set: Function()
8888 }, { get: function(o, k) { get.push(k); return o[k]; }});
8889 try {
8890 // This will throw, since it will have true for both "get" and "value",
8891 // but not before performing a Get on every property.
8892 Object.defineProperty({}, "foo", p);
8893 } catch(e) {
8894 return get + '' === "enumerable,configurable,value,writable,get,set";
8895 }
8896 */},
8897 res: {
8898 ejs: true,
8899 firefox18: true,
8900 edge13: true,
8901 xs6: true,
8902 chrome49: true,
8903 safaritp: true,
8904 safari10: true,
8905 webkit: true,
8906 },
8907 },
8908 {
8909 name: 'Object.assign',
8910 exec: function() {/*
8911 // Object.assign -> Get -> [[Get]]
8912 var get = [];
8913 var p = new Proxy({foo:1, bar:2}, { get: function(o, k) { get.push(k); return o[k]; }});
8914 Object.assign({}, p);
8915 return get + '' === "foo,bar";
8916 */},
8917 res: {
8918 edge12: true,
8919 firefox34: true,
8920 xs6: true,
8921 chrome49: true,
8922 safaritp: true,
8923 safari10: true,
8924 webkit: true,
8925 },
8926 },
8927 {
8928 name: 'Object.defineProperties',
8929 exec: function() {/*
8930 // Object.defineProperties -> Get -> [[Get]]
8931 var get = [];
8932 var p = new Proxy({foo:{}, bar:{}}, { get: function(o, k) { get.push(k); return o[k]; }});
8933 Object.defineProperties({}, p);
8934 return get + '' === "foo,bar";
8935 */},
8936 res: {
8937 edge12: true,
8938 firefox18: true,
8939 xs6: true,
8940 chrome49: true,
8941 safaritp: true,
8942 safari10: true,
8943 webkit: true,
8944 },
8945 },
8946 {
8947 name: 'Function.prototype.bind',
8948 exec: function() {/*
8949 // Function.prototype.bind -> Get -> [[Get]]
8950 var get = [];
8951 var p = new Proxy(Function(), { get: function(o, k) { get.push(k); return o[k]; }});
8952 Function.prototype.bind.call(p);
8953 return get + '' === "length,name";
8954 */},
8955 res: {
8956 edge12: true,
8957 firefox38: true,
8958 xs6: true,
8959 chrome49: true,
8960 safaritp: true,
8961 safari10: true,
8962 webkit: true,
8963 },
8964 },
8965 {
8966 name: 'Error.prototype.toString',
8967 exec: function() {/*
8968 // Error.prototype.toString -> Get -> [[Get]]
8969 var get = [];
8970 var p = new Proxy({}, { get: function(o, k) { get.push(k); return o[k]; }});
8971 Error.prototype.toString.call(p);
8972 return get + '' === "name,message";
8973 */},
8974 res: {
8975 ejs: true,
8976 edge12: true,
8977 firefox18: true,
8978 xs6: true,
8979 chrome49: true,
8980 safaritp: true,
8981 safari10: true,
8982 webkit: true,
8983 },
8984 },
8985 {
8986 name: 'String.raw',
8987 exec: function() {/*
8988 // String.raw -> Get -> [[Get]]
8989 var get = [];
8990 var raw = new Proxy({length: 2, 0: '', 1: ''}, { get: function(o, k) { get.push(k); return o[k]; }});
8991 var p = new Proxy({raw: raw}, { get: function(o, k) { get.push(k); return o[k]; }});
8992 String.raw(p);
8993 return get + '' === "raw,length,0,1";
8994 */},
8995 res: {
8996 ejs: true,
8997 edge12: true,
8998 xs6: true,
8999 firefox34: true,
9000 chrome49: true,
9001 safaritp: true,
9002 safari10: true,
9003 webkit: true,
9004 },
9005 },
9006 {
9007 name: 'RegExp constructor',
9008 exec: function() {/*
9009 // RegExp -> Get -> [[Get]]
9010 var get = [];
9011 var re = { constructor: null };
9012 re[Symbol.match] = true;
9013 var p = new Proxy(re, { get: function(o, k) { get.push(k); return o[k]; }});
9014 RegExp(p);
9015 return get[0] === Symbol.match && get.slice(1) + '' === "constructor,source,flags";
9016 */},
9017 res: {
9018 firefox42: true,
9019 edge14: flag,
9020 chrome50: true,
9021 xs6: true,
9022 ejs: true,
9023 safaritp: true,
9024 safari10: true,
9025 webkit: true,
9026 },
9027 },
9028 {
9029 name: 'RegExp.prototype.flags',
9030 exec: function() {/*
9031 // RegExp.prototype.flags -> Get -> [[Get]]
9032 var get = [];
9033 var p = new Proxy({}, { get: function(o, k) { get.push(k); return o[k]; }});
9034 Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags').get.call(p);
9035 return get + '' === "global,ignoreCase,multiline,unicode,sticky";
9036 */},
9037 res: {
9038 firefox37: true,
9039 firefox39: false,
9040 firefox46: true,
9041 xs6: true,
9042 chrome49: true,
9043 edge14: flag,
9044 safaritp: true,
9045 safari10: true,
9046 webkit: true,
9047 },
9048 },
9049 {
9050 name: 'RegExp.prototype.test',
9051 exec: function() {/*
9052 // RegExp.prototype.test -> RegExpExec -> Get -> [[Get]]
9053 var get = [];
9054 var p = new Proxy({ exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }});
9055 RegExp.prototype.test.call(p);
9056 return get + '' === "exec";
9057 */},
9058 res: {
9059 firefox46: true,
9060 edge14: flag,
9061 chrome51: true,
9062 xs6: true,
9063 safaritp: true,
9064 safari10: true,
9065 webkit: true,
9066 },
9067 },
9068 {
9069 name: 'RegExp.prototype.toString',
9070 exec: function() {/*
9071 // RegExp.prototype.toString -> Get -> [[Get]]
9072 var get = [];
9073 var p = new Proxy({}, { get: function(o, k) { get.push(k); return o[k]; }});
9074 RegExp.prototype.toString.call(p);
9075 return get + '' === "source,flags";
9076 */},
9077 res: {
9078 firefox39: null,
9079 firefox44: true,
9080 edge14: flag,
9081 chrome50: true,
9082 xs6: null,
9083 echojs: null,
9084 safaritp: true,
9085 safari10: true,
9086 webkit: true,
9087 },
9088 },
9089 {
9090 name: 'RegExp.prototype[Symbol.match]',
9091 exec: function() {/*
9092 // RegExp.prototype[Symbol.match] -> Get -> [[Get]]
9093 var get = [];
9094 var p = new Proxy({ exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }});
9095 RegExp.prototype[Symbol.match].call(p);
9096 p.global = true;
9097 RegExp.prototype[Symbol.match].call(p);
9098 return get + '' === "global,exec,global,unicode,exec";
9099 */},
9100 res: {
9101 edge14: flag,
9102 firefox49: true,
9103 chrome51: true,
9104 xs6: true,
9105 safaritp: true,
9106 safari10: true,
9107 webkit: true,
9108 },
9109 },
9110 {
9111 name: 'RegExp.prototype[Symbol.replace]',
9112 exec: function() {/*
9113 // RegExp.prototype[Symbol.replace] -> Get -> [[Get]]
9114 var get = [];
9115 var p = new Proxy({ exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }});
9116 RegExp.prototype[Symbol.replace].call(p);
9117 p.global = true;
9118 RegExp.prototype[Symbol.replace].call(p);
9119 return get + '' === "global,exec,global,unicode,exec";
9120 */},
9121 res: {
9122 edge14: flag,
9123 firefox49: true,
9124 chrome51: true,
9125 xs6: true,
9126 safaritp: true,
9127 safari10: true,
9128 webkit: true,
9129 },
9130 },
9131 {
9132 name: 'RegExp.prototype[Symbol.search]',
9133 exec: function() {/*
9134 // RegExp.prototype[Symbol.search] -> Get -> [[Get]]
9135 var get = [];
9136 var p = new Proxy({ exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }});
9137 RegExp.prototype[Symbol.search].call(p);
9138 return get + '' === "lastIndex,exec";
9139 */},
9140 res: {
9141 edge14: flag,
9142 firefox49: true,
9143 chrome51: true,
9144 xs6: true,
9145 safaritp: true,
9146 safari10: true,
9147 webkit: true,
9148 },
9149 },
9150 {
9151 name: 'RegExp.prototype[Symbol.split]',
9152 exec: function() {/*
9153 // RegExp.prototype[Symbol.split] -> Get -> [[Get]]
9154 var get = [];
9155 var constructor = Function();
9156 constructor[Symbol.species] = Object;
9157 var p = new Proxy({ constructor: constructor, flags: '', exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }});
9158 RegExp.prototype[Symbol.split].call(p, "");
9159 return get + '' === "constructor,flags,exec";
9160 */},
9161 res: {
9162 edge14: flag,
9163 firefox49: true,
9164 chrome51: true,
9165 xs6: true,
9166 ejs: true,
9167 safaritp: true,
9168 safari10: true,
9169 webkit: true,
9170 },
9171 },
9172 {
9173 name: 'Array.from',
9174 exec: function() {/*
9175 // Array.from -> Get -> [[Get]]
9176 var get = [];
9177 var p = new Proxy({length: 2, 0: '', 1: ''}, { get: function(o, k) { get.push(k); return o[k]; }});
9178 Array.from(p);
9179 return get[0] === Symbol.iterator && get.slice(1) + '' === "length,0,1";
9180 */},
9181 res: {
9182 ejs: true,
9183 firefox36: true,
9184 edge13: true,
9185 xs6: true,
9186 chrome49: true,
9187 safaritp: true,
9188 safari10: true,
9189 webkit: true,
9190 },
9191 },
9192 {
9193 name: 'Array.prototype.concat',
9194 exec: function() {/*
9195 // Array.prototype.concat -> Get -> [[Get]]
9196 var get = [];
9197 var arr = [1];
9198 arr.constructor = undefined;
9199 var p = new Proxy(arr, { get: function(o, k) { get.push(k); return o[k]; }});
9200 Array.prototype.concat.call(p,p);
9201 return get[0] === "constructor"
9202 && get[1] === Symbol.isConcatSpreadable
9203 && get[2] === "length"
9204 && get[3] === "0"
9205 && get[4] === get[1] && get[5] === get[2] && get[6] === get[3]
9206 && get.length === 7;
9207 */},
9208 res: {
9209 edge14: flag,
9210 chrome50: flag,
9211 chrome51: true,
9212 firefox48: true,
9213 xs6: true,
9214 ejs: true,
9215 safaritp: true,
9216 safari10: true,
9217 webkit: true,
9218 },
9219 },
9220 {
9221 name: 'Array.prototype iteration methods',
9222 exec: function() {/*
9223 // Array.prototype methods -> Get -> [[Get]]
9224 var methods = ['copyWithin', 'every', 'fill', 'filter', 'find', 'findIndex', 'forEach',
9225 'indexOf', 'join', 'lastIndexOf', 'map', 'reduce', 'reduceRight', 'some'];
9226 var get;
9227 var p = new Proxy({length: 2, 0: '', 1: ''}, { get: function(o, k) { get.push(k); return o[k]; }});
9228 for(var i = 0; i < methods.length; i+=1) {
9229 get = [];
9230 Array.prototype[methods[i]].call(p, Function());
9231 if (get + '' !== (
9232 methods[i] === 'fill' ? "length" :
9233 methods[i] === 'every' ? "length,0" :
9234 methods[i] === 'lastIndexOf' || methods[i] === 'reduceRight' ? "length,1,0" :
9235 "length,0,1"
9236 )) {
9237 return false;
9238 }
9239 }
9240 return true;
9241 */},
9242 res: {
9243 firefox32: true,
9244 chrome51: true,
9245 edge12: true,
9246 xs6: true,
9247 safaritp: true,
9248 safari10: true,
9249 webkit: true,
9250 },
9251 },
9252 {
9253 name: 'Array.prototype.pop',
9254 exec: function() {/*
9255 // Array.prototype.pop -> Get -> [[Get]]
9256 var get = [];
9257 var p = new Proxy([0,1,2,3], { get: function(o, k) { get.push(k); return o[k]; }});
9258 Array.prototype.pop.call(p);
9259 return get + '' === "length,3";
9260 */},
9261 res: {
9262 ejs: true,
9263 edge12: true,
9264 firefox18: true,
9265 xs6: true,
9266 chrome49: true,
9267 safaritp: true,
9268 safari10: true,
9269 webkit: true,
9270 },
9271 },
9272 {
9273 name: 'Array.prototype.reverse',
9274 exec: function() {/*
9275 // Array.prototype.reverse -> Get -> [[Get]]
9276 var get = [];
9277 var p = new Proxy([0,,2,,4,,], { get: function(o, k) { get.push(k); return o[k]; }});
9278 Array.prototype.reverse.call(p);
9279 return get + '' === "length,0,4,2";
9280 */},
9281 res: {
9282 edge12: true,
9283 firefox18: true,
9284 xs6: true,
9285 chrome49: true,
9286 safaritp: true,
9287 safari10: true,
9288 webkit: true,
9289 },
9290 },
9291 {
9292 name: 'Array.prototype.shift',
9293 exec: function() {/*
9294 // Array.prototype.shift -> Get -> [[Get]]
9295 var get = [];
9296 var p = new Proxy([0,1,2,3], { get: function(o, k) { get.push(k); return o[k]; }});
9297 Array.prototype.shift.call(p);
9298 return get + '' === "length,0,1,2,3";
9299 */},
9300 res: {
9301 ejs: true,
9302 edge12: true,
9303 firefox18: true,
9304 xs6: true,
9305 chrome49: true,
9306 safaritp: true,
9307 safari10: true,
9308 webkit: true,
9309 },
9310 },
9311 {
9312 name: 'Array.prototype.splice',
9313 exec: function() {/*
9314 // Array.prototype.splice -> Get -> [[Get]]
9315 var get = [];
9316 var p = new Proxy([0,1,2,3], { get: function(o, k) { get.push(k); return o[k]; }});
9317 Array.prototype.splice.call(p,1,1);
9318 Array.prototype.splice.call(p,1,0,1);
9319 return get + '' === "length,constructor,1,2,3,length,constructor,2,1";
9320 */},
9321 res: {
9322 ejs: true,
9323 edge13: true,
9324 firefox48: true,
9325 chrome50: flag,
9326 chrome51: true,
9327 xs6: true,
9328 safaritp: true,
9329 safari10: true,
9330 webkit: true,
9331 },
9332 },
9333 {
9334 name: 'Array.prototype.toString',
9335 exec: function() {/*
9336 // Array.prototype.toString -> Get -> [[Get]]
9337 var get = [];
9338 var p = new Proxy({ join:Function() }, { get: function(o, k) { get.push(k); return o[k]; }});
9339 Array.prototype.toString.call(p);
9340 return get + '' === "join";
9341 */},
9342 res: {
9343 ejs: true,
9344 edge12: true,
9345 firefox18: true,
9346 xs6: true,
9347 chrome49: true,
9348 safaritp: true,
9349 safari10: true,
9350 webkit: true,
9351 },
9352 },
9353 {
9354 name: 'JSON.stringify',
9355 exec: function() {/*
9356 // JSON.stringify -> Get -> [[Get]]
9357 var get = [];
9358 var p = new Proxy({}, { get: function(o, k) { get.push(k); return o[k]; }});
9359 JSON.stringify(p);
9360 return get + '' === "toJSON";
9361 */},
9362 res: {
9363 ejs: true,
9364 edge12: true,
9365 xs6: true,
9366 firefox18: true,
9367 chrome49: true,
9368 safaritp: true,
9369 safari10: true,
9370 webkit: true,
9371 },
9372 },
9373 {
9374 name: 'Promise resolve functions',
9375 exec: function() {/*
9376 // Promise resolve functions -> Get -> [[Get]]
9377 var get = [];
9378 var p = new Proxy({}, { get: function(o, k) { get.push(k); return o[k]; }});
9379 new Promise(function(resolve){ resolve(p); });
9380 return get + '' === "then";
9381 */},
9382 res: {
9383 ejs: true,
9384 edge12: true,
9385 firefox29: true,
9386 xs6: true,
9387 chrome49: true,
9388 safaritp: true,
9389 safari10: true,
9390 webkit: true,
9391 },
9392 },
9393 {
9394 name: 'String.prototype.match',
9395 exec: function() {/*
9396 // String.prototype.match -> Get -> [[Get]]
9397 var get = [];
9398 var proxied = {};
9399 proxied[Symbol.toPrimitive] = Function();
9400 var p = new Proxy(proxied, { get: function(o, k) { get.push(k); return o[k]; }});
9401 "".match(p);
9402 return get[0] === Symbol.match && get[1] === Symbol.toPrimitive && get.length === 2;
9403 */},
9404 res: {
9405 firefox49: true,
9406 chrome51: true,
9407 xs6: true,
9408 safaritp: true,
9409 safari10: true,
9410 webkit: true,
9411 },
9412 },
9413 {
9414 name: 'String.prototype.replace',
9415 exec: function() {/*
9416 // String.prototype.replace functions -> Get -> [[Get]]
9417 var get = [];
9418 var proxied = {};
9419 proxied[Symbol.toPrimitive] = Function();
9420 var p = new Proxy(proxied, { get: function(o, k) { get.push(k); return o[k]; }});
9421 "".replace(p);
9422 return get[0] === Symbol.replace && get[1] === Symbol.toPrimitive && get.length === 2;
9423 */},
9424 res: {
9425 firefox49: true,
9426 chrome50: true,
9427 xs6: true,
9428 ejs: true,
9429 safaritp: true,
9430 safari10: true,
9431 webkit: true,
9432 },
9433 },
9434 {
9435 name: 'String.prototype.search',
9436 exec: function() {/*
9437 // String.prototype.search functions -> Get -> [[Get]]
9438 var get = [];
9439 var proxied = {};
9440 proxied[Symbol.toPrimitive] = Function();
9441 var p = new Proxy(proxied, { get: function(o, k) { get.push(k); return o[k]; }});
9442 "".search(p);
9443 return get[0] === Symbol.search && get[1] === Symbol.toPrimitive && get.length === 2;
9444 */},
9445 res: {
9446 firefox49: true,
9447 chrome51: true,
9448 xs6: true,
9449 safaritp: true,
9450 safari10: true,
9451 webkit: true,
9452 },
9453 },
9454 {
9455 name: 'String.prototype.split',
9456 exec: function() {/*
9457 // String.prototype.split functions -> Get -> [[Get]]
9458 var get = [];
9459 var proxied = {};
9460 proxied[Symbol.toPrimitive] = Function();
9461 var p = new Proxy(proxied, { get: function(o, k) { get.push(k); return o[k]; }});
9462 "".split(p);
9463 return get[0] === Symbol.split && get[1] === Symbol.toPrimitive && get.length === 2;
9464 */},
9465 res: {
9466 firefox49: true,
9467 chrome50: true,
9468 xs6: true,
9469 ejs: true,
9470 safaritp: true,
9471 safari10: true,
9472 webkit: true,
9473 },
9474 },
9475 {
9476 name: 'Date.prototype.toJSON',
9477 exec: function() {/*
9478 // Date.prototype.toJSON -> ToPrimitive -> Get -> [[Get]]
9479 // Date.prototype.toJSON -> Invoke -> GetMethod -> GetV -> [[Get]]
9480 var get = [];
9481 var p = new Proxy({toString:Function(),toISOString:Function()}, { get: function(o, k) { get.push(k); return o[k]; }});
9482 Date.prototype.toJSON.call(p);
9483 return get[0] === Symbol.toPrimitive && get.slice(1) + '' === "valueOf,toString,toISOString";
9484 */},
9485 res: {
9486 xs6: true,
9487 firefox44: true,
9488 chrome49: true,
9489 safaritp: true,
9490 safari10: true,
9491 webkit: true,
9492 },
9493 },
9494 ],
9495},
9496{
9497 name: 'Proxy, internal \'set\' calls',
9498 category: 'misc',
9499 significance: 'tiny',
9500 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots',
9501 subtests: [
9502 {
9503 name: 'Object.assign',
9504 exec: function() {/*
9505 // Object.assign -> Set -> [[Set]]
9506 var set = [];
9507 var p = new Proxy({}, { set: function(o, k, v) { set.push(k); o[k] = v; return true; }});
9508 Object.assign(p, { foo: 1, bar: 2 });
9509 return set + '' === "foo,bar";
9510 */},
9511 res: {
9512 ejs: true,
9513 edge12: true,
9514 firefox34: true,
9515 xs6: true,
9516 chrome49: true,
9517 safaritp: true,
9518 safari10: true,
9519 webkit: true,
9520 },
9521 },
9522 {
9523 name: 'Array.from',
9524 exec: function() {/*
9525 // Array.from -> Set -> [[Set]]
9526 var set = [];
9527 var p = new Proxy({}, { set: function(o, k, v) { set.push(k); o[k] = v; return true; }});
9528 Array.from.call(function(){ return p; }, {length:2, 0:1, 1:2});
9529 return set + '' === "length";
9530 */},
9531 res: {
9532 edge12: true,
9533 ejs: true,
9534 firefox32: true,
9535 xs6: true,
9536 chrome49: true,
9537 safaritp: true,
9538 safari10: true,
9539 webkit: true,
9540 },
9541 },
9542 {
9543 name: 'Array.of',
9544 exec: function() {/*
9545 // Array.from -> Set -> [[Set]]
9546 var set = [];
9547 var p = new Proxy({}, { set: function(o, k, v) { set.push(k); o[k] = v; return true; }});
9548 Array.of.call(function(){ return p; }, 1, 2, 3);
9549 return set + '' === "length";
9550 */},
9551 res: {
9552 edge12: true,
9553 ejs: true,
9554 firefox25: true,
9555 xs6: true,
9556 chrome49: true,
9557 safaritp: true,
9558 safari10: true,
9559 webkit: true,
9560 },
9561 },
9562 {
9563 name: 'Array.prototype.copyWithin',
9564 exec: function() {/*
9565 // Array.prototype.copyWithin -> Set -> [[Set]]
9566 var set = [];
9567 var p = new Proxy([1,2,3,4,5,6], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }});
9568 p.copyWithin(0, 3);
9569 return set + '' === "0,1,2";
9570 */},
9571 res: {
9572 edge12: true,
9573 firefox41: true,
9574 xs6: true,
9575 chrome49: true,
9576 safaritp: true,
9577 safari10: true,
9578 webkit: true,
9579 },
9580 },
9581 {
9582 name: 'Array.prototype.fill',
9583 exec: function() {/*
9584 // Array.prototype.fill -> Set -> [[Set]]
9585 var set = [];
9586 var p = new Proxy([1,2,3,4,5,6], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }});
9587 p.fill(0, 3);
9588 return set + '' === "3,4,5";
9589 */},
9590 res: {
9591 edge12: true,
9592 firefox41: true,
9593 xs6: true,
9594 chrome49: true,
9595 safaritp: true,
9596 safari10: true,
9597 webkit: true,
9598 },
9599 },
9600 {
9601 name: 'Array.prototype.pop',
9602 exec: function() {/*
9603 // Array.prototype.pop -> Set -> [[Set]]
9604 var set = [];
9605 var p = new Proxy([], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }});
9606 p.pop();
9607 return set + '' === "length";
9608 */},
9609 res: {
9610 edge12: true,
9611 firefox18: true,
9612 xs6: true,
9613 chrome49: true,
9614 safaritp: true,
9615 safari10: true,
9616 webkit: true,
9617 },
9618 },
9619 {
9620 name: 'Array.prototype.push',
9621 exec: function() {/*
9622 // Array.prototype.push -> Set -> [[Set]]
9623 var set = [];
9624 var p = new Proxy([], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }});
9625 p.push(0,0,0);
9626 return set + '' === "0,1,2,length";
9627 */},
9628 res: {
9629 edge12: true,
9630 firefox18: true,
9631 xs6: true,
9632 chrome49: true,
9633 safaritp: true,
9634 safari10: true,
9635 webkit: true,
9636 },
9637 },
9638 {
9639 name: 'Array.prototype.reverse',
9640 exec: function() {/*
9641 // Array.prototype.reverse -> Set -> [[Set]]
9642 var set = [];
9643 var p = new Proxy([0,0,0,,], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }});
9644 p.reverse();
9645 return set + '' === "3,1,2";
9646 */},
9647 res: {
9648 edge12: true,
9649 firefox41: true,
9650 xs6: true,
9651 chrome49: true,
9652 safaritp: true,
9653 safari10: true,
9654 webkit: true,
9655 },
9656 },
9657 {
9658 name: 'Array.prototype.shift',
9659 exec: function() {/*
9660 // Array.prototype.shift -> Set -> [[Set]]
9661 var set = [];
9662 var p = new Proxy([0,0,,0], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }});
9663 p.shift();
9664 return set + '' === "0,2,length";
9665 */},
9666 res: {
9667 edge12: true,
9668 firefox18: true,
9669 firefox23: false,
9670 firefox41: true,
9671 xs6: true,
9672 chrome49: true,
9673 safaritp: true,
9674 safari10: true,
9675 webkit: true,
9676 },
9677 },
9678 {
9679 name: 'Array.prototype.splice',
9680 exec: function() {/*
9681 // Array.prototype.splice -> Set -> [[Set]]
9682 var set = [];
9683 var p = new Proxy([1,2,3], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }});
9684 p.splice(1,0,0);
9685 return set + '' === "3,2,1,length";
9686 */},
9687 res: {
9688 edge12: true,
9689 firefox42: true,
9690 xs6: true,
9691 chrome49: true,
9692 safaritp: true,
9693 safari10: true,
9694 webkit: true,
9695 },
9696 },
9697 {
9698 name: 'Array.prototype.unshift',
9699 exec: function() {/*
9700 // Array.prototype.unshift -> Set -> [[Set]]
9701 var set = [];
9702 var p = new Proxy([0,0,,0], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }});
9703 p.unshift(0,1);
9704 return set + '' === "5,3,2,0,1,length";
9705 */},
9706 res: {
9707 edge12: true,
9708 firefox42: true,
9709 xs6: true,
9710 chrome49: true,
9711 safaritp: true,
9712 safari10: true,
9713 webkit: true,
9714 },
9715 },
9716 ],
9717},
9718{
9719 name: 'Proxy, internal \'defineProperty\' calls',
9720 category: 'misc',
9721 significance: 'tiny',
9722 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots',
9723 subtests: [
9724 {
9725 name: '[[Set]]',
9726 exec: function() {/*
9727 // [[Set]] -> [[DefineOwnProperty]]
9728 var def = [];
9729 var p = new Proxy({foo:1, bar:2}, { defineProperty: function(o, v, desc) { def.push(v); Object.defineProperty(o, v, desc); return true; }});
9730 p.foo = 2; p.bar = 4;
9731 return def + '' === "foo,bar";
9732 */},
9733 res: {
9734 edge12: true,
9735 firefox37: true,
9736 chrome49: true,
9737 xs6: true,
9738 safaritp: true,
9739 safari10: true,
9740 webkit: true,
9741 },
9742 },
9743 {
9744 name: 'SetIntegrityLevel',
9745 exec: function() {/*
9746 // SetIntegrityLevel -> DefinePropertyOrThrow -> [[DefineOwnProperty]]
9747 var def = [];
9748 var p = new Proxy({foo:1, bar:2}, { defineProperty: function(o, v, desc) { def.push(v); Object.defineProperty(o, v, desc); return true; }});
9749 Object.freeze(p);
9750 return def + '' === "foo,bar";
9751 */},
9752 res: {
9753 edge12: true,
9754 firefox18: true,
9755 xs6: true,
9756 chrome49: true,
9757 safaritp: true,
9758 safari10: true,
9759 webkit: true,
9760 },
9761 },
9762 ],
9763},
9764{
9765 name: 'Proxy, internal \'deleteProperty\' calls',
9766 category: 'misc',
9767 significance: 'tiny',
9768 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots',
9769 subtests: [
9770 {
9771 name: 'Array.prototype.copyWithin',
9772 exec: function() {/*
9773 // Array.prototype.copyWithin -> DeletePropertyOrThrow -> [[Delete]]
9774 var del = [];
9775 var p = new Proxy([0,0,0,,,,], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }});
9776 p.copyWithin(0,3);
9777 return del + '' === "0,1,2";
9778 */},
9779 res: {
9780 edge12: true,
9781 firefox41: true,
9782 xs6: true,
9783 chrome49: true,
9784 safaritp: true,
9785 safari10: true,
9786 webkit: true,
9787 },
9788 },
9789 {
9790 name: 'Array.prototype.pop',
9791 exec: function() {/*
9792 // Array.prototype.pop -> DeletePropertyOrThrow -> [[Delete]]
9793 var del = [];
9794 var p = new Proxy([0,0,0], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }});
9795 p.pop();
9796 return del + '' === "2";
9797 */},
9798 res: {
9799 ejs: true,
9800 edge12: true,
9801 firefox18: true,
9802 firefox23: false,
9803 firefox40: true,
9804 xs6: true,
9805 chrome49: true,
9806 safaritp: true,
9807 safari10: true,
9808 webkit: true,
9809 },
9810 },
9811 {
9812 name: 'Array.prototype.reverse',
9813 exec: function() {/*
9814 // Array.prototype.reverse -> DeletePropertyOrThrow -> [[Delete]]
9815 var del = [];
9816 var p = new Proxy([0,,2,,4,,], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }});
9817 p.reverse();
9818 return del + '' === "0,4,2";
9819 */},
9820 res: {
9821 edge12: true,
9822 firefox18: true,
9823 firefox23: false,
9824 firefox40: true,
9825 xs6: true,
9826 chrome49: true,
9827 safaritp: true,
9828 safari10: true,
9829 webkit: true,
9830 },
9831 },
9832 {
9833 name: 'Array.prototype.shift',
9834 exec: function() {/*
9835 // Array.prototype.shift -> DeletePropertyOrThrow -> [[Delete]]
9836 var del = [];
9837 var p = new Proxy([0,,0,,0,0], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }});
9838 p.shift();
9839 return del + '' === "0,2,5";
9840 */},
9841 res: {
9842 edge12: true,
9843 firefox18: true,
9844 firefox23: false,
9845 firefox40: true,
9846 xs6: true,
9847 chrome49: true,
9848 safaritp: true,
9849 safari10: true,
9850 webkit: true,
9851 },
9852 },
9853 {
9854 name: 'Array.prototype.splice',
9855 exec: function() {/*
9856 // Array.prototype.splice -> DeletePropertyOrThrow -> [[Delete]]
9857 var del = [];
9858 var p = new Proxy([0,0,0,0,,0], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }});
9859 p.splice(2,2,0);
9860 return del + '' === "3,5";
9861 */},
9862 res: {
9863 edge12: true,
9864 firefox18: true,
9865 firefox23: false,
9866 firefox40: true,
9867 xs6: true,
9868 chrome49: true,
9869 safaritp: true,
9870 safari10: true,
9871 webkit: true,
9872 },
9873 },
9874 {
9875 name: 'Array.prototype.unshift',
9876 exec: function() {/*
9877 // Array.prototype.unshift -> DeletePropertyOrThrow -> [[Delete]]
9878 var del = [];
9879 var p = new Proxy([0,0,,0,,0], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }});
9880 p.unshift(0);
9881 return del + '' === "5,3";
9882 */},
9883 res: {
9884 edge12: true,
9885 firefox18: true,
9886 firefox23: false,
9887 firefox40: true,
9888 xs6: true,
9889 chrome49: true,
9890 safaritp: true,
9891 safari10: true,
9892 webkit: true,
9893 },
9894 },
9895 ],
9896},
9897{
9898 name: 'Proxy, internal \'getOwnPropertyDescriptor\' calls',
9899 category: 'misc',
9900 significance: 'tiny',
9901 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots',
9902 subtests: [
9903 {
9904 name: '[[Set]]',
9905 exec: function() {/*
9906 // [[Set]] -> [[GetOwnProperty]]
9907 var gopd = [];
9908 var p = new Proxy({},
9909 { getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); }});
9910 p.foo = 1; p.bar = 1;
9911 return gopd + '' === "foo,bar";
9912 */},
9913 res: {
9914 ejs: true,
9915 edge12: true,
9916 firefox37: true,
9917 chrome49: true,
9918 xs6: true,
9919 safaritp: true,
9920 safari10: true,
9921 webkit: true,
9922 },
9923 },
9924 {
9925 name: 'Object.assign',
9926 exec: function() {/*
9927 // Object.assign -> [[GetOwnProperty]]
9928 var gopd = [];
9929 var p = new Proxy({foo:1, bar:2},
9930 { getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); }});
9931 Object.assign({}, p);
9932 return gopd + '' === "foo,bar";
9933 */},
9934 res: {
9935 edge12: true,
9936 firefox34: true,
9937 xs6: true,
9938 chrome49: true,
9939 safaritp: true,
9940 safari10: true,
9941 webkit: true,
9942 },
9943 },
9944 {
9945 name: 'Object.prototype.hasOwnProperty',
9946 exec: function() {/*
9947 // Object.prototype.hasOwnProperty -> HasOwnProperty -> [[GetOwnProperty]]
9948 var gopd = [];
9949 var p = new Proxy({foo:1, bar:2},
9950 { getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); }});
9951 p.hasOwnProperty('garply');
9952 return gopd + '' === "garply";
9953 */},
9954 res: {
9955 ejs: true,
9956 edge12: true,
9957 firefox32: true,
9958 xs6: true,
9959 chrome49: true,
9960 safaritp: true,
9961 safari10: true,
9962 webkit: true,
9963 },
9964 },
9965 {
9966 name: 'Function.prototype.bind',
9967 exec: function() {/*
9968 // Function.prototype.bind -> HasOwnProperty -> [[GetOwnProperty]]
9969 var gopd = [];
9970 var p = new Proxy(Function(),
9971 { getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); }});
9972 p.bind();
9973 return gopd + '' === "length";
9974 */},
9975 res: {
9976 edge12: true,
9977 firefox38: true,
9978 xs6: true,
9979 chrome49: true,
9980 safaritp: true,
9981 safari10: true,
9982 webkit: true,
9983 },
9984 },
9985 ],
9986},
9987{
9988 name: 'Proxy, internal \'ownKeys\' calls',
9989 category: 'misc',
9990 significance: 'tiny',
9991 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots',
9992 subtests: [
9993 {
9994 name: 'SetIntegrityLevel',
9995 exec: function() {/*
9996 // SetIntegrityLevel -> [[OwnPropertyKeys]]
9997 var ownKeysCalled = 0;
9998 var p = new Proxy({}, { ownKeys: function(o) { ownKeysCalled++; return Object.keys(o); }});
9999 Object.freeze(p);
10000 return ownKeysCalled === 1;
10001 */},
10002 res: {
10003 ejs: true,
10004 edge12: true,
10005 firefox32: true,
10006 xs6: true,
10007 chrome49: true,
10008 safaritp: true,
10009 safari10: true,
10010 webkit: true,
10011 },
10012 },
10013 {
10014 name: 'TestIntegrityLevel',
10015 exec: function() {/*
10016 // TestIntegrityLevel -> [[OwnPropertyKeys]]
10017 var ownKeysCalled = 0;
10018 var p = new Proxy(Object.preventExtensions({}), { ownKeys: function(o) { ownKeysCalled++; return Object.keys(o); }});
10019 Object.isFrozen(p);
10020 return ownKeysCalled === 1;
10021 */},
10022 res: {
10023 ejs: true,
10024 edge12: true,
10025 firefox32: true,
10026 xs6: true,
10027 chrome49: true,
10028 safaritp: true,
10029 safari10: true,
10030 webkit: true,
10031 },
10032 },
10033 {
10034 name: 'SerializeJSONObject',
10035 exec: function() {/*
10036 // SerializeJSONObject -> EnumerableOwnNames -> [[OwnPropertyKeys]]
10037 var ownKeysCalled = 0;
10038 var p = new Proxy({}, { ownKeys: function(o) { ownKeysCalled++; return Object.keys(o); }});
10039 JSON.stringify({a:p,b:p});
10040 return ownKeysCalled === 2;
10041 */},
10042 res: {
10043 ejs: true,
10044 firefox32: true,
10045 edge13: true,
10046 xs6: true,
10047 chrome49: true,
10048 safaritp: true,
10049 safari10: true,
10050 webkit: true,
10051 },
10052 },
10053 ],
10054},
10055{
10056 name: 'Reflect',
10057 category: 'built-ins',
10058 significance: 'small',
10059 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-reflection',
10060 note_id: 'reflect-enumerate',
10061 note_html: 'The 2015 version of the specification also specifies <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-reflect.enumerate">Reflect.enumerate</a>, which was removed in the 2016 version.',
10062 subtests: [
10063 {
10064 name: 'Reflect.get',
10065 exec: function() {/*
10066 return Reflect.get({ qux: 987 }, "qux") === 987;
10067 */},
10068 res: {
10069 babel: true,
10070 ejs: true,
10071 typescript: typescript.corejs,
10072 edge12: true,
10073 es6shim: true,
10074 firefox42: true,
10075 safaritp: true,
10076 safari10: true,
10077 webkit: true,
10078 xs6: true,
10079 chrome49: true,
10080 },
10081 },
10082 {
10083 name: 'Reflect.set',
10084 exec: function() {/*
10085 var obj = {};
10086 Reflect.set(obj, "quux", 654);
10087 return obj.quux === 654;
10088 */},
10089 res: {
10090 babel: true,
10091 ejs: true,
10092 typescript: typescript.corejs,
10093 edge12: true,
10094 es6shim: true,
10095 firefox42: true,
10096 xs6: true,
10097 chrome49: true,
10098 safaritp: true,
10099 safari10: true,
10100 webkit: true,
10101 },
10102 },
10103 {
10104 name: 'Reflect.has',
10105 exec: function() {/*
10106 return Reflect.has({ qux: 987 }, "qux");
10107 */},
10108 res: {
10109 babel: true,
10110 ejs: true,
10111 typescript: typescript.corejs,
10112 edge12: true,
10113 es6shim: true,
10114 safaritp: true,
10115 safari10: true,
10116 webkit: true,
10117 firefox42: true,
10118 xs6: true,
10119 chrome49: true,
10120 },
10121 },
10122 {
10123 name: 'Reflect.deleteProperty',
10124 exec: function() {/*
10125 var obj = { bar: 456 };
10126 Reflect.deleteProperty(obj, "bar");
10127 return !("bar" in obj);
10128 */},
10129 res: {
10130 babel: true,
10131 typescript: typescript.corejs,
10132 edge12: true,
10133 es6shim: true,
10134 safaritp: true,
10135 safari10: true,
10136 webkit: true,
10137 firefox42: true,
10138 xs6: true,
10139 chrome49: true,
10140 },
10141 },
10142 {
10143 name: 'Reflect.getOwnPropertyDescriptor',
10144 exec: function() {/*
10145 var obj = { baz: 789 };
10146 var desc = Reflect.getOwnPropertyDescriptor(obj, "baz");
10147 return desc.value === 789 &&
10148 desc.configurable && desc.writable && desc.enumerable;
10149 */},
10150 res: {
10151 babel: true,
10152 ejs: true,
10153 typescript: typescript.corejs,
10154 edge12: true,
10155 es6shim: true,
10156 firefox42: true,
10157 safaritp: true,
10158 safari10: true,
10159 webkit: true,
10160 xs6: true,
10161 chrome49: true,
10162 },
10163 },
10164 {
10165 name: 'Reflect.defineProperty',
10166 exec: function() {/*
10167 var obj = {};
10168 Reflect.defineProperty(obj, "foo", { value: 123 });
10169 return obj.foo === 123 &&
10170 Reflect.defineProperty(Object.freeze({}), "foo", { value: 123 }) === false;
10171 */},
10172 res: {
10173 babel: true,
10174 typescript: typescript.corejs,
10175 es6shim: true,
10176 safaritp: true,
10177 safari10: true,
10178 webkit: true,
10179 firefox42: true,
10180 edge13: true,
10181 xs6: true,
10182 chrome49: true,
10183 },
10184 },
10185 {
10186 name: 'Reflect.getPrototypeOf',
10187 exec: function() {/*
10188 return Reflect.getPrototypeOf([]) === Array.prototype;
10189 */},
10190 res: {
10191 babel: true,
10192 ejs: true,
10193 typescript: typescript.corejs,
10194 edge12: true,
10195 es6shim: true,
10196 safaritp: true,
10197 safari10: true,
10198 webkit: true,
10199 firefox42: true,
10200 xs6: true,
10201 chrome49: true,
10202 },
10203 },
10204 {
10205 name: 'Reflect.setPrototypeOf',
10206 exec: function() {/*
10207 var obj = {};
10208 Reflect.setPrototypeOf(obj, Array.prototype);
10209 return obj instanceof Array;
10210 */},
10211 res: {
10212 babel: { val: false, note_id: 'compiler-proto' },
10213 typescript: { val: false, note_id: 'compiler-proto' },
10214 ejs: true,
10215 edge12: true,
10216 es6shim: { val: false, note_id: 'compiler-proto' },
10217 safaritp: true,
10218 safari10: true,
10219 webkit: true,
10220 firefox42: true,
10221 xs6: true,
10222 chrome49: true,
10223 },
10224 },
10225 {
10226 name: 'Reflect.isExtensible',
10227 exec: function() {/*
10228 return Reflect.isExtensible({}) &&
10229 !Reflect.isExtensible(Object.preventExtensions({}));
10230 */},
10231 res: {
10232 babel: true,
10233 ejs: true,
10234 typescript: typescript.corejs,
10235 edge12: true,
10236 es6shim: true,
10237 safaritp: true,
10238 safari10: true,
10239 webkit: true,
10240 firefox42: true,
10241 xs6: true,
10242 chrome49: true,
10243 },
10244 },
10245 {
10246 name: 'Reflect.preventExtensions',
10247 exec: function() {/*
10248 var obj = {};
10249 Reflect.preventExtensions(obj);
10250 return !Object.isExtensible(obj);
10251 */},
10252 res: {
10253 babel: true,
10254 ejs: true,
10255 typescript: typescript.corejs,
10256 edge12: true,
10257 es6shim: true,
10258 safaritp: true,
10259 safari10: true,
10260 webkit: true,
10261 firefox42: true,
10262 xs6: true,
10263 chrome49: true,
10264 },
10265 },
10266 {
10267 name: 'Reflect.ownKeys, string keys',
10268 exec: function() {/*
10269 var obj = Object.create({ C: true });
10270 obj.A = true;
10271 Object.defineProperty(obj, 'B', { value: true, enumerable: false });
10272
10273 return Reflect.ownKeys(obj).sort() + '' === "A,B";
10274 */},
10275 res: {
10276 babel: true,
10277 typescript: typescript.corejs,
10278 ejs: true,
10279 es6shim: true,
10280 edge12: true,
10281 safaritp: true,
10282 safari10: true,
10283 webkit: true,
10284 firefox42: true,
10285 xs6: true,
10286 chrome49: true,
10287 },
10288 },
10289 {
10290 name: 'Reflect.ownKeys, symbol keys',
10291 exec: function() {/*
10292 var s1 = Symbol(), s2 = Symbol(), s3 = Symbol();
10293 var proto = {};
10294 proto[s1] = true;
10295 var obj = Object.create(proto);
10296 obj[s2] = true;
10297 Object.defineProperty(obj, s3, { value: true, enumerable: false });
10298
10299 var keys = Reflect.ownKeys(obj);
10300 return keys.indexOf(s2) >-1 && keys.indexOf(s3) >-1 && keys.length === 2;
10301 */},
10302 res: {
10303 babel: true,
10304 typescript: typescript.corejs,
10305 ejs: true,
10306 es6shim: true,
10307 edge12: true,
10308 safaritp: true,
10309 safari10: true,
10310 webkit: true,
10311 firefox42: true,
10312 xs6: true,
10313 chrome49: true,
10314 },
10315 },
10316 {
10317 name: 'Reflect.apply',
10318 exec: function() {/*
10319 return Reflect.apply(Array.prototype.push, [1,2], [3,4,5]) === 5;
10320 */},
10321 res: {
10322 babel: true,
10323 typescript: typescript.corejs,
10324 ejs: true,
10325 edge12: true,
10326 es6shim: true,
10327 safaritp: true,
10328 safari10: true,
10329 webkit: true,
10330 firefox42: true,
10331 xs6: true,
10332 chrome49: true,
10333 },
10334 },
10335 {
10336 name: 'Reflect.construct',
10337 exec: function() {/*
10338 return Reflect.construct(function(a, b, c) {
10339 this.qux = a + b + c;
10340 }, ["foo", "bar", "baz"]).qux === "foobarbaz";
10341 */},
10342 res: {
10343 babel: true,
10344 ejs: true,
10345 typescript: typescript.corejs,
10346 edge12: true,
10347 es6shim: true,
10348 firefox42: true,
10349 xs6: true,
10350 chrome49: true,
10351 safaritp: true,
10352 safari10: true,
10353 webkit: true,
10354 },
10355 },
10356 {
10357 name: 'Reflect.construct sets new.target meta-property',
10358 exec: function() {/*
10359 return Reflect.construct(function(a, b, c) {
10360 if (new.target === Object) {
10361 this.qux = a + b + c;
10362 }
10363 }, ["foo", "bar", "baz"], Object).qux === "foobarbaz";
10364 */},
10365 res: {
10366 typescript: typescript.fallthrough,
10367 firefox42: true,
10368 edge13: true,
10369 xs6: true,
10370 ejs: true,
10371 chrome49: true,
10372 safaritp: true,
10373 safari10: true,
10374 webkit: true,
10375 },
10376 },
10377 {
10378 name: 'Reflect.construct creates instances from third argument',
10379 exec: function() {/*
10380 function F(){}
10381 var obj = Reflect.construct(function(){ this.y = 1; }, [], F);
10382 return obj.y === 1 && obj instanceof F;
10383 */},
10384 res: {
10385 ejs: true,
10386 babel: true,
10387 es6shim: true,
10388 typescript: typescript.corejs,
10389 edge13: true,
10390 firefox44: true,
10391 xs6: true,
10392 chrome49: true,
10393 safaritp: true,
10394 safari10: true,
10395 webkit: true,
10396 },
10397 },
10398 {
10399 name: 'Reflect.construct, Array subclassing',
10400 exec: function() {/*
10401 function F(){}
10402 var obj = Reflect.construct(Array, [], F);
10403 obj[2] = 'foo';
10404 return obj.length === 3 && obj instanceof F;
10405 */},
10406 res: {
10407 ejs: null,
10408 typescript: typescript.corejs,
10409 edge13: true,
10410 firefox45: true,
10411 xs6: null,
10412 chrome49: true,
10413 safaritp: true,
10414 safari10: true,
10415 webkit: true,
10416 },
10417 },
10418 {
10419 name: 'Reflect.construct, RegExp subclassing',
10420 exec: function() {/*
10421 function F(){}
10422 var obj = Reflect.construct(RegExp, ["baz","g"], F);
10423 return RegExp.prototype.exec.call(obj, "foobarbaz")[0] === "baz"
10424 && obj.lastIndex === 9 && obj instanceof F;
10425 */},
10426 res: {
10427 ejs: null,
10428 typescript: typescript.corejs,
10429 edge13: true,
10430 firefox45: true,
10431 firefox46: false,
10432 firefox49: true,
10433 xs6: null,
10434 chrome49: true,
10435 safaritp: true,
10436 safari10: true,
10437 webkit: true,
10438 },
10439 },
10440 {
10441 name: 'Reflect.construct, Function subclassing',
10442 exec: function() {/*
10443 function F(){}
10444 var obj = Reflect.construct(Function, ["return 2"], F);
10445 return obj() === 2 && obj instanceof F;
10446 */},
10447 res: {
10448 ejs: null,
10449 typescript: typescript.corejs,
10450 edge13: true,
10451 firefox45: true,
10452 xs6: null,
10453 chrome49: true,
10454 safaritp: true,
10455 safari10: true,
10456 webkit: true,
10457 },
10458 },
10459 {
10460 name: 'Reflect.construct, Promise subclassing',
10461 exec: function() {/*
10462 function F(){}
10463 var p1 = Reflect.construct(Promise,[function(resolve, reject) { resolve("foo"); }], F);
10464 var p2 = Reflect.construct(Promise,[function(resolve, reject) { reject("quux"); }], F);
10465 var score = +(p1 instanceof F && p2 instanceof F);
10466
10467 function thenFn(result) { score += (result === "foo"); check(); }
10468 function catchFn(result) { score += (result === "quux"); check(); }
10469 function shouldNotRun(result) { score = -Infinity; }
10470
10471 p1.then = p2.then = Promise.prototype.then;
10472 p1.catch = p2.catch = Promise.prototype.catch;
10473
10474 p1.then(thenFn, shouldNotRun);
10475 p2.then(shouldNotRun, catchFn);
10476 p1.catch(shouldNotRun);
10477 p2.catch(catchFn);
10478
10479 function check() {
10480 if (score === 4) asyncTestPassed();
10481 }
10482 */},
10483 res: {
10484 ejs: null,
10485 typescript: typescript.corejs,
10486 xs6: null,
10487 edge13: true,
10488 firefox44: true,
10489 chrome49: true,
10490 safaritp: true,
10491 safari10: true,
10492 webkit: true,
10493 },
10494 },
10495 ],
10496},
10497{
10498 name: 'block-level function declaration',
10499 category: 'bindings',
10500 significance: 'small',
10501 note_id: 'block-level-function',
10502 note_html: 'Note that prior to ES6, it was <a href="http://wiki.ecmascript.org/doku.php?id=conventions:no_non_standard_strict_decls">recommended</a> that ES5 implementations forbid block-level declarations in strict mode.',
10503 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-functiondeclarationinstantiation',
10504 exec: function () {/*
10505 'use strict';
10506 if (f() !== 1) return false;
10507 function f() { return 1; }
10508 {
10509 if (f() !== 2) return false;
10510 function f() { return 2; }
10511 if (f() !== 2) return false;
10512 }
10513 if (f() !== 1) return false;
10514 return true;
10515 */},
10516 res: {
10517 babel: true,
10518 tr: true,
10519 closure: true,
10520 ie11: true,
10521 firefox46: true,
10522 chrome21dev: flag,
10523 chrome41: true,
10524 node012: flag,
10525 node4: true,
10526 xs6: true,
10527 safaritp: true,
10528 safari10: true,
10529 webkit: true,
10530 }
10531},
10532{
10533 name: 'destructuring, declarations',
10534 category: 'syntax',
10535 significance: 'medium',
10536 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-destructuring-assignment',
10537 subtests: [
10538 {
10539 name: 'with arrays',
10540 exec: function(){/*
10541 var [a, , [b], c] = [5, null, [6]];
10542 return a === 5 && b === 6 && c === undefined;
10543 */},
10544 res: (temp.destructuringResults = {
10545 tr: true,
10546 babel: true,
10547 ejs: true,
10548 es6tr: true,
10549 jsx: true,
10550 closure: true,
10551 typescript: true,
10552 firefox2: true,
10553 safari71_8: true,
10554 safaritp: true,
10555 safari10: true,
10556 webkit: true,
10557 edge13: flag,
10558 edge14: true,
10559 xs6: true,
10560 chrome49: true,
10561 jxa: true,
10562 }),
10563 },
10564 {
10565 name: 'with sparse arrays',
10566 exec: function(){/*
10567 var [a, , b] = [,,,];
10568 return a === undefined && b === undefined;
10569 */},
10570 res: {
10571 tr: true,
10572 babel: true,
10573 ejs: true,
10574 es6tr: true,
10575 jsx: true,
10576 closure: true,
10577 typescript: true,
10578 firefox2: true,
10579 safari71_8: true,
10580 safaritp: true,
10581 safari10: true,
10582 webkit: true,
10583 edge13: flag,
10584 edge14: true,
10585 xs6: true,
10586 chrome49: true,
10587 jxa: true,
10588 },
10589 },
10590 {
10591 name: 'with strings',
10592 exec: function(){/*
10593 var [a, b, c] = "ab";
10594 return a === "a" && b === "b" && c === undefined;
10595 */},
10596 res: {
10597 tr: true,
10598 babel: true,
10599 es6tr: true,
10600 jsx: true,
10601 ejs: true,
10602 closure: true,
10603 typescript: true,
10604 firefox2: true,
10605 safari71_8: true,
10606 safaritp: true,
10607 safari10: true,
10608 webkit: true,
10609 edge13: flag,
10610 edge14: true,
10611 xs6: true,
10612 chrome49: true,
10613 jxa: true,
10614 },
10615 },
10616 {
10617 name: 'with astral plane strings',
10618 exec: function(){/*
10619 var [c] = "𠮷𠮶";
10620 return c === "𠮷";
10621 */},
10622 res: {
10623 tr: true,
10624 babel: true,
10625 ejs: true,
10626 typescript: false,
10627 firefox34: true,
10628 safari9: true,
10629 safaritp: true,
10630 webkit: true,
10631 edge13: flag,
10632 edge14: true,
10633 xs6: true,
10634 chrome49: true,
10635 jxa: true,
10636 },
10637 },
10638 {
10639 name: 'with generator instances',
10640 exec: function(){/*
10641 var [a, b, c] = (function*(){ yield 1; yield 2; }());
10642 return a === 1 && b === 2 && c === undefined;
10643 */},
10644 res: {
10645 tr: true,
10646 typescript: false,
10647 firefox34: true,
10648 babel: true,
10649 closure: true,
10650 ejs: true,
10651 edge13: flag,
10652 edge14: true,
10653 xs6: true,
10654 safaritp: true,
10655 safari10: true,
10656 webkit: true,
10657 chrome49: true,
10658 },
10659 },
10660 {
10661 name: 'with generic iterables',
10662 exec: function(){/*
10663 var [a, b, c] = global.__createIterableObject([1, 2]);
10664 return a === 1 && b === 2 && c === undefined;
10665 */},
10666 res: {
10667 tr: true,
10668 ejs: true,
10669 typescript: false,
10670 firefox34: true,
10671 safari9: true,
10672 safaritp: true,
10673 webkit: true,
10674 babel: true,
10675 closure: true,
10676 edge13: flag,
10677 edge14: true,
10678 xs6: true,
10679 chrome49: true,
10680 jxa: true,
10681 },
10682 },
10683 {
10684 name: 'with instances of generic iterables',
10685 exec: function(){/*
10686 var [a, b, c] = Object.create(global.__createIterableObject([1, 2]));
10687 return a === 1 && b === 2 && c === undefined;
10688 */},
10689 res: {
10690 tr: true,
10691 babel: true,
10692 closure: true,
10693 ejs: true,
10694 typescript: false,
10695 firefox36: true,
10696 safari9: true,
10697 safaritp: true,
10698 webkit: true,
10699 edge13: flag,
10700 edge14: true,
10701 xs6: true,
10702 chrome49: true,
10703 jxa: true,
10704 },
10705 },
10706 {
10707 name: 'iterator closing',
10708 exec: function () {/*
10709 var closed = false;
10710 var iter = global.__createIterableObject([1, 2, 3], {
10711 'return': function(){ closed = true; return {}; }
10712 });
10713 var [a, b] = iter;
10714 return closed;
10715 */},
10716 res: {
10717 tr: true,
10718 babel: true,
10719 typescript: false,
10720 edge14: true,
10721 chrome51: true,
10722 safari9: true,
10723 safaritp: true,
10724 webkit: true,
10725 xs6: true,
10726 jxa: true,
10727 },
10728 },
10729 {
10730 name: 'trailing commas in iterable patterns',
10731 exec: function(){/*
10732 var [a,] = [1];
10733 return a === 1;
10734 */},
10735 res: Object.assign({}, temp.destructuringResults, {
10736 safari71_8: false,
10737 safari9: true,
10738 tr: false,
10739 closure: false,
10740 chrome49: true,
10741 edge14: true,
10742 jxa: true,
10743 }),
10744 },
10745 {
10746 name: 'with objects',
10747 exec: function(){/*
10748 var {c, x:d, e} = {c:7, x:8};
10749 return c === 7 && d === 8 && e === undefined;
10750 */},
10751 res: Object.assign({}, temp.destructuringResults, {
10752 firefox2: false,
10753 firefox3: {
10754 val: true,
10755 note_id: "ff11-object-destructuring",
10756 note_html: "Firefox < 16 incorrectly treats <code>({f,g} = {f:9,g:10})</code> as assigning to global variables instead of locals."
10757 },
10758 firefox16: true,
10759 ejs: false,
10760 chrome49: true,
10761 edge14: true,
10762 jxa: true,
10763 }),
10764 },
10765 {
10766 name: 'object destructuring with primitives',
10767 exec: function(){/*
10768 var {toFixed} = 2;
10769 var {slice} = '';
10770 return toFixed === Number.prototype.toFixed
10771 && slice === String.prototype.slice;
10772 */},
10773 res: Object.assign({}, temp.destructuringResults, {
10774 firefox2: false,
10775 firefox3: true,
10776 chrome49: true,
10777 edge14: true,
10778 jxa: true,
10779 }),
10780 },
10781 {
10782 name: 'trailing commas in object patterns',
10783 exec: function(){/*
10784 var {a,} = {a:1};
10785 return a === 1;
10786 */},
10787 res: Object.assign({}, temp.destructuringResults, {
10788 firefox2: false,
10789 firefox3: true,
10790 safari71_8: false,
10791 safari9: true,
10792 chrome49: true,
10793 edge14: true,
10794 jxa: true,
10795 }),
10796 },
10797 {
10798 name: 'throws on null and undefined',
10799 exec: function(){/*
10800 try {
10801 var {a} = null;
10802 return false;
10803 } catch(e) {
10804 if (!(e instanceof TypeError))
10805 return false;
10806 }
10807 try {
10808 var {b} = undefined;
10809 return false;
10810 } catch(e) {
10811 if (!(e instanceof TypeError))
10812 return false;
10813 }
10814 return true;
10815 */},
10816 res: Object.assign({}, temp.destructuringResults, {
10817 firefox2: false,
10818 firefox3: true,
10819 chrome49: true,
10820 edge14: true,
10821 jxa: true,
10822 }),
10823 },
10824 {
10825 name: 'computed properties',
10826 exec: function(){/*
10827 var qux = "corge";
10828 var { [qux]: grault } = { corge: "garply" };
10829 return grault === "garply";
10830 */},
10831 res: {
10832 babel: true,
10833 typescript: true,
10834 closure: true,
10835 tr: true,
10836 es6tr: true,
10837 firefox35: true,
10838 edge13: flag,
10839 edge14: true,
10840 safaritp: true,
10841 safari10: true,
10842 webkit: true,
10843 xs6: true,
10844 chrome49: true,
10845 },
10846 },
10847 {
10848 name: 'multiples in a single var statement',
10849 exec: function() {/*
10850 var [a,b] = [5,6], {c,d} = {c:7,d:8};
10851 return a === 5 && b === 6 && c === 7 && d === 8;
10852 */},
10853 res: {
10854 tr: true,
10855 babel: true,
10856 typescript: true,
10857 es6tr: true,
10858 jsx: true,
10859 ejs: true,
10860 closure: true,
10861 firefox3: true,
10862 safari9: true,
10863 safaritp: true,
10864 webkit: true,
10865 edge13: flag,
10866 edge14: true,
10867 xs6: true,
10868 chrome49: true,
10869 jxa: true,
10870 },
10871 },
10872 {
10873 name: 'nested',
10874 exec: function(){/*
10875 var [e, {x:f, g}] = [9, {x:10}];
10876 var {h, x:[i]} = {h:11, x:[12]};
10877 return e === 9 && f === 10 && g === undefined
10878 && h === 11 && i === 12;
10879 */},
10880 res: Object.assign({}, temp.destructuringResults, {
10881 firefox2: false,
10882 firefox3: true,
10883 ejs: false,
10884 chrome49: true,
10885 edge14: true,
10886 jxa: true,
10887 }),
10888 },
10889 {
10890 name: 'in for-in loop heads',
10891 exec: function(){/*
10892 for(var [i, j, k] in { qux: 1 }) {
10893 return i === "q" && j === "u" && k === "x";
10894 }
10895 */},
10896 res: {
10897 tr: true,
10898 babel: true,
10899 closure: true,
10900 firefox3: true,
10901 safari71_8: true,
10902 safaritp: true,
10903 safari10: true,
10904 webkit: true,
10905 edge13: flag,
10906 edge14: true,
10907 xs6: true,
10908 chrome49: true,
10909 jxa: true,
10910 },
10911 },
10912 {
10913 name: 'in for-of loop heads',
10914 exec: function(){/*
10915 for(var [i, j, k] of [[1,2,3]]) {
10916 return i === 1 && j === 2 && k === 3;
10917 }
10918 */},
10919 res: {
10920 tr: true,
10921 babel: true,
10922 typescript: true,
10923 es6tr: true,
10924 closure: true,
10925 firefox13: true,
10926 safari71_8: true,
10927 safaritp: true,
10928 safari10: true,
10929 webkit: true,
10930 edge13: flag,
10931 edge14: true,
10932 xs6: true,
10933 chrome49: true,
10934 jxa: true,
10935 },
10936 },
10937 {
10938 name: 'in catch heads',
10939 exec: function(){/*
10940 try {
10941 throw [1,2];
10942 } catch([i,j]) {
10943 try {
10944 throw { k: 3, l: 4 };
10945 } catch({k, l}) {
10946 return i === 1 && j === 2 && k === 3 && l === 4;
10947 }
10948 }
10949 */},
10950 res: {
10951 firefox3: true,
10952 babel: true,
10953 tr: true,
10954 jsx: true,
10955 closure: true,
10956 chrome49: true,
10957 edge14: true,
10958 safaritp: true,
10959 safari10: true,
10960 webkit: true,
10961 },
10962 },
10963 {
10964 name: 'rest',
10965 exec: function(){/*
10966 var [a, ...b] = [3, 4, 5];
10967 var [c, ...d] = [6];
10968 return a === 3 && b instanceof Array && (b + "") === "4,5" &&
10969 c === 6 && d instanceof Array && d.length === 0;
10970 */},
10971 res: {
10972 tr: true,
10973 babel: true,
10974 typescript: true,
10975 es6tr: true,
10976 jsx: true,
10977 closure: true,
10978 firefox34: true,
10979 safari9: true,
10980 safaritp: true,
10981 webkit: true,
10982 edge13: flag,
10983 edge14: true,
10984 xs6: true,
10985 chrome49: true,
10986 jxa: true,
10987 },
10988 },
10989 {
10990 name: 'defaults',
10991 exec: function(){/*
10992 var {a = 1, b = 0, z:c = 3} = {b:2, z:undefined};
10993 var [d = 0, e = 5, f = 6] = [4,,undefined];
10994 return a === 1 && b === 2 && c === 3
10995 && d === 4 && e === 5 && f === 6;
10996 */},
10997 res: {
10998 tr: true,
10999 babel: true,
11000 typescript: true,
11001 es6tr: true,
11002 closure: true,
11003 safari9: true,
11004 safaritp: true,
11005 webkit: true,
11006 edge13: flag,
11007 edge14: true,
11008 firefox47: true,
11009 xs6: true,
11010 chrome49: true,
11011 jxa: true,
11012 },
11013 },
11014 {
11015 name: 'defaults, let temporal dead zone',
11016 exec: function(){/*
11017 var {a, b = 2} = {a:1};
11018 try {
11019 eval("let {c = c} = {};");
11020 return false;
11021 } catch(e){}
11022 try {
11023 eval("let {c = d, d} = {d:1};");
11024 return false;
11025 } catch(e){}
11026 return a === 1 && b === 2;
11027 */},
11028 res: {
11029 babel: flag,
11030 typescript: true,
11031 safari9: true,
11032 safaritp: true,
11033 webkit: true,
11034 edge13: flag,
11035 edge14: true,
11036 firefox47: true,
11037 xs6: true,
11038 chrome49: true,
11039 jxa: true,
11040 },
11041 },
11042 ],
11043},
11044{
11045 name: 'destructuring, assignment',
11046 category: 'syntax',
11047 significance: 'medium',
11048 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-destructuring-assignment',
11049 subtests: [
11050 {
11051 name: 'with arrays',
11052 exec: function(){/*
11053 var a,b,c;
11054 [a, , [b], c] = [5, null, [6]];
11055 return a === 5 && b === 6 && c === undefined;
11056 */},
11057 res: temp.destructuringResults,
11058 },
11059 {
11060 name: 'with sparse arrays',
11061 exec: function(){/*
11062 var a, b;
11063 [a, , b] = [,,,];
11064 return a === undefined && b === undefined;
11065 */},
11066 res: temp.destructuringResults
11067 },
11068 {
11069 name: 'with strings',
11070 exec: function(){/*
11071 var a,b,c;
11072 [a, b, c] = "ab";
11073 return a === "a" && b === "b" && c === undefined;
11074 */},
11075 res: {
11076 tr: true,
11077 babel: true,
11078 es6tr: true,
11079 jsx: true,
11080 ejs: true,
11081 closure: true,
11082 typescript: true,
11083 firefox2: true,
11084 safari71_8: true,
11085 safaritp: true,
11086 safari10: true,
11087 webkit: true,
11088 edge13: flag,
11089 edge14: true,
11090 xs6: true,
11091 chrome49: true,
11092 jxa: true,
11093 },
11094 },
11095 {
11096 name: 'with astral plane strings',
11097 exec: function(){/*
11098 var c;
11099 [c] = "𠮷𠮶";
11100 return c === "𠮷";
11101 */},
11102 res: {
11103 tr: true,
11104 babel: true,
11105 ejs: true,
11106 typescript: false,
11107 firefox34: true,
11108 safari9: true,
11109 safaritp: true,
11110 webkit: true,
11111 edge13: flag,
11112 edge14: true,
11113 xs6: true,
11114 chrome49: true,
11115 jxa: true,
11116 },
11117 },
11118 {
11119 name: 'with generator instances',
11120 exec: function(){/*
11121 var a,b,c;
11122 [a, b, c] = (function*(){ yield 1; yield 2; }());
11123 return a === 1 && b === 2 && c === undefined;
11124 */},
11125 res: {
11126 tr: true,
11127 typescript: false,
11128 firefox34: true,
11129 babel: true,
11130 closure: true,
11131 ejs: true,
11132 edge13: flag,
11133 edge14: true,
11134 xs6: true,
11135 safaritp: true,
11136 safari10: true,
11137 webkit: true,
11138 chrome49: true,
11139 },
11140 },
11141 {
11142 name: 'with generic iterables',
11143 exec: function(){/*
11144 var a,b,c;
11145 [a, b, c] = global.__createIterableObject([1, 2]);
11146 return a === 1 && b === 2 && c === undefined;
11147 */},
11148 res: {
11149 tr: true,
11150 ejs: true,
11151 typescript: false,
11152 firefox34: true,
11153 safari9: true,
11154 safaritp: true,
11155 webkit: true,
11156 babel: true,
11157 closure: true,
11158 edge13: flag,
11159 edge14: true,
11160 xs6: true,
11161 chrome49: true,
11162 jxa: true,
11163 },
11164 },
11165 {
11166 name: 'with instances of generic iterables',
11167 exec: function(){/*
11168 var a,b,c;
11169 [a, b, c] = Object.create(global.__createIterableObject([1, 2]));
11170 return a === 1 && b === 2 && c === undefined;
11171 */},
11172 res: {
11173 tr: true,
11174 babel: true,
11175 closure: true,
11176 ejs: true,
11177 typescript: false,
11178 firefox36: true,
11179 safari9: true,
11180 safaritp: true,
11181 webkit: true,
11182 edge13: flag,
11183 edge14: true,
11184 xs6: true,
11185 chrome49: true,
11186 jxa: true,
11187 },
11188 },
11189 {
11190 name: 'iterator closing',
11191 exec: function () {/*
11192 var closed = false;
11193 var iter = global.__createIterableObject([1, 2, 3], {
11194 'return': function(){ closed = true; return {}; }
11195 });
11196 var a,b;
11197 [a, b] = iter;
11198 return closed;
11199 */},
11200 res: {
11201 babel: true,
11202 typescript: false,
11203 chrome51: true,
11204 edge14: true,
11205 safari9: true,
11206 safaritp: true,
11207 webkit: true,
11208 xs6: true,
11209 jxa: true,
11210 },
11211 },
11212 {
11213 name: 'iterable destructuring expression',
11214 exec: function() {/*
11215 var a, b, iterable = [1,2];
11216 return ([a, b] = iterable) === iterable;
11217 */},
11218 res: {
11219 tr: true,
11220 babel: true,
11221 ejs: true,
11222 typescript: true,
11223 es6tr: true,
11224 firefox2: true,
11225 safari71_8: true,
11226 safaritp: true,
11227 safari10: true,
11228 webkit: true,
11229 edge13: flag,
11230 edge14: true,
11231 xs6: true,
11232 chrome49: true,
11233 jxa: true,
11234 },
11235 },
11236 {
11237 name: 'chained iterable destructuring',
11238 exec: function() {/*
11239 var a,b,c,d;
11240 [a,b] = [c,d] = [1,2];
11241 return a === 1 && b === 2 && c === 1 && d === 2;
11242 */},
11243 res: {
11244 tr: true,
11245 babel: true,
11246 ejs: true,
11247 typescript: true,
11248 es6tr: true,
11249 firefox2: true,
11250 safari71_8: true,
11251 safaritp: true,
11252 safari10: true,
11253 webkit: true,
11254 edge13: flag,
11255 edge14: true,
11256 xs6: true,
11257 chrome49: true,
11258 jxa: true,
11259 },
11260 },
11261 {
11262 name: 'trailing commas in iterable patterns',
11263 exec: function(){/*
11264 var a;
11265 [a,] = [1];
11266 return a === 1;
11267 */},
11268 res: Object.assign({}, temp.destructuringResults, {
11269 safari71_8: false,
11270 safari9: true,
11271 tr: true,
11272 closure: false,
11273 chrome49: true,
11274 edge14: true,
11275 jxa: true,
11276 }),
11277 },
11278 {
11279 name: 'with objects',
11280 exec: function(){/*
11281 var c,d,e;
11282 ({c, x:d, e} = {c:7, x:8});
11283 return c === 7 && d === 8 && e === undefined;
11284 */},
11285 res: Object.assign({}, temp.destructuringResults, {
11286 firefox2: false,
11287 firefox3: {
11288 val: false,
11289 note_id: "ff11-object-destructuring",
11290 note_html: "Firefox < 16 incorrectly treats <code>({f,g} = {f:9,g:10})</code> as assigning to global variables instead of locals."
11291 },
11292 firefox16: true,
11293 ejs: false,
11294 chrome49: true,
11295 edge14: true,
11296 jxa: true,
11297 }),
11298 },
11299 {
11300 name: 'object destructuring with primitives',
11301 exec: function(){/*
11302 var toFixed, slice;
11303 ({toFixed} = 2);
11304 ({slice} = '');
11305 return toFixed === Number.prototype.toFixed
11306 && slice === String.prototype.slice;
11307 */},
11308 res: Object.assign({}, temp.destructuringResults, {
11309 firefox2: false,
11310 firefox3: true,
11311 firefox3_5: false,
11312 firefox4: false,
11313 firefox16: true,
11314 }),
11315 },
11316 {
11317 name: 'trailing commas in object patterns',
11318 exec: function(){/*
11319 var a;
11320 ({a,} = {a:1});
11321 return a === 1;
11322 */},
11323 res: Object.assign({}, temp.destructuringResults, {
11324 firefox2: false,
11325 firefox3: true,
11326 firefox4: false,
11327 firefox16: true,
11328 safari71_8: false,
11329 safari9: true,
11330 chrome49: true,
11331 edge14: true,
11332 jxa: true,
11333 }),
11334 },
11335 {
11336 name: 'object destructuring expression',
11337 exec: function() {/*
11338 var a, b, obj = { a:1, b:2 };
11339 return ({a,b} = obj) === obj;
11340 */},
11341 res: {
11342 tr: true,
11343 babel: true,
11344 typescript: true,
11345 es6tr: true,
11346 firefox3: true,
11347 safari71_8: true,
11348 safaritp: true,
11349 safari10: true,
11350 webkit: true,
11351 edge13: flag,
11352 edge14: true,
11353 xs6: true,
11354 chrome49: true,
11355 jxa: true,
11356 },
11357 },
11358 {
11359 name: 'parenthesised left-hand-side is a syntax error',
11360 exec: function() {/*
11361 var a, b;
11362 ({a,b} = {a:1,b:2});
11363 try {
11364 eval("({a,b}) = {a:3,b:4};");
11365 }
11366 catch(e) {
11367 return a === 1 && b === 2;
11368 }
11369 */},
11370 res: {
11371 tr: true,
11372 babel: true,
11373 closure: true,
11374 typescript: true,
11375 safari71_8: true,
11376 safaritp: true,
11377 safari10: true,
11378 webkit: true,
11379 firefox41: true,
11380 edge13: flag,
11381 edge14: true,
11382 xs6: true,
11383 chrome49: true,
11384 jxa: true,
11385 },
11386 },
11387 {
11388 name: 'chained object destructuring',
11389 exec: function() {/*
11390 var a,b,c,d;
11391 ({a,b} = {c,d} = {a:1,b:2,c:3,d:4});
11392 return a === 1 && b === 2 && c === 3 && d === 4;
11393 */},
11394 res: {
11395 tr: true,
11396 firefox3: true,
11397 firefox3_5: false,
11398 firefox16: true,
11399 babel: true,
11400 typescript: true,
11401 es6tr: true,
11402 safaritp: true,
11403 safari10: true,
11404 webkit: true,
11405 safari71_8: true,
11406 edge13: flag,
11407 edge14: true,
11408 xs6: true,
11409 chrome49: true,
11410 jxa: true,
11411 },
11412 },
11413 {
11414 name: 'throws on null and undefined',
11415 exec: function(){/*
11416 var a,b;
11417 try {
11418 ({a} = null);
11419 return false;
11420 } catch(e) {
11421 if (!(e instanceof TypeError))
11422 return false;
11423 }
11424 try {
11425 ({b} = undefined);
11426 return false;
11427 } catch(e) {
11428 if (!(e instanceof TypeError))
11429 return false;
11430 }
11431 return true;
11432 */},
11433 res: Object.assign({}, temp.destructuringResults, {
11434 firefox2: false,
11435 firefox3: true,
11436 closure: false,
11437 chrome49: true,
11438 edge14: true,
11439 jxa: true,
11440 }),
11441 },
11442 {
11443 name: 'computed properties',
11444 exec: function(){/*
11445 var grault, qux = "corge";
11446 ({ [qux]: grault } = { corge: "garply" });
11447 return grault === "garply";
11448 */},
11449 res: {
11450 babel: true,
11451 typescript: true,
11452 closure: true,
11453 tr: true,
11454 es6tr: true,
11455 firefox35: true,
11456 edge13: flag,
11457 edge14: true,
11458 safaritp: true,
11459 safari10: true,
11460 webkit: true,
11461 xs6: true,
11462 chrome49: true,
11463 },
11464 },
11465 {
11466 name: 'nested',
11467 exec: function(){/*
11468 var e,f,g,h,i;
11469 [e, {x:f, g}] = [9, {x:10}];
11470 ({h, x:[i]} = {h:11, x:[12]});
11471 return e === 9 && f === 10 && g === undefined
11472 && h === 11 && i === 12;
11473 */},
11474 res: Object.assign({}, temp.destructuringResults, {
11475 ejs: false,
11476 chrome49: true,
11477 edge14: true,
11478 firefox2: false,
11479 firefox3: true,
11480 firefox3_5: false,
11481 firefox4: false,
11482 firefox16: true,
11483 jxa: true,
11484 }),
11485 },
11486 {
11487 name: 'rest',
11488 exec: function(){/*
11489 var a,b,c,d;
11490 [a, ...b] = [3, 4, 5];
11491 [c, ...d] = [6];
11492 return a === 3 && b instanceof Array && (b + "") === "4,5" &&
11493 c === 6 && d instanceof Array && d.length === 0;
11494 */},
11495 res: {
11496 tr: true,
11497 babel: true,
11498 typescript: true,
11499 es6tr: true,
11500 jsx: true,
11501 closure: true,
11502 firefox34: true,
11503 safari9: true,
11504 safaritp: true,
11505 webkit: true,
11506 edge13: flag,
11507 edge14: true,
11508 xs6: true,
11509 chrome49: true,
11510 jxa: true,
11511 },
11512 },
11513 {
11514 name: 'nested rest',
11515 exec: function(){/*
11516 var a = [1, 2, 3], first, last;
11517 [first, ...[a[2], last]] = a;
11518 return first === 1 && last === 3 && (a + "") === "1,2,2";
11519 */},
11520 res: {
11521 tr: true,
11522 babel: true,
11523 closure: true,
11524 typescript: true,
11525 edge13: flag,
11526 edge14: true,
11527 firefox47: true,
11528 xs6: true,
11529 safaritp: true,
11530 safari10: true,
11531 webkit: true,
11532 chrome49: true,
11533 },
11534 },
11535 {
11536 name: 'empty patterns',
11537 exec: function(){/*
11538 [] = [1,2];
11539 ({} = {a:1,b:2});
11540 return true;
11541 */},
11542 res: Object.assign({}, temp.destructuringResults, {
11543 ejs: true,
11544 safari71_8: false,
11545 safari9: true,
11546 chrome49: true,
11547 edge14: true,
11548 jxa: true,
11549 }),
11550 },
11551 {
11552 name: 'defaults',
11553 exec: function(){/*
11554 var a,b,c,d,e,f;
11555 ({a = 1, b = 0, z:c = 3} = {b:2, z:undefined});
11556 [d = 0, e = 5, f = 6] = [4,,undefined];
11557 return a === 1 && b === 2 && c === 3
11558 && d === 4 && e === 5 && f === 6;
11559 */},
11560 res: {
11561 tr: true,
11562 babel: true,
11563 typescript: true,
11564 es6tr: true,
11565 closure: true,
11566 safari9: true,
11567 safaritp: true,
11568 webkit: true,
11569 edge13: flag,
11570 edge14: true,
11571 firefox47: true,
11572 xs6: true,
11573 chrome49: true,
11574 jxa: true,
11575 },
11576 },
11577 ],
11578},
11579{
11580 name: 'destructuring, parameters',
11581 category: 'syntax',
11582 significance: 'medium',
11583 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-destructuring-assignment',
11584 subtests: [
11585 {
11586 name: 'with arrays',
11587 exec: function(){/*
11588 return function([a, , [b], c]) {
11589 return a === 5 && b === 6 && c === undefined;
11590 }([5, null, [6]]);
11591 */},
11592 res: temp.destructuringResults,
11593 },
11594 {
11595 name: 'with sparse arrays',
11596 exec: function(){/*
11597 return function([a, , b]) {
11598 return a === undefined && b === undefined;
11599 }([,,,]);
11600 */},
11601 res: temp.destructuringResults
11602 },
11603 {
11604 name: 'with strings',
11605 exec: function(){/*
11606 return function([a, b, c]) {
11607 return a === "a" && b === "b" && c === undefined;
11608 }("ab");
11609 */},
11610 res: {
11611 tr: true,
11612 babel: true,
11613 es6tr: true,
11614 jsx: true,
11615 ejs: true,
11616 closure: true,
11617 typescript: true,
11618 firefox2: true,
11619 safari71_8: true,
11620 safaritp: true,
11621 safari10: true,
11622 webkit: true,
11623 edge13: flag,
11624 edge14: true,
11625 xs6: true,
11626 chrome49: true,
11627 jxa: true,
11628 },
11629 },
11630 {
11631 name: 'with astral plane strings',
11632 exec: function(){/*
11633 return function([c]) {
11634 return c === "𠮷";
11635 }("𠮷𠮶");
11636 */},
11637 res: {
11638 tr: true,
11639 babel: true,
11640 ejs: true,
11641 typescript: false,
11642 firefox34: true,
11643 safari9: true,
11644 safaritp: true,
11645 webkit: true,
11646 edge13: flag,
11647 edge14: true,
11648 xs6: true,
11649 chrome49: true,
11650 jxa: true,
11651 },
11652 },
11653 {
11654 name: 'with generator instances',
11655 exec: function(){/*
11656 return function([a, b, c]) {
11657 return a === 1 && b === 2 && c === undefined;
11658 }(function*(){ yield 1; yield 2; }());
11659 */},
11660 res: {
11661 tr: true,
11662 typescript: false,
11663 firefox34: true,
11664 babel: true,
11665 closure: true,
11666 ejs: true,
11667 edge13: flag,
11668 edge14: true,
11669 xs6: true,
11670 safari51: false,
11671 safari6: false,
11672 safari7: false,
11673 safari71_8: false,
11674 safari9: false,
11675 safaritp: true,
11676 safari10: true,
11677 webkit: true,
11678 chrome49: true,
11679 },
11680 },
11681 {
11682 name: 'with generic iterables',
11683 exec: function(){/*
11684 return function([a, b, c]) {
11685 return a === 1 && b === 2 && c === undefined;
11686 }(global.__createIterableObject([1, 2]));
11687 */},
11688 res: {
11689 tr: true,
11690 ejs: true,
11691 typescript: false,
11692 firefox34: true,
11693 safari9: true,
11694 safaritp: true,
11695 webkit: true,
11696 babel: true,
11697 closure: true,
11698 edge13: flag,
11699 edge14: true,
11700 xs6: true,
11701 chrome49: true,
11702 jxa: true,
11703 },
11704 },
11705 {
11706 name: 'with instances of generic iterables',
11707 exec: function(){/*
11708 return function([a, b, c]) {
11709 return a === 1 && b === 2 && c === undefined;
11710 }(Object.create(global.__createIterableObject([1, 2])));
11711 */},
11712 res: {
11713 tr: true,
11714 babel: true,
11715 closure: true,
11716 ejs: true,
11717 typescript: false,
11718 firefox36: true,
11719 safari9: true,
11720 safaritp: true,
11721 webkit: true,
11722 edge13: flag,
11723 edge14: true,
11724 xs6: true,
11725 chrome49: true,
11726 jxa: true,
11727 },
11728 },
11729 {
11730 name: 'iterator closing',
11731 exec: function () {/*
11732 var closed = false;
11733 var iter = global.__createIterableObject([1, 2, 3], {
11734 'return': function(){ closed = true; return {}; }
11735 });
11736 (function([a,b]) {}(iter));
11737 return closed;
11738 */},
11739 res: {
11740 babel: true,
11741 typescript: false,
11742 edge14: true,
11743 chrome51: true,
11744 safari9: true,
11745 safaritp: true,
11746 webkit: true,
11747 xs6: true,
11748 jxa: true,
11749 },
11750 },
11751 {
11752 name: 'trailing commas in iterable patterns',
11753 exec: function(){/*
11754 return function([a,]) {
11755 return a === 1;
11756 }([1]);
11757 */},
11758 res: Object.assign({}, temp.destructuringResults, {
11759 safari71_8: false,
11760 safari9: true,
11761 tr: true,
11762 closure: false,
11763 chrome49: true,
11764 edge14: true,
11765 }),
11766 },
11767 {
11768 name: 'with objects',
11769 exec: function(){/*
11770 return function({c, x:d, e}) {
11771 return c === 7 && d === 8 && e === undefined;
11772 }({c:7, x:8});
11773 */},
11774 res: Object.assign({}, temp.destructuringResults, {
11775 firefox2: false,
11776 firefox3: {
11777 val: true,
11778 note_id: "ff11-object-destructuring",
11779 note_html: "Firefox < 16 incorrectly treats <code>({f,g} = {f:9,g:10})</code> as assigning to global variables instead of locals."
11780 },
11781 ejs: false,
11782 firefox16: true,
11783 }),
11784 },
11785 {
11786 name: 'object destructuring with primitives',
11787 exec: function(){/*
11788 return function({toFixed}, {slice}) {
11789 return toFixed === Number.prototype.toFixed
11790 && slice === String.prototype.slice;
11791 }(2,'');
11792 */},
11793 res: Object.assign({}, temp.destructuringResults, {
11794 firefox2: false,
11795 firefox3: true,
11796 }),
11797 },
11798 {
11799 name: 'trailing commas in object patterns',
11800 exec: function(){/*
11801 return function({a,}) {
11802 return a === 1;
11803 }({a:1});
11804 */},
11805 res: Object.assign({}, temp.destructuringResults, {
11806 firefox2: false,
11807 firefox3: true,
11808 safari71_8: false,
11809 safari9: true,
11810 }),
11811 },
11812 {
11813 name: 'throws on null and undefined',
11814 exec: function(){/*
11815 try {
11816 (function({a}){}(null));
11817 return false;
11818 } catch(e) {}
11819 try {
11820 (function({b}){}(undefined));
11821 return false;
11822 } catch(e) {}
11823 return true;
11824 */},
11825 res: Object.assign({}, temp.destructuringResults, {
11826 firefox2: false,
11827 firefox3: true,
11828 closure: false,
11829 safari9: true,
11830 }),
11831 },
11832 {
11833 name: 'computed properties',
11834 exec: function(){/*
11835 var qux = "corge";
11836 return function({ [qux]: grault }) {
11837 return grault === "garply";
11838 }({ corge: "garply" });
11839 */},
11840 res: {
11841 babel: true,
11842 typescript: true,
11843 closure: true,
11844 tr: true,
11845 es6tr: true,
11846 firefox35: true,
11847 edge13: flag,
11848 edge14: true,
11849 safaritp: true,
11850 safari10: true,
11851 webkit: true,
11852 xs6: true,
11853 chrome49: true,
11854 },
11855 },
11856 {
11857 name: 'nested',
11858 exec: function(){/*
11859 return function([e, {x:f, g}], {h, x:[i]}) {
11860 return e === 9 && f === 10 && g === undefined
11861 && h === 11 && i === 12;
11862 }([9, {x:10}],{h:11, x:[12]});
11863 */},
11864 res: Object.assign({}, temp.destructuringResults, {
11865 firefox2: false,
11866 firefox3: true,
11867 ejs: false,
11868 chrome49: true,
11869 }),
11870 },
11871 {
11872 name: '\'arguments\' interaction',
11873 exec: function(){/*
11874 return (function({a, x:b, y:e}, [c, d]) {
11875 return arguments[0].a === 1 && arguments[0].x === 2
11876 && !("y" in arguments[0]) && arguments[1] + '' === "3,4";
11877 }({a:1, x:2}, [3, 4]));
11878 */},
11879 res: {
11880 tr: true,
11881 babel: true,
11882 typescript: true,
11883 es6tr: true,
11884 jsx: true,
11885 closure: true,
11886 firefox3: true,
11887 safari71_8: true,
11888 safaritp: true,
11889 safari10: true,
11890 webkit: true,
11891 edge13: flag,
11892 edge14: true,
11893 xs6: true,
11894 chrome49: true,
11895 jxa: true,
11896 },
11897 },
11898 {
11899 name: 'new Function() support',
11900 exec: function(){/*
11901 return new Function("{a, x:b, y:e}","[c, d]",
11902 "return a === 1 && b === 2 && c === 3 && "
11903 + "d === 4 && e === undefined;"
11904 )({a:1, x:2}, [3, 4]);
11905 */},
11906 res: {
11907 safari71_8: true,
11908 safaritp: true,
11909 safari10: true,
11910 webkit: true,
11911 typescript: typescript.fallthrough,
11912 edge13: flag,
11913 edge14: true,
11914 xs6: true,
11915 chrome49: true,
11916 jxa: true,
11917 },
11918 },{
11919 name: 'in parameters, function \'length\' property',
11920 exec: function(){/*
11921 return function({a, b}, [c, d]){}.length === 2;
11922 */},
11923 res: {
11924 tr: true,
11925 babel: true,
11926 typescript: true,
11927 es6tr: true,
11928 jsx: true,
11929 closure: true,
11930 firefox3: true,
11931 safari71_8: true,
11932 safaritp: true,
11933 safari10: true,
11934 webkit: true,
11935 edge13: flag,
11936 edge14: true,
11937 xs6: true,
11938 chrome49: true,
11939 jxa: true,
11940 },
11941 },
11942 {
11943 name: 'rest',
11944 exec: function(){/*
11945 return function([a, ...b], [c, ...d]) {
11946 return a === 3 && b instanceof Array && (b + "") === "4,5" &&
11947 c === 6 && d instanceof Array && d.length === 0;
11948 }([3, 4, 5], [6]);
11949 */},
11950 res: {
11951 tr: true,
11952 babel: true,
11953 typescript: true,
11954 es6tr: true,
11955 jsx: true,
11956 closure: true,
11957 firefox34: true,
11958 safari9: true,
11959 safaritp: true,
11960 webkit: true,
11961 edge13: flag,
11962 edge14: true,
11963 xs6: true,
11964 chrome49: true,
11965 jxa: true,
11966 },
11967 },
11968 {
11969 name: 'empty patterns',
11970 exec: function(){/*
11971 return function ([],{}){
11972 return arguments[0] + '' === "3,4" && arguments[1].x === "foo";
11973 }([3,4],{x:"foo"});
11974 */},
11975 res: Object.assign({}, temp.destructuringResults, {
11976 ejs: true,
11977 safari71_8: false,
11978 safari9: true,
11979 jsx: false,
11980 }),
11981 },
11982 {
11983 name: 'defaults',
11984 exec: function(){/*
11985 return (function({a = 1, b = 0, c = 3, x:d = 0, y:e = 5},
11986 [f = 6, g = 0, h = 8]) {
11987 return a === 1 && b === 2 && c === 3 && d === 4 &&
11988 e === 5 && f === 6 && g === 7 && h === 8;
11989 }({b:2, c:undefined, x:4},[, 7, undefined]));
11990 */},
11991 res: {
11992 tr: true,
11993 babel: true,
11994 typescript: true,
11995 es6tr: true,
11996 closure: true,
11997 safaritp: true,
11998 safari10: true,
11999 webkit: true,
12000 edge13: flag,
12001 edge14: true,
12002 firefox47: true,
12003 xs6: true,
12004 chrome49: true,
12005 },
12006 },
12007 {
12008 name: 'defaults, separate scope',
12009 exec: function(){/*
12010 return (function({a=function(){
12011 return typeof b === 'undefined';
12012 }}){
12013 var b = 1;
12014 return a();
12015 }({}));
12016 */},
12017 res: {
12018 babel: false,
12019 closure: true,
12020 edge13: flag,
12021 edge14: true,
12022 firefox51: true,
12023 xs6: true,
12024 chrome49: true,
12025 safaritp: true,
12026 safari10: true,
12027 webkit: true,
12028 },
12029 },
12030 {
12031 name: 'defaults, new Function() support',
12032 exec: function(){/*
12033 return new Function("{a = 1, b = 0, c = 3, x:d = 0, y:e = 5}",
12034 "return a === 1 && b === 2 && c === 3 && d === 4 && e === 5;"
12035 )({b:2, c:undefined, x:4});
12036 */},
12037 res: {
12038 safaritp: true,
12039 safari10: true,
12040 webkit: true,
12041 typescript: typescript.fallthrough,
12042 edge13: flag,
12043 edge14: true,
12044 xs6: true,
12045 ejs: { val: false, note_id: 'ejs-no-function-ctor' },
12046 chrome49: true,
12047 },
12048 },
12049 ],
12050},
12051{
12052 name: 'Promise',
12053 category: 'built-ins',
12054 significance: 'large',
12055 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-promise-objects',
12056 subtests: [
12057 {
12058 name: 'basic functionality',
12059 exec: function () {/*
12060 var p1 = new Promise(function(resolve, reject) { resolve("foo"); });
12061 var p2 = new Promise(function(resolve, reject) { reject("quux"); });
12062 var score = 0;
12063
12064 function thenFn(result) { score += (result === "foo"); check(); }
12065 function catchFn(result) { score += (result === "quux"); check(); }
12066 function shouldNotRun(result) { score = -Infinity; }
12067
12068 p1.then(thenFn, shouldNotRun);
12069 p2.then(shouldNotRun, catchFn);
12070 p1.catch(shouldNotRun);
12071 p2.catch(catchFn);
12072
12073 p1.then(function() {
12074 // Promise.prototype.then() should return a new Promise
12075 score += p1.then() !== p1;
12076 check();
12077 });
12078
12079 function check() {
12080 if (score === 4) asyncTestPassed();
12081 }
12082 */},
12083 res: {
12084 tr: true,
12085 babel: true,
12086 typescript: typescript.corejs,
12087 ejs: true,
12088 es6shim: true,
12089 edge12: true,
12090 firefox29: true,
12091 chrome33: true,
12092 safari71_8: true,
12093 safaritp: true,
12094 safari10: true,
12095 webkit: true,
12096 node012: true,
12097 xs6: true,
12098 },
12099 },
12100 {
12101 name: 'constructor requires new',
12102 exec: function () {/*
12103 new Promise(function(){});
12104 try {
12105 Promise(function(){});
12106 return false;
12107 } catch(e) {
12108 return true;
12109 }
12110 */},
12111 res: {
12112 babel: true,
12113 typescript: typescript.corejs,
12114 ejs: true,
12115 es6shim: true,
12116 firefox37: true,
12117 edge12: true,
12118 chrome33: true,
12119 node4: true,
12120 safaritp: true,
12121 safari10: true,
12122 webkit: true,
12123 xs6: true,
12124 },
12125 },
12126 {
12127 name: 'Promise.prototype isn\'t an instance',
12128 exec: function () {/*
12129 new Promise(function(){});
12130 try {
12131 Promise.prototype.then(function(){});
12132 } catch (e) {
12133 return true;
12134 }
12135 */},
12136 res: {
12137 tr: true,
12138 babel: true,
12139 typescript: typescript.corejs,
12140 ejs: true,
12141 es6shim: true,
12142 edge12: true,
12143 firefox29: true,
12144 firefox38: false,
12145 firefox39: true,
12146 chrome33: true,
12147 safari71_8: true,
12148 safaritp: true,
12149 safari10: true,
12150 webkit: true,
12151 node012: true,
12152 xs6: true,
12153 },
12154 },
12155 {
12156 name: 'Promise.all',
12157 exec: function () {/*
12158 var fulfills = Promise.all([
12159 new Promise(function(resolve) { setTimeout(resolve,2000,"foo"); }),
12160 new Promise(function(resolve) { setTimeout(resolve,1000,"bar"); }),
12161 ]);
12162 var rejects = Promise.all([
12163 new Promise(function(_, reject) { setTimeout(reject, 2000,"baz"); }),
12164 new Promise(function(_, reject) { setTimeout(reject, 1000,"qux"); }),
12165 ]);
12166 var score = 0;
12167 fulfills.then(function(result) { score += (result + "" === "foo,bar"); check(); });
12168 rejects.catch(function(result) { score += (result === "qux"); check(); });
12169
12170 function check() {
12171 if (score === 2) asyncTestPassed();
12172 }
12173 */},
12174 res: {
12175 tr: true,
12176 babel: true,
12177 typescript: typescript.corejs,
12178 es6shim: true,
12179 edge12: true,
12180 firefox29: true,
12181 chrome33: true,
12182 safari71_8: true,
12183 safaritp: true,
12184 safari10: true,
12185 webkit: true,
12186 node012: true,
12187 xs6: true,
12188 },
12189 },
12190 {
12191 name: 'Promise.all, generic iterables',
12192 exec: function () {/*
12193 var fulfills = Promise.all(global.__createIterableObject([
12194 new Promise(function(resolve) { setTimeout(resolve,2000,"foo"); }),
12195 new Promise(function(resolve) { setTimeout(resolve,1000,"bar"); }),
12196 ]));
12197 var rejects = Promise.all(global.__createIterableObject([
12198 new Promise(function(_, reject) { setTimeout(reject, 2000,"baz"); }),
12199 new Promise(function(_, reject) { setTimeout(reject, 1000,"qux"); }),
12200 ]));
12201 var score = 0;
12202 fulfills.then(function(result) { score += (result + "" === "foo,bar"); check(); });
12203 rejects.catch(function(result) { score += (result === "qux"); check(); });
12204
12205 function check() {
12206 if (score === 2) asyncTestPassed();
12207 }
12208 */},
12209 res: {
12210 babel: true,
12211 es6shim: true,
12212 typescript: typescript.corejs,
12213 edge12: true,
12214 firefox38: true,
12215 chrome43: true,
12216 safari9: true,
12217 safaritp: true,
12218 webkit: true,
12219 node4: true,
12220 xs6: true,
12221 },
12222 },
12223 {
12224 name: 'Promise.race',
12225 exec: function () {/*
12226 var fulfills = Promise.race([
12227 new Promise(function(resolve) { setTimeout(resolve,1000,"foo"); }),
12228 new Promise(function(_, reject) { setTimeout(reject, 2000,"bar"); }),
12229 ]);
12230 var rejects = Promise.race([
12231 new Promise(function(_, reject) { setTimeout(reject, 1000,"baz"); }),
12232 new Promise(function(resolve) { setTimeout(resolve,2000,"qux"); }),
12233 ]);
12234 var score = 0;
12235 fulfills.then(function(result) { score += (result === "foo"); check(); });
12236 rejects.catch(function(result) { score += (result === "baz"); check(); });
12237
12238 function check() {
12239 if (score === 2) asyncTestPassed();
12240 }
12241 */},
12242 res: {
12243 tr: true,
12244 babel: true,
12245 typescript: typescript.corejs,
12246 es6shim: true,
12247 edge12: true,
12248 firefox29: true,
12249 chrome33: true,
12250 safaritp: true,
12251 safari10: true,
12252 webkit: true,
12253 safari71_8: true,
12254 node012: true,
12255 xs6: true,
12256 },
12257 },
12258 {
12259 name: 'Promise.race, generic iterables',
12260 exec: function () {/*
12261 var fulfills = Promise.race(global.__createIterableObject([
12262 new Promise(function(resolve) { setTimeout(resolve,1000,"foo"); }),
12263 new Promise(function(_, reject) { setTimeout(reject, 2000,"bar"); }),
12264 ]));
12265 var rejects = Promise.race(global.__createIterableObject([
12266 new Promise(function(_, reject) { setTimeout(reject, 1000,"baz"); }),
12267 new Promise(function(resolve) { setTimeout(resolve,2000,"qux"); }),
12268 ]));
12269 var score = 0;
12270 fulfills.then(function(result) { score += (result === "foo"); check(); });
12271 rejects.catch(function(result) { score += (result === "baz"); check(); });
12272
12273 function check() {
12274 if (score === 2) asyncTestPassed();
12275 }
12276 */},
12277 res: {
12278 babel: true,
12279 es6shim: true,
12280 typescript: typescript.corejs,
12281 edge12: true,
12282 firefox38: true,
12283 chrome43: true,
12284 safari9: true,
12285 safaritp: true,
12286 webkit: true,
12287 node4: true,
12288 xs6: true,
12289 },
12290 },
12291 {
12292 name: 'Promise[Symbol.species]',
12293 exec: function () {/*
12294 var prop = Object.getOwnPropertyDescriptor(Promise, Symbol.species);
12295 return 'get' in prop && Promise[Symbol.species] === Promise;
12296 */},
12297 res: {
12298 ejs: true,
12299 babel: true,
12300 typescript: typescript.corejs,
12301 edge13: true,
12302 firefox45: true,
12303 chrome50: flag,
12304 chrome51: true,
12305 xs6: true,
12306 safaritp: true,
12307 safari10: true,
12308 webkit: true,
12309 },
12310 },
12311 ],
12312},
12313{
12314 name: 'Object static methods',
12315 category: 'built-in extensions',
12316 significance: 'medium',
12317 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-properties-of-the-object-constructor',
12318 subtests: [
12319 {
12320 name: 'Object.assign',
12321 exec: function () {/*
12322 var o = Object.assign({a:true}, {b:true}, {c:true});
12323 return "a" in o && "b" in o && "c" in o;
12324 */},
12325 res: {
12326 tr: true,
12327 ejs: true,
12328 babel: true,
12329 typescript: typescript.corejs,
12330 closure: true,
12331 es6shim: true,
12332 edge12: true,
12333 firefox34: true,
12334 safari9: true,
12335 safaritp: true,
12336 webkit: true,
12337 chrome45: true,
12338 node4: true,
12339 xs6: true,
12340 jxa: true,
12341 },
12342 },
12343 {
12344 name: 'Object.is',
12345 exec: function () {/*
12346 return typeof Object.is === 'function' &&
12347 Object.is(NaN, NaN) &&
12348 !Object.is(-0, 0);
12349 */},
12350 res: {
12351 tr: true,
12352 ejs: true,
12353 es6shim: true,
12354 babel: true,
12355 typescript: typescript.corejs,
12356 closure: true,
12357 edge12: true,
12358 firefox23: true,
12359 chrome19dev: true,
12360 safari9: true,
12361 safaritp: true,
12362 webkit: true,
12363 konq49: true,
12364 node012: true,
12365 android41: true,
12366 xs6: true,
12367 jxa: true,
12368 },
12369 },
12370 {
12371 name: 'Object.getOwnPropertySymbols',
12372 exec: function () {/*
12373 var o = {};
12374 var sym = Symbol(), sym2 = Symbol(), sym3 = Symbol();
12375 o[sym] = true;
12376 o[sym2] = true;
12377 o[sym3] = true;
12378 var result = Object.getOwnPropertySymbols(o);
12379 return result[0] === sym
12380 && result[1] === sym2
12381 && result[2] === sym3;
12382 */},
12383 res: {
12384 babel: true,
12385 typescript: typescript.corejs,
12386 tr: true,
12387 ejs: true,
12388 edge12: true,
12389 firefox36: true,
12390 safari9: true,
12391 safaritp: true,
12392 webkit: true,
12393 chrome34: flag,
12394 chrome38: true,
12395 node012: true,
12396 xs6: true,
12397 jxa: true,
12398 },
12399 },
12400 {
12401 name: 'Object.setPrototypeOf',
12402 exec: function () {/*
12403 return Object.setPrototypeOf({}, Array.prototype) instanceof Array;
12404 */},
12405 res: {
12406 ejs: true,
12407 babel: { val: false, note_id: 'compiler-proto' },
12408 typescript: { val: false, note_id: 'compiler-proto' },
12409 es6shim: { val: false, note_id: 'compiler-proto' },
12410 ie11: true,
12411 firefox31: true,
12412 chrome34: true,
12413 safari9: true,
12414 safaritp: true,
12415 webkit: true,
12416 node012: true,
12417 xs6: true,
12418 jxa: true,
12419 },
12420 },
12421 ],
12422},
12423{
12424 name: 'Object static methods accept primitives',
12425 category: 'misc',
12426 significance: 'tiny',
12427 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-properties-of-the-object-constructor',
12428 subtests: [
12429 {
12430 name: 'Object.getPrototypeOf',
12431 exec: function () {/*
12432 return Object.getPrototypeOf('a').constructor === String;
12433 */},
12434 res: {
12435 babel: true,
12436 typescript: typescript.corejs,
12437 ejs: true,
12438 es6shim: true,
12439 edge12: true,
12440 firefox3_5: true,
12441 firefox4: false,
12442 firefox35: true,
12443 safari9: true,
12444 safaritp: true,
12445 webkit: true,
12446 chrome44: true,
12447 node4: true,
12448 xs6: true,
12449 jxa: true,
12450 },
12451 },
12452 {
12453 name: 'Object.getOwnPropertyDescriptor',
12454 exec: function () {/*
12455 return Object.getOwnPropertyDescriptor('a', 'foo') === undefined;
12456 */},
12457 res: {
12458 babel: true,
12459 typescript: typescript.corejs,
12460 ejs: true,
12461 es6shim: true,
12462 edge12: true,
12463 firefox35: true,
12464 safari9: true,
12465 safaritp: true,
12466 webkit: true,
12467 chrome44: true,
12468 node4: true,
12469 xs6: true,
12470 jxa: true,
12471 },
12472 },
12473 {
12474 name: 'Object.getOwnPropertyNames',
12475 exec: function () {/*
12476 var s = Object.getOwnPropertyNames('a');
12477 return s.length === 2 &&
12478 ((s[0] === 'length' && s[1] === '0') || (s[0] === '0' && s[1] === 'length'));
12479 */},
12480 res: {
12481 babel: true,
12482 typescript: typescript.corejs,
12483 ejs: true,
12484 edge12: true,
12485 firefox33: true,
12486 chrome40: true,
12487 node4: true,
12488 es6shim: true,
12489 safari9: true,
12490 safaritp: true,
12491 webkit: true,
12492 chrome44: true,
12493 xs6: true,
12494 jxa: true,
12495 },
12496 },
12497 {
12498 name: 'Object.seal',
12499 exec: function () {/*
12500 return Object.seal('a') === 'a';
12501 */},
12502 res: {
12503 babel: true,
12504 typescript: typescript.corejs,
12505 ejs: true,
12506 es6shim: true,
12507 edge12: true,
12508 firefox35: true,
12509 safari9: true,
12510 safaritp: true,
12511 webkit: true,
12512 chrome44: true,
12513 node4: true,
12514 xs6: true,
12515 jxa: true,
12516 },
12517 },
12518 {
12519 name: 'Object.freeze',
12520 exec: function () {/*
12521 return Object.freeze('a') === 'a';
12522 */},
12523 res: {
12524 babel: true,
12525 typescript: typescript.corejs,
12526 ejs: true,
12527 es6shim: true,
12528 edge12: true,
12529 firefox35: true,
12530 safari9: true,
12531 safaritp: true,
12532 webkit: true,
12533 chrome44: true,
12534 node4: true,
12535 xs6: true,
12536 jxa: true,
12537 },
12538 },
12539 {
12540 name: 'Object.preventExtensions',
12541 exec: function () {/*
12542 return Object.preventExtensions('a') === 'a';
12543 */},
12544 res: {
12545 babel: true,
12546 typescript: typescript.corejs,
12547 ejs: true,
12548 es6shim: true,
12549 edge12: true,
12550 firefox35: true,
12551 safari9: true,
12552 safaritp: true,
12553 webkit: true,
12554 chrome44: true,
12555 node4: true,
12556 xs6: true,
12557 jxa: true,
12558 },
12559 },
12560 {
12561 name: 'Object.isSealed',
12562 exec: function () {/*
12563 return Object.isSealed('a') === true;
12564 */},
12565 res: {
12566 babel: true,
12567 typescript: typescript.corejs,
12568 ejs: true,
12569 es6shim: true,
12570 edge12: true,
12571 firefox35: true,
12572 safari9: true,
12573 safaritp: true,
12574 webkit: true,
12575 chrome44: true,
12576 node4: true,
12577 xs6: true,
12578 jxa: true,
12579 },
12580 },
12581 {
12582 name: 'Object.isFrozen',
12583 exec: function () {/*
12584 return Object.isFrozen('a') === true;
12585 */},
12586 res: {
12587 babel: true,
12588 typescript: typescript.corejs,
12589 ejs: true,
12590 es6shim: true,
12591 edge12: true,
12592 firefox35: true,
12593 safari9: true,
12594 safaritp: true,
12595 webkit: true,
12596 chrome44: true,
12597 node4: true,
12598 xs6: true,
12599 jxa: true,
12600 },
12601 },
12602 {
12603 name: 'Object.isExtensible',
12604 exec: function () {/*
12605 return Object.isExtensible('a') === false;
12606 */},
12607 res: {
12608 babel: true,
12609 typescript: typescript.corejs,
12610 ejs: true,
12611 es6shim: true,
12612 edge12: true,
12613 firefox35: true,
12614 safari9: true,
12615 safaritp: true,
12616 webkit: true,
12617 chrome44: true,
12618 node4: true,
12619 xs6: true,
12620 jxa: true,
12621 },
12622 },
12623 {
12624 name: 'Object.keys',
12625 exec: function () {/*
12626 var s = Object.keys('a');
12627 return s.length === 1 && s[0] === '0';
12628 */},
12629 res: {
12630 babel: true,
12631 typescript: typescript.corejs,
12632 es6shim: true,
12633 edge12: true,
12634 firefox35: true,
12635 chrome40: true,
12636 safari9: true,
12637 safaritp: true,
12638 webkit: true,
12639 node4: true,
12640 chrome44: true,
12641 xs6: true,
12642 jxa: true,
12643 },
12644 },
12645 ],
12646},
12647{
12648 name: 'Object.prototype.__proto__',
12649 category: 'annex b',
12650 significance: 'tiny',
12651 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-object.prototype.__proto__',
12652 subtests: [
12653 {
12654 name: 'get prototype',
12655 exec: function() {/*
12656 var A = function(){};
12657 return (new A()).__proto__ === A.prototype;
12658 */},
12659 res: (temp.basicProtoResults = {
12660 ie11: true,
12661 firefox2: true,
12662 chrome: true,
12663 safari51: true,
12664 safaritp: true,
12665 safari10: true,
12666 webkit: true,
12667 opera: true,
12668 konq49: true,
12669 rhino17: true,
12670 node012: true,
12671 android40: true,
12672 xs6: true,
12673 ejs: true,
12674 jxa: true,
12675 }),
12676 },
12677 {
12678 name: 'set prototype',
12679 exec: function() {/*
12680 var o = {};
12681 o.__proto__ = Array.prototype;
12682 return o instanceof Array;
12683 */},
12684 res: Object.assign({}, temp.basicProtoResults, {
12685 ejs: false,
12686 }),
12687 },
12688 {
12689 name: 'absent from Object.create(null)',
12690 exec: function () {/*
12691 var o = Object.create(null), p = {};
12692 o.__proto__ = p;
12693 return Object.getPrototypeOf(o) !== p;
12694 */},
12695 res: (temp.advancedProtoResults = {
12696 ie11: true,
12697 firefox4: true,
12698 chrome30: true,
12699 safari6: true,
12700 safaritp: true,
12701 safari10: true,
12702 webkit: true,
12703 opera: true,
12704 rhino17: true,
12705 node012: true,
12706 xs6: true,
12707 ejs: true,
12708 jxa: true,
12709 }),
12710 },
12711 {
12712 name: 'present in hasOwnProperty()',
12713 exec: function () {/*
12714 return Object.prototype.hasOwnProperty('__proto__');
12715 */},
12716 res: Object.assign({}, temp.advancedProtoResults, {
12717 firefox2: true,
12718 konq49: true,
12719 safari51: true,
12720 android40: true,
12721 android41: false,
12722 xs6: true,
12723 ejs: false,
12724 }),
12725 },
12726 {
12727 name: 'correct property descriptor',
12728 exec: function () {/*
12729 var desc = Object.getOwnPropertyDescriptor(Object.prototype,"__proto__");
12730 var A = function(){};
12731
12732 return (desc
12733 && "get" in desc
12734 && "set" in desc
12735 && desc.configurable
12736 && !desc.enumerable);
12737 */},
12738 res: Object.assign({}, temp.advancedProtoResults, {
12739 firefox4: false,
12740 rhino17: false,
12741 firefox17: true,
12742 xs6: true,
12743 ejs: false,
12744 }),
12745 },
12746 {
12747 name: 'present in Object.getOwnPropertyNames()',
12748 exec: function () {/*
12749 return Object.getOwnPropertyNames(Object.prototype).indexOf('__proto__') > -1;
12750 */},
12751 res: Object.assign({}, temp.advancedProtoResults, {
12752 firefox4: false,
12753 firefox7: true,
12754 firefox10: false,
12755 firefox39: true,
12756 rhino17: false,
12757 xs6: true,
12758 ejs: false,
12759 }),
12760 },
12761 ],
12762},
12763{
12764 name: 'function "name" property',
12765 category: 'built-in extensions',
12766 significance: 'small',
12767 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-setfunctionname',
12768 subtests: [
12769 {
12770 name: 'function statements',
12771 exec: function () {/*
12772 function foo(){};
12773 return foo.name === 'foo' &&
12774 (function(){}).name === '';
12775 */},
12776 res: (temp.legacyFunctionNameResults = {
12777 babel: true,
12778 typescript: typescript.corejs,
12779 ejs: true,
12780 firefox2: true,
12781 edge12: true,
12782 chrome: true,
12783 safari51: true,
12784 safaritp: true,
12785 safari10: true,
12786 webkit: true,
12787 opera: true,
12788 konq49: true,
12789 rhino17: true,
12790 node012: true,
12791 android40: true,
12792 edge13: false,
12793 edge14: true,
12794 xs6: true,
12795 jxa: true,
12796 }),
12797 },
12798 {
12799 name: 'function expressions',
12800 exec: function () {/*
12801 return (function foo(){}).name === 'foo' &&
12802 (function(){}).name === '';
12803 */},
12804 res: temp.legacyFunctionNameResults,
12805 },
12806 {
12807 name: 'new Function',
12808 exec: function () {/*
12809 return (new Function).name === "anonymous";
12810 */},
12811 res: {
12812 firefox2: true,
12813 edge12: true,
12814 safari51: true,
12815 safaritp: true,
12816 safari10: true,
12817 webkit: true,
12818 konq49: true,
12819 rhino17: true,
12820 android40: true,
12821 android41: false,
12822 chrome48: true,
12823 xs6: true,
12824 ejs: { val: false, note_id: 'ejs-no-function-ctor' },
12825 jxa: true,
12826 },
12827 },
12828 {
12829 name: 'bound functions',
12830 exec: function() {/*
12831 function foo() {};
12832 return foo.bind({}).name === "bound foo" &&
12833 (function(){}).bind({}).name === "bound ";
12834 */},
12835 res: {
12836 ejs: true,
12837 edge12: true,
12838 firefox47: true,
12839 chrome45: true,
12840 node4: true,
12841 xs6: true,
12842 safaritp: true,
12843 safari10: true,
12844 webkit: true,
12845 jxa: true,
12846 },
12847 },
12848 {
12849 name: 'variables (function)',
12850 exec: function() {/*
12851 var foo = function() {};
12852 var bar = function baz() {};
12853 return foo.name === "foo" && bar.name === "baz";
12854 */},
12855 res: {
12856 edge12: flag,
12857 chrome50: flag,
12858 chrome51: true,
12859 babel: true,
12860 xs6: true,
12861 jxa: true,
12862 safaritp: true,
12863 safari10: true,
12864 webkit: true,
12865 },
12866 },
12867 {
12868 name: 'object methods (function)',
12869 exec: function() {/*
12870 var o = { foo: function(){}, bar: function baz(){}};
12871 o.qux = function(){};
12872 return o.foo.name === "foo" &&
12873 o.bar.name === "baz" &&
12874 o.qux.name === "";
12875 */},
12876 res: {
12877 babel: true,
12878 edge12: flag,
12879 edge13: true,
12880 chrome50: flag,
12881 chrome51: true,
12882 xs6: true,
12883 jxa: true,
12884 safaritp: true,
12885 safari10: true,
12886 webkit: true,
12887 },
12888 },
12889 {
12890 name: 'accessor properties',
12891 exec: function() {/*
12892 var o = { get foo(){}, set foo(x){} };
12893 var descriptor = Object.getOwnPropertyDescriptor(o, "foo");
12894 return descriptor.get.name === "get foo" &&
12895 descriptor.set.name === "set foo";
12896 */},
12897 res: {
12898 edge12: true,
12899 firefox49: true,
12900 chrome50: flag,
12901 chrome51: true,
12902 xs6: true,
12903 jxa: true,
12904 safaritp: true,
12905 safari10: true,
12906 webkit: true,
12907 },
12908 },
12909 {
12910 name: 'shorthand methods',
12911 exec: function() {/*
12912 var o = { foo(){} };
12913 return o.foo.name === "foo";
12914 */},
12915 res: {
12916 babel: true,
12917 firefox34: true,
12918 edge12: flag,
12919 edge13: true,
12920 chrome41: flag,
12921 chrome42: true,
12922 safari9: true,
12923 safaritp: true,
12924 webkit: true,
12925 node4: true,
12926 xs6: true,
12927 jxa: true,
12928 },
12929 },
12930 {
12931 name: 'shorthand methods (no lexical binding)',
12932 exec: function() {/*
12933 var f = "foo";
12934 return ({f() { return f; }}).f() === "foo";
12935 */},
12936 res: {
12937 babel: true,
12938 typescript: typescript.corejs,
12939 firefox34: true,
12940 edge12: true,
12941 chrome41: flag,
12942 chrome42: true,
12943 node4: true,
12944 xs6: true,
12945 ejs: true,
12946 jxa: true,
12947 safaritp: true,
12948 safari10: true,
12949 webkit: true,
12950 },
12951 },
12952 {
12953 name: 'symbol-keyed methods',
12954 exec: function() {/*
12955 var sym1 = Symbol("foo");
12956 var sym2 = Symbol();
12957 var o = {
12958 [sym1]: function(){},
12959 [sym2]: function(){}
12960 };
12961
12962 return o[sym1].name === "[foo]" &&
12963 o[sym2].name === "";
12964 */},
12965 res: {
12966 edge12: true,
12967 chrome50: flag,
12968 chrome51: true,
12969 xs6: true,
12970 jxa: true,
12971 safaritp: true,
12972 safari10: true,
12973 webkit: true,
12974 },
12975 },
12976 {
12977 name: 'class statements',
12978 exec: function() {/*
12979 class foo {};
12980 class bar { static name() {} };
12981 return foo.name === "foo" &&
12982 typeof bar.name === "function";
12983 */},
12984 res: {
12985 babel: {
12986 val: false,
12987 note_id: "name-configurable",
12988 note_html: 'Requires function <code>"name"</code> properties to be natively configurable',
12989 },
12990 edge12: flag,
12991 edge13: true,
12992 firefox45: true,
12993 chrome43: strict,
12994 chrome49: true,
12995 node4: strict,
12996 xs6: true,
12997 safaritp: true,
12998 safari10: true,
12999 webkit: true,
13000 },
13001 },
13002 {
13003 name: 'class expressions',
13004 exec: function() {/*
13005 return class foo {}.name === "foo" &&
13006 typeof class bar { static name() {} }.name === "function";
13007 */},
13008 res: {
13009 babel: { val: false, note_id: "name-configurable" },
13010 edge12: flag,
13011 edge13: true,
13012 firefox45: true,
13013 chrome43: strict,
13014 chrome49: true,
13015 node4: strict,
13016 xs6: true,
13017 safaritp: true,
13018 safari10: true,
13019 webkit: true,
13020 },
13021 },
13022 {
13023 name: 'variables (class)',
13024 exec: function() {/*
13025 var foo = class {};
13026 var bar = class baz {};
13027 var qux = class { static name() {} };
13028 return foo.name === "foo" &&
13029 bar.name === "baz" &&
13030 typeof qux.name === "function";
13031 */},
13032 res: {
13033 babel: { val: false, note_id: "name-configurable" },
13034 edge12: flag,
13035 edge13: true,
13036 chrome50: flag,
13037 chrome51: true,
13038 xs6: true,
13039 safaritp: true,
13040 safari10: true,
13041 webkit: true,
13042 },
13043 },
13044 {
13045 name: 'object methods (class)',
13046 exec: function() {/*
13047 var o = { foo: class {}, bar: class baz {}};
13048 o.qux = class {};
13049 return o.foo.name === "foo" &&
13050 o.bar.name === "baz" &&
13051 o.qux.name === "";
13052 */},
13053 res: {
13054 babel: false,
13055 edge12: flag,
13056 edge13: true,
13057 chrome50: flag,
13058 chrome51: true,
13059 xs6: true,
13060 jxa: true,
13061 safaritp: true,
13062 safari10: true,
13063 webkit: true,
13064 },
13065 },
13066 {
13067 name: 'class prototype methods',
13068 exec: function() {/*
13069 class C { foo(){} };
13070 return (new C).foo.name === "foo";
13071 */},
13072 res: {
13073 babel: true,
13074 edge12: flag,
13075 edge13: true,
13076 edge14: true,
13077 firefox45: true,
13078 safari9: true,
13079 safaritp: true,
13080 webkit: true,
13081 chrome43: strict,
13082 chrome49: true,
13083 node4: strict,
13084 xs6: true,
13085 jxa: true,
13086 },
13087 },
13088 {
13089 name: 'class static methods',
13090 exec: function() {/*
13091 class C { static foo(){} };
13092 return C.foo.name === "foo";
13093 */},
13094 res: {
13095 babel: true,
13096 ejs: true,
13097 edge12: flag,
13098 edge13: true,
13099 firefox45: true,
13100 safari9: true,
13101 safaritp: true,
13102 webkit: true,
13103 chrome43: strict,
13104 chrome49: true,
13105 node4: strict,
13106 xs6: true,
13107 jxa: true,
13108 },
13109 },
13110 {
13111 name: 'isn\'t writable, is configurable',
13112 exec: function () {/*
13113 var descriptor = Object.getOwnPropertyDescriptor(function f(){},"name");
13114 return descriptor.enumerable === false &&
13115 descriptor.writable === false &&
13116 descriptor.configurable === true;
13117 */},
13118 res: {
13119 edge12: true,
13120 firefox38: true,
13121 chrome43: true,
13122 node4: true,
13123 xs6: true,
13124 safaritp: true,
13125 safari10: true,
13126 webkit: true,
13127 jxa: true,
13128 },
13129 },
13130 ],
13131},
13132{
13133 name: 'String static methods',
13134 category: 'built-in extensions',
13135 significance: 'medium',
13136 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-constructor',
13137 subtests: [
13138 {
13139 name: 'String.raw',
13140 exec: function() {/*
13141 return typeof String.raw === 'function';
13142 */},
13143 res: {
13144 tr: true,
13145 babel: true,
13146 typescript: typescript.corejs,
13147 ejs: true,
13148 es6shim: true,
13149 edge12: true,
13150 firefox34: true,
13151 chrome41: true,
13152 safari9: true,
13153 safaritp: true,
13154 webkit: true,
13155 node4: true,
13156 xs6: true,
13157 jxa: true,
13158 },
13159 },
13160 {
13161 name: 'String.fromCodePoint',
13162 exec: function() {/*
13163 return typeof String.fromCodePoint === 'function';
13164 */},
13165 res: {
13166 tr: true,
13167 babel: true,
13168 typescript: typescript.corejs,
13169 closure: true,
13170 ejs: true,
13171 es6shim: true,
13172 edge12: true,
13173 firefox29: true,
13174 chrome38: flag,
13175 chrome41: true,
13176 safari9: true,
13177 safaritp: true,
13178 webkit: true,
13179 node012: flag,
13180 node4: true,
13181 xs6: true,
13182 jxa: true,
13183 },
13184 },
13185 ],
13186},
13187{
13188 name: 'String.prototype methods',
13189 category: 'built-in extensions',
13190 significance: 'medium',
13191 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object',
13192 subtests: [
13193 {
13194 name: 'String.prototype.codePointAt',
13195 exec: function () {/*
13196 return typeof String.prototype.codePointAt === 'function';
13197 */},
13198 res: {
13199 tr: true,
13200 babel: true,
13201 typescript: typescript.corejs,
13202 closure: true,
13203 ejs: true,
13204 es6shim: true,
13205 edge12: true,
13206 firefox29: true,
13207 chrome38: flag,
13208 chrome41: true,
13209 safari9: true,
13210 safaritp: true,
13211 webkit: true,
13212 node012: flag,
13213 node4: true,
13214 xs6: true,
13215 jxa: true,
13216 },
13217 },
13218 {
13219 name: 'String.prototype.normalize',
13220 exec: function () {/*
13221 return typeof String.prototype.normalize === "function"
13222 && "c\u0327\u0301".normalize("NFC") === "\u1e09"
13223 && "\u1e09".normalize("NFD") === "c\u0327\u0301";
13224 */},
13225 res: {
13226 edge12: true,
13227 firefox31: true,
13228 chrome34: true,
13229 chrome41: true,
13230 node4: true,
13231 xs6: true,
13232 safaritp: true,
13233 safari10: true,
13234 webkit: true,
13235 jxa: true,
13236 },
13237 },
13238 {
13239 name: 'String.prototype.repeat',
13240 exec: function () {/*
13241 return typeof String.prototype.repeat === 'function'
13242 && "foo".repeat(3) === "foofoofoo";
13243 */},
13244 res: {
13245 tr: true,
13246 babel: true,
13247 typescript: typescript.corejs,
13248 closure: true,
13249 ejs: true,
13250 es6shim: true,
13251 edge12: true,
13252 firefox24: true,
13253 safari9: true,
13254 safaritp: true,
13255 webkit: true,
13256 chrome30: flag,
13257 chrome41: true,
13258 node012: flag,
13259 node4: true,
13260 xs6: true,
13261 jxa: true,
13262 },
13263 },
13264 {
13265 name: 'String.prototype.startsWith',
13266 exec: function () {/*
13267 return typeof String.prototype.startsWith === 'function'
13268 && "foobar".startsWith("foo");
13269 */},
13270 res: (temp.startsWith = {
13271 tr: true,
13272 babel: true,
13273 typescript: typescript.corejs,
13274 closure: true,
13275 ejs: true,
13276 es6shim: true,
13277 edge12: true,
13278 firefox17: true,
13279 chrome30: flag,
13280 chrome41: true,
13281 safari9: true,
13282 safaritp: true,
13283 webkit: true,
13284 node012: flag,
13285 node4: true,
13286 xs6: true,
13287 jxa: true,
13288 }),
13289 },
13290 {
13291 name: 'String.prototype.startsWith throws on RegExp',
13292 exec: function () {/*
13293 try {
13294 "a".startsWith(/./);
13295 } catch(e) {
13296 return typeof String.prototype.startsWith === 'function';
13297 }
13298 */},
13299 res: (temp.startsWithThrows = Object.assign({}, temp.startsWith, {
13300 firefox17: false,
13301 firefox31: true,
13302 chrome30: false,
13303 chrome34: flag,
13304 })),
13305 },
13306 {
13307 name: 'String.prototype.endsWith',
13308 exec: function () {/*
13309 return typeof String.prototype.endsWith === 'function'
13310 && "foobar".endsWith("bar");
13311 */},
13312 res: temp.startsWith,
13313 },
13314 {
13315 name: 'String.prototype.endsWith throws on RegExp',
13316 exec: function () {/*
13317 try {
13318 "a".endsWith(/./);
13319 } catch(e) {
13320 return typeof String.prototype.endsWith === 'function';
13321 }
13322 */},
13323 res: (temp.startsWithThrows = Object.assign({}, temp.startsWith, {
13324 firefox17: false,
13325 firefox31: true,
13326 chrome30: false,
13327 chrome34: flag,
13328 })),
13329 },
13330 {
13331 name: 'String.prototype.includes',
13332 exec: function () {/*
13333 return typeof String.prototype.includes === 'function'
13334 && "foobar".includes("oba");
13335 */},
13336 res: {
13337 tr: true,
13338 babel: true,
13339 typescript: typescript.corejs,
13340 closure: true,
13341 ejs: true,
13342 es6shim: true,
13343 firefox18: {
13344 val: false,
13345 note_id: 'string-contains',
13346 note_html: 'Available as the draft standard <code>String.prototype.contains</code>'
13347 },
13348 firefox40: true,
13349 chrome30: { val: false, note_id: 'string-contains' },
13350 chrome41: true,
13351 safari9: true,
13352 safaritp: true,
13353 webkit: true,
13354 node012: { val: flag, note_id: 'string-contains' },
13355 node4: true,
13356 edge12: true,
13357 xs6: true,
13358 jxa: true,
13359 },
13360 },
13361 {
13362 name: 'String.prototype[Symbol.iterator]',
13363 exec: function () {/*
13364 return typeof String.prototype[Symbol.iterator] === 'function';
13365 */},
13366 res: {
13367 tr: true,
13368 babel: true,
13369 typescript: typescript.corejs,
13370 ejs: true,
13371 edge12: true,
13372 firefox36: true,
13373 chrome37: flag,
13374 chrome38: true,
13375 safari9: true,
13376 safaritp: true,
13377 webkit: true,
13378 node012: true,
13379 xs6: true,
13380 jxa: true,
13381 },
13382 },
13383 {
13384 name: 'String iterator prototype chain',
13385 exec: function () {/*
13386 // Iterator instance
13387 var iterator = ''[Symbol.iterator]();
13388 // %StringIteratorPrototype%
13389 var proto1 = Object.getPrototypeOf(iterator);
13390 // %IteratorPrototype%
13391 var proto2 = Object.getPrototypeOf(proto1);
13392
13393 return proto2.hasOwnProperty(Symbol.iterator) &&
13394 !proto1 .hasOwnProperty(Symbol.iterator) &&
13395 !iterator .hasOwnProperty(Symbol.iterator) &&
13396 iterator[Symbol.iterator]() === iterator;
13397 */},
13398 res: {
13399 babel: true,
13400 ejs: true,
13401 typescript: typescript.corejs,
13402 safari9: true,
13403 safaritp: true,
13404 webkit: true,
13405 chrome45: true,
13406 node4: true,
13407 edge13: true,
13408 firefox45: true,
13409 xs6: true,
13410 jxa: true,
13411 },
13412 },
13413 ],
13414},
13415{
13416 name: 'String.prototype HTML methods',
13417 category: 'annex b',
13418 significance: 'tiny',
13419 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype.anchor',
13420 subtests: [
13421 {
13422 name: 'existence',
13423 exec: function () {/*
13424 var i, names = ["anchor", "big", "bold", "fixed", "fontcolor", "fontsize",
13425 "italics", "link", "small", "strike", "sub", "sup"];
13426 for (i = 0; i < names.length; i++) {
13427 if (typeof String.prototype[names[i]] !== 'function') {
13428 return false;
13429 }
13430 }
13431 return true;
13432 */},
13433 res: {
13434 babel: true,
13435 typescript: typescript.corejs,
13436 es6shim: true,
13437 ie10: true,
13438 firefox3: true,
13439 chrome: true,
13440 safari51: true,
13441 safaritp: true,
13442 safari10: true,
13443 webkit: true,
13444 opera: true,
13445 konq49: true,
13446 rhino17: true,
13447 node012: true,
13448 android40: true,
13449 xs6: false,
13450 jxa: true,
13451 },
13452 },
13453 {
13454 name: 'tags\' names are lowercase',
13455 exec: function () {/*
13456 var i, names = ["anchor", "big", "bold", "fixed", "fontcolor", "fontsize",
13457 "italics", "link", "small", "strike", "sub", "sup"];
13458 for (i = 0; i < names.length; i++) {
13459 if (""[names[i]]().toLowerCase() !== ""[names[i]]()) {
13460 return false;
13461 }
13462 }
13463 return true;
13464 */},
13465 res: {
13466 babel: true,
13467 typescript: typescript.corejs,
13468 es6shim: true,
13469 edge12: true,
13470 firefox2: true,
13471 chrome: true,
13472 safari51: true,
13473 safaritp: true,
13474 safari10: true,
13475 webkit: true,
13476 opera: true,
13477 konq49: true,
13478 rhino17: true,
13479 node012: true,
13480 android40: true,
13481 xs6: false,
13482 jxa: true,
13483 },
13484 },
13485 {
13486 name: 'quotes in arguments are escaped',
13487 exec: function () {/*
13488 var i, names = ["anchor", "fontcolor", "fontsize", "link"];
13489 for (i = 0; i < names.length; i++) {
13490 if (""[names[i]]('"') !== ""[names[i]]('&' + 'quot;')) {
13491 return false;
13492 }
13493 }
13494 return true;
13495 */},
13496 res: {
13497 babel: true,
13498 typescript: typescript.corejs,
13499 es6shim: true,
13500 edge12: true,
13501 firefox17: true,
13502 chrome: true,
13503 safari6: true,
13504 safaritp: true,
13505 safari10: true,
13506 webkit: true,
13507 konq49: true,
13508 rhino17: true,
13509 node012: true,
13510 android40: true,
13511 xs6: false,
13512 jxa: true,
13513 },
13514 },
13515 ],
13516},
13517{
13518 name: 'Unicode code point escapes',
13519 category: 'syntax',
13520 significance: 'small',
13521 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-literals-string-literals',
13522 subtests: [
13523 {
13524 name: 'in strings',
13525 exec: function () {/*
13526 return '\u{1d306}' == '\ud834\udf06';
13527 */},
13528 res: {
13529 tr: true,
13530 babel: true,
13531 typescript: true,
13532 es6tr: true,
13533 ejs: true,
13534 closure: true,
13535 edge12: true,
13536 safari9: true,
13537 safaritp: true,
13538 webkit: true,
13539 chrome44: true,
13540 firefox40: true,
13541 node4: true,
13542 xs6: true,
13543 jxa: true,
13544 }
13545 },
13546 {
13547 name: 'in identifiers',
13548 exec: function(){/*
13549 var \u{102C0} = { \u{102C0} : 2 };
13550 return \u{102C0}['\ud800\udec0'] === 2;
13551 */},
13552 res: {
13553 ejs: true,
13554 edge12: true,
13555 chrome44: true,
13556 safari9: true,
13557 safaritp: true,
13558 webkit: true,
13559 node4: true,
13560 xs6: true,
13561 jxa: true,
13562 }
13563 },
13564 ]
13565},
13566{
13567 name: 'new.target',
13568 category: 'syntax',
13569 significance: 'small',
13570 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-built-in-function-objects',
13571 subtests: [
13572 {
13573 name: 'in constructors',
13574 exec: function () {/*
13575 var passed = false;
13576 new function f() {
13577 passed = (new.target === f);
13578 }();
13579 (function() {
13580 passed &= (new.target === undefined);
13581 }());
13582 return passed;
13583 */},
13584 res: {
13585 firefox41: true,
13586 safaritp: true,
13587 safari10: true,
13588 webkit: true,
13589 chrome46: true,
13590 edge13: true,
13591 node5: true,
13592 xs6: true,
13593 ejs: true,
13594 }
13595 },
13596 {
13597 name: 'assignment is an early error',
13598 exec: function(){/*
13599 var passed = false;
13600 new function f() {
13601 passed = (new.target === f);
13602 }();
13603
13604 try {
13605 Function("new.target = function(){};");
13606 } catch(e) {
13607 return passed;
13608 }
13609 */},
13610 res: {
13611 firefox41: true,
13612 chrome46: true,
13613 edge14: true,
13614 node5: true,
13615 xs6: true,
13616 ejs: true,
13617 safaritp: true,
13618 safari10: true,
13619 webkit: true,
13620 }
13621 },
13622 ]
13623},
13624{
13625 name: 'Symbol',
13626 category: 'built-ins',
13627 significance: 'large',
13628 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-symbol-constructor',
13629 subtests: [
13630 {
13631 name: 'basic functionality',
13632 exec: function(){/*
13633 var object = {};
13634 var symbol = Symbol();
13635 var value = {};
13636 object[symbol] = value;
13637 return object[symbol] === value;
13638 */},
13639 res: {
13640 tr: true,
13641 ejs: true,
13642 babel: true,
13643 closure: true,
13644 typescript: typescript.corejs,
13645 edge12: true,
13646 firefox36: true,
13647 safari9: true,
13648 safaritp: true,
13649 webkit: true,
13650 chrome30: flag, // Actually Chrome 29
13651 chrome38: true,
13652 node012: true,
13653 xs6: true,
13654 jxa: true,
13655 },
13656 },
13657 {
13658 name: 'typeof support',
13659 exec: function(){/*
13660 return typeof Symbol() === "symbol";
13661 */},
13662 res: {
13663 tr: true,
13664 babel: true,
13665 typescript: typescript.fallthrough,
13666 ejs: true,
13667 edge12: true,
13668 firefox36: true,
13669 safari9: true,
13670 safaritp: true,
13671 webkit: true,
13672 chrome30: flag, // Actually Chrome 29
13673 chrome38: true,
13674 node012: true,
13675 xs6: true,
13676 jxa: true,
13677 },
13678 },
13679 {
13680 name: 'symbol keys are hidden to pre-ES6 code',
13681 exec: function(){/*
13682 var object = {};
13683 var symbol = Symbol();
13684 object[symbol] = 1;
13685
13686 for (var x in object){}
13687 var passed = !x;
13688
13689 if (Object.keys && Object.getOwnPropertyNames) {
13690 passed &= Object.keys(object).length === 0
13691 && Object.getOwnPropertyNames(object).length === 0;
13692 }
13693
13694 return passed;
13695 */},
13696 res: {
13697 babel: true,
13698 typescript: typescript.corejs,
13699 edge12: true,
13700 firefox36: true,
13701 safari9: true,
13702 safaritp: true,
13703 webkit: true,
13704 chrome30: flag, // Actually Chrome 29
13705 chrome38: true,
13706 node012: true,
13707 xs6: true,
13708 jxa: true,
13709 },
13710 },
13711 {
13712 name: 'Object.defineProperty support',
13713 exec: function(){/*
13714 var object = {};
13715 var symbol = Symbol();
13716 var value = {};
13717
13718 if (Object.defineProperty) {
13719 Object.defineProperty(object, symbol, { value: value });
13720 return object[symbol] === value;
13721 }
13722
13723 return passed;
13724 */},
13725 res: {
13726 tr: true,
13727 typescript: typescript.corejs,
13728 ejs: true,
13729 babel: true,
13730 closure: true,
13731 edge12: true,
13732 firefox36: true,
13733 safari9: true,
13734 safaritp: true,
13735 webkit: true,
13736 chrome30: flag, // Actually Chrome 29
13737 chrome38: true,
13738 node012: true,
13739 xs6: true,
13740 jxa: true,
13741 },
13742 },
13743 {
13744 name: 'symbols inherit from Symbol.prototype',
13745 exec: function(){/*
13746 var symbol = Symbol();
13747 var passed = symbol.foo === undefined;
13748 Symbol.prototype.foo = 2;
13749 passed &= symbol.foo === 2;
13750 delete Symbol.prototype.foo;
13751 return passed;
13752 */},
13753 res: {
13754 ejs: true,
13755 babel: true,
13756 typescript: typescript.corejs,
13757 edge12: true,
13758 firefox36: true,
13759 safari9: true,
13760 safaritp: true,
13761 webkit: true,
13762 chrome30: flag, // Actually Chrome 29
13763 chrome38: true,
13764 node012: true,
13765 xs6: true,
13766 jxa: true,
13767 },
13768 },
13769 {
13770 name: 'cannot coerce to string or number',
13771 exec: function(){/*
13772 var symbol = Symbol();
13773
13774 try {
13775 symbol + "";
13776 return false;
13777 }
13778 catch(e) {}
13779
13780 try {
13781 symbol + 0;
13782 return false;
13783 } catch(e) {}
13784
13785 return true;
13786 */},
13787 res: {
13788 typescript: typescript.fallthrough,
13789 edge12: true,
13790 firefox36: true,
13791 safari9: true,
13792 safaritp: true,
13793 webkit: true,
13794 chrome38: true,
13795 node012: true,
13796 xs6: true,
13797 jxa: true,
13798 },
13799 },
13800 {
13801 name: 'can convert with String()',
13802 exec: function(){/*
13803 return String(Symbol("foo")) === "Symbol(foo)";
13804 */},
13805 res: {
13806 typescript: typescript.fallthrough,
13807 edge12: true,
13808 chrome39: true,
13809 firefox36: true,
13810 safari9: true,
13811 safaritp: true,
13812 webkit: true,
13813 node4: true,
13814 xs6: true,
13815 jxa: true,
13816 },
13817 },
13818 {
13819 name: 'new Symbol() throws',
13820 exec: function(){/*
13821 var symbol = Symbol();
13822 try {
13823 new Symbol();
13824 } catch(e) {
13825 return true;
13826 }
13827 */},
13828 res: {
13829 tr: true,
13830 babel: true,
13831 typescript: typescript.corejs,
13832 edge12: true,
13833 firefox36: true,
13834 safari9: true,
13835 safaritp: true,
13836 webkit: true,
13837 chrome35: flag,
13838 chrome38: true,
13839 node012: true,
13840 xs6: true,
13841 jxa: true,
13842 },
13843 },
13844 {
13845 name: 'Object(symbol)',
13846 exec: function(){/*
13847 var symbol = Symbol();
13848 var symbolObject = Object(symbol);
13849
13850 return typeof symbolObject === "object" &&
13851 symbolObject instanceof Symbol &&
13852 symbolObject == symbol &&
13853 symbolObject !== symbol &&
13854 symbolObject.valueOf() === symbol;
13855 */},
13856 res: {
13857 typescript: typescript.fallthrough,
13858 edge12: true,
13859 firefox36: true,
13860 chrome30: flag,
13861 chrome35: false,
13862 chrome48: true,
13863 safari9: true,
13864 safaritp: true,
13865 webkit: true,
13866 xs6: true,
13867 jxa: true,
13868 },
13869 },
13870 {
13871 name: 'JSON.stringify ignores symbol primitives',
13872 exec: function() {/*
13873 var object = { foo: Symbol() };
13874 object[Symbol()] = 1;
13875 var array = [Symbol()];
13876 return JSON.stringify(object) === '{}' && JSON.stringify(array) === '[null]' && JSON.stringify(Symbol()) === undefined;
13877 */},
13878 res: {
13879 babel: true,
13880 typescript: typescript.corejs,
13881 edge13: true,
13882 es6shim: true,
13883 firefox35: false,
13884 firefox36: true,
13885 firefox48: true,
13886 chrome35: flag,
13887 chrome38: true,
13888 chrome49: true,
13889 chrome52: true,
13890 node012: true,
13891 node4: true,
13892 node6: true,
13893 safari9: false,
13894 safaritp: true,
13895 safari10: true,
13896 webkit: true,
13897 xs6: true,
13898 jxa: true,
13899 },
13900 },
13901 {
13902 name: 'JSON.stringify ignores symbol objects',
13903 exec: function() {/*
13904 var testSymbolObject = function (sym) {
13905 var object = { foo: sym };
13906 try {
13907 // some browsers throw a TypeError when setting symbol object keys.
13908 // this isn't part of this test, so, ignore it if so.
13909 object[sym] = 1;
13910 } catch (e) {} // some browsers throw a TypeError when setting symbol object keys.
13911 var array = [sym];
13912 return JSON.stringify(object) === '{"foo":{}}' && JSON.stringify(array) === '[{}]' && JSON.stringify(sym) === '{}';
13913 };
13914 var objSym = Object(Symbol());
13915 var symNoToJSON = Object(Symbol());
13916 Object.defineProperty(symNoToJSON, 'toJSON', { enumerable: false, value: null }); // ensure it overrides the prototype, but is not callable
13917 return testSymbolObject(objSym) && testSymbolObject(symNoToJSON);
13918 */},
13919 res: {
13920 babel: true,
13921 typescript: typescript.corejs,
13922 edge13: true,
13923 es6shim: true,
13924 firefox35: false,
13925 firefox36: true,
13926 firefox48: true,
13927 node012: false,
13928 node4: false,
13929 node6: true,
13930 chrome38: false,
13931 chrome48: false,
13932 chrome49: true,
13933 safari9: true,
13934 safaritp: true,
13935 webkit: true,
13936 xs6: true,
13937 jxa: true,
13938 }
13939 },
13940 {
13941 name: 'global symbol registry',
13942 exec: function() {/*
13943 var symbol = Symbol.for('foo');
13944 return Symbol.for('foo') === symbol &&
13945 Symbol.keyFor(symbol) === 'foo';
13946 */},
13947 res: {
13948 babel: true,
13949 typescript: typescript.corejs,
13950 edge12: true,
13951 firefox36: true,
13952 chrome35: flag,
13953 chrome38: true,
13954 safari9: true,
13955 safaritp: true,
13956 webkit: true,
13957 node012: true,
13958 xs6: true,
13959 jxa: true,
13960 },
13961 },
13962 ],
13963},
13964{
13965 name: 'well-known symbols',
13966 category: 'built-ins',
13967 significance: 'medium',
13968 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-well-known-symbols',
13969 note_id: 'symbol-iterator-functionality',
13970 note_html: 'Functionality for <code>Symbol.iterator</code> is tested by the "generic iterators" subtests for '
13971 + 'the <a href="#test-spread_(...)_operator">spread (...) operator</a>, <a href="#test-for..of_loops">for..of loops</a>, '
13972 + '<a href="#test-destructuring">destructuring</a>, <a href="#test-generators">yield *</a>, '
13973 + 'and <a href="#test-Array_static_methods">Array.from</a>.',
13974 subtests: [
13975 {
13976 name: 'Symbol.hasInstance',
13977 exec: function() {/*
13978 var passed = false;
13979 var obj = { foo: true };
13980 var C = function(){};
13981 Object.defineProperty(C, Symbol.hasInstance, {
13982 value: function(inst) { passed = inst.foo; return false; }
13983 });
13984 obj instanceof C;
13985 return passed;
13986 */},
13987 res: {
13988 babel: flag,
13989 typescript: typescript.fallthrough,
13990 edge14: flag,
13991 chrome50: flag,
13992 chrome51: true,
13993 firefox50: true,
13994 ejs: true,
13995 xs6: true,
13996 safaritp: true,
13997 safari10: true,
13998 webkit: true,
13999 jxa: true,
14000 },
14001 },
14002 {
14003 name: 'Symbol.isConcatSpreadable',
14004 exec: function() {/*
14005 var a = [], b = [];
14006 b[Symbol.isConcatSpreadable] = false;
14007 a = a.concat(b);
14008 return a[0] === b;
14009 */},
14010 res: {
14011 typescript: typescript.fallthrough,
14012 edge14: flag,
14013 ejs: true,
14014 chrome48: true,
14015 firefox48: true,
14016 xs6: true,
14017 jxa: true,
14018 safaritp: true,
14019 safari10: true,
14020 webkit: true,
14021 },
14022 },
14023 {
14024 name: 'Symbol.iterator, existence',
14025 exec: function() {/*
14026 return "iterator" in Symbol;
14027 */},
14028 res: {
14029 tr: true,
14030 babel: true,
14031 closure: true,
14032 typescript: typescript.corejs,
14033 edge12: true,
14034 edge14: true,
14035 firefox36: true,
14036 safari9: true,
14037 safaritp: true,
14038 webkit: true,
14039 chrome37: flag,
14040 chrome38: true,
14041 ejs: true,
14042 node012: true,
14043 xs6: true,
14044 jxa: true,
14045 },
14046 },
14047 {
14048 name: 'Symbol.iterator, arguments object',
14049 exec: function() {/*
14050 return (function() {
14051 return typeof arguments[Symbol.iterator] === 'function'
14052 && Object.hasOwnProperty.call(arguments, Symbol.iterator);
14053 }());
14054 */},
14055 res: {
14056 chrome37: flag,
14057 chrome38: true,
14058 safari9: true,
14059 safaritp: true,
14060 webkit: true,
14061 firefox46: true,
14062 node012: false,
14063 node4: true,
14064 node5: true,
14065 edge12: true,
14066 xs6: true,
14067 ejs: true,
14068 jxa: true,
14069 },
14070 },
14071 {
14072 name: 'Symbol.species, existence',
14073 exec: function() {/*
14074 return "species" in Symbol;
14075 */},
14076 res: {
14077 ejs: true,
14078 babel: true,
14079 typescript: typescript.corejs,
14080 firefox41: true,
14081 edge13: true,
14082 chrome50: flag,
14083 chrome51: true,
14084 xs6: true,
14085 safaritp: true,
14086 safari10: true,
14087 webkit: true,
14088 jxa: true,
14089 },
14090 },
14091 {
14092 name: 'Symbol.species, Array.prototype.concat',
14093 exec: function () {/*
14094 var obj = [];
14095 obj.constructor = {};
14096 obj.constructor[Symbol.species] = function() {
14097 return { foo: 1 };
14098 };
14099 return Array.prototype.concat.call(obj, []).foo === 1;
14100 */},
14101 res: {
14102 ejs: true,
14103 edge13: true,
14104 firefox48: true,
14105 chrome50: flag,
14106 chrome51: true,
14107 xs6: true,
14108 safaritp: true,
14109 safari10: true,
14110 webkit: true,
14111 jxa: true,
14112 }
14113 },
14114 {
14115 name: 'Symbol.species, Array.prototype.filter',
14116 exec: function () {/*
14117 var obj = [];
14118 obj.constructor = {};
14119 obj.constructor[Symbol.species] = function() {
14120 return { foo: 1 };
14121 };
14122 return Array.prototype.filter.call(obj, Boolean).foo === 1;
14123 */},
14124 res: {
14125 ejs: true,
14126 edge13: true,
14127 firefox48: true,
14128 chrome50: flag,
14129 chrome51: true,
14130 xs6: true,
14131 jxa: true,
14132 safaritp: true,
14133 safari10: true,
14134 webkit: true,
14135 }
14136 },
14137 {
14138 name: 'Symbol.species, Array.prototype.map',
14139 exec: function () {/*
14140 var obj = [];
14141 obj.constructor = {};
14142 obj.constructor[Symbol.species] = function() {
14143 return { foo: 1 };
14144 };
14145 return Array.prototype.map.call(obj, Boolean).foo === 1;
14146 */},
14147 res: {
14148 ejs: true,
14149 edge13: true,
14150 firefox48: true,
14151 chrome50: flag,
14152 chrome51: true,
14153 xs6: true,
14154 jxa: true,
14155 safaritp: true,
14156 safari10: true,
14157 webkit: true,
14158 }
14159 },
14160 {
14161 name: 'Symbol.species, Array.prototype.slice',
14162 exec: function () {/*
14163 var obj = [];
14164 obj.constructor = {};
14165 obj.constructor[Symbol.species] = function() {
14166 return { foo: 1 };
14167 };
14168 return Array.prototype.slice.call(obj, 0).foo === 1;
14169 */},
14170 res: {
14171 edge13: true,
14172 firefox48: true,
14173 chrome50: flag,
14174 chrome51: true,
14175 xs6: true,
14176 ejs: true,
14177 safaritp: true,
14178 safari10: true,
14179 webkit: true,
14180 jxa: true,
14181 }
14182 },
14183 {
14184 name: 'Symbol.species, Array.prototype.splice',
14185 exec: function () {/*
14186 var obj = [];
14187 obj.constructor = {};
14188 obj.constructor[Symbol.species] = function() {
14189 return { foo: 1 };
14190 };
14191 return Array.prototype.splice.call(obj, 0).foo === 1;
14192 */},
14193 res: {
14194 ejs: true,
14195 edge13: true,
14196 firefox48: true,
14197 chrome50: flag,
14198 chrome51: true,
14199 xs6: true,
14200 safaritp: true,
14201 safari10: true,
14202 webkit: true,
14203 jxa: true,
14204 }
14205 },
14206 {
14207 name: 'Symbol.species, RegExp.prototype[Symbol.split]',
14208 exec: function () {/*
14209 var passed = false;
14210 var obj = { constructor: {} };
14211 obj[Symbol.split] = RegExp.prototype[Symbol.split];
14212 obj.constructor[Symbol.species] = function() {
14213 passed = true;
14214 return /./;
14215 };
14216 "".split(obj);
14217 return passed;
14218 */},
14219 res: {
14220 edge14: flag,
14221 firefox49: true,
14222 chrome51: true,
14223 xs6: true,
14224 ejs: true,
14225 jxa: true,
14226 safaritp: true,
14227 safari10: true,
14228 webkit: true,
14229 }
14230 },
14231 {
14232 name: 'Symbol.species, Promise.prototype.then',
14233 exec: function () {/*
14234 var promise = new Promise(function(resolve){ resolve(42); });
14235 var FakePromise1 = promise.constructor = function(exec){ exec(function(){}, function(){}); };
14236 var FakePromise2 = function(exec){ exec(function(){}, function(){}); };
14237 Object.defineProperty(FakePromise1, Symbol.species, {value: FakePromise2});
14238 return promise.then(function(){}) instanceof FakePromise2;
14239 */},
14240 res: {
14241 babel: true,
14242 typescript: typescript.corejs,
14243 edge13: false,
14244 edge14: true,
14245 firefox45: true,
14246 chrome50: flag,
14247 chrome51: true,
14248 xs6: null,
14249 ejs: null,
14250 safaritp: true,
14251 safari10: true,
14252 webkit: true,
14253 }
14254 },
14255 {
14256 name: 'Symbol.replace',
14257 exec: function () {/*
14258 var O = {};
14259 O[Symbol.replace] = function(){
14260 return 42;
14261 };
14262 return ''.replace(O) === 42;
14263 */},
14264 res: {
14265 babel: true,
14266 ejs: true,
14267 typescript: typescript.corejs,
14268 chrome50: true,
14269 edge14: flag,
14270 firefox49: true,
14271 xs6: true,
14272 jxa: true,
14273 safaritp: true,
14274 safari10: true,
14275 webkit: true,
14276 }
14277 },
14278 {
14279 name: 'Symbol.search',
14280 exec: function () {/*
14281 var O = {};
14282 O[Symbol.search] = function(){
14283 return 42;
14284 };
14285 return ''.search(O) === 42;
14286 */},
14287 res: {
14288 babel: true,
14289 ejs: true,
14290 typescript: typescript.corejs,
14291 chrome50: true,
14292 edge14: flag,
14293 firefox49: true,
14294 xs6: true,
14295 safaritp: true,
14296 safari10: true,
14297 webkit: true,
14298 jxa: true,
14299 }
14300 },
14301 {
14302 name: 'Symbol.split',
14303 exec: function () {/*
14304 var O = {};
14305 O[Symbol.split] = function(){
14306 return 42;
14307 };
14308 return ''.split(O) === 42;
14309 */},
14310 res: {
14311 babel: true,
14312 ejs: true,
14313 typescript: typescript.corejs,
14314 chrome50: true,
14315 edge14: flag,
14316 firefox49: true,
14317 xs6: true,
14318 jxa: true,
14319 safaritp: true,
14320 safari10: true,
14321 webkit: true,
14322 }
14323 },
14324 {
14325 name: 'Symbol.match',
14326 exec: function () {/*
14327 var O = {};
14328 O[Symbol.match] = function(){
14329 return 42;
14330 };
14331 return ''.match(O) === 42;
14332 */},
14333 res: {
14334 babel: true,
14335 ejs: true,
14336 typescript: typescript.corejs,
14337 chrome50: true,
14338 edge14: flag,
14339 firefox49: true,
14340 xs6: true,
14341 jxa: true,
14342 safaritp: true,
14343 safari10: true,
14344 webkit: true,
14345 }
14346 },
14347 {
14348 name: 'Symbol.match, RegExp constructor',
14349 exec: function () {/*
14350 var re = /./;
14351 re[Symbol.match] = false;
14352 var foo = {constructor: RegExp};
14353 foo[Symbol.match] = true;
14354 return RegExp(re) !== re && RegExp(foo) === foo;
14355 */},
14356 res: {
14357 babel: true,
14358 ejs: true,
14359 typescript: typescript.corejs,
14360 edge14: flag,
14361 firefox40: true,
14362 chrome50: true,
14363 xs6: true,
14364 jxa: true,
14365 safaritp: true,
14366 safari10: true,
14367 webkit: true,
14368 }
14369 },
14370 {
14371 name: 'Symbol.match, String.prototype.startsWith',
14372 exec: function () {/*
14373 var re = /./;
14374 try {
14375 '/./'.startsWith(re);
14376 } catch(e){
14377 re[Symbol.match] = false;
14378 return '/./'.startsWith(re);
14379 }
14380 */},
14381 res: {
14382 babel: true,
14383 ejs: true,
14384 typescript: typescript.corejs,
14385 firefox40: true,
14386 edge14: flag,
14387 chrome51: true,
14388 xs6: true,
14389 safaritp: true,
14390 safari10: true,
14391 webkit: true,
14392 }
14393 },
14394 {
14395 name: 'Symbol.match, String.prototype.endsWith',
14396 exec: function () {/*
14397 var re = /./;
14398 try {
14399 '/./'.endsWith(re);
14400 } catch(e){
14401 re[Symbol.match] = false;
14402 return '/./'.endsWith(re);
14403 }
14404 */},
14405 res: {
14406 babel: true,
14407 ejs: true,
14408 typescript: typescript.corejs,
14409 firefox40: true,
14410 edge14: flag,
14411 chrome51: true,
14412 xs6: true,
14413 safaritp: true,
14414 safari10: true,
14415 webkit: true,
14416 }
14417 },
14418 {
14419 name: 'Symbol.match, String.prototype.includes',
14420 exec: function () {/*
14421 var re = /./;
14422 try {
14423 '/./'.includes(re);
14424 } catch(e){
14425 re[Symbol.match] = false;
14426 return '/./'.includes(re);
14427 }
14428 */},
14429 res: {
14430 babel: true,
14431 ejs: true,
14432 typescript: typescript.corejs,
14433 firefox40: true,
14434 edge14: flag,
14435 chrome51: true,
14436 xs6: true,
14437 safaritp: true,
14438 safari10: true,
14439 webkit: true,
14440 }
14441 },
14442 {
14443 name: 'Symbol.toPrimitive',
14444 exec: function() {/*
14445 var a = {}, b = {}, c = {};
14446 var passed = 0;
14447 a[Symbol.toPrimitive] = function(hint) { passed += hint === "number"; return 0; };
14448 b[Symbol.toPrimitive] = function(hint) { passed += hint === "string"; return 0; };
14449 c[Symbol.toPrimitive] = function(hint) { passed += hint === "default"; return 0; };
14450
14451 a >= 0;
14452 b in {};
14453 c == 0;
14454 return passed === 3;
14455 */},
14456 res: {
14457 ejs: true,
14458 typescript: typescript.fallthrough,
14459 firefox44: true,
14460 chrome47: true,
14461 xs6: true,
14462 jxa: true,
14463 safaritp: true,
14464 safari10: true,
14465 webkit: true,
14466 },
14467 },
14468 {
14469 name: 'Symbol.toStringTag',
14470 exec: function() {/*
14471 var a = {};
14472 a[Symbol.toStringTag] = "foo";
14473 return (a + "") === "[object foo]";
14474 */},
14475 res: {
14476 babel: true,
14477 ejs: true,
14478 typescript: typescript.corejs,
14479 chrome40: flag,
14480 chrome49: true,
14481 node4: flag,
14482 xs6: true,
14483 safaritp: true,
14484 safari10: true,
14485 webkit: true,
14486 jxa: true,
14487 },
14488 },
14489 {
14490 name: 'Symbol.toStringTag affects existing built-ins',
14491 exec: function() {/*
14492 var s = Symbol.toStringTag;
14493 var passed = true;
14494 [
14495 [Array.prototype, []],
14496 [String.prototype, ''],
14497 [arguments, arguments],
14498 [Function.prototype, function(){}],
14499 [Error.prototype, new Error()],
14500 [Boolean.prototype, true],
14501 [Number.prototype, 2],
14502 [Date.prototype, new Date()],
14503 [RegExp.prototype, /./]
14504 ].forEach(function(pair){
14505 pair[0][s] = "foo";
14506 passed &= (Object.prototype.toString.call(pair[1]) === "[object foo]");
14507 delete pair[0][s];
14508 });
14509 return passed;
14510 */},
14511 res: {
14512 babel: true,
14513 ejs: true,
14514 typescript: typescript.corejs,
14515 chrome40: flag,
14516 chrome49: true,
14517 node4: flag,
14518 xs6: true,
14519 safaritp: true,
14520 safari10: true,
14521 webkit: true,
14522 jxa: true,
14523 },
14524 },
14525 {
14526 name: 'Symbol.toStringTag, new built-ins',
14527 exec: function() {/*
14528 var passed = true;
14529 var s = Symbol.toStringTag;
14530 [
14531 [String, "String Iterator"],
14532 [Array, "Array Iterator"],
14533 [Map, "Map Iterator"],
14534 [Set, "Set Iterator"]
14535 ].forEach(function(pair){
14536 var iterProto = Object.getPrototypeOf(new pair[0]()[Symbol.iterator]());
14537 passed = passed
14538 && iterProto.hasOwnProperty(s)
14539 && iterProto[s] === pair[1];
14540 });
14541 passed = passed
14542 && Object.getPrototypeOf(function*(){})[s] === "GeneratorFunction"
14543 && Object.getPrototypeOf(function*(){}())[s] === "Generator"
14544 && Map.prototype[s] === "Map"
14545 && Set.prototype[s] === "Set"
14546 && ArrayBuffer.prototype[s] === "ArrayBuffer"
14547 && DataView.prototype[s] === "DataView"
14548 && Promise.prototype[s] === "Promise"
14549 && Symbol.prototype[s] === "Symbol"
14550 && typeof Object.getOwnPropertyDescriptor(
14551 Object.getPrototypeOf(Int8Array).prototype, Symbol.toStringTag).get === "function";
14552 return passed;
14553 */},
14554 res: {
14555 typescript: typescript.corejs,
14556 chrome49: true,
14557 xs6: true,
14558 safaritp: true,
14559 safari10: true,
14560 webkit: true,
14561 jxa: true,
14562 },
14563 },
14564 {
14565 name: 'Symbol.toStringTag, misc. built-ins',
14566 exec: function() {/*
14567 var s = Symbol.toStringTag;
14568 return Math[s] === "Math"
14569 && JSON[s] === "JSON";
14570 */},
14571 res: {
14572 babel: true,
14573 ejs: true,
14574 typescript: typescript.corejs,
14575 chrome40: flag,
14576 chrome49: true,
14577 node4: flag,
14578 xs6: true,
14579 safaritp: true,
14580 safari10: true,
14581 webkit: true,
14582 jxa: true,
14583 },
14584 },
14585 {
14586 name: 'Symbol.unscopables',
14587 exec: function() {/*
14588 var a = { foo: 1, bar: 2 };
14589 a[Symbol.unscopables] = { bar: true };
14590 with (a) {
14591 return foo === 1 && typeof bar === "undefined";
14592 }
14593 */},
14594 res: {
14595 edge12: true,
14596 firefox48: true,
14597 chrome38: true,
14598 safari9: true,
14599 safaritp: true,
14600 webkit: true,
14601 ejs: {
14602 val: false,
14603 note_id: 'ejs-no-with',
14604 note_html: '<code>with</code> is not supported in ejs'
14605 },
14606 typescript: typescript.fallthrough,
14607 node012: true,
14608 xs6: true,
14609 jxa: true,
14610 },
14611 },
14612 ],
14613},
14614{
14615 name: 'RegExp.prototype properties',
14616 category: 'built-in extensions',
14617 significance: 'small',
14618 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-regexp.prototype',
14619 subtests: [
14620 {
14621 name: 'RegExp.prototype.flags',
14622 exec: function () {/*
14623 return /./igm.flags === "gim" && /./.flags === "";
14624 */},
14625 res: {
14626 babel: true,
14627 ejs: true,
14628 typescript: typescript.corejs,
14629 es6shim: true,
14630 firefox37: true,
14631 safari9: true,
14632 safaritp: true,
14633 webkit: true,
14634 xs6: true,
14635 chrome48: flag,
14636 chrome49: true,
14637 edge14: flag,
14638 jxa: true,
14639 },
14640 },
14641 {
14642 name: 'RegExp.prototype[Symbol.match]',
14643 exec: function () {/*
14644 return typeof RegExp.prototype[Symbol.match] === 'function';
14645 */},
14646 res: {
14647 ejs: true,
14648 babel: true,
14649 typescript: typescript.corejs,
14650 chrome50: true,
14651 edge14: flag,
14652 firefox49: true,
14653 xs6: true,
14654 jxa: true,
14655 safaritp: true,
14656 safari10: true,
14657 webkit: true,
14658 },
14659 },
14660 {
14661 name: 'RegExp.prototype[Symbol.replace]',
14662 exec: function () {/*
14663 return typeof RegExp.prototype[Symbol.replace] === 'function';
14664 */},
14665 res: {
14666 ejs: true,
14667 babel: true,
14668 typescript: typescript.corejs,
14669 chrome50: true,
14670 edge14: flag,
14671 firefox49: true,
14672 xs6: true,
14673 jxa: true,
14674 safaritp: true,
14675 safari10: true,
14676 webkit: true,
14677 },
14678 },
14679 {
14680 name: 'RegExp.prototype[Symbol.split]',
14681 exec: function () {/*
14682 return typeof RegExp.prototype[Symbol.split] === 'function';
14683 */},
14684 res: {
14685 ejs: true,
14686 babel: true,
14687 typescript: typescript.corejs,
14688 chrome50: true,
14689 edge14: flag,
14690 firefox49: true,
14691 xs6: true,
14692 jxa: true,
14693 safaritp: true,
14694 safari10: true,
14695 webkit: true,
14696 },
14697 },
14698 {
14699 name: 'RegExp.prototype[Symbol.search]',
14700 exec: function () {/*
14701 return typeof RegExp.prototype[Symbol.search] === 'function';
14702 */},
14703 res: {
14704 ejs: true,
14705 babel: true,
14706 typescript: typescript.corejs,
14707 chrome50: true,
14708 edge14: flag,
14709 firefox49: true,
14710 xs6: true,
14711 safaritp: true,
14712 safari10: true,
14713 webkit: true,
14714 jxa: true,
14715 },
14716 },
14717 {
14718 name: 'RegExp[Symbol.species]',
14719 exec: function () {/*
14720 var prop = Object.getOwnPropertyDescriptor(RegExp, Symbol.species);
14721 return 'get' in prop && RegExp[Symbol.species] === RegExp;
14722 */},
14723 res: {
14724 ejs: true,
14725 babel: true,
14726 typescript: typescript.corejs,
14727 edge13: true,
14728 firefox49: true,
14729 chrome50: flag,
14730 chrome51: true,
14731 xs6: true,
14732 safaritp: true,
14733 safari10: true,
14734 webkit: true,
14735 },
14736 },
14737 ]
14738},
14739// As this one is Annex B, it is separate from the above.
14740{
14741 name: 'RegExp.prototype.compile',
14742 category: 'annex b',
14743 significance: 'tiny',
14744 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-regexp.prototype.compile',
14745 subtests: [
14746 {
14747 name: "basic functionality",
14748 exec: function () {/*
14749 if (typeof RegExp.prototype.compile !== 'function')
14750 return false
14751 var rx = /a/;
14752 rx.compile('b');
14753 return rx.test('b');
14754 */},
14755 res: {
14756 ie10: true,
14757 firefox2: true,
14758 chrome: true,
14759 safari51: true,
14760 safaritp: true,
14761 safari10: true,
14762 webkit: true,
14763 konq49: true,
14764 rhino17: true,
14765 node012: true,
14766 android40: true,
14767 xs6: true,
14768 }
14769 },
14770 {
14771 name: "returns this",
14772 exec: function () {/*
14773 var rx = /a/;
14774 return rx.compile('b') === rx;
14775 */},
14776 res: {
14777 ie10: true,
14778 firefox2: true,
14779 chrome: false,
14780 safari51: false,
14781 safaritp: true,
14782 safari10: true,
14783 webkit: true,
14784 konq49: null,
14785 rhino17: null,
14786 node012: false,
14787 android40: false,
14788 xs6: null,
14789 }
14790 },
14791 ]
14792},
14793{
14794 name: 'RegExp syntax extensions',
14795 category: 'annex b',
14796 significance: 'tiny',
14797 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-regular-expressions-patterns',
14798 subtests: [
14799 {
14800 name: 'hyphens in character sets',
14801 exec: function() {/*
14802 return /[\w-_]/.exec("-")[0] === "-";
14803 */},
14804 res: (temp.regExpExtensions = {
14805 ejs: true,
14806 ie10: true,
14807 firefox2: true,
14808 chrome: true,
14809 safari51: true,
14810 safaritp: true,
14811 safari10: true,
14812 webkit: true,
14813 opera: true,
14814 konq49: true,
14815 rhino17: true,
14816 node012: true,
14817 android40: true,
14818 xs6: true,
14819 jxa: true,
14820 }),
14821 },
14822 {
14823 name: 'invalid character escapes',
14824 exec: function() {/*
14825 return /\z/.exec("\\z")[0] === "z"
14826 && /[\z]/.exec("[\\z]")[0] === "z";
14827 */},
14828 res: Object.assign({}, temp.regExpExtensions, { xs6: false, ejs: false, }),
14829 },
14830 {
14831 name: 'invalid control-character escapes',
14832 exec: function() {/*
14833 return /\c2/.exec("\\c2")[0] === "\\c2";
14834 */},
14835 res: Object.assign({}, temp.regExpExtensions, { xs6: false, ejs: false, }),
14836 },
14837 {
14838 name: 'invalid Unicode escapes',
14839 exec: function() {/*
14840 return /\u1/.exec("u1")[0] === "u1"
14841 && /[\u1]/.exec("u")[0] === "u";
14842 */},
14843 res: Object.assign({}, temp.regExpExtensions, { firefox2: false, firefox4: true, opera: false, ejs: false }),
14844 },
14845 {
14846 name: 'invalid hexadecimal escapes',
14847 exec: function() {/*
14848 return /\x1/.exec("x1")[0] === "x1"
14849 && /[\x1]/.exec("x")[0] === "x";
14850 */},
14851 res: Object.assign({}, temp.regExpExtensions, { firefox2: false, firefox4: true, opera: false, xs6: false, ejs: false, }),
14852 },
14853 {
14854 name: 'incomplete patterns and quantifiers',
14855 exec: function() {/*
14856 return /x{1/.exec("x{1")[0] === "x{1"
14857 && /x]1/.exec("x]1")[0] === "x]1";
14858 */},
14859 res: temp.regExpExtensions,
14860 },
14861 {
14862 name: 'octal escape sequences',
14863 exec: function() {/*
14864 return /\041/.exec("!")[0] === "!"
14865 && /[\041]/.exec("!")[0] === "!";
14866 */},
14867 res: temp.regExpExtensions,
14868 },
14869 {
14870 name: 'invalid backreferences become octal escapes',
14871 exec: function() {/*
14872 return /\41/.exec("!")[0] === "!"
14873 && /[\41]/.exec("!")[0] === "!";
14874 */},
14875 res: temp.regExpExtensions,
14876 },
14877 ],
14878},
14879{
14880 name: 'Array static methods',
14881 category: 'built-in extensions',
14882 significance: 'medium',
14883 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-properties-of-the-array-constructor',
14884 subtests: [
14885 {
14886 name: 'Array.from, array-like objects',
14887 exec: function () {/*
14888 return Array.from({ 0: "foo", 1: "bar", length: 2 }) + '' === "foo,bar";
14889 */},
14890 res: {
14891 tr: true,
14892 babel: true,
14893 typescript: typescript.corejs,
14894 closure: true,
14895 es6shim: true,
14896 ejs: true,
14897 edge12: true,
14898 firefox32: true,
14899 safari9: true,
14900 safaritp: true,
14901 webkit: true,
14902 chrome45: true,
14903 node4: true,
14904 xs6: true,
14905 jxa: true,
14906 }
14907 },
14908 {
14909 name: 'Array.from, generator instances',
14910 exec: function () {/*
14911 var iterable = (function*(){ yield 1; yield 2; yield 3; }());
14912 return Array.from(iterable) + '' === "1,2,3";
14913 */},
14914 res: {
14915 tr: true,
14916 ejs: true,
14917 babel: true,
14918 typescript: typescript.fallthrough,
14919 closure: true,
14920 es6shim: true,
14921 firefox32: true,
14922 chrome45: true,
14923 edge12: flag,
14924 node4: true,
14925 edge13: true,
14926 xs6: true,
14927 safaritp: true,
14928 safari10: true,
14929 webkit: true,
14930 }
14931 },
14932 {
14933 name: 'Array.from, generic iterables',
14934 exec: function () {/*
14935 var iterable = global.__createIterableObject([1, 2, 3]);
14936 return Array.from(iterable) + '' === "1,2,3";
14937 */},
14938 res: {
14939 tr: true,
14940 babel: true,
14941 ejs: true,
14942 typescript: typescript.corejs,
14943 closure: true,
14944 edge12: true,
14945 es6shim: true,
14946 firefox32: true,
14947 safari9: true,
14948 safaritp: true,
14949 webkit: true,
14950 chrome45: true,
14951 node4: true,
14952 xs6: true,
14953 jxa: true,
14954 }
14955 },
14956 {
14957 name: 'Array.from, instances of generic iterables',
14958 exec: function () {/*
14959 var iterable = global.__createIterableObject([1, 2, 3]);
14960 return Array.from(Object.create(iterable)) + '' === "1,2,3";
14961 */},
14962 res: {
14963 babel: true,
14964 typescript: typescript.corejs,
14965 closure: true,
14966 ejs: true,
14967 tr: true,
14968 edge12: true,
14969 firefox36: true,
14970 safari9: true,
14971 safaritp: true,
14972 webkit: true,
14973 chrome45: true,
14974 node4: true,
14975 xs6: true,
14976 jxa: true,
14977 }
14978 },
14979 {
14980 name: 'Array.from map function, array-like objects',
14981 exec: function () {/*
14982 return Array.from({ 0: "foo", 1: "bar", length: 2 }, function(e, i) {
14983 return e + this.baz + i;
14984 }, { baz: "d" }) + '' === "food0,bard1";
14985 */},
14986 res: {
14987 tr: true,
14988 babel: true,
14989 typescript: typescript.corejs,
14990 es6shim: true,
14991 edge12: true,
14992 firefox32: true,
14993 safari9: true,
14994 safaritp: true,
14995 webkit: true,
14996 chrome45: true,
14997 node4: true,
14998 xs6: true,
14999 jxa: true,
15000 }
15001 },
15002 {
15003 name: 'Array.from map function, generator instances',
15004 exec: function () {/*
15005 var iterable = (function*(){ yield "foo"; yield "bar"; yield "bal"; }());
15006 return Array.from(iterable, function(e, i) {
15007 return e + this.baz + i;
15008 }, { baz: "d" }) + '' === "food0,bard1,bald2";
15009 */},
15010 res: {
15011 tr: true,
15012 babel: true,
15013 typescript: typescript.fallthrough,
15014 es6shim: true,
15015 firefox32: true,
15016 chrome45: true,
15017 edge12: flag,
15018 node4: true,
15019 edge13: true,
15020 xs6: true,
15021 safaritp: true,
15022 safari10: true,
15023 webkit: true,
15024 }
15025 },
15026 {
15027 name: 'Array.from map function, generic iterables',
15028 exec: function () {/*
15029 var iterable = global.__createIterableObject(["foo", "bar", "bal"]);
15030 return Array.from(iterable, function(e, i) {
15031 return e + this.baz + i;
15032 }, { baz: "d" }) + '' === "food0,bard1,bald2";
15033 */},
15034 res: {
15035 tr: true,
15036 babel: true,
15037 typescript: typescript.corejs,
15038 edge12: true,
15039 es6shim: true,
15040 firefox32: true,
15041 safari9: true,
15042 safaritp: true,
15043 webkit: true,
15044 chrome45: true,
15045 node4: true,
15046 xs6: true,
15047 jxa: true,
15048 }
15049 },
15050 {
15051 name: 'Array.from map function, instances of iterables',
15052 exec: function () {/*
15053 var iterable = global.__createIterableObject(["foo", "bar", "bal"]);
15054 return Array.from(Object.create(iterable), function(e, i) {
15055 return e + this.baz + i;
15056 }, { baz: "d" }) + '' === "food0,bard1,bald2";
15057 */},
15058 res: {
15059 babel: true,
15060 typescript: typescript.corejs,
15061 tr: true,
15062 edge12: true,
15063 firefox36: true,
15064 safari9: true,
15065 safaritp: true,
15066 webkit: true,
15067 chrome45: true,
15068 node4: true,
15069 xs6: true,
15070 jxa: true,
15071 }
15072 },
15073 {
15074 name: 'Array.from, iterator closing',
15075 exec: function () {/*
15076 var closed = false;
15077 var iter = global.__createIterableObject([1, 2, 3], {
15078 'return': function(){ closed = true; return {}; }
15079 });
15080 try {
15081 Array.from(iter, function() { throw 42 });
15082 } catch(e){}
15083 return closed;
15084 */},
15085 res: {
15086 tr: true,
15087 babel: true,
15088 typescript: typescript.corejs,
15089 edge14: true,
15090 chrome51: true,
15091 safari9: true,
15092 safaritp: true,
15093 webkit: true,
15094 xs6: true,
15095 jxa: true,
15096 },
15097 },
15098 {
15099 name: 'Array.of',
15100 exec: function () {/*
15101 return typeof Array.of === 'function' &&
15102 Array.of(2)[0] === 2;
15103 */},
15104 res: {
15105 tr: true,
15106 babel: true,
15107 typescript: typescript.corejs,
15108 closure: true,
15109 ejs: true,
15110 es6shim: true,
15111 edge12: true,
15112 firefox25: true,
15113 chrome39: flag,
15114 chrome40: false,
15115 chrome45: true,
15116 safari9: true,
15117 safaritp: true,
15118 webkit: true,
15119 node4: true,
15120 xs6: true,
15121 jxa: true,
15122 },
15123 },
15124 {
15125 name: 'Array[Symbol.species]',
15126 exec: function () {/*
15127 var prop = Object.getOwnPropertyDescriptor(Array, Symbol.species);
15128 return 'get' in prop && Array[Symbol.species] === Array;
15129 */},
15130 res: {
15131 babel: true,
15132 ejs: true,
15133 typescript: typescript.corejs,
15134 edge13: true,
15135 firefox48: true,
15136 chrome50: flag,
15137 chrome51: true,
15138 xs6: true,
15139 safaritp: true,
15140 safari10: true,
15141 webkit: true,
15142 },
15143 },
15144 ],
15145},
15146{
15147 name: 'Array.prototype methods',
15148 category: 'built-in extensions',
15149 significance: 'medium',
15150 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-properties-of-the-array-prototype-object',
15151 subtests: [
15152 {
15153 name: 'Array.prototype.copyWithin',
15154 exec: function () {/*
15155 return typeof Array.prototype.copyWithin === 'function';
15156 */},
15157 res: {
15158 ejs: true,
15159 babel: true,
15160 typescript: typescript.corejs,
15161 closure: true,
15162 es6shim: true,
15163 edge12: true,
15164 firefox32: true,
15165 safari9: true,
15166 safaritp: true,
15167 webkit: true,
15168 chrome45: true,
15169 node4: true,
15170 xs6: true,
15171 jxa: true,
15172 },
15173 },
15174 {
15175 name: 'Array.prototype.find',
15176 exec: function () {/*
15177 return typeof Array.prototype.find === 'function';
15178 */},
15179 res: {
15180 tr: true,
15181 babel: true,
15182 typescript: typescript.corejs,
15183 closure: true,
15184 ejs: true,
15185 es6shim: true,
15186 edge12: true,
15187 firefox25: true,
15188 chrome30: flag,
15189 chrome45: true,
15190 safari71_8: true,
15191 safaritp: true,
15192 safari10: true,
15193 webkit: true,
15194 node012: flag,
15195 node4: true,
15196 xs6: true,
15197 jxa: true,
15198 },
15199 },
15200 {
15201 name: 'Array.prototype.findIndex',
15202 exec: function () {/*
15203 return typeof Array.prototype.findIndex === 'function';
15204 */},
15205 res: {
15206 tr: true,
15207 babel: true,
15208 typescript: typescript.corejs,
15209 closure: true,
15210 ejs: true,
15211 es6shim: true,
15212 edge12: true,
15213 firefox25: true,
15214 chrome30: flag,
15215 chrome45: true,
15216 safari71_8: true,
15217 safaritp: true,
15218 safari10: true,
15219 webkit: true,
15220 node012: flag,
15221 node4: true,
15222 xs6: true,
15223 jxa: true,
15224 },
15225 },
15226 {
15227 name: 'Array.prototype.fill',
15228 exec: function () {/*
15229 return typeof Array.prototype.fill === 'function';
15230 */},
15231 res: {
15232 tr: true,
15233 babel: true,
15234 typescript: typescript.corejs,
15235 closure: true,
15236 ejs: true,
15237 es6shim: true,
15238 edge12: true,
15239 firefox31: true,
15240 chrome36: flag,
15241 chrome45: true,
15242 safari71_8: true,
15243 safaritp: true,
15244 safari10: true,
15245 webkit: true,
15246 node012: flag,
15247 node4: true,
15248 xs6: true,
15249 jxa: true,
15250 },
15251 },
15252 {
15253 name: 'Array.prototype.keys',
15254 exec: function () {/*
15255 return typeof Array.prototype.keys === 'function';
15256 */},
15257 res: {
15258 tr: true,
15259 babel: true,
15260 typescript: typescript.corejs,
15261 closure: true,
15262 ejs: true,
15263 es6shim: true,
15264 edge12: true,
15265 firefox28: true,
15266 chrome30: flag,
15267 chrome38: true,
15268 safari71_8: true,
15269 safaritp: true,
15270 safari10: true,
15271 webkit: true,
15272 node012: true,
15273 xs6: true,
15274 jxa: true,
15275 },
15276 },
15277 {
15278 name: 'Array.prototype.values',
15279 exec: function () {/*
15280 return typeof Array.prototype.values === 'function';
15281 */},
15282 res: {
15283 tr: true,
15284 babel: true,
15285 typescript: typescript.corejs,
15286 closure: true,
15287 ejs: true,
15288 es6shim: true,
15289 edge12: true,
15290 chrome51: true,
15291 chrome52: false,
15292 safari9: true,
15293 safaritp: true,
15294 webkit: true,
15295 firefox17: {
15296 val: false,
15297 note_id: 'fx-array-prototype-values',
15298 note_html: 'Available from Firefox 17 up to 27 as the non-standard <code>Array.prototype.iterator</code>'
15299 },
15300 firefox27: {
15301 val: false,
15302 note_id: 'fx-array-prototype-values-2',
15303 note_html: 'Available from Firefox 27 up to 35 as the non-standard <code>Array.prototype["@@iterator"]</code>'
15304 },
15305 firefox36: {
15306 val: false,
15307 note_id: 'array-prototype-iterator',
15308 note_html: 'Available as <code>Array.prototype[Symbol.iterator]</code>'
15309 },
15310 firefox48: true,
15311 chrome30: flag,
15312 chrome38: { val: false, note_id: 'array-prototype-iterator' },
15313 node012: true,
15314 node4: false,
15315 xs6: true,
15316 jxa: true,
15317 },
15318 },
15319 {
15320 name: 'Array.prototype.entries',
15321 exec: function () {/*
15322 return typeof Array.prototype.entries === 'function';
15323 */},
15324 res: {
15325 tr: true,
15326 babel: true,
15327 typescript: typescript.corejs,
15328 closure: true,
15329 ejs: true,
15330 es6shim: true,
15331 edge12: true,
15332 firefox28: true,
15333 chrome30: flag,
15334 chrome38: true,
15335 safari71_8: true,
15336 safaritp: true,
15337 safari10: true,
15338 webkit: true,
15339 node012: true,
15340 xs6: true,
15341 jxa: true,
15342 },
15343 },
15344 {
15345 name: 'Array.prototype[Symbol.iterator]',
15346 exec: function () {/*
15347 return typeof Array.prototype[Symbol.iterator] === 'function';
15348 */},
15349 res: {
15350 tr: true,
15351 babel: true,
15352 typescript: typescript.corejs,
15353 ejs: true,
15354 edge12: true,
15355 safari9: true,
15356 safaritp: true,
15357 webkit: true,
15358 firefox17: {
15359 val: false,
15360 note_id: 'fx-array-prototype-values',
15361 },
15362 firefox27: {
15363 val: false,
15364 note_id: 'fx-array-prototype-values-2',
15365 },
15366 firefox36: true,
15367 chrome37: flag,
15368 chrome38: true,
15369 node012: true,
15370 xs6: true,
15371 jxa: true,
15372 },
15373 },
15374 {
15375 name: 'Array iterator prototype chain',
15376 exec: function () {/*
15377 // Iterator instance
15378 var iterator = [][Symbol.iterator]();
15379 // %ArrayIteratorPrototype%
15380 var proto1 = Object.getPrototypeOf(iterator);
15381 // %IteratorPrototype%
15382 var proto2 = Object.getPrototypeOf(proto1);
15383
15384 return proto2.hasOwnProperty(Symbol.iterator) &&
15385 !proto1 .hasOwnProperty(Symbol.iterator) &&
15386 !iterator .hasOwnProperty(Symbol.iterator) &&
15387 iterator[Symbol.iterator]() === iterator;
15388 */},
15389 res: {
15390 babel: true,
15391 ejs: true,
15392 typescript: typescript.corejs,
15393 safari9: true,
15394 safaritp: true,
15395 webkit: true,
15396 edge13: true,
15397 firefox45: true,
15398 chrome51: true,
15399 xs6: true,
15400 jxa: true,
15401 },
15402 },
15403 {
15404 name: 'Array.prototype[Symbol.unscopables]',
15405 exec: function () {/*
15406 var unscopables = Array.prototype[Symbol.unscopables];
15407 if (!unscopables) {
15408 return false;
15409 }
15410 var ns = "find,findIndex,fill,copyWithin,entries,keys,values".split(",");
15411 for (var i = 0; i < ns.length; i++) {
15412 if (Array.prototype[ns[i]] && !unscopables[ns[i]]) return false;
15413 }
15414 return true;
15415 */},
15416 res: {
15417 babel: true,
15418 typescript: typescript.corejs,
15419 edge12: true,
15420 firefox48: true,
15421 chrome38: true,
15422 safari9: true,
15423 safaritp: true,
15424 webkit: true,
15425 node012: true,
15426 xs6: true,
15427 jxa: true,
15428 },
15429 },
15430 ],
15431},
15432{
15433 name: 'Number properties',
15434 category: 'built-in extensions',
15435 significance: 'small',
15436 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-isfinite-number',
15437 subtests: [
15438 {
15439 name: 'Number.isFinite',
15440 exec: function () {/*
15441 return typeof Number.isFinite === 'function';
15442 */},
15443 res: {
15444 tr: true,
15445 babel: true,
15446 typescript: typescript.corejs,
15447 closure: true,
15448 ejs: true,
15449 es6shim: true,
15450 edge12: true,
15451 firefox16: true,
15452 chrome19dev: true,
15453 safari9: true,
15454 safaritp: true,
15455 webkit: true,
15456 konq49: true,
15457 node012: true,
15458 android41: true,
15459 xs6: true,
15460 jxa: true,
15461 },
15462 },
15463 {
15464 name: 'Number.isInteger',
15465 exec: function () {/*
15466 return typeof Number.isInteger === 'function';
15467 */},
15468 res: {
15469 tr: true,
15470 babel: true,
15471 typescript: typescript.corejs,
15472 closure: true,
15473 ejs: true,
15474 es6shim: true,
15475 edge12: true,
15476 firefox16: true,
15477 chrome34: true,
15478 safari9: true,
15479 safaritp: true,
15480 webkit: true,
15481 konq49: true,
15482 node012: true,
15483 xs6: true,
15484 jxa: true,
15485 },
15486 },
15487 {
15488 name: 'Number.isSafeInteger',
15489 exec: function () {/*
15490 return typeof Number.isSafeInteger === 'function';
15491 */},
15492 res: {
15493 tr: true,
15494 babel: true,
15495 typescript: typescript.corejs,
15496 closure: true,
15497 ejs: true,
15498 es6shim: true,
15499 edge12: true,
15500 firefox32: true,
15501 chrome34: true,
15502 safari9: true,
15503 safaritp: true,
15504 webkit: true,
15505 konq49: true,
15506 node012: true,
15507 xs6: true,
15508 jxa: true,
15509 },
15510 },
15511 {
15512 name: 'Number.isNaN',
15513 exec: function () {/*
15514 return typeof Number.isNaN === 'function';
15515 */},
15516 res: {
15517 tr: true,
15518 babel: true,
15519 typescript: typescript.corejs,
15520 closure: true,
15521 ejs: true,
15522 es6shim: true,
15523 edge12: true,
15524 firefox16: true,
15525 chrome19dev: true,
15526 safari9: true,
15527 safaritp: true,
15528 webkit: true,
15529 konq49: true,
15530 node012: true,
15531 android41: true,
15532 xs6: true,
15533 jxa: true,
15534 },
15535 },
15536 {
15537 name: 'Number.EPSILON',
15538 exec: function () {/*
15539 return typeof Number.EPSILON === 'number';
15540 */},
15541 res: {
15542 tr: true,
15543 babel: true,
15544 typescript: typescript.corejs,
15545 closure: true,
15546 ejs: true,
15547 es6shim: true,
15548 edge12: true,
15549 firefox25: true,
15550 chrome34: true,
15551 safari9: true,
15552 safaritp: true,
15553 webkit: true,
15554 node012: true,
15555 xs6: true,
15556 jxa: true,
15557 },
15558 },
15559 {
15560 name: 'Number.MIN_SAFE_INTEGER',
15561 exec: function () {/*
15562 return typeof Number.MIN_SAFE_INTEGER === 'number';
15563 */},
15564 res: {
15565 tr: true,
15566 babel: true,
15567 typescript: typescript.corejs,
15568 closure: true,
15569 ejs: true,
15570 es6shim: true,
15571 edge12: true,
15572 firefox31: true,
15573 chrome34: true,
15574 safari9: true,
15575 safaritp: true,
15576 webkit: true,
15577 konq49: true,
15578 node012: true,
15579 xs6: true,
15580 jxa: true,
15581 },
15582 },
15583 {
15584 name: 'Number.MAX_SAFE_INTEGER',
15585 exec: function () {/*
15586 return typeof Number.MAX_SAFE_INTEGER === 'number';
15587 */},
15588 res: {
15589 tr: true,
15590 babel: true,
15591 typescript: typescript.corejs,
15592 closure: true,
15593 ejs: true,
15594 es6shim: true,
15595 edge12: true,
15596 firefox31: true,
15597 chrome34: true,
15598 safari9: true,
15599 safaritp: true,
15600 webkit: true,
15601 konq49: true,
15602 node012: true,
15603 xs6: true,
15604 jxa: true,
15605 },
15606 },
15607 ],
15608},
15609{
15610 name: 'Math methods',
15611 category: 'built-in extensions',
15612 significance: 'small',
15613 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-math',
15614 subtests: (function(){
15615 var methods = {
15616 'clz32': {
15617 ejs: true,
15618 tr: true,
15619 babel: true,
15620 typescript: typescript.corejs,
15621 closure: true,
15622 es6shim: true,
15623 edge12: true,
15624 firefox31: true,
15625 chrome35: flag,
15626 chrome38: true,
15627 safari9: true,
15628 safaritp: true,
15629 webkit: true,
15630 node012: true,
15631 xs6: true,
15632 jxa: true,
15633 },
15634 'imul': {
15635 ejs: true,
15636 babel: true,
15637 typescript: typescript.corejs,
15638 closure: true,
15639 tr: true,
15640 es6shim: true,
15641 edge12: true,
15642 firefox23: true,
15643 chrome21dev: {
15644 val: true,
15645 note_id: 'chromu-imul',
15646 note_html: 'Available since Chrome 28'
15647 },
15648 chrome30: true,
15649 safari7: true,
15650 safaritp: true,
15651 safari10: true,
15652 webkit: true,
15653 konq49: true,
15654 node012: true,
15655 xs6: true,
15656 jxa: true,
15657 },
15658 'sign': {
15659 ejs: true,
15660 babel: true,
15661 typescript: typescript.corejs,
15662 closure: true,
15663 tr: true,
15664 es6shim: true,
15665 edge12: true,
15666 firefox25: true,
15667 chrome33: flag,
15668 chrome38: true,
15669 safari9: true,
15670 safaritp: true,
15671 webkit: true,
15672 konq49: true,
15673 node012: true,
15674 xs6: true,
15675 jxa: true,
15676 },
15677 'log10': {
15678 ejs: true,
15679 babel: true,
15680 typescript: typescript.corejs,
15681 closure: true,
15682 tr: true,
15683 es6shim: true,
15684 edge12: true,
15685 firefox25: true,
15686 chrome34: flag,
15687 chrome38: true,
15688 safari71_8: true,
15689 safaritp: true,
15690 safari10: true,
15691 webkit: true,
15692 konq49: true,
15693 node012: true,
15694 xs6: true,
15695 jxa: true,
15696 },
15697 'log2': {
15698 ejs: true,
15699 babel: true,
15700 typescript: typescript.corejs,
15701 closure: true,
15702 tr: true,
15703 es6shim: true,
15704 edge12: true,
15705 firefox25: true,
15706 chrome34: flag,
15707 chrome38: true,
15708 safari71_8: true,
15709 safaritp: true,
15710 safari10: true,
15711 webkit: true,
15712 konq49: true,
15713 node012: true,
15714 xs6: true,
15715 jxa: true,
15716 },
15717 'log1p': {
15718 ejs: true,
15719 babel: true,
15720 typescript: typescript.corejs,
15721 closure: true,
15722 tr: true,
15723 es6shim: true,
15724 edge12: true,
15725 firefox25: true,
15726 chrome35: flag,
15727 chrome38: true,
15728 safari71_8: true,
15729 safaritp: true,
15730 safari10: true,
15731 webkit: true,
15732 konq49: true,
15733 node012: true,
15734 xs6: true,
15735 jxa: true,
15736 },
15737 'expm1': {
15738 ejs: true,
15739 babel: true,
15740 typescript: typescript.corejs,
15741 closure: true,
15742 tr: true,
15743 es6shim: true,
15744 edge12: true,
15745 firefox25: true,
15746 chrome35: flag,
15747 chrome38: true,
15748 safari71_8: true,
15749 safaritp: true,
15750 safari10: true,
15751 webkit: true,
15752 node012: true,
15753 xs6: true,
15754 jxa: true,
15755 },
15756 'cosh': {
15757 ejs: true,
15758 babel: true,
15759 typescript: typescript.corejs,
15760 closure: true,
15761 tr: true,
15762 es6shim: true,
15763 edge12: true,
15764 firefox25: true,
15765 chrome34: flag,
15766 chrome38: true,
15767 safari71_8: true,
15768 safaritp: true,
15769 safari10: true,
15770 webkit: true,
15771 konq49: true,
15772 node012: true,
15773 xs6: true,
15774 jxa: true,
15775 },
15776 'sinh': {
15777 ejs: true,
15778 babel: true,
15779 typescript: typescript.corejs,
15780 closure: true,
15781 tr: true,
15782 es6shim: true,
15783 edge12: true,
15784 firefox25: true,
15785 chrome34: flag,
15786 chrome38: true,
15787 safari71_8: true,
15788 safaritp: true,
15789 safari10: true,
15790 webkit: true,
15791 konq49: true,
15792 node012: true,
15793 xs6: true,
15794 jxa: true,
15795 },
15796 'tanh': {
15797 ejs: true,
15798 babel: true,
15799 typescript: typescript.corejs,
15800 closure: true,
15801 tr: true,
15802 es6shim: true,
15803 edge12: true,
15804 firefox25: true,
15805 chrome34: flag,
15806 chrome38: true,
15807 safari71_8: true,
15808 safaritp: true,
15809 safari10: true,
15810 webkit: true,
15811 konq49: true,
15812 node012: true,
15813 xs6: true,
15814 jxa: true,
15815 },
15816 'acosh': {
15817 ejs: true,
15818 babel: true,
15819 typescript: typescript.corejs,
15820 closure: true,
15821 tr: true,
15822 es6shim: true,
15823 edge12: true,
15824 firefox25: true,
15825 chrome34: flag,
15826 chrome38: true,
15827 safari71_8: true,
15828 safaritp: true,
15829 safari10: true,
15830 webkit: true,
15831 konq49: true,
15832 node012: true,
15833 xs6: true,
15834 jxa: true,
15835 },
15836 'asinh': {
15837 ejs: true,
15838 babel: true,
15839 typescript: typescript.corejs,
15840 closure: true,
15841 tr: true,
15842 es6shim: true,
15843 edge12: true,
15844 firefox25: true,
15845 chrome34: flag,
15846 chrome38: true,
15847 safari71_8: true,
15848 safaritp: true,
15849 safari10: true,
15850 webkit: true,
15851 node012: true,
15852 xs6: true,
15853 jxa: true,
15854 },
15855 'atanh': {
15856 ejs: true,
15857 babel: true,
15858 typescript: typescript.corejs,
15859 closure: true,
15860 tr: true,
15861 es6shim: true,
15862 edge12: true,
15863 firefox25: true,
15864 chrome34: flag,
15865 chrome38: true,
15866 safari71_8: true,
15867 safaritp: true,
15868 safari10: true,
15869 webkit: true,
15870 konq49: true,
15871 node012: true,
15872 xs6: true,
15873 jxa: true,
15874 },
15875 'trunc': {
15876 ejs: true,
15877 babel: true,
15878 typescript: typescript.corejs,
15879 closure: true,
15880 tr: true,
15881 es6shim: true,
15882 edge12: true,
15883 firefox25: true,
15884 chrome33: flag,
15885 chrome38: true,
15886 safari71_8: true,
15887 safaritp: true,
15888 safari10: true,
15889 webkit: true,
15890 konq49: true,
15891 node012: true,
15892 xs6: true,
15893 jxa: true,
15894 },
15895 'fround': {
15896 ejs: true,
15897 babel: true,
15898 typescript: typescript.corejs,
15899 tr: true,
15900 es6shim: true,
15901 edge12: true,
15902 firefox27: {
15903 val: true,
15904 note_id: 'fx-fround',
15905 note_html: 'Available since Firefox 26'
15906 },
15907 firefox28: true,
15908 chrome35: flag,
15909 chrome38: true,
15910 safari71_8: true,
15911 safaritp: true,
15912 safari10: true,
15913 webkit: true,
15914 konq49: true,
15915 node012: true,
15916 xs6: true,
15917 jxa: true,
15918 },
15919 'cbrt': {
15920 ejs: true,
15921 babel: true,
15922 typescript: typescript.corejs,
15923 tr: true,
15924 es6shim: true,
15925 edge12: true,
15926 firefox25: true,
15927 chrome34: flag,
15928 chrome38: true,
15929 safari71_8: true,
15930 safaritp: true,
15931 safari10: true,
15932 webkit: true,
15933 konq49: true,
15934 node012: true,
15935 xs6: true,
15936 jxa: true,
15937 },
15938 };
15939 var eqFn = ' === "function"';
15940 return Object.keys(methods).map(function(m) {
15941 return {
15942 name: 'Math.' + m,
15943 exec: eval('0,function(){/*\n return typeof Math.' +
15944 m + eqFn + ';\n*/}'),
15945 res: methods[m]
15946 };
15947 }).concat({
15948 name: 'Math.hypot',
15949 exec: function(){/*
15950 return Math.hypot() === 0 &&
15951 Math.hypot(1) === 1 &&
15952 Math.hypot(9, 12, 20) === 25 &&
15953 Math.hypot(27, 36, 60, 100) === 125;
15954 */},
15955 res: {
15956 ejs: true,
15957 babel: true,
15958 typescript: typescript.corejs,
15959 tr: true,
15960 es6shim: true,
15961 firefox27: true,
15962 edge12: true,
15963 chrome34: flag,
15964 chrome38: true,
15965 safari71_8: true,
15966 safaritp: true,
15967 safari10: true,
15968 webkit: true,
15969 konq49: true,
15970 node012: true,
15971 xs6: true,
15972 jxa: true,
15973 }
15974 });
15975 }()),
15976},
15977{
15978 name: 'Date.prototype[Symbol.toPrimitive]',
15979 category: 'built-in extensions',
15980 significance: 'tiny',
15981 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype-@@toprimitive',
15982 exec: function () {/*
15983 var tp = Date.prototype[Symbol.toPrimitive];
15984 return tp.call(Object(2), "number") === 2
15985 && tp.call(Object(2), "string") === "2"
15986 && tp.call(Object(2), "default") === "2";
15987 */},
15988 res: {
15989 ejs: true,
15990 babel: true,
15991 typescript: typescript.corejs,
15992 firefox44: true,
15993 chrome47: true,
15994 xs6: true,
15995 safaritp: true,
15996 safari10: true,
15997 webkit: true,
15998 }
15999},
16000{
16001 name: 'Array is subclassable',
16002 category: 'subclassing',
16003 significance: 'small',
16004 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-array-constructor',
16005 subtests: [
16006 {
16007 name: 'length property (accessing)',
16008 exec: function () {/*
16009 class C extends Array {}
16010 var c = new C();
16011 var len1 = c.length;
16012 c[2] = 'foo';
16013 var len2 = c.length;
16014 return len1 === 0 && len2 === 3;
16015 */},
16016 res: {
16017 node4: strict,
16018 chrome43: strict,
16019 chrome49: true,
16020 safari9: true,
16021 safaritp: true,
16022 webkit: true,
16023 edge13: true,
16024 firefox45: true,
16025 xs6: true,
16026 ejs: true,
16027 jxa: true,
16028 },
16029 },
16030 {
16031 name: 'length property (setting)',
16032 exec: function () {/*
16033 class C extends Array {}
16034 var c = new C();
16035 c[2] = 'foo';
16036 c.length = 1;
16037 return c.length === 1 && !(2 in c);
16038 */},
16039 res: {
16040 node4: strict,
16041 chrome43: strict,
16042 chrome49: true,
16043 safari9: true,
16044 safaritp: true,
16045 webkit: true,
16046 edge13: true,
16047 firefox45: true,
16048 xs6: true,
16049 ejs: true,
16050 jxa: true,
16051 },
16052 },
16053 {
16054 name: 'correct prototype chain',
16055 exec: function () {/*
16056 class C extends Array {}
16057 var c = new C();
16058 return c instanceof C && c instanceof Array && Object.getPrototypeOf(C) === Array;
16059 */},
16060 res: {
16061 babel: { val: false, note_id: 'compiler-proto' },
16062 node4: strict,
16063 chrome43: strict,
16064 chrome49: true,
16065 edge12: flag,
16066 edge13: true,
16067 firefox45: true,
16068 xs6: true,
16069 ejs: true,
16070 safaritp: true,
16071 safari10: true,
16072 webkit: true,
16073 jxa: true,
16074 },
16075 },
16076 {
16077 name: 'Array.isArray support',
16078 exec: function () {/*
16079 class C extends Array {}
16080 return Array.isArray(new C());
16081 */},
16082 res: {
16083 safari9: true,
16084 safaritp: true,
16085 webkit: true,
16086 chrome43: strict,
16087 chrome49: true,
16088 edge13: true,
16089 firefox45: true,
16090 xs6: true,
16091 ejs: true,
16092 jxa: true,
16093 }
16094 },
16095 {
16096 name: 'Array.prototype.concat',
16097 exec: function () {/*
16098 class C extends Array {}
16099 var c = new C();
16100 return c.concat(1) instanceof C;
16101 */},
16102 res: {
16103 edge13: true,
16104 firefox48: true,
16105 chrome50: flag,
16106 chrome51: true,
16107 xs6: true,
16108 ejs: true,
16109 safaritp: true,
16110 safari10: true,
16111 webkit: true,
16112 jxa: true,
16113 }
16114 },
16115 {
16116 name: 'Array.prototype.filter',
16117 exec: function () {/*
16118 class C extends Array {}
16119 var c = new C();
16120 return c.filter(Boolean) instanceof C;
16121 */},
16122 res: {
16123 edge13: true,
16124 firefox48: true,
16125 chrome50: flag,
16126 chrome51: true,
16127 xs6: true,
16128 ejs: true,
16129 jxa: true,
16130 safaritp: true,
16131 safari10: true,
16132 webkit: true,
16133 }
16134 },
16135 {
16136 name: 'Array.prototype.map',
16137 exec: function () {/*
16138 class C extends Array {}
16139 var c = new C();
16140 return c.map(Boolean) instanceof C;
16141 */},
16142 res: {
16143 edge13: true,
16144 firefox48: true,
16145 chrome50: flag,
16146 chrome51: true,
16147 xs6: true,
16148 ejs: true,
16149 jxa: true,
16150 safaritp: true,
16151 safari10: true,
16152 webkit: true,
16153 }
16154 },
16155 {
16156 name: 'Array.prototype.slice',
16157 exec: function () {/*
16158 class C extends Array {}
16159 var c = new C();
16160 c.push(2,4,6);
16161 return c.slice(1,2) instanceof C;
16162 */},
16163 res: {
16164 edge13: true,
16165 firefox48: true,
16166 chrome50: flag,
16167 chrome51: true,
16168 xs6: true,
16169 ejs: true,
16170 safaritp: true,
16171 safari10: true,
16172 webkit: true,
16173 jxa: true,
16174 }
16175 },
16176 {
16177 name: 'Array.prototype.splice',
16178 exec: function () {/*
16179 class C extends Array {}
16180 var c = new C();
16181 c.push(2,4,6);
16182 return c.splice(1,2) instanceof C;
16183 */},
16184 res: {
16185 edge13: true,
16186 firefox48: true,
16187 chrome50: flag,
16188 chrome51: true,
16189 xs6: true,
16190 ejs: true,
16191 safaritp: true,
16192 safari10: true,
16193 webkit: true,
16194 jxa: true,
16195 }
16196 },
16197 {
16198 name: 'Array.from',
16199 exec: function () {/*
16200 class C extends Array {}
16201 return C.from({ length: 0 }) instanceof C;
16202 */},
16203 res: {
16204 tr: { val: false, note_id: 'compiler-proto' },
16205 babel: { val: false, note_id: 'compiler-proto' },
16206 edge12: flag,
16207 edge13: true,
16208 firefox45: true,
16209 ejs: true,
16210 chrome45: strict,
16211 chrome49: true,
16212 xs6: true,
16213 safaritp: true,
16214 safari10: true,
16215 webkit: true,
16216 jxa: true,
16217 }
16218 },
16219 {
16220 name: 'Array.of',
16221 exec: function () {/*
16222 class C extends Array {}
16223 return C.of(0) instanceof C;
16224 */},
16225 res: {
16226 tr: { val: false, note_id: 'compiler-proto' },
16227 babel: { val: false, note_id: 'compiler-proto' },
16228 edge12: flag,
16229 edge13: true,
16230 firefox45: true,
16231 xs6: true,
16232 ejs: true,
16233 chrome45: strict,
16234 chrome49: true,
16235 safaritp: true,
16236 safari10: true,
16237 webkit: true,
16238 jxa: true,
16239 }
16240 },
16241 ],
16242},
16243{
16244 name: 'RegExp is subclassable',
16245 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-regexp-constructor',
16246 category: 'subclassing',
16247 significance: 'tiny',
16248 subtests: [
16249 {
16250 name: 'basic functionality',
16251 exec: function () {/*
16252 class R extends RegExp {}
16253 var r = new R("baz","g");
16254 return r.global && r.source === "baz";
16255 */},
16256 res: {
16257 typescript: false,
16258 chrome43: strict,
16259 chrome49: true,
16260 safari9: true,
16261 safaritp: true,
16262 webkit: true,
16263 node4: strict,
16264 edge13: true,
16265 firefox45: true,
16266 xs6: true,
16267 ejs: true,
16268 jxa: true,
16269 },
16270 },
16271 {
16272 name: 'correct prototype chain',
16273 exec: function () {/*
16274 class R extends RegExp {}
16275 var r = new R("baz","g");
16276 return r instanceof R && r instanceof RegExp && Object.getPrototypeOf(R) === RegExp;
16277 */},
16278 res: {
16279 babel: { val: false, note_id: 'compiler-proto' },
16280 node4: strict,
16281 chrome43: strict,
16282 chrome49: true,
16283 typescript: false,
16284 edge12: flag,
16285 edge13: true,
16286 firefox45: true,
16287 xs6: true,
16288 ejs: true,
16289 safaritp: true,
16290 safari10: true,
16291 webkit: true,
16292 jxa: true,
16293 },
16294 },
16295 {
16296 name: 'RegExp.prototype.exec',
16297 exec: function () {/*
16298 class R extends RegExp {}
16299 var r = new R("baz","g");
16300 return r.exec("foobarbaz")[0] === "baz" && r.lastIndex === 9;
16301 */},
16302 res: {
16303 typescript: false,
16304 chrome43: strict,
16305 chrome49: true,
16306 safari9: true,
16307 safaritp: true,
16308 webkit: true,
16309 edge13: true,
16310 firefox45: true,
16311 node5: strict,
16312 xs6: true,
16313 ejs: true,
16314 jxa: true,
16315 },
16316 },
16317 {
16318 name: 'RegExp.prototype.test',
16319 exec: function () {/*
16320 class R extends RegExp {}
16321 var r = new R("baz");
16322 return r.test("foobarbaz");
16323 */},
16324 res: {
16325 typescript: false,
16326 chrome43: strict,
16327 chrome49: true,
16328 safari9: true,
16329 safaritp: true,
16330 webkit: true,
16331 edge13: true,
16332 firefox45: true,
16333 node5: strict,
16334 xs6: true,
16335 ejs: true,
16336 jxa: true,
16337 },
16338 },
16339 ],
16340},
16341{
16342 name: 'Function is subclassable',
16343 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-function-constructor',
16344 category: 'subclassing',
16345 significance: 'tiny',
16346 subtests: [
16347 {
16348 name: 'can be called',
16349 exec: function () {/*
16350 class C extends Function {}
16351 var c = new C("return 'foo';");
16352 return c() === 'foo';
16353 */},
16354 res: {
16355 typescript: false,
16356 chrome43: strict,
16357 chrome49: true,
16358 node4: strict,
16359 edge13: true,
16360 firefox45: true,
16361 xs6: true,
16362 safaritp: true,
16363 safari10: true,
16364 webkit: true,
16365 },
16366 },
16367 {
16368 name: 'correct prototype chain',
16369 exec: function () {/*
16370 class C extends Function {}
16371 var c = new C("return 'foo';");
16372 return c instanceof C && c instanceof Function && Object.getPrototypeOf(C) === Function;
16373 */},
16374 res: {
16375 babel: { val: false, note_id: 'compiler-proto' },
16376 typescript: false,
16377 edge12: flag,
16378 edge13: true,
16379 firefox45: true,
16380 xs6: true,
16381 chrome48: flag,
16382 chrome49: true,
16383 safaritp: true,
16384 safari10: true,
16385 webkit: true,
16386 },
16387 },
16388 {
16389 name: 'can be used with "new"',
16390 exec: function () {/*
16391 class C extends Function {}
16392 var c = new C("this.bar = 2;");
16393 c.prototype.baz = 3;
16394 return new c().bar === 2 && new c().baz === 3;
16395 */},
16396 res: {
16397 typescript: false,
16398 chrome43: strict,
16399 chrome48: false,
16400 chrome49: true,
16401 node4: strict,
16402 edge13: true,
16403 firefox45: true,
16404 xs6: true,
16405 safaritp: true,
16406 safari10: true,
16407 webkit: true,
16408 },
16409 },
16410 {
16411 name: 'Function.prototype.call',
16412 exec: function () {/*
16413 class C extends Function {}
16414 var c = new C("x", "return this.bar + x;");
16415 return c.call({bar:1}, 2) === 3;
16416 */},
16417 res: {
16418 typescript: false,
16419 chrome43: strict,
16420 chrome49: true,
16421 node4: strict,
16422 edge13: true,
16423 firefox45: true,
16424 xs6: true,
16425 safaritp: true,
16426 safari10: true,
16427 webkit: true,
16428 },
16429 },
16430 {
16431 name: 'Function.prototype.apply',
16432 exec: function () {/*
16433 class C extends Function {}
16434 var c = new C("x", "return this.bar + x;");
16435 return c.apply({bar:1}, [2]) === 3;
16436 */},
16437 res: {
16438 typescript: false,
16439 chrome43: strict,
16440 chrome49: true,
16441 node4: strict,
16442 edge13: true,
16443 firefox45: true,
16444 xs6: true,
16445 safaritp: true,
16446 safari10: true,
16447 webkit: true,
16448 },
16449 },
16450 {
16451 name: 'Function.prototype.bind',
16452 exec: function () {/*
16453 class C extends Function {}
16454 var c = new C("x", "y", "return this.bar + x + y;").bind({bar:1}, 2);
16455 return c(6) === 9 && c instanceof C;
16456 */},
16457 res: {
16458 typescript: false,
16459 edge13: true,
16460 firefox45: true,
16461 xs6: true,
16462 chrome48: flag,
16463 chrome49: true,
16464 safaritp: true,
16465 safari10: true,
16466 webkit: true,
16467 },
16468 },
16469 ],
16470},
16471{
16472 name: 'Promise is subclassable',
16473 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-function-constructor',
16474 category: 'subclassing',
16475 significance: 'small',
16476 subtests: [
16477 {
16478 name: 'basic functionality',
16479 exec: function () {/*
16480 class P extends Promise {}
16481 var p1 = new P(function(resolve, reject) { resolve("foo"); });
16482 var p2 = new P(function(resolve, reject) { reject("quux"); });
16483 var score = +(p1 instanceof P);
16484
16485 function thenFn(result) { score += (result === "foo"); check(); }
16486 function catchFn(result) { score += (result === "quux"); check(); }
16487 function shouldNotRun(result) { score = -Infinity; }
16488
16489 p1.then(thenFn, shouldNotRun);
16490 p2.then(shouldNotRun, catchFn);
16491 p1.catch(shouldNotRun);
16492 p2.catch(catchFn);
16493
16494 p1.then(function() {
16495 // P.prototype.then() should return a new P
16496 score += p1.then() instanceof P && p1.then() !== p1;
16497 check();
16498 });
16499
16500 function check() {
16501 if (score === 5) asyncTestPassed();
16502 }
16503 */},
16504 res: {
16505 typescript: false,
16506 chrome43: strict,
16507 chrome49: true,
16508 edge13: true,
16509 firefox45: true,
16510 safaritp: true,
16511 safari10: true,
16512 webkit: true,
16513 node5: strict,
16514 xs6: true,
16515 ejs: true,
16516 },
16517 },
16518 {
16519 name: 'correct prototype chain',
16520 exec: function () {/*
16521 class C extends Promise {}
16522 var c = new C(function(resolve, reject) { resolve("foo"); });
16523 return c instanceof C && c instanceof Promise && Object.getPrototypeOf(C) === Promise;
16524 */},
16525 res: {
16526 typescript: false,
16527 chrome43: strict,
16528 chrome49: true,
16529 node4: strict,
16530 edge13: true,
16531 firefox45: true,
16532 safaritp: true,
16533 safari10: true,
16534 webkit: true,
16535 node5: strict,
16536 xs6: true,
16537 ejs: true,
16538 },
16539 },
16540 {
16541 name: 'Promise.all',
16542 exec: function () {/*
16543 class P extends Promise {}
16544 var fulfills = P.all([
16545 new Promise(function(resolve) { setTimeout(resolve,2000,"foo"); }),
16546 new Promise(function(resolve) { setTimeout(resolve,1000,"bar"); }),
16547 ]);
16548 var rejects = P.all([
16549 new Promise(function(_, reject) { setTimeout(reject, 2000,"baz"); }),
16550 new Promise(function(_, reject) { setTimeout(reject, 1000,"qux"); }),
16551 ]);
16552 var score = +(fulfills instanceof P);
16553 fulfills.then(function(result) { score += (result + "" === "foo,bar"); check(); });
16554 rejects.catch(function(result) { score += (result === "qux"); check(); });
16555
16556 function check() {
16557 if (score === 3) asyncTestPassed();
16558 }
16559 */},
16560 res: {
16561 typescript: false,
16562 chrome43: strict,
16563 chrome49: true,
16564 edge13: true,
16565 firefox45: true,
16566 safaritp: true,
16567 safari10: true,
16568 webkit: true,
16569 node5: strict,
16570 xs6: true,
16571 },
16572 },
16573 {
16574 name: 'Promise.race',
16575 exec: function () {/*
16576 class P extends Promise {}
16577 var fulfills = P.race([
16578 new Promise(function(resolve) { setTimeout(resolve,1000,"foo"); }),
16579 new Promise(function(_, reject) { setTimeout(reject, 2000,"bar"); }),
16580 ]);
16581 var rejects = P.race([
16582 new Promise(function(_, reject) { setTimeout(reject, 1000,"baz"); }),
16583 new Promise(function(resolve) { setTimeout(resolve,2000,"qux"); }),
16584 ]);
16585 var score = +(fulfills instanceof P);
16586 fulfills.then(function(result) { score += (result === "foo"); check(); });
16587 rejects.catch(function(result) { score += (result === "baz"); check(); });
16588
16589 function check() {
16590 if (score === 3) asyncTestPassed();
16591 }
16592 */},
16593 res: {
16594 typescript: false,
16595 chrome43: strict,
16596 chrome49: true,
16597 edge13: true,
16598 firefox45: true,
16599 safaritp: true,
16600 safari10: true,
16601 webkit: true,
16602 node5: strict,
16603 xs6: true,
16604 },
16605 },
16606 ],
16607},
16608{
16609 name: 'miscellaneous subclassables',
16610 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-boolean-constructor',
16611 category: 'subclassing',
16612 significance: 'tiny',
16613 subtests: [
16614 {
16615 name: 'Boolean is subclassable',
16616 exec: function () {/*
16617 class C extends Boolean {}
16618 var c = new C(true);
16619 return c instanceof Boolean
16620 && c instanceof C
16621 && c == true;
16622 */},
16623 res: {
16624 safaritp: true,
16625 safari10: true,
16626 webkit: true,
16627 chrome43: strict,
16628 chrome49: true,
16629 node4: strict,
16630 edge13: true,
16631 firefox45: true,
16632 xs6: true,
16633 ejs: true,
16634 jxa: true,
16635 },
16636 },
16637 {
16638 name: 'Number is subclassable',
16639 exec: function () {/*
16640 class C extends Number {}
16641 var c = new C(6);
16642 return c instanceof Number
16643 && c instanceof C
16644 && +c === 6;
16645 */},
16646 res: {
16647 safaritp: true,
16648 safari10: true,
16649 webkit: true,
16650 chrome43: strict,
16651 chrome49: true,
16652 node4: strict,
16653 edge13: true,
16654 firefox45: true,
16655 xs6: true,
16656 ejs: true,
16657 jxa: true,
16658 },
16659 },
16660 {
16661 name: 'String is subclassable',
16662 exec: function () {/*
16663 class C extends String {}
16664 var c = new C("golly");
16665 return c instanceof String
16666 && c instanceof C
16667 && c + '' === "golly"
16668 && c[0] === "g"
16669 && c.length === 5;
16670 */},
16671 res: {
16672 safaritp: true,
16673 safari10: true,
16674 webkit: true,
16675 chrome43: strict,
16676 chrome49: true,
16677 node4: strict,
16678 edge13: true,
16679 firefox45: true,
16680 xs6: true,
16681 ejs: true,
16682 jxa: true,
16683 },
16684 },
16685 {
16686 name: 'Error is subclassable',
16687 exec: function () {/*
16688 class C extends Error {}
16689 var c = new C();
16690 return c instanceof Error
16691 && c instanceof C
16692 && Object.prototype.toString.call(c) === "[object Error]";
16693 */},
16694 res: {
16695 safaritp: true,
16696 safari10: true,
16697 webkit: true,
16698 chrome43: strict,
16699 chrome49: true,
16700 node4: strict,
16701 edge13: true,
16702 firefox45: true,
16703 xs6: true,
16704 ejs: true,
16705 jxa: true,
16706 },
16707 },
16708 {
16709 name: 'Map is subclassable',
16710 exec: function () {/*
16711 var key = {};
16712 class M extends Map {}
16713 var map = new M();
16714
16715 map.set(key, 123);
16716
16717 return map instanceof M && map.has(key) && map.get(key) === 123;
16718 */},
16719 res: {
16720 closure: true,
16721 safaritp: true,
16722 safari10: true,
16723 webkit: true,
16724 chrome43: strict,
16725 chrome49: true,
16726 node4: strict,
16727 edge13: true,
16728 firefox45: true,
16729 xs6: true,
16730 ejs: true,
16731 jxa: true,
16732 },
16733 },
16734 {
16735 name: 'Set is subclassable',
16736 exec: function () {/*
16737 var obj = {};
16738 class S extends Set {}
16739 var set = new S();
16740
16741 set.add(123);
16742 set.add(123);
16743
16744 return set instanceof S && set.has(123);
16745 */},
16746 res: {
16747 closure: true,
16748 safaritp: true,
16749 safari10: true,
16750 webkit: true,
16751 chrome43: strict,
16752 chrome49: true,
16753 node4: strict,
16754 edge13: true,
16755 firefox45: true,
16756 xs6: true,
16757 ejs: true,
16758 jxa: true,
16759 },
16760 },
16761 ],
16762},
16763{
16764 name: 'own property order',
16765 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-ordinary-object-internal-methods-and-internal-slots-ownpropertykeys',
16766 category: 'misc',
16767 significance: 'tiny',
16768 subtests: [
16769 {
16770 name: 'Object.keys',
16771 exec: function () {/*
16772 var obj = {
16773 // Non-negative integer names appear first in value order
16774 2: true,
16775 0: true,
16776 1: true,
16777 // Other string names appear in source order
16778 ' ': true,
16779 // Non-negative integers are sorted above other names
16780 9: true,
16781 D: true,
16782 B: true,
16783 // Negative integers are treated as other names
16784 '-1': true,
16785 };
16786 // Other string names are added in order of creation
16787 obj.A = true;
16788 // Non-negative integer names, conversely, ignore order of creation
16789 obj[3] = true;
16790 // Having a total of 20+ properties doesn't affect property order
16791 "EFGHIJKLMNOPQRSTUVWXYZ".split('').forEach(function(key){
16792 obj[key] = true;
16793 });
16794 // Object.defineProperty doesn't affect the above rules
16795 Object.defineProperty(obj, 'C', { value: true, enumerable: true });
16796 Object.defineProperty(obj, '4', { value: true, enumerable: true });
16797 // Deleting and reinserting a property doesn't preserve its position
16798 delete obj[2];
16799 obj[2] = true;
16800
16801 var forInOrder = '';
16802 for(var key in obj)forInOrder += key;
16803
16804 return Object.keys(obj).join('') === forInOrder;
16805 */},
16806 res: {
16807 ie10: true,
16808 chrome: true,
16809 firefox4: true,
16810 node012: true,
16811 opera: true,
16812 safari51: true,
16813 safaritp: true,
16814 safari10: true,
16815 webkit: true,
16816 android40: true,
16817 xs6: true,
16818 phantom: true,
16819 ejs: false,
16820 konq49: null,
16821 rhino17: null,
16822 jxa: true,
16823 },
16824 },
16825 {
16826 name: 'Object.getOwnPropertyNames',
16827 exec: function () {/*
16828 var obj = {
16829 2: true,
16830 0: true,
16831 1: true,
16832 ' ': true,
16833 9: true,
16834 D: true,
16835 B: true,
16836 '-1': true
16837 };
16838 obj.A = true;
16839 obj[3] = true;
16840 "EFGHIJKLMNOPQRSTUVWXYZ".split('').forEach(function(key){
16841 obj[key] = true;
16842 });
16843 Object.defineProperty(obj, 'C', { value: true, enumerable: true });
16844 Object.defineProperty(obj, '4', { value: true, enumerable: true });
16845 delete obj[2];
16846 obj[2] = true;
16847
16848 return Object.getOwnPropertyNames(obj).join('') === "012349 DB-1AEFGHIJKLMNOPQRSTUVWXYZC";
16849 */},
16850 res: {
16851 ie10: { val: true, note_id: 'ie_property_order' },
16852 firefox44: true,
16853 opera: true,
16854 safari71_8: true,
16855 safaritp: true,
16856 safari10: true,
16857 webkit: true,
16858 xs6: true,
16859 chrome49: true,
16860 jxa: true,
16861 },
16862 },
16863 {
16864 name: 'Object.assign',
16865 exec: function () {/*
16866 var result = '';
16867 var target = {};
16868
16869 "012349 DBACEFGHIJKLMNOPQRST".split('').concat(-1).forEach(function(key){
16870 Object.defineProperty(target, key, {
16871 set: function(){
16872 result += key;
16873 }
16874 })
16875 });
16876
16877 var obj = {2: 2, 0: 0, 1: 1, ' ': ' ', 9: 9, D: 'D', B: 'B', '-1': '-1'};
16878 Object.defineProperty(obj, 'A', {value: 'A', enumerable: true});
16879 Object.defineProperty(obj, '3', {value: '3', enumerable: true});
16880 Object.defineProperty(obj, 'C', {value: 'C', enumerable: true});
16881 Object.defineProperty(obj, '4', {value: '4', enumerable: true});
16882 delete obj[2];
16883 obj[2] = true;
16884
16885 "EFGHIJKLMNOPQRST".split('').forEach(function(key){
16886 obj[key] = key;
16887 });
16888
16889 Object.assign(target, obj);
16890
16891 return result === "012349 DB-1ACEFGHIJKLMNOPQRST";
16892 */},
16893 res: {
16894 edge12: { val: true, note_id: 'ie_property_order' },
16895 firefox44: true,
16896 safari9: true,
16897 safaritp: true,
16898 webkit: true,
16899 xs6: true,
16900 chrome49: true,
16901 jxa: true,
16902 },
16903 },
16904 {
16905 name: 'JSON.stringify',
16906 exec: function () {/*
16907 var obj = {
16908 2: true,
16909 0: true,
16910 1: true,
16911 ' ': true,
16912 9: true,
16913 D: true,
16914 B: true,
16915 '-1': true
16916 };
16917 obj.A = true;
16918 obj[3] = true;
16919 "EFGHIJKLMNOPQRSTUVWXYZ".split('').forEach(function(key){
16920 obj[key] = true;
16921 });
16922 Object.defineProperty(obj, 'C', { value: true, enumerable: true });
16923 Object.defineProperty(obj, '4', { value: true, enumerable: true });
16924 delete obj[2];
16925 obj[2] = true;
16926
16927 return JSON.stringify(obj) ===
16928 '{"0":true,"1":true,"2":true,"3":true,"4":true,"9":true," ":true,"D":true,"B":true,"-1":true,"A":true,"E":true,"F":true,"G":true,"H":true,"I":true,"J":true,"K":true,"L":true,"M":true,"N":true,"O":true,"P":true,"Q":true,"R":true,"S":true,"T":true,"U":true,"V":true,"W":true,"X":true,"Y":true,"Z":true,"C":true}';
16929 */},
16930 res: {
16931 ie10: { val: true, note_id: 'ie_property_order' },
16932 firefox44: true,
16933 ejs: true,
16934 chrome: true,
16935 node012: true,
16936 opera: true,
16937 safari7: true,
16938 safaritp: true,
16939 safari10: true,
16940 webkit: true,
16941 android40: true,
16942 xs6: true,
16943 jxa: true,
16944 },
16945 },
16946 {
16947 name: 'JSON.parse',
16948 exec: function () {/*
16949 var result = '';
16950 JSON.parse(
16951 '{"0":true,"1":true,"2":true,"3":true,"4":true,"9":true," ":true,"D":true,"B":true,"-1":true,"E":true,"F":true,"G":true,"H":true,"I":true,"J":true,"K":true,"L":true,"A":true,"C":true}',
16952 function reviver(k,v) {
16953 result += k;
16954 return v;
16955 }
16956 );
16957 return result === "012349 DB-1EFGHIJKLAC";
16958 */},
16959 res: {
16960 ie10: {
16961 val: true,
16962 note_id: 'ie_property_order',
16963 note_html: 'Unlike other engines, Chakra sorts properties removed by <code>delete</code>, then recreated by assignment, to their original creation positions, not their latest positions.'
16964 },
16965 firefox3_5: true,
16966 firefox4: true,
16967 chrome: true,
16968 node012: true,
16969 opera: true,
16970 safari51: true,
16971 safaritp: true,
16972 safari10: true,
16973 webkit: true,
16974 android40: true,
16975 xs6: true,
16976 jxa: true,
16977 },
16978 },
16979 {
16980 name: 'Reflect.ownKeys, string key order',
16981 exec: function() {/*
16982 var obj = {
16983 2: true,
16984 0: true,
16985 1: true,
16986 ' ': true,
16987 9: true,
16988 D: true,
16989 B: true,
16990 '-1': true
16991 };
16992 obj.A = true;
16993 obj[3] = true;
16994 "EFGHIJKLMNOPQRSTUVWXYZ".split('').forEach(function(key){
16995 obj[key] = true;
16996 });
16997 Object.defineProperty(obj, 'C', { value: true, enumerable: true });
16998 Object.defineProperty(obj, '4', { value: true, enumerable: true });
16999 delete obj[2];
17000 obj[2] = true;
17001
17002 return Reflect.ownKeys(obj).join('') === "012349 DB-1AEFGHIJKLMNOPQRSTUVWXYZC";
17003 */},
17004 res: {
17005 babel: { val: false, note_id: "forin-order", note_html: "This uses native for-in enumeration order, rather than the correct order." },
17006 typescript: { val: false, note_id: "forin-order" },
17007 es6shim: { val: false, note_id: "forin-order" },
17008 firefox44: true,
17009 edge12: true,
17010 safaritp: true,
17011 safari10: true,
17012 webkit: true,
17013 xs6: true,
17014 ejs: true,
17015 chrome49: true,
17016 },
17017 },
17018 {
17019 name: 'Reflect.ownKeys, symbol key order',
17020 exec: function() {/*
17021 var sym1 = Symbol(), sym2 = Symbol(), sym3 = Symbol();
17022 var obj = {
17023 1: true,
17024 A: true,
17025 };
17026 obj.B = true;
17027 obj[sym1] = true;
17028 obj[2] = true;
17029 obj[sym2] = true;
17030 Object.defineProperty(obj, 'C', { value: true, enumerable: true });
17031 Object.defineProperty(obj, sym3,{ value: true, enumerable: true });
17032 Object.defineProperty(obj, 'D', { value: true, enumerable: true });
17033
17034 var result = Reflect.ownKeys(obj);
17035 var l = result.length;
17036 return result[l-3] === sym1 && result[l-2] === sym2 && result[l-1] === sym3;
17037 */},
17038 res: {
17039 babel: true,
17040 typescript: typescript.corejs,
17041 es6shim: true,
17042 edge12: true,
17043 safaritp: true,
17044 safari10: true,
17045 webkit: true,
17046 firefox42: true,
17047 xs6: true,
17048 ejs: true,
17049 chrome49: true,
17050 }
17051 },
17052 ],
17053},
17054{
17055 name: 'miscellaneous',
17056 category: 'misc',
17057 significance: 'small',
17058 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-additions-and-changes-that-introduce-incompatibilities-with-prior-editions',
17059 subtests: [
17060 {
17061 name: 'no escaped reserved words as identifiers',
17062 exec: function() {/*
17063 var \u0061;
17064 try {
17065 eval('var v\\u0061r');
17066 } catch(e) {
17067 return true;
17068 }
17069 */},
17070 res: {
17071 babel: true,
17072 tr: true,
17073 jsx: true,
17074 es6tr: true,
17075 typescript: true,
17076 closure: true,
17077 ie10: true,
17078 firefox10: true,
17079 safari9: true,
17080 safaritp: true,
17081 webkit: true,
17082 opera: true,
17083 xs6: true,
17084 chrome49: true,
17085 jxa: true,
17086 },
17087 },
17088 {
17089 name: 'duplicate property names in strict mode',
17090 exec: function(){/*
17091 'use strict';
17092 return this === undefined && ({ a:1, a:1 }).a === 1;
17093 */},
17094 res: {
17095 ejs: true,
17096 edge12: true,
17097 firefox34: true,
17098 chrome42: true,
17099 safari9: true,
17100 safaritp: true,
17101 webkit: true,
17102 node4: true,
17103 xs6: true,
17104 jxa: true,
17105 },
17106 },
17107 {
17108 name: 'no semicolon needed after do-while',
17109 exec: function(){/*
17110 do {} while (false) return true;
17111 */},
17112 res: {
17113 ejs: true,
17114 babel: true,
17115 closure: true,
17116 typescript: true,
17117 ie10: true,
17118 firefox2: true,
17119 chrome: true,
17120 safari51: true,
17121 safaritp: true,
17122 safari10: true,
17123 webkit: true,
17124 opera: true,
17125 rhino17: true,
17126 node012: true,
17127 android40: true,
17128 xs6: true,
17129 jxa: true,
17130 },
17131 },
17132 {
17133 name: 'no assignments allowed in for-in head in strict mode',
17134 exec: function(){/*
17135 'use strict';
17136 try {
17137 eval('for (var i = 0 in {}) {}');
17138 }
17139 catch(e) {
17140 return true;
17141 }
17142 */},
17143 res: {
17144 ejs: true,
17145 babel: true,
17146 closure: true,
17147 typescript: true,
17148 chrome45: true,
17149 safari9: true,
17150 safaritp: true,
17151 webkit: true,
17152 xs6: true,
17153 jxa: true,
17154 },
17155 },
17156 {
17157 name: 'accessors aren\'t constructors',
17158 exec: function(){/*
17159 var f = (Object.getOwnPropertyDescriptor({get a(){}}, 'a')).get;
17160 try {
17161 new f;
17162 } catch(e) {
17163 return true;
17164 }
17165 */},
17166 res: {
17167 edge12: true,
17168 chrome42: true,
17169 node4: true,
17170 firefox41: true,
17171 safaritp: true,
17172 safari10: true,
17173 webkit: true,
17174 xs6: true,
17175 jxa: true,
17176 },
17177 },
17178 {
17179 name: 'Invalid Date',
17180 exec: function(){/*
17181 return new Date(NaN) + "" === "Invalid Date";
17182 */},
17183 res: {
17184 babel: true,
17185 typescript: typescript.corejs,
17186 es6shim: true,
17187 ejs: true,
17188 ie10: true,
17189 firefox2: true,
17190 chrome: true,
17191 safari51: true,
17192 safaritp: true,
17193 safari10: true,
17194 webkit: true,
17195 opera: true,
17196 konq49: true,
17197 rhino17: true,
17198 node012: true,
17199 android40: true,
17200 xs6: true,
17201 jxa: true,
17202 },
17203 },
17204 {
17205 name: 'RegExp constructor can alter flags',
17206 exec: function(){/*
17207 return new RegExp(/./im, "g").global === true;
17208 */},
17209 res: {
17210 babel: true,
17211 typescript: typescript.corejs,
17212 ejs: true,
17213 es6shim: true,
17214 edge12: true,
17215 firefox39: true,
17216 xs6: true,
17217 chrome49: true,
17218 safaritp: true,
17219 safari10: true,
17220 webkit: true,
17221 },
17222 },
17223 {
17224 name: 'RegExp.prototype.toString generic and uses "flags" property',
17225 exec: function(){/*
17226 return RegExp.prototype.toString.call({source: 'foo', flags: 'bar'}) === '/foo/bar';
17227 */},
17228 res: {
17229 babel: true,
17230 typescript: typescript.corejs,
17231 edge14: flag,
17232 firefox39: true,
17233 chrome50: true,
17234 ejs: null,
17235 xs6: null,
17236 jxa: true,
17237 safaritp: true,
17238 safari10: true,
17239 webkit: true,
17240 },
17241 },
17242 {
17243 name: 'built-in prototypes are not instances',
17244 exec: function(){/*
17245 try {
17246 RegExp.prototype.exec(); return false;
17247 } catch(e) {}
17248 try {
17249 Date.prototype.valueOf(); return false;
17250 } catch(e) {}
17251
17252 if (![Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError].every(function (E) {
17253 return Object.prototype.toString.call(E.prototype) === '[object Object]';
17254 })) {
17255 return false;
17256 }
17257
17258 return true;
17259 */},
17260 res: {
17261 xs6: false,
17262 jxa: true,
17263 edge14: flag,
17264 chrome50: true,
17265 safaritp: true,
17266 safari10: true,
17267 webkit: true,
17268 },
17269 },
17270 {
17271 name: 'function \'length\' is configurable',
17272 exec: function(){/*
17273 var fn = function(a, b) {};
17274
17275 var desc = Object.getOwnPropertyDescriptor(fn, "length");
17276 if (desc.configurable) {
17277 Object.defineProperty(fn, "length", { value: 1 });
17278 return fn.length === 1;
17279 }
17280
17281 return false;
17282 */},
17283 res: {
17284 firefox37: true,
17285 chrome43: true,
17286 edge12: true,
17287 node4: true,
17288 xs6: true,
17289 safaritp: true,
17290 safari10: true,
17291 webkit: true,
17292 jxa: true,
17293 },
17294 },
17295 ],
17296},
17297{
17298 name: 'HTML-style comments',
17299 category: 'annex b',
17300 significance: 'tiny',
17301 link: 'http://www.ecma-international.org/ecma-262/6.0/#sec-html-like-comments',
17302 exec: function () {/*
17303 --> A comment
17304 <!-- Another comment
17305 var a = 3; <!-- Another comment
17306 return a === 3;
17307 */},
17308 res: {
17309 ejs: true,
17310 firefox2: true,
17311 chrome: true,
17312 safari51: true,
17313 edge14: true,
17314 safaritp: true,
17315 safari10: true,
17316 webkit: true,
17317 opera: true,
17318 konq49: true,
17319 rhino17: true,
17320 node012: true,
17321 android40: true,
17322 edge13: false,
17323 xs6: false,
17324 }
17325},
17326];
17327
17328//Shift annex B features to the bottom
17329exports.tests = exports.tests.reduce(function(a,e) {
17330 var index = ['optimisation','syntax','bindings','functions',
17331 'built-ins','built-in extensions','subclassing','misc','annex b'].indexOf(e.category);
17332 if (index === -1) {
17333 console.log('"' + a.category + '" is not an ES6 category!');
17334 }
17335 (a[index] = a[index] || []).push(e);
17336 return a;
17337},[]).reduce(function(a,e) {
17338 return a.concat(e);
17339},[]);