0

[tracing] Add higher-level LatencyInfo.Flow events in RenderInputRouter

This change adds LatencyInfo.flow events to
RenderInputRouter::ForwardGestureEventWithLatencyInfo
and RenderInputRouter::ForwardTouchEventWithLatencyInfo to get fuller
work coverage.

Low-Coverage-Reason: TESTS_IN_SEPARATE_CL
Bug: b:356584965
Change-Id: If5b1f52d0190b5bce9c85610bfd41a5ea4dd2d65
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5766653
Commit-Queue: Oksana Zhuravlova <oksamyt@chromium.org>
Reviewed-by: Alexander Timin <altimin@chromium.org>
Reviewed-by: Robert Flack <flackr@chromium.org>
Reviewed-by: Tushar Agarwal <agarwaltushar@google.com>
Cr-Commit-Position: refs/heads/main@{#1352858}
This commit is contained in:
Oksana Zhuravlova
2024-09-09 17:29:48 +00:00
committed by Chromium LUCI CQ
parent 561a14bf24
commit 7cfc830947
5 changed files with 51 additions and 11 deletions

@@ -320,6 +320,18 @@ void RenderInputRouter::ForwardGestureEventWithLatencyInfo(
TRACE_EVENT1("input", "RenderInputRouter::ForwardGestureEvent", "type", TRACE_EVENT1("input", "RenderInputRouter::ForwardGestureEvent", "type",
WebInputEvent::GetName(gesture_event.GetType())); WebInputEvent::GetName(gesture_event.GetType()));
input::GestureEventWithLatencyInfo gesture_with_latency(gesture_event,
latency_info);
// Assigns a `trace_id` to the latency object.
latency_tracker_->OnEventStart(&gesture_with_latency.latency);
TRACE_EVENT("input,benchmark,latencyInfo", "LatencyInfo.Flow",
[&gesture_with_latency](perfetto::EventContext ctx) {
ui::LatencyInfo::FillTraceEvent(gesture_with_latency.latency,
ctx);
});
// Early out if necessary, prior to performing latency logic. // Early out if necessary, prior to performing latency logic.
if (delegate_->IsIgnoringWebInputEvents(gesture_event)) { if (delegate_->IsIgnoringWebInputEvents(gesture_event)) {
// IgnoreWebInputEvents is primarily concerned with suppressing event // IgnoreWebInputEvents is primarily concerned with suppressing event
@@ -360,8 +372,6 @@ void RenderInputRouter::ForwardGestureEventWithLatencyInfo(
return; return;
} }
input::GestureEventWithLatencyInfo gesture_with_latency(gesture_event,
latency_info);
DispatchInputEventWithLatencyInfo( DispatchInputEventWithLatencyInfo(
gesture_with_latency.event, &gesture_with_latency.latency, gesture_with_latency.event, &gesture_with_latency.latency,
&gesture_with_latency.event.GetModifiableEventLatencyMetadata()); &gesture_with_latency.event.GetModifiableEventLatencyMetadata());
@@ -450,6 +460,16 @@ void RenderInputRouter::ForwardTouchEventWithLatencyInfo(
// ignored if appropriate in FilterInputEvent(). // ignored if appropriate in FilterInputEvent().
input::TouchEventWithLatencyInfo touch_with_latency(touch_event, latency); input::TouchEventWithLatencyInfo touch_with_latency(touch_event, latency);
// Assigns a `trace_id` to the latency object.
latency_tracker_->OnEventStart(&touch_with_latency.latency);
TRACE_EVENT("input,benchmark,latencyInfo", "LatencyInfo.Flow",
[&touch_with_latency](perfetto::EventContext ctx) {
ui::LatencyInfo::FillTraceEvent(touch_with_latency.latency,
ctx);
});
DispatchInputEventWithLatencyInfo( DispatchInputEventWithLatencyInfo(
touch_with_latency.event, &touch_with_latency.latency, touch_with_latency.event, &touch_with_latency.latency,
&touch_with_latency.event.GetModifiableEventLatencyMetadata()); &touch_with_latency.event.GetModifiableEventLatencyMetadata());

@@ -214,8 +214,10 @@ void RenderInputRouterLatencyTracker::OnInputEventAck(
} }
void RenderInputRouterLatencyTracker::OnEventStart(ui::LatencyInfo* latency) { void RenderInputRouterLatencyTracker::OnEventStart(ui::LatencyInfo* latency) {
static uint64_t global_trace_id = 0; if (latency->trace_id() == -1) {
latency->set_trace_id(++global_trace_id); static uint64_t global_trace_id = 0;
latency->set_trace_id(++global_trace_id);
}
} }
} // namespace input } // namespace input

@@ -31,6 +31,9 @@ class COMPONENT_EXPORT(INPUT) RenderInputRouterLatencyTracker {
virtual ~RenderInputRouterLatencyTracker(); 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. // Populates the LatencyInfo with relevant entries for latency tracking.
// Called when an event is received by the RenderWidgetHost, prior to // Called when an event is received by the RenderWidgetHost, prior to
// that event being forwarded to the renderer (via the InputRouter). // that event being forwarded to the renderer (via the InputRouter).
@@ -49,11 +52,9 @@ class COMPONENT_EXPORT(INPUT) RenderInputRouterLatencyTracker {
void reset_delegate() { render_input_router_delegate_ = nullptr; } void reset_delegate() { render_input_router_delegate_ = nullptr; }
private: private:
void OnEventStart(ui::LatencyInfo* latency); bool has_seen_first_gesture_scroll_update_ = false;
int64_t gesture_scroll_id_ = -1;
bool has_seen_first_gesture_scroll_update_; int64_t touch_trace_id_ = -1;
int64_t gesture_scroll_id_;
int64_t touch_trace_id_;
// Whether the current stream of touch events includes more than one active // Whether the current stream of touch events includes more than one active
// touch point. This is set in OnInputEvent, and cleared in OnInputEventAck. // touch point. This is set in OnInputEvent, and cleared in OnInputEventAck.

@@ -122,6 +122,17 @@ void LatencyInfo::TraceIntermediateFlowEvents(
} }
} }
void LatencyInfo::FillTraceEvent(const LatencyInfo& latency,
const perfetto::EventContext& ctx) {
perfetto::protos::pbzero::ChromeLatencyInfo* info =
ctx.event()->set_chrome_latency_info();
info->set_trace_id(latency.trace_id());
tracing::FillFlowEvent(
ctx, perfetto::protos::pbzero::TrackEvent::LegacyEvent::FLOW_OUT,
latency.trace_id());
}
void LatencyInfo::AddNewLatencyFrom(const LatencyInfo& other) { void LatencyInfo::AddNewLatencyFrom(const LatencyInfo& other) {
// Don't clobber an existing trace_id_. // Don't clobber an existing trace_id_.
if (trace_id_ == -1) { if (trace_id_ == -1) {
@@ -199,8 +210,8 @@ void LatencyInfo::AddLatencyNumberWithTimestampImpl(
ctx.event<perfetto::protos::pbzero::ChromeTrackEvent>() ctx.event<perfetto::protos::pbzero::ChromeTrackEvent>()
->set_chrome_latency_info(); ->set_chrome_latency_info();
info->set_trace_id(trace_id_); info->set_trace_id(trace_id_);
tracing::FillFlowEvent(ctx, TrackEvent::LegacyEvent::FLOW_OUT, tracing::FillFlowEvent(
trace_id_); ctx, TrackEvent::LegacyEvent::FLOW_INOUT, trace_id_);
}); });
} }

@@ -11,6 +11,7 @@
#include "base/time/time.h" #include "base/time/time.h"
#include "build/blink_buildflags.h" #include "build/blink_buildflags.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "services/tracing/public/cpp/perfetto/flow_event_utils.h"
#include "third_party/perfetto/protos/perfetto/trace/track_event/chrome_latency_info.pbzero.h" #include "third_party/perfetto/protos/perfetto/trace/track_event/chrome_latency_info.pbzero.h"
#if BUILDFLAG(USE_BLINK) #if BUILDFLAG(USE_BLINK)
@@ -103,6 +104,11 @@ class LatencyInfo {
const std::vector<LatencyInfo>& latency_info, const std::vector<LatencyInfo>& latency_info,
perfetto::protos::pbzero::ChromeLatencyInfo::Step step); perfetto::protos::pbzero::ChromeLatencyInfo::Step step);
// Populates fields for a `LatencyInfo.Flow` event with `ctx`
// from `latency`.
static void FillTraceEvent(const LatencyInfo& latency,
const perfetto::EventContext& ctx);
// Add timestamps for components that are in |other| but not in |this|. // Add timestamps for components that are in |other| but not in |this|.
void AddNewLatencyFrom(const LatencyInfo& other); void AddNewLatencyFrom(const LatencyInfo& other);