| 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 );
|
|---|