diff --git a/resource/bluebird.js b/resource/bluebird.js index 8a1e37990..e59988d1e 100644 --- a/resource/bluebird.js +++ b/resource/bluebird.js @@ -23,25 +23,25 @@ * */ /** - * bluebird build version 3.1.1 + * bluebird build version 3.3.5 * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each */ !function(e){ // - // Added by Zotero - // - EXPORTED_SYMBOLS = ["Promise"]; - - // Set BackstagePass (which contains .Error, etc.) as global object - self = this; - + // Added by Zotero + // + EXPORTED_SYMBOLS = ["Promise"]; + + // Set BackstagePass (which contains .Error, etc.) as global object + self = this; + // We need to maintain references to running nsITimers. Otherwise, they can // get garbage collected before they fire. Also, we might need to cancel them. - var _runningTimers = {}; - - // Provide an implementation of setTimeout - self.setTimeout = function (func, ms) { - var id = Math.floor(Math.random() * (1000000000000 - 1)) + 1 + var _runningTimers = {}; + + // Provide an implementation of setTimeout + self.setTimeout = function (func, ms) { + var id = Math.floor(Math.random() * (1000000000000 - 1)) + 1 var useMethodjit = Components.utils.methodjit; var timer = Components.classes["@mozilla.org/timer;1"] .createInstance(Components.interfaces.nsITimer); @@ -75,41 +75,40 @@ }}, ms, Components.interfaces.nsITimer.TYPE_ONE_SHOT); _runningTimers[id] = timer; return id; - }; - self.clearTimeout = function (id) { - var timer = _runningTimers[id]; - if (timer) { - timer.cancel(); - } - delete _runningTimers[id]; - } - - self.debug = function (msg) { - dump(msg + "\n\n"); - }; - - Promise = e(); - Promise.config({ + }; + self.clearTimeout = function (id) { + var timer = _runningTimers[id]; + if (timer) { + timer.cancel(); + } + delete _runningTimers[id]; + } + + self.debug = function (msg) { + dump(msg + "\n\n"); + }; + + Promise = e(); + Promise.config({ warnings: true, - longStackTraces: true, - cancellation: true - }); - // TEMP: Only turn on if debug logging enabled? - Promise.onPossiblyUnhandledRejection(function (e, promise) { + longStackTraces: true, + cancellation: true + }); + // TEMP: Only turn on if debug logging enabled? + Promise.onPossiblyUnhandledRejection(function (e, promise) { if (e.name == 'ZoteroPromiseInterrupt') { return; } - + // Ignore some errors during tests if (e.message && e.message.indexOf(' -- ignore') != -1) return; - self.debug('Possibly unhandled rejection:\n\n' + e.message); - throw e; - }); - return; - - - /*if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Promise=e()}*/}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o 1 ? !!Object(arguments[1]).multiArgs : false; var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs)); @@ -2842,9 +2918,7 @@ Promise.setScheduler = function(fn) { if (typeof fn !== "function") { throw new TypeError("expecting a function but got " + util.classString(fn)); } - var prev = async._schedule; - async._schedule = fn; - return prev; + return async.setScheduler(fn); }; Promise.prototype._then = function ( @@ -2869,6 +2943,7 @@ Promise.prototype._then = function ( receiver = target === this ? undefined : this._boundTo; } } + this._fireEvent("promiseChained", this, promise); } var domain = getDomain(); @@ -2921,14 +2996,17 @@ Promise.prototype._setLength = function (len) { Promise.prototype._setFulfilled = function () { this._bitField = this._bitField | 33554432; + this._fireEvent("promiseFulfilled", this); }; Promise.prototype._setRejected = function () { this._bitField = this._bitField | 16777216; + this._fireEvent("promiseRejected", this); }; Promise.prototype._setFollowing = function () { this._bitField = this._bitField | 67108864; + this._fireEvent("promiseResolved", this); }; Promise.prototype._setIsFinal = function () { @@ -2945,9 +3023,11 @@ Promise.prototype._unsetCancelled = function() { Promise.prototype._setCancelled = function() { this._bitField = this._bitField | 65536; + this._fireEvent("promiseCancelled", this); }; Promise.prototype._setAsyncGuaranteed = function() { + if (async.hasCustomScheduler()) return; this._bitField = this._bitField | 134217728; }; @@ -3054,6 +3134,12 @@ Promise.prototype._resolveCallback = function(value, shouldBind) { if (shouldBind) this._propagateFrom(maybePromise, 2); var promise = maybePromise._target(); + + if (promise === this) { + this._reject(makeSelfResolutionError()); + return; + } + var bitField = promise._bitField; if (((bitField & 50397184) === 0)) { var len = this._length(); @@ -3130,9 +3216,8 @@ Promise.prototype._settlePromiseFromHandler = function ( if (x === NEXT_FILTER) { promise._reject(value); - } else if (x === errorObj || x === promise) { - var err = x === promise ? makeSelfResolutionError() : x.e; - promise._rejectCallback(err, false); + } else if (x === errorObj) { + promise._rejectCallback(x.e, false); } else { debug.checkForgottenReturns(x, promiseCreated, "", promise, this); promise._resolveCallback(x); @@ -3160,7 +3245,8 @@ Promise.prototype._settlePromise = function(promise, handler, receiver, value) { if (((bitField & 65536) !== 0)) { if (isPromise) promise._invokeInternalOnCancel(); - if (handler === finallyHandler) { + if (receiver instanceof PassThroughHandlerContext && + receiver.isFinallyHandler()) { receiver.cancelPromise = promise; if (tryCatch(handler).call(receiver, value) === errorObj) { promise._reject(errorObj.e); @@ -3266,11 +3352,7 @@ Promise.prototype._reject = function (reason) { } if ((bitField & 65535) > 0) { - if (((bitField & 134217728) !== 0)) { - this._settlePromises(); - } else { - async.settlePromises(this); - } + async.settlePromises(this); } else { this._ensurePossibleRejectionHandled(); } @@ -3351,20 +3433,20 @@ _dereq_("./join")( Promise, PromiseArray, tryConvertToPromise, INTERNAL, debug); Promise.Promise = Promise; _dereq_('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); +_dereq_('./call_get.js')(Promise); _dereq_('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug); -_dereq_('./timers.js')(Promise, INTERNAL); +_dereq_('./timers.js')(Promise, INTERNAL, debug); _dereq_('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug); _dereq_('./nodeify.js')(Promise); -_dereq_('./call_get.js')(Promise); +_dereq_('./promisify.js')(Promise, INTERNAL); _dereq_('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection); _dereq_('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection); _dereq_('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); _dereq_('./settle.js')(Promise, PromiseArray, debug); _dereq_('./some.js')(Promise, PromiseArray, apiRejection); -_dereq_('./promisify.js')(Promise, INTERNAL); -_dereq_('./any.js')(Promise); -_dereq_('./each.js')(Promise, INTERNAL); _dereq_('./filter.js')(Promise, INTERNAL); +_dereq_('./each.js')(Promise, INTERNAL); +_dereq_('./any.js')(Promise); util.toFastProperties(Promise); util.toFastProperties(Promise.prototype); @@ -4326,12 +4408,18 @@ var schedule; var noAsyncScheduler = function() { throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a"); }; +var NativePromise = util.getNativePromise(); if (util.isNode && typeof MutationObserver === "undefined") { var GlobalSetImmediate = global.setImmediate; var ProcessNextTick = process.nextTick; schedule = util.isRecentNode ? function(fn) { GlobalSetImmediate.call(global, fn); } : function(fn) { ProcessNextTick.call(process, fn); }; +} else if (typeof NativePromise === "function") { + var nativePromise = NativePromise.resolve(); + schedule = function(fn) { + nativePromise.then(fn); + }; } else if ((typeof MutationObserver !== "undefined") && !(typeof window !== "undefined" && window.navigator && @@ -4343,23 +4431,23 @@ if (util.isNode && typeof MutationObserver === "undefined") { var div2 = document.createElement("div"); var o2 = new MutationObserver(function() { div.classList.toggle("foo"); - toggleScheduled = false; + toggleScheduled = false; }); o2.observe(div2, opts); var scheduleToggle = function() { if (toggleScheduled) return; - toggleScheduled = true; - div2.classList.toggle("foo"); - }; + toggleScheduled = true; + div2.classList.toggle("foo"); + }; - return function schedule(fn) { - var o = new MutationObserver(function() { - o.disconnect(); - fn(); - }); - o.observe(div, opts); - scheduleToggle(); + return function schedule(fn) { + var o = new MutationObserver(function() { + o.disconnect(); + fn(); + }); + o.observe(div, opts); + scheduleToggle(); }; })(); } else if (typeof setImmediate !== "undefined") { @@ -4754,12 +4842,44 @@ return tryConvertToPromise; },{"./util":36}],34:[function(_dereq_,module,exports){ "use strict"; -module.exports = function(Promise, INTERNAL) { +module.exports = function(Promise, INTERNAL, debug) { var util = _dereq_("./util"); var TimeoutError = Promise.TimeoutError; +function HandleWrapper(handle) { + this.handle = handle; +} + +HandleWrapper.prototype._resultCancelled = function() { + clearTimeout(this.handle); +}; + +var afterValue = function(value) { return delay(+this).thenReturn(value); }; +var delay = Promise.delay = function (ms, value) { + var ret; + var handle; + if (value !== undefined) { + ret = Promise.resolve(value) + ._then(afterValue, null, null, ms, undefined); + if (debug.cancellation() && value instanceof Promise) { + ret._setOnCancel(value); + } + } else { + ret = new Promise(INTERNAL); + handle = setTimeout(function() { ret._fulfill(); }, +ms); + if (debug.cancellation()) { + ret._setOnCancel(new HandleWrapper(handle)); + } + } + ret._setAsyncGuaranteed(); + return ret; +}; + +Promise.prototype.delay = function (ms) { + return delay(ms, this); +}; + var afterTimeout = function (promise, message, parent) { - if (!promise.isPending()) return; var err; if (typeof message !== "string") { if (message instanceof Error) { @@ -4773,49 +4893,43 @@ var afterTimeout = function (promise, message, parent) { util.markAsOriginatingFromRejection(err); promise._attachExtraTrace(err); promise._reject(err); - parent.cancel(); -}; -var afterValue = function(value) { return delay(+this).thenReturn(value); }; -var delay = Promise.delay = function (ms, value) { - var ret; - if (value !== undefined) { - ret = Promise.resolve(value) - ._then(afterValue, null, null, ms, undefined); - } else { - ret = new Promise(INTERNAL); - setTimeout(function() { ret._fulfill(); }, +ms); + if (parent != null) { + parent.cancel(); } - ret._setAsyncGuaranteed(); - return ret; -}; - -Promise.prototype.delay = function (ms) { - return delay(ms, this); }; function successClear(value) { - var handle = this; - if (handle instanceof Number) handle = +handle; - clearTimeout(handle); + clearTimeout(this.handle); return value; } function failureClear(reason) { - var handle = this; - if (handle instanceof Number) handle = +handle; - clearTimeout(handle); + clearTimeout(this.handle); throw reason; } Promise.prototype.timeout = function (ms, message) { ms = +ms; - var parent = this.then(); - var ret = parent.then(); - var handle = setTimeout(function timeoutTimeout() { - afterTimeout(ret, message, parent); - }, ms); - return ret._then(successClear, failureClear, undefined, handle, undefined); + var ret, parent; + + var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() { + if (ret.isPending()) { + afterTimeout(ret, message, parent); + } + }, ms)); + + if (debug.cancellation()) { + parent = this.then(); + ret = parent._then(successClear, failureClear, + undefined, handleWrapper, undefined); + ret._setOnCancel(handleWrapper); + } else { + ret = this._then(successClear, failureClear, + undefined, handleWrapper, undefined); + } + + return ret; }; }; @@ -5054,6 +5168,11 @@ var canEvaluate = typeof navigator == "undefined"; var errorObj = {e: {}}; var tryCatchTarget; +var globalObject = typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : + typeof global !== "undefined" ? global : + this !== undefined ? this : null; + function tryCatcher() { try { var target = tryCatchTarget; @@ -5267,6 +5386,13 @@ function safeToString(obj) { } } +function isError(obj) { + return obj !== null && + typeof obj === "object" && + typeof obj.message === "string" && + typeof obj.name === "string"; +} + function markAsOriginatingFromRejection(e) { try { notEnumerableProp(e, "isOperational", true); @@ -5281,7 +5407,7 @@ function originatesFromRejection(e) { } function canAttachTrace(obj) { - return obj instanceof Error && es5.propertyIsWritable(obj, "stack"); + return isError(obj) && es5.propertyIsWritable(obj, "stack"); } var ensureErrorObject = (function() { @@ -5352,6 +5478,17 @@ function env(key, def) { return isNode ? process.env[key] : def; } +function getNativePromise() { + if (typeof Promise === "function") { + try { + var promise = new Promise(function(){}); + if ({}.toString.call(promise) === "[object Promise]") { + return Promise; + } + } catch (e) {} + } +} + var ret = { isClass: isClass, isIdentifier: isIdentifier, @@ -5363,6 +5500,7 @@ var ret = { notEnumerableProp: notEnumerableProp, isPrimitive: isPrimitive, isObject: isObject, + isError: isError, canEvaluate: canEvaluate, errorObj: errorObj, tryCatch: tryCatch, @@ -5381,7 +5519,9 @@ var ret = { hasDevTools: typeof chrome !== "undefined" && chrome && typeof chrome.loadTimes === "function", isNode: isNode, - env: env + env: env, + global: globalObject, + getNativePromise: getNativePromise }; ret.isRecentNode = ret.isNode && (function() { var version = process.versions.node.split(".").map(Number);