1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
cc / input / main_thread_scrolling_reason.h [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CC_INPUT_MAIN_THREAD_SCROLLING_REASON_H_
#define CC_INPUT_MAIN_THREAD_SCROLLING_REASON_H_
#include <stdint.h>
#include <memory>
#include <string>
#include "cc/cc_export.h"
namespace base {
namespace trace_event {
class TracedValue;
}
} // namespace base
namespace cc {
// Ensure this stays in sync with the "MainThreadScrollingReason" enum in:
// tools/metrics/histograms/enums.xml
// When adding a new MainThreadScrollingReason, make sure the corresponding
// kRepaintReasons and kHitTestReasons are also updated.
struct CC_EXPORT MainThreadScrollingReason {
enum : uint32_t {
kNotScrollingOnMain = 0,
// This is used only to report the histogram of main thread scrolling for
// any reason below. It's a histogram bucket index instead of a bit.
kScrollingOnMainForAnyReason = 1,
// This enum simultaneously defines actual bitmask values and indices into
// the bitmask (which are the numbers after "1 << " below, used as the
// histogram bucket indices), but value 0 and 1 are used as the histogram
// bucket indices for kNotScrollingMain and kScrollingOnMainForAnyReason,
// respectively, so the 0th bit and the 1st bit should never be used.
// See also blink::RecordScrollReasonsMetric().
// Main-thread repaint reasons.
// See InputHandler::ScrollStatus::main_thread_repaint_reasons.
// They are set in ScrollNode::main_thread_scrolling_reasons, or
// kNoScrollingLayer is used for a ScrollNode that doesn't have
// main_thread_scrolling_reasons but is_composited is false.
kHasBackgroundAttachmentFixedObjects = 1 << 2,
// 1 << 4 is used by kPopupNoThreadedInput below.
// Subpixel (LCD) text rendering requires blending glyphs with an opaque
// background.
kNotOpaqueForTextAndLCDText = 1 << 5,
kPreferNonCompositedScrolling = 1 << 15,
kBackgroundNeedsRepaintOnScroll = 1 << 16,
// Main-thread hit-test reasons.
// See InputHandler::ScrollStatus::main_thread_hit_test_reasons.
kScrollbarScrolling = 1 << 7,
kMainThreadScrollHitTestRegion = 1 << 8,
kFailedHitTest = 1 << 9,
// 1 << 10 is used by kNoScrollingLayer above.
// The following reasons are neither repaint reasons nor hit-test reasons.
// They don't go through InputHandler::ScrollBegin() or set in
// InputHandler::ScrollStatus.
// We need main thread Scrolling in a popup because it doesn't have a
// threaded input handler. This flag is for metrics only, see
// blink::WebPagePopupImpl::HandleGestureEvent.
kPopupNoThreadedInput = 1 << 4,
// Scrolling can be handled on the compositor thread but it might be
// blocked on the main thread waiting for non-passive event handlers to
// process the wheel/touch events (i.e. were they preventDefaulted?).
kWheelEventHandlerRegion = 1 << 13,
kTouchEventHandlerRegion = 1 << 14,
// 1 << 15 is used by kPreferNonCompositedScrolling above.
// 1 << 16 is used by kBackgroundNeedsRepaintOnScroll above.
// For blink::RecordScrollReasonsMetric() to know the number of used bits.
kMainThreadScrollingReasonLast = 16,
};
static constexpr uint32_t kRepaintReasons =
kHasBackgroundAttachmentFixedObjects | kNotOpaqueForTextAndLCDText |
kPreferNonCompositedScrolling | kBackgroundNeedsRepaintOnScroll;
static constexpr uint32_t kHitTestReasons =
kScrollbarScrolling | kMainThreadScrollHitTestRegion | kFailedHitTest;
static bool AreRepaintReasons(uint32_t reasons) {
return (reasons & ~kRepaintReasons) == 0;
}
static bool AreHitTestReasons(uint32_t reasons) {
return (reasons & ~kHitTestReasons) == 0;
}
static int BucketIndexForTesting(uint32_t reason);
static std::string AsText(uint32_t reasons);
static void AddToTracedValue(uint32_t reasons,
base::trace_event::TracedValue&);
};
} // namespace cc
#endif // CC_INPUT_MAIN_THREAD_SCROLLING_REASON_H_