Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(336)

Side by Side Diff: third_party/WebKit/Source/core/events/TouchEventTest.cpp

Issue 2680973010: Log when PreventDefaulting event forced uncancellable. (Closed)
Patch Set: Fix silly bug, Win build still fails. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "core/events/TouchEvent.h"
6
7 #include "core/frame/FrameConsole.h"
8 #include "core/frame/UseCounter.h"
9 #include "core/loader/EmptyClients.cpp"
bokan 2017/02/10 00:24:06 Methinks you meant EmptyClients.h :)
tdresser 2017/02/10 13:24:57 GOSH DARN IT. Thanks.
10 #include "core/testing/DummyPageHolder.h"
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 using testing::ElementsAre;
15
16 namespace blink {
17
18 class ConsoleCapturingChromeClient : public EmptyChromeClient {
19 public:
20 ConsoleCapturingChromeClient() : EmptyChromeClient() {}
21
22 // ChromeClient methods:
23 void addMessageToConsole(LocalFrame*,
24 MessageSource messageSource,
25 MessageLevel,
26 const String& message,
27 unsigned lineNumber,
28 const String& sourceID,
29 const String& stackTrace) override {
30 m_messages.push_back(message);
31 m_messageSources.push_back(messageSource);
32 }
33
34 // Expose console output.
35 const std::vector<String>& messages() { return m_messages; }
36 const std::vector<MessageSource>& messageSources() {
37 return m_messageSources;
38 }
39
40 private:
41 std::vector<String> m_messages;
42 std::vector<MessageSource> m_messageSources;
43 };
44
45 class TouchEventTest : public testing::Test {
46 public:
47 TouchEventTest() {
48 m_chromeClient = new ConsoleCapturingChromeClient();
49 Page::PageClients clients;
50 fillWithEmptyClients(clients);
51 clients.chromeClient = m_chromeClient.get();
52 m_pageHolder = DummyPageHolder::create(IntSize(800, 600), &clients);
53 }
54
55 const std::vector<String>& messages() { return m_chromeClient->messages(); }
56 const std::vector<MessageSource>& messageSources() {
57 return m_chromeClient->messageSources();
58 }
59
60 LocalDOMWindow& window() { return *m_pageHolder->frame().domWindow(); }
61
62 Document& document() { return m_pageHolder->document(); }
63
64 TouchEvent* eventWithDispatchType(WebInputEvent::DispatchType dispatchType) {
65 WebTouchEvent webTouchEvent(WebInputEvent::TouchStart, 0, 0);
66 webTouchEvent.dispatchType = dispatchType;
67 return TouchEvent::create(webTouchEvent, nullptr, nullptr, nullptr,
68 "touchstart", &window(), TouchActionAuto);
69 }
70
71 private:
72 Persistent<ConsoleCapturingChromeClient> m_chromeClient;
73 std::unique_ptr<DummyPageHolder> m_pageHolder;
74 };
75
76 TEST_F(TouchEventTest, PreventDefaultUncancelable) {
77 TouchEvent* event = eventWithDispatchType(WebInputEvent::EventNonBlocking);
78 event->setHandlingPassive(Event::PassiveMode::NotPassiveDefault);
79
80 EXPECT_THAT(messages(), ElementsAre());
81 event->preventDefault();
82 EXPECT_THAT(messages(),
83 ElementsAre("Ignored attempt to cancel a touchstart event with "
84 "cancelable=false, for example because scrolling is "
85 "in progress and cannot be interrupted."));
86 EXPECT_THAT(messageSources(), ElementsAre(JSMessageSource));
87
88 EXPECT_TRUE(UseCounter::isCounted(
89 document(), UseCounter::UncancellableTouchEventPreventDefaulted));
90 EXPECT_FALSE(UseCounter::isCounted(
91 document(),
92 UseCounter::
93 UncancellableTouchEventPreventDefaultedDueToMainThreadResponsiveness)) ;
94 }
95
96 TEST_F(TouchEventTest,
97 PreventDefaultUncancelableDueToMainThreadResponsiveness) {
98 TouchEvent* event = eventWithDispatchType(
99 WebInputEvent::ListenersForcedNonBlockingDueToMainThreadResponsiveness);
100 event->setHandlingPassive(Event::PassiveMode::NotPassiveDefault);
101
102 EXPECT_THAT(messages(), ElementsAre());
103 event->preventDefault();
104 EXPECT_THAT(messages(),
105 ElementsAre("Ignored attempt to cancel a touchstart event with "
106 "cancelable=false. This event was forced to be "
107 "non-cancellable because the page was too busy to "
108 "handle the event promptly."));
109 EXPECT_THAT(messageSources(), ElementsAre(InterventionMessageSource));
110
111 EXPECT_TRUE(UseCounter::isCounted(
112 document(), UseCounter::UncancellableTouchEventPreventDefaulted));
113 EXPECT_TRUE(UseCounter::isCounted(
114 document(),
115 UseCounter::
116 UncancellableTouchEventPreventDefaultedDueToMainThreadResponsiveness)) ;
117 }
118
119 TEST_F(TouchEventTest,
120 PreventDefaultPassiveDueToDocumentLevelScrollerIntervention) {
121 TouchEvent* event =
122 eventWithDispatchType(WebInputEvent::ListenersNonBlockingPassive);
123 event->setHandlingPassive(Event::PassiveMode::PassiveForcedDocumentLevel);
124
125 EXPECT_THAT(messages(), ElementsAre());
126 event->preventDefault();
127 EXPECT_THAT(
128 messages(),
129 ElementsAre("Unable to preventDefault inside passive event listener due "
130 "to target being treated as passive. See "
131 "https://www.chromestatus.com/features/5093566007214080"));
132 EXPECT_THAT(messageSources(), ElementsAre(InterventionMessageSource));
133 }
134
135 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698