diff --git a/internal/runner/runner.go b/internal/runner/runner.go index 5ab9e9e..9476454 100644 --- a/internal/runner/runner.go +++ b/internal/runner/runner.go @@ -719,8 +719,6 @@ func scrollEndpoints(action verifier.Action, tree *hierarchy.Tree) (fromX, fromY return cx, cy, toX, toY } -// scrollBounds returns the container bounds for an authored Scroll: the node -// named by On when it resolves, otherwise the root (whole-screen) bounds. // screenBounds returns the device screen rectangle as the maximum extent across // all elements. The hierarchy root often reports zero bounds on Android, so the // extent (driven by full-screen containers and the navigation bar) is the @@ -773,6 +771,8 @@ func clampGestureToSafeArea(fromX, fromY, toX, toY int, screen hierarchy.Bounds) return fromX, fromY, toX, toY } +// scrollBounds returns the container bounds for an authored Scroll: the node +// named by On when it resolves, otherwise the root (whole-screen) bounds. func scrollBounds(action verifier.Action, tree *hierarchy.Tree) hierarchy.Bounds { if tree == nil { return hierarchy.Bounds{} diff --git a/internal/runner/runner_test.go b/internal/runner/runner_test.go index a87fc87..77dbe3e 100644 --- a/internal/runner/runner_test.go +++ b/internal/runner/runner_test.go @@ -1813,13 +1813,11 @@ func TestClampGestureToSafeArea_KeepsOriginOutOfGestureZones(t *testing.T) { screen := hierarchy.Bounds{Left: 0, Top: 0, Right: 1080, Bottom: 2400} // marginX = 1080/20 = 54, marginY = 2400/12 = 200. - // The real shade-opening swipe captured on device: origin y=62. + // The real shade-opening swipe captured on device: origin y=62 is pulled to + // the top margin (200); the in-range destination is untouched. fromX, fromY, toX, toY := clampGestureToSafeArea(802, 62, 802, 447, screen) - if fromY < 200 { - t.Errorf("origin Y %d still inside the status-bar strip (need >= 200)", fromY) - } - if fromX != 802 || toX != 802 || toY != 447 { - t.Errorf("unexpected clamp of in-range coords: from=(%d,%d) to=(%d,%d)", fromX, fromY, toX, toY) + if fromX != 802 || fromY != 200 || toX != 802 || toY != 447 { + t.Errorf("origin not clamped to the safe area: from=(%d,%d) to=(%d,%d), want from=(802,200) to=(802,447)", fromX, fromY, toX, toY) } // Top-left corner origin pulled inside both margins. @@ -1828,6 +1826,13 @@ func TestClampGestureToSafeArea_KeepsOriginOutOfGestureZones(t *testing.T) { t.Errorf("corner origin not clamped to (54,200), got (%d,%d)", fromX, fromY) } + // An off-screen destination is clamped onto the screen (the destination only + // needs to stay on screen, not inside the gesture margins). + _, _, toX, toY = clampGestureToSafeArea(540, 1200, -50, 9999, screen) + if toX != 0 || toY != 2400 { + t.Errorf("off-screen destination not clamped to screen edges: got (%d,%d), want (0,2400)", toX, toY) + } + // Unknown screen size leaves coordinates untouched. fromX, fromY, toX, toY = clampGestureToSafeArea(802, 62, 802, 447, hierarchy.Bounds{}) if fromX != 802 || fromY != 62 || toX != 802 || toY != 447 {