Fix file upload for Firefox. Fix xhr abortion request.

This commit is contained in:
Nicolas Stepien 2012-01-22 02:19:48 +01:00
parent 87da955036
commit 239ea5180f
2 changed files with 30 additions and 8 deletions

View File

@ -1538,15 +1538,17 @@
return $.add(d.body, qr.el); return $.add(d.body, qr.el);
}, },
submit: function(e) { submit: function(e) {
var captcha, captchas, challenge, err, len, m, now, reply, response, _ref; var bb, blob, captcha, captchas, challenge, err, m, now, reply, response;
if (e != null) e.preventDefault(); if (e != null) e.preventDefault();
if ((_ref = qr.ajax) != null) _ref.abort(); qr.message.send({
abort: true
});
reply = qr.replies[0]; reply = qr.replies[0];
if (!(reply.com || reply.file)) { if (!(reply.com || reply.file)) {
err = 'Error: No file selected.'; err = 'Error: No file selected.';
} else { } else {
captchas = $.get('captchas', []); captchas = $.get('captchas', []);
if (len = captchas.length) { if (captchas.length) {
now = Date.now(); now = Date.now();
while (captchas[0].time < now) { while (captchas[0].time < now) {
captchas.shift(); captchas.shift();
@ -1572,6 +1574,11 @@
$.id('autohide').checked = true; $.id('autohide').checked = true;
qr.hide(); qr.hide();
} }
if (engine === 'gecko' && reply.file) {
bb = new MozBlobBuilder();
bb.append(reply.file);
blob = bb.getBlob(reply.file.type);
}
return qr.message.send({ return qr.message.send({
board: g.BOARD, board: g.BOARD,
resto: g.THREAD_ID || $('select', qr.el).value, resto: g.THREAD_ID || $('select', qr.el).value,
@ -1579,7 +1586,7 @@
email: reply.email, email: reply.email,
sub: reply.sub, sub: reply.sub,
com: reply.com, com: reply.com,
upfile: reply.file, upfile: blob || reply.file,
mode: 'regist', mode: 'regist',
pwd: (m = d.cookie.match(/4chan_pass=([^;]+)/)) ? decodeURIComponent(m[1]) : $('input[name=pwd]').value, pwd: (m = d.cookie.match(/4chan_pass=([^;]+)/)) ? decodeURIComponent(m[1]) : $('input[name=pwd]').value,
recaptcha_challenge_field: challenge, recaptcha_challenge_field: challenge,
@ -1628,7 +1635,11 @@
return postMessage(data, '*'); return postMessage(data, '*');
}, },
receive: function(data) { receive: function(data) {
var form, name, url, val; var form, name, url, val, _ref;
if (data.abort) {
if ((_ref = qr.ajax) != null) _ref.abort();
return;
}
delete data.qr; delete data.qr;
if (data.mode === 'regist') { if (data.mode === 'regist') {
url = "http://sys.4chan.org/" + data.board + "/post?" + (Date.now()); url = "http://sys.4chan.org/" + data.board + "/post?" + (Date.now());

View File

@ -1157,7 +1157,7 @@ qr =
submit: (e) -> submit: (e) ->
e?.preventDefault() e?.preventDefault()
qr.ajax?.abort() qr.message.send abort: true
reply = qr.replies[0] reply = qr.replies[0]
# prevent errors # prevent errors
@ -1166,7 +1166,7 @@ qr =
else else
# get oldest valid captcha # get oldest valid captcha
captchas = $.get 'captchas', [] captchas = $.get 'captchas', []
if len = captchas.length if captchas.length
# remove old captchas # remove old captchas
now = Date.now() now = Date.now()
while captchas[0].time < now while captchas[0].time < now
@ -1192,6 +1192,14 @@ qr =
$.id('autohide').checked = true $.id('autohide').checked = true
qr.hide() 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 qr.message.send
board: g.BOARD board: g.BOARD
resto: g.THREAD_ID or $('select', qr.el).value resto: g.THREAD_ID or $('select', qr.el).value
@ -1199,7 +1207,7 @@ qr =
email: reply.email email: reply.email
sub: reply.sub sub: reply.sub
com: reply.com com: reply.com
upfile: reply.file upfile: blob or reply.file
mode: 'regist' mode: 'regist'
pwd: if m = d.cookie.match(/4chan_pass=([^;]+)/) then decodeURIComponent m[1] else $('input[name=pwd]').value pwd: if m = d.cookie.match(/4chan_pass=([^;]+)/) then decodeURIComponent m[1] else $('input[name=pwd]').value
recaptcha_challenge_field: challenge recaptcha_challenge_field: challenge
@ -1249,6 +1257,9 @@ qr =
data.qr = true data.qr = true
postMessage data, '*' postMessage data, '*'
receive: (data) -> receive: (data) ->
if data.abort
qr.ajax?.abort()
return
delete data.qr delete data.qr
if data.mode is 'regist' # reply object: we're posting if data.mode is 'regist' # reply object: we're posting
# fool CloudFlare's cache to hopefully avoid connection errors # fool CloudFlare's cache to hopefully avoid connection errors