diff --git a/4chan_x.user.js b/4chan_x.user.js index 6563f2c59..37bf5a0e4 100644 --- a/4chan_x.user.js +++ b/4chan_x.user.js @@ -310,6 +310,19 @@ id: function(id) { return d.getElementById(id); }, + formData: function(arg) { + var fd, key, val; + if (arg instanceof HTMLFormElement) { + fd = new FormData(arg); + } else { + fd = new FormData(); + for (key in arg) { + val = arg[key]; + fd.append(key, val); + } + } + return fd; + }, ajax: function(url, callbacks, opts) { var form, headers, key, r, type, upCallbacks, val; if (opts == null) { @@ -317,18 +330,15 @@ } type = opts.type, headers = opts.headers, upCallbacks = opts.upCallbacks, form = opts.form; r = new XMLHttpRequest(); - r.open(type || 'get', url, true); + type || (type = form && 'post' || 'get'); + r.open(type, url, true); for (key in headers) { val = headers[key]; r.setRequestHeader(key, val); } $.extend(r, callbacks); $.extend(r.upload, upCallbacks); - if (typeof form === 'string') { - r.sendAsBinary(form); - } else { - r.send(form); - } + r.send(form); return r; }, cache: function(url, cb) { @@ -1975,7 +1985,7 @@ return QR.el.dispatchEvent(e); }, submit: function(e) { - var callbacks, captcha, captchas, challenge, err, form, m, name, opts, post, reply, response, threadID, val; + var callbacks, captcha, captchas, challenge, err, m, opts, post, reply, response, threadID; if (e != null) { e.preventDefault(); } @@ -2042,13 +2052,6 @@ recaptcha_challenge_field: challenge, recaptcha_response_field: response + ' ' }; - form = new FormData(); - for (name in post) { - val = post[name]; - if (val) { - form.append(name, val); - } - } callbacks = { onload: function() { return QR.response(this.response); @@ -2063,8 +2066,7 @@ } }; opts = { - form: form, - type: 'POST', + form: $.formData(post), upCallbacks: { onload: function() { return QR.status({ diff --git a/script.coffee b/script.coffee index c40a271f3..20083919c 100644 --- a/script.coffee +++ b/script.coffee @@ -265,15 +265,24 @@ $.extend $, cb JSON.parse e.newValue if e.key is "#{Main.namespace}#{key}" id: (id) -> d.getElementById id + formData: (arg) -> + if arg instanceof HTMLFormElement + fd = new FormData arg + else + fd = new FormData() + for key, val of arg + fd.append key, val + fd ajax: (url, callbacks, opts={}) -> {type, headers, upCallbacks, form} = opts r = new XMLHttpRequest() - r.open type or 'get', url, true + type or= form and 'post' or 'get' + r.open type, url, true for key, val of headers r.setRequestHeader key, val $.extend r, callbacks $.extend r.upload, upCallbacks - if typeof form is 'string' then r.sendAsBinary form else r.send form + r.send form r cache: (url, cb) -> if req = $.cache.requests[url] @@ -1546,10 +1555,6 @@ QR = recaptcha_challenge_field: challenge recaptcha_response_field: response + ' ' - form = new FormData() - for name, val of post - form.append name, val if val - callbacks = onload: -> QR.response @response @@ -1562,8 +1567,7 @@ QR = target: '_blank' textContent: 'Connection error, or you are banned.' opts = - form: form - type: 'POST' + form: $.formData post upCallbacks: onload: -> # Upload done, waiting for response.