diff --git a/viewer/document_view.cc b/viewer/document_view.cc index d4c82e57bbb..2990c586166 100644 --- a/viewer/document_view.cc +++ b/viewer/document_view.cc @@ -73,6 +73,32 @@ mojo::Target WebNavigationPolicyToNavigationTarget( } } +ui::EventType ConvertEventTypeToUIEventType(blink::WebInputEvent::Type type) { + if (type == blink::WebInputEvent::PointerDown) + return ui::ET_TOUCH_PRESSED; + if (type == blink::WebInputEvent::PointerUp) + return ui::ET_TOUCH_RELEASED; + if (type == blink::WebInputEvent::PointerMove) + return ui::ET_TOUCH_MOVED; + DCHECK(type == blink::WebInputEvent::PointerCancel); + return ui::ET_TOUCH_CANCELLED; +} + +scoped_ptr ConvertToUITouchEvent( + const blink::WebInputEvent& event, + float device_pixel_ratio) { + if (!blink::WebInputEvent::isPointerEventType(event.type)) + return nullptr; + const blink::WebPointerEvent& pointer_event = + static_cast(event); + return make_scoped_ptr(new ui::TouchEvent( + ConvertEventTypeToUIEventType(event.type), + gfx::PointF(pointer_event.x * device_pixel_ratio, + pointer_event.y * device_pixel_ratio), + pointer_event.pointer, + base::TimeDelta::FromMillisecondsD(pointer_event.timeStampMS))); +} + } // namespace static int s_next_debugger_id = 1; @@ -304,31 +330,32 @@ void DocumentView::OnViewDestroyed(mojo::View* view) { root_ = nullptr; } -bool DocumentView::DispatchInputEvent(const mojo::EventPtr& event) { - scoped_ptr web_event = - ConvertEvent(event, GetDevicePixelRatio()); - return web_event && web_view_->handleInputEvent(*web_event); -} - void DocumentView::OnViewInputEvent( mojo::View* view, const mojo::EventPtr& event) { + float device_pixel_ratio = GetDevicePixelRatio(); + scoped_ptr web_event = + ConvertEvent(event, device_pixel_ratio); + if (!web_event) + return; - scoped_ptr ui_event(event.To>()); - ui::TouchEvent* touch_event = nullptr; - if (ui_event->IsTouchEvent()) { - touch_event = static_cast(ui_event.get()); - ui::GestureRecognizer::Get()->ProcessTouchEventPreDispatch( - *touch_event, this); - } + ui::GestureRecognizer* recognizer = ui::GestureRecognizer::Get(); + scoped_ptr touch_event = + ConvertToUITouchEvent(*web_event, device_pixel_ratio); + if (touch_event) + recognizer->ProcessTouchEventPreDispatch(*touch_event, this); - bool handled = DispatchInputEvent(event); + bool handled = web_view_->handleInputEvent(*web_event); if (touch_event) { ui::EventResult result = handled ? ui::ER_UNHANDLED : ui::ER_UNHANDLED; - if (auto gestures = ui::GestureRecognizer::Get()->ProcessTouchEventPostDispatch( - *touch_event, result, this)) { - for (auto& gesture : *gestures) - DispatchInputEvent(mojo::Event::From(*gesture)); + if (auto gestures = recognizer->ProcessTouchEventPostDispatch( + *touch_event, result, this)) { + for (auto& gesture : *gestures) { + scoped_ptr gesture_event = + ConvertEvent(mojo::Event::From(*gesture), device_pixel_ratio); + if (gesture_event) + web_view_->handleInputEvent(*gesture_event); + } } } } diff --git a/viewer/document_view.h b/viewer/document_view.h index 56568d5123f..ae1895be9db 100644 --- a/viewer/document_view.h +++ b/viewer/document_view.h @@ -123,8 +123,6 @@ class DocumentView : public blink::ServiceProvider, void OnViewDestroyed(mojo::View* view) override; void OnViewInputEvent(mojo::View* view, const mojo::EventPtr& event) override; - bool DispatchInputEvent(const mojo::EventPtr& event); - void Load(mojo::URLResponsePtr response); float GetDevicePixelRatio() const; scoped_ptr CreateRasterizer();