1 // Copyright 2013 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.
5 #include "content/browser/renderer_host/input/synthetic_gesture_target_aura.h"
7 #include "content/browser/renderer_host/render_widget_host_impl.h"
8 #include "content/browser/renderer_host/render_widget_host_view_aura.h"
9 #include "content/browser/renderer_host/ui_events_helper.h"
10 #include "third_party/WebKit/public/platform/WebScreenInfo.h"
11 #include "ui/aura/window.h"
12 #include "ui/aura/window_tree_host.h"
13 #include "ui/events/event_processor.h"
14 #include "ui/events/event_utils.h"
15 #include "ui/events/gesture_detection/gesture_configuration.h"
17 using blink::WebTouchEvent
;
18 using blink::WebMouseWheelEvent
;
22 SyntheticGestureTargetAura::SyntheticGestureTargetAura(
23 RenderWidgetHostImpl
* host
)
24 : SyntheticGestureTargetBase(host
) {
25 blink::WebScreenInfo screenInfo
;
26 host
->GetWebScreenInfo(&screenInfo
);
27 device_scale_factor_
= screenInfo
.deviceScaleFactor
;
30 void SyntheticGestureTargetAura::DispatchWebTouchEventToPlatform(
31 const WebTouchEvent
& web_touch
,
32 const ui::LatencyInfo
& latency_info
) {
33 TouchEventWithLatencyInfo
touch_with_latency(web_touch
, latency_info
);
34 for (size_t i
= 0; i
< touch_with_latency
.event
.touchesLength
; i
++) {
35 touch_with_latency
.event
.touches
[i
].position
.x
*= device_scale_factor_
;
36 touch_with_latency
.event
.touches
[i
].position
.y
*= device_scale_factor_
;
37 touch_with_latency
.event
.touches
[i
].radiusX
*= device_scale_factor_
;
38 touch_with_latency
.event
.touches
[i
].radiusY
*= device_scale_factor_
;
40 ScopedVector
<ui::TouchEvent
> events
;
41 bool conversion_success
= MakeUITouchEventsFromWebTouchEvents(
42 touch_with_latency
, &events
, LOCAL_COORDINATES
);
43 DCHECK(conversion_success
);
45 aura::Window
* window
= GetWindow();
46 aura::WindowTreeHost
* host
= window
->GetHost();
47 for (ScopedVector
<ui::TouchEvent
>::iterator iter
= events
.begin(),
48 end
= events
.end(); iter
!= end
; ++iter
) {
49 (*iter
)->ConvertLocationToTarget(window
, host
->window());
50 ui::EventDispatchDetails details
=
51 host
->event_processor()->OnEventFromSource(*iter
);
52 if (details
.dispatcher_destroyed
)
57 void SyntheticGestureTargetAura::DispatchWebMouseWheelEventToPlatform(
58 const blink::WebMouseWheelEvent
& web_wheel
,
59 const ui::LatencyInfo
&) {
60 gfx::PointF
location(web_wheel
.x
* device_scale_factor_
,
61 web_wheel
.y
* device_scale_factor_
);
62 ui::MouseEvent
mouse_event(ui::ET_MOUSEWHEEL
, location
, location
,
63 ui::EventTimeForNow(), ui::EF_NONE
, ui::EF_NONE
);
64 ui::MouseWheelEvent
wheel_event(
65 mouse_event
, web_wheel
.deltaX
, web_wheel
.deltaY
);
67 aura::Window
* window
= GetWindow();
68 wheel_event
.ConvertLocationToTarget(window
, window
->GetRootWindow());
69 ui::EventDispatchDetails details
=
70 window
->GetHost()->event_processor()->OnEventFromSource(&wheel_event
);
71 if (details
.dispatcher_destroyed
)
78 WebMouseEventTypeToEventType(blink::WebInputEvent::Type web_type
) {
80 case blink::WebInputEvent::MouseDown
:
81 return ui::ET_MOUSE_PRESSED
;
83 case blink::WebInputEvent::MouseUp
:
84 return ui::ET_MOUSE_RELEASED
;
86 case blink::WebInputEvent::MouseMove
:
87 return ui::ET_MOUSE_MOVED
;
89 case blink::WebInputEvent::MouseEnter
:
90 return ui::ET_MOUSE_ENTERED
;
92 case blink::WebInputEvent::MouseLeave
:
93 return ui::ET_MOUSE_EXITED
;
95 case blink::WebInputEvent::ContextMenu
:
96 NOTREACHED() << "WebInputEvent::ContextMenu not supported by"
97 "SyntheticGestureTargetAura";
103 return ui::ET_UNKNOWN
;
106 int WebMouseEventButtonToFlags(blink::WebMouseEvent::Button button
) {
108 case blink::WebMouseEvent::ButtonLeft
:
109 return ui::EF_LEFT_MOUSE_BUTTON
;
111 case blink::WebMouseEvent::ButtonMiddle
:
112 return ui::EF_MIDDLE_MOUSE_BUTTON
;
114 case blink::WebMouseEvent::ButtonRight
:
115 return ui::EF_RIGHT_MOUSE_BUTTON
;
126 void SyntheticGestureTargetAura::DispatchWebMouseEventToPlatform(
127 const blink::WebMouseEvent
& web_mouse
,
128 const ui::LatencyInfo
& latency_info
) {
129 gfx::PointF
location(web_mouse
.x
* device_scale_factor_
,
130 web_mouse
.y
* device_scale_factor_
);
131 ui::EventType event_type
= WebMouseEventTypeToEventType(web_mouse
.type
);
132 int flags
= WebMouseEventButtonToFlags(web_mouse
.button
);
133 ui::MouseEvent
mouse_event(event_type
, location
, location
,
134 ui::EventTimeForNow(), flags
, flags
);
136 aura::Window
* window
= GetWindow();
137 mouse_event
.ConvertLocationToTarget(window
, window
->GetRootWindow());
138 ui::EventDispatchDetails details
=
139 window
->GetHost()->event_processor()->OnEventFromSource(&mouse_event
);
140 if (details
.dispatcher_destroyed
)
144 SyntheticGestureParams::GestureSourceType
145 SyntheticGestureTargetAura::GetDefaultSyntheticGestureSourceType() const {
146 return SyntheticGestureParams::TOUCH_INPUT
;
149 float SyntheticGestureTargetAura::GetTouchSlopInDips() const {
150 // - 1 because Aura considers a pointer to be moving if it has moved at least
151 // 'max_touch_move_in_pixels_for_click' pixels.
152 return ui::GestureConfiguration::GetInstance()
153 ->max_touch_move_in_pixels_for_click() -
157 float SyntheticGestureTargetAura::GetMinScalingSpanInDips() const {
158 return ui::GestureConfiguration::GetInstance()
159 ->min_distance_for_pinch_scroll_in_pixels();
162 aura::Window
* SyntheticGestureTargetAura::GetWindow() const {
163 aura::Window
* window
= render_widget_host()->GetView()->GetNativeView();
168 } // namespace content