commit 1502985d9854701dda05a1a4c2301bbeb6937561
parent 2a8cd27b493fa712562f328ea1187531962ca1cf
Author: Dan Stillman <dstillman@zotero.org>
Date: Wed, 27 Apr 2016 01:50:45 -0400
Update Bluebird to 3.3.5
Diffstat:
| M | resource/bluebird.js | | | 554 | +++++++++++++++++++++++++++++++++++++++++++++++++------------------------------ |
1 file changed, 347 insertions(+), 207 deletions(-)
diff --git 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<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
+ 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<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
var SomePromiseArray = Promise._SomePromiseArray;
@@ -141,6 +140,7 @@ var Queue = _dereq_("./queue");
var util = _dereq_("./util");
function Async() {
+ this._customScheduler = false;
this._isTickUsed = false;
this._lateQueue = new Queue(16);
this._normalQueue = new Queue(16);
@@ -153,6 +153,17 @@ function Async() {
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() {
this._trampolineEnabled = true;
};
@@ -170,7 +181,8 @@ Async.prototype.haveItemsQueued = function () {
Async.prototype.fatalError = function(e, 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);
} else {
this.throwLater(e);
@@ -876,6 +888,86 @@ Promise.hasLongStackTraces = function () {
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) {
opts = Object(opts);
if ("longStackTraces" in opts) {
@@ -912,8 +1004,20 @@ Promise.config = function(opts) {
propagateFromFunction = cancellationPropagateFrom;
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) {
try {
executor(resolve, reject);
@@ -1038,6 +1142,7 @@ function checkForgottenReturns(returnValue, promiseCreated, name, promise,
if (returnValue === undefined && promiseCreated !== null &&
wForgottenReturn) {
if (parent !== undefined && parent._returnedNonUndefined()) return;
+ if ((promise._bitField & 65535) === 0) return;
if (name) name = name + " ";
var msg = "a promise was created in a " + name +
@@ -1065,7 +1170,10 @@ function warn(message, shouldUseOwnTrace, promise) {
var parsed = parseStackAndMessage(warning);
warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
}
- formatAndLogError(warning, "", true);
+
+ if (!activeFireEvent("warning", warning)) {
+ formatAndLogError(warning, "", true);
+ }
}
function reconstructStack(message, stacks) {
@@ -1192,30 +1300,12 @@ function fireRejectionEvent(name, localHandler, reason, promise) {
async.throwLater(e);
}
- var globalEventFired = false;
- try {
- globalEventFired = fireGlobalEvent(name, reason, promise);
- } 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);
+ if (name === "unhandledRejection") {
+ if (!activeFireEvent(name, reason, promise) && !localEventFired) {
+ formatAndLogError(reason, "Unhandled rejection ");
}
- }
-
- if (!globalEventFired && !localEventFired && !domEventFired &&
- name === "unhandledRejection") {
- formatAndLogError(reason, "Unhandled rejection ");
+ } else {
+ activeFireEvent(name, promise);
}
}
@@ -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") {
printWarning = function (message) {
console.warn(message);
@@ -1533,7 +1570,8 @@ if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
var config = {
warnings: warnings,
longStackTraces: false,
- cancellation: false
+ cancellation: false,
+ monitoring: false
};
if (longStackTraces) Promise.longStackTraces();
@@ -1548,6 +1586,9 @@ return {
cancellation: function() {
return config.cancellation;
},
+ monitoring: function() {
+ return config.monitoring;
+ },
propagateFromFunction: function() {
return propagateFromFunction;
},
@@ -1558,7 +1599,9 @@ return {
setBounds: setBounds,
warn: warn,
deprecated: deprecated,
- CapturedTrace: CapturedTrace
+ CapturedTrace: CapturedTrace,
+ fireDomEvent: fireDomEvent,
+ fireGlobalEvent: fireGlobalEvent
};
};
@@ -1740,7 +1783,12 @@ if (!errorTypes) {
RejectionError: OperationalError,
AggregateError: AggregateError
});
- notEnumerableProp(Error, "__BluebirdErrorTypes__", errorTypes);
+ es5.defineProperty(Error, "__BluebirdErrorTypes__", {
+ value: errorTypes,
+ writable: false,
+ enumerable: false,
+ configurable: false
+ });
}
module.exports = {
@@ -1857,6 +1905,18 @@ var util = _dereq_("./util");
var CancellationError = Promise.CancellationError;
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) {
this.finallyHandler = finallyHandler;
}
@@ -1892,7 +1952,7 @@ function finallyHandler(reasonOrValue) {
if (!this.called) {
this.called = true;
- var ret = this.type === 0
+ var ret = this.isFinallyHandler()
? handler.call(promise._boundValue())
: handler.call(promise._boundValue(), reasonOrValue);
if (ret !== undefined) {
@@ -1929,13 +1989,11 @@ function finallyHandler(reasonOrValue) {
Promise.prototype._passThrough = function(handler, type, success, fail) {
if (typeof handler !== "function") return this.then();
- return this._then(success, fail, undefined, {
- promise: this,
- handler: handler,
- called: false,
- cancelPromise: null,
- type: type
- }, undefined);
+ return this._then(success,
+ fail,
+ undefined,
+ new PassThroughHandlerContext(this, type, handler),
+ undefined);
};
Promise.prototype.lastly =
@@ -1950,7 +2008,7 @@ Promise.prototype.tap = function (handler) {
return this._passThrough(handler, 1, finallyHandler);
};
-return finallyHandler;
+return PassThroughHandlerContext;
};
},{"./util":36}],16:[function(_dereq_,module,exports){
@@ -1986,9 +2044,18 @@ function promiseFromYieldHandler(value, yieldHandlers, traceParent) {
}
function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {
- var promise = this._promise = new Promise(INTERNAL);
- promise._captureStackTrace();
- promise._setOnCancel(this);
+ if (debug.cancellation()) {
+ var internal = new Promise(INTERNAL);
+ 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._generatorFunction = generatorFunction;
this._receiver = receiver;
@@ -1997,6 +2064,7 @@ function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {
? [yieldHandler].concat(yieldHandlers)
: yieldHandlers;
this._yieldedPromise = null;
+ this._cancellationPhase = false;
}
util.inherits(PromiseSpawn, Proxyable);
@@ -2006,6 +2074,10 @@ PromiseSpawn.prototype._isResolved = function() {
PromiseSpawn.prototype._cleanup = function() {
this._promise = this._generator = null;
+ if (debug.cancellation() && this._finallyPromise !== null) {
+ this._finallyPromise._fulfill();
+ this._finallyPromise = null;
+ }
};
PromiseSpawn.prototype._promiseCancelled = function() {
@@ -2022,22 +2094,15 @@ PromiseSpawn.prototype._promiseCancelled = function() {
result = tryCatch(this._generator["throw"]).call(this._generator,
reason);
this._promise._popContext();
- if (result === errorObj && result.e === reason) {
- result = null;
- }
} else {
this._promise._pushContext();
result = tryCatch(this._generator["return"]).call(this._generator,
undefined);
this._promise._popContext();
}
- var promise = this._promise;
- this._cleanup();
- if (result === errorObj) {
- promise._rejectCallback(result.e, false);
- } else {
- promise.cancel();
- }
+ this._cancellationPhase = true;
+ this._yieldedPromise = null;
+ this._continue(result);
};
PromiseSpawn.prototype._promiseFulfilled = function(value) {
@@ -2081,13 +2146,21 @@ PromiseSpawn.prototype._continue = function (result) {
var promise = this._promise;
if (result === errorObj) {
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;
if (result.done === true) {
this._cleanup();
- return promise._resolveCallback(value);
+ if (this._cancellationPhase) {
+ return promise.cancel();
+ } else {
+ return promise._resolveCallback(value);
+ }
} else {
var maybePromise = tryConvertToPromise(value, this._promise);
if (!(maybePromise instanceof Promise)) {
@@ -2687,7 +2760,8 @@ var Context = _dereq_("./context")(Promise);
var createContext = Context.create;
var debug = _dereq_("./debuggability")(Promise, Context);
var CapturedTrace = debug.CapturedTrace;
-var finallyHandler = _dereq_("./finally")(Promise, tryConvertToPromise);
+var PassThroughHandlerContext =
+ _dereq_("./finally")(Promise, tryConvertToPromise);
var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);
var nodebackForPromise = _dereq_("./nodeback");
var errorObj = util.errorObj;
@@ -2712,6 +2786,7 @@ function Promise(executor) {
this._resolveFromExecutor(executor);
}
this._promiseCreated();
+ this._fireEvent("promiseCreated", this);
}
Promise.prototype.toString = function () {
@@ -2804,6 +2879,7 @@ Promise.is = function (val) {
Promise.fromNode = Promise.fromCallback = function(fn) {
var ret = new Promise(INTERNAL);
+ ret._captureStackTrace();
var multiArgs = arguments.length > 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,37 +4842,34 @@ 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;
-var afterTimeout = function (promise, message, parent) {
- if (!promise.isPending()) return;
- var err;
- if (typeof message !== "string") {
- if (message instanceof Error) {
- err = message;
- } else {
- err = new TimeoutError("operation timed out");
- }
- } else {
- err = new TimeoutError(message);
- }
- util.markAsOriginatingFromRejection(err);
- promise._attachExtraTrace(err);
- promise._reject(err);
- parent.cancel();
+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);
- setTimeout(function() { ret._fulfill(); }, +ms);
+ handle = setTimeout(function() { ret._fulfill(); }, +ms);
+ if (debug.cancellation()) {
+ ret._setOnCancel(new HandleWrapper(handle));
+ }
}
ret._setAsyncGuaranteed();
return ret;
@@ -4794,28 +4879,57 @@ Promise.prototype.delay = function (ms) {
return delay(ms, this);
};
+var afterTimeout = function (promise, message, parent) {
+ var err;
+ if (typeof message !== "string") {
+ if (message instanceof Error) {
+ err = message;
+ } else {
+ err = new TimeoutError("operation timed out");
+ }
+ } else {
+ err = new TimeoutError(message);
+ }
+ util.markAsOriginatingFromRejection(err);
+ promise._attachExtraTrace(err);
+ promise._reject(err);
+
+ if (parent != null) {
+ parent.cancel();
+ }
+};
+
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);