Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / content / browser / renderer_host / input / input_router_config_helper.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/renderer_host/input/input_router_config_helper.h"
6
7 #include "base/command_line.h"
8 #include "content/public/common/content_switches.h"
9 #include "ui/events/gesture_detection/gesture_detector.h"
10
11 #if defined(USE_AURA)
12 #include "ui/events/gestures/gesture_configuration.h"
13 #elif defined(OS_ANDROID)
14 #include "ui/gfx/android/view_configuration.h"
15 #include "ui/gfx/screen.h"
16 #endif
17
18 namespace content {
19 namespace {
20
21 #if defined(USE_AURA)
22
23 GestureEventQueue::Config GetGestureEventQueueConfig() {
24   GestureEventQueue::Config config;
25
26 #if defined(OS_CHROMEOS)
27   // Default debouncing interval duration on ChromeOS: if a scroll is in
28   // progress, non-scroll events during this interval are deferred to either its
29   // end or discarded on receipt of another GestureScrollUpdate.
30   // TODO(jdduke): Disable and remove entirely when issues with spurious
31   // scroll end detection on the Pixel are resolved, crbug.com/353702.
32   const int kDebouncingIntervalTimeMs = 30;
33   config.debounce_interval =
34       base::TimeDelta::FromMilliseconds(kDebouncingIntervalTimeMs);
35 #endif
36
37   config.touchscreen_tap_suppression_config.enabled = true;
38   config.touchscreen_tap_suppression_config.max_cancel_to_down_time =
39       base::TimeDelta::FromMilliseconds(
40           ui::GestureConfiguration::fling_max_cancel_to_down_time_in_ms());
41
42   config.touchscreen_tap_suppression_config.max_tap_gap_time =
43       base::TimeDelta::FromMilliseconds(static_cast<int>(
44           ui::GestureConfiguration::semi_long_press_time_in_seconds() * 1000));
45
46   config.touchpad_tap_suppression_config.enabled = true;
47   config.touchpad_tap_suppression_config.max_cancel_to_down_time =
48       base::TimeDelta::FromMilliseconds(
49           ui::GestureConfiguration::fling_max_cancel_to_down_time_in_ms());
50
51   config.touchpad_tap_suppression_config.max_tap_gap_time =
52       base::TimeDelta::FromMilliseconds(static_cast<int>(
53           ui::GestureConfiguration::fling_max_tap_gap_time_in_ms() * 1000));
54
55   return config;
56 }
57
58 TouchEventQueue::Config GetTouchEventQueueConfig() {
59   TouchEventQueue::Config config;
60
61   config.touchmove_slop_suppression_length_dips =
62       ui::GestureConfiguration::max_touch_move_in_pixels_for_click();
63   // TODO(jdduke): Remove when unified GR enabled, crbug.com/332418.
64   config.touchmove_slop_suppression_region_includes_boundary = false;
65
66   return config;
67 }
68
69 #elif defined(OS_ANDROID)
70
71 // Default time allowance for the touch ack delay before the touch sequence is
72 // cancelled.
73 const int kTouchAckTimeoutDelayMs = 200;
74
75 GestureEventQueue::Config GetGestureEventQueueConfig() {
76   GestureEventQueue::Config config;
77
78   config.touchscreen_tap_suppression_config.enabled = true;
79   config.touchscreen_tap_suppression_config.max_cancel_to_down_time =
80       base::TimeDelta::FromMilliseconds(
81           gfx::ViewConfiguration::GetTapTimeoutInMs());
82   config.touchscreen_tap_suppression_config.max_tap_gap_time =
83       base::TimeDelta::FromMilliseconds(
84           gfx::ViewConfiguration::GetLongPressTimeoutInMs());
85
86   return config;
87 }
88
89 TouchEventQueue::Config GetTouchEventQueueConfig() {
90   TouchEventQueue::Config config;
91
92   config.touch_ack_timeout_delay =
93       base::TimeDelta::FromMilliseconds(kTouchAckTimeoutDelayMs);
94   config.touch_ack_timeout_supported = true;
95
96   const double touch_slop_length_pixels =
97       static_cast<double>(gfx::ViewConfiguration::GetTouchSlopInPixels());
98   const double device_scale_factor =
99       gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().device_scale_factor();
100   config.touchmove_slop_suppression_length_dips =
101       touch_slop_length_pixels / device_scale_factor;
102
103   return config;
104 }
105
106 #else
107
108 GestureEventQueue::Config GetGestureEventQueueConfig() {
109   return GestureEventQueue::Config();
110 }
111
112 TouchEventQueue::Config GetTouchEventQueueConfig() {
113   TouchEventQueue::Config config;
114   config.touchmove_slop_suppression_length_dips =
115       ui::GestureDetector::Config().touch_slop;
116   return config;
117 }
118
119 #endif
120
121 TouchEventQueue::TouchScrollingMode GetTouchScrollingMode() {
122   std::string modeString =
123       CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
124           switches::kTouchScrollingMode);
125   if (modeString == switches::kTouchScrollingModeAsyncTouchmove)
126     return TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE;
127   if (modeString == switches::kTouchScrollingModeSyncTouchmove)
128     return TouchEventQueue::TOUCH_SCROLLING_MODE_SYNC_TOUCHMOVE;
129   if (modeString == switches::kTouchScrollingModeTouchcancel)
130     return TouchEventQueue::TOUCH_SCROLLING_MODE_TOUCHCANCEL;
131   if (modeString != "")
132     LOG(ERROR) << "Invalid --touch-scrolling-mode option: " << modeString;
133   return TouchEventQueue::TOUCH_SCROLLING_MODE_DEFAULT;
134 }
135
136 }  // namespace
137
138 InputRouterImpl::Config GetInputRouterConfigForPlatform() {
139   InputRouterImpl::Config config;
140   config.gesture_config = GetGestureEventQueueConfig();
141   config.touch_config = GetTouchEventQueueConfig();
142   config.touch_config.touch_scrolling_mode = GetTouchScrollingMode();
143   return config;
144 }
145
146 }  // namespace content