blob: cdaa813cf158356a29563b4f59214a655547304c [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>mouse_test</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.Mouse');
goog.require('bot.action');
goog.require('bot.userAgent');
goog.require('goog.Promise');
goog.require('goog.array');
goog.require('goog.dom');
goog.require('goog.events');
goog.require('goog.events.EventType');
goog.require('goog.math.Coordinate');
goog.require('goog.style');
goog.require('goog.userAgent');
</script>
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
<div id="green" style="background-color:green; width:100px; height:50px">
<div id="red" style="background-color:red; width:50px; height:25px;
position: relative; top:25px;">Red</div>
</div>
<div id="capture" style="background-color:blue; width:100px; height:50px">
<div id="innerCapture" style="background-color:cyan;
width:50px;
height:25px;">
</div>
</div>
<script type="text/javascript">
goog.events.EventType.MOUSEWHEEL =
goog.userAgent.GECKO ? 'DOMMouseScroll' : 'mousewheel';
goog.events.EventType.MOUSEPIXELSCROLL = 'MozMousePixelScroll';
var events = [];
var greenDiv, redDiv, captureDiv, innerCaptureDiv;
var MOUSE_EVENTS = [
goog.events.EventType.MOUSEOUT,
goog.events.EventType.MOUSEOVER,
goog.events.EventType.MOUSEMOVE,
goog.events.EventType.MOUSEDOWN,
goog.events.EventType.MOUSEUP,
goog.events.EventType.MOUSEWHEEL,
goog.events.EventType.MOUSEPIXELSCROLL,
goog.events.EventType.CLICK,
goog.events.EventType.CONTEXTMENU,
goog.events.EventType.DBLCLICK,
goog.events.EventType.MSPOINTERDOWN,
goog.events.EventType.MSPOINTERMOVE,
goog.events.EventType.MSPOINTEROVER,
goog.events.EventType.MSPOINTEROUT,
goog.events.EventType.MSPOINTERUP
];
greenDiv = bot.locators.findElement({id: 'green'});
redDiv = bot.locators.findElement({id: 'red'});
captureDiv = bot.locators.findElement({id: 'capture'});
innerCaptureDiv = bot.locators.findElement({id: 'innerCapture'});
QUnit.testStart(function() {
bot.getDocument().documentElement.focus();
events = [];
goog.events.removeAll(greenDiv);
goog.events.removeAll(redDiv);
goog.events.removeAll(captureDiv);
goog.events.removeAll(innerCaptureDiv);
goog.events.listen(greenDiv, MOUSE_EVENTS, function(e) {
events.push(e.type);
events.push(e.target);
events.push(e.button);
});
goog.events.listen(captureDiv, MOUSE_EVENTS, function(e) {
events.push(e.type);
events.push(e.target);
events.push(e.button);
if (e.type == goog.events.EventType.MSPOINTERDOWN) {
captureDiv.msSetPointerCapture(e.getBrowserEvent().pointerId);
}
});
});
function b(button) {
return bot.userAgent.IE_DOC_9 || goog.userAgent.WEBKIT ? button['wk'] :
(goog.userAgent.IE ? button['ie'] :
button['ff']);
}
function assertEvents(assert, var_args) {
var expectedEvents = goog.array.concat.apply(null, Array.prototype.slice.call(arguments, 1));
assert.deepEqual(events, expectedEvents);
events = [];
}
function mousedownEvents(elem, button) {
var evts = [goog.events.EventType.MOUSEDOWN, elem, button];
return !bot.userAgent.IE_DOC_10 ? evts :
[goog.events.EventType.MSPOINTERDOWN, elem, button].concat(evts);
}
function mousemoveEvents(elem, button) {
var evts = [goog.events.EventType.MOUSEMOVE, elem, button];
return bot.userAgent.IE_DOC_10 ?
[goog.events.EventType.MSPOINTERMOVE, elem, -1].concat(evts) :
evts;
}
function mouseoutEvents(elem, button) {
var evts = [goog.events.EventType.MOUSEOUT, elem, button];
return bot.userAgent.IE_DOC_10 ?
[goog.events.EventType.MSPOINTEROUT, elem, -1].concat(evts) :
evts;
}
function mouseupEvents(elem, button) {
var evts = [goog.events.EventType.MOUSEUP, elem, button];
return bot.userAgent.IE_DOC_10 ?
[goog.events.EventType.MSPOINTERUP, elem, button].concat(evts) :
evts;
}
function mouseoverAndMoveEvents(elem, button) {
function mouseoverEvents(elem, button) {
var evts = [goog.events.EventType.MOUSEOVER, elem, button];
return bot.userAgent.IE_DOC_10 ?
[goog.events.EventType.MSPOINTEROVER, elem, -1].concat(evts) :
evts;
}
return goog.userAgent.IE ?
mousemoveEvents(elem, button).concat(
mouseoverEvents(elem, bot.userAgent.IE_DOC_9 ? button : 0)) :
mouseoverEvents(elem, button).concat(mousemoveEvents(elem, button));
}
QUnit.test('no click when press hidden element', function(assert) {
var coords = new goog.math.Coordinate(5, 5);
var mouse = new bot.Mouse();
mouse.move(greenDiv, coords);
goog.style.showElement(greenDiv, false);
mouse.pressButton(bot.Mouse.Button.LEFT);
mouse.releaseButton();
assertEvents(assert, mouseoverAndMoveEvents(greenDiv, 0));
goog.style.showElement(greenDiv, true);
});
QUnit.test('left click', function(assert) {
var coords = new goog.math.Coordinate(5, 5);
var mouse = new bot.Mouse();
mouse.move(redDiv, coords);
mouse.pressButton(bot.Mouse.Button.LEFT);
mouse.releaseButton();
assertEvents(assert,
mouseoverAndMoveEvents(redDiv, 0),
mousedownEvents(redDiv, b({ie: 1, wk: 0, ff: 0})),
mouseupEvents(redDiv, b({ie: 1, wk: 0, ff: 0})),
goog.events.EventType.CLICK, redDiv, 0
);
});
QUnit.test('no left click when released over other element', function(assert) {
var coords = new goog.math.Coordinate(5, 5);
var mouse = new bot.Mouse();
mouse.move(greenDiv, coords);
mouse.pressButton(bot.Mouse.Button.LEFT);
mouse.move(redDiv, coords);
mouse.releaseButton();
assertEvents(assert,
mouseoverAndMoveEvents(greenDiv, 0),
mousedownEvents(greenDiv, b({ie: 1, wk: 0, ff: 0})),
mouseoutEvents(greenDiv, 0),
mouseoverAndMoveEvents(redDiv, b({ie: 1, wk: 0, ff: 0})),
mouseupEvents(redDiv, b({ie: 1, wk: 0, ff: 0}))
);
});
QUnit.test('right click', function(assert) {
var coords = new goog.math.Coordinate(5, 5);
var mouse = new bot.Mouse();
mouse.move(greenDiv, coords);
mouse.pressButton(bot.Mouse.Button.RIGHT);
mouse.move(redDiv, coords);
mouse.releaseButton();
var expectUninitializedButtons =
goog.userAgent.product.CHROME && goog.userAgent.product.isVersion(60);
var wkButtonData;
if (expectUninitializedButtons) {
wkButtonData = 0;
} else {
wkButtonData = 2;
}
assertEvents(assert,
mouseoverAndMoveEvents(greenDiv, 0),
mousedownEvents(greenDiv, 2),
mouseoutEvents(greenDiv, b({ie: 2, wk: wkButtonData, ff: 0})),
mouseoverAndMoveEvents(redDiv, b({ie: 2, wk: wkButtonData, ff: 0})),
mouseupEvents(redDiv, 2),
goog.events.EventType.CONTEXTMENU, redDiv, b({ie: 0, wk: 2, ff: 2})
);
});
QUnit.test('double click', function(assert) {
var coords = new goog.math.Coordinate(5, 5);
var mouse = new bot.Mouse();
mouse.move(redDiv, coords);
mouse.pressButton(bot.Mouse.Button.LEFT);
mouse.releaseButton();
mouse.pressButton(bot.Mouse.Button.LEFT);
mouse.releaseButton();
assertEvents(assert,
mouseoverAndMoveEvents(redDiv, 0),
mousedownEvents(redDiv, b({ie: 1, wk: 0, ff: 0})),
mouseupEvents(redDiv, b({ie: 1, wk: 0, ff: 0})),
goog.events.EventType.CLICK, redDiv, 0,
mousedownEvents(redDiv, b({ie: 1, wk: 0, ff: 0})),
mouseupEvents(redDiv, b({ie: 1, wk: 0, ff: 0})),
goog.events.EventType.CLICK, redDiv, 0,
goog.events.EventType.DBLCLICK, redDiv, 0
);
});
QUnit.test('no double click when the mouse moves between clicks', function(assert) {
var coords = new goog.math.Coordinate(5, 5);
var mouse = new bot.Mouse();
mouse.move(greenDiv, coords);
mouse.pressButton(bot.Mouse.Button.LEFT);
mouse.releaseButton();
mouse.move(redDiv, coords);
mouse.pressButton(bot.Mouse.Button.LEFT);
mouse.releaseButton();
assertEvents(assert,
mouseoverAndMoveEvents(greenDiv, 0),
mousedownEvents(greenDiv, b({ie: 1, wk: 0, ff: 0})),
mouseupEvents(greenDiv, b({ie: 1, wk: 0, ff: 0})),
goog.events.EventType.CLICK, greenDiv, 0,
mouseoutEvents(greenDiv, 0),
mouseoverAndMoveEvents(redDiv, 0),
mousedownEvents(redDiv, b({ie: 1, wk: 0, ff: 0})),
mouseupEvents(redDiv, b({ie: 1, wk: 0, ff: 0})),
goog.events.EventType.CLICK, redDiv, 0
);
});
QUnit.test('move on same element', function(assert) {
var coords1 = new goog.math.Coordinate(5, 5);
var coords2 = new goog.math.Coordinate(10, 5);
var mouse = new bot.Mouse();
mouse.move(greenDiv, coords1);
mouse.move(greenDiv, coords2);
assertEvents(assert,
mouseoverAndMoveEvents(greenDiv, 0),
mousemoveEvents(greenDiv, 0)
);
});
QUnit.test('move to another element', function(assert) {
var coords = new goog.math.Coordinate(5, 5);
var mouse = new bot.Mouse();
mouse.move(greenDiv, coords);
mouse.move(redDiv, coords);
assertEvents(assert,
mouseoverAndMoveEvents(greenDiv, 0),
mouseoutEvents(greenDiv, 0),
mouseoverAndMoveEvents(redDiv, 0)
);
});
QUnit.test('first move has null related', function(assert) {
var mouse = new bot.Mouse();
var fired = 0;
goog.events.listenOnce(greenDiv, goog.events.EventType.MOUSEOVER,
function(e) {
fired++;
assert.notOk(e.relatedTarget);
});
mouse.move(greenDiv, new goog.math.Coordinate(5, 5));
assert.strictEqual(fired, 1);
});
QUnit.test('second move has related set', function(assert) {
var mouse = new bot.Mouse();
mouse.move(greenDiv, new goog.math.Coordinate(5, 5));
var fired = 0;
var relatedTarget;
goog.events.listen(redDiv, goog.events.EventType.MOUSEOVER,
function(e) {
fired++;
relatedTarget = e.relatedTarget;
});
mouse.move(redDiv, new goog.math.Coordinate(5, 5));
assert.strictEqual(fired, 1, 'mouseover event not fired');
assert.ok(relatedTarget !== null);
assert.notStrictEqual(relatedTarget, redDiv);
});
QUnit.test('move mouse from closed window does not error', function(assert) {
var done = assert.async();
var mouse = new bot.Mouse();
var coord = new goog.math.Coordinate(0, 0);
var iframe = document.createElement('iframe');
new goog.Promise(function(loaded) {
goog.events.listenOnce(iframe, 'load', loaded);
iframe.src = 'testdata/blank_page.html';
document.body.appendChild(iframe);
}).then(function() {
mouse.move(iframe.contentWindow.document.body, coord);
return new goog.Promise(function(loaded) {
goog.events.listenOnce(iframe, 'load', loaded);
iframe.src = 'testdata/iframe_page.html';
});
}).then(function() {
mouse.move(iframe.contentWindow.document.body, coord);
document.body.removeChild(iframe);
assert.ok(true);
done();
});
});
QUnit.test('move mouse fires all events on element hidden mid sequence', function(assert) {
var coords = new goog.math.Coordinate(5, 5);
var mouse = new bot.Mouse();
mouse.move(greenDiv, coords);
goog.events.listen(greenDiv, 'mouseout', function() {
goog.style.showElement(redDiv, false);
});
mouse.move(redDiv, coords);
goog.style.showElement(redDiv, true);
assertEvents(assert,
mouseoverAndMoveEvents(greenDiv, 0),
mouseoutEvents(greenDiv, 0),
mouseoverAndMoveEvents(redDiv, 0)
);
});
QUnit.test('scroll mouse zero ticks throws error', function(assert) {
var mouse = new bot.Mouse();
mouse.move(greenDiv, new goog.math.Coordinate(5, 5));
assert.throws(function() {
mouse.scroll(0);
});
});
QUnit.test('scroll mouse down', function(assert) {
var mouse = new bot.Mouse();
mouse.move(greenDiv, new goog.math.Coordinate(5, 5));
mouse.scroll(1);
if (goog.userAgent.GECKO) {
assertEvents(assert,
mouseoverAndMoveEvents(greenDiv, 0),
goog.events.EventType.MOUSEWHEEL, greenDiv, 0,
goog.events.EventType.MOUSEPIXELSCROLL, greenDiv, 0
);
} else {
assertEvents(assert,
mouseoverAndMoveEvents(greenDiv, 0),
goog.events.EventType.MOUSEWHEEL, greenDiv, 0
);
}
});
QUnit.test('scroll mouse up', function(assert) {
var mouse = new bot.Mouse();
mouse.move(greenDiv, new goog.math.Coordinate(5, 5));
mouse.scroll(-2);
if (goog.userAgent.GECKO) {
assertEvents(assert,
mouseoverAndMoveEvents(greenDiv, 0),
goog.events.EventType.MOUSEWHEEL, greenDiv, 0,
goog.events.EventType.MOUSEPIXELSCROLL, greenDiv, 0,
goog.events.EventType.MOUSEWHEEL, greenDiv, 0,
goog.events.EventType.MOUSEPIXELSCROLL, greenDiv, 0
);
} else {
assertEvents(assert,
mouseoverAndMoveEvents(greenDiv, 0),
goog.events.EventType.MOUSEWHEEL, greenDiv, 0,
goog.events.EventType.MOUSEWHEEL, greenDiv, 0
);
}
});
QUnit.test('ms set pointer capture', function(assert) {
if (!bot.userAgent.IE_DOC_10) {
assert.ok(true, 'Skipping: IE10 not detected');
return;
}
var coords = new goog.math.Coordinate(75, 5);
var mouse = new bot.Mouse();
mouse.move(captureDiv, coords);
mouse.pressButton(bot.Mouse.Button.LEFT);
mouse.move(greenDiv, coords);
mouse.releaseButton();
assertEvents(assert,
mouseoverAndMoveEvents(captureDiv, 0),
mousedownEvents(captureDiv, 0),
mouseoutEvents(captureDiv, 0),
mouseoverAndMoveEvents(captureDiv, 0),
mouseupEvents(captureDiv, 0)
);
});
QUnit.test('click does not fire on captured pointer', function(assert) {
if (!bot.userAgent.IE_DOC_10) {
assert.ok(true, 'Skipping: IE10 not detected');
return;
}
var mouse = new bot.Mouse();
mouse.move(innerCaptureDiv, new goog.math.Coordinate(5, 5));
mouse.pressButton(bot.Mouse.Button.LEFT);
mouse.move(innerCaptureDiv, new goog.math.Coordinate(6, 6));
mouse.releaseButton();
assertEvents(assert,
mouseoverAndMoveEvents(innerCaptureDiv, 0),
mousedownEvents(innerCaptureDiv, 0),
mousemoveEvents(captureDiv, 0),
mouseupEvents(captureDiv, 0),
goog.events.EventType.CLICK, innerCaptureDiv, 0
);
});
</script>
</body>
</html>