blob: 43dbc8d6d703298069e801fa842e1620dd572d79 [file] [log] [blame] [edit]
<!DOCTYPE html>
<html>
<head>
<title>drag_test.html</title>
<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');
goog.require('goog.testing.jsunit');
</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">
function testClosureFxDragAndDrop() {
// Setup Drag and Drop using goog.fx
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';
});
// Start testing
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);
assertEquals('Wrong x coordinate', rectNew.left, rectOld.left + dx);
assertEquals('Wrong y coordinate', rectNew.top, rectOld.top + dy);
// End of the test
div1.dispose();
div2.dispose();
}
function elementThatMovesDuringDrag(action) {
// IE is not compatible with touch actions.
// Also IE6 does not render this test page properly,
// so we must skip this test for IE6.
if ((action == bot.action.swipe && !bot.events.SUPPORTS_TOUCH_EVENTS) ||
(goog.userAgent.IE && !bot.userAgent.isProductVersion(7))) {
return;
}
// Setup a simple Drag and Drop object
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);
// Start testing
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);
assertEquals(finalRect.left, initRect.left + dx);
assertEquals(finalRect.top, initRect.top + dy);
}
var testDragElementThatMovesDuringDrag = goog.partial(
elementThatMovesDuringDrag, bot.action.drag);
var testSwipeElementThatMovesDuringDrag = goog.partial(
elementThatMovesDuringDrag, bot.action.swipe);
function testElementThatMovesDuringMouseMove(action) {
// IE6 does not render this test page properly,
// so we must skip this test for IE6.
if (goog.userAgent.IE && !bot.userAgent.isProductVersion(7)) {
return;
}
// Tests an element that moves when the mouse moves. Intended to mimic
// an element that acts as a cursor. In bot.action.drag the sequence of
// events is mousemove, mousedown, mousemove, and mouseup where the first
// mousemove is intended to simulate the event for the initial mouseover.
// If an element moves in response to that initial mousemove, we need to
// handle that case.
var CursorDiv = function(element) {
this.element_ = element;
var currentRect = bot.dom.getClientRect(element);
// Initialize to the middle of the 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);
// Start testing
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);
assertEquals(finalRect.left, initRect.left + dx - 15);
assertEquals(finalRect.top, initRect.top + dy - 15);
}
</script>
</head>
<body>
<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>