1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file.
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/browser/renderer_host/input/input_router_config_helper.h"
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/command_line.h"
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/public/common/content_switches.h"
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/events/gesture_detection/gesture_detector.h"
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(USE_AURA)
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/events/gestures/gesture_configuration.h"
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#elif defined(OS_ANDROID)
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/gfx/android/view_configuration.h"
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/gfx/screen.h"
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace content {
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace {
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(USE_AURA)
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GestureEventQueue::Config GetGestureEventQueueConfig() {
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GestureEventQueue::Config config;
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  config.debounce_interval = base::TimeDelta::FromMilliseconds(
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ui::GestureConfiguration::scroll_debounce_interval_in_ms());
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touchscreen_tap_suppression_config.enabled = true;
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touchscreen_tap_suppression_config.max_cancel_to_down_time =
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          ui::GestureConfiguration::fling_max_cancel_to_down_time_in_ms());
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touchscreen_tap_suppression_config.max_tap_gap_time =
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(static_cast<int>(
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          ui::GestureConfiguration::semi_long_press_time_in_seconds() * 1000));
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touchpad_tap_suppression_config.enabled = true;
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touchpad_tap_suppression_config.max_cancel_to_down_time =
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          ui::GestureConfiguration::fling_max_cancel_to_down_time_in_ms());
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touchpad_tap_suppression_config.max_tap_gap_time =
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(static_cast<int>(
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          ui::GestureConfiguration::fling_max_tap_gap_time_in_ms() * 1000));
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return config;
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TouchEventQueue::Config GetTouchEventQueueConfig() {
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TouchEventQueue::Config config;
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touchmove_slop_suppression_length_dips =
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::GestureConfiguration::max_touch_move_in_pixels_for_click();
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return config;
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#elif defined(OS_ANDROID)
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Default time allowance for the touch ack delay before the touch sequence is
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// cancelled.
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int kTouchAckTimeoutDelayMs = 200;
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GestureEventQueue::Config GetGestureEventQueueConfig() {
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GestureEventQueue::Config config;
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touchscreen_tap_suppression_config.enabled = true;
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touchscreen_tap_suppression_config.max_cancel_to_down_time =
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          gfx::ViewConfiguration::GetTapTimeoutInMs());
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touchscreen_tap_suppression_config.max_tap_gap_time =
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          gfx::ViewConfiguration::GetLongPressTimeoutInMs());
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return config;
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TouchEventQueue::Config GetTouchEventQueueConfig() {
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TouchEventQueue::Config config;
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touch_ack_timeout_delay =
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(kTouchAckTimeoutDelayMs);
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touch_ack_timeout_supported = true;
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const double touch_slop_length_pixels =
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      static_cast<double>(gfx::ViewConfiguration::GetTouchSlopInPixels());
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const double device_scale_factor =
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().device_scale_factor();
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touchmove_slop_suppression_length_dips =
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      touch_slop_length_pixels / device_scale_factor;
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return config;
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GestureEventQueue::Config GetGestureEventQueueConfig() {
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return GestureEventQueue::Config();
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TouchEventQueue::Config GetTouchEventQueueConfig() {
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TouchEventQueue::Config config;
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touchmove_slop_suppression_length_dips =
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ui::GestureDetector::Config().touch_slop;
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return config;
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TouchEventQueue::TouchScrollingMode GetTouchScrollingMode() {
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string modeString =
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          switches::kTouchScrollingMode);
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (modeString == switches::kTouchScrollingModeAsyncTouchmove)
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE;
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (modeString == switches::kTouchScrollingModeSyncTouchmove)
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return TouchEventQueue::TOUCH_SCROLLING_MODE_SYNC_TOUCHMOVE;
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (modeString == switches::kTouchScrollingModeTouchcancel)
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return TouchEventQueue::TOUCH_SCROLLING_MODE_TOUCHCANCEL;
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (modeString != "")
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    LOG(ERROR) << "Invalid --touch-scrolling-mode option: " << modeString;
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return TouchEventQueue::TOUCH_SCROLLING_MODE_DEFAULT;
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace
127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)InputRouterImpl::Config GetInputRouterConfigForPlatform() {
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InputRouterImpl::Config config;
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.gesture_config = GetGestureEventQueueConfig();
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touch_config = GetTouchEventQueueConfig();
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config.touch_config.touch_scrolling_mode = GetTouchScrollingMode();
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return config;
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace content
137