mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2026-02-07 00:25:46 +01:00
Promisify some callbackish functions, and remove spaces around = in default arguments, per Python conventions.
This commit is contained in:
@@ -161,6 +161,7 @@ defineModule("base", {
|
||||
this.lazyRequire("cache", ["cache"]);
|
||||
this.lazyRequire("config", ["config"]);
|
||||
this.lazyRequire("messages", ["_", "Messages"]);
|
||||
this.lazyRequire("promises", ["Task", "promises"]);
|
||||
this.lazyRequire("services", ["services"]);
|
||||
this.lazyRequire("storage", ["File"]);
|
||||
this.lazyRequire("util", ["FailedAssertion", "util"]);
|
||||
@@ -915,16 +916,16 @@ Class.Memoize = function Memoize(getter, wait)
|
||||
}
|
||||
});
|
||||
|
||||
util.yieldable(function () {
|
||||
Task.spawn(function () {
|
||||
let wait;
|
||||
for (var res in getter.call(obj)) {
|
||||
if (wait !== undefined)
|
||||
yield wait;
|
||||
yield promises.sleep(wait);
|
||||
wait = res;
|
||||
}
|
||||
Class.replaceProperty(obj, key, res);
|
||||
done = true;
|
||||
})();
|
||||
});
|
||||
|
||||
return this[key];
|
||||
};
|
||||
@@ -1147,7 +1148,7 @@ let stub = Class.Property({
|
||||
*/
|
||||
var ErrorBase = Class("ErrorBase", Error, {
|
||||
level: 2,
|
||||
init: function EB_init(message, level = 0) {
|
||||
init: function EB_init(message, level=0) {
|
||||
let error = Error(message);
|
||||
update(this, error);
|
||||
this.stack = error.stack;
|
||||
@@ -1321,7 +1322,7 @@ var StructBase = Class("StructBase", Array, {
|
||||
});
|
||||
|
||||
var Timer = Class("Timer", {
|
||||
init: function init(minInterval, maxInterval, callback, self = this) {
|
||||
init: function init(minInterval, maxInterval, callback, self=this) {
|
||||
this._timer = services.Timer();
|
||||
this.callback = callback;
|
||||
this.self = self;
|
||||
|
||||
@@ -85,10 +85,10 @@ var Buffer = Module("Buffer", {
|
||||
* @param {string} pref The name of the preference to return.
|
||||
* @returns {Promise<string>}
|
||||
*/
|
||||
get: promises.withCallback(function get(callback, pref) {
|
||||
get: promises.withCallbacks(function get([resolve], pref) {
|
||||
services.contentPrefs.getByDomainAndName(
|
||||
self.uri.host, pref, self.loadContext,
|
||||
callback);
|
||||
resolve);
|
||||
}),
|
||||
|
||||
/**
|
||||
@@ -97,10 +97,10 @@ var Buffer = Module("Buffer", {
|
||||
* @param {string} pref The preference to set.
|
||||
* @param {string} value The value to store.
|
||||
*/
|
||||
set: promises.withCallback(function set(callback, pref, value) {
|
||||
set: promises.withCallbacks(function set([resolve], pref, value) {
|
||||
services.contentPrefs.set(
|
||||
self.uri.host, pref, value, self.loadContext,
|
||||
callback);
|
||||
resolve);
|
||||
}),
|
||||
|
||||
/**
|
||||
@@ -108,9 +108,9 @@ var Buffer = Module("Buffer", {
|
||||
*
|
||||
* @param {string} pref The preference to clear.
|
||||
*/
|
||||
clear: promises.withCallback(function clear(callback, pref) {
|
||||
clear: promises.withCallbacks(function clear([resolve], pref) {
|
||||
services.contentPrefs.removeByDomainAndName(
|
||||
self.uri.domain, pref, self.loadContext, callback);
|
||||
self.uri.domain, pref, self.loadContext, resolve);
|
||||
}),
|
||||
})),
|
||||
|
||||
@@ -834,7 +834,7 @@ var Buffer = Module("Buffer", {
|
||||
* @param {number} count The multiple of 'scroll' lines to scroll.
|
||||
* @optional
|
||||
*/
|
||||
scrollByScrollSize: function scrollByScrollSize(direction, count = 1) {
|
||||
scrollByScrollSize: function scrollByScrollSize(direction, count=1) {
|
||||
let { options } = this.modules;
|
||||
|
||||
direction = direction ? 1 : -1;
|
||||
|
||||
@@ -155,7 +155,7 @@ var Command = Class("Command", {
|
||||
* @param {Args} args The Args object passed to {@link #action}.
|
||||
* @param {Object} modifiers Any modifiers to be passed to {@link #action}.
|
||||
*/
|
||||
execute: function execute(args, modifiers = {}) {
|
||||
execute: function execute(args, modifiers={}) {
|
||||
const { dactyl } = this.modules;
|
||||
|
||||
let context = args.context;
|
||||
@@ -558,7 +558,7 @@ var CommandHive = Class("CommandHive", Contexts.Hive, {
|
||||
* @param {boolean} replace Replace an existing command of the same name.
|
||||
* @optional
|
||||
*/
|
||||
add: function add(specs, description, action, extra = {}, replace = false) {
|
||||
add: function add(specs, description, action, extra={}, replace=false) {
|
||||
const { commands, contexts } = this.modules;
|
||||
|
||||
if (!extra.definedAt)
|
||||
@@ -597,7 +597,7 @@ var CommandHive = Class("CommandHive", Contexts.Hive, {
|
||||
return name;
|
||||
},
|
||||
|
||||
_add: function _add(names, description, action, extra = {}, replace = false) {
|
||||
_add: function _add(names, description, action, extra={}, replace=false) {
|
||||
const { contexts } = this.modules;
|
||||
extra.definedAt = contexts.getCaller(Components.stack.caller.caller);
|
||||
return this.add.apply(this, arguments);
|
||||
@@ -969,7 +969,7 @@ var Commands = Module("commands", {
|
||||
* Args object.
|
||||
* @returns {Args}
|
||||
*/
|
||||
parseArgs: function parseArgs(str, params = {}) {
|
||||
parseArgs: function parseArgs(str, params={}) {
|
||||
const self = this;
|
||||
|
||||
function getNextArg(str, _keepQuotes=keepQuotes) {
|
||||
@@ -1777,7 +1777,7 @@ var Commands = Module("commands", {
|
||||
}
|
||||
});
|
||||
|
||||
let quote = function quote(q, list, map = Commands.quoteMap) {
|
||||
let quote = function quote(q, list, map=Commands.quoteMap) {
|
||||
let re = RegExp("[" + list + "]", "g");
|
||||
function quote(str) (q + String.replace(str, re, $0 => ($0 in map ? map[$0] : ("\\" + $0)))
|
||||
+ q);
|
||||
|
||||
@@ -33,7 +33,7 @@ lazyRequire("template", ["template"]);
|
||||
* @constructor
|
||||
*/
|
||||
var CompletionContext = Class("CompletionContext", {
|
||||
init: function cc_init(editor, name = "", offset = 0) {
|
||||
init: function cc_init(editor, name="", offset=0) {
|
||||
let self = this;
|
||||
if (editor instanceof this.constructor) {
|
||||
let parent = editor;
|
||||
|
||||
@@ -132,6 +132,7 @@ var ConfigBase = Class("ConfigBase", {
|
||||
"options",
|
||||
"overlay",
|
||||
"prefs",
|
||||
["promises", "Promise", "Task", "promises"],
|
||||
"protocol",
|
||||
"sanitizer",
|
||||
"services",
|
||||
|
||||
@@ -15,6 +15,7 @@ defineModule("io", {
|
||||
|
||||
lazyRequire("config", ["config"]);
|
||||
lazyRequire("contexts", ["Contexts", "contexts"]);
|
||||
lazyRequire("promises", ["Promise"]);
|
||||
lazyRequire("storage", ["File", "storage"]);
|
||||
lazyRequire("styles", ["styles"]);
|
||||
lazyRequire("template", ["template"]);
|
||||
@@ -318,7 +319,7 @@ var IO = Module("io", {
|
||||
* @default ""
|
||||
* @returns {File}
|
||||
*/
|
||||
createTempFile: function createTempFile(ext = "txt", label = "") {
|
||||
createTempFile: function createTempFile(ext="txt", label="") {
|
||||
let file = services.directory.get("TmpD", Ci.nsIFile);
|
||||
file.append(config.name + label + "." + ext);
|
||||
file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, octal(666));
|
||||
@@ -446,26 +447,29 @@ var IO = Module("io", {
|
||||
|
||||
let process = services.Process(file.file);
|
||||
process.run(false, args.map(String), args.length);
|
||||
try {
|
||||
if (callable(blocking))
|
||||
var timer = services.Timer(
|
||||
function () {
|
||||
if (!process.isRunning) {
|
||||
timer.cancel();
|
||||
util.trapErrors(blocking, self, process.exitValue);
|
||||
}
|
||||
},
|
||||
100, services.Timer.TYPE_REPEATING_SLACK);
|
||||
else if (blocking)
|
||||
while (process.isRunning)
|
||||
util.threadYield(false, true);
|
||||
}
|
||||
catch (e) {
|
||||
process.kill();
|
||||
throw e;
|
||||
|
||||
let deferred = Promise.defer();
|
||||
|
||||
if (callable(blocking))
|
||||
// Deprecated.
|
||||
deferred.promise.then(blocking);
|
||||
else if (blocking) {
|
||||
// Deprecated?
|
||||
while (process.isRunning)
|
||||
util.threadYield(false, true);
|
||||
return process.exitValue;
|
||||
}
|
||||
|
||||
return process.exitValue;
|
||||
let timer = services.Timer(
|
||||
function () {
|
||||
if (!process.isRunning) {
|
||||
timer.cancel();
|
||||
deferred.resolve(process.exitValue);
|
||||
}
|
||||
},
|
||||
100, services.Timer.TYPE_REPEATING_SLACK);
|
||||
|
||||
return deferred.promise;
|
||||
},
|
||||
|
||||
// TODO: when https://bugzilla.mozilla.org/show_bug.cgi?id=68702 is
|
||||
|
||||
@@ -11,7 +11,7 @@ defineModule("messages", {
|
||||
|
||||
var Messages = Module("messages", {
|
||||
|
||||
init: function init(name = "messages") {
|
||||
init: function init(name="messages") {
|
||||
let self = this;
|
||||
this.name = name;
|
||||
|
||||
@@ -107,7 +107,7 @@ var Messages = Module("messages", {
|
||||
let { Buffer, commands, hints, io, mappings, modes, options, sanitizer } = overlay.activeModules;
|
||||
file = io.File(file);
|
||||
|
||||
function properties(base, iter_, prop = "description") iter(function _properties() {
|
||||
function properties(base, iter_, prop="description") iter(function _properties() {
|
||||
function key(...args) [base, obj.identifier || obj.name].concat(args).join(".").replace(/[\\:=]/g, "\\$&");
|
||||
|
||||
for (var obj in iter_) {
|
||||
|
||||
@@ -9,10 +9,86 @@ defineModule("promises", {
|
||||
require: []
|
||||
});
|
||||
|
||||
lazyRequire("services", ["services"]);
|
||||
|
||||
lazyRequire("resource://gre/modules/Promise.jsm", ["Promise"]);
|
||||
lazyRequire("resource://gre/modules/Task.jsm", ["Task"]);
|
||||
|
||||
function withCallbacks(fn) {
|
||||
return function wrapper(...args) {
|
||||
let deferred = Promise.defer();
|
||||
function resolve(arg) { deferred.resolve(arg); }
|
||||
function reject(arg) { deferred.reject(arg); }
|
||||
fn.apply(this, [[resolve, reject, deferred]].concat(args));
|
||||
return deferred.promise;
|
||||
}
|
||||
}
|
||||
|
||||
var Promises = Module("Promises", {
|
||||
_cancel: WeakMap(),
|
||||
|
||||
/**
|
||||
* Allows promises to be canceled..
|
||||
*
|
||||
* @param {Promise} promise The promise to cancel.
|
||||
* @param {*} arg Argument to be passed to the cancellation
|
||||
* function.
|
||||
*/
|
||||
cancel: function cancel(promise, reason) {
|
||||
let cleanup = this._cancel.get(promise);
|
||||
if (cleanup) {
|
||||
cleanup[0](promise);
|
||||
cleanup[1].reject(reason);
|
||||
}
|
||||
this._cancel.delete(promise);
|
||||
},
|
||||
|
||||
/**
|
||||
* Registers a cleanup function for the given deferred promise.
|
||||
*
|
||||
* @param {Deferred} promise The promise to cancel.
|
||||
* @param {function} fn The cleanup function.
|
||||
*/
|
||||
oncancel: function oncancel(deferred, fn) {
|
||||
this._cancel.set(deferred.promise, [fn, deferred]);
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns a promise which resolves after a brief delay.
|
||||
*/
|
||||
delay: withCallbacks(function delay([accept]) {
|
||||
let { mainThread } = services.threading;
|
||||
mainThread.dispatch(accept, mainThread.DISPATCH_NORMAL);
|
||||
}),
|
||||
|
||||
/**
|
||||
* Returns a promise which resolves with the given argument.
|
||||
*/
|
||||
accept: function fail(arg) {
|
||||
let deferred = Promise.defer();
|
||||
deferred.resolve(arg);
|
||||
return deferred.promise;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns a promise which fails with the given argument.
|
||||
*/
|
||||
fail: function fail(arg) {
|
||||
let deferred = Promise.defer();
|
||||
deferred.reject(arg);
|
||||
return deferred.promise;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns a promise which resolves after the given number of
|
||||
* milliseconds.
|
||||
*
|
||||
* @param {number} delay The number of milliseconds to wait.
|
||||
*/
|
||||
sleep: withCallbacks(function sleep([callback], delay) {
|
||||
this.timeout(callback, delay);
|
||||
}),
|
||||
|
||||
/**
|
||||
* Wraps the given function so that each call spawns a Task.
|
||||
*
|
||||
@@ -26,21 +102,45 @@ var Promises = Module("Promises", {
|
||||
},
|
||||
|
||||
/**
|
||||
* Wraps the given function so that its first argument is a
|
||||
* callback which, when called, resolves the returned promise.
|
||||
* Returns a promise which resolves when the function *test* returns
|
||||
* true, or *timeout* milliseconds have expired.
|
||||
*
|
||||
* @param {function} test The predicate on which to wait.
|
||||
* @param {Number} timeout The maximum number of milliseconds to
|
||||
* wait.
|
||||
* @optional
|
||||
* @param {number} pollInterval The poll interval, in milliseconds.
|
||||
* @default 10
|
||||
*/
|
||||
waitFor: withCallbacks(function waitFor([accept, reject], test, timeout=null, pollInterval=10) {
|
||||
let end = timeout && Date.now() + timeout, result;
|
||||
|
||||
let timer = services.Timer(
|
||||
() => {
|
||||
try {
|
||||
var result = test();
|
||||
}
|
||||
catch (e) {
|
||||
timer.cancel();
|
||||
reject(e);
|
||||
}
|
||||
if (result) {
|
||||
timer.cancel();
|
||||
accept(result);
|
||||
}
|
||||
},
|
||||
pollInterval, services.Timer.TYPE_REPEATING_SLACK);
|
||||
}),
|
||||
|
||||
/**
|
||||
* Wraps the given function so that its first argument is an array
|
||||
* of success and failure callbacks which, when called, resolve the
|
||||
* returned promise.
|
||||
*
|
||||
* @param {function} fn The function to wrap.
|
||||
* @returns {Promise}
|
||||
*/
|
||||
withCallback: function withCallback(fn) {
|
||||
return function wrapper(...args) {
|
||||
let deferred = Promise.defer();
|
||||
function callback(arg) {
|
||||
deferred.resolve(arg);
|
||||
}
|
||||
return fn.apply(this, [callback].concat(args));
|
||||
}
|
||||
},
|
||||
withCallbacks: withCallbacks,
|
||||
});
|
||||
|
||||
endModule();
|
||||
|
||||
@@ -382,7 +382,7 @@ var Styles = Module("Styles", {
|
||||
return val;
|
||||
},
|
||||
|
||||
completeSite: function (context, content, group = styles.user) {
|
||||
completeSite: function (context, content, group=styles.user) {
|
||||
context.anchored = false;
|
||||
try {
|
||||
context.fork("current", 0, this, function (context) {
|
||||
|
||||
@@ -467,7 +467,7 @@ var Template = Module("Template", {
|
||||
["td", { style: style[i] || "" }, d])])];
|
||||
},
|
||||
|
||||
usage: function usage(iter, format = {}) {
|
||||
usage: function usage(iter, format={}) {
|
||||
let desc = format.description || (item => this.linkifyHelp(item.description));
|
||||
let help = format.help || (item => item.name);
|
||||
let sourceLink = (frame) => {
|
||||
|
||||
@@ -10,7 +10,7 @@ try {
|
||||
|
||||
defineModule("util", {
|
||||
exports: ["DOM", "$", "FailedAssertion", "Math", "NS", "Point", "Util", "XBL", "XHTML", "XUL", "util"],
|
||||
require: ["dom", "services"]
|
||||
require: ["dom", "promises", "services"]
|
||||
});
|
||||
|
||||
lazyRequire("overlay", ["overlay"]);
|
||||
@@ -750,10 +750,10 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
||||
*
|
||||
* @returns {XMLHttpRequest}
|
||||
*/
|
||||
httpGet: function httpGet(url, callback, self) {
|
||||
let params = callback;
|
||||
if (!isObject(params))
|
||||
params = { callback: params && ((...args) => callback.apply(self, args)) };
|
||||
httpGet: function httpGet(url, params, self) {
|
||||
if (callable(params))
|
||||
// Deprecated.
|
||||
params = { callback: params.bind(self) };
|
||||
|
||||
try {
|
||||
let xmlhttp = services.Xmlhttp();
|
||||
@@ -761,8 +761,8 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
||||
|
||||
let async = params.callback || params.onload || params.onerror;
|
||||
if (async) {
|
||||
xmlhttp.addEventListener("load", function handler(event) { util.trapErrors(params.onload || params.callback, params, xmlhttp, event); }, false);
|
||||
xmlhttp.addEventListener("error", function handler(event) { util.trapErrors(params.onerror || params.callback, params, xmlhttp, event); }, false);
|
||||
xmlhttp.addEventListener("load", event => { util.trapErrors(params.onload || params.callback, params, xmlhttp, event); }, false);
|
||||
xmlhttp.addEventListener("error", event => { util.trapErrors(params.onerror || params.callback, params, xmlhttp, event); }, false);
|
||||
}
|
||||
|
||||
if (isObject(params.params)) {
|
||||
@@ -810,6 +810,22 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Like #httpGet, but returns a promise rather than accepting
|
||||
* callbacks.
|
||||
*
|
||||
* @param {string} url The URL to fetch.
|
||||
* @param {object} params Parameter object, as in #httpGet.
|
||||
*/
|
||||
fetchUrl: promises.withCallbacks(function fetchUrl([accept, reject, deferred], url, params) {
|
||||
params = update({}, params);
|
||||
params.onload = accept;
|
||||
params.onerror = reject;
|
||||
|
||||
let req = this.httpGet(url, params);
|
||||
promises.oncancel(deferred, req.cancel);
|
||||
}),
|
||||
|
||||
/**
|
||||
* The identity function.
|
||||
*
|
||||
@@ -1555,7 +1571,7 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
||||
* Waits for the function *test* to return true, or *timeout*
|
||||
* milliseconds to expire.
|
||||
*
|
||||
* @param {function} test The predicate on which to wait.
|
||||
* @param {function|Promise} test The predicate on which to wait.
|
||||
* @param {object} self The 'this' object for *test*.
|
||||
* @param {Number} timeout The maximum number of milliseconds to
|
||||
* wait.
|
||||
@@ -1565,6 +1581,15 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
||||
* thrown.
|
||||
*/
|
||||
waitFor: function waitFor(test, self, timeout, interruptable) {
|
||||
if (!callable(test)) {
|
||||
let done = false;
|
||||
var promise = test,
|
||||
retVal;
|
||||
promise.then((arg) => { retVal = arg; done = true; },
|
||||
(arg) => { retVal = arg; done = true; });
|
||||
test = () => done;
|
||||
}
|
||||
|
||||
let end = timeout && Date.now() + timeout, result;
|
||||
|
||||
let timer = services.Timer(function () {}, 10, services.Timer.TYPE_REPEATING_SLACK);
|
||||
@@ -1575,7 +1600,7 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
||||
finally {
|
||||
timer.cancel();
|
||||
}
|
||||
return result;
|
||||
return promise ? retVal: result;
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -1595,7 +1620,7 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
||||
* @returns {function} A new function which may not execute
|
||||
* synchronously.
|
||||
*/
|
||||
yieldable: function yieldable(func)
|
||||
yieldable: deprecated("Task.spawn", function yieldable(func)
|
||||
function magic() {
|
||||
let gen = func.apply(this, arguments);
|
||||
(function next() {
|
||||
@@ -1604,7 +1629,7 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
||||
}
|
||||
catch (e if e instanceof StopIteration) {};
|
||||
})();
|
||||
},
|
||||
}),
|
||||
|
||||
/**
|
||||
* Wraps a callback function such that its errors are not lost. This
|
||||
|
||||
Reference in New Issue
Block a user