UNPKG

40 kBJavaScriptView Raw
1require('object.assign').shim();
2var temp = {};
3
4// exports browsers and tests
5exports.name = 'ES5';
6exports.target_file = 'es5/index.html';
7exports.skeleton_file = 'es5/skeleton.html';
8exports.browsers = {
9 es5shim: {
10 full: 'es5-shim',
11 short: 'es5-shim',
12 obsolete: false,
13 platformtype: 'compiler'
14 },
15 ie7: {
16 full: 'Internet Explorer 7',
17 family: 'Chakra',
18 short: 'IE 7',
19 obsolete: true
20 },
21 ie8: {
22 full: 'Internet Explorer 8',
23 family: 'Chakra',
24 short: 'IE 8',
25 obsolete: true
26 },
27 ie9: {
28 full: 'Internet Explorer 9',
29 family: 'Chakra',
30 short: 'IE 9',
31 obsolete: false
32 },
33 ie10: {
34 full: 'Internet Explorer 10, 11',
35 family: 'Chakra',
36 short: 'IE 10-11',
37 obsolete: false
38 },
39 edge13: {
40 full: 'Edge 13+',
41 family: 'Chakra',
42 short: 'Edge 13+',
43 obsolete: false
44 },
45 firefox2: {
46 full: 'Firefox 2',
47 family: 'SpiderMonkey',
48 short: 'FF 2',
49 obsolete: true
50 },
51 firefox3: {
52 full: 'Firefox 3',
53 family: 'SpiderMonkey',
54 short: 'FF 3',
55 obsolete: true
56 },
57 firefox3_5: {
58 full: 'Firefox 3.5',
59 family: 'SpiderMonkey',
60 short: 'FF 3.5',
61 obsolete: true
62 },
63 firefox3_6: {
64 full: 'Firefox 3.6',
65 family: 'SpiderMonkey',
66 short: 'FF 3.6',
67 obsolete: true
68 },
69 firefox4: {
70 full: 'Firefox 4',
71 family: 'SpiderMonkey',
72 short: 'FF 4',
73 obsolete: true
74 },
75 firefox5: {
76 full: 'Firefox 5-7',
77 family: 'SpiderMonkey',
78 short: 'FF 5-7',
79 obsolete: true
80 },
81 firefox8: {
82 full: 'Firefox 8-20',
83 family: 'SpiderMonkey',
84 short: 'FF 8-20',
85 obsolete: true
86 },
87 firefox21: {
88 full: 'Firefox 21-45',
89 family: 'SpiderMonkey',
90 short: 'FF 21-45',
91 obsolete: false
92 },
93 firefox46: {
94 full: 'Firefox 46+',
95 family: 'SpiderMonkey',
96 short: 'FF 46+',
97 obsolete: false
98 },
99 safari3: {
100 full: 'Safari 3.2',
101 family: 'JavaScriptCore',
102 short: 'SF 3.2',
103 obsolete: true
104 },
105 safari4: {
106 full: 'Safari 4.0.5',
107 family: 'JavaScriptCore',
108 short: 'SF 4',
109 obsolete: true
110 },
111 safari5: {
112 full: 'Safari 5.0.5',
113 family: 'JavaScriptCore',
114 short: 'SF 5',
115 obsolete: true
116 },
117 safari51: {
118 full: 'Safari 5.1.4',
119 family: 'JavaScriptCore',
120 short: 'SF 5.1.4',
121 obsolete: true
122 },
123 safari6: {
124 full: 'Safari 6.0, Safari 7.0, Safari 7.1, Safari 8, Safari 9',
125 family: 'JavaScriptCore',
126 short: 'SF 6-9',
127 obsolete: false
128 },
129 safari10: {
130 full: 'Safari 10',
131 family: 'JavaScriptCore',
132 short: 'SF 10',
133 obsolete: false
134 },
135 safaritp: {
136 full: 'Safari Technology Preview Release 12',
137 family: 'JavaScriptCore',
138 short: 'SF TP',
139 unstable: true
140 },
141 webkit: {
142 full: 'WebKit r204915 (August 24, 2016)',
143 family: 'JavaScriptCore',
144 short: 'WebKit',
145 unstable: true
146 },
147 chrome5: {
148 full: 'Chrome 5 (5.0.375.127)',
149 family: 'V8',
150 short: 'CH 5',
151 obsolete: true
152 },
153 chrome6: {
154 full: 'Chrome 6 (6.0.472.55)',
155 family: 'V8',
156 short: 'CH 6',
157 obsolete: true
158 },
159 chrome7: {
160 full: 'Chrome 7 (7.0.517.5), Chrome 8, Chrome 9 (9.0.587.0 dev), Chrome 10, Chrome 11, Chrome 12 (12.0.742.91)',
161 family: 'V8',
162 short: 'CH 7-12',
163 obsolete: true
164 },
165 chrome13: {
166 full: 'Chrome 13 (13.0.782.107 beta), Chrome 14 (14.0.835.8 dev), Chrome 15, Chrome 16 (16.0.891.0 dev)',
167 family: 'V8',
168 short: 'CH 13-16',
169 obsolete: true
170 },
171 chrome19: {
172 full: 'Chrome 19 (19.0.1084.56 stable), Chrome 22',
173 family: 'V8',
174 short: 'CH 19-22',
175 obsolete: true
176 },
177 chrome23: {
178 full: 'Chrome 23-53, Opera 15+',
179 family: 'V8',
180 short: 'CH 23-53,<br>OP 15+',
181 obsolete: false
182 },
183 chrome54: {
184 full: 'Chrome 54 (54.0.2808.0 canary)',
185 family: 'V8',
186 short: 'CH 54',
187 unstable: true
188 },
189 opera10_10: {
190 full: 'Opera 10.10',
191 family: 'Carakan',
192 short: 'OP 10.1',
193 obsolete: true
194 },
195 opera10_50: {
196 full: 'Opera 10.50, Opera 10.62 (build 8437), Opera 10.70 (build 9044), Opera 11 (build 1156), Opera 11.10 (build 2048), Opera 11.11 (build 2109), Opera 11.50 (build 1074)',
197 family: 'Carakan',
198 short: 'OP 10.50-11.50',
199 obsolete: true
200 },
201 opera12: {
202 full: 'Opera 11.60 (build 1185), Opera 11.64 (build 1403), Opera 12 (build 1065)',
203 family: 'Carakan',
204 short: 'OP 11.60-OP 12',
205 obsolete: true
206 },
207 opera12_10: {
208 full: 'Opera 12.15',
209 family: 'Carakan',
210 short: 'OP 12.10',
211 obsolete: false
212 },
213 konq43: {
214 full: 'Konqueror 4.3',
215 family: 'KJS',
216 short: 'Konq 4.3',
217 obsolete: true
218 },
219 konq49: {
220 full: 'Konqueror 4.9',
221 family: 'KJS',
222 short: 'Konq 4.9',
223 obsolete: true
224 },
225 konq413: {
226 full: 'Konqueror 4.13',
227 family: 'KJS',
228 short: 'Konq 4.13',
229 obsolete: false
230 },
231 besen: {
232 full: 'Bero\'s EcmaScript Engine (version 1.0.0.489)',
233 short: 'BESEN',
234 link: 'http://besen.sourceforge.net/',
235 obsolete: false,
236 platformtype: 'engine',
237 },
238 rhino: {
239 full: 'Rhino 1.7 release 3 PRERELEASE 2010 01 14',
240 short: 'Rhino 1.7',
241 obsolete: false,
242 platform: 'engine',
243 },
244 phantom: {
245 full: 'PhantomJS 2.0',
246 short: 'PhantomJS 2.0',
247 obsolete: false,
248 platformtype: 'engine',
249 equals: 'safari6',
250 },
251 ejs: {
252 full: 'Echo JS',
253 short: 'EJS',
254 unstable: true,
255 platformtype: 'compiler',
256 },
257 android40: {
258 full: 'Android Browser',
259 family: 'Android',
260 short: 'Android 4.0',
261 platformtype: 'mobile',
262 obsolete: true,
263 },
264 android41: {
265 full: 'Android Browser',
266 family: 'Android',
267 short: 'Android 4.1 - 4.3',
268 platformtype: 'mobile',
269 obsolete: true,
270 },
271 android44: {
272 full: 'Android Browser',
273 family: 'Android',
274 short: 'Android 4.4+',
275 platformtype: 'mobile',
276 equals: 'chrome23',
277 ignore_flagged: true,
278 },
279 ios78: {
280 full: 'iOS Safari 7/8/9',
281 short: 'iOS7/8/9',
282 equals: 'safari6',
283 platformtype: 'mobile',
284 }
285};
286var sparseNote = {
287 val: true,
288 note_id: 'sparse_arrays',
289 note_html: 'Internet Explorer 6 - 8 do not differentiate between a dense array with undefined values, and a sparse array. Specifically, `0 in [,]` and `0 in [undefined]` both yield false - whereas in a compliant browser, the former would give `false`, the latter `true`. As such, ES5 array iteration methods can only be shimmed reliably when dealing with dense arrays.'
290};
291exports.tests = [
292{
293 name: 'Object/array literal extensions',
294 significance: 'large',
295 subtests: [{
296 name: 'Getter accessors',
297 exec: function () {/*
298 return ({ get x(){ return 1 } }).x === 1;
299 */},
300 res: {
301 ie9: true,
302 firefox2: true,
303 safari3: true,
304 safaritp: true,
305 webkit: true,
306 chrome5: true,
307 opera10_10: true,
308 konq43: true,
309 besen: true,
310 rhino: true,
311 ejs: true,
312 android40: true,
313 }
314 },
315 {
316 name: 'Setter accessors',
317 exec: function () {/*
318 var value = 0;
319 ({ set x(v){ value = v; } }).x = 1;
320 return value === 1;
321 */},
322 res: {
323 ie9: true,
324 firefox2: true,
325 safari3: true,
326 safaritp: true,
327 webkit: true,
328 chrome5: true,
329 opera10_10: true,
330 konq43: true,
331 besen: true,
332 rhino: true,
333 ejs: true,
334 android40: true,
335 },
336 },
337 {
338 name: 'Trailing commas in object literals',
339 exec: function () {/*
340 return { a: true, }.a === true;
341 */},
342 res: {
343 ie9: true,
344 firefox2: true,
345 safari3: null,
346 safari4: true,
347 safaritp: true,
348 webkit: true,
349 chrome5: null,
350 chrome7: true,
351 opera10_50: null,
352 opera12_10: true,
353 konq43: null,
354 besen: null,
355 rhino: null,
356 ejs: null,
357 android40: null,
358 },
359 },
360 {
361 name: 'Trailing commas in array literals',
362 exec: function () {/*
363 return [1,].length === 1;
364 */},
365 res: {
366 ie9: true,
367 firefox2: true,
368 safari3: null,
369 safari4: true,
370 safaritp: true,
371 webkit: true,
372 chrome5: null,
373 chrome7: true,
374 opera10_50: null,
375 opera12_10: true,
376 konq43: null,
377 besen: null,
378 rhino: null,
379 ejs: null,
380 android40: null,
381 },
382 },
383 {
384 name: 'Reserved words as property names',
385 exec: function () {/*
386 return ({ if: 1 }).if === 1;
387 */},
388 res: {
389 ie9: true,
390 firefox2: true,
391 safari51: true,
392 safaritp: true,
393 webkit: true,
394 chrome5: false,
395 chrome6: false,
396 chrome7: true,
397 chrome13: true,
398 chrome19: true,
399 chrome23: true,
400 opera12: true,
401 konq413: true,
402 besen: true,
403 rhino: false,
404 ejs: true,
405 android40: true,
406 },
407 }],
408 separator: 'after'
409},
410{
411 name: 'Object static methods',
412 significance: 'large',
413 subtests: [{
414 name: 'Object.create',
415 exec: function () {
416 return typeof Object.create == 'function';
417 },
418 res: {
419 ie9: true,
420 firefox4: true,
421 safari5: true,
422 safaritp: true,
423 webkit: true,
424 chrome5: true,
425 opera12: true,
426 konq413: true,
427 besen: true,
428 rhino: true,
429 ejs: true,
430 android40: true,
431 }
432 },
433 {
434 name: 'Object.defineProperty',
435 exec: function () {
436 return typeof Object.defineProperty == 'function';
437 },
438 res: {
439 ie8: {
440 val: true,
441 note_id: 'define-property-ie',
442 note_html: 'In Internet Explorer 8 <code>Object.defineProperty</code> only accepts DOM objects ' +
443 '(<a href="http://msdn.microsoft.com/en-us/library/dd548687(VS.85).aspx">MSDN reference</a>).'
444 },
445 ie9: true,
446 firefox4: true,
447 firefox21: true,
448 safari5: {
449 val: true,
450 note_id: 'define-property-webkit',
451 note_html: 'In some versions of Safari 5, <code>Object.defineProperty</code> does <b>not</b> work with DOM objects.'
452 },
453 safari51: true,
454 safaritp: true,
455 webkit: true,
456 chrome5: true,
457 opera12: true,
458 konq413: true,
459 besen: true,
460 rhino: true,
461 ejs: true,
462 android40: true,
463 }
464 },
465 {
466 name: 'Object.defineProperties',
467 exec: function () {
468 return typeof Object.defineProperties == 'function';
469 },
470 res: {
471 ie9: true,
472 firefox4: true,
473 safari5: true,
474 safaritp: true,
475 webkit: true,
476 chrome5: true,
477 opera12: true,
478 konq413: true,
479 besen: true,
480 rhino: true,
481 ejs: true,
482 android40: true,
483 }
484 },
485 {
486 name: 'Object.getPrototypeOf',
487 exec: function () {
488 return typeof Object.getPrototypeOf == 'function';
489 },
490 res: {
491 ie9: true,
492 firefox3_5: true,
493 safari5: true,
494 safaritp: true,
495 webkit: true,
496 chrome5: true,
497 opera12: true,
498 konq43: false,
499 konq49: true,
500 konq413: true,
501 besen: true,
502 rhino: true,
503 ejs: true,
504 android40: true,
505 }
506 },
507 {
508 name: 'Object.keys',
509 exec: function () {
510 return typeof Object.keys == 'function';
511 },
512 res: {
513 es5shim: true,
514 ie9: true,
515 firefox4: true,
516 safari5: true,
517 safaritp: true,
518 webkit: true,
519 chrome5: true,
520 opera12: true,
521 konq43: false,
522 konq49: true,
523 konq413: true,
524 besen: true,
525 rhino: true,
526 ejs: true,
527 android40: true,
528 }
529 },
530 {
531 name: 'Object.seal',
532 exec: function () {
533 return typeof Object.seal == 'function';
534 },
535 res: {
536 ie9: true,
537 firefox4: true,
538 safari51: true,
539 safaritp: true,
540 webkit: true,
541 chrome6: true,
542 opera12: true,
543 konq413: true,
544 besen: true,
545 rhino: true,
546 ejs: true,
547 android40: true,
548 }
549 },
550 {
551 name: 'Object.freeze',
552 exec: function () {
553 return typeof Object.freeze == 'function';
554 },
555 res: {
556 ie9: true,
557 firefox4: true,
558 safari51: true,
559 safaritp: true,
560 webkit: true,
561 chrome6: true,
562 opera12: true,
563 konq413: true,
564 besen: true,
565 rhino: true,
566 ejs: true,
567 android40: true,
568 }
569 },
570 {
571 name: 'Object.preventExtensions',
572 exec: function () {
573 return typeof Object.preventExtensions == 'function';
574 },
575 res: {
576 ie9: true,
577 firefox4: true,
578 safari51: true,
579 safaritp: true,
580 webkit: true,
581 chrome6: true,
582 opera12: true,
583 konq413: true,
584 besen: true,
585 rhino: true,
586 ejs: true,
587 android40: true,
588 }
589 },
590 {
591 name: 'Object.isSealed',
592 exec: function () {
593 return typeof Object.isSealed == 'function';
594 },
595 res: {
596 ie9: true,
597 firefox4: true,
598 safari51: true,
599 safaritp: true,
600 webkit: true,
601 chrome6: true,
602 opera12: true,
603 konq413: true,
604 besen: true,
605 rhino: true,
606 ejs: true,
607 android40: true,
608 }
609 },
610 {
611 name: 'Object.isFrozen',
612 exec: function () {
613 return typeof Object.isFrozen == 'function';
614 },
615 res: {
616 ie9: true,
617 firefox4: true,
618 safari51: true,
619 safaritp: true,
620 webkit: true,
621 chrome6: true,
622 opera12: true,
623 konq413: true,
624 besen: true,
625 rhino: true,
626 ejs: true,
627 android40: true,
628 }
629 },
630 {
631 name: 'Object.isExtensible',
632 exec: function () {
633 return typeof Object.isExtensible == 'function';
634 },
635 res: {
636 ie9: true,
637 firefox4: true,
638 safari51: true,
639 safaritp: true,
640 webkit: true,
641 chrome6: true,
642 opera12: true,
643 konq413: true,
644 besen: true,
645 rhino: true,
646 ejs: true,
647 android40: true,
648 }
649 },
650 {
651 name: 'Object.getOwnPropertyDescriptor',
652 exec: function () {
653 return typeof Object.getOwnPropertyDescriptor == 'function';
654 },
655 res: {
656 ie7: false,
657 ie8: {
658 val: true,
659 note_id: 'get-own-property-descriptor-ie',
660 note_html: 'In Internet Explorer 8 <code>Object.getOwnPropertyDescriptor</code> only accepts DOM objects ' +
661 '(<a href="http://msdn.microsoft.com/en-us/library/dd548687(VS.85).aspx">MSDN reference</a>).'
662 },
663 ie9: true,
664 ie10: true,
665 firefox4: true,
666 safari5: true,
667 safaritp: true,
668 webkit: true,
669 chrome5: true,
670 opera12: true,
671 konq413: true,
672 besen: true,
673 rhino: true,
674 ejs: true,
675 android40: true,
676 }
677 },
678 {
679 name: 'Object.getOwnPropertyNames',
680 exec: function () {
681 return typeof Object.getOwnPropertyNames == 'function';
682 },
683 res: {
684 ie9: true,
685 firefox4: true,
686 safari5: true,
687 safaritp: true,
688 webkit: true,
689 chrome5: true,
690 opera12: true,
691 konq43: false,
692 konq49: true,
693 konq413: true,
694 besen: true,
695 rhino: true,
696 ejs: true,
697 android40: true,
698 },
699 separator: 'after'
700 }],
701},
702{
703 name: 'Array methods',
704 significance: 'large',
705 subtests: [{
706 name: 'Array.isArray',
707 exec: function () {
708 return typeof Array.isArray == 'function';
709 },
710 res: {
711 es5shim: true,
712 ie9: true,
713 firefox4: true,
714 safari5: true,
715 safaritp: true,
716 webkit: true,
717 chrome5: true,
718 opera10_50: true,
719 konq43: false,
720 konq49: true,
721 konq413: true,
722 besen: true,
723 rhino: true,
724 ejs: true,
725 android40: true,
726 }
727 },
728 {
729 name: 'Array.prototype.indexOf',
730 exec: function () {
731 return typeof Array.prototype.indexOf == 'function';
732 },
733 res: {
734 es5shim: true,
735 ie9: true,
736 firefox2: true,
737 safari3: true,
738 safaritp: true,
739 webkit: true,
740 chrome5: true,
741 opera10_10: true,
742 konq43: true,
743 besen: true,
744 rhino: true,
745 ejs: true,
746 android40: true,
747 }
748 },
749 {
750 name: 'Array.prototype.lastIndexOf',
751 exec: function () {
752 return typeof Array.prototype.lastIndexOf == 'function';
753 },
754 res: {
755 es5shim: true,
756 ie9: true,
757 firefox2: true,
758 safari3: true,
759 safaritp: true,
760 webkit: true,
761 chrome5: true,
762 opera10_10: true,
763 konq43: true,
764 besen: true,
765 rhino: true,
766 ejs: true,
767 android40: true,
768 }
769 },
770 {
771 name: 'Array.prototype.every',
772 exec: function () {
773 return typeof Array.prototype.every == 'function';
774 },
775 res: {
776 es5shim: sparseNote,
777 ie9: true,
778 firefox2: true,
779 safari3: true,
780 safaritp: true,
781 webkit: true,
782 chrome5: true,
783 opera10_10: true,
784 konq43: true,
785 besen: true,
786 rhino: true,
787 ejs: true,
788 android40: true,
789 }
790 },
791 {
792 name: 'Array.prototype.some',
793 exec: function () {
794 return typeof Array.prototype.some == 'function';
795 },
796 res: {
797 es5shim: sparseNote,
798 ie9: true,
799 firefox2: true,
800 safari3: true,
801 safaritp: true,
802 webkit: true,
803 chrome5: true,
804 opera10_10: true,
805 konq43: true,
806 besen: true,
807 rhino: true,
808 ejs: true,
809 android40: true,
810 }
811 },
812 {
813 name: 'Array.prototype.forEach',
814 exec: function () {
815 return typeof Array.prototype.forEach == 'function';
816 },
817 res: {
818 es5shim: sparseNote,
819 ie9: true,
820 firefox2: true,
821 safari3: true,
822 safaritp: true,
823 webkit: true,
824 chrome5: true,
825 opera10_10: true,
826 konq43: true,
827 besen: true,
828 rhino: true,
829 ejs: true,
830 android40: true,
831 }
832 },
833 {
834 name: 'Array.prototype.map',
835 exec: function () {
836 return typeof Array.prototype.map == 'function';
837 },
838 res: {
839 es5shim: sparseNote,
840 ie9: true,
841 firefox2: true,
842 safari3: true,
843 safaritp: true,
844 webkit: true,
845 chrome5: true,
846 opera10_10: true,
847 konq43: true,
848 besen: true,
849 rhino: true,
850 ejs: true,
851 android40: true,
852 }
853 },
854 {
855 name: 'Array.prototype.filter',
856 exec: function () {
857 return typeof Array.prototype.filter == 'function';
858 },
859 res: {
860 es5shim: sparseNote,
861 ie9: true,
862 firefox2: true,
863 safari3: true,
864 safaritp: true,
865 webkit: true,
866 chrome5: true,
867 opera10_10: true,
868 konq43: true,
869 besen: true,
870 rhino: true,
871 ejs: true,
872 android40: true,
873 }
874 },
875 {
876 name: 'Array.prototype.reduce',
877 exec: function () {
878 return typeof Array.prototype.reduce == 'function';
879 },
880 res: {
881 es5shim: sparseNote,
882 ie9: true,
883 firefox3: true,
884 safari4: true,
885 safaritp: true,
886 webkit: true,
887 chrome5: true,
888 opera10_50: true,
889 konq43: true,
890 besen: true,
891 rhino: true,
892 ejs: true,
893 android40: true,
894 }
895 },
896 {
897 name: 'Array.prototype.reduceRight',
898 exec: function () {
899 return typeof Array.prototype.reduceRight == 'function';
900 },
901 res: {
902 es5shim: sparseNote,
903 ie9: true,
904 firefox3: true,
905 safari4: true,
906 safaritp: true,
907 webkit: true,
908 chrome5: true,
909 opera10_50: true,
910 konq43: true,
911 besen: true,
912 rhino: true,
913 ejs: true,
914 android40: true,
915 },
916 }],
917},
918{
919 name: 'String properties and methods',
920 significance: 'small',
921 subtests: [{
922 name: 'Property access on strings',
923 exec: function () {
924 return "foobar"[3] === "b";
925 },
926 res: {
927 ie7: false,
928 ie8: true,
929 firefox2: true,
930 safari3: true,
931 safaritp: true,
932 webkit: true,
933 chrome5: true,
934 opera10_10: true,
935 konq43: true,
936 besen: true,
937 rhino: true,
938 ejs: true,
939 android40: true,
940 }
941 },
942 {
943 name: 'String.prototype.trim',
944 exec: function () {
945 return typeof String.prototype.trim == 'function';
946 },
947 res: {
948 es5shim: true,
949 ie9: true,
950 firefox3_5: true,
951 safari5: true,
952 safaritp: true,
953 webkit: true,
954 chrome5: true,
955 opera10_50: true,
956 konq43: false,
957 konq49: true,
958 konq413: true,
959 besen: true,
960 rhino: true,
961 ejs: true,
962 android40: true,
963 },
964 separator: 'after'
965 }
966 ]
967},
968{
969 name: 'Date methods',
970 significance: 'small',
971 subtests: [{
972 name: 'Date.prototype.toISOString',
973 exec: function () {
974 return typeof Date.prototype.toISOString == 'function';
975 },
976 res: {
977 es5shim: true,
978 ie9: true,
979 firefox3_5: true,
980 safari4: true,
981 safaritp: true,
982 webkit: true,
983 chrome5: true,
984 opera10_50: true,
985 konq413: true,
986 besen: true,
987 rhino: true,
988 ejs: false,
989 android40: true,
990 }
991 },
992 {
993 name: 'Date.now',
994 exec: function () {
995 return typeof Date.now == 'function';
996 },
997 res: {
998 es5shim: true,
999 ie9: true,
1000 firefox2: true,
1001 safari4: true,
1002 safaritp: true,
1003 webkit: true,
1004 chrome5: true,
1005 opera10_50: true,
1006 konq43: true,
1007 besen: true,
1008 rhino: true,
1009 ejs: true,
1010 android40: true,
1011 }
1012 },
1013 {
1014 name: 'Date.prototype.toJSON',
1015 exec: function () {
1016 try {
1017 return Date.prototype.toJSON.call(new Date(NaN)) === null;
1018 } catch (e) {
1019 return false;
1020 }
1021 },
1022 res: {
1023 es5shim: true,
1024 ie9: true,
1025 firefox4: true,
1026 safari10: true,
1027 safaritp: true,
1028 webkit: true,
1029 chrome5: true,
1030 opera10_10: false,
1031 opera10_50: false,
1032 opera12: {
1033 val: true,
1034 note_id: 'Date.prototype.toJSON-OP11_60-OP11_64',
1035 note_html: 'In Opera 11.60-11.64 Date.prototype.toJSON is undefined.'
1036 },
1037 opera12_10: true,
1038 konq43: true,
1039 besen: true,
1040 rhino: true,
1041 ejs: true,
1042 android40: true,
1043 }
1044 }]
1045},
1046{
1047 name: 'Function.prototype.bind',
1048 significance: 'medium',
1049 exec: function () {
1050 return typeof Function.prototype.bind == 'function';
1051 },
1052 res: {
1053 es5shim: true,
1054 ie9: true,
1055 firefox4: true,
1056 safari51: true,
1057 safaritp: true,
1058 webkit: true,
1059 chrome7: true,
1060 opera12: true,
1061 konq413: true,
1062 besen: true,
1063 rhino: true,
1064 phantom: true,
1065 ejs: true,
1066 ios78: true,
1067 android40: true,
1068 },
1069},
1070{
1071 name: 'JSON',
1072 significance: 'medium',
1073 exec: function () {
1074 return typeof JSON == 'object';
1075 },
1076 res: {
1077 ie7: false,
1078 ie8: true,
1079 ie9: true,
1080 ie10: true,
1081 firefox3_5: true,
1082 safari4: true,
1083 safaritp: true,
1084 webkit: true,
1085 chrome5: true,
1086 opera10_50: true,
1087 konq43: false,
1088 konq49: true,
1089 konq413: true,
1090 besen: true,
1091 rhino: true,
1092 phantom: true,
1093 ejs: true,
1094 ios78: true,
1095 android40: true,
1096 },
1097 separator: 'after'
1098},
1099{
1100 name: 'Immutable globals',
1101 significance: 'small',
1102 subtests: [
1103 {
1104 name: 'undefined',
1105 exec: function () {/*
1106 undefined = 12345;
1107 var result = typeof undefined == 'undefined';
1108 undefined = void 0;
1109 return result;
1110 */},
1111 res: {
1112 ie9: true,
1113 firefox4: true,
1114 safari5: true,
1115 safaritp: true,
1116 webkit: true,
1117 chrome19: true,
1118 chrome23: true,
1119 opera12: true,
1120 konq43: false,
1121 konq49: true,
1122 konq413: true,
1123 besen: true,
1124 rhino: true,
1125 ejs: false,
1126 android41: true,
1127 }
1128 },
1129 {
1130 name: 'NaN',
1131 exec: function () {/*
1132 NaN = false;
1133 var result = typeof NaN == 'number';
1134 NaN = Math.sqrt(-1);
1135 return result;
1136 */},
1137 res: {
1138 ie9: true,
1139 firefox4: true,
1140 safari5: true,
1141 safaritp: true,
1142 webkit: true,
1143 chrome19: true,
1144 chrome23: true,
1145 opera12: true,
1146 konq43: false,
1147 konq49: true,
1148 konq413: true,
1149 besen: true,
1150 rhino: true,
1151 ejs: false,
1152 android41: true,
1153 }
1154 },
1155 {
1156 name: 'Infinity',
1157 exec: function () {/*
1158 Infinity = false;
1159 var result = typeof Infinity == 'number';
1160 Infinity = 1/0;
1161 return result;
1162 */},
1163 res: {
1164 ie9: true,
1165 firefox4: true,
1166 safari5: true,
1167 safaritp: true,
1168 webkit: true,
1169 chrome19: true,
1170 chrome23: true,
1171 opera12: true,
1172 konq43: false,
1173 konq49: true,
1174 konq413: true,
1175 besen: true,
1176 rhino: true,
1177 ejs: false,
1178 android41: true,
1179 }
1180 }]
1181},
1182{
1183 name: 'Miscellaneous',
1184 significance: 'medium',
1185 subtests: [{
1186 name: 'Array.prototype.sort: compareFn must be function or undefined',
1187 exec: function () {
1188 try {
1189 [1,2].sort(null);
1190 return false;
1191 } catch (enull) {}
1192 try {
1193 [1,2].sort(true);
1194 return false;
1195 } catch (etrue) {}
1196 try {
1197 [1,2].sort({});
1198 return false;
1199 } catch (eobj) {}
1200 try {
1201 [1,2].sort([]);
1202 return false;
1203 } catch (earr) {}
1204 try {
1205 [1,2].sort(/a/g);
1206 return false;
1207 } catch (eregex) {}
1208 return true;
1209 },
1210 res: {
1211 es5shim: true,
1212 ie9: true,
1213 firefox5: true,
1214 opera10_10: null,
1215 opera10_50: true,
1216 konq43: null,
1217 konq49: null,
1218 konq413: null,
1219 besen: null,
1220 rhino: null,
1221 ejs: null,
1222 android40: false,
1223 },
1224 },
1225 {
1226 name: 'Array.prototype.sort: compareFn may be explicit undefined',
1227 exec: function () {
1228 try {
1229 var arr = [2, 1];
1230 return arr.sort(undefined) === arr && arr[0] === 1 && arr[1] === 2;
1231 } catch (e) {
1232 return false;
1233 }
1234 },
1235 res: {
1236 es5shim: true,
1237 ie9: true,
1238 firefox4: true,
1239 safari4: true,
1240 safaritp: true,
1241 webkit: true,
1242 chrome13: true,
1243 opera10_10: null,
1244 opera10_50: true,
1245 konq43: null,
1246 konq49: null,
1247 konq413: null,
1248 besen: null,
1249 rhino: null,
1250 ejs: null,
1251 android40: true,
1252 },
1253 },
1254 {
1255 name: 'Function.prototype.apply permits array-likes',
1256 exec: function () {
1257 return (function(a,b) { return a === 1 && b === 2; }).apply({}, {0:1, 1:2, length:2});
1258 },
1259 res: {
1260 ie7: null,
1261 ie9: true,
1262 firefox4: true,
1263 safari3: false,
1264 safari5: true,
1265 safaritp: true,
1266 webkit: true,
1267 chrome5: false,
1268 chrome13: true,
1269 opera10_10: null,
1270 opera10_50: true,
1271 konq43: null,
1272 besen: null,
1273 rhino: null,
1274 ejs: null,
1275 android40: null,
1276 },
1277 },
1278 {
1279 name: 'parseInt ignores leading zeros',
1280 exec: function () {
1281 return parseInt('010') === 10;
1282 },
1283 res: {
1284 es5shim: true,
1285 ie9: true,
1286 firefox2: false,
1287 firefox21: true,
1288 safari6: true,
1289 safaritp: true,
1290 webkit: true,
1291 chrome23: true,
1292 opera10_10: false,
1293 konq43: false,
1294 konq49: false,
1295 konq413: false,
1296 besen: true,
1297 rhino: false,
1298 ejs: true,
1299 android44: true,
1300 }
1301 },
1302 {
1303 name: 'Function "prototype" property is non-enumerable',
1304 exec: function () {/*
1305 return !Function().propertyIsEnumerable('prototype');
1306 */},
1307 res: {
1308 ie7: null,
1309 ie9: true,
1310 firefox3_6: true,
1311 safari3: null,
1312 safari4: true,
1313 safaritp: true,
1314 webkit: true,
1315 chrome5: false,
1316 chrome13: true,
1317 opera10_10: null,
1318 opera10_50: false,
1319 opera12_10: true,
1320 konq43: null,
1321 besen: null,
1322 rhino: null,
1323 ejs: null,
1324 android40: null,
1325 },
1326 },
1327 {
1328 name: 'Arguments toStringTag is "Arguments"',
1329 exec: function () {/*
1330 return (function(){ return Object.prototype.toString.call(arguments) === '[object Arguments]'; }());
1331 */},
1332 res: {
1333 ie7: null,
1334 ie9: true,
1335 firefox4: true,
1336 safari3: null,
1337 safari4: true,
1338 safaritp: true,
1339 webkit: true,
1340 chrome5: null,
1341 chrome7: true,
1342 chrome13: true,
1343 opera10_10: null,
1344 opera10_50: false,
1345 opera12_10: true,
1346 konq43: null,
1347 besen: null,
1348 rhino: null,
1349 ejs: null,
1350 android40: null,
1351 },
1352 },
1353 {
1354 name: 'Zero-width chars in identifiers',
1355 exec: function () {/*
1356 var _\u200c\u200d = true;
1357 return _\u200c\u200d;
1358 */},
1359 res: {
1360 ie9: true,
1361 firefox2: false,
1362 firefox3_5: false,
1363 firefox8: true,
1364 firefox21: true,
1365 safari6: true,
1366 safaritp: true,
1367 webkit: true,
1368 chrome19: true,
1369 chrome23: true,
1370 opera10_10: false,
1371 opera12_10: true,
1372 konq43: false,
1373 konq49: false,
1374 konq413: false,
1375 besen: true,
1376 rhino: true,
1377 ejs: true,
1378 android41: true,
1379 }
1380 },
1381 {
1382 name: 'Unreserved words',
1383 exec: function () {/*
1384 var abstract, boolean, byte, char, double, final, float, goto, int, long,
1385 native, short, synchronized, transient, volatile;
1386 return true;
1387 */},
1388 res: {
1389 ie7: null,
1390 ie9: true,
1391 firefox2: true,
1392 safari3: null,
1393 safari4: true,
1394 safaritp: true,
1395 webkit: true,
1396 chrome5: false,
1397 chrome13: true,
1398 opera10_10: null,
1399 opera10_50: true,
1400 konq43: null,
1401 besen: null,
1402 rhino: null,
1403 ejs: null,
1404 android40: null,
1405 }
1406 },
1407 {
1408 name: 'Enumerable properties can be shadowed by non-enumerables',
1409 exec: function () {/*
1410 var result = true;
1411 Object.prototype.length = 42;
1412 for (var i in Function) {
1413 if (i == 'length') {
1414 result = false;
1415 }
1416 }
1417 delete Object.prototype.length;
1418 return result;
1419 */},
1420 res: {
1421 ie7: null,
1422 ie9: false,
1423 edge13: true,
1424 firefox2: true,
1425 safari3: false,
1426 chrome5: false,
1427 chrome13: false,
1428 chrome54: true,
1429 opera10_10: null,
1430 opera10_50: true,
1431 konq43: null,
1432 besen: null,
1433 rhino: null,
1434 ejs: null,
1435 android40: null,
1436 }
1437 },
1438 {
1439 name: 'Thrown functions have proper "this" values',
1440 exec: function () {/*
1441 try {
1442 throw function() { return !('a' in this); };
1443 }
1444 catch(e) {
1445 var a = true;
1446 return e();
1447 }
1448 */},
1449 res: {
1450 ie7: null,
1451 ie9: true,
1452 firefox2: true,
1453 safari3: null,
1454 safari4: true,
1455 safaritp: true,
1456 webkit: true,
1457 chrome5: true,
1458 opera10_10: null,
1459 opera10_50: true,
1460 konq43: null,
1461 besen: null,
1462 rhino: null,
1463 ejs: null,
1464 android40: null,
1465 },
1466 }]
1467},
1468{
1469 name: 'Strict mode',
1470 significance: 'large',
1471 subtests: [
1472 {
1473 name: 'reserved words',
1474 exec: function() {/*
1475 'use strict';
1476 var words = 'implements,interface,let,package,private,protected,public,static,yield'.split(',');
1477 for (var i = 0; i < 9; i+=1) {
1478 try { eval('var ' + words[i]); return false; } catch (err) { if (!(err instanceof SyntaxError)) return false; }
1479 }
1480 return true;
1481 */},
1482 res: (temp.strict = {
1483 ie10: true,
1484 firefox4: true,
1485 safari51: true,
1486 safaritp: true,
1487 webkit: true,
1488 chrome13: true,
1489 opera12: true,
1490 besen: true,
1491 phantom: true,
1492 ejs: true,
1493 ios78: true,
1494 android41: true,
1495 }),
1496 },
1497 {
1498 name: '"this" is undefined in functions',
1499 exec: function() {/*
1500 'use strict';
1501 return this === undefined && (function(){ return this === undefined; }).call();
1502 */},
1503 res: Object.assign({}, temp.strict, {
1504 ie10: {
1505 val: true,
1506 note_id: 'strict-mode-ie10',
1507 note_html: 'IE10 PP2 fails this test.</code>'
1508 }
1509 }),
1510 },
1511 {
1512 name: '"this" is not coerced to object in primitive methods',
1513 exec: function() {/*
1514 'use strict';
1515 return (function(){ return typeof this === 'string' }).call('')
1516 && (function(){ return typeof this === 'number' }).call(1)
1517 && (function(){ return typeof this === 'boolean' }).call(true);
1518 */},
1519 res: temp.strict,
1520 },
1521 {
1522 name: '"this" is not coerced to object in primitive accessors',
1523 exec: function() {/*
1524 'use strict';
1525
1526 function test(Class, instance) {
1527 Object.defineProperty(Class.prototype, 'test', {
1528 get: function () { passed = passed && this === instance; },
1529 set: function () { passed = passed && this === instance; },
1530 configurable: true
1531 });
1532
1533 var passed = true;
1534 instance.test;
1535 instance.test = 42;
1536 return passed;
1537 }
1538
1539 return test(String, '')
1540 && test(Number, 1)
1541 && test(Boolean, true);
1542 */},
1543 res: Object.assign({}, temp.strict, {
1544 firefox4: false,
1545 firefox46: true,
1546 }),
1547 },
1548 {
1549 name: 'legacy octal is a SyntaxError',
1550 exec: function() {/*
1551 'use strict';
1552 try { eval('010'); return false; } catch (err) { if (!(err instanceof SyntaxError)) return false; }
1553 try { eval('"\\010"'); return false; } catch (err) { if (!(err instanceof SyntaxError)) return false; }
1554 return true;
1555 */},
1556 res: temp.strict,
1557 },
1558 {
1559 name: 'assignment to unresolvable identifiers is a ReferenceError',
1560 exec: function() {/*
1561 'use strict';
1562 try { eval('__i_dont_exist = 1'); } catch (err) { return err instanceof ReferenceError; }
1563 */},
1564 res: temp.strict,
1565 },
1566 {
1567 name: 'assignment to eval or arguments is a SyntaxError',
1568 exec: function() {/*
1569 'use strict';
1570 try { eval('eval = 1'); return false; } catch (err) { if (!(err instanceof SyntaxError)) return false; }
1571 try { eval('arguments = 1'); return false; } catch (err) { if (!(err instanceof SyntaxError)) return false; }
1572 try { eval('eval++'); return false; } catch (err) { if (!(err instanceof SyntaxError)) return false; }
1573 try { eval('arguments++'); return false; } catch (err) { if (!(err instanceof SyntaxError)) return false; }
1574 return true;
1575 */},
1576 res: temp.strict,
1577 },
1578 {
1579 name: 'assignment to non-writable properties is a TypeError',
1580 exec: function() {/*
1581 'use strict';
1582 try { Object.defineProperty({},"x",{ writable: false }).x = 1; return false; } catch (err) { if (!(err instanceof TypeError)) return false; }
1583 try { Object.preventExtensions({}).x = 1; return false; } catch (err) { if (!(err instanceof TypeError)) return false; }
1584 try { ({ get x(){ } }).x = 1; return false; } catch (err) { if (!(err instanceof TypeError)) return false; }
1585 try { (function f() { f = 123; })(); return false; } catch (err) { if (!(err instanceof TypeError)) return false; }
1586 return true;
1587 */},
1588 res: temp.strict,
1589 },
1590 {
1591 name: 'eval or arguments bindings is a SyntaxError',
1592 exec: function() {/*
1593 'use strict';
1594 try { eval('var eval'); return false; } catch (err) { if (!(err instanceof SyntaxError)) return false; }
1595 try { eval('var arguments'); return false; } catch (err) { if (!(err instanceof SyntaxError)) return false; }
1596 try { eval('(function(eval){})'); return false; } catch (err) { if (!(err instanceof SyntaxError)) return false; }
1597 try { eval('(function(arguments){})'); return false; } catch (err) { if (!(err instanceof SyntaxError)) return false; }
1598 try { eval('try{}catch(eval){}'); return false; } catch (err) { if (!(err instanceof SyntaxError)) return false; }
1599 try { eval('try{}catch(arguments){}'); return false; } catch (err) { if (!(err instanceof SyntaxError)) return false; }
1600 return true;
1601 */},
1602 res: temp.strict,
1603 },
1604 {
1605 name: 'arguments.caller and arguments.callee is a TypeError',
1606 exec: function() {/*
1607 'use strict';
1608 try { arguments.caller; return false; } catch (err) { if (!(err instanceof TypeError)) return false; }
1609 try { arguments.callee; return false; } catch (err) { if (!(err instanceof TypeError)) return false; }
1610 return true;
1611 */},
1612 res: temp.strict,
1613 },
1614 {
1615 name: '(function(){}).caller and (function(){}).arguments is a TypeError',
1616 exec: function() {/*
1617 'use strict';
1618 try { (function(){}).caller; return false; } catch (err) { if (!(err instanceof TypeError)) return false; }
1619 try { (function(){}).arguments; return false; } catch (err) { if (!(err instanceof TypeError)) return false; }
1620 return true;
1621 */},
1622 res: temp.strict,
1623 },
1624 {
1625 name: 'arguments is unmapped',
1626 exec: function() {/*
1627 'use strict';
1628 return (function(x){
1629 x = 2;
1630 return arguments[0] === 1;
1631 })(1) && (function(x){
1632 arguments[0] = 2;
1633 return x === 1;
1634 })(1);
1635 */},
1636 res: temp.strict,
1637 },
1638 {
1639 name: 'eval() can\'t create bindings',
1640 exec: function() {/*
1641 'use strict';
1642 try { eval('var __some_unique_variable;'); __some_unique_variable; } catch (err) { return err instanceof ReferenceError; }
1643 */},
1644 res: temp.strict,
1645 },
1646 {
1647 name: 'deleting bindings is a SyntaxError',
1648 exec: function() {/*
1649 'use strict';
1650 try { eval('var x; delete x;'); } catch (err) { return err instanceof SyntaxError; }
1651 */},
1652 res: temp.strict,
1653 },
1654 {
1655 name: 'deleting non-configurable properties is a TypeError',
1656 exec: function() {/*
1657 'use strict';
1658 try { delete Object.prototype; } catch (err) { return err instanceof TypeError; }
1659 */},
1660 res: temp.strict,
1661 },
1662 {
1663 name: '"with" is a SyntaxError',
1664 exec: function() {/*
1665 'use strict';
1666 try { eval('with({}){}'); } catch (err) { return err instanceof SyntaxError; }
1667 */},
1668 res: temp.strict,
1669 },
1670 {
1671 name: 'repeated parameter names is a SyntaxError',
1672 exec: function() {/*
1673 'use strict';
1674 try { eval('function f(x, x) { }'); } catch (err) { return err instanceof SyntaxError; }
1675 */},
1676 res: temp.strict,
1677 },
1678 {
1679 name: 'function expressions with matching name and argument are valid',
1680 exec: function() {/*
1681 var foo = function bar(bar) {'use strict'};
1682 return typeof foo === 'function';
1683 */},
1684 res: {
1685 ie10: true,
1686 firefox2: true,
1687 safari51: false,
1688 safari10: true,
1689 safaritp: true,
1690 webkit: true,
1691 chrome13: true,
1692 opera12: true,
1693 besen: true,
1694 phantom: true,
1695 ejs: true,
1696 ios78: true,
1697 android41: true,
1698 }
1699 }]
1700}
1701];