| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/vr/platform_ui_input_delegate.h" |
| |
| #include "base/callback_helpers.h" |
| #include "base/time/time.h" |
| #include "chrome/browser/vr/platform_input_handler.h" |
| |
| namespace vr { |
| |
| namespace { |
| |
| static constexpr gfx::PointF kOutOfBoundsPoint = {-0.5f, -0.5f}; |
| |
| } // namespace |
| |
| PlatformUiInputDelegate::PlatformUiInputDelegate() {} |
| PlatformUiInputDelegate::PlatformUiInputDelegate( |
| PlatformInputHandler* input_handler) |
| : input_handler_(input_handler) {} |
| |
| PlatformUiInputDelegate::~PlatformUiInputDelegate() = default; |
| |
| void PlatformUiInputDelegate::OnHoverEnter( |
| const gfx::PointF& normalized_hit_point, |
| base::TimeTicks timestamp) { |
| SendGestureToTarget( |
| MakeInputEvent(InputEvent::kHoverEnter, normalized_hit_point, timestamp)); |
| } |
| |
| void PlatformUiInputDelegate::OnHoverLeave(base::TimeTicks timestamp) { |
| // Note that we send an out of bounds hover leave event. With blink feature |
| // UpdateHoverPostLayout turned on, a MouseMove event will dispatched post a |
| // Layout. Sending a mouse leave event at 0,0 will result continuous |
| // MouseMove events sent to the content if the content keeps relayout itself. |
| // See https://crbug.com/762573 for details. |
| SendGestureToTarget( |
| MakeInputEvent(InputEvent::kHoverLeave, kOutOfBoundsPoint, timestamp)); |
| } |
| |
| void PlatformUiInputDelegate::OnHoverMove( |
| const gfx::PointF& normalized_hit_point, |
| base::TimeTicks timestamp) { |
| SendGestureToTarget( |
| MakeInputEvent(InputEvent::kHoverMove, normalized_hit_point, timestamp)); |
| } |
| |
| void PlatformUiInputDelegate::OnButtonDown( |
| const gfx::PointF& normalized_hit_point, |
| base::TimeTicks timestamp) { |
| SendGestureToTarget( |
| MakeInputEvent(InputEvent::kButtonDown, normalized_hit_point, timestamp)); |
| } |
| |
| void PlatformUiInputDelegate::OnButtonUp( |
| const gfx::PointF& normalized_hit_point, |
| base::TimeTicks timestamp) { |
| SendGestureToTarget( |
| MakeInputEvent(InputEvent::kButtonUp, normalized_hit_point, timestamp)); |
| } |
| |
| void PlatformUiInputDelegate::OnTouchMove( |
| const gfx::PointF& normalized_hit_point, |
| base::TimeTicks timestamp) { |
| SendGestureToTarget( |
| MakeInputEvent(InputEvent::kMove, normalized_hit_point, timestamp)); |
| } |
| |
| void PlatformUiInputDelegate::OnInputEvent( |
| std::unique_ptr<InputEvent> event, |
| const gfx::PointF& normalized_hit_point) { |
| UpdateGesture(normalized_hit_point, event.get()); |
| SendGestureToTarget(std::move(event)); |
| } |
| |
| void PlatformUiInputDelegate::UpdateGesture( |
| const gfx::PointF& normalized_content_hit_point, |
| InputEvent* gesture) { |
| gesture->set_position_in_widget( |
| ScalePoint(normalized_content_hit_point, size_.width(), size_.height())); |
| } |
| |
| void PlatformUiInputDelegate::SendGestureToTarget( |
| std::unique_ptr<InputEvent> event) { |
| if (!event || !input_handler_) |
| return; |
| |
| input_handler_->ForwardEventToPlatformUi(std::move(event)); |
| } |
| |
| std::unique_ptr<InputEvent> PlatformUiInputDelegate::MakeInputEvent( |
| InputEvent::Type type, |
| const gfx::PointF& normalized_web_content_location, |
| base::TimeTicks time_stamp) const { |
| gfx::Point location = CalculateLocation(normalized_web_content_location); |
| |
| auto event = std::make_unique<InputEvent>(type); |
| event->set_time_stamp(time_stamp); |
| event->SetPositionInWidget(location.x(), location.y()); |
| return event; |
| } |
| |
| gfx::Point PlatformUiInputDelegate::CalculateLocation( |
| const gfx::PointF& normalized_web_content_location) const { |
| return gfx::Point(size_.width() * normalized_web_content_location.x(), |
| size_.height() * normalized_web_content_location.y()); |
| } |
| |
| } // namespace vr |