blob: df37365b7ed1df00b33eb91835b70ca29e0c9ab3 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CC_METRICS_EVENT_METRICS_H_
#define CC_METRICS_EVENT_METRICS_H_
#include <memory>
#include <vector>
#include "base/optional.h"
#include "base/time/time.h"
#include "cc/cc_export.h"
#include "ui/events/types/event_type.h"
#include "ui/events/types/scroll_input_type.h"
namespace cc {
// Data about an event used by CompositorFrameReporter in generating event
// latency metrics.
class CC_EXPORT EventMetrics {
public:
// Whitelisted event types. This list should be in the same order as values of
// EventLatencyEventType enum from enums.xml file.
enum class EventType {
kMousePressed,
kMouseReleased,
kMouseWheel,
// TODO(crbug/1071645): Currently, all ET_KEY_PRESSED events are reported
// under EventLatency.KeyPressed histogram. This includes both key-down and
// key-char events. Consider reporting them separately.
kKeyPressed,
kKeyReleased,
kTouchPressed,
kTouchReleased,
kTouchMoved,
kGestureScrollBegin,
kGestureScrollUpdate,
kGestureScrollEnd,
kGestureDoubleTap,
kGestureLongPress,
kGestureLongTap,
kGestureShowPress,
kGestureTap,
kGestureTapCancel,
kGestureTapDown,
kGestureTapUnconfirmed,
kGestureTwoFingerTap,
kMaxValue = kGestureTwoFingerTap,
};
// Type of scroll events. This list should be in the same order as values of
// EventLatencyScrollInputType enum from enums.xml file.
enum class ScrollType {
kAutoscroll,
kScrollbar,
kTouchscreen,
kWheel,
kMaxValue = kWheel,
};
// Returns a new instance if |type| is a whitelisted event type. Otherwise,
// returns nullptr.
static std::unique_ptr<EventMetrics> Create(
ui::EventType type,
base::TimeTicks time_stamp,
base::Optional<ui::ScrollInputType> scroll_input_type);
EventMetrics(const EventMetrics&);
EventMetrics& operator=(const EventMetrics&);
EventType type() const { return type_; }
// Returns a string representing event type.
const char* GetTypeName() const;
base::TimeTicks time_stamp() const { return time_stamp_; }
const base::Optional<ScrollType>& scroll_type() const { return scroll_type_; }
// Returns a string representing input type for a scroll event. Should only be
// called for scroll events.
const char* GetScrollTypeName() const;
// Used in tests to check expectations on EventMetrics objects.
bool operator==(const EventMetrics& other) const;
private:
EventMetrics(EventType type,
base::TimeTicks time_stamp,
base::Optional<ScrollType> scroll_type);
EventType type_;
base::TimeTicks time_stamp_;
// Only available for scroll events and represents the type of input device
// for the event.
base::Optional<ScrollType> scroll_type_;
};
// Struct storing event metrics from both main and impl threads.
struct CC_EXPORT EventMetricsSet {
EventMetricsSet();
~EventMetricsSet();
EventMetricsSet(std::vector<EventMetrics> main_thread_event_metrics,
std::vector<EventMetrics> impl_thread_event_metrics);
EventMetricsSet(EventMetricsSet&&);
EventMetricsSet& operator=(EventMetricsSet&&);
EventMetricsSet(const EventMetricsSet&) = delete;
EventMetricsSet& operator=(const EventMetricsSet&) = delete;
std::vector<EventMetrics> main_event_metrics;
std::vector<EventMetrics> impl_event_metrics;
};
} // namespace cc
#endif // CC_METRICS_EVENT_METRICS_H_