1
0
Fork 0
mirror of https://github.com/openstf/stf synced 2025-10-04 18:29:17 +02:00

Make sure touch events arrive in correct order.

This commit is contained in:
Simo Kinnunen 2014-04-03 17:13:17 +09:00
parent ceeda2b990
commit c33f0eab09
6 changed files with 68 additions and 22 deletions

View file

@ -248,7 +248,8 @@ module.exports = function(options) {
push.send([ push.send([
channel channel
, wireutil.envelope(new Klass( , wireutil.envelope(new Klass(
data.x data.seq
, data.x
, data.y , data.y
)) ))
]) ])

View file

@ -7,6 +7,7 @@ var devutil = require('../../../util/devutil')
var logger = require('../../../util/logger') var logger = require('../../../util/logger')
var lifecycle = require('../../../util/lifecycle') var lifecycle = require('../../../util/lifecycle')
var streamutil = require('../../../util/streamutil') var streamutil = require('../../../util/streamutil')
var SeqQueue = require('../../../wire/seqqueue')
module.exports = syrup.serial() module.exports = syrup.serial()
.dependency(require('../support/adb')) .dependency(require('../support/adb'))
@ -49,24 +50,35 @@ module.exports = syrup.serial()
return openService() return openService()
.then(function(monkey) { .then(function(monkey) {
var queue = new SeqQueue()
router router
.on(wire.TouchDownMessage, function(channel, message) { .on(wire.TouchDownMessage, function(channel, message) {
monkey.touchDownAsync(message.x, message.y) queue.push(message.seq, function() {
.catch(function(err) { monkey.touchDownAsync(message.x, message.y)
log.error('touchDown failed', err.stack) .catch(function(err) {
}) log.error('touchDown failed', err.stack)
})
})
}) })
.on(wire.TouchMoveMessage, function(channel, message) { .on(wire.TouchMoveMessage, function(channel, message) {
monkey.touchMoveAsync(message.x, message.y) queue.push(message.seq, function() {
.catch(function(err) { monkey.touchMoveAsync(message.x, message.y)
log.error('touchMove failed', err.stack) .catch(function(err) {
}) log.error('touchMove failed', err.stack)
})
})
}) })
.on(wire.TouchUpMessage, function(channel, message) { .on(wire.TouchUpMessage, function(channel, message) {
monkey.touchUpAsync(message.x, message.y) queue.push(message.seq, function() {
.catch(function(err) { monkey.touchUpAsync(message.x, message.y)
log.error('touchUp failed', err.stack) .catch(function(err) {
}) log.error('touchUp failed', err.stack)
})
})
// Reset queue
queue = new SeqQueue()
}) })
.on(wire.TapMessage, function(channel, message) { .on(wire.TapMessage, function(channel, message) {
monkey.tapAsync(message.x, message.y) monkey.tapAsync(message.x, message.y)

26
lib/wire/seqqueue.js Normal file
View file

@ -0,0 +1,26 @@
function SeqQueue() {
this.queue = []
this.seq = 0
}
SeqQueue.prototype.push = function(seq, handler) {
this.queue[seq] = handler
this.maybeDequeue()
}
SeqQueue.prototype.done = function(seq, handler) {
this.queue[seq] = handler
this.maybeDequeue()
}
SeqQueue.prototype.maybeDequeue = function() {
var handler
while ((handler = this.queue[this.seq])) {
this.queue[this.seq] = void 0
handler()
this.seq += 1
}
}
module.exports = SeqQueue

View file

@ -214,18 +214,21 @@ message PhysicalIdentifyMessage {
} }
message TouchDownMessage { message TouchDownMessage {
required uint32 x = 1; required uint32 seq = 1;
required uint32 y = 2; required uint32 x = 2;
required uint32 y = 3;
} }
message TouchMoveMessage { message TouchMoveMessage {
required uint32 x = 1; required uint32 seq = 1;
required uint32 y = 2; required uint32 x = 2;
required uint32 y = 3;
} }
message TouchUpMessage { message TouchUpMessage {
required uint32 x = 1; required uint32 seq = 1;
required uint32 y = 2; required uint32 x = 2;
required uint32 y = 3;
} }
message TapMessage { message TapMessage {

View file

@ -40,9 +40,10 @@ module.exports = function ControlServiceFactory(
} }
function touchSender(type) { function touchSender(type) {
return function(x, y) { return function(seq, x, y) {
socket.emit(type, channel, { socket.emit(type, channel, {
x: x seq: seq
, x: x
, y: y , y: y
}) })
} }

View file

@ -15,6 +15,7 @@ module.exports = function DeviceScreenDirective($document, ScalingService) {
, cachedDisplayHeight = 0 , cachedDisplayHeight = 0
, loading = false , loading = false
, scaler , scaler
, seq = 0
function sendTouch(type, e) { function sendTouch(type, e) {
var scaled = scaler.coords( var scaled = scaler.coords(
@ -28,7 +29,8 @@ module.exports = function DeviceScreenDirective($document, ScalingService) {
'translate3d(' + e.offsetX + 'px,' + e.offsetY + 'px,0)' 'translate3d(' + e.offsetX + 'px,' + e.offsetY + 'px,0)'
scope.control[type]( scope.control[type](
scaled.xP * scope.device.display.width seq++
, scaled.xP * scope.device.display.width
, scaled.yP * scope.device.display.height , scaled.yP * scope.device.display.height
) )
} }
@ -38,6 +40,7 @@ module.exports = function DeviceScreenDirective($document, ScalingService) {
element.unbind('mousemove', moveListener) element.unbind('mousemove', moveListener)
$document.unbind('mouseup', upListener) $document.unbind('mouseup', upListener)
$document.unbind('mouseleave', upListener) $document.unbind('mouseleave', upListener)
seq = 0
} }
function updateDisplaySize() { function updateDisplaySize() {