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:
parent
ceeda2b990
commit
c33f0eab09
6 changed files with 68 additions and 22 deletions
|
@ -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
|
||||||
))
|
))
|
||||||
])
|
])
|
||||||
|
|
|
@ -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
26
lib/wire/seqqueue.js
Normal 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
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue