Commit f7ff3bda authored by Aldo Culquicondor's avatar Aldo Culquicondor Committed by Commit Bot

VR: Remove dependence of gesture detector on TimeTicks::Now

The gesture detector extrapolates scrolling events from previous real scrolling events.
The extrapolated event depends on the time difference between the events, favoring the
longest and more recent event. Here, we make the gesture detector receive the current
time instead of querying it from the system, and thus making the tests deterministic.

Bug: 853086
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:linux_vr;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel
Change-Id: I2d46f5e5ebceb801aecccf5b2c0a2dbf6b858864
Reviewed-on: https://chromium-review.googlesource.com/1104583
Commit-Queue: Aldo Culquicondor <acondor@chromium.org>
Reviewed-by: default avatarAmirhossein Simjour <asimjour@chromium.org>
Cr-Commit-Position: refs/heads/master@{#568043}
parent bcb5a4ce
...@@ -343,7 +343,8 @@ std::unique_ptr<GestureList> VrController::DetectGestures() { ...@@ -343,7 +343,8 @@ std::unique_ptr<GestureList> VrController::DetectGestures() {
UpdateCurrentTouchInfo(); UpdateCurrentTouchInfo();
return gesture_detector_->DetectGestures( return gesture_detector_->DetectGestures(
touch_info_, ButtonState(gvr::kControllerButtonClick)); touch_info_, base::TimeTicks::Now(),
ButtonState(gvr::kControllerButtonClick));
} }
void VrController::UpdateCurrentTouchInfo() { void VrController::UpdateCurrentTouchInfo() {
......
...@@ -41,10 +41,11 @@ GestureDetector::~GestureDetector() = default; ...@@ -41,10 +41,11 @@ GestureDetector::~GestureDetector() = default;
std::unique_ptr<GestureList> GestureDetector::DetectGestures( std::unique_ptr<GestureList> GestureDetector::DetectGestures(
const TouchInfo& input_touch_info, const TouchInfo& input_touch_info,
base::TimeTicks current_timestamp,
bool force_cancel) { bool force_cancel) {
touch_position_changed_ = UpdateCurrentTouchPoint(input_touch_info); touch_position_changed_ = UpdateCurrentTouchPoint(input_touch_info);
TouchInfo touch_info = input_touch_info; TouchInfo touch_info = input_touch_info;
ExtrapolateTouchInfo(&touch_info); ExtrapolateTouchInfo(&touch_info, current_timestamp);
if (touch_position_changed_) if (touch_position_changed_)
UpdateOverallVelocity(touch_info); UpdateOverallVelocity(touch_info);
...@@ -184,8 +185,8 @@ bool GestureDetector::UpdateCurrentTouchPoint(const TouchInfo& touch_info) { ...@@ -184,8 +185,8 @@ bool GestureDetector::UpdateCurrentTouchPoint(const TouchInfo& touch_info) {
return false; return false;
} }
void GestureDetector::ExtrapolateTouchInfo(TouchInfo* touch_info) { void GestureDetector::ExtrapolateTouchInfo(TouchInfo* touch_info,
base::TimeTicks current_timestamp = base::TimeTicks::Now(); base::TimeTicks current_timestamp) {
const bool effectively_scrolling = const bool effectively_scrolling =
state_->label == SCROLLING || state_->label == POST_SCROLL; state_->label == SCROLLING || state_->label == POST_SCROLL;
if (effectively_scrolling && extrapolated_touch_ < kMaxNumOfExtrapolations && if (effectively_scrolling && extrapolated_touch_ < kMaxNumOfExtrapolations &&
......
...@@ -38,6 +38,7 @@ class VR_EXPORT GestureDetector { ...@@ -38,6 +38,7 @@ class VR_EXPORT GestureDetector {
virtual ~GestureDetector(); virtual ~GestureDetector();
std::unique_ptr<GestureList> DetectGestures(const TouchInfo& touch_info, std::unique_ptr<GestureList> DetectGestures(const TouchInfo& touch_info,
base::TimeTicks current_timestamp,
bool force_cancel); bool force_cancel);
private: private:
...@@ -81,7 +82,8 @@ class VR_EXPORT GestureDetector { ...@@ -81,7 +82,8 @@ class VR_EXPORT GestureDetector {
// before, update the touch point and return true. Otherwise, return false. // before, update the touch point and return true. Otherwise, return false.
bool UpdateCurrentTouchPoint(const TouchInfo& touch_info); bool UpdateCurrentTouchPoint(const TouchInfo& touch_info);
void ExtrapolateTouchInfo(TouchInfo* touch_info); void ExtrapolateTouchInfo(TouchInfo* touch_info,
base::TimeTicks current_timestamp);
void UpdateOverallVelocity(const TouchInfo& touch_info); void UpdateOverallVelocity(const TouchInfo& touch_info);
......
...@@ -18,7 +18,7 @@ TEST(GestureDetector, NotTouching) { ...@@ -18,7 +18,7 @@ TEST(GestureDetector, NotTouching) {
TouchInfo touch_info{ TouchInfo touch_info{
.touch_up = false, .touch_down = false, .is_touching = false}; .touch_up = false, .touch_down = false, .is_touching = false};
auto gestures = detector.DetectGestures(touch_info, false); auto gestures = detector.DetectGestures(touch_info, base::TimeTicks(), false);
EXPECT_TRUE(gestures->empty()); EXPECT_TRUE(gestures->empty());
} }
...@@ -33,7 +33,7 @@ TEST(GestureDetector, StartTouchWithoutMoving) { ...@@ -33,7 +33,7 @@ TEST(GestureDetector, StartTouchWithoutMoving) {
.touch_down = true, .touch_down = true,
.is_touching = true, .is_touching = true,
}; };
auto gestures = detector.DetectGestures(touch_info, false); auto gestures = detector.DetectGestures(touch_info, timestamp, false);
EXPECT_EQ(gestures->front()->GetType(), EXPECT_EQ(gestures->front()->GetType(),
blink::WebInputEvent::kGestureFlingCancel); blink::WebInputEvent::kGestureFlingCancel);
...@@ -45,7 +45,7 @@ TEST(GestureDetector, StartTouchWithoutMoving) { ...@@ -45,7 +45,7 @@ TEST(GestureDetector, StartTouchWithoutMoving) {
.touch_down = true, .touch_down = true,
.is_touching = true, .is_touching = true,
}; };
gestures = detector.DetectGestures(touch_info, false); gestures = detector.DetectGestures(touch_info, timestamp, false);
EXPECT_TRUE(gestures->empty()); EXPECT_TRUE(gestures->empty());
} }
...@@ -59,7 +59,7 @@ TEST(GestureDetector, StartTouchMoveAndRelease) { ...@@ -59,7 +59,7 @@ TEST(GestureDetector, StartTouchMoveAndRelease) {
.touch_down = true, .touch_down = true,
.is_touching = true, .is_touching = true,
}; };
detector.DetectGestures(touch_info, false); detector.DetectGestures(touch_info, timestamp, false);
// Move to the right. // Move to the right.
timestamp += base::TimeDelta::FromMilliseconds(1); timestamp += base::TimeDelta::FromMilliseconds(1);
...@@ -69,7 +69,7 @@ TEST(GestureDetector, StartTouchMoveAndRelease) { ...@@ -69,7 +69,7 @@ TEST(GestureDetector, StartTouchMoveAndRelease) {
.touch_down = false, .touch_down = false,
.is_touching = true, .is_touching = true,
}; };
auto gestures = detector.DetectGestures(touch_info, false); auto gestures = detector.DetectGestures(touch_info, timestamp, false);
EXPECT_EQ(gestures->front()->GetType(), EXPECT_EQ(gestures->front()->GetType(),
blink::WebInputEvent::kGestureScrollBegin); blink::WebInputEvent::kGestureScrollBegin);
auto* gesture = gestures->front().get(); auto* gesture = gestures->front().get();
...@@ -84,7 +84,7 @@ TEST(GestureDetector, StartTouchMoveAndRelease) { ...@@ -84,7 +84,7 @@ TEST(GestureDetector, StartTouchMoveAndRelease) {
.touch_down = false, .touch_down = false,
.is_touching = true, .is_touching = true,
}; };
gestures = detector.DetectGestures(touch_info, false); gestures = detector.DetectGestures(touch_info, timestamp, false);
EXPECT_EQ(gestures->front()->GetType(), EXPECT_EQ(gestures->front()->GetType(),
blink::WebInputEvent::kGestureScrollUpdate); blink::WebInputEvent::kGestureScrollUpdate);
gesture = gestures->front().get(); gesture = gestures->front().get();
...@@ -94,17 +94,20 @@ TEST(GestureDetector, StartTouchMoveAndRelease) { ...@@ -94,17 +94,20 @@ TEST(GestureDetector, StartTouchMoveAndRelease) {
// Release touch. Scroll is extrapolated for 2 frames. // Release touch. Scroll is extrapolated for 2 frames.
touch_info.touch_up = true; touch_info.touch_up = true;
touch_info.is_touching = false; touch_info.is_touching = false;
gestures = detector.DetectGestures(touch_info, false); timestamp += base::TimeDelta::FromMilliseconds(1);
gestures = detector.DetectGestures(touch_info, timestamp, false);
EXPECT_EQ(gestures->front()->GetType(), EXPECT_EQ(gestures->front()->GetType(),
blink::WebInputEvent::kGestureScrollUpdate); blink::WebInputEvent::kGestureScrollUpdate);
gesture = gestures->front().get(); gesture = gestures->front().get();
EXPECT_GT(gesture->data.scroll_update.delta_x, 0.0f); EXPECT_GT(gesture->data.scroll_update.delta_x, 0.0f);
EXPECT_GT(gesture->data.scroll_update.delta_y, 0.0f); EXPECT_GT(gesture->data.scroll_update.delta_y, 0.0f);
touch_info.touch_up = false; touch_info.touch_up = false;
gestures = detector.DetectGestures(touch_info, false); timestamp += base::TimeDelta::FromMilliseconds(1);
gestures = detector.DetectGestures(touch_info, timestamp, false);
EXPECT_EQ(gestures->front()->GetType(), EXPECT_EQ(gestures->front()->GetType(),
blink::WebInputEvent::kGestureScrollUpdate); blink::WebInputEvent::kGestureScrollUpdate);
gestures = detector.DetectGestures(touch_info, false); timestamp += base::TimeDelta::FromMilliseconds(1);
gestures = detector.DetectGestures(touch_info, timestamp, false);
EXPECT_EQ(gestures->front()->GetType(), EXPECT_EQ(gestures->front()->GetType(),
blink::WebInputEvent::kGestureScrollEnd); blink::WebInputEvent::kGestureScrollEnd);
} }
...@@ -119,7 +122,7 @@ TEST(GestureDetector, CancelDuringScrolling) { ...@@ -119,7 +122,7 @@ TEST(GestureDetector, CancelDuringScrolling) {
.touch_down = true, .touch_down = true,
.is_touching = true, .is_touching = true,
}; };
detector.DetectGestures(touch_info, false); detector.DetectGestures(touch_info, timestamp, false);
// Move to the right. // Move to the right.
timestamp += base::TimeDelta::FromMilliseconds(1); timestamp += base::TimeDelta::FromMilliseconds(1);
...@@ -129,12 +132,12 @@ TEST(GestureDetector, CancelDuringScrolling) { ...@@ -129,12 +132,12 @@ TEST(GestureDetector, CancelDuringScrolling) {
.touch_down = false, .touch_down = false,
.is_touching = true, .is_touching = true,
}; };
auto gestures = detector.DetectGestures(touch_info, false); auto gestures = detector.DetectGestures(touch_info, timestamp, false);
EXPECT_EQ(gestures->front()->GetType(), EXPECT_EQ(gestures->front()->GetType(),
blink::WebInputEvent::kGestureScrollBegin); blink::WebInputEvent::kGestureScrollBegin);
// Cancel. // Cancel.
gestures = detector.DetectGestures(touch_info, true); gestures = detector.DetectGestures(touch_info, timestamp, true);
EXPECT_EQ(gestures->front()->GetType(), EXPECT_EQ(gestures->front()->GetType(),
blink::WebInputEvent::kGestureScrollEnd); blink::WebInputEvent::kGestureScrollEnd);
} }
...@@ -149,7 +152,7 @@ TEST(GestureDetector, CancelDuringPostScrolling) { ...@@ -149,7 +152,7 @@ TEST(GestureDetector, CancelDuringPostScrolling) {
.touch_down = true, .touch_down = true,
.is_touching = true, .is_touching = true,
}; };
detector.DetectGestures(touch_info, false); detector.DetectGestures(touch_info, timestamp, false);
// Move to the right. // Move to the right.
timestamp += base::TimeDelta::FromMilliseconds(1); timestamp += base::TimeDelta::FromMilliseconds(1);
...@@ -159,20 +162,20 @@ TEST(GestureDetector, CancelDuringPostScrolling) { ...@@ -159,20 +162,20 @@ TEST(GestureDetector, CancelDuringPostScrolling) {
.touch_down = false, .touch_down = false,
.is_touching = true, .is_touching = true,
}; };
auto gestures = detector.DetectGestures(touch_info, false); auto gestures = detector.DetectGestures(touch_info, timestamp, false);
EXPECT_EQ(gestures->front()->GetType(), EXPECT_EQ(gestures->front()->GetType(),
blink::WebInputEvent::kGestureScrollBegin); blink::WebInputEvent::kGestureScrollBegin);
// Release touch. We should see extrapolated scrolling. // Release touch. We should see extrapolated scrolling.
touch_info.touch_up = true; touch_info.touch_up = true;
touch_info.is_touching = false; touch_info.is_touching = false;
gestures = detector.DetectGestures(touch_info, false); gestures = detector.DetectGestures(touch_info, timestamp, false);
EXPECT_EQ(gestures->front()->GetType(), EXPECT_EQ(gestures->front()->GetType(),
blink::WebInputEvent::kGestureScrollUpdate); blink::WebInputEvent::kGestureScrollUpdate);
// Cancel. // Cancel.
touch_info.touch_up = false; touch_info.touch_up = false;
gestures = detector.DetectGestures(touch_info, true); gestures = detector.DetectGestures(touch_info, timestamp, true);
EXPECT_EQ(gestures->front()->GetType(), EXPECT_EQ(gestures->front()->GetType(),
blink::WebInputEvent::kGestureScrollEnd); blink::WebInputEvent::kGestureScrollEnd);
} }
...@@ -187,7 +190,7 @@ TEST(GestureDetector, CancelAndTouchDuringPostScrolling) { ...@@ -187,7 +190,7 @@ TEST(GestureDetector, CancelAndTouchDuringPostScrolling) {
.touch_down = true, .touch_down = true,
.is_touching = true, .is_touching = true,
}; };
detector.DetectGestures(touch_info, false); detector.DetectGestures(touch_info, timestamp, false);
// Move to the right. // Move to the right.
timestamp += base::TimeDelta::FromMilliseconds(1); timestamp += base::TimeDelta::FromMilliseconds(1);
...@@ -197,22 +200,24 @@ TEST(GestureDetector, CancelAndTouchDuringPostScrolling) { ...@@ -197,22 +200,24 @@ TEST(GestureDetector, CancelAndTouchDuringPostScrolling) {
.touch_down = false, .touch_down = false,
.is_touching = true, .is_touching = true,
}; };
auto gestures = detector.DetectGestures(touch_info, false); auto gestures = detector.DetectGestures(touch_info, timestamp, false);
EXPECT_EQ(gestures->front()->GetType(), EXPECT_EQ(gestures->front()->GetType(),
blink::WebInputEvent::kGestureScrollBegin); blink::WebInputEvent::kGestureScrollBegin);
// Release touch. We should see extrapolated scrolling. // Release touch. We should see extrapolated scrolling.
timestamp += base::TimeDelta::FromMilliseconds(1);
touch_info.touch_up = true; touch_info.touch_up = true;
touch_info.is_touching = false; touch_info.is_touching = false;
gestures = detector.DetectGestures(touch_info, false); gestures = detector.DetectGestures(touch_info, timestamp, false);
EXPECT_EQ(gestures->front()->GetType(), EXPECT_EQ(gestures->front()->GetType(),
blink::WebInputEvent::kGestureScrollUpdate); blink::WebInputEvent::kGestureScrollUpdate);
// Cancel and touch. // Cancel and touch.
timestamp += base::TimeDelta::FromMilliseconds(1);
touch_info.touch_up = false; touch_info.touch_up = false;
touch_info.touch_down = true; touch_info.touch_down = true;
touch_info.is_touching = true; touch_info.is_touching = true;
gestures = detector.DetectGestures(touch_info, true); gestures = detector.DetectGestures(touch_info, timestamp, true);
EXPECT_EQ(gestures->front()->GetType(), EXPECT_EQ(gestures->front()->GetType(),
blink::WebInputEvent::kGestureScrollEnd); blink::WebInputEvent::kGestureScrollEnd);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment