diff --git a/libcef/browser/osr/render_widget_host_view_osr.cc b/libcef/browser/osr/render_widget_host_view_osr.cc index 934b2caba59df8223310ba85954c4974f2add00f..ad8417243454eba684b42014c3d3e64c80eb97c4 100644 --- a/libcef/browser/osr/render_widget_host_view_osr.cc +++ b/libcef/browser/osr/render_widget_host_view_osr.cc @@ -60,6 +60,8 @@ #endif #if BUILDFLAG(IS_OHOS) +#include "base/ohos/touch_event_sync_lock.h" +#include "base/sync_composition_queue.h" #include "base/ohos/sys_info_utils.h" #include "content/browser/renderer_host/render_view_host_delegate_view.h" #include "res_sched_client_adapter.h" @@ -693,9 +695,17 @@ void CefRenderWidgetHostViewOSR::SendTouchEventList(const std::vector 0); + ui::FilteredGestureProvider::TouchHandlingResult result = gesture_provider_.OnTouchEvent(pointer_state_); + if (touch_event.GetType() == blink::WebInputEvent::Type::kTouchMove) { + web_touch_event_count_++; + } + LOG(DEBUG) << "CefRenderWidgetHostViewOSR::SendTouchEventList web_touch_event_count_:" + << web_touch_event_count_; + blink::WebTouchEvent touch_event = ui::CreateWebTouchEventFromMotionEvent( pointer_state_, result.moved_beyond_slop_region, false); @@ -711,14 +721,16 @@ void CefRenderWidgetHostViewOSR::SendTouchEventList(const std::vectordelegate()->GetInputEventRouter()->RouteTouchEvent( - this, &touch_event, latency_info); + +#if defined(OHOS_PERFORMANCE_JITTER) + // Don't push the first three times so that will not affect touch delay + if (touch_event.GetType() == blink::WebInputEvent::Type::kTouchMove && + web_touch_event_count_ > KFirstRecordingTimes) { + web_touch_event_queue_.push_back(touch_event); } else { - render_widget_host_->ForwardTouchEventWithLatencyInfo(touch_event, - latency_info); + SendTouchGestureEvent(touch_event); } +#endif bool touch_end = touch_event.GetType() == blink::WebInputEvent::Type::kTouchEnd || @@ -729,6 +741,20 @@ void CefRenderWidgetHostViewOSR::SendTouchEventList(const std::vectorforward_touch_to_popup_ = false; } } + +#if defined(OHOS_PERFORMANCE_JITTER) +void CefRenderWidgetHostViewOSR::SendTouchGestureEvent(blink::WebTouchEvent& touch_event) { + ui::LatencyInfo latency_info = CreateLatencyInfo(touch_event); + if (ShouldRouteEvents()) { + render_widget_host_->delegate()->GetInputEventRouter()->RouteTouchEvent( + this, &touch_event, latency_info); + } else { + render_widget_host_->ForwardTouchEventWithLatencyInfo(touch_event, + latency_info); + } + base::TouchEventSyncLock::GetInstance().NotifyForTouchEvent(); +} +#endif #endif void CefRenderWidgetHostViewOSR::EnsureSurfaceSynchronizedForWebTest() { @@ -1976,6 +2002,11 @@ void CefRenderWidgetHostViewOSR::SendTouchEvent(const CefTouchEvent& event) { } else { LOG(ERROR) << "compositor is null when send touch event"; } + base::TouchEventSyncLock::GetInstance().SetNeedSync(); + } + + if (event.type == CEF_TET_PRESSED || event.type == CEF_TET_RELEASED || event.type == CEF_TET_CANCELLED) { + web_touch_event_count_ = 0; } #endif @@ -2179,6 +2210,24 @@ void CefRenderWidgetHostViewOSR::ProcessAckedTouchEvent( void CefRenderWidgetHostViewOSR::OnVsync() { TRACE_EVENT0("base", "CefRenderWidgetHostViewOSR::OnVsync"); + TRACE_EVENT2("base", "CefRenderWidgetHostViewOSR::OnVsync", + "web_touch_event_queue_.size()", web_touch_event_queue_.size(), + "gesture_event_queue_.size()", gesture_event_queue_.size()); + if (web_touch_event_queue_.size() > kMaxGestureQueueSize) { + LOG(ERROR) << "web touch event queue size is error:" + << web_touch_event_queue_.size(); + web_touch_event_queue_.clear(); + base::TouchEventSyncLock::GetInstance().NotifyForTouchEvent(); + } + + if (!web_touch_event_queue_.empty()) { + blink::WebTouchEvent touchEvent = web_touch_event_queue_.front(); + SendTouchGestureEvent(touchEvent); + web_touch_event_queue_.pop_front(); + } else { + base::TouchEventSyncLock::GetInstance().NotifyForTouchEvent(); + } + if (gesture_event_queue_.size() > kMaxGestureQueueSize) { LOG(ERROR) << "gesture event queue size is error:" << gesture_event_queue_.size(); @@ -2204,11 +2253,15 @@ void CefRenderWidgetHostViewOSR::OnGestureEvent( FilterScrollEventImpl(gesture); #endif #if BUILDFLAG(IS_OHOS) && defined(OHOS_PERFORMANCE_JITTER) + if (gesture.type() == ui::ET_GESTURE_SCROLL_BEGIN) { gesture_update_count_ = 0; } else if (gesture.type() == ui::ET_GESTURE_SCROLL_UPDATE) { gesture_update_count_++; } + + TRACE_EVENT1("base", "zhaopf CefRenderWidgetHostViewOSR::OnGestureEvent", + "gesture_update_count_", gesture_update_count_); // Don't push the first three times so that will not affect touch delay if (gesture.type() == ui::ET_GESTURE_SCROLL_UPDATE && gesture_update_count_ > KFirstRecordingTimes) { diff --git a/libcef/browser/osr/render_widget_host_view_osr.h b/libcef/browser/osr/render_widget_host_view_osr.h index b1dde74ee0b070c202d04d9641f0402fd2c7fcaa..0c6a69a450264612d339b0aca54fc3a0705d2b79 100644 --- a/libcef/browser/osr/render_widget_host_view_osr.h +++ b/libcef/browser/osr/render_widget_host_view_osr.h @@ -281,6 +281,8 @@ class CefRenderWidgetHostViewOSR void OnVsync(); void SendGestureEvent(const ui::GestureEventData& gesture); + + void SendTouchGestureEvent(blink::WebTouchEvent& touch_event); #endif #if defined(OHOS_INPUT_EVENTS) @@ -585,6 +587,9 @@ class CefRenderWidgetHostViewOSR base::circular_deque gesture_event_queue_; size_t gesture_update_count_ = 0; + + base::circular_deque web_touch_event_queue_; + size_t web_touch_event_count_ = 0; #endif #endif