| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <title>drag_test.html</title> | |
| <link rel="stylesheet" href="/filez/_main/third_party/js/qunit/qunit.css"> | |
| <script src="/filez/_main/third_party/js/qunit/qunit.js"></script> | |
| <script src="/filez/_main/third_party/js/qunit/qunit_test_runner.js"></script> | |
| <script src="test_bootstrap.js"></script> | |
| <script type="text/javascript"> | |
| goog.require('bot.action'); | |
| goog.require('bot.dom'); | |
| goog.require('goog.events'); | |
| goog.require('goog.fx.DragDropGroup'); | |
| goog.require('goog.math.Coordinate'); | |
| </script> | |
| <style type="text/css"> | |
| div#testDiv,div#testDiv2 { | |
| width: 40px; | |
| height: 20px; | |
| top: 25px; | |
| left: 300px; | |
| border: 3px solid #AF0078; | |
| position: absolute; | |
| } | |
| div#testDiv2 { | |
| top: 10px; | |
| left: 200px; | |
| width: 200px; | |
| height: 100px; | |
| z-index: -1; | |
| } | |
| </style> | |
| <script type="text/javascript"> | |
| QUnit.test('closure fx drag and drop', function(assert) { | |
| var testDiv = document.getElementById('testDiv'); | |
| var testDiv2 = document.getElementById('testDiv2'); | |
| var div1 = new goog.fx.DragDropGroup(); | |
| var div2 = new goog.fx.DragDropGroup(); | |
| div1.addItem(testDiv, 'Drag me'); | |
| div2.addItem(testDiv2, 'Destination'); | |
| div1.addTarget(div2); | |
| div1.init(); | |
| div2.init(); | |
| goog.events.listen(div2, 'drop', function(event) { | |
| var dragSrc = event.dragSourceItem; | |
| var elem = event.dragSourceItem.element; | |
| var rect = bot.dom.getClientRect(elem); | |
| elem.style.left = rect.left + | |
| (event.clientX - dragSrc.startPosition_.x) + 'px'; | |
| elem.style.top = rect.top + (event.clientY - dragSrc.startPosition_.y) + | |
| 'px'; | |
| }); | |
| var target = document.getElementById('testDiv'); | |
| var rectOld = bot.dom.getClientRect(target); | |
| var coords = new goog.math.Coordinate(15, 5); | |
| var dx = -75; | |
| var dy = 35; | |
| bot.action.drag(target, dx, dy, 2, coords); | |
| var rectNew = bot.dom.getClientRect(target); | |
| assert.strictEqual(rectNew.left, rectOld.left + dx, 'Wrong x coordinate'); | |
| assert.strictEqual(rectNew.top, rectOld.top + dy, 'Wrong y coordinate'); | |
| div1.dispose(); | |
| div2.dispose(); | |
| }); | |
| function elementThatMovesDuringDrag(assert, action) { | |
| if ((action == bot.action.swipe && !bot.events.SUPPORTS_TOUCH_EVENTS) || | |
| (goog.userAgent.IE && !bot.userAgent.isProductVersion(7))) { | |
| assert.ok(true, 'Skipping: action not supported or IE6'); | |
| return; | |
| } | |
| var DragDropDiv = function(element) { | |
| this.element_ = element; | |
| this.dragging_ = false; | |
| this.x_ = 0; | |
| this.y_ = 0; | |
| if (action == bot.action.drag) { | |
| goog.events.listen(this.element_, goog.events.EventType.MOUSEDOWN, | |
| this.startMove, false, this); | |
| goog.events.listen(this.element_, goog.events.EventType.MOUSEMOVE, | |
| this.move, false, this); | |
| goog.events.listen(this.element_, goog.events.EventType.MOUSEUP, | |
| this.endMove, false, this); | |
| } else { | |
| goog.events.listen(this.element_, goog.events.EventType.TOUCHSTART, | |
| this.startMove, false, this); | |
| goog.events.listen(this.element_, goog.events.EventType.TOUCHMOVE, | |
| this.move, false, this); | |
| goog.events.listen(this.element_, goog.events.EventType.TOUCHEND, | |
| this.endMove, false, this); | |
| } | |
| }; | |
| DragDropDiv.prototype.startMove = function(event) { | |
| this.dragging_ = true; | |
| if (action == bot.action.drag) { | |
| this.x_ = event.clientX; | |
| this.y_ = event.clientY; | |
| } else { | |
| var e = event.getBrowserEvent(); | |
| if (e.touches) { | |
| this.x_ = e.touches[0].clientX; | |
| this.y_ = e.touches[0].clientY; | |
| } | |
| } | |
| }; | |
| DragDropDiv.prototype.move = function(event) { | |
| if (this.dragging_) { | |
| var dx, dy; | |
| if (action == bot.action.drag) { | |
| dx = event.clientX - this.x_; | |
| dy = event.clientY - this.y_; | |
| this.x_ = event.clientX; | |
| this.y_ = event.clientY; | |
| } else { | |
| var e = event.getBrowserEvent(); | |
| dx = e.touches[0].clientX - this.x_; | |
| dy = e.touches[0].clientY - this.y_; | |
| this.x_ = e.touches[0].clientX; | |
| this.y_ = e.touches[0].clientY; | |
| event.preventDefault(); | |
| } | |
| var elementStyle = this.element_.style; | |
| elementStyle.left = parseInt(elementStyle.left) + dx + 'px'; | |
| elementStyle.top = parseInt(elementStyle.top) + dy + 'px'; | |
| } | |
| }; | |
| DragDropDiv.prototype.endMove = function(event) { | |
| this.dragging_ = false; | |
| if (action == bot.action.drag) { | |
| this.x_ = event.clientX; | |
| this.y_ = event.clientY; | |
| } else { | |
| var e = event.getBrowserEvent(); | |
| if (e.changedTouches) { | |
| this.x_ = e.changedTouches[0].clientX; | |
| this.y_ = e.changedTouches[0].clientY; | |
| } | |
| } | |
| }; | |
| var target = document.getElementById('dragDiv'); | |
| var dragDiv = new DragDropDiv(target); | |
| var initRect = bot.dom.getClientRect(target); | |
| var coords = new goog.math.Coordinate(5, 5); | |
| var dx = 25; | |
| var dy = -30; | |
| action(target, dx, dy, 1, coords); | |
| var finalRect = bot.dom.getClientRect(target); | |
| assert.strictEqual(finalRect.left, initRect.left + dx); | |
| assert.strictEqual(finalRect.top, initRect.top + dy); | |
| } | |
| QUnit.test('drag element that moves during drag', function(assert) { | |
| elementThatMovesDuringDrag(assert, bot.action.drag); | |
| }); | |
| QUnit.test('swipe element that moves during drag', function(assert) { | |
| elementThatMovesDuringDrag(assert, bot.action.swipe); | |
| }); | |
| QUnit.test('element that moves during mouse move', function(assert) { | |
| if (goog.userAgent.IE && !bot.userAgent.isProductVersion(7)) { | |
| assert.ok(true, 'Skipping: IE6 does not render this test page properly'); | |
| return; | |
| } | |
| var CursorDiv = function(element) { | |
| this.element_ = element; | |
| var currentRect = bot.dom.getClientRect(element); | |
| this.x_ = currentRect.left + 25; | |
| this.y_ = currentRect.top + 25; | |
| goog.events.listen(this.element_, goog.events.EventType.MOUSEMOVE, | |
| this.move, false, this); | |
| }; | |
| CursorDiv.prototype.move = function(event) { | |
| var dx = event.clientX - this.x_; | |
| var dy = event.clientY - this.y_; | |
| this.x_ = event.clientX; | |
| this.y_ = event.clientY; | |
| var elementStyle = this.element_.style; | |
| elementStyle.left = parseInt(elementStyle.left) + dx + 'px'; | |
| elementStyle.top = parseInt(elementStyle.top) + dy + 'px'; | |
| }; | |
| var target = document.getElementById('cursorDiv'); | |
| var cursorDiv = new CursorDiv(target); | |
| var initRect = bot.dom.getClientRect(target); | |
| var coords = new goog.math.Coordinate(10, 10); | |
| var dx = 100; | |
| var dy = 0; | |
| bot.action.drag(target, dx, dy, 1, coords); | |
| var finalRect = bot.dom.getClientRect(target); | |
| assert.strictEqual(finalRect.left, initRect.left + dx - 15); | |
| assert.strictEqual(finalRect.top, initRect.top + dy - 15); | |
| }); | |
| </script> | |
| </head> | |
| <body> | |
| <div id="qunit"></div> | |
| <div id="qunit-fixture"></div> | |
| <div id="testDiv" style="background-color: red;" >Drag</div> | |
| <div id="testDiv2">Drop inside me.</div> | |
| <div id="dragDiv" style="position:fixed; top:50px; left:50px; | |
| background-color:yellow; -ms-touch-action:none"> Drag Me </div> | |
| <div id="cursorDiv" style="position:fixed; top:100px; left:50px; width:50px; | |
| height:50px; background-color:blue; -ms-touch-action:none"> Cursor </div> | |
| </body> | |
| </html> |