From c2bd74260b012bf5de8ddd0d9dc0499be2ce9c76 Mon Sep 17 00:00:00 2001 From: Nicolas Stepien Date: Sun, 22 Jan 2012 05:10:48 +0100 Subject: [PATCH] Supposedly actually fix file upload on Firefox. --- 4chan_x.user.js | 35 ++++++++++++++++++++++++----------- script.coffee | 34 +++++++++++++++++++++++----------- 2 files changed, 47 insertions(+), 22 deletions(-) diff --git a/4chan_x.user.js b/4chan_x.user.js index e33689229..4b50b815e 100644 --- a/4chan_x.user.js +++ b/4chan_x.user.js @@ -1538,7 +1538,7 @@ return $.add(d.body, qr.el); }, submit: function(e) { - var bb, blob, captcha, captchas, challenge, err, m, now, reply, response; + var captcha, captchas, challenge, err, file, m, now, post, reader, reply, response; if (e != null) e.preventDefault(); qr.message.send({ abort: true @@ -1574,28 +1574,36 @@ $.id('autohide').checked = true; qr.hide(); } - if (engine === 'gecko' && reply.file) { - bb = new MozBlobBuilder(); - bb.append(reply.file); - blob = bb.getBlob(reply.file.type); - } - return qr.message.send({ + post = { board: g.BOARD, resto: g.THREAD_ID || $('select', qr.el).value, name: reply.name, email: reply.email, sub: reply.sub, com: reply.com, - upfile: blob || reply.file, + upfile: reply.file, mode: 'regist', pwd: (m = d.cookie.match(/4chan_pass=([^;]+)/)) ? decodeURIComponent(m[1]) : $('input[name=pwd]').value, recaptcha_challenge_field: challenge, recaptcha_response_field: response - }); + }; + if (engine === 'gecko' && reply.file) { + file = {}; + reader = new FileReader(); + reader.onload = function() { + file.buffer = this.result; + file.type = reply.file.type; + post.upfile = file; + return qr.message.send(post); + }; + reader.readAsArrayBuffer(reply.file); + return; + } + return qr.message.send(post); }, response: function(e) { var reply, sage; - log(e, qr.ajax); + log(e); return; if (!(conf['Persistent QR'] || qr.replies.length > 1)) qr.close(); sage = /sage/i.test(reply.email); @@ -1635,7 +1643,7 @@ return postMessage(data, '*'); }, receive: function(data) { - var form, name, url, val, _ref; + var bb, form, name, url, val, _ref; if (data.abort) { if ((_ref = qr.ajax) != null) _ref.abort(); return; @@ -1644,6 +1652,11 @@ if (data.mode === 'regist') { url = "http://sys.4chan.org/" + data.board + "/post?" + (Date.now()); delete data.board; + if (engine === 'gecko' && data.upfile) { + bb = new MozBlobBuilder(); + bb.append(data.upfile.buffer); + data.upfile = bb.getBlob(data.upfile.type); + } form = new FormData(); for (name in data) { val = data[name]; diff --git a/script.coffee b/script.coffee index 8eb0dc0ea..8f02da31e 100644 --- a/script.coffee +++ b/script.coffee @@ -1192,29 +1192,37 @@ qr = $.id('autohide').checked = true qr.hide() - if engine is 'gecko' and reply.file - # https://bugzilla.mozilla.org/show_bug.cgi?id=673742 - # We plan to allow postMessaging Files and FileLists across origins, - # that just needs a more in depth security review. - bb = new MozBlobBuilder() - bb.append reply.file - blob = bb.getBlob reply.file.type - - qr.message.send + post = board: g.BOARD resto: g.THREAD_ID or $('select', qr.el).value name: reply.name email: reply.email sub: reply.sub com: reply.com - upfile: blob or reply.file + upfile: reply.file mode: 'regist' pwd: if m = d.cookie.match(/4chan_pass=([^;]+)/) then decodeURIComponent m[1] else $('input[name=pwd]').value recaptcha_challenge_field: challenge recaptcha_response_field: response + if engine is 'gecko' and reply.file + # https://bugzilla.mozilla.org/show_bug.cgi?id=673742 + # We plan to allow postMessaging Files and FileLists across origins, + # that just needs a more in depth security review. + file = {} + reader = new FileReader() + reader.onload = -> + file.buffer = @result + file.type = reply.file.type + post.upfile = file + qr.message.send post + reader.readAsArrayBuffer reply.file + return + + qr.message.send post + response: (e) -> - log e, qr.ajax + log e return # successful posting/error handling @@ -1265,6 +1273,10 @@ qr = # fool CloudFlare's cache to hopefully avoid connection errors url = "http://sys.4chan.org/#{data.board}/post?#{Date.now()}" delete data.board + if engine is 'gecko' and data.upfile + bb = new MozBlobBuilder() + bb.append data.upfile.buffer + data.upfile = bb.getBlob data.upfile.type form = new FormData() for name, val of data form.append name, val if val