From 86f0bd6193e5fae5fd2de0a70443cfd2b76d79b7 Mon Sep 17 00:00:00 2001 From: Nicolas Stepien Date: Sun, 5 Feb 2012 21:49:22 +0100 Subject: [PATCH] Fix some compatibility issues with file drag'n'drop. Close #181. --- 4chan_x.user.js | 31 +++++++++++++++++++------------ changelog | 1 + script.coffee | 27 +++++++++++++++++---------- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/4chan_x.user.js b/4chan_x.user.js index 518403e65..8ff06921d 100644 --- a/4chan_x.user.js +++ b/4chan_x.user.js @@ -1231,8 +1231,10 @@ qr.dialog(); if (conf['Auto Hide QR']) qr.hide(); } - $.on(d, 'dragover', qr.fileDrop); - $.on(d, 'drop', qr.fileDrop); + $.on(d, 'dragover', qr.dragOver); + $.on(d, 'drop', qr.dropFile); + $.on(d, 'dragstart', qr.drag); + $.on(d, 'dragend', qr.drag); return window.location = 'javascript:void(Recaptcha.focus_response_field=function(){})'; }, open: function() { @@ -1355,17 +1357,22 @@ ta.focus(); return ta.selectionEnd = ta.selectionStart = caretPos + text.length; }, - fileDrop: function(e) { - if (/TEXTAREA|INPUT/.test(e.target.nodeName)) return; + drag: function(e) { + var i; + i = e.type === 'dragstart' ? 'off' : 'on'; + $[i](d, 'dragover', qr.dragOver); + return $[i](d, 'drop', qr.dropFile); + }, + dragOver: function(e) { e.preventDefault(); - e.stopPropagation(); - e.dataTransfer.dropEffect = 'copy'; - if (e.type === 'drop') { - if (!e.dataTransfer.files.length) return; - qr.open(); - qr.fileInput.call(e.dataTransfer); - return $.addClass(qr.el, 'dump'); - } + return e.dataTransfer.dropEffect = 'copy'; + }, + dropFile: function(e) { + if (!e.dataTransfer.files.length) return; + e.preventDefault(); + qr.open(); + qr.fileInput.call(e.dataTransfer); + return $.addClass(qr.el, 'dump'); }, fileInput: function() { var file, _i, _len, _ref; diff --git a/changelog b/changelog index 2a1d87707..4cff966b8 100644 --- a/changelog +++ b/changelog @@ -5,6 +5,7 @@ master Increase Sauce linking possibilites: Thumbnails, full images, MD5 hashes. Unread Favicon is now optional, independent of Unread Count. + Fix some compatibility issues with file drag and drop, notably with QuickDrag extension. 2.25.5 - Mayhem diff --git a/script.coffee b/script.coffee index 4caf717f9..edf308c21 100644 --- a/script.coffee +++ b/script.coffee @@ -889,8 +889,10 @@ qr = if conf['Persistent QR'] qr.dialog() qr.hide() if conf['Auto Hide QR'] - $.on d, 'dragover', qr.fileDrop - $.on d, 'drop', qr.fileDrop + $.on d, 'dragover', qr.dragOver + $.on d, 'drop', qr.dropFile + $.on d, 'dragstart', qr.drag + $.on d, 'dragend', qr.drag # prevent original captcha input from being focused on reload window.location = 'javascript:void(Recaptcha.focus_response_field=function(){})' @@ -1000,16 +1002,21 @@ qr = # Move the caret to the end of the new quote. ta.selectionEnd = ta.selectionStart = caretPos + text.length - fileDrop: (e) -> - return if /TEXTAREA|INPUT/.test e.target.nodeName + drag: (e) -> + # Let it drag anything from the page. + i = if e.type is 'dragstart' then 'off' else 'on' + $[i] d, 'dragover', qr.dragOver + $[i] d, 'drop', qr.dropFile + dragOver: (e) -> e.preventDefault() - e.stopPropagation() e.dataTransfer.dropEffect = 'copy' # cursor feedback - if e.type is 'drop' - return unless e.dataTransfer.files.length # let it only drop files - qr.open() - qr.fileInput.call e.dataTransfer - $.addClass qr.el, 'dump' + dropFile: (e) -> + # Let it only handle files from the desktop. + return unless e.dataTransfer.files.length + e.preventDefault() + qr.open() + qr.fileInput.call e.dataTransfer + $.addClass qr.el, 'dump' fileInput: -> qr.cleanError() # Set or change current reply's file.