Bug 1467743 - [marionette] Handle errors for nested promise in dispatchPointerMove.
Because the nested promise doesn't use the "catch()" method a
possible raised error by its code is not handled, and will
cause the outer promise never to resolve, which results in an
infinite hang.
MozReview-Commit-ID: 1MFyKpmOjYz
--- a/testing/marionette/action.js
+++ b/testing/marionette/action.js
@@ -1315,17 +1315,17 @@ function dispatchPointerUp(a, inputState
* Promise to dispatch at least one pointermove event, as well as
* mousemove events as appropriate.
*/
function dispatchPointerMove(a, inputState, tickDuration, window) {
const timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
// interval between pointermove increments in ms, based on common vsync
const fps60 = 17;
- return new Promise(resolve => {
+ return new Promise((resolve, reject) => {
const start = Date.now();
const [startX, startY] = [inputState.x, inputState.y];
let coords = getElementCenter(a.origin, window);
let target = action.computePointerDestination(a, inputState, coords);
const [targetX, targetY] = [target.x, target.y];
if (!inViewPort(targetX, targetY, window)) {
@@ -1365,18 +1365,19 @@ function dispatchPointerMove(a, inputSta
}
})();
// perform last pointer move after all incremental moves are resolved and
// durationRatio is close enough to 1
intermediatePointerEvents.then(() => {
performOnePointerMove(inputState, targetX, targetY, window);
resolve();
+ }).catch(err => {
+ reject(err);
});
-
});
}
function performOnePointerMove(inputState, targetX, targetY, win) {
if (targetX == inputState.x && targetY == inputState.y) {
return;
}