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/Document.h" | 8 #include "core/dom/Document.h" |
9 #include "core/dom/Range.h" | 9 #include "core/dom/Range.h" |
10 #include "core/editing/Editor.h" | 10 #include "core/editing/Editor.h" |
11 #include "core/editing/FrameSelection.h" | 11 #include "core/editing/FrameSelection.h" |
12 #include "core/frame/FrameView.h" | 12 #include "core/frame/FrameView.h" |
13 #include "core/frame/LocalFrame.h" | 13 #include "core/frame/LocalFrame.h" |
14 #include "core/frame/Settings.h" | 14 #include "core/frame/Settings.h" |
15 #include "core/loader/EmptyClients.h" | 15 #include "core/loader/EmptyClients.h" |
16 #include "core/page/AutoscrollController.h" | 16 #include "core/page/AutoscrollController.h" |
17 #include "core/page/Page.h" | 17 #include "core/page/Page.h" |
18 #include "core/testing/DummyPageHolder.h" | 18 #include "core/testing/DummyPageHolder.h" |
| 19 #include "platform/testing/HistogramTester.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
20 | 21 |
21 namespace blink { | 22 namespace blink { |
22 | 23 |
23 class EventHandlerTest : public ::testing::Test { | 24 class EventHandlerTest : public ::testing::Test { |
24 protected: | 25 protected: |
25 void SetUp() override; | 26 void SetUp() override; |
26 | 27 |
27 Page& page() const { return m_dummyPageHolder->page(); } | 28 Page& page() const { return m_dummyPageHolder->page(); } |
28 Document& document() const { return m_dummyPageHolder->document(); } | 29 Document& document() const { return m_dummyPageHolder->document(); } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 WebInputEvent::NoModifiers, | 73 WebInputEvent::NoModifiers, |
73 TimeTicks::Now().InSeconds()) { | 74 TimeTicks::Now().InSeconds()) { |
74 clickCount = clickCountParam; | 75 clickCount = clickCountParam; |
75 button = buttonParam; | 76 button = buttonParam; |
76 x = globalX = position.x(); | 77 x = globalX = position.x(); |
77 y = globalY = position.y(); | 78 y = globalY = position.y(); |
78 m_frameScale = 1; | 79 m_frameScale = 1; |
79 } | 80 } |
80 }; | 81 }; |
81 | 82 |
| 83 class ScrollBeginEventBuilder : public WebGestureEvent { |
| 84 public: |
| 85 ScrollBeginEventBuilder(IntPoint position, |
| 86 FloatPoint delta, |
| 87 WebGestureDevice device) |
| 88 : WebGestureEvent() { |
| 89 m_type = WebInputEvent::GestureScrollBegin; |
| 90 x = globalX = position.x(); |
| 91 y = globalY = position.y(); |
| 92 data.scrollBegin.deltaYHint = delta.y(); |
| 93 sourceDevice = device; |
| 94 m_frameScale = 1; |
| 95 } |
| 96 }; |
| 97 |
| 98 class ScrollEndEventBuilder : public WebGestureEvent { |
| 99 public: |
| 100 ScrollEndEventBuilder() : WebGestureEvent() { |
| 101 m_type = WebInputEvent::GestureScrollEnd; |
| 102 m_frameScale = 1; |
| 103 } |
| 104 }; |
| 105 |
82 void EventHandlerTest::SetUp() { | 106 void EventHandlerTest::SetUp() { |
83 m_dummyPageHolder = DummyPageHolder::create(IntSize(300, 400)); | 107 m_dummyPageHolder = DummyPageHolder::create(IntSize(300, 400)); |
84 } | 108 } |
85 | 109 |
86 void EventHandlerTest::setHtmlInnerHTML(const char* htmlContent) { | 110 void EventHandlerTest::setHtmlInnerHTML(const char* htmlContent) { |
87 document().documentElement()->setInnerHTML(String::fromUTF8(htmlContent)); | 111 document().documentElement()->setInnerHTML(String::fromUTF8(htmlContent)); |
88 document().view()->updateAllLifecyclePhases(); | 112 document().view()->updateAllLifecyclePhases(); |
89 } | 113 } |
90 | 114 |
91 TEST_F(EventHandlerTest, dragSelectionAfterScroll) { | 115 TEST_F(EventHandlerTest, dragSelectionAfterScroll) { |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 WebInputEvent::MouseUp, WebFloatPoint(100, 50), WebFloatPoint(200, 250), | 478 WebInputEvent::MouseUp, WebFloatPoint(100, 50), WebFloatPoint(200, 250), |
455 WebPointerProperties::Button::Left, 1, WebInputEvent::NoModifiers, | 479 WebPointerProperties::Button::Left, 1, WebInputEvent::NoModifiers, |
456 TimeTicks::Now().InSeconds()); | 480 TimeTicks::Now().InSeconds()); |
457 mouseUpEvent.setFrameScale(1); | 481 mouseUpEvent.setFrameScale(1); |
458 document().frame()->eventHandler().dragSourceEndedAt(mouseUpEvent, | 482 document().frame()->eventHandler().dragSourceEndedAt(mouseUpEvent, |
459 DragOperationNone); | 483 DragOperationNone); |
460 | 484 |
461 // This test passes if it doesn't crash. | 485 // This test passes if it doesn't crash. |
462 } | 486 } |
463 | 487 |
| 488 TEST_F(EventHandlerTest, NonCompositedMainThreadScrollingReasonTest) { |
| 489 setHtmlInnerHTML( |
| 490 "<style>.box { width: 100px; height: 100px; overflow: scroll; }" |
| 491 " .translucent { opacity: 0.5;}" |
| 492 " .spacer { height: 1000px;} body {height: 1000px; }" |
| 493 " .background_scroller { overflow: scroll; width: 250px; height: 250px;" |
| 494 " position: absolute; z-index: -1;}" |
| 495 " body { height: 2000px; width: 1000px;} " |
| 496 "</style>" |
| 497 "<div class='translucent box'><div class='spacer'></div></div>" |
| 498 "<div id='under' class='background_scroller'><div " |
| 499 "class='spacer'></div></div>" |
| 500 "<div class='box' style='will-change:transform'><div " |
| 501 "class='spacer'></div></div>"); |
| 502 |
| 503 page().settings().setAcceleratedCompositingEnabled(true); |
| 504 document().view()->setParentVisible(true); |
| 505 document().view()->setSelfVisible(true); |
| 506 document().view()->updateAllLifecyclePhases(); |
| 507 |
| 508 HistogramTester histogramTester; |
| 509 // Test wheel scroll. |
| 510 ScrollBeginEventBuilder wheelScrollBegin( |
| 511 IntPoint(50, 50), FloatPoint(0.f, 1.f), WebGestureDeviceTouchpad); |
| 512 ScrollEndEventBuilder wheelScrollEnd; |
| 513 document().frame()->eventHandler().handleGestureEvent(wheelScrollBegin); |
| 514 document().frame()->eventHandler().handleGestureEvent(wheelScrollEnd); |
| 515 histogramTester.expectBucketCount("Renderer4.MainThreadWheelScrollReason", 17, |
| 516 1); |
| 517 histogramTester.expectBucketCount("Renderer4.MainThreadWheelScrollReason", 19, |
| 518 1); |
| 519 histogramTester.expectTotalCount("Renderer4.MainThreadWheelScrollReason", 2); |
| 520 |
| 521 // Composited scrolling doesn't add to the counts. |
| 522 wheelScrollBegin.x = wheelScrollBegin.globalX = 450; |
| 523 document().frame()->eventHandler().handleGestureEvent(wheelScrollBegin); |
| 524 document().frame()->eventHandler().handleGestureEvent(wheelScrollEnd); |
| 525 histogramTester.expectTotalCount("Renderer4.MainThreadWheelScrollReason", 2); |
| 526 |
| 527 // Scroll a composited scroller A over a non-composited scroller B should |
| 528 // cause the scroll events to go to the main thread because B is non fast |
| 529 // scrollable region. If none of the scrollers from A's containing scroll |
| 530 // chain has a reason, UnknownNonCompositedRegion should be added. |
| 531 wheelScrollBegin.x = wheelScrollBegin.globalX = 50; |
| 532 wheelScrollBegin.y = wheelScrollBegin.globalY = 150; |
| 533 document().frame()->eventHandler().handleGestureEvent(wheelScrollBegin); |
| 534 document().frame()->eventHandler().handleGestureEvent(wheelScrollEnd); |
| 535 histogramTester.expectBucketCount("Renderer4.MainThreadWheelScrollReason", 23, |
| 536 1); |
| 537 |
| 538 // UnknownNonCompositedRegion is not added if the scroller underneath has a |
| 539 // reason. |
| 540 document().getElementById("under")->setAttribute("style", "position:fixed;"); |
| 541 document().frame()->eventHandler().handleGestureEvent(wheelScrollBegin); |
| 542 document().frame()->eventHandler().handleGestureEvent(wheelScrollEnd); |
| 543 histogramTester.expectBucketCount("Renderer4.MainThreadWheelScrollReason", 23, |
| 544 1); |
| 545 // Test touch scroll. |
| 546 ScrollBeginEventBuilder touchScrollBegin( |
| 547 IntPoint(50, 50), FloatPoint(0.f, 1.f), WebGestureDeviceTouchscreen); |
| 548 ScrollEndEventBuilder touchScrollEnd; |
| 549 document().frame()->eventHandler().handleGestureEvent(touchScrollBegin); |
| 550 document().frame()->eventHandler().handleGestureEvent(touchScrollEnd); |
| 551 histogramTester.expectBucketCount("Renderer4.MainThreadGestureScrollReason", |
| 552 17, 1); |
| 553 |
| 554 document().frame()->eventHandler().handleGestureEvent(touchScrollBegin); |
| 555 document().frame()->eventHandler().handleGestureEvent(touchScrollEnd); |
| 556 histogramTester.expectBucketCount("Renderer4.MainThreadGestureScrollReason", |
| 557 17, 2); |
| 558 } |
| 559 |
464 class TooltipCapturingChromeClient : public EmptyChromeClient { | 560 class TooltipCapturingChromeClient : public EmptyChromeClient { |
465 public: | 561 public: |
466 TooltipCapturingChromeClient() {} | 562 TooltipCapturingChromeClient() {} |
467 | 563 |
468 void setToolTip(LocalFrame&, const String& str, TextDirection) override { | 564 void setToolTip(LocalFrame&, const String& str, TextDirection) override { |
469 m_lastToolTip = str; | 565 m_lastToolTip = str; |
470 } | 566 } |
471 | 567 |
472 String& lastToolTip() { return m_lastToolTip; } | 568 String& lastToolTip() { return m_lastToolTip; } |
473 | 569 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 WebInputEvent::MouseLeave, WebFloatPoint(0, 0), WebFloatPoint(0, 0), | 610 WebInputEvent::MouseLeave, WebFloatPoint(0, 0), WebFloatPoint(0, 0), |
515 WebPointerProperties::Button::NoButton, 0, WebInputEvent::NoModifiers, | 611 WebPointerProperties::Button::NoButton, 0, WebInputEvent::NoModifiers, |
516 TimeTicks::Now().InSeconds()); | 612 TimeTicks::Now().InSeconds()); |
517 mouseLeaveEvent.setFrameScale(1); | 613 mouseLeaveEvent.setFrameScale(1); |
518 document().frame()->eventHandler().handleMouseLeaveEvent(mouseLeaveEvent); | 614 document().frame()->eventHandler().handleMouseLeaveEvent(mouseLeaveEvent); |
519 | 615 |
520 EXPECT_EQ(WTF::String(), lastToolTip()); | 616 EXPECT_EQ(WTF::String(), lastToolTip()); |
521 } | 617 } |
522 | 618 |
523 } // namespace blink | 619 } // namespace blink |
OLD | NEW |