From 31c6df0257ffa19b2ce935a0a08759b9a06b4cc0 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Wed, 30 Dec 2015 15:56:42 -0800 Subject: [PATCH] Update curl plugin. --- common/modules/dom.jsm | 2 +- common/modules/services.jsm | 2 +- common/modules/util.jsm | 4 ++++ plugins/curl.js | 39 +++++++++++++++++++++++++------------ 4 files changed, 33 insertions(+), 14 deletions(-) diff --git a/common/modules/dom.jsm b/common/modules/dom.jsm index 6bea6575..efcc56b7 100644 --- a/common/modules/dom.jsm +++ b/common/modules/dom.jsm @@ -548,7 +548,7 @@ var DOM = Class("DOM", { let charset = doc.characterSet; let converter = services.CharsetConv(charset); for (let cs of form.acceptCharset.split(/\s*,\s*|\s+/)) { - let c = services.CharsetConv(cs); + let c = cs && services.CharsetConv(cs); if (c) { converter = services.CharsetConv(cs); charset = cs; diff --git a/common/modules/services.jsm b/common/modules/services.jsm index 60dbd740..abf17f33 100644 --- a/common/modules/services.jsm +++ b/common/modules/services.jsm @@ -175,7 +175,7 @@ var Services = Module("Services", { * @param {string} init Name of a property or method used to initialize the * class. */ - addClass: function addClass(name, class_, ifaces, init = null, quiet = false) { + addClass: function addClass(name, class_, ifaces, init = null, quiet = true) { this.services[name] = { class: class_, interfaces: Array.concat(ifaces || []), method: "createInstance", diff --git a/common/modules/util.jsm b/common/modules/util.jsm index b064f442..b76251e9 100644 --- a/common/modules/util.jsm +++ b/common/modules/util.jsm @@ -1543,6 +1543,10 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]), * separators. */ shellEscape: function shellEscape(str) { + // Pass through simple strings without escaping. + if (/^[-+\w/.,/:]+$/.test(str)) + return str; + return '"' + String.replace(str, /[\\"$`]/g, "\\$&") + '"'; }, diff --git a/plugins/curl.js b/plugins/curl.js index 09b2bdd7..e9bd2f2a 100755 --- a/plugins/curl.js +++ b/plugins/curl.js @@ -1,7 +1,7 @@ "use strict"; var INFO = ["plugin", { name: "curl", - version: "0.3", + version: "0.4", href: "http://dactyl.sf.net/pentadactyl/plugins#curl-plugin", summary: "Curl command-line generator", xmlns: "dactyl" }, @@ -25,6 +25,9 @@ var INFO = "page."]]]]; hints.addMode('C', "Generate curl command for a form", function(elem) { + let doc = elem.ownerDocument; + let win = doc.defaultView; + if (elem.form) var { url, postData, elements } = DOM(elem).formData; else @@ -33,19 +36,31 @@ hints.addMode('C', "Generate curl command for a form", function(elem) { if (!url || /^javascript:/.test(url)) return; - url = util.newURI(url, null, - elem.ownerDocument.documentURIObject).spec; + url = util.newURI(url, null, doc.documentURIObject).spec; - let { shellEscape } = util.closure; + if (!elements) + elements = []; - dactyl.clipboardWrite(["curl"].concat( - [].concat( - [["--form-string", shellEscape(datum)] for (datum of (elements || []))], - postData != null && !elements.length ? [["-d", shellEscape("")]] : [], - [["-H", shellEscape("Cookie: " + elem.ownerDocument.cookie)], - ["-A", shellEscape(navigator.userAgent)], - [shellEscape(url)]] - ).map(function(e) e.join(" ")).join(" \\\n ")).join(" "), true); + let paramLines = [ + ...elements.map(datum => ["--form-string", datum]), + + ["-H", "Cookie: " + doc.cookie], + + ["-A", win.navigator.userAgent], + + [url], + ]; + + if (postData != null && !elements.length) + paramLines.unshift(["-d", postData]); + + + let { shellEscape } = util.bound; + let params = paramLines.map(params => params.map(shellEscape).join(" ")) + .join(" \\\n "); + + + dactyl.clipboardWrite(`curl ${params}`, true); }); /* vim:se sts=4 sw=4 et: */