| // Copyright 2014 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_INPUT_RENDER_INPUT_ROUTER_LATENCY_TRACKER_H_ |
| #define COMPONENTS_INPUT_RENDER_INPUT_ROUTER_LATENCY_TRACKER_H_ |
| |
| #include <stdint.h> |
| |
| #include "base/memory/raw_ptr.h" |
| #include "base/sequence_checker.h" |
| #include "components/input/event_with_latency_info.h" |
| #include "base/component_export.h" |
| #include "third_party/blink/public/mojom/input/input_event_result.mojom-shared.h" |
| #include "ui/latency/latency_info.h" |
| |
| namespace input { |
| |
| class RenderInputRouterDelegate; |
| |
| // Utility class for tracking the latency of events passing through |
| // a given RenderWidgetHost. |
| class COMPONENT_EXPORT(INPUT) RenderInputRouterLatencyTracker { |
| public: |
| explicit RenderInputRouterLatencyTracker(RenderInputRouterDelegate* delegate); |
| |
| RenderInputRouterLatencyTracker(const RenderInputRouterLatencyTracker&) = |
| delete; |
| RenderInputRouterLatencyTracker& operator=( |
| const RenderInputRouterLatencyTracker&) = delete; |
| |
| virtual ~RenderInputRouterLatencyTracker(); |
| |
| // Sets `latency`'s `trace_id` field to the next global ID. |
| void OnEventStart(ui::LatencyInfo* latency); |
| |
| // Populates the LatencyInfo with relevant entries for latency tracking. |
| // Called when an event is received by the RenderWidgetHost, prior to |
| // that event being forwarded to the renderer (via the InputRouter). |
| void OnInputEvent(const blink::WebInputEvent& event, |
| ui::LatencyInfo* latency, |
| ui::EventLatencyMetadata* event_latency_metadata); |
| |
| // Populates the LatencyInfo with relevant entries for latency tracking, also |
| // terminating latency tracking for events that did not trigger rendering and |
| // performing relevant UMA latency reporting. Called when an event is ack'ed |
| // to the RenderWidgetHost (from the InputRouter). |
| void OnInputEventAck(const blink::WebInputEvent& event, |
| ui::LatencyInfo* latency, |
| blink::mojom::InputEventResultState ack_result); |
| |
| void reset_delegate() { render_input_router_delegate_ = nullptr; } |
| |
| private: |
| bool has_seen_first_gesture_scroll_update_ = false; |
| int64_t gesture_scroll_id_ = -1; |
| int64_t touch_trace_id_ = -1; |
| |
| // Whether the current stream of touch events includes more than one active |
| // touch point. This is set in OnInputEvent, and cleared in OnInputEventAck. |
| bool active_multi_finger_gesture_; |
| // Whether the touch start for the current stream of touch events had its |
| // default action prevented. Only valid for single finger gestures. |
| bool touch_start_default_prevented_; |
| |
| raw_ptr<RenderInputRouterDelegate> render_input_router_delegate_; |
| |
| // This class expects to be constructed and used on the same sequence. |
| SEQUENCE_CHECKER(sequence_checker_); |
| }; |
| |
| } // namespace input |
| |
| #endif // COMPONENTS_INPUT_RENDER_INPUT_ROUTER_LATENCY_TRACKER_H_ |