Index: third_party/WebKit/Source/core/input/ScrollManager.cpp |
diff --git a/third_party/WebKit/Source/core/input/ScrollManager.cpp b/third_party/WebKit/Source/core/input/ScrollManager.cpp |
index 054ae1c88a7b9b2f249509bea336ec83810a4b02..5d0ce699cbed9f15e6f011f7f10fb1df39b3a57a 100644 |
--- a/third_party/WebKit/Source/core/input/ScrollManager.cpp |
+++ b/third_party/WebKit/Source/core/input/ScrollManager.cpp |
@@ -24,6 +24,7 @@ |
#include "core/paint/PaintLayer.h" |
#include "platform/Histogram.h" |
#include "platform/RuntimeEnabledFeatures.h" |
+#include "platform/scroll/ScrollerSizeMetrics.h" |
#include "platform/wtf/PtrUtil.h" |
namespace blink { |
@@ -197,16 +198,20 @@ void ScrollManager::CustomizedScroll(const Node& start_node, |
scroll_state.distributeToScrollChainDescendant(); |
} |
-uint32_t ScrollManager::ComputeNonCompositedMainThreadScrollingReasons() { |
+void ScrollManager::ComputeScrollRelatedMetrics( |
+ uint32_t* non_composited_main_thread_scrolling_reasons, |
+ int* scroller_size) { |
// When scrolling on the main thread, the scrollableArea may or may not be |
// composited. Either way, we have recorded either the reasons stored in |
// its layer or the reason NonFastScrollableRegion from the compositor |
// side. Here we record scrolls that occurred on main thread due to a |
// non-composited scroller. |
- if (!scroll_gesture_handling_node_->GetLayoutObject() || !frame_->View()) |
- return 0; |
+ if (!scroll_gesture_handling_node_->GetLayoutObject()) |
+ return; |
- uint32_t non_composited_main_thread_scrolling_reasons = 0; |
+ // When recording the size of the scroller, we only need to record the |
+ // fisrt scrollable area that we find during the walk up. |
flackr
2017/04/21 00:56:35
nit: s/fisrt/first
yigu
2017/04/21 12:20:33
Done.
|
+ bool set_scroller_size = false; |
for (auto* cur_box = |
scroll_gesture_handling_node_->GetLayoutObject()->EnclosingBox(); |
@@ -216,43 +221,65 @@ uint32_t ScrollManager::ComputeNonCompositedMainThreadScrollingReasons() { |
if (!scrollable_area || !scrollable_area->ScrollsOverflow()) |
continue; |
+ if (!set_scroller_size && !cur_box->Layer()->IsRootLayer()) { |
+ *scroller_size = scrollable_area->VisibleContentRect().Width() * |
+ scrollable_area->VisibleContentRect().Height(); |
+ set_scroller_size = true; |
+ } |
+ |
DCHECK(!scrollable_area->UsesCompositedScrolling() || |
!scrollable_area->GetNonCompositedMainThreadScrollingReasons()); |
- non_composited_main_thread_scrolling_reasons |= |
+ *non_composited_main_thread_scrolling_reasons |= |
scrollable_area->GetNonCompositedMainThreadScrollingReasons(); |
} |
- |
- return non_composited_main_thread_scrolling_reasons; |
} |
-void ScrollManager::RecordNonCompositedMainThreadScrollingReasons( |
- const WebGestureDevice device) { |
+void ScrollManager::RecordScrollRelatedMetrics(const WebGestureDevice device) { |
if (device != kWebGestureDeviceTouchpad && |
device != kWebGestureDeviceTouchscreen) { |
return; |
} |
- uint32_t reasons = ComputeNonCompositedMainThreadScrollingReasons(); |
- if (!reasons) |
- return; |
- DCHECK(MainThreadScrollingReason::HasNonCompositedScrollReasons(reasons)); |
- |
- uint32_t main_thread_scrolling_reason_enum_max = |
- MainThreadScrollingReason::kMainThreadScrollingReasonCount + 1; |
- for (uint32_t i = MainThreadScrollingReason::kNonCompositedReasonsFirst; |
- i <= MainThreadScrollingReason::kNonCompositedReasonsLast; ++i) { |
- unsigned val = 1 << i; |
- if (reasons & val) { |
- if (device == kWebGestureDeviceTouchscreen) { |
- DEFINE_STATIC_LOCAL(EnumerationHistogram, touch_histogram, |
- ("Renderer4.MainThreadGestureScrollReason", |
- main_thread_scrolling_reason_enum_max)); |
- touch_histogram.Count(i + 1); |
- } else { |
- DEFINE_STATIC_LOCAL(EnumerationHistogram, wheel_histogram, |
- ("Renderer4.MainThreadWheelScrollReason", |
- main_thread_scrolling_reason_enum_max)); |
- wheel_histogram.Count(i + 1); |
+ int scroller_size = 0; |
+ uint32_t non_composited_main_thread_scrolling_reasons = 0; |
+ ComputeScrollRelatedMetrics(&non_composited_main_thread_scrolling_reasons, |
+ &scroller_size); |
+ if (scroller_size > 0) { |
flackr
2017/04/21 00:56:35
Nit: While clearly a silly case, you might miss a
yigu
2017/04/21 12:20:33
Done.
|
+ if (device == kWebGestureDeviceTouchpad) { |
+ DEFINE_STATIC_LOCAL( |
+ CustomCountHistogram, size_histogram_wheel, |
+ ("Event.Scroll.ScrollerSize.OnScroll_Wheel", 1, |
+ kScrollerSizeLargestBucket, kScrollerSizeBucketCount)); |
+ size_histogram_wheel.Count(scroller_size); |
+ } else { |
+ DEFINE_STATIC_LOCAL( |
+ CustomCountHistogram, size_histogram_touch, |
+ ("Event.Scroll.ScrollerSize.OnScroll_Touch", 1, |
+ kScrollerSizeLargestBucket, kScrollerSizeBucketCount)); |
+ size_histogram_touch.Count(scroller_size); |
+ } |
+ } |
+ |
+ if (non_composited_main_thread_scrolling_reasons) { |
+ DCHECK(MainThreadScrollingReason::HasNonCompositedScrollReasons( |
+ non_composited_main_thread_scrolling_reasons)); |
+ uint32_t main_thread_scrolling_reason_enum_max = |
+ MainThreadScrollingReason::kMainThreadScrollingReasonCount + 1; |
+ for (uint32_t i = MainThreadScrollingReason::kNonCompositedReasonsFirst; |
+ i <= MainThreadScrollingReason::kNonCompositedReasonsLast; ++i) { |
+ unsigned val = 1 << i; |
+ if (non_composited_main_thread_scrolling_reasons & val) { |
+ if (device == kWebGestureDeviceTouchscreen) { |
+ DEFINE_STATIC_LOCAL(EnumerationHistogram, touch_histogram, |
+ ("Renderer4.MainThreadGestureScrollReason", |
+ main_thread_scrolling_reason_enum_max)); |
+ touch_histogram.Count(i + 1); |
+ } else { |
+ DEFINE_STATIC_LOCAL(EnumerationHistogram, wheel_histogram, |
+ ("Renderer4.MainThreadWheelScrollReason", |
+ main_thread_scrolling_reason_enum_max)); |
+ wheel_histogram.Count(i + 1); |
+ } |
} |
} |
} |
@@ -283,7 +310,7 @@ WebInputEventResult ScrollManager::HandleGestureScrollBegin( |
PassScrollGestureEvent(gesture_event, |
scroll_gesture_handling_node_->GetLayoutObject()); |
- RecordNonCompositedMainThreadScrollingReasons(gesture_event.source_device); |
+ RecordScrollRelatedMetrics(gesture_event.source_device); |
current_scroll_chain_.clear(); |
std::unique_ptr<ScrollStateData> scroll_state_data = |