From b7a3f8d2fb810aeb113529246b2d4f69070a67c1 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Thu, 10 Mar 2011 10:58:02 -0500 Subject: [PATCH] Fix some unnecessary error reports for invalid jar: URLs. Also complete the JAR file portion of the URL. --- common/modules/completion.jsm | 9 ++++++++- common/modules/io.jsm | 8 ++++++-- common/modules/util.jsm | 2 +- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/common/modules/completion.jsm b/common/modules/completion.jsm index b7a34e54..1e8dbbaa 100644 --- a/common/modules/completion.jsm +++ b/common/modules/completion.jsm @@ -340,7 +340,7 @@ var CompletionContext = Class("CompletionContext", { get itemPrototype() { let res = {}; function result(quote) { - yield ["result", quote ? function () quote[0] + quote[1](this.text) + quote[2] + yield ["result", quote ? function () quote[0] + util.trapErrors(1, quote, this.text) + quote[2] : function () this.text]; }; for (let i in iter(this.keys, result(this.quote))) { @@ -903,6 +903,13 @@ var Completion = Module("completion", { // depending on the 'complete' option // if the 'complete' argument is passed like "h", it temporarily overrides the complete option url: function url(context, complete) { + if (/^jar:[^!]*$/.test(context.filter)) { + context.advance(4); + + context.quote = context.quote || ["", util.identity, ""]; + let quote = context.quote[1]; + context.quote[1] = function (str) quote(str.replace(/!/g, escape)); + } if (this.options["urlseparator"]) var skip = util.regexp("^.*" + this.options["urlseparator"] + "\\s*") diff --git a/common/modules/io.jsm b/common/modules/io.jsm index ce55a0bd..0d7223b9 100644 --- a/common/modules/io.jsm +++ b/common/modules/io.jsm @@ -354,7 +354,7 @@ var IO = Module("io", { */ listJar: function listJar(file, path) { file = util.getFile(file); - if (file) { + if (file && file.exists() && file.isFile() && file.isReadable()) { // let jar = services.zipReader.getZip(file); Crashes. let jar = services.ZipReader(file); try { @@ -366,7 +366,8 @@ var IO = Module("io", { yield entry; } finally { - jar.close(); + if (jar) + jar.close(); } } }, @@ -878,6 +879,9 @@ unlet s:cpo_save }; completion.file = function file(context, full, dir) { + if (/^jar:[^!]*$/.test(context.filter)) + context.advance(4); + // dir == "" is expanded inside readDirectory to the current dir function getDir(str) str.match(/^(?:.*[\/\\])?/)[0]; dir = getDir(dir || context.filter); diff --git a/common/modules/util.jsm b/common/modules/util.jsm index 311bac63..3c01d530 100644 --- a/common/modules/util.jsm +++ b/common/modules/util.jsm @@ -1722,7 +1722,7 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]), */ trapErrors: function trapErrors(func, self) { try { - if (isString(func)) + if (!callable(func)) func = self[func]; return func.apply(self || this, Array.slice(arguments, 2)); }