summaryrefslogtreecommitdiffstats
path: root/devtools/shared/deprecated-sync-thenables.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/shared/deprecated-sync-thenables.js')
-rw-r--r--devtools/shared/deprecated-sync-thenables.js119
1 files changed, 119 insertions, 0 deletions
diff --git a/devtools/shared/deprecated-sync-thenables.js b/devtools/shared/deprecated-sync-thenables.js
new file mode 100644
index 000000000..52bf671cd
--- /dev/null
+++ b/devtools/shared/deprecated-sync-thenables.js
@@ -0,0 +1,119 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * THIS MODULE IS DEPRECATED. IMPORT "Promise.jsm" INSTEAD.
+ */
+
+"use strict";
+
+this.Promise = {};
+
+if (typeof (require) === "function") {
+ module.exports = Promise;
+} else {
+ this.EXPORTED_SYMBOLS = ["Promise"];
+}
+
+function fulfilled(value) {
+ return { then: function then(fulfill) { fulfill(value); } };
+}
+
+function rejected(reason) {
+ return { then: function then(fulfill, reject) { reject(reason); } };
+}
+
+function isPromise(value) {
+ return value && typeof (value.then) === "function";
+}
+
+function defer() {
+ var observers = [];
+ var result = null;
+ var promise = {
+ then: function then(onFulfill, onError) {
+ var deferred = defer();
+
+ function resolve(value) {
+ try {
+ deferred.resolve(onFulfill ? onFulfill(value) : value);
+ } catch (error) {
+ deferred.resolve(rejected(error));
+ }
+ }
+
+ function reject(reason) {
+ try {
+ if (onError) deferred.resolve(onError(reason));
+ else deferred.resolve(rejected(reason));
+ } catch (error) {
+ deferred.resolve(rejected(error));
+ }
+ }
+
+ if (observers) {
+ observers.push({ resolve: resolve, reject: reject });
+ } else {
+ result.then(resolve, reject);
+ }
+
+ return deferred.promise;
+ }
+ };
+
+ var deferred = {
+ promise: promise,
+ resolve: function resolve(value) {
+ if (!result) {
+ result = isPromise(value) ? value : fulfilled(value);
+ while (observers.length) {
+ var observer = observers.shift();
+ result.then(observer.resolve, observer.reject);
+ }
+ observers = null;
+ }
+ },
+ reject: function reject(reason) {
+ deferred.resolve(rejected(reason));
+ }
+ };
+
+ return deferred;
+}
+Promise.defer = defer;
+
+function resolve(value) {
+ var deferred = defer();
+ deferred.resolve(value);
+ return deferred.promise;
+}
+Promise.resolve = resolve;
+
+function reject(reason) {
+ var deferred = defer();
+ deferred.reject(reason);
+ return deferred.promise;
+}
+Promise.reject = reject;
+
+var promised = (function () {
+ var call = Function.call;
+ var concat = Array.prototype.concat;
+ function execute(args) { return call.apply(call, args); }
+ function promisedConcat(promises, unknown) {
+ return promises.then(function (values) {
+ return resolve(unknown).then(function (value) {
+ return values.concat([ value ]);
+ });
+ });
+ }
+ return function promised(f) {
+ return function promised() {
+ return concat.apply([ f, this ], arguments).
+ reduce(promisedConcat, resolve([])).
+ then(execute);
+ };
+ };
+})();
+Promise.all = promised(Array);