From 0345ae603144f5512c8d367ea6f744ee43ad88cd Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tim=20D=C3=BCsterhus?= Date: Sun, 9 Dec 2018 21:51:17 +0100 Subject: [PATCH] Upgrade to promise-polyfill 8.1.0 This is required to get Promise.finally. --- .../js/3rdParty/polyfill/promise.LICENSE | 20 + .../files/js/3rdParty/polyfill/promise.js | 423 ++++++++++-------- .../files/js/3rdParty/polyfill/promise.min.js | 2 +- 3 files changed, 259 insertions(+), 186 deletions(-) create mode 100644 wcfsetup/install/files/js/3rdParty/polyfill/promise.LICENSE diff --git a/wcfsetup/install/files/js/3rdParty/polyfill/promise.LICENSE b/wcfsetup/install/files/js/3rdParty/polyfill/promise.LICENSE new file mode 100644 index 0000000000..94b9dac3f5 --- /dev/null +++ b/wcfsetup/install/files/js/3rdParty/polyfill/promise.LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2014 Taylor Hakes +Copyright (c) 2014 Forbes Lindesay + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/wcfsetup/install/files/js/3rdParty/polyfill/promise.js b/wcfsetup/install/files/js/3rdParty/polyfill/promise.js index cf0c81d61d..3ea228343b 100644 --- a/wcfsetup/install/files/js/3rdParty/polyfill/promise.js +++ b/wcfsetup/install/files/js/3rdParty/polyfill/promise.js @@ -1,233 +1,286 @@ -(function (root) { - - // Store setTimeout reference so promise-polyfill will be unaffected by - // other code modifying setTimeout (like sinon.useFakeTimers()) - var setTimeoutFunc = setTimeout; - - function noop() {} - - // Polyfill for Function.prototype.bind - function bind(fn, thisArg) { - return function () { - fn.apply(thisArg, arguments); - }; - } +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory() : + typeof define === 'function' && define.amd ? define(factory) : + (factory()); +}(this, (function () { 'use strict'; - function Promise(fn) { - if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); - if (typeof fn !== 'function') throw new TypeError('not a function'); - this._state = 0; - this._handled = false; - this._value = undefined; - this._deferreds = []; +/** + * @this {Promise} + */ +function finallyConstructor(callback) { + var constructor = this.constructor; + return this.then( + function(value) { + return constructor.resolve(callback()).then(function() { + return value; + }); + }, + function(reason) { + return constructor.resolve(callback()).then(function() { + return constructor.reject(reason); + }); + } + ); +} - doResolve(fn, this); - } +// Store setTimeout reference so promise-polyfill will be unaffected by +// other code modifying setTimeout (like sinon.useFakeTimers()) +var setTimeoutFunc = setTimeout; + +function noop() {} + +// Polyfill for Function.prototype.bind +function bind(fn, thisArg) { + return function() { + fn.apply(thisArg, arguments); + }; +} + +/** + * @constructor + * @param {Function} fn + */ +function Promise(fn) { + if (!(this instanceof Promise)) + throw new TypeError('Promises must be constructed via new'); + if (typeof fn !== 'function') throw new TypeError('not a function'); + /** @type {!number} */ + this._state = 0; + /** @type {!boolean} */ + this._handled = false; + /** @type {Promise|undefined} */ + this._value = undefined; + /** @type {!Array} */ + this._deferreds = []; - function handle(self, deferred) { - while (self._state === 3) { - self = self._value; + doResolve(fn, this); +} + +function handle(self, deferred) { + while (self._state === 3) { + self = self._value; + } + if (self._state === 0) { + self._deferreds.push(deferred); + return; + } + self._handled = true; + Promise._immediateFn(function() { + var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; + if (cb === null) { + (self._state === 1 ? resolve : reject)(deferred.promise, self._value); + return; } - if (self._state === 0) { - self._deferreds.push(deferred); + var ret; + try { + ret = cb(self._value); + } catch (e) { + reject(deferred.promise, e); return; } - self._handled = true; - Promise._immediateFn(function () { - var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; - if (cb === null) { - (self._state === 1 ? resolve : reject)(deferred.promise, self._value); + resolve(deferred.promise, ret); + }); +} + +function resolve(self, newValue) { + try { + // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure + if (newValue === self) + throw new TypeError('A promise cannot be resolved with itself.'); + if ( + newValue && + (typeof newValue === 'object' || typeof newValue === 'function') + ) { + var then = newValue.then; + if (newValue instanceof Promise) { + self._state = 3; + self._value = newValue; + finale(self); return; - } - var ret; - try { - ret = cb(self._value); - } catch (e) { - reject(deferred.promise, e); + } else if (typeof then === 'function') { + doResolve(bind(then, newValue), self); return; } - resolve(deferred.promise, ret); - }); - } - - function resolve(self, newValue) { - try { - // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure - if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.'); - if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { - var then = newValue.then; - if (newValue instanceof Promise) { - self._state = 3; - self._value = newValue; - finale(self); - return; - } else if (typeof then === 'function') { - doResolve(bind(then, newValue), self); - return; - } - } - self._state = 1; - self._value = newValue; - finale(self); - } catch (e) { - reject(self, e); } - } - - function reject(self, newValue) { - self._state = 2; + self._state = 1; self._value = newValue; finale(self); + } catch (e) { + reject(self, e); } +} - function finale(self) { - if (self._state === 2 && self._deferreds.length === 0) { - Promise._immediateFn(function() { - if (!self._handled) { - Promise._unhandledRejectionFn(self._value); - } - }); - } +function reject(self, newValue) { + self._state = 2; + self._value = newValue; + finale(self); +} - for (var i = 0, len = self._deferreds.length; i < len; i++) { - handle(self, self._deferreds[i]); - } - self._deferreds = null; +function finale(self) { + if (self._state === 2 && self._deferreds.length === 0) { + Promise._immediateFn(function() { + if (!self._handled) { + Promise._unhandledRejectionFn(self._value); + } + }); } - function Handler(onFulfilled, onRejected, promise) { - this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; - this.onRejected = typeof onRejected === 'function' ? onRejected : null; - this.promise = promise; + for (var i = 0, len = self._deferreds.length; i < len; i++) { + handle(self, self._deferreds[i]); } + self._deferreds = null; +} - /** - * Take a potentially misbehaving resolver function and make sure - * onFulfilled and onRejected are only called once. - * - * Makes no guarantees about asynchrony. - */ - function doResolve(fn, self) { - var done = false; - try { - fn(function (value) { +/** + * @constructor + */ +function Handler(onFulfilled, onRejected, promise) { + this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; + this.onRejected = typeof onRejected === 'function' ? onRejected : null; + this.promise = promise; +} + +/** + * Take a potentially misbehaving resolver function and make sure + * onFulfilled and onRejected are only called once. + * + * Makes no guarantees about asynchrony. + */ +function doResolve(fn, self) { + var done = false; + try { + fn( + function(value) { if (done) return; done = true; resolve(self, value); - }, function (reason) { + }, + function(reason) { if (done) return; done = true; reject(self, reason); - }); - } catch (ex) { - if (done) return; - done = true; - reject(self, ex); - } + } + ); + } catch (ex) { + if (done) return; + done = true; + reject(self, ex); } +} - Promise.prototype['catch'] = function (onRejected) { - return this.then(null, onRejected); - }; +Promise.prototype['catch'] = function(onRejected) { + return this.then(null, onRejected); +}; - Promise.prototype.then = function (onFulfilled, onRejected) { - var prom = new (this.constructor)(noop); +Promise.prototype.then = function(onFulfilled, onRejected) { + // @ts-ignore + var prom = new this.constructor(noop); - handle(this, new Handler(onFulfilled, onRejected, prom)); - return prom; - }; + handle(this, new Handler(onFulfilled, onRejected, prom)); + return prom; +}; - Promise.all = function (arr) { - var args = Array.prototype.slice.call(arr); +Promise.prototype['finally'] = finallyConstructor; - return new Promise(function (resolve, reject) { - if (args.length === 0) return resolve([]); - var remaining = args.length; +Promise.all = function(arr) { + return new Promise(function(resolve, reject) { + if (!arr || typeof arr.length === 'undefined') + throw new TypeError('Promise.all accepts an array'); + var args = Array.prototype.slice.call(arr); + if (args.length === 0) return resolve([]); + var remaining = args.length; - function res(i, val) { - try { - if (val && (typeof val === 'object' || typeof val === 'function')) { - var then = val.then; - if (typeof then === 'function') { - then.call(val, function (val) { + function res(i, val) { + try { + if (val && (typeof val === 'object' || typeof val === 'function')) { + var then = val.then; + if (typeof then === 'function') { + then.call( + val, + function(val) { res(i, val); - }, reject); - return; - } - } - args[i] = val; - if (--remaining === 0) { - resolve(args); + }, + reject + ); + return; } - } catch (ex) { - reject(ex); } + args[i] = val; + if (--remaining === 0) { + resolve(args); + } + } catch (ex) { + reject(ex); } - - for (var i = 0; i < args.length; i++) { - res(i, args[i]); - } - }); - }; - - Promise.resolve = function (value) { - if (value && typeof value === 'object' && value.constructor === Promise) { - return value; } - return new Promise(function (resolve) { - resolve(value); - }); - }; + for (var i = 0; i < args.length; i++) { + res(i, args[i]); + } + }); +}; - Promise.reject = function (value) { - return new Promise(function (resolve, reject) { - reject(value); - }); - }; +Promise.resolve = function(value) { + if (value && typeof value === 'object' && value.constructor === Promise) { + return value; + } - Promise.race = function (values) { - return new Promise(function (resolve, reject) { - for (var i = 0, len = values.length; i < len; i++) { - values[i].then(resolve, reject); - } - }); - }; + return new Promise(function(resolve) { + resolve(value); + }); +}; - // Use polyfill for setImmediate for performance gains - Promise._immediateFn = (typeof setImmediate === 'function' && function (fn) { setImmediate(fn); }) || - function (fn) { - setTimeoutFunc(fn, 0); - }; +Promise.reject = function(value) { + return new Promise(function(resolve, reject) { + reject(value); + }); +}; - Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) { - if (typeof console !== 'undefined' && console) { - console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console +Promise.race = function(values) { + return new Promise(function(resolve, reject) { + for (var i = 0, len = values.length; i < len; i++) { + values[i].then(resolve, reject); } - }; + }); +}; - /** - * Set the immediate function to execute callbacks - * @param fn {function} Function to execute - * @deprecated - */ - Promise._setImmediateFn = function _setImmediateFn(fn) { - Promise._immediateFn = fn; +// Use polyfill for setImmediate for performance gains +Promise._immediateFn = + (typeof setImmediate === 'function' && + function(fn) { + setImmediate(fn); + }) || + function(fn) { + setTimeoutFunc(fn, 0); }; - /** - * Change the function to execute on unhandled rejection - * @param {function} fn Function to execute on unhandled rejection - * @deprecated - */ - Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) { - Promise._unhandledRejectionFn = fn; - }; - - if (typeof module !== 'undefined' && module.exports) { - module.exports = Promise; - } else if (!root.Promise) { - root.Promise = Promise; +Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) { + if (typeof console !== 'undefined' && console) { + console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console + } +}; + +/** @suppress {undefinedVars} */ +var globalNS = (function() { + // the only reliable means to get the global object is + // `Function('return this')()` + // However, this causes CSP violations in Chrome apps. + if (typeof self !== 'undefined') { + return self; + } + if (typeof window !== 'undefined') { + return window; } + if (typeof global !== 'undefined') { + return global; + } + throw new Error('unable to locate global object'); +})(); + +if (!('Promise' in globalNS)) { + globalNS['Promise'] = Promise; +} else if (!globalNS.Promise.prototype['finally']) { + globalNS.Promise.prototype['finally'] = finallyConstructor; +} -})(this); +}))); diff --git a/wcfsetup/install/files/js/3rdParty/polyfill/promise.min.js b/wcfsetup/install/files/js/3rdParty/polyfill/promise.min.js index 2208402a92..ec85c98d10 100644 --- a/wcfsetup/install/files/js/3rdParty/polyfill/promise.min.js +++ b/wcfsetup/install/files/js/3rdParty/polyfill/promise.min.js @@ -1 +1 @@ -!function(e){function n(){}function t(e,n){return function(){e.apply(n,arguments)}}function o(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],s(e,this)}function i(e,n){for(;3===e._state;)e=e._value;return 0===e._state?void e._deferreds.push(n):(e._handled=!0,void o._immediateFn(function(){var t=1===e._state?n.onFulfilled:n.onRejected;if(null===t)return void(1===e._state?r:u)(n.promise,e._value);var o;try{o=t(e._value)}catch(i){return void u(n.promise,i)}r(n.promise,o)}))}function r(e,n){try{if(n===e)throw new TypeError("A promise cannot be resolved with itself.");if(n&&("object"==typeof n||"function"==typeof n)){var i=n.then;if(n instanceof o)return e._state=3,e._value=n,void f(e);if("function"==typeof i)return void s(t(i,n),e)}e._state=1,e._value=n,f(e)}catch(r){u(e,r)}}function u(e,n){e._state=2,e._value=n,f(e)}function f(e){2===e._state&&0===e._deferreds.length&&o._immediateFn(function(){e._handled||o._unhandledRejectionFn(e._value)});for(var n=0,t=e._deferreds.length;n