| Index: ui/latency/latency_tracker.cc
|
| diff --git a/content/browser/renderer_host/input/render_widget_host_latency_tracker.cc b/ui/latency/latency_tracker.cc
|
| similarity index 28%
|
| copy from content/browser/renderer_host/input/render_widget_host_latency_tracker.cc
|
| copy to ui/latency/latency_tracker.cc
|
| index 5c4f789315389acc924a718f744c2dab60c54059..085970a254e14a176c9c607f07c6a5f9f6cba118 100644
|
| --- a/content/browser/renderer_host/input/render_widget_host_latency_tracker.cc
|
| +++ b/ui/latency/latency_tracker.cc
|
| @@ -2,132 +2,14 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "content/browser/renderer_host/input/render_widget_host_latency_tracker.h"
|
| +#include "ui/latency/latency_tracker.h"
|
|
|
| -#include <stddef.h>
|
| -
|
| -#include "base/logging.h"
|
| #include "base/metrics/histogram_functions.h"
|
| #include "base/metrics/histogram_macros.h"
|
| -#include "build/build_config.h"
|
| -#include "components/rappor/public/rappor_utils.h"
|
| -#include "content/browser/renderer_host/render_widget_host_delegate.h"
|
| -#include "content/public/browser/content_browser_client.h"
|
| -#include "content/public/common/content_client.h"
|
| -#include "ui/events/blink/web_input_event_traits.h"
|
| -
|
| -using blink::WebGestureEvent;
|
| -using blink::WebInputEvent;
|
| -using blink::WebMouseEvent;
|
| -using blink::WebMouseWheelEvent;
|
| -using blink::WebTouchEvent;
|
| -using ui::LatencyInfo;
|
| -
|
| -namespace content {
|
| -namespace {
|
| -
|
| -void UpdateLatencyCoordinatesImpl(const blink::WebTouchEvent& touch,
|
| - LatencyInfo* latency,
|
| - float device_scale_factor) {
|
| - for (uint32_t i = 0; i < touch.touchesLength; ++i) {
|
| - gfx::PointF coordinate(touch.touches[i].position.x * device_scale_factor,
|
| - touch.touches[i].position.y * device_scale_factor);
|
| - if (!latency->AddInputCoordinate(coordinate))
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void UpdateLatencyCoordinatesImpl(const WebGestureEvent& gesture,
|
| - LatencyInfo* latency,
|
| - float device_scale_factor) {
|
| - latency->AddInputCoordinate(gfx::PointF(gesture.x * device_scale_factor,
|
| - gesture.y * device_scale_factor));
|
| -}
|
| -
|
| -void UpdateLatencyCoordinatesImpl(const WebMouseEvent& mouse,
|
| - LatencyInfo* latency,
|
| - float device_scale_factor) {
|
| - latency->AddInputCoordinate(
|
| - gfx::PointF(mouse.positionInWidget().x * device_scale_factor,
|
| - mouse.positionInWidget().y * device_scale_factor));
|
| -}
|
| -
|
| -void UpdateLatencyCoordinatesImpl(const WebMouseWheelEvent& wheel,
|
| - LatencyInfo* latency,
|
| - float device_scale_factor) {
|
| - latency->AddInputCoordinate(
|
| - gfx::PointF(wheel.positionInWidget().x * device_scale_factor,
|
| - wheel.positionInWidget().y * device_scale_factor));
|
| -}
|
| +#include "ui/latency/latency_histogram_macros.h"
|
|
|
| -void UpdateLatencyCoordinates(const WebInputEvent& event,
|
| - float device_scale_factor,
|
| - LatencyInfo* latency) {
|
| - if (WebInputEvent::isMouseEventType(event.type())) {
|
| - UpdateLatencyCoordinatesImpl(static_cast<const WebMouseEvent&>(event),
|
| - latency, device_scale_factor);
|
| - } else if (WebInputEvent::isGestureEventType(event.type())) {
|
| - UpdateLatencyCoordinatesImpl(static_cast<const WebGestureEvent&>(event),
|
| - latency, device_scale_factor);
|
| - } else if (WebInputEvent::isTouchEventType(event.type())) {
|
| - UpdateLatencyCoordinatesImpl(static_cast<const WebTouchEvent&>(event),
|
| - latency, device_scale_factor);
|
| - } else if (event.type() == WebInputEvent::MouseWheel) {
|
| - UpdateLatencyCoordinatesImpl(static_cast<const WebMouseWheelEvent&>(event),
|
| - latency, device_scale_factor);
|
| - }
|
| -}
|
| -
|
| -// Check valid timing for start and end latency components.
|
| -#define CONFIRM_VALID_TIMING(start, end) \
|
| - DCHECK(!start.first_event_time.is_null()); \
|
| - DCHECK(!end.last_event_time.is_null()); \
|
| - DCHECK_GE(end.last_event_time, start.first_event_time);
|
| -
|
| -// Event latency that is mostly under 1 second. We should only use 100 buckets
|
| -// when needed.
|
| -#define UMA_HISTOGRAM_INPUT_LATENCY_HIGH_RESOLUTION_MICROSECONDS(name, start, \
|
| - end) \
|
| - CONFIRM_VALID_TIMING(start, end) \
|
| - base::UmaHistogramCustomCounts( \
|
| - name, (end.last_event_time - start.first_event_time).InMicroseconds(), \
|
| - 1, 1000000, 100);
|
| -
|
| -#define UMA_HISTOGRAM_INPUT_LATENCY_MILLISECONDS(name, start, end) \
|
| - CONFIRM_VALID_TIMING(start, end) \
|
| - base::UmaHistogramCustomCounts( \
|
| - name, (end.last_event_time - start.first_event_time).InMilliseconds(), \
|
| - 1, 1000, 50);
|
| -
|
| -// Touch/wheel to scroll latency using Rappor.
|
| -#define RAPPOR_TOUCH_WHEEL_TO_SCROLL_LATENCY(delegate, name, start, end) \
|
| - CONFIRM_VALID_TIMING(start, end) \
|
| - rappor::RapporService* rappor_service = \
|
| - GetContentClient()->browser()->GetRapporService(); \
|
| - if (rappor_service && delegate) { \
|
| - std::unique_ptr<rappor::Sample> sample = \
|
| - rappor_service->CreateSample(rappor::UMA_RAPPOR_TYPE); \
|
| - delegate->AddDomainInfoToRapporSample(sample.get()); \
|
| - sample->SetUInt64Field( \
|
| - "Latency", \
|
| - (end.last_event_time - start.first_event_time).InMicroseconds(), \
|
| - rappor::NO_NOISE); \
|
| - rappor_service->RecordSample(name, std::move(sample)); \
|
| - }
|
| -
|
| -// Long touch/wheel scroll latency component that is mostly under 200ms.
|
| -#define UMA_HISTOGRAM_SCROLL_LATENCY_LONG_2(name, start, end) \
|
| - CONFIRM_VALID_TIMING(start, end) \
|
| - base::Histogram::FactoryGet(name, 1000, 200000, 50, \
|
| - base::HistogramBase::kUmaTargetedHistogramFlag) \
|
| - ->Add((end.last_event_time - start.first_event_time).InMicroseconds());
|
| -
|
| -// Short touch/wheel scroll latency component that is mostly under 50ms.
|
| -#define UMA_HISTOGRAM_SCROLL_LATENCY_SHORT_2(name, start, end) \
|
| - CONFIRM_VALID_TIMING(start, end) \
|
| - base::Histogram::FactoryGet(name, 1, 50000, 50, \
|
| - base::HistogramBase::kUmaTargetedHistogramFlag) \
|
| - ->Add((end.last_event_time - start.first_event_time).InMicroseconds());
|
| +namespace ui {
|
| +namespace {
|
|
|
| std::string LatencySourceEventTypeToInputModalityString(
|
| ui::SourceEventType type) {
|
| @@ -141,23 +23,9 @@ std::string LatencySourceEventTypeToInputModalityString(
|
| }
|
| }
|
|
|
| -std::string WebInputEventTypeToInputModalityString(WebInputEvent::Type type) {
|
| - if (type == blink::WebInputEvent::MouseWheel) {
|
| - return "Wheel";
|
| - } else if (WebInputEvent::isKeyboardEventType(type)) {
|
| - return "Key";
|
| - } else if (WebInputEvent::isMouseEventType(type)) {
|
| - return "Mouse";
|
| - } else if (WebInputEvent::isTouchEventType(type)) {
|
| - return "Touch";
|
| - }
|
| - return "";
|
| -}
|
| -
|
| void ComputeScrollLatencyHistograms(
|
| const LatencyInfo::LatencyComponent& gpu_swap_begin_component,
|
| const LatencyInfo::LatencyComponent& gpu_swap_end_component,
|
| - int64_t latency_component_id,
|
| const LatencyInfo& latency) {
|
| DCHECK(!latency.coalesced());
|
| if (latency.coalesced())
|
| @@ -168,18 +36,18 @@ void ComputeScrollLatencyHistograms(
|
| LatencyInfo::LatencyComponent original_component;
|
| if (latency.FindLatency(
|
| ui::INPUT_EVENT_LATENCY_FIRST_SCROLL_UPDATE_ORIGINAL_COMPONENT,
|
| - latency_component_id, &original_component)) {
|
| + &original_component)) {
|
| // This UMA metric tracks the time between the final frame swap for the
|
| // first scroll event in a sequence and the original timestamp of that
|
| // scroll event's underlying touch event.
|
| for (size_t i = 0; i < original_component.event_count; i++) {
|
| UMA_HISTOGRAM_INPUT_LATENCY_HIGH_RESOLUTION_MICROSECONDS(
|
| - "Event.Latency.TouchToFirstScrollUpdateSwapBegin",
|
| - original_component, gpu_swap_begin_component);
|
| + "Event.Latency.TouchToFirstScrollUpdateSwapBegin", original_component,
|
| + gpu_swap_begin_component);
|
| }
|
| } else if (!latency.FindLatency(
|
| ui::INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT,
|
| - latency_component_id, &original_component)) {
|
| + &original_component)) {
|
| return;
|
| }
|
|
|
| @@ -192,11 +60,16 @@ void ComputeScrollLatencyHistograms(
|
| }
|
| }
|
|
|
| -void ComputeTouchAndWheelScrollLatencyHistograms(
|
| - RenderWidgetHostDelegate* render_widget_host_delegate,
|
| +} // namespace
|
| +
|
| +void LatencyTracker::ReportRapporScrollLatency(
|
| + const std::string& name,
|
| + const LatencyInfo::LatencyComponent& start_component,
|
| + const LatencyInfo::LatencyComponent& end_component) {}
|
| +
|
| +void LatencyTracker::ComputeTouchAndWheelScrollLatencyHistograms(
|
| const ui::LatencyInfo::LatencyComponent& gpu_swap_begin_component,
|
| const ui::LatencyInfo::LatencyComponent& gpu_swap_end_component,
|
| - int64_t latency_component_id,
|
| const ui::LatencyInfo& latency) {
|
| DCHECK(!latency.coalesced());
|
| if (latency.coalesced())
|
| @@ -210,7 +83,7 @@ void ComputeTouchAndWheelScrollLatencyHistograms(
|
|
|
| if (latency.FindLatency(
|
| ui::INPUT_EVENT_LATENCY_FIRST_SCROLL_UPDATE_ORIGINAL_COMPONENT,
|
| - latency_component_id, &original_component)) {
|
| + &original_component)) {
|
| scroll_name = "ScrollBegin";
|
| // This UMA metric tracks the time between the final frame swap for the
|
| // first scroll event in a sequence and the original timestamp of that
|
| @@ -220,11 +93,9 @@ void ComputeTouchAndWheelScrollLatencyHistograms(
|
| ".TimeToScrollUpdateSwapBegin2",
|
| original_component, gpu_swap_begin_component);
|
|
|
| - RAPPOR_TOUCH_WHEEL_TO_SCROLL_LATENCY(
|
| - render_widget_host_delegate,
|
| - "Event.Latency.ScrollBegin." + input_modality +
|
| - ".TimeToScrollUpdateSwapBegin2",
|
| - original_component, gpu_swap_begin_component);
|
| + ReportRapporScrollLatency("Event.Latency.ScrollBegin." + input_modality +
|
| + ".TimeToScrollUpdateSwapBegin2",
|
| + original_component, gpu_swap_begin_component);
|
|
|
| // TODO(lanwei): Will remove them when M56 is stable, see
|
| // https://crbug.com/669618.
|
| @@ -234,7 +105,7 @@ void ComputeTouchAndWheelScrollLatencyHistograms(
|
| original_component, gpu_swap_begin_component);
|
| } else if (latency.FindLatency(
|
| ui::INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT,
|
| - latency_component_id, &original_component)) {
|
| + &original_component)) {
|
| // This UMA metric tracks the time from when the original touch event is
|
| // created to when the scroll gesture results in final frame swap.
|
| // First scroll events are excluded from this metric.
|
| @@ -243,8 +114,7 @@ void ComputeTouchAndWheelScrollLatencyHistograms(
|
| "Event.Latency.ScrollUpdate.Touch.TimeToScrollUpdateSwapBegin2",
|
| original_component, gpu_swap_begin_component);
|
|
|
| - RAPPOR_TOUCH_WHEEL_TO_SCROLL_LATENCY(
|
| - render_widget_host_delegate,
|
| + ReportRapporScrollLatency(
|
| "Event.Latency.ScrollUpdate.Touch.TimeToScrollUpdateSwapBegin2",
|
| original_component, gpu_swap_begin_component);
|
| }
|
| @@ -282,9 +152,8 @@ void ComputeTouchAndWheelScrollLatencyHistograms(
|
| rendering_scheduled_component, renderer_swap_component);
|
|
|
| LatencyInfo::LatencyComponent browser_received_swap_component;
|
| - if (!latency.FindLatency(
|
| - ui::INPUT_EVENT_BROWSER_RECEIVED_RENDERER_SWAP_COMPONENT, 0,
|
| - &browser_received_swap_component))
|
| + if (!latency.FindLatency(ui::DISPLAY_COMPOSITOR_RECEIVED_FRAME_COMPONENT, 0,
|
| + &browser_received_swap_component))
|
| return;
|
|
|
| UMA_HISTOGRAM_SCROLL_LATENCY_SHORT_2(
|
| @@ -301,256 +170,19 @@ void ComputeTouchAndWheelScrollLatencyHistograms(
|
| "Event.Latency." + scroll_name + "." + input_modality + ".GpuSwap2",
|
| gpu_swap_begin_component, gpu_swap_end_component);
|
| }
|
| -// LatencyComponents generated in the renderer must have component IDs
|
| -// provided to them by the browser process. This function adds the correct
|
| -// component ID where necessary.
|
| -void AddLatencyInfoComponentIds(LatencyInfo* latency,
|
| - int64_t latency_component_id) {
|
| - std::vector<std::pair<ui::LatencyComponentType, int64_t>> new_components_key;
|
| - std::vector<LatencyInfo::LatencyComponent> new_components_value;
|
| - for (const auto& lc : latency->latency_components()) {
|
| - ui::LatencyComponentType component_type = lc.first.first;
|
| - if (component_type == ui::BROWSER_SNAPSHOT_FRAME_NUMBER_COMPONENT) {
|
| - // Generate a new component entry with the correct component ID
|
| - new_components_key.push_back(std::make_pair(component_type,
|
| - latency_component_id));
|
| - new_components_value.push_back(lc.second);
|
| - }
|
| - }
|
| -
|
| - // Remove the entries with invalid component IDs.
|
| - latency->RemoveLatency(ui::BROWSER_SNAPSHOT_FRAME_NUMBER_COMPONENT);
|
| -
|
| - // Add newly generated components into the latency info
|
| - for (size_t i = 0; i < new_components_key.size(); i++) {
|
| - latency->AddLatencyNumberWithTimestamp(
|
| - new_components_key[i].first,
|
| - new_components_key[i].second,
|
| - new_components_value[i].sequence_number,
|
| - new_components_value[i].event_time,
|
| - new_components_value[i].event_count);
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -RenderWidgetHostLatencyTracker::RenderWidgetHostLatencyTracker()
|
| - : last_event_id_(0),
|
| - latency_component_id_(0),
|
| - device_scale_factor_(1),
|
| - has_seen_first_gesture_scroll_update_(false),
|
| - active_multi_finger_gesture_(false),
|
| - touch_start_default_prevented_(false),
|
| - render_widget_host_delegate_(nullptr) {}
|
| -
|
| -RenderWidgetHostLatencyTracker::~RenderWidgetHostLatencyTracker() {}
|
| -
|
| -void RenderWidgetHostLatencyTracker::Initialize(int routing_id,
|
| - int process_id) {
|
| - DCHECK_EQ(0, last_event_id_);
|
| - DCHECK_EQ(0, latency_component_id_);
|
| - last_event_id_ = static_cast<int64_t>(process_id) << 32;
|
| - latency_component_id_ = routing_id | last_event_id_;
|
| -}
|
| -
|
| -void RenderWidgetHostLatencyTracker::ComputeInputLatencyHistograms(
|
| - WebInputEvent::Type type,
|
| - int64_t latency_component_id,
|
| - const LatencyInfo& latency,
|
| - InputEventAckState ack_result) {
|
| - // If this event was coalesced into another event, ignore it, as the event it
|
| - // was coalesced into will reflect the full latency.
|
| - if (latency.coalesced())
|
| - return;
|
| -
|
| - if (type != blink::WebInputEvent::MouseWheel &&
|
| - !WebInputEvent::isTouchEventType(type)) {
|
| - return;
|
| - }
|
| -
|
| - LatencyInfo::LatencyComponent rwh_component;
|
| - if (!latency.FindLatency(ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT,
|
| - latency_component_id, &rwh_component)) {
|
| - return;
|
| - }
|
| - DCHECK_EQ(rwh_component.event_count, 1u);
|
| -
|
| - bool multi_finger_touch_gesture =
|
| - WebInputEvent::isTouchEventType(type) && active_multi_finger_gesture_;
|
| -
|
| - LatencyInfo::LatencyComponent ui_component;
|
| - if (latency.FindLatency(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0,
|
| - &ui_component)) {
|
| - DCHECK_EQ(ui_component.event_count, 1u);
|
| - base::TimeDelta ui_delta =
|
| - rwh_component.last_event_time - ui_component.first_event_time;
|
| -
|
| - if (type == blink::WebInputEvent::MouseWheel) {
|
| - UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.Browser.WheelUI",
|
| - ui_delta.InMicroseconds(), 1, 20000, 100);
|
| - } else {
|
| - DCHECK(WebInputEvent::isTouchEventType(type));
|
| - UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.Browser.TouchUI",
|
| - ui_delta.InMicroseconds(), 1, 20000, 100);
|
| - }
|
| - }
|
| -
|
| - // Both tap and scroll gestures depend on the disposition of the touch start
|
| - // and the current touch. For touch start, touch_start_default_prevented_ ==
|
| - // (ack_result == INPUT_EVENT_ACK_STATE_CONSUMED).
|
| - bool action_prevented = touch_start_default_prevented_ ||
|
| - ack_result == INPUT_EVENT_ACK_STATE_CONSUMED;
|
| -
|
| - std::string event_name = WebInputEvent::GetName(type);
|
| -
|
| - std::string default_action_status =
|
| - action_prevented ? "DefaultPrevented" : "DefaultAllowed";
|
| -
|
| - LatencyInfo::LatencyComponent main_component;
|
| - if (latency.FindLatency(ui::INPUT_EVENT_LATENCY_RENDERER_MAIN_COMPONENT, 0,
|
| - &main_component)) {
|
| - DCHECK_EQ(main_component.event_count, 1u);
|
| - if (!multi_finger_touch_gesture) {
|
| - UMA_HISTOGRAM_INPUT_LATENCY_MILLISECONDS(
|
| - "Event.Latency.QueueingTime." + event_name + default_action_status,
|
| - rwh_component, main_component);
|
| - }
|
| - }
|
| -
|
| - LatencyInfo::LatencyComponent acked_component;
|
| - if (latency.FindLatency(ui::INPUT_EVENT_LATENCY_ACK_RWH_COMPONENT, 0,
|
| - &acked_component)) {
|
| - DCHECK_EQ(acked_component.event_count, 1u);
|
| - if (!multi_finger_touch_gesture &&
|
| - main_component.event_time != base::TimeTicks()) {
|
| - UMA_HISTOGRAM_INPUT_LATENCY_MILLISECONDS(
|
| - "Event.Latency.BlockingTime." + event_name + default_action_status,
|
| - main_component, acked_component);
|
| - }
|
| -
|
| - std::string input_modality = WebInputEventTypeToInputModalityString(type);
|
| - if (input_modality != "") {
|
| - UMA_HISTOGRAM_INPUT_LATENCY_HIGH_RESOLUTION_MICROSECONDS(
|
| - "Event.Latency.Browser." + input_modality + "Acked", rwh_component,
|
| - acked_component);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void RenderWidgetHostLatencyTracker::OnInputEvent(
|
| - const blink::WebInputEvent& event,
|
| - LatencyInfo* latency) {
|
| - DCHECK(latency);
|
| -
|
| - if (event.type() == WebInputEvent::TouchStart) {
|
| - const WebTouchEvent& touch_event =
|
| - *static_cast<const WebTouchEvent*>(&event);
|
| - DCHECK(touch_event.touchesLength >= 1);
|
| - active_multi_finger_gesture_ = touch_event.touchesLength != 1;
|
| - }
|
| -
|
| - if (latency->FindLatency(ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT,
|
| - latency_component_id_, NULL)) {
|
| - return;
|
| - }
|
| -
|
| - if (event.timeStampSeconds() &&
|
| - !latency->FindLatency(ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0,
|
| - NULL)) {
|
| - base::TimeTicks timestamp_now = base::TimeTicks::Now();
|
| - base::TimeTicks timestamp_original =
|
| - base::TimeTicks() +
|
| - base::TimeDelta::FromSecondsD(event.timeStampSeconds());
|
| -
|
| - // Timestamp from platform input can wrap, e.g. 32 bits timestamp
|
| - // for Xserver and Window MSG time will wrap about 49.6 days. Do a
|
| - // sanity check here and if wrap does happen, use TimeTicks::Now()
|
| - // as the timestamp instead.
|
| - if ((timestamp_now - timestamp_original).InDays() > 0)
|
| - timestamp_original = timestamp_now;
|
| -
|
| - latency->AddLatencyNumberWithTimestamp(
|
| - ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT,
|
| - 0,
|
| - 0,
|
| - timestamp_original,
|
| - 1);
|
| - }
|
| -
|
| - latency->AddLatencyNumberWithTraceName(
|
| - ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT, latency_component_id_,
|
| - ++last_event_id_, WebInputEvent::GetName(event.type()));
|
| -
|
| - UpdateLatencyCoordinates(event, device_scale_factor_, latency);
|
| -
|
| - if (event.type() == blink::WebInputEvent::GestureScrollBegin) {
|
| - has_seen_first_gesture_scroll_update_ = false;
|
| - } else if (event.type() == blink::WebInputEvent::GestureScrollUpdate) {
|
| - // Make a copy of the INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT with a
|
| - // different name INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT.
|
| - // So we can track the latency specifically for scroll update events.
|
| - LatencyInfo::LatencyComponent original_component;
|
| - if (latency->FindLatency(ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0,
|
| - &original_component)) {
|
| - latency->AddLatencyNumberWithTimestamp(
|
| - has_seen_first_gesture_scroll_update_
|
| - ? ui::INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT
|
| - : ui::INPUT_EVENT_LATENCY_FIRST_SCROLL_UPDATE_ORIGINAL_COMPONENT,
|
| - latency_component_id_, original_component.sequence_number,
|
| - original_component.event_time, original_component.event_count);
|
| - }
|
| -
|
| - has_seen_first_gesture_scroll_update_ = true;
|
| - }
|
| -}
|
|
|
| -void RenderWidgetHostLatencyTracker::OnInputEventAck(
|
| - const blink::WebInputEvent& event,
|
| - LatencyInfo* latency, InputEventAckState ack_result) {
|
| - DCHECK(latency);
|
| -
|
| - // Latency ends if an event is acked but does not cause render scheduling.
|
| - bool rendering_scheduled = latency->FindLatency(
|
| - ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_MAIN_COMPONENT, 0, nullptr);
|
| - rendering_scheduled |= latency->FindLatency(
|
| - ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_IMPL_COMPONENT, 0, nullptr);
|
| -
|
| - if (WebInputEvent::isTouchEventType(event.type())) {
|
| - const WebTouchEvent& touch_event =
|
| - *static_cast<const WebTouchEvent*>(&event);
|
| - if (event.type() == WebInputEvent::TouchStart) {
|
| - touch_start_default_prevented_ =
|
| - ack_result == INPUT_EVENT_ACK_STATE_CONSUMED;
|
| - } else if (event.type() == WebInputEvent::TouchEnd ||
|
| - event.type() == WebInputEvent::TouchCancel) {
|
| - active_multi_finger_gesture_ = touch_event.touchesLength > 2;
|
| - }
|
| +// TODO(mfomitchev): Move the method up. It's here temporarily for ease of
|
| +// review.
|
| +void LatencyTracker::OnGpuSwapBuffersCompleted(const LatencyInfo& latency) {
|
| + LOG(ERROR) << "LatencyTracker::OnGpuSwapBuffersCompleted";
|
| + int i = 0;
|
| + for (const auto& lc : latency.latency_components()) {
|
| + ++i;
|
| + LOG(ERROR) << "Component " << i << ": "
|
| + << ui::GetComponentName(lc.first.first)
|
| + << ", timestamp: " << lc.second.event_time;
|
| }
|
|
|
| - latency->AddLatencyNumber(ui::INPUT_EVENT_LATENCY_ACK_RWH_COMPONENT, 0, 0);
|
| - // If this event couldn't have caused a gesture event, and it didn't trigger
|
| - // rendering, we're done processing it.
|
| - if (!rendering_scheduled) {
|
| - latency->AddLatencyNumber(
|
| - ui::INPUT_EVENT_LATENCY_TERMINATED_NO_SWAP_COMPONENT, 0, 0);
|
| - }
|
| -
|
| - ComputeInputLatencyHistograms(event.type(), latency_component_id_, *latency,
|
| - ack_result);
|
| -}
|
| -
|
| -void RenderWidgetHostLatencyTracker::OnSwapCompositorFrame(
|
| - std::vector<LatencyInfo>* latencies) {
|
| - DCHECK(latencies);
|
| - for (LatencyInfo& latency : *latencies) {
|
| - AddLatencyInfoComponentIds(&latency, latency_component_id_);
|
| - latency.AddLatencyNumber(
|
| - ui::INPUT_EVENT_BROWSER_RECEIVED_RENDERER_SWAP_COMPONENT, 0, 0);
|
| - }
|
| -}
|
| -
|
| -void RenderWidgetHostLatencyTracker::OnGpuSwapBuffersCompleted(
|
| - const LatencyInfo& latency) {
|
| LatencyInfo::LatencyComponent gpu_swap_end_component;
|
| if (!latency.FindLatency(
|
| ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0,
|
| @@ -565,8 +197,7 @@ void RenderWidgetHostLatencyTracker::OnGpuSwapBuffersCompleted(
|
| }
|
|
|
| LatencyInfo::LatencyComponent tab_switch_component;
|
| - if (latency.FindLatency(ui::TAB_SHOW_COMPONENT, latency_component_id_,
|
| - &tab_switch_component)) {
|
| + if (latency.FindLatency(ui::TAB_SHOW_COMPONENT, &tab_switch_component)) {
|
| base::TimeDelta delta =
|
| gpu_swap_end_component.event_time - tab_switch_component.event_time;
|
| for (size_t i = 0; i < tab_switch_component.event_count; i++) {
|
| @@ -575,7 +206,7 @@ void RenderWidgetHostLatencyTracker::OnGpuSwapBuffersCompleted(
|
| }
|
|
|
| if (!latency.FindLatency(ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT,
|
| - latency_component_id_, nullptr)) {
|
| + nullptr)) {
|
| return;
|
| }
|
|
|
| @@ -583,8 +214,7 @@ void RenderWidgetHostLatencyTracker::OnGpuSwapBuffersCompleted(
|
| if (source_event_type == ui::SourceEventType::WHEEL ||
|
| source_event_type == ui::SourceEventType::TOUCH) {
|
| ComputeTouchAndWheelScrollLatencyHistograms(
|
| - render_widget_host_delegate_, gpu_swap_begin_component,
|
| - gpu_swap_end_component, latency_component_id_, latency);
|
| + gpu_swap_begin_component, gpu_swap_end_component, latency);
|
| }
|
|
|
| // Compute the old scroll update latency metrics. They are exclusively
|
| @@ -595,14 +225,8 @@ void RenderWidgetHostLatencyTracker::OnGpuSwapBuffersCompleted(
|
| ui::INPUT_EVENT_LATENCY_GENERATE_SCROLL_UPDATE_FROM_MOUSE_WHEEL, 0,
|
| &mouse_wheel_scroll_update_component)) {
|
| ComputeScrollLatencyHistograms(gpu_swap_begin_component,
|
| - gpu_swap_end_component,
|
| - latency_component_id_, latency);
|
| + gpu_swap_end_component, latency);
|
| }
|
| }
|
|
|
| -void RenderWidgetHostLatencyTracker::SetDelegate(
|
| - RenderWidgetHostDelegate* delegate) {
|
| - render_widget_host_delegate_ = delegate;
|
| -}
|
| -
|
| -} // namespace content
|
| +} // namespace ui
|
|
|