1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-21 14:57:59 +01:00

Decruftify crufty old gunk, promisify stuff.

This commit is contained in:
Kris Maglione
2015-03-02 19:01:19 -08:00
parent 7b2f821e04
commit 29e614ab74
2 changed files with 78 additions and 98 deletions

View File

@@ -373,7 +373,7 @@ var Editor = Module("editor", XPCOM(Ci.nsIEditActionListener, ModuleBase), {
dactyl.assert(args.length >= 1, _("option.notSet", "editor"));
io.run(args.shift(), args, blocking);
return io.run(args.shift(), args, blocking);
},
// TODO: clean up with 2 functions for textboxes and currentEditor?

View File

@@ -807,8 +807,7 @@ var Buffer = Module("Buffer", {
/**
* Saves the contents of a URI to disk.
*
* @param {nsIURI} uri The URI to save
* @param {nsIFile} file The file into which to write the result.
* @returns {Promise}
*/
saveURI: function saveURI(params) {
if (params instanceof Ci.nsIURI)
@@ -816,42 +815,34 @@ var Buffer = Module("Buffer", {
params = { uri: arguments[0], file: arguments[1],
callback: arguments[2], self: arguments[3] };
var persist = services.Persist();
persist.persistFlags = persist.PERSIST_FLAGS_FROM_CACHE
| persist.PERSIST_FLAGS_REPLACE_EXISTING_FILES;
let promise = new CancelablePromise(promises.task(function* (resolve, reject, canceled) {
if (params.isPrivate === undefined) {
let privacy = sanitizer.getContext(params.context || this.win);
params.isPrivate = privacy.usePrivateBrowsing;
}
let window = this.topWindow;
let privacy = sanitizer.getContext(params.context || this.win);
let file = File(params.file);
if (!file.exists())
file.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0o666);
let downloadListener = new window.DownloadListener(window,
services.Transfer(params.uri, file.URI, "", null, null, null,
persist, privacy && privacy.usePrivateBrowsing));
var { callback, self } = params;
if (callback)
persist.progressListener = update(Object.create(downloadListener), {
onStateChange: util.wrapCallback(function onStateChange(progress, request, flags, status) {
if (callback && (flags & Ci.nsIWebProgressListener.STATE_STOP) && status == 0)
util.trapErrors(callback, self, params.uri, file.file,
progress, request, flags, status);
return onStateChange.superapply(this, arguments);
})
let download = Downloads.createDownload({
source: {
url: params.uri.spec,
isPrivate: params.isPrivate,
referrer: params.referrer,
},
target: params.file,
});
else
persist.progressListener = downloadListener;
canceled.then(download.cancel);
if (persist.saveURI.length <= 7)
persist.saveURI(params.uri, null, null, null, null,
file.file, privacy);
else
// Let's add an extra null to the middle of the arguments
// list, because why not.
persist.saveURI(params.uri, null, null, null, null, null,
file.file, privacy);
let list = yield Downloads.getList(Downloads.ALL);
list.add(download);
return download.start();
}));
// Deprecated.
if (params.callback)
promise.then(() => {
params.callback.call(params.self, params.uri, params.file);
});
return promise;
},
/**
@@ -1235,25 +1226,22 @@ var Buffer = Module("Buffer", {
* immediately.
*
* @param {Document} doc The document to view.
* @param {function|object} callback If a function, the callback to be
* called with two arguments: the nsIFile of the file, and temp, a
* boolean which is true if the file is temporary. Otherwise, an object
* with line and column properties used to determine where to open the
* source.
* @optional
* @returns {Promise}
*/
viewSourceExternally: Class("viewSourceExternally",
XPCOM([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]), {
init: function init(doc, callback) {
this.callback = callable(callback) ? callback :
function (file, temp) {
let { editor } = overlay.activeModules;
viewSourceExternally: function viewSourceExternally(doc, loc) {
return this.fetchSourceExternally(doc).then(([file, isTemp]) => {
let { editor } = overlay.activeModules;
editor.editFileExternally(update({ file: file.path }, callback || {}),
function () { temp && file.remove(false); });
return true;
};
editor.editFileExternally(update({ file: file.path }, loc))
.then(() => {
if (isTemp)
file.remove(false);
});
});
},
fetchSourceExternally: function fetchSourceExternally(doc) {
return new Promise((resolve, reject) => {
if (isString(doc)) {
var privacyContext = null;
var uri = util.newURI(doc);
@@ -1270,41 +1258,28 @@ var Buffer = Module("Buffer", {
}
catch (e) {}
if (!isString(doc))
return io.withTempFiles(function (temp) {
let encoder = services.HtmlEncoder();
encoder.init(doc, "text/unicode", encoder.OutputRaw|encoder.OutputPreformatted);
temp.write(encoder.encodeToString(), ">");
return this.callback(temp, true);
}, this, true, ext);
if (!isString(doc)) {
let file = io.createTempFile();
let encoder = services.HtmlEncoder();
encoder.init(doc, "text/unicode", encoder.OutputRaw|encoder.OutputPreformatted);
let file = util.getFile(uri);
if (file)
this.callback(file, false);
OS.File.writeAtomic(file.path, encoder.encodeToString())
.then(() => { resolve([file, true]) })
.catch(reject);
}
else {
this.file = io.createTempFile();
var persist = services.Persist();
persist.persistFlags = persist.PERSIST_FLAGS_REPLACE_EXISTING_FILES;
persist.progressListener = this;
persist.saveURI(uri, null, null, null, null, this.file,
privacyContext);
}
return null;
},
onStateChange: function onStateChange(progress, request, flags, status) {
if ((flags & this.STATE_STOP) && status == 0) {
try {
var ok = this.callback(this.file, true);
}
finally {
if (ok !== true)
this.file.remove(false);
let file = util.getFile(uri);
if (file)
resolve([file, false]);
else {
let file = io.createTempFile();
Downloads.fetch(uri, file.file).then(() => {
resolve([file, true]);
}).catch(reject);
}
}
return 0;
}
}),
});
},
/**
* Increases the zoom level of the current buffer.
@@ -1956,27 +1931,32 @@ var Buffer = Module("Buffer", {
let command = commandline.command;
if (filename) {
if (filename[0] == "!")
return buffer.viewSourceExternally(buffer.focusedFrame.document,
function (file) {
let output = io.system(filename.substr(1), file);
commandline.command = command;
commandline.commandOutput(["span", { highlight: "CmdOutput" }, output]);
});
return buffer.fetchSourceExternally(buffer.focusedFrame.document)
.then(([file, isTemp]) => {
let output = io.system(filename.substr(1), file);
if (isTemp)
file.remove(false);
commandline.command = command;
commandline.commandOutput(["span", { highlight: "CmdOutput" }, output]);
});
if (/^>>/.test(filename)) {
let file = io.File(filename.replace(/^>>\s*/, ""));
dactyl.assert(args.bang || file.exists() && file.isWritable(),
_("io.notWriteable", JSON.stringify(file.path)));
return buffer.viewSourceExternally(buffer.focusedFrame.document,
function (tmpFile) {
try {
file.write(tmpFile, ">>");
}
catch (e) {
dactyl.echoerr(_("io.notWriteable", JSON.stringify(file.path)));
}
});
return buffer.fetchSourceExternally(buffer.focusedFrame.document)
.then(([tmpFile, isTemp]) => {
try {
file.write(tmpFile, ">>");
}
catch (e) {
dactyl.echoerr(_("io.notWriteable", JSON.stringify(file.path)));
}
if (isTemp)
tmpFile.remove();
});
}
let file = io.File(filename);