Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/input/EventHandler.h" | 5 #include "core/input/EventHandler.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include "core/dom/ClientRect.h" | 8 #include "core/dom/ClientRect.h" |
| 9 #include "core/dom/Document.h" | 9 #include "core/dom/Document.h" |
| 10 #include "core/dom/Range.h" | 10 #include "core/dom/Range.h" |
| 11 #include "core/editing/Editor.h" | 11 #include "core/editing/Editor.h" |
| 12 #include "core/editing/FrameSelection.h" | 12 #include "core/editing/FrameSelection.h" |
| 13 #include "core/frame/FrameView.h" | 13 #include "core/frame/FrameView.h" |
| 14 #include "core/frame/LocalFrame.h" | 14 #include "core/frame/LocalFrame.h" |
| 15 #include "core/frame/Settings.h" | 15 #include "core/frame/Settings.h" |
| 16 #include "core/layout/LayoutBox.h" | 16 #include "core/layout/LayoutBox.h" |
| 17 #include "core/loader/EmptyClients.h" | 17 #include "core/loader/EmptyClients.h" |
| 18 #include "core/page/AutoscrollController.h" | 18 #include "core/page/AutoscrollController.h" |
| 19 #include "core/page/Page.h" | 19 #include "core/page/Page.h" |
| 20 #include "core/paint/PaintLayerScrollableArea.h" | 20 #include "core/paint/PaintLayerScrollableArea.h" |
| 21 #include "core/testing/DummyPageHolder.h" | 21 #include "core/testing/DummyPageHolder.h" |
| 22 #include "platform/scroll/MainThreadScrollingReason.h" | 22 #include "platform/scroll/MainThreadScrollingReason.h" |
| 23 #include "platform/scroll/ScrollerSize.h" | |
| 23 #include "platform/testing/HistogramTester.h" | 24 #include "platform/testing/HistogramTester.h" |
| 24 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
| 25 | 26 |
| 26 #define EXPECT_WHEEL_BUCKET(reason, count) \ | 27 #define EXPECT_WHEEL_BUCKET(reason, count) \ |
| 27 histogram_tester.ExpectBucketCount( \ | 28 histogram_tester.ExpectBucketCount( \ |
| 28 "Renderer4.MainThreadWheelScrollReason", \ | 29 "Renderer4.MainThreadWheelScrollReason", \ |
| 29 GetBucketIndex(MainThreadScrollingReason::reason), count); | 30 GetBucketIndex(MainThreadScrollingReason::reason), count); |
| 30 | 31 |
| 31 #define EXPECT_TOUCH_BUCKET(reason, count) \ | 32 #define EXPECT_TOUCH_BUCKET(reason, count) \ |
| 32 histogram_tester.ExpectBucketCount( \ | 33 histogram_tester.ExpectBucketCount( \ |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 45 | 46 |
| 46 class EventHandlerTest : public ::testing::Test { | 47 class EventHandlerTest : public ::testing::Test { |
| 47 protected: | 48 protected: |
| 48 void SetUp() override; | 49 void SetUp() override; |
| 49 | 50 |
| 50 Page& GetPage() const { return dummy_page_holder_->GetPage(); } | 51 Page& GetPage() const { return dummy_page_holder_->GetPage(); } |
| 51 Document& GetDocument() const { return dummy_page_holder_->GetDocument(); } | 52 Document& GetDocument() const { return dummy_page_holder_->GetDocument(); } |
| 52 FrameSelection& Selection() const { | 53 FrameSelection& Selection() const { |
| 53 return GetDocument().GetFrame()->Selection(); | 54 return GetDocument().GetFrame()->Selection(); |
| 54 } | 55 } |
| 55 | |
| 56 void SetHtmlInnerHTML(const char* html_content); | 56 void SetHtmlInnerHTML(const char* html_content); |
| 57 void Scroll(Element*, const WebGestureDevice); | |
| 57 | 58 |
| 58 protected: | 59 protected: |
| 59 std::unique_ptr<DummyPageHolder> dummy_page_holder_; | 60 std::unique_ptr<DummyPageHolder> dummy_page_holder_; |
| 60 }; | 61 }; |
| 61 | 62 |
| 62 class NonCompositedMainThreadScrollingReasonRecordTest | 63 class NonCompositedMainThreadScrollingReasonRecordTest |
| 63 : public EventHandlerTest { | 64 : public EventHandlerTest { |
| 64 protected: | 65 protected: |
| 65 class ScrollBeginEventBuilder : public WebGestureEvent { | |
| 66 public: | |
| 67 ScrollBeginEventBuilder(IntPoint position, | |
| 68 FloatPoint delta, | |
| 69 WebGestureDevice device) | |
| 70 : WebGestureEvent() { | |
| 71 type_ = WebInputEvent::kGestureScrollBegin; | |
| 72 x = global_x = position.X(); | |
| 73 y = global_y = position.Y(); | |
| 74 data.scroll_begin.delta_y_hint = delta.Y(); | |
| 75 source_device = device; | |
| 76 frame_scale_ = 1; | |
| 77 } | |
| 78 }; | |
| 79 | |
| 80 class ScrollUpdateEventBuilder : public WebGestureEvent { | |
| 81 public: | |
| 82 ScrollUpdateEventBuilder() : WebGestureEvent() { | |
| 83 type_ = WebInputEvent::kGestureScrollUpdate; | |
| 84 data.scroll_update.delta_x = 0.0f; | |
| 85 data.scroll_update.delta_y = 1.0f; | |
| 86 data.scroll_update.velocity_x = 0; | |
| 87 data.scroll_update.velocity_y = 1; | |
| 88 frame_scale_ = 1; | |
| 89 } | |
| 90 }; | |
| 91 | |
| 92 class ScrollEndEventBuilder : public WebGestureEvent { | |
| 93 public: | |
| 94 ScrollEndEventBuilder() : WebGestureEvent() { | |
| 95 type_ = WebInputEvent::kGestureScrollEnd; | |
| 96 frame_scale_ = 1; | |
| 97 } | |
| 98 }; | |
| 99 | |
| 100 int GetBucketIndex(uint32_t reason); | 66 int GetBucketIndex(uint32_t reason); |
| 101 void Scroll(Element*, const WebGestureDevice); | |
| 102 }; | 67 }; |
| 103 | 68 |
| 104 class TapEventBuilder : public WebGestureEvent { | 69 class TapEventBuilder : public WebGestureEvent { |
| 105 public: | 70 public: |
| 106 TapEventBuilder(IntPoint position, int tap_count) | 71 TapEventBuilder(IntPoint position, int tap_count) |
| 107 : WebGestureEvent(WebInputEvent::kGestureTap, | 72 : WebGestureEvent(WebInputEvent::kGestureTap, |
| 108 WebInputEvent::kNoModifiers, | 73 WebInputEvent::kNoModifiers, |
| 109 TimeTicks::Now().InSeconds()) { | 74 TimeTicks::Now().InSeconds()) { |
| 110 x = global_x = position.X(); | 75 x = global_x = position.X(); |
| 111 y = global_y = position.Y(); | 76 y = global_y = position.Y(); |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 139 WebInputEvent::kNoModifiers, | 104 WebInputEvent::kNoModifiers, |
| 140 TimeTicks::Now().InSeconds()) { | 105 TimeTicks::Now().InSeconds()) { |
| 141 click_count = click_count_param; | 106 click_count = click_count_param; |
| 142 button = button_param; | 107 button = button_param; |
| 143 SetPositionInWidget(position_param.X(), position_param.Y()); | 108 SetPositionInWidget(position_param.X(), position_param.Y()); |
| 144 SetPositionInScreen(position_param.X(), position_param.Y()); | 109 SetPositionInScreen(position_param.X(), position_param.Y()); |
| 145 frame_scale_ = 1; | 110 frame_scale_ = 1; |
| 146 } | 111 } |
| 147 }; | 112 }; |
| 148 | 113 |
| 114 class ScrollBeginEventBuilder : public WebGestureEvent { | |
| 115 public: | |
| 116 ScrollBeginEventBuilder(IntPoint position, | |
| 117 FloatPoint delta, | |
| 118 WebGestureDevice device) | |
| 119 : WebGestureEvent() { | |
| 120 type_ = WebInputEvent::kGestureScrollBegin; | |
| 121 x = global_x = position.X(); | |
| 122 y = global_y = position.Y(); | |
| 123 data.scroll_begin.delta_y_hint = delta.Y(); | |
| 124 source_device = device; | |
| 125 frame_scale_ = 1; | |
| 126 } | |
| 127 }; | |
| 128 | |
| 129 class ScrollUpdateEventBuilder : public WebGestureEvent { | |
| 130 public: | |
| 131 ScrollUpdateEventBuilder() : WebGestureEvent() { | |
| 132 type_ = WebInputEvent::kGestureScrollUpdate; | |
| 133 data.scroll_update.delta_x = 0.0f; | |
| 134 data.scroll_update.delta_y = 1.0f; | |
| 135 data.scroll_update.velocity_x = 0; | |
| 136 data.scroll_update.velocity_y = 1; | |
| 137 frame_scale_ = 1; | |
| 138 } | |
| 139 }; | |
| 140 | |
| 141 class ScrollEndEventBuilder : public WebGestureEvent { | |
| 142 public: | |
| 143 ScrollEndEventBuilder() : WebGestureEvent() { | |
| 144 type_ = WebInputEvent::kGestureScrollEnd; | |
| 145 frame_scale_ = 1; | |
| 146 } | |
| 147 }; | |
| 148 | |
| 149 void EventHandlerTest::SetUp() { | 149 void EventHandlerTest::SetUp() { |
| 150 dummy_page_holder_ = DummyPageHolder::Create(IntSize(300, 400)); | 150 dummy_page_holder_ = DummyPageHolder::Create(IntSize(300, 400)); |
| 151 } | 151 } |
| 152 | 152 |
| 153 void EventHandlerTest::SetHtmlInnerHTML(const char* html_content) { | 153 void EventHandlerTest::SetHtmlInnerHTML(const char* html_content) { |
| 154 GetDocument().documentElement()->setInnerHTML(String::FromUTF8(html_content)); | 154 GetDocument().documentElement()->setInnerHTML(String::FromUTF8(html_content)); |
| 155 GetDocument().View()->UpdateAllLifecyclePhases(); | 155 GetDocument().View()->UpdateAllLifecyclePhases(); |
| 156 } | 156 } |
| 157 | 157 |
| 158 int NonCompositedMainThreadScrollingReasonRecordTest::GetBucketIndex( | 158 int NonCompositedMainThreadScrollingReasonRecordTest::GetBucketIndex( |
| 159 uint32_t reason) { | 159 uint32_t reason) { |
| 160 int index = 1; | 160 int index = 1; |
| 161 while (!(reason & 1)) { | 161 while (!(reason & 1)) { |
| 162 reason >>= 1; | 162 reason >>= 1; |
| 163 ++index; | 163 ++index; |
| 164 } | 164 } |
| 165 DCHECK_EQ(reason, 1u); | 165 DCHECK_EQ(reason, 1u); |
| 166 return index; | 166 return index; |
| 167 } | 167 } |
| 168 | 168 |
| 169 void NonCompositedMainThreadScrollingReasonRecordTest::Scroll( | 169 void EventHandlerTest::Scroll(Element* element, const WebGestureDevice device) { |
| 170 Element* element, | |
| 171 const WebGestureDevice device) { | |
| 172 DCHECK(element); | 170 DCHECK(element); |
| 173 DCHECK(element->getBoundingClientRect()); | 171 DCHECK(element->getBoundingClientRect()); |
| 174 ClientRect* rect = element->getBoundingClientRect(); | 172 ClientRect* rect = element->getBoundingClientRect(); |
| 175 ScrollBeginEventBuilder scroll_begin( | 173 ScrollBeginEventBuilder scroll_begin( |
| 176 IntPoint(rect->left() + rect->width() / 2, | 174 IntPoint(rect->left() + rect->width() / 2, |
| 177 rect->top() + rect->height() / 2), | 175 rect->top() + rect->height() / 2), |
| 178 FloatPoint(0.f, 1.f), device); | 176 FloatPoint(0.f, 1.f), device); |
| 179 ScrollUpdateEventBuilder scroll_update; | 177 ScrollUpdateEventBuilder scroll_update; |
| 180 ScrollEndEventBuilder scroll_end; | 178 ScrollEndEventBuilder scroll_end; |
| 181 GetDocument().GetFrame()->GetEventHandler().HandleGestureEvent(scroll_begin); | 179 GetDocument().GetFrame()->GetEventHandler().HandleGestureEvent(scroll_begin); |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 574 WebInputEvent::kMouseUp, WebFloatPoint(100, 50), WebFloatPoint(200, 250), | 572 WebInputEvent::kMouseUp, WebFloatPoint(100, 50), WebFloatPoint(200, 250), |
| 575 WebPointerProperties::Button::kLeft, 1, WebInputEvent::kNoModifiers, | 573 WebPointerProperties::Button::kLeft, 1, WebInputEvent::kNoModifiers, |
| 576 TimeTicks::Now().InSeconds()); | 574 TimeTicks::Now().InSeconds()); |
| 577 mouse_up_event.SetFrameScale(1); | 575 mouse_up_event.SetFrameScale(1); |
| 578 GetDocument().GetFrame()->GetEventHandler().DragSourceEndedAt( | 576 GetDocument().GetFrame()->GetEventHandler().DragSourceEndedAt( |
| 579 mouse_up_event, kDragOperationNone); | 577 mouse_up_event, kDragOperationNone); |
| 580 | 578 |
| 581 // This test passes if it doesn't crash. | 579 // This test passes if it doesn't crash. |
| 582 } | 580 } |
| 583 | 581 |
| 582 TEST_F(EventHandlerTest, | |
| 583 ScrollerSizeOfMainThreadScrollingHistogramRecordingTest) { | |
| 584 SetHtmlInnerHTML( | |
| 585 "<style>" | |
| 586 " .container { width: 200px; height: 200px; overflow: scroll; }" | |
| 587 " .box { width: 100px; height: 100px; overflow: scroll; }" | |
| 588 " .spacer { height: 1000px;} body { height: 2000px; }" | |
| 589 "</style>" | |
| 590 "<div class='container'>" | |
| 591 " <div id='box' class='box'>" | |
| 592 " <div id='content' class='spacer'></div>" | |
| 593 " </div>" | |
| 594 "</div>"); | |
| 595 | |
| 596 Element* box = GetDocument().getElementById("box"); | |
| 597 HistogramTester histogram_tester; | |
| 598 | |
| 599 // Test wheel scroll on the box. | |
| 600 Scroll(box, kWebGestureDeviceTouchpad); | |
| 601 histogram_tester.ExpectBucketCount("Event.Scroll.ScrollerSize.OnScroll_Wheel", | |
| 602 10000, 1); | |
| 603 // Only the first scrollable area is recorded. | |
| 604 histogram_tester.ExpectBucketCount("Event.Scroll.ScrollerSize.OnScroll_Wheel", | |
| 605 40000, 0); | |
| 606 histogram_tester.ExpectTotalCount("Event.Scroll.ScrollerSize.OnScroll_Wheel", | |
| 607 1); | |
| 608 | |
| 609 // Test touch scroll on the main frame. | |
|
bokan
2017/04/18 19:24:39
You're not trying to scroll the main frame here th
yigu
2017/04/19 20:53:05
No.
| |
| 610 Scroll(box, kWebGestureDeviceTouchscreen); | |
| 611 histogram_tester.ExpectBucketCount("Event.Scroll.ScrollerSize.OnScroll_Touch", | |
| 612 10000, 1); | |
| 613 histogram_tester.ExpectTotalCount("Event.Scroll.ScrollerSize.OnScroll_Touch", | |
| 614 1); | |
| 615 | |
| 616 // Scrolling root layer doesn't add to count. | |
| 617 Element* body = GetDocument().body(); | |
| 618 Scroll(body, kWebGestureDeviceTouchscreen); | |
|
bokan
2017/04/18 19:24:39
In general, this won't work since Scroll() will se
yigu
2017/04/19 20:53:05
In general it may not work. But in the example abo
| |
| 619 histogram_tester.ExpectBucketCount("Event.Scroll.ScrollerSize.OnScroll_Touch", | |
| 620 kMaxScrollerSize, 0); | |
| 621 histogram_tester.ExpectTotalCount("Event.Scroll.ScrollerSize.OnScroll_Touch", | |
| 622 1); | |
| 623 } | |
| 624 | |
| 584 class TooltipCapturingChromeClient : public EmptyChromeClient { | 625 class TooltipCapturingChromeClient : public EmptyChromeClient { |
| 585 public: | 626 public: |
| 586 TooltipCapturingChromeClient() {} | 627 TooltipCapturingChromeClient() {} |
| 587 | 628 |
| 588 void SetToolTip(LocalFrame&, const String& str, TextDirection) override { | 629 void SetToolTip(LocalFrame&, const String& str, TextDirection) override { |
| 589 last_tool_tip_ = str; | 630 last_tool_tip_ = str; |
| 590 } | 631 } |
| 591 | 632 |
| 592 String& LastToolTip() { return last_tool_tip_; } | 633 String& LastToolTip() { return last_tool_tip_; } |
| 593 | 634 |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 776 // inner box itself has no reason because it's composited. Other scrollable | 817 // inner box itself has no reason because it's composited. Other scrollable |
| 777 // areas from the chain have corresponding reasons. | 818 // areas from the chain have corresponding reasons. |
| 778 EXPECT_WHEEL_BUCKET(kHasOpacityAndLCDText, 1); | 819 EXPECT_WHEEL_BUCKET(kHasOpacityAndLCDText, 1); |
| 779 EXPECT_WHEEL_BUCKET(kBackgroundNotOpaqueInRectAndLCDText, 1); | 820 EXPECT_WHEEL_BUCKET(kBackgroundNotOpaqueInRectAndLCDText, 1); |
| 780 EXPECT_WHEEL_BUCKET(kHasBorderRadius, 1); | 821 EXPECT_WHEEL_BUCKET(kHasBorderRadius, 1); |
| 781 EXPECT_WHEEL_BUCKET(kHasTransformAndLCDText, 0); | 822 EXPECT_WHEEL_BUCKET(kHasTransformAndLCDText, 0); |
| 782 EXPECT_WHEEL_TOTAL(3); | 823 EXPECT_WHEEL_TOTAL(3); |
| 783 } | 824 } |
| 784 | 825 |
| 785 } // namespace blink | 826 } // namespace blink |
| OLD | NEW |