1 | <?php |
---|
2 | /** |
---|
3 | * Plugin Name: Array.prototype.indexOf() polyfill for LTE IE8 |
---|
4 | * Description: As reported in WordPress Trac #30781, an error is happening in WP4.1.0 for IE8 users due to that browser's incomplete implementation of modern JS methods. |
---|
5 | * Plugin URI: https://core.trac.wordpress.org/ticket/30781 |
---|
6 | * Author: Weston Ruter, XWP |
---|
7 | * Author URI: https://xwp.co/ |
---|
8 | */ |
---|
9 | |
---|
10 | /** |
---|
11 | * Via https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf |
---|
12 | */ |
---|
13 | function array_prototype_indexof_polyfill() { |
---|
14 | ?> |
---|
15 | <script> |
---|
16 | // Production steps of ECMA-262, Edition 5, 15.4.4.14 |
---|
17 | // Reference: http://es5.github.io/#x15.4.4.14 |
---|
18 | if (!Array.prototype.indexOf) { |
---|
19 | Array.prototype.indexOf = function(searchElement, fromIndex) { |
---|
20 | |
---|
21 | var k; |
---|
22 | |
---|
23 | // 1. Let O be the result of calling ToObject passing |
---|
24 | // the this value as the argument. |
---|
25 | if (this == null) { |
---|
26 | throw new TypeError('"this" is null or not defined'); |
---|
27 | } |
---|
28 | |
---|
29 | var O = Object(this); |
---|
30 | |
---|
31 | // 2. Let lenValue be the result of calling the Get |
---|
32 | // internal method of O with the argument "length". |
---|
33 | // 3. Let len be ToUint32(lenValue). |
---|
34 | var len = O.length >>> 0; |
---|
35 | |
---|
36 | // 4. If len is 0, return -1. |
---|
37 | if (len === 0) { |
---|
38 | return -1; |
---|
39 | } |
---|
40 | |
---|
41 | // 5. If argument fromIndex was passed let n be |
---|
42 | // ToInteger(fromIndex); else let n be 0. |
---|
43 | var n = +fromIndex || 0; |
---|
44 | |
---|
45 | if (Math.abs(n) === Infinity) { |
---|
46 | n = 0; |
---|
47 | } |
---|
48 | |
---|
49 | // 6. If n >= len, return -1. |
---|
50 | if (n >= len) { |
---|
51 | return -1; |
---|
52 | } |
---|
53 | |
---|
54 | // 7. If n >= 0, then Let k be n. |
---|
55 | // 8. Else, n<0, Let k be len - abs(n). |
---|
56 | // If k is less than 0, then let k be 0. |
---|
57 | k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); |
---|
58 | |
---|
59 | // 9. Repeat, while k < len |
---|
60 | while (k < len) { |
---|
61 | // a. Let Pk be ToString(k). |
---|
62 | // This is implicit for LHS operands of the in operator |
---|
63 | // b. Let kPresent be the result of calling the |
---|
64 | // HasProperty internal method of O with argument Pk. |
---|
65 | // This step can be combined with c |
---|
66 | // c. If kPresent is true, then |
---|
67 | // i. Let elementK be the result of calling the Get |
---|
68 | // internal method of O with the argument ToString(k). |
---|
69 | // ii. Let same be the result of applying the |
---|
70 | // Strict Equality Comparison Algorithm to |
---|
71 | // searchElement and elementK. |
---|
72 | // iii. If same is true, return k. |
---|
73 | if (k in O && O[k] === searchElement) { |
---|
74 | return k; |
---|
75 | } |
---|
76 | k++; |
---|
77 | } |
---|
78 | return -1; |
---|
79 | }; |
---|
80 | } |
---|
81 | </script> |
---|
82 | <?php |
---|
83 | } |
---|
84 | |
---|
85 | add_action( 'customize_controls_print_scripts', 'array_prototype_indexof_polyfill', 1 ); |
---|