diff --git a/4chan_x.user.js b/4chan_x.user.js index f9a78f01d..0d5b9ee92 100644 --- a/4chan_x.user.js +++ b/4chan_x.user.js @@ -661,7 +661,9 @@ fd = new FormData(); for (key in form) { val = form[key]; - if (val) { + if (val instanceof Blob) { + fd.append(key, val, val.name); + } else if (val) { fd.append(key, val); } } @@ -5678,6 +5680,9 @@ el: link, order: 10 }); + if ($.engine === 'webkit') { + $.on(d, 'paste', QR.paste); + } $.on(d, 'dragover', QR.dragOver); $.on(d, 'drop', QR.dropFile); $.on(d, 'dragstart dragend', QR.drag); @@ -5980,12 +5985,33 @@ QR.fileInput(e.dataTransfer.files); return $.addClass(QR.nodes.el, 'dump'); }, + paste: function(e) { + var blob, files, item, _i, _len, _ref; + files = []; + _ref = e.clipboardData.items; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + item = _ref[_i]; + if (item.kind === 'file') { + blob = item.getAsFile(); + blob.name = 'file'; + if (blob.type) { + blob.name += '.' + blob.type.split('/')[1]; + } + files.push(blob); + } + } + if (!files.length) { + return; + } + QR.open(); + return QR.fileInput(files); + }, fileInput: function(files) { var file, length, max, post, _i, _len, _ref, _ref1; - if (!(files instanceof FileList)) { + if (files instanceof Event) { files = __slice.call(this.files); + QR.nodes.fileInput.value = null; } - QR.nodes.fileInput.value = null; length = files.length; if (!length) { return; diff --git a/changelog b/changelog index 05f1debf7..cb7ebaa1f 100644 --- a/changelog +++ b/changelog @@ -17,6 +17,7 @@ beta QR changes: Opening text files will insert their content in the comment field. + Pasting files/images (e.g. from another website) in Chrome will open them in the QR. Cooldown start time is now more accurate, which means shorter cooldown period and faster auto-posting. Clicking the submit button while uploading will abort the upload and won't start re-uploading automatically anymore. Closing the QR while uploading will abort the upload and won't close the QR anymore. diff --git a/lib/$.coffee b/lib/$.coffee index 4c1143757..45754181a 100644 --- a/lib/$.coffee +++ b/lib/$.coffee @@ -39,7 +39,10 @@ $.extend $, return new FormData form fd = new FormData() for key, val of form - fd.append key, val if val + if val instanceof Blob + fd.append key, val, val.name + else if val + fd.append key, val fd ajax: (url, callbacks, opts={}) -> {type, headers, upCallbacks, form} = opts diff --git a/src/qr.coffee b/src/qr.coffee index 0ce784329..709093f0d 100644 --- a/src/qr.coffee +++ b/src/qr.coffee @@ -32,6 +32,8 @@ QR = el: link order: 10 + if $.engine is 'webkit' + $.on d, 'paste', QR.paste $.on d, 'dragover', QR.dragOver $.on d, 'drop', QR.dropFile $.on d, 'dragstart dragend', QR.drag @@ -296,10 +298,21 @@ QR = QR.open() QR.fileInput e.dataTransfer.files $.addClass QR.nodes.el, 'dump' + paste: (e) -> + files = [] + for item in e.clipboardData.items + if item.kind is 'file' + blob = item.getAsFile() + blob.name = 'file' + blob.name += '.' + blob.type.split('/')[1] if blob.type + files.push blob + return unless files.length + QR.open() + QR.fileInput files fileInput: (files) -> - unless files instanceof FileList + if files instanceof Event # file input files = [@files...] - QR.nodes.fileInput.value = null # Don't hold the files from being modified on windows + QR.nodes.fileInput.value = null # Don't hold the files from being modified on windows {length} = files return unless length max = QR.nodes.fileInput.max