From e00a16fa74e759fbd6fe0f3945019720379f6eef Mon Sep 17 00:00:00 2001 From: SheetJS Date: Wed, 22 Mar 2017 13:55:32 -0400 Subject: [PATCH] update shim atob/btoa --- shim.js | 118 +++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 92 insertions(+), 26 deletions(-) diff --git a/shim.js b/shim.js index 1de5e15..b674683 100644 --- a/shim.js +++ b/shim.js @@ -13,16 +13,16 @@ if (!Object.keys) { 'constructor' ], dontEnumsLength = dontEnums.length; - + return function (obj) { if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object'); - + var result = []; - + for (var prop in obj) { if (hasOwnProperty.call(obj, prop)) result.push(prop); } - + if (hasDontEnumBug) { for (var i=0; i < dontEnumsLength; i++) { if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]); @@ -39,15 +39,15 @@ if (!Array.prototype.filter) Array.prototype.filter = function(fun /*, thisp */) { "use strict"; - + if (this == null) throw new TypeError(); - + var t = Object(this); var len = t.length >>> 0; if (typeof fun != "function") throw new TypeError(); - + var res = []; var thisp = arguments[1]; for (var i = 0; i < len; i++) @@ -59,7 +59,7 @@ if (!Array.prototype.filter) res.push(val); } } - + return res; }; } @@ -99,74 +99,74 @@ if (!Array.prototype.forEach) // Reference: http://es5.github.com/#x15.4.4.19 if (!Array.prototype.map) { Array.prototype.map = function(callback, thisArg) { - + var T, A, k; - + if (this == null) { throw new TypeError(" this is null or not defined"); } - + // 1. Let O be the result of calling ToObject passing the |this| value as the argument. var O = Object(this); - + // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length". // 3. Let len be ToUint32(lenValue). var len = O.length >>> 0; - + // 4. If IsCallable(callback) is false, throw a TypeError exception. // See: http://es5.github.com/#x9.11 if (typeof callback !== "function") { throw new TypeError(callback + " is not a function"); } - + // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. if (thisArg) { T = thisArg; } - + // 6. Let A be a new array created as if by the expression new Array(len) where Array is // the standard built-in constructor with that name and len is the value of len. A = new Array(len); - + // 7. Let k be 0 k = 0; - + // 8. Repeat, while k < len while(k < len) { - + var kValue, mappedValue; - + // a. Let Pk be ToString(k). // This is implicit for LHS operands of the in operator // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk. // This step can be combined with c // c. If kPresent is true, then if (k in O) { - + // i. Let kValue be the result of calling the Get internal method of O with argument Pk. kValue = O[ k ]; - + // ii. Let mappedValue be the result of calling the Call internal method of callback // with T as the this value and argument list containing kValue, k, and O. mappedValue = callback.call(T, kValue, k, O); - + // iii. Call the DefineOwnProperty internal method of A with arguments // Pk, Property Descriptor {Value: mappedValue, : true, Enumerable: true, Configurable: true}, // and false. - + // In browsers that support Object.defineProperty, use the following: // Object.defineProperty(A, Pk, { value: mappedValue, writable: true, enumerable: true, configurable: true }); - + // For best browser support, use the following: A[ k ] = mappedValue; } // d. Increase k by 1. k++; } - + // 9. return A return A; - }; + }; } // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf @@ -235,3 +235,69 @@ if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) { return target; }; } + +// https://github.com/davidchambers/Base64.js +// (C) 2015 David Chambers +// Base64.js may be freely distributed under the Apache 2.0 License. + +;(function () { + + var object = typeof exports != 'undefined' ? exports : self; // #8: web workers + var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + + function InvalidCharacterError(message) { + this.message = message; + } + InvalidCharacterError.prototype = new Error; + InvalidCharacterError.prototype.name = 'InvalidCharacterError'; + + // encoder + // [https://gist.github.com/999166] by [https://github.com/nignag] + object.btoa || ( + object.btoa = function (input) { + var str = String(input); + for ( + // initialize result and counter + var block, charCode, idx = 0, map = chars, output = ''; + // if the next str index does not exist: + // change the mapping table to "=" + // check if d has no fractional digits + str.charAt(idx | 0) || (map = '=', idx % 1); + // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8 + output += map.charAt(63 & block >> 8 - idx % 1 * 8) + ) { + charCode = str.charCodeAt(idx += 3/4); + if (charCode > 0xFF) { + throw new InvalidCharacterError("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range."); + } + block = block << 8 | charCode; + } + return output; + }); + + // decoder + // [https://gist.github.com/1020396] by [https://github.com/atk] + object.atob || ( + object.atob = function (input) { + var str = String(input).replace(/=+$/, ''); + if (str.length % 4 == 1) { + throw new InvalidCharacterError("'atob' failed: The string to be decoded is not correctly encoded."); + } + for ( + // initialize result and counters + var bc = 0, bs, buffer, idx = 0, output = ''; + // get next character + buffer = str.charAt(idx++); + // character found in table? initialize bit storage and add its ascii value; + ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, + // and if not first of each 4 characters, + // convert the first 8 bits to one ascii character + bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 + ) { + // try to find character in table (0-63, not found => -1) + buffer = chars.indexOf(buffer); + } + return output; + }); + +}());