diff --git a/lib/ace/mouse/dragdrop_handler.js b/lib/ace/mouse/dragdrop_handler.js index 9da78933..887a6701 100644 --- a/lib/ace/mouse/dragdrop_handler.js +++ b/lib/ace/mouse/dragdrop_handler.js @@ -43,15 +43,11 @@ function DragdropHandler(mouseHandler) { var editor = mouseHandler.editor; - // Safari accepts either image or element (but it must present in the DOM) - var proxy = dom.createElement("img"); + var blankImage = dom.createElement("img"); // Safari crashes without image data - proxy.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; - - if (useragent.isOpera) { - proxy.style.cssText = "width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;visibility:hidden"; - editor.container.appendChild(proxy); - } + blankImage.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + if (useragent.isOpera) + blankImage.style.cssText = "width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;"; var exports = ["dragWait", "dragWaitEnd", "startDrag", "dragReadyEnd", "onMouseDrag"]; @@ -80,17 +76,19 @@ function DragdropHandler(mouseHandler) { }, 0); return e.preventDefault(); } - if (useragent.isOpera) { - proxy.style.visibility = "visible"; - setTimeout(function(){ - proxy.style.visibility = "hidden"; - }, 0); - } range = editor.getSelectionRange(); var dataTransfer = e.dataTransfer; dataTransfer.effectAllowed = editor.getReadOnly() ? "copy" : "copyMove"; - dataTransfer.setDragImage && dataTransfer.setDragImage(proxy, 0, 0); + if (useragent.isOpera) { + editor.container.appendChild(blankImage); + // force layout + blankImage._top = blankImage.offsetTop; + } + dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0); + if (useragent.isOpera) { + editor.container.removeChild(blankImage); + } // clear Opera garbage dataTransfer.clearData(); dataTransfer.setData("Text", editor.session.getTextRange());