| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/android/scoped_java_ref.h" | 5 #include "base/android/scoped_java_ref.h" |
| 6 #include "base/task_runner_util.h" |
| 6 #include "chrome/browser/android/vr_shell/vr_input_manager.h" | 7 #include "chrome/browser/android/vr_shell/vr_input_manager.h" |
| 8 #include "content/public/browser/browser_thread.h" |
| 7 | 9 |
| 8 using blink::WebGestureEvent; | 10 using blink::WebGestureEvent; |
| 9 using blink::WebMouseEvent; | 11 using blink::WebMouseEvent; |
| 10 using blink::WebInputEvent; | 12 using blink::WebInputEvent; |
| 11 | 13 |
| 12 namespace vr_shell { | 14 namespace vr_shell { |
| 13 | 15 |
| 14 VrInputManager::VrInputManager(content::WebContents* web_contents) | 16 VrInputManager::VrInputManager(content::WebContents* web_contents) |
| 15 : web_contents_(web_contents) { | 17 : web_contents_(web_contents) { |
| 16 dpi_scale_ = 1; | 18 dpi_scale_ = 1; |
| 17 } | 19 } |
| 18 | 20 |
| 19 VrInputManager::~VrInputManager() {} | 21 VrInputManager::~VrInputManager() {} |
| 20 | 22 |
| 23 void VrInputManager::ProcessUpdatedGesture(VrGesture gesture) { |
| 24 if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) { |
| 25 content::BrowserThread::PostTask( |
| 26 content::BrowserThread::UI, FROM_HERE, |
| 27 base::Bind(&VrInputManager::SendGesture, this, gesture)); |
| 28 } else { |
| 29 SendGesture(gesture); |
| 30 } |
| 31 } |
| 32 |
| 33 void VrInputManager::SendGesture(VrGesture gesture) { |
| 34 int64_t event_time = gesture.start_time; |
| 35 int64_t event_time_milliseconds = static_cast<int64_t>(event_time / 1000000); |
| 36 |
| 37 if (gesture.type == WebInputEvent::GestureScrollBegin || |
| 38 gesture.type == WebInputEvent::GestureScrollUpdate || |
| 39 gesture.type == WebInputEvent::GestureScrollEnd) { |
| 40 SendScrollEvent(event_time_milliseconds, 0.0f, 0.0f, |
| 41 gesture.details.scroll.delta.x, |
| 42 gesture.details.scroll.delta.y, gesture.type); |
| 43 } else if (gesture.type == WebInputEvent::GestureTap) { |
| 44 SendClickEvent(event_time_milliseconds, gesture.details.buttons.pos.x, |
| 45 gesture.details.buttons.pos.y); |
| 46 } else if (gesture.type == WebInputEvent::MouseMove) { |
| 47 SendMouseMoveEvent(event_time_milliseconds, gesture.details.move.delta.x, |
| 48 gesture.details.move.delta.y, gesture.details.move.type); |
| 49 } |
| 50 } |
| 51 |
| 21 void VrInputManager::ScrollBegin(int64_t time_ms, | 52 void VrInputManager::ScrollBegin(int64_t time_ms, |
| 22 float x, | 53 float x, |
| 23 float y, | 54 float y, |
| 24 float hintx, | 55 float hintx, |
| 25 float hinty, | 56 float hinty, |
| 26 bool target_viewport) { | 57 bool target_viewport) { |
| 27 WebGestureEvent event = | 58 WebGestureEvent event = |
| 28 MakeGestureEvent(WebInputEvent::GestureScrollBegin, time_ms, x, y); | 59 MakeGestureEvent(WebInputEvent::GestureScrollBegin, time_ms, x, y); |
| 29 event.data.scrollBegin.deltaXHint = hintx / dpi_scale_; | 60 event.data.scrollBegin.deltaXHint = hintx / dpi_scale_; |
| 30 event.data.scrollBegin.deltaYHint = hinty / dpi_scale_; | 61 event.data.scrollBegin.deltaYHint = hinty / dpi_scale_; |
| 31 event.data.scrollBegin.targetViewport = target_viewport; | 62 event.data.scrollBegin.targetViewport = target_viewport; |
| 32 | 63 |
| 33 SendGestureEvent(event); | 64 ForwardGestureEvent(event); |
| 34 } | 65 } |
| 35 | 66 |
| 36 void VrInputManager::ScrollEnd(int64_t time_ms) { | 67 void VrInputManager::ScrollEnd(int64_t time_ms) { |
| 37 WebGestureEvent event = | 68 WebGestureEvent event = |
| 38 MakeGestureEvent(WebInputEvent::GestureScrollEnd, time_ms, 0, 0); | 69 MakeGestureEvent(WebInputEvent::GestureScrollEnd, time_ms, 0, 0); |
| 39 SendGestureEvent(event); | 70 ForwardGestureEvent(event); |
| 40 } | 71 } |
| 41 | 72 |
| 42 void VrInputManager::ScrollBy(int64_t time_ms, | 73 void VrInputManager::ScrollBy(int64_t time_ms, |
| 43 float x, | 74 float x, |
| 44 float y, | 75 float y, |
| 45 float dx, | 76 float dx, |
| 46 float dy) { | 77 float dy) { |
| 47 WebGestureEvent event = | 78 WebGestureEvent event = |
| 48 MakeGestureEvent(WebInputEvent::GestureScrollUpdate, time_ms, x, y); | 79 MakeGestureEvent(WebInputEvent::GestureScrollUpdate, time_ms, x, y); |
| 49 event.data.scrollUpdate.deltaX = -dx / dpi_scale_; | 80 event.data.scrollUpdate.deltaX = -dx / dpi_scale_; |
| 50 event.data.scrollUpdate.deltaY = -dy / dpi_scale_; | 81 event.data.scrollUpdate.deltaY = -dy / dpi_scale_; |
| 51 | 82 |
| 52 SendGestureEvent(event); | 83 ForwardGestureEvent(event); |
| 53 } | 84 } |
| 54 | 85 |
| 55 void VrInputManager::SendScrollEvent(int64_t time_ms, | 86 void VrInputManager::SendScrollEvent(int64_t time_ms, |
| 56 float x, | 87 float x, |
| 57 float y, | 88 float y, |
| 58 float dx, | 89 float dx, |
| 59 float dy, | 90 float dy, |
| 60 int type) { | 91 int type) { |
| 61 float hinty = -dy; | 92 float hinty = -dy; |
| 62 float hintx = -dx; | 93 float hintx = -dx; |
| 63 bool target_viewport = false; | 94 bool target_viewport = false; |
| 64 switch (type) { | 95 switch (type) { |
| 65 case WebInputEvent::GestureScrollBegin: { | 96 case WebInputEvent::GestureScrollBegin: { |
| 66 WebGestureEvent event_start = | 97 WebGestureEvent event_start = |
| 67 MakeGestureEvent(WebInputEvent::GestureScrollBegin, time_ms, x, y); | 98 MakeGestureEvent(WebInputEvent::GestureScrollBegin, time_ms, x, y); |
| 68 event_start.data.scrollBegin.deltaXHint = hintx / dpi_scale_; | 99 event_start.data.scrollBegin.deltaXHint = hintx / dpi_scale_; |
| 69 event_start.data.scrollBegin.deltaYHint = hinty / dpi_scale_; | 100 event_start.data.scrollBegin.deltaYHint = hinty / dpi_scale_; |
| 70 event_start.data.scrollBegin.targetViewport = target_viewport; | 101 event_start.data.scrollBegin.targetViewport = target_viewport; |
| 71 SendGestureEvent(event_start); | 102 ForwardGestureEvent(event_start); |
| 72 break; | 103 break; |
| 73 } | 104 } |
| 74 case WebInputEvent::GestureScrollUpdate: { | 105 case WebInputEvent::GestureScrollUpdate: { |
| 75 WebGestureEvent event = | 106 WebGestureEvent event = |
| 76 MakeGestureEvent(WebInputEvent::GestureScrollUpdate, time_ms, x, y); | 107 MakeGestureEvent(WebInputEvent::GestureScrollUpdate, time_ms, x, y); |
| 77 event.data.scrollUpdate.deltaX = -dx / dpi_scale_; | 108 event.data.scrollUpdate.deltaX = -dx / dpi_scale_; |
| 78 event.data.scrollUpdate.deltaY = -dy / dpi_scale_; | 109 event.data.scrollUpdate.deltaY = -dy / dpi_scale_; |
| 79 SendGestureEvent(event); | 110 ForwardGestureEvent(event); |
| 80 break; | 111 break; |
| 81 } | 112 } |
| 82 case WebInputEvent::GestureScrollEnd: { | 113 case WebInputEvent::GestureScrollEnd: { |
| 83 WebGestureEvent event_end = | 114 WebGestureEvent event_end = |
| 84 MakeGestureEvent(WebInputEvent::GestureScrollEnd, time_ms, 0, 0); | 115 MakeGestureEvent(WebInputEvent::GestureScrollEnd, time_ms, 0, 0); |
| 85 SendGestureEvent(event_end); | 116 ForwardGestureEvent(event_end); |
| 86 break; | 117 break; |
| 87 } | 118 } |
| 88 } | 119 } |
| 89 } | 120 } |
| 90 | 121 |
| 91 void VrInputManager::SendMouseMoveEvent(int64_t time_ms, | 122 void VrInputManager::SendMouseMoveEvent(int64_t time_ms, |
| 92 float x, | 123 float x, |
| 93 float y, | 124 float y, |
| 94 int type) { | 125 int type) { |
| 95 WebMouseEvent result; | 126 WebMouseEvent result; |
| 96 | 127 |
| 97 result.type = WebInputEvent::MouseMove; | 128 result.type = WebInputEvent::MouseMove; |
| 98 result.pointerType = blink::WebPointerProperties::PointerType::Mouse; | 129 result.pointerType = blink::WebPointerProperties::PointerType::Mouse; |
| 99 result.x = x / dpi_scale_; | 130 result.x = x / dpi_scale_; |
| 100 result.y = y / dpi_scale_; | 131 result.y = y / dpi_scale_; |
| 101 result.windowX = x / dpi_scale_; | 132 result.windowX = x / dpi_scale_; |
| 102 result.windowY = y / dpi_scale_; | 133 result.windowY = y / dpi_scale_; |
| 103 result.timeStampSeconds = time_ms / 1000.0; | 134 result.timeStampSeconds = time_ms / 1000.0; |
| 104 result.clickCount = 1; | 135 result.clickCount = 1; |
| 105 result.modifiers = 0; | 136 result.modifiers = 0; |
| 106 | 137 |
| 107 if (type == 1) { | 138 if (type == 1) { |
| 108 result.type = WebInputEvent::MouseEnter; | 139 result.type = WebInputEvent::MouseEnter; |
| 109 } else if (type == 2) { | 140 } else if (type == 2) { |
| 110 result.type = WebInputEvent::MouseLeave; | 141 result.type = WebInputEvent::MouseLeave; |
| 111 } | 142 } |
| 112 result.button = WebMouseEvent::Button::NoButton; | 143 result.button = WebMouseEvent::Button::NoButton; |
| 113 | 144 |
| 114 SendMouseEvent(result); | 145 ForwardMouseEvent(result); |
| 115 } | 146 } |
| 116 | 147 |
| 117 void VrInputManager::SendClickEvent(int64_t time_ms, float x, float y) { | 148 void VrInputManager::SendClickEvent(int64_t time_ms, float x, float y) { |
| 118 WebGestureEvent tap_down_event = | 149 WebGestureEvent tap_down_event = |
| 119 MakeGestureEvent(WebInputEvent::GestureTapDown, time_ms, x, y); | 150 MakeGestureEvent(WebInputEvent::GestureTapDown, time_ms, x, y); |
| 120 tap_down_event.data.tap.tapCount = 1; | 151 tap_down_event.data.tap.tapCount = 1; |
| 121 SendGestureEvent(tap_down_event); | 152 ForwardGestureEvent(tap_down_event); |
| 122 | 153 |
| 123 WebGestureEvent tap_event = | 154 WebGestureEvent tap_event = |
| 124 MakeGestureEvent(WebInputEvent::GestureTap, time_ms, x, y); | 155 MakeGestureEvent(WebInputEvent::GestureTap, time_ms, x, y); |
| 125 tap_event.data.tap.tapCount = 1; | 156 tap_event.data.tap.tapCount = 1; |
| 126 SendGestureEvent(tap_event); | 157 ForwardGestureEvent(tap_event); |
| 127 } | 158 } |
| 128 | 159 |
| 129 void VrInputManager::PinchBegin(int64_t time_ms, float x, float y) { | 160 void VrInputManager::PinchBegin(int64_t time_ms, float x, float y) { |
| 130 WebGestureEvent event = | 161 WebGestureEvent event = |
| 131 MakeGestureEvent(WebInputEvent::GesturePinchBegin, time_ms, x, y); | 162 MakeGestureEvent(WebInputEvent::GesturePinchBegin, time_ms, x, y); |
| 132 SendGestureEvent(event); | 163 ForwardGestureEvent(event); |
| 133 } | 164 } |
| 134 | 165 |
| 135 void VrInputManager::PinchEnd(int64_t time_ms) { | 166 void VrInputManager::PinchEnd(int64_t time_ms) { |
| 136 WebGestureEvent event = | 167 WebGestureEvent event = |
| 137 MakeGestureEvent(WebInputEvent::GesturePinchEnd, time_ms, 0, 0); | 168 MakeGestureEvent(WebInputEvent::GesturePinchEnd, time_ms, 0, 0); |
| 138 SendGestureEvent(event); | 169 ForwardGestureEvent(event); |
| 139 } | 170 } |
| 140 | 171 |
| 141 void VrInputManager::PinchBy(int64_t time_ms, | 172 void VrInputManager::PinchBy(int64_t time_ms, |
| 142 float anchor_x, | 173 float anchor_x, |
| 143 float anchor_y, | 174 float anchor_y, |
| 144 float delta) { | 175 float delta) { |
| 145 WebGestureEvent event = MakeGestureEvent(WebInputEvent::GesturePinchUpdate, | 176 WebGestureEvent event = MakeGestureEvent(WebInputEvent::GesturePinchUpdate, |
| 146 time_ms, anchor_x, anchor_y); | 177 time_ms, anchor_x, anchor_y); |
| 147 event.data.pinchUpdate.scale = delta; | 178 event.data.pinchUpdate.scale = delta; |
| 148 | 179 |
| 149 SendGestureEvent(event); | 180 ForwardGestureEvent(event); |
| 150 } | 181 } |
| 151 | 182 |
| 152 void VrInputManager::SendPinchEvent(int64_t time_ms, | 183 void VrInputManager::SendPinchEvent(int64_t time_ms, |
| 153 float x, | 184 float x, |
| 154 float y, | 185 float y, |
| 155 float dz, | 186 float dz, |
| 156 int type) { | 187 int type) { |
| 157 switch (type) { | 188 switch (type) { |
| 158 case WebInputEvent::GesturePinchBegin: { | 189 case WebInputEvent::GesturePinchBegin: { |
| 159 WebGestureEvent event_start = | 190 WebGestureEvent event_start = |
| 160 MakeGestureEvent(WebInputEvent::GesturePinchBegin, time_ms, x, y); | 191 MakeGestureEvent(WebInputEvent::GesturePinchBegin, time_ms, x, y); |
| 161 SendGestureEvent(event_start); | 192 ForwardGestureEvent(event_start); |
| 162 break; | 193 break; |
| 163 } | 194 } |
| 164 case WebInputEvent::GesturePinchUpdate: { | 195 case WebInputEvent::GesturePinchUpdate: { |
| 165 WebGestureEvent event = | 196 WebGestureEvent event = |
| 166 MakeGestureEvent(WebInputEvent::GesturePinchUpdate, time_ms, x, y); | 197 MakeGestureEvent(WebInputEvent::GesturePinchUpdate, time_ms, x, y); |
| 167 event.data.pinchUpdate.scale = dz; | 198 event.data.pinchUpdate.scale = dz; |
| 168 | 199 |
| 169 SendGestureEvent(event); | 200 ForwardGestureEvent(event); |
| 170 break; | 201 break; |
| 171 } | 202 } |
| 172 case WebInputEvent::GesturePinchEnd: { | 203 case WebInputEvent::GesturePinchEnd: { |
| 173 WebGestureEvent event_end = | 204 WebGestureEvent event_end = |
| 174 MakeGestureEvent(WebInputEvent::GesturePinchEnd, time_ms, 0, 0); | 205 MakeGestureEvent(WebInputEvent::GesturePinchEnd, time_ms, 0, 0); |
| 175 SendGestureEvent(event_end); | 206 ForwardGestureEvent(event_end); |
| 176 break; | 207 break; |
| 177 } | 208 } |
| 178 } | 209 } |
| 179 } | 210 } |
| 180 | 211 |
| 181 WebGestureEvent VrInputManager::MakeGestureEvent(WebInputEvent::Type type, | 212 WebGestureEvent VrInputManager::MakeGestureEvent(WebInputEvent::Type type, |
| 182 int64_t time_ms, | 213 int64_t time_ms, |
| 183 float x, | 214 float x, |
| 184 float y) const { | 215 float y) const { |
| 185 WebGestureEvent result; | 216 WebGestureEvent result; |
| 186 | 217 |
| 187 result.type = type; | 218 result.type = type; |
| 188 result.x = x / dpi_scale_; | 219 result.x = x / dpi_scale_; |
| 189 result.y = y / dpi_scale_; | 220 result.y = y / dpi_scale_; |
| 190 result.timeStampSeconds = time_ms / 1000.0; | 221 result.timeStampSeconds = time_ms / 1000.0; |
| 191 result.sourceDevice = blink::WebGestureDeviceTouchscreen; | 222 result.sourceDevice = blink::WebGestureDeviceTouchscreen; |
| 192 | 223 |
| 193 return result; | 224 return result; |
| 194 } | 225 } |
| 195 | 226 |
| 196 void VrInputManager::SendGestureEvent(const blink::WebGestureEvent& event) { | 227 void VrInputManager::ForwardGestureEvent(const blink::WebGestureEvent& event) { |
| 197 content::RenderWidgetHost* rwh = | 228 content::RenderWidgetHost* rwh = |
| 198 web_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost(); | 229 web_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost(); |
| 199 if (rwh) | 230 if (rwh) |
| 200 rwh->ForwardGestureEvent(event); | 231 rwh->ForwardGestureEvent(event); |
| 201 } | 232 } |
| 202 | 233 |
| 203 void VrInputManager::SendMouseEvent(const blink::WebMouseEvent& event) { | 234 void VrInputManager::ForwardMouseEvent(const blink::WebMouseEvent& event) { |
| 204 content::RenderWidgetHost* rwh = | 235 content::RenderWidgetHost* rwh = |
| 205 web_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost(); | 236 web_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost(); |
| 206 if (rwh) | 237 if (rwh) |
| 207 rwh->ForwardMouseEvent(event); | 238 rwh->ForwardMouseEvent(event); |
| 208 } | 239 } |
| 209 | 240 |
| 210 } // namespace vr_shell | 241 } // namespace vr_shell |
| OLD | NEW |