1
0
Fork 0
mirror of https://github.com/openstf/stf synced 2025-10-04 02:09:32 +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([
channel
, wireutil.envelope(new Klass(
data.x
data.seq
, data.x
, data.y
))
])

View file

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

View file

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

View file

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