www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

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:
Mresource/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);