Chromium Code Reviews| Index: LayoutTests/fast/events/touch/gesture/focus-selectionchange-on-tap.html |
| diff --git a/LayoutTests/fast/events/touch/gesture/focus-selectionchange-on-tap.html b/LayoutTests/fast/events/touch/gesture/focus-selectionchange-on-tap.html |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..7007337e385f734a64c526e47568a13330852628 |
| --- /dev/null |
| +++ b/LayoutTests/fast/events/touch/gesture/focus-selectionchange-on-tap.html |
| @@ -0,0 +1,115 @@ |
| +<!DOCTYPE html> |
| +<style> |
| +#target { |
| + position: absolute; |
| + top: 10px; |
| + right: 10px; |
| +} |
| +#target:focus { |
| + background-color: rgb(255, 0, 0); |
| +} |
| +</style> |
| +<input type=text id=target> |
| +<script src="../../../../resources/js-test.js"></script> |
| +<script> |
| +description("Verifies that a GestureTap triggers focus and selectionchange if and only if mousedown isn't prevented."); |
| + |
| +function logEvent(e, opt_extra) { |
| + var msg = 'Received ' + e.type + ' on ' + (e.target.id || e.target.nodeName); |
| + if (opt_extra) |
| + msg += ' ' + opt_extra; |
| + debug(msg); |
| +} |
| + |
| +var target = document.getElementById('target'); |
| +var eventsToLog = ['mousemove', 'mousedown', 'mouseover', 'mouseup', 'mouseout', 'click']; |
| +for (var i = 0; i < eventsToLog.length; i++) { |
| + target.addEventListener(eventsToLog[i], logEvent); |
| +} |
| +document.addEventListener('selectionchange', function(e) { |
| + var selection = getSelection(); |
| + var selectionNode = selection.anchorNode; |
| + var anchor = 'none'; |
| + if (selectionNode) |
| + anchor = (selectionNode.id || selectionNode.nodeName) + '[' + selection.anchorOffset + ']'; |
| + logEvent(e, 'anchor=' + anchor); |
| +}); |
| + |
| +var tapHandled; |
| +function doTap(targetNode, expectHandled) { |
| + var rect = targetNode.getBoundingClientRect(); |
| + var targetX = rect.left + 2; |
| + var targetY = rect.top + 2; |
| + |
| + return new Promise(function(resolve, reject) { |
| + if (!('eventSender' in window)) { |
| + reject(Error('test requires eventSender')); |
| + return; |
| + } |
| + |
| + debug('Sending GestureTapDown'); |
| + eventSender.gestureTapDown(targetX, targetY, 30, 30); |
| + debug('Sending GestureShowPress'); |
| + eventSender.gestureShowPress(targetX, targetY, 30, 30); |
| + debug('Sending GestureTap'); |
| + tapHandled = eventSender.gestureTap(targetX, targetY, 1, 30, 30); |
| + shouldBe('tapHandled', expectHandled ? 'true' : 'false'); |
| + |
| + // Run any pending tasks before resolving the promise. |
|
Zeeshan Qureshi
2014/07/14 19:08:42
Is this for the |selectionchange| event to be fire
Rick Byers
2014/07/14 19:39:59
Yes, and I think the focus event is also fired as
Zeeshan Qureshi
2014/07/14 19:46:05
Yep, I was thinking more of moving it to an explic
|
| + setTimeout(resolve, 0); |
| + }); |
| +} |
| + |
| +function consumeEvent(e) { |
| + e.preventDefault(); |
| +} |
| + |
| +function isFocused(element) { |
| + var style = getComputedStyle(element); |
| + return style.backgroundColor == 'rgb(255, 0, 0)'; |
| +} |
| + |
| +function case1() { |
| + return new Promise(function(resolve, reject) { |
| + debug('Tap on input field but consume mousedown'); |
| + target.addEventListener('mousedown', consumeEvent); |
| + doTap(target, true).then(function() { |
| + shouldBeFalse('isFocused(target)'); |
| + debug(''); |
| + }).then(resolve, reject); |
| + }); |
| +} |
| + |
| +function case2() { |
| + return new Promise(function(resolve, reject) { |
| + debug('Tap on input field without consuming mousedown'); |
| + target.removeEventListener('mousedown', consumeEvent); |
| + doTap(target, false).then(function() { |
| + shouldBeTrue('isFocused(target)'); |
| + debug(''); |
| + }).then(resolve, reject); |
| + }); |
| + |
| +} |
| + |
| +function case3() { |
| + return new Promise(function(resolve, reject) { |
| + debug ('Tap elsewhere to clear focus'); |
| + doTap(document.getElementById('description'), false).then(function() { |
| + shouldBeFalse('isFocused(target)'); |
| + debug(''); |
| + }).then(resolve, reject); |
| + }); |
| +} |
| + |
| +jsTestIsAsync = true; |
| +onload = function() { |
| + case1() |
| + .then(case2) |
| + .then(case3) |
| + .catch(function(err) { |
| + testFailed("Promise rejected: " + err.message); |
| + }).then(finishJSTest); |
| +}; |
| + |
| +</script> |