Update Bluebird to 3.3.5

This commit is contained in:
Dan Stillman 2016-04-27 01:50:45 -04:00
parent 2a8cd27b49
commit 1502985d98

View File

@ -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 * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
*/ */
!function(e){ !function(e){
// //
// Added by Zotero // Added by Zotero
// //
EXPORTED_SYMBOLS = ["Promise"]; EXPORTED_SYMBOLS = ["Promise"];
// Set BackstagePass (which contains .Error, etc.) as global object // Set BackstagePass (which contains .Error, etc.) as global object
self = this; self = this;
// We need to maintain references to running nsITimers. Otherwise, they can // We need to maintain references to running nsITimers. Otherwise, they can
// get garbage collected before they fire. Also, we might need to cancel them. // get garbage collected before they fire. Also, we might need to cancel them.
var _runningTimers = {}; var _runningTimers = {};
// Provide an implementation of setTimeout // Provide an implementation of setTimeout
self.setTimeout = function (func, ms) { self.setTimeout = function (func, ms) {
var id = Math.floor(Math.random() * (1000000000000 - 1)) + 1 var id = Math.floor(Math.random() * (1000000000000 - 1)) + 1
var useMethodjit = Components.utils.methodjit; var useMethodjit = Components.utils.methodjit;
var timer = Components.classes["@mozilla.org/timer;1"] var timer = Components.classes["@mozilla.org/timer;1"]
.createInstance(Components.interfaces.nsITimer); .createInstance(Components.interfaces.nsITimer);
@ -75,27 +75,27 @@
}}, ms, Components.interfaces.nsITimer.TYPE_ONE_SHOT); }}, ms, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
_runningTimers[id] = timer; _runningTimers[id] = timer;
return id; return id;
}; };
self.clearTimeout = function (id) { self.clearTimeout = function (id) {
var timer = _runningTimers[id]; var timer = _runningTimers[id];
if (timer) { if (timer) {
timer.cancel(); timer.cancel();
} }
delete _runningTimers[id]; delete _runningTimers[id];
} }
self.debug = function (msg) { self.debug = function (msg) {
dump(msg + "\n\n"); dump(msg + "\n\n");
}; };
Promise = e(); Promise = e();
Promise.config({ Promise.config({
warnings: true, warnings: true,
longStackTraces: true, longStackTraces: true,
cancellation: true cancellation: true
}); });
// TEMP: Only turn on if debug logging enabled? // TEMP: Only turn on if debug logging enabled?
Promise.onPossiblyUnhandledRejection(function (e, promise) { Promise.onPossiblyUnhandledRejection(function (e, promise) {
if (e.name == 'ZoteroPromiseInterrupt') { if (e.name == 'ZoteroPromiseInterrupt') {
return; return;
} }
@ -103,13 +103,12 @@
// Ignore some errors during tests // Ignore some errors during tests
if (e.message && e.message.indexOf(' -- ignore') != -1) return; if (e.message && e.message.indexOf(' -- ignore') != -1) return;
self.debug('Possibly unhandled rejection:\n\n' + e.message); self.debug('Possibly unhandled rejection:\n\n' + e.message);
throw e; throw e;
}); });
return; 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<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
/*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<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
"use strict"; "use strict";
module.exports = function(Promise) { module.exports = function(Promise) {
var SomePromiseArray = Promise._SomePromiseArray; var SomePromiseArray = Promise._SomePromiseArray;
@ -141,6 +140,7 @@ var Queue = _dereq_("./queue");
var util = _dereq_("./util"); var util = _dereq_("./util");
function Async() { function Async() {
this._customScheduler = false;
this._isTickUsed = false; this._isTickUsed = false;
this._lateQueue = new Queue(16); this._lateQueue = new Queue(16);
this._normalQueue = new Queue(16); this._normalQueue = new Queue(16);
@ -153,6 +153,17 @@ function Async() {
this._schedule = schedule; this._schedule = schedule;
} }
Async.prototype.setScheduler = function(fn) {
var prev = this._schedule;
this._schedule = fn;
this._customScheduler = true;
return prev;
};
Async.prototype.hasCustomScheduler = function() {
return this._customScheduler;
};
Async.prototype.enableTrampoline = function() { Async.prototype.enableTrampoline = function() {
this._trampolineEnabled = true; this._trampolineEnabled = true;
}; };
@ -170,7 +181,8 @@ Async.prototype.haveItemsQueued = function () {
Async.prototype.fatalError = function(e, isNode) { Async.prototype.fatalError = function(e, isNode) {
if (isNode) { if (isNode) {
process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e)); process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) +
"\n");
process.exit(2); process.exit(2);
} else { } else {
this.throwLater(e); this.throwLater(e);
@ -876,6 +888,86 @@ Promise.hasLongStackTraces = function () {
return config.longStackTraces && longStackTracesIsSupported(); return config.longStackTraces && longStackTracesIsSupported();
}; };
var fireDomEvent = (function() {
try {
var event = document.createEvent("CustomEvent");
event.initCustomEvent("testingtheevent", false, true, {});
util.global.dispatchEvent(event);
return function(name, event) {
var domEvent = document.createEvent("CustomEvent");
domEvent.initCustomEvent(name.toLowerCase(), false, true, event);
return !util.global.dispatchEvent(domEvent);
};
} catch (e) {}
return function() {
return false;
};
})();
var fireGlobalEvent = (function() {
if (util.isNode) {
return function() {
return process.emit.apply(process, arguments);
};
} else {
if (!util.global) {
return function() {
return false;
};
}
return function(name) {
var methodName = "on" + name.toLowerCase();
var method = util.global[methodName];
if (!method) return false;
method.apply(util.global, [].slice.call(arguments, 1));
return true;
};
}
})();
function generatePromiseLifecycleEventObject(name, promise) {
return {promise: promise};
}
var eventToObjectGenerator = {
promiseCreated: generatePromiseLifecycleEventObject,
promiseFulfilled: generatePromiseLifecycleEventObject,
promiseRejected: generatePromiseLifecycleEventObject,
promiseResolved: generatePromiseLifecycleEventObject,
promiseCancelled: generatePromiseLifecycleEventObject,
promiseChained: function(name, promise, child) {
return {promise: promise, child: child};
},
warning: function(name, warning) {
return {warning: warning};
},
unhandledRejection: function (name, reason, promise) {
return {reason: reason, promise: promise};
},
rejectionHandled: generatePromiseLifecycleEventObject
};
var activeFireEvent = function (name) {
var globalEventFired = false;
try {
globalEventFired = fireGlobalEvent.apply(null, arguments);
} catch (e) {
async.throwLater(e);
globalEventFired = true;
}
var domEventFired = false;
try {
domEventFired = fireDomEvent(name,
eventToObjectGenerator[name].apply(null, arguments));
} catch (e) {
async.throwLater(e);
domEventFired = true;
}
return domEventFired || globalEventFired;
};
Promise.config = function(opts) { Promise.config = function(opts) {
opts = Object(opts); opts = Object(opts);
if ("longStackTraces" in opts) { if ("longStackTraces" in opts) {
@ -912,8 +1004,20 @@ Promise.config = function(opts) {
propagateFromFunction = cancellationPropagateFrom; propagateFromFunction = cancellationPropagateFrom;
config.cancellation = true; config.cancellation = true;
} }
if ("monitoring" in opts) {
if (opts.monitoring && !config.monitoring) {
config.monitoring = true;
Promise.prototype._fireEvent = activeFireEvent;
} else if (!opts.monitoring && config.monitoring) {
config.monitoring = false;
Promise.prototype._fireEvent = defaultFireEvent;
}
}
}; };
function defaultFireEvent() { return false; }
Promise.prototype._fireEvent = defaultFireEvent;
Promise.prototype._execute = function(executor, resolve, reject) { Promise.prototype._execute = function(executor, resolve, reject) {
try { try {
executor(resolve, reject); executor(resolve, reject);
@ -1038,6 +1142,7 @@ function checkForgottenReturns(returnValue, promiseCreated, name, promise,
if (returnValue === undefined && promiseCreated !== null && if (returnValue === undefined && promiseCreated !== null &&
wForgottenReturn) { wForgottenReturn) {
if (parent !== undefined && parent._returnedNonUndefined()) return; if (parent !== undefined && parent._returnedNonUndefined()) return;
if ((promise._bitField & 65535) === 0) return;
if (name) name = name + " "; if (name) name = name + " ";
var msg = "a promise was created in a " + name + var msg = "a promise was created in a " + name +
@ -1065,7 +1170,10 @@ function warn(message, shouldUseOwnTrace, promise) {
var parsed = parseStackAndMessage(warning); var parsed = parseStackAndMessage(warning);
warning.stack = parsed.message + "\n" + parsed.stack.join("\n"); warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
} }
formatAndLogError(warning, "", true);
if (!activeFireEvent("warning", warning)) {
formatAndLogError(warning, "", true);
}
} }
function reconstructStack(message, stacks) { function reconstructStack(message, stacks) {
@ -1192,30 +1300,12 @@ function fireRejectionEvent(name, localHandler, reason, promise) {
async.throwLater(e); async.throwLater(e);
} }
var globalEventFired = false; if (name === "unhandledRejection") {
try { if (!activeFireEvent(name, reason, promise) && !localEventFired) {
globalEventFired = fireGlobalEvent(name, reason, promise); formatAndLogError(reason, "Unhandled rejection ");
} catch (e) {
globalEventFired = true;
async.throwLater(e);
}
var domEventFired = false;
if (fireDomEvent) {
try {
domEventFired = fireDomEvent(name.toLowerCase(), {
reason: reason,
promise: promise
});
} catch (e) {
domEventFired = true;
async.throwLater(e);
} }
} } else {
activeFireEvent(name, promise);
if (!globalEventFired && !localEventFired && !domEventFired &&
name === "unhandledRejection") {
formatAndLogError(reason, "Unhandled rejection ");
} }
} }
@ -1460,59 +1550,6 @@ var captureStackTrace = (function stackDetection() {
})([]); })([]);
var fireDomEvent;
var fireGlobalEvent = (function() {
if (util.isNode) {
return function(name, reason, promise) {
if (name === "rejectionHandled") {
return process.emit(name, promise);
} else {
return process.emit(name, reason, promise);
}
};
} else {
var globalObject = typeof self !== "undefined" ? self :
typeof window !== "undefined" ? window :
typeof global !== "undefined" ? global :
this !== undefined ? this : null;
if (!globalObject) {
return function() {
return false;
};
}
try {
var event = document.createEvent("CustomEvent");
event.initCustomEvent("testingtheevent", false, true, {});
globalObject.dispatchEvent(event);
fireDomEvent = function(type, detail) {
var event = document.createEvent("CustomEvent");
event.initCustomEvent(type, false, true, detail);
return !globalObject.dispatchEvent(event);
};
} catch (e) {}
var toWindowMethodNameMap = {};
toWindowMethodNameMap["unhandledRejection"] = ("on" +
"unhandledRejection").toLowerCase();
toWindowMethodNameMap["rejectionHandled"] = ("on" +
"rejectionHandled").toLowerCase();
return function(name, reason, promise) {
var methodName = toWindowMethodNameMap[name];
var method = globalObject[methodName];
if (!method) return false;
if (name === "rejectionHandled") {
method.call(globalObject, promise);
} else {
method.call(globalObject, reason, promise);
}
return true;
};
}
})();
if (typeof console !== "undefined" && typeof console.warn !== "undefined") { if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
printWarning = function (message) { printWarning = function (message) {
console.warn(message); console.warn(message);
@ -1533,7 +1570,8 @@ if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
var config = { var config = {
warnings: warnings, warnings: warnings,
longStackTraces: false, longStackTraces: false,
cancellation: false cancellation: false,
monitoring: false
}; };
if (longStackTraces) Promise.longStackTraces(); if (longStackTraces) Promise.longStackTraces();
@ -1548,6 +1586,9 @@ return {
cancellation: function() { cancellation: function() {
return config.cancellation; return config.cancellation;
}, },
monitoring: function() {
return config.monitoring;
},
propagateFromFunction: function() { propagateFromFunction: function() {
return propagateFromFunction; return propagateFromFunction;
}, },
@ -1558,7 +1599,9 @@ return {
setBounds: setBounds, setBounds: setBounds,
warn: warn, warn: warn,
deprecated: deprecated, deprecated: deprecated,
CapturedTrace: CapturedTrace CapturedTrace: CapturedTrace,
fireDomEvent: fireDomEvent,
fireGlobalEvent: fireGlobalEvent
}; };
}; };
@ -1740,7 +1783,12 @@ if (!errorTypes) {
RejectionError: OperationalError, RejectionError: OperationalError,
AggregateError: AggregateError AggregateError: AggregateError
}); });
notEnumerableProp(Error, "__BluebirdErrorTypes__", errorTypes); es5.defineProperty(Error, "__BluebirdErrorTypes__", {
value: errorTypes,
writable: false,
enumerable: false,
configurable: false
});
} }
module.exports = { module.exports = {
@ -1857,6 +1905,18 @@ var util = _dereq_("./util");
var CancellationError = Promise.CancellationError; var CancellationError = Promise.CancellationError;
var errorObj = util.errorObj; var errorObj = util.errorObj;
function PassThroughHandlerContext(promise, type, handler) {
this.promise = promise;
this.type = type;
this.handler = handler;
this.called = false;
this.cancelPromise = null;
}
PassThroughHandlerContext.prototype.isFinallyHandler = function() {
return this.type === 0;
};
function FinallyHandlerCancelReaction(finallyHandler) { function FinallyHandlerCancelReaction(finallyHandler) {
this.finallyHandler = finallyHandler; this.finallyHandler = finallyHandler;
} }
@ -1892,7 +1952,7 @@ function finallyHandler(reasonOrValue) {
if (!this.called) { if (!this.called) {
this.called = true; this.called = true;
var ret = this.type === 0 var ret = this.isFinallyHandler()
? handler.call(promise._boundValue()) ? handler.call(promise._boundValue())
: handler.call(promise._boundValue(), reasonOrValue); : handler.call(promise._boundValue(), reasonOrValue);
if (ret !== undefined) { if (ret !== undefined) {
@ -1929,13 +1989,11 @@ function finallyHandler(reasonOrValue) {
Promise.prototype._passThrough = function(handler, type, success, fail) { Promise.prototype._passThrough = function(handler, type, success, fail) {
if (typeof handler !== "function") return this.then(); if (typeof handler !== "function") return this.then();
return this._then(success, fail, undefined, { return this._then(success,
promise: this, fail,
handler: handler, undefined,
called: false, new PassThroughHandlerContext(this, type, handler),
cancelPromise: null, undefined);
type: type
}, undefined);
}; };
Promise.prototype.lastly = Promise.prototype.lastly =
@ -1950,7 +2008,7 @@ Promise.prototype.tap = function (handler) {
return this._passThrough(handler, 1, finallyHandler); return this._passThrough(handler, 1, finallyHandler);
}; };
return finallyHandler; return PassThroughHandlerContext;
}; };
},{"./util":36}],16:[function(_dereq_,module,exports){ },{"./util":36}],16:[function(_dereq_,module,exports){
@ -1986,9 +2044,18 @@ function promiseFromYieldHandler(value, yieldHandlers, traceParent) {
} }
function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) { function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {
var promise = this._promise = new Promise(INTERNAL); if (debug.cancellation()) {
promise._captureStackTrace(); var internal = new Promise(INTERNAL);
promise._setOnCancel(this); var _finallyPromise = this._finallyPromise = new Promise(INTERNAL);
this._promise = internal.lastly(function() {
return _finallyPromise;
});
internal._captureStackTrace();
internal._setOnCancel(this);
} else {
var promise = this._promise = new Promise(INTERNAL);
promise._captureStackTrace();
}
this._stack = stack; this._stack = stack;
this._generatorFunction = generatorFunction; this._generatorFunction = generatorFunction;
this._receiver = receiver; this._receiver = receiver;
@ -1997,6 +2064,7 @@ function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {
? [yieldHandler].concat(yieldHandlers) ? [yieldHandler].concat(yieldHandlers)
: yieldHandlers; : yieldHandlers;
this._yieldedPromise = null; this._yieldedPromise = null;
this._cancellationPhase = false;
} }
util.inherits(PromiseSpawn, Proxyable); util.inherits(PromiseSpawn, Proxyable);
@ -2006,6 +2074,10 @@ PromiseSpawn.prototype._isResolved = function() {
PromiseSpawn.prototype._cleanup = function() { PromiseSpawn.prototype._cleanup = function() {
this._promise = this._generator = null; this._promise = this._generator = null;
if (debug.cancellation() && this._finallyPromise !== null) {
this._finallyPromise._fulfill();
this._finallyPromise = null;
}
}; };
PromiseSpawn.prototype._promiseCancelled = function() { PromiseSpawn.prototype._promiseCancelled = function() {
@ -2022,22 +2094,15 @@ PromiseSpawn.prototype._promiseCancelled = function() {
result = tryCatch(this._generator["throw"]).call(this._generator, result = tryCatch(this._generator["throw"]).call(this._generator,
reason); reason);
this._promise._popContext(); this._promise._popContext();
if (result === errorObj && result.e === reason) {
result = null;
}
} else { } else {
this._promise._pushContext(); this._promise._pushContext();
result = tryCatch(this._generator["return"]).call(this._generator, result = tryCatch(this._generator["return"]).call(this._generator,
undefined); undefined);
this._promise._popContext(); this._promise._popContext();
} }
var promise = this._promise; this._cancellationPhase = true;
this._cleanup(); this._yieldedPromise = null;
if (result === errorObj) { this._continue(result);
promise._rejectCallback(result.e, false);
} else {
promise.cancel();
}
}; };
PromiseSpawn.prototype._promiseFulfilled = function(value) { PromiseSpawn.prototype._promiseFulfilled = function(value) {
@ -2081,13 +2146,21 @@ PromiseSpawn.prototype._continue = function (result) {
var promise = this._promise; var promise = this._promise;
if (result === errorObj) { if (result === errorObj) {
this._cleanup(); this._cleanup();
return promise._rejectCallback(result.e, false); if (this._cancellationPhase) {
return promise.cancel();
} else {
return promise._rejectCallback(result.e, false);
}
} }
var value = result.value; var value = result.value;
if (result.done === true) { if (result.done === true) {
this._cleanup(); this._cleanup();
return promise._resolveCallback(value); if (this._cancellationPhase) {
return promise.cancel();
} else {
return promise._resolveCallback(value);
}
} else { } else {
var maybePromise = tryConvertToPromise(value, this._promise); var maybePromise = tryConvertToPromise(value, this._promise);
if (!(maybePromise instanceof Promise)) { if (!(maybePromise instanceof Promise)) {
@ -2687,7 +2760,8 @@ var Context = _dereq_("./context")(Promise);
var createContext = Context.create; var createContext = Context.create;
var debug = _dereq_("./debuggability")(Promise, Context); var debug = _dereq_("./debuggability")(Promise, Context);
var CapturedTrace = debug.CapturedTrace; var CapturedTrace = debug.CapturedTrace;
var finallyHandler = _dereq_("./finally")(Promise, tryConvertToPromise); var PassThroughHandlerContext =
_dereq_("./finally")(Promise, tryConvertToPromise);
var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER); var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);
var nodebackForPromise = _dereq_("./nodeback"); var nodebackForPromise = _dereq_("./nodeback");
var errorObj = util.errorObj; var errorObj = util.errorObj;
@ -2712,6 +2786,7 @@ function Promise(executor) {
this._resolveFromExecutor(executor); this._resolveFromExecutor(executor);
} }
this._promiseCreated(); this._promiseCreated();
this._fireEvent("promiseCreated", this);
} }
Promise.prototype.toString = function () { Promise.prototype.toString = function () {
@ -2804,6 +2879,7 @@ Promise.is = function (val) {
Promise.fromNode = Promise.fromCallback = function(fn) { Promise.fromNode = Promise.fromCallback = function(fn) {
var ret = new Promise(INTERNAL); var ret = new Promise(INTERNAL);
ret._captureStackTrace();
var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs
: false; : false;
var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs)); var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));
@ -2842,9 +2918,7 @@ Promise.setScheduler = function(fn) {
if (typeof fn !== "function") { if (typeof fn !== "function") {
throw new TypeError("expecting a function but got " + util.classString(fn)); throw new TypeError("expecting a function but got " + util.classString(fn));
} }
var prev = async._schedule; return async.setScheduler(fn);
async._schedule = fn;
return prev;
}; };
Promise.prototype._then = function ( Promise.prototype._then = function (
@ -2869,6 +2943,7 @@ Promise.prototype._then = function (
receiver = target === this ? undefined : this._boundTo; receiver = target === this ? undefined : this._boundTo;
} }
} }
this._fireEvent("promiseChained", this, promise);
} }
var domain = getDomain(); var domain = getDomain();
@ -2921,14 +2996,17 @@ Promise.prototype._setLength = function (len) {
Promise.prototype._setFulfilled = function () { Promise.prototype._setFulfilled = function () {
this._bitField = this._bitField | 33554432; this._bitField = this._bitField | 33554432;
this._fireEvent("promiseFulfilled", this);
}; };
Promise.prototype._setRejected = function () { Promise.prototype._setRejected = function () {
this._bitField = this._bitField | 16777216; this._bitField = this._bitField | 16777216;
this._fireEvent("promiseRejected", this);
}; };
Promise.prototype._setFollowing = function () { Promise.prototype._setFollowing = function () {
this._bitField = this._bitField | 67108864; this._bitField = this._bitField | 67108864;
this._fireEvent("promiseResolved", this);
}; };
Promise.prototype._setIsFinal = function () { Promise.prototype._setIsFinal = function () {
@ -2945,9 +3023,11 @@ Promise.prototype._unsetCancelled = function() {
Promise.prototype._setCancelled = function() { Promise.prototype._setCancelled = function() {
this._bitField = this._bitField | 65536; this._bitField = this._bitField | 65536;
this._fireEvent("promiseCancelled", this);
}; };
Promise.prototype._setAsyncGuaranteed = function() { Promise.prototype._setAsyncGuaranteed = function() {
if (async.hasCustomScheduler()) return;
this._bitField = this._bitField | 134217728; this._bitField = this._bitField | 134217728;
}; };
@ -3054,6 +3134,12 @@ Promise.prototype._resolveCallback = function(value, shouldBind) {
if (shouldBind) this._propagateFrom(maybePromise, 2); if (shouldBind) this._propagateFrom(maybePromise, 2);
var promise = maybePromise._target(); var promise = maybePromise._target();
if (promise === this) {
this._reject(makeSelfResolutionError());
return;
}
var bitField = promise._bitField; var bitField = promise._bitField;
if (((bitField & 50397184) === 0)) { if (((bitField & 50397184) === 0)) {
var len = this._length(); var len = this._length();
@ -3130,9 +3216,8 @@ Promise.prototype._settlePromiseFromHandler = function (
if (x === NEXT_FILTER) { if (x === NEXT_FILTER) {
promise._reject(value); promise._reject(value);
} else if (x === errorObj || x === promise) { } else if (x === errorObj) {
var err = x === promise ? makeSelfResolutionError() : x.e; promise._rejectCallback(x.e, false);
promise._rejectCallback(err, false);
} else { } else {
debug.checkForgottenReturns(x, promiseCreated, "", promise, this); debug.checkForgottenReturns(x, promiseCreated, "", promise, this);
promise._resolveCallback(x); promise._resolveCallback(x);
@ -3160,7 +3245,8 @@ Promise.prototype._settlePromise = function(promise, handler, receiver, value) {
if (((bitField & 65536) !== 0)) { if (((bitField & 65536) !== 0)) {
if (isPromise) promise._invokeInternalOnCancel(); if (isPromise) promise._invokeInternalOnCancel();
if (handler === finallyHandler) { if (receiver instanceof PassThroughHandlerContext &&
receiver.isFinallyHandler()) {
receiver.cancelPromise = promise; receiver.cancelPromise = promise;
if (tryCatch(handler).call(receiver, value) === errorObj) { if (tryCatch(handler).call(receiver, value) === errorObj) {
promise._reject(errorObj.e); promise._reject(errorObj.e);
@ -3266,11 +3352,7 @@ Promise.prototype._reject = function (reason) {
} }
if ((bitField & 65535) > 0) { if ((bitField & 65535) > 0) {
if (((bitField & 134217728) !== 0)) { async.settlePromises(this);
this._settlePromises();
} else {
async.settlePromises(this);
}
} else { } else {
this._ensurePossibleRejectionHandled(); this._ensurePossibleRejectionHandled();
} }
@ -3351,20 +3433,20 @@ _dereq_("./join")(
Promise, PromiseArray, tryConvertToPromise, INTERNAL, debug); Promise, PromiseArray, tryConvertToPromise, INTERNAL, debug);
Promise.Promise = Promise; Promise.Promise = Promise;
_dereq_('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); _dereq_('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
_dereq_('./call_get.js')(Promise);
_dereq_('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug); _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_('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);
_dereq_('./nodeify.js')(Promise); _dereq_('./nodeify.js')(Promise);
_dereq_('./call_get.js')(Promise); _dereq_('./promisify.js')(Promise, INTERNAL);
_dereq_('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection); _dereq_('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);
_dereq_('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection); _dereq_('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);
_dereq_('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); _dereq_('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
_dereq_('./settle.js')(Promise, PromiseArray, debug); _dereq_('./settle.js')(Promise, PromiseArray, debug);
_dereq_('./some.js')(Promise, PromiseArray, apiRejection); _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_('./filter.js')(Promise, INTERNAL);
_dereq_('./each.js')(Promise, INTERNAL);
_dereq_('./any.js')(Promise);
util.toFastProperties(Promise); util.toFastProperties(Promise);
util.toFastProperties(Promise.prototype); util.toFastProperties(Promise.prototype);
@ -4326,12 +4408,18 @@ var schedule;
var noAsyncScheduler = function() { var noAsyncScheduler = function() {
throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a"); 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") { if (util.isNode && typeof MutationObserver === "undefined") {
var GlobalSetImmediate = global.setImmediate; var GlobalSetImmediate = global.setImmediate;
var ProcessNextTick = process.nextTick; var ProcessNextTick = process.nextTick;
schedule = util.isRecentNode schedule = util.isRecentNode
? function(fn) { GlobalSetImmediate.call(global, fn); } ? function(fn) { GlobalSetImmediate.call(global, fn); }
: function(fn) { ProcessNextTick.call(process, 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") && } else if ((typeof MutationObserver !== "undefined") &&
!(typeof window !== "undefined" && !(typeof window !== "undefined" &&
window.navigator && window.navigator &&
@ -4343,23 +4431,23 @@ if (util.isNode && typeof MutationObserver === "undefined") {
var div2 = document.createElement("div"); var div2 = document.createElement("div");
var o2 = new MutationObserver(function() { var o2 = new MutationObserver(function() {
div.classList.toggle("foo"); div.classList.toggle("foo");
toggleScheduled = false; toggleScheduled = false;
}); });
o2.observe(div2, opts); o2.observe(div2, opts);
var scheduleToggle = function() { var scheduleToggle = function() {
if (toggleScheduled) return; if (toggleScheduled) return;
toggleScheduled = true; toggleScheduled = true;
div2.classList.toggle("foo"); div2.classList.toggle("foo");
}; };
return function schedule(fn) { return function schedule(fn) {
var o = new MutationObserver(function() { var o = new MutationObserver(function() {
o.disconnect(); o.disconnect();
fn(); fn();
}); });
o.observe(div, opts); o.observe(div, opts);
scheduleToggle(); scheduleToggle();
}; };
})(); })();
} else if (typeof setImmediate !== "undefined") { } else if (typeof setImmediate !== "undefined") {
@ -4754,12 +4842,44 @@ return tryConvertToPromise;
},{"./util":36}],34:[function(_dereq_,module,exports){ },{"./util":36}],34:[function(_dereq_,module,exports){
"use strict"; "use strict";
module.exports = function(Promise, INTERNAL) { module.exports = function(Promise, INTERNAL, debug) {
var util = _dereq_("./util"); var util = _dereq_("./util");
var TimeoutError = Promise.TimeoutError; 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) { var afterTimeout = function (promise, message, parent) {
if (!promise.isPending()) return;
var err; var err;
if (typeof message !== "string") { if (typeof message !== "string") {
if (message instanceof Error) { if (message instanceof Error) {
@ -4773,49 +4893,43 @@ var afterTimeout = function (promise, message, parent) {
util.markAsOriginatingFromRejection(err); util.markAsOriginatingFromRejection(err);
promise._attachExtraTrace(err); promise._attachExtraTrace(err);
promise._reject(err); promise._reject(err);
parent.cancel();
};
var afterValue = function(value) { return delay(+this).thenReturn(value); }; if (parent != null) {
var delay = Promise.delay = function (ms, value) { parent.cancel();
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);
} }
ret._setAsyncGuaranteed();
return ret;
};
Promise.prototype.delay = function (ms) {
return delay(ms, this);
}; };
function successClear(value) { function successClear(value) {
var handle = this; clearTimeout(this.handle);
if (handle instanceof Number) handle = +handle;
clearTimeout(handle);
return value; return value;
} }
function failureClear(reason) { function failureClear(reason) {
var handle = this; clearTimeout(this.handle);
if (handle instanceof Number) handle = +handle;
clearTimeout(handle);
throw reason; throw reason;
} }
Promise.prototype.timeout = function (ms, message) { Promise.prototype.timeout = function (ms, message) {
ms = +ms; ms = +ms;
var parent = this.then(); var ret, parent;
var ret = parent.then();
var handle = setTimeout(function timeoutTimeout() { var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() {
afterTimeout(ret, message, parent); if (ret.isPending()) {
}, ms); afterTimeout(ret, message, parent);
return ret._then(successClear, failureClear, undefined, handle, undefined); }
}, 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 errorObj = {e: {}};
var tryCatchTarget; var tryCatchTarget;
var globalObject = typeof self !== "undefined" ? self :
typeof window !== "undefined" ? window :
typeof global !== "undefined" ? global :
this !== undefined ? this : null;
function tryCatcher() { function tryCatcher() {
try { try {
var target = tryCatchTarget; 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) { function markAsOriginatingFromRejection(e) {
try { try {
notEnumerableProp(e, "isOperational", true); notEnumerableProp(e, "isOperational", true);
@ -5281,7 +5407,7 @@ function originatesFromRejection(e) {
} }
function canAttachTrace(obj) { function canAttachTrace(obj) {
return obj instanceof Error && es5.propertyIsWritable(obj, "stack"); return isError(obj) && es5.propertyIsWritable(obj, "stack");
} }
var ensureErrorObject = (function() { var ensureErrorObject = (function() {
@ -5352,6 +5478,17 @@ function env(key, def) {
return isNode ? process.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 = { var ret = {
isClass: isClass, isClass: isClass,
isIdentifier: isIdentifier, isIdentifier: isIdentifier,
@ -5363,6 +5500,7 @@ var ret = {
notEnumerableProp: notEnumerableProp, notEnumerableProp: notEnumerableProp,
isPrimitive: isPrimitive, isPrimitive: isPrimitive,
isObject: isObject, isObject: isObject,
isError: isError,
canEvaluate: canEvaluate, canEvaluate: canEvaluate,
errorObj: errorObj, errorObj: errorObj,
tryCatch: tryCatch, tryCatch: tryCatch,
@ -5381,7 +5519,9 @@ var ret = {
hasDevTools: typeof chrome !== "undefined" && chrome && hasDevTools: typeof chrome !== "undefined" && chrome &&
typeof chrome.loadTimes === "function", typeof chrome.loadTimes === "function",
isNode: isNode, isNode: isNode,
env: env env: env,
global: globalObject,
getNativePromise: getNativePromise
}; };
ret.isRecentNode = ret.isNode && (function() { ret.isRecentNode = ret.isNode && (function() {
var version = process.versions.node.split(".").map(Number); var version = process.versions.node.split(".").map(Number);