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

Side by Side Diff: sky/engine/core/frame/NewEventHandler.cpp

Issue 872233002: Switch KeyboardEvents over to NewEventHandler (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Rename virtualKeyCode to key Created 5 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
« no previous file with comments | « sky/engine/core/frame/NewEventHandler.h ('k') | sky/engine/core/page/ChromeClient.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "sky/engine/config.h" 5 #include "sky/engine/config.h"
6 #include "sky/engine/core/frame/NewEventHandler.h" 6 #include "sky/engine/core/frame/NewEventHandler.h"
7 7
8 #include "sky/engine/core/dom/Document.h" 8 #include "sky/engine/core/dom/Document.h"
9 #include "sky/engine/core/dom/NodeRenderingTraversal.h" 9 #include "sky/engine/core/dom/NodeRenderingTraversal.h"
10 #include "sky/engine/core/editing/Editor.h" 10 #include "sky/engine/core/editing/Editor.h"
11 #include "sky/engine/core/editing/FrameSelection.h" 11 #include "sky/engine/core/editing/FrameSelection.h"
12 #include "sky/engine/core/editing/htmlediting.h" 12 #include "sky/engine/core/editing/htmlediting.h"
13 #include "sky/engine/core/events/GestureEvent.h" 13 #include "sky/engine/core/events/GestureEvent.h"
14 #include "sky/engine/core/events/KeyboardEvent.h"
14 #include "sky/engine/core/events/PointerEvent.h" 15 #include "sky/engine/core/events/PointerEvent.h"
15 #include "sky/engine/core/frame/LocalFrame.h" 16 #include "sky/engine/core/frame/LocalFrame.h"
16 #include "sky/engine/core/frame/FrameView.h" 17 #include "sky/engine/core/frame/FrameView.h"
17 #include "sky/engine/core/page/EventWithHitTestResults.h" 18 #include "sky/engine/core/page/EventWithHitTestResults.h"
18 #include "sky/engine/core/rendering/RenderObject.h" 19 #include "sky/engine/core/rendering/RenderObject.h"
19 #include "sky/engine/core/rendering/RenderView.h" 20 #include "sky/engine/core/rendering/RenderView.h"
21 #include "sky/engine/platform/KeyboardCodes.h"
20 #include "sky/engine/platform/geometry/FloatPoint.h" 22 #include "sky/engine/platform/geometry/FloatPoint.h"
21 #include "sky/engine/public/platform/WebInputEvent.h" 23 #include "sky/engine/public/platform/WebInputEvent.h"
22 24
23 namespace blink { 25 namespace blink {
24 26
25 static VisiblePosition visiblePositionForHitTestResult(const HitTestResult& hitT estResult) 27 static VisiblePosition visiblePositionForHitTestResult(const HitTestResult& hitT estResult)
26 { 28 {
27 Node* innerNode = hitTestResult.innerNode(); 29 Node* innerNode = hitTestResult.innerNode();
28 VisiblePosition position(innerNode->renderer()->positionForPoint(hitTestResu lt.localPoint())); 30 VisiblePosition position(innerNode->renderer()->positionForPoint(hitTestResu lt.localPoint()));
29 if (!position.isNull()) 31 if (!position.isNull())
30 return position; 32 return position;
31 return VisiblePosition(firstPositionInOrBeforeNode(innerNode), DOWNSTREAM); 33 return VisiblePosition(firstPositionInOrBeforeNode(innerNode), DOWNSTREAM);
32 } 34 }
33 35
34 template<typename EventType> 36 template<typename EventType>
35 static LayoutPoint positionForEvent(const EventType& event) 37 static LayoutPoint positionForEvent(const EventType& event)
36 { 38 {
37 return roundedLayoutPoint(FloatPoint(event.x, event.y)); 39 return roundedLayoutPoint(FloatPoint(event.x, event.y));
38 } 40 }
39 41
40 NewEventHandler::NewEventHandler(LocalFrame& frame) 42 NewEventHandler::NewEventHandler(LocalFrame& frame)
41 : m_frame(frame) 43 : m_frame(frame)
44 , m_suppressNextCharEvent(false)
42 { 45 {
43 } 46 }
44 47
45 NewEventHandler::~NewEventHandler() 48 NewEventHandler::~NewEventHandler()
46 { 49 {
47 } 50 }
48 51
52 Node* NewEventHandler::targetForKeyboardEvent() const
53 {
54 Document* document = m_frame.document();
55 if (Node* focusedElement = document->focusedElement())
56 return focusedElement;
57 return document->documentElement();
58 }
59
49 Node* NewEventHandler::targetForHitTestResult(const HitTestResult& hitTestResult ) 60 Node* NewEventHandler::targetForHitTestResult(const HitTestResult& hitTestResult )
50 { 61 {
51 Node* node = hitTestResult.innerNode(); 62 Node* node = hitTestResult.innerNode();
52 if (!node) 63 if (!node)
53 return m_frame.document(); 64 return m_frame.document()->documentElement();
54 if (node->isTextNode()) 65 if (node->isTextNode())
55 return NodeRenderingTraversal::parent(node); 66 return NodeRenderingTraversal::parent(node);
56 return node; 67 return node;
57 } 68 }
58 69
59 HitTestResult NewEventHandler::performHitTest(const LayoutPoint& point) 70 HitTestResult NewEventHandler::performHitTest(const LayoutPoint& point)
60 { 71 {
61 HitTestResult result(point); 72 HitTestResult result(point);
62 if (!m_frame.contentRenderer()) 73 if (!m_frame.contentRenderer())
63 return result; 74 return result;
64 m_frame.contentRenderer()->hitTest(HitTestRequest(HitTestRequest::ReadOnly), result); 75 m_frame.contentRenderer()->hitTest(HitTestRequest(HitTestRequest::ReadOnly), result);
65 return result; 76 return result;
66 } 77 }
67 78
68 bool NewEventHandler::dispatchPointerEvent(Node& target, const WebPointerEvent& event) 79 bool NewEventHandler::dispatchPointerEvent(Node& target, const WebPointerEvent& event)
69 { 80 {
70 RefPtr<PointerEvent> pointerEvent = PointerEvent::create(event); 81 RefPtr<PointerEvent> pointerEvent = PointerEvent::create(event);
71 // TODO(abarth): Keep track of how many pointers are targeting the same node 82 // TODO(abarth): Keep track of how many pointers are targeting the same node
72 // and only mark the first one as primary. 83 // and only mark the first one as primary.
73 return target.dispatchEvent(pointerEvent.release()); 84 return target.dispatchEvent(pointerEvent.release());
74 } 85 }
75 86
76 bool NewEventHandler::dispatchGestureEvent(Node& target, const WebGestureEvent& event) 87 bool NewEventHandler::dispatchGestureEvent(Node& target, const WebGestureEvent& event)
77 { 88 {
78 RefPtr<GestureEvent> gestureEvent = GestureEvent::create(event); 89 RefPtr<GestureEvent> gestureEvent = GestureEvent::create(event);
79 return target.dispatchEvent(gestureEvent.release()); 90 return target.dispatchEvent(gestureEvent.release());
80 } 91 }
81 92
93 bool NewEventHandler::dispatchKeyboardEvent(Node& target, const WebKeyboardEvent & event)
94 {
95 RefPtr<KeyboardEvent> keyboardEvent = KeyboardEvent::create(event);
96 return target.dispatchEvent(keyboardEvent.release());
97 }
98
82 bool NewEventHandler::dispatchClickEvent(Node& capturingTarget, const WebPointer Event& event) 99 bool NewEventHandler::dispatchClickEvent(Node& capturingTarget, const WebPointer Event& event)
83 { 100 {
84 ASSERT(event.type == WebInputEvent::PointerUp); 101 ASSERT(event.type == WebInputEvent::PointerUp);
85 HitTestResult hitTestResult = performHitTest(positionForEvent(event)); 102 HitTestResult hitTestResult = performHitTest(positionForEvent(event));
86 Node* releaseTarget = targetForHitTestResult(hitTestResult); 103 Node* releaseTarget = targetForHitTestResult(hitTestResult);
87 Node* clickTarget = NodeRenderingTraversal::commonAncestor(*releaseTarget, c apturingTarget); 104 Node* clickTarget = NodeRenderingTraversal::commonAncestor(*releaseTarget, c apturingTarget);
88 if (!clickTarget) 105 if (!clickTarget)
89 return true; 106 return true;
90 // TODO(abarth): Make a proper gesture event that includes information from the event. 107 // TODO(abarth): Make a proper gesture event that includes information from the event.
91 return clickTarget->dispatchEvent(Event::createCancelableBubble(EventTypeNam es::click)); 108 return clickTarget->dispatchEvent(Event::createCancelableBubble(EventTypeNam es::click));
(...skipping 22 matching lines...) Expand all
114 if (event.type == WebInputEvent::PointerMove) 131 if (event.type == WebInputEvent::PointerMove)
115 return handlePointerMoveEvent(event); 132 return handlePointerMoveEvent(event);
116 ASSERT(event.type == WebInputEvent::PointerCancel); 133 ASSERT(event.type == WebInputEvent::PointerCancel);
117 return handlePointerCancelEvent(event); 134 return handlePointerCancelEvent(event);
118 } 135 }
119 136
120 bool NewEventHandler::handleGestureEvent(const WebGestureEvent& event) 137 bool NewEventHandler::handleGestureEvent(const WebGestureEvent& event)
121 { 138 {
122 HitTestResult hitTestResult = performHitTest(positionForEvent(event)); 139 HitTestResult hitTestResult = performHitTest(positionForEvent(event));
123 RefPtr<Node> target = targetForHitTestResult(hitTestResult); 140 RefPtr<Node> target = targetForHitTestResult(hitTestResult);
124 return !dispatchGestureEvent(*target, event); 141 return target && !dispatchGestureEvent(*target, event);
142 }
143
144 bool NewEventHandler::handleKeyboardEvent(const WebKeyboardEvent& event)
145 {
146 bool shouldSuppressCharEvent = m_suppressNextCharEvent;
147 m_suppressNextCharEvent = false;
148
149 if (event.type == WebInputEvent::Char) {
150 if (shouldSuppressCharEvent)
151 return true;
152 // Do we really need to suppress keypress events for these keys anymore?
153 if (event.key == VKEY_BACK
154 || event.key == VKEY_ESCAPE)
155 return true;
156 }
157
158 RefPtr<Node> target = targetForKeyboardEvent();
159 bool handled = target && !dispatchKeyboardEvent(*target, event);
160
161 // If the keydown event was handled, we don't want to "generate" a keypress
162 // event for that keystroke. However, we'll receive a Char event from the
163 // embedder regardless, so we set m_suppressNextCharEvent, will will prevent
164 // us from dispatching the keypress event when we receive that Char event.
165 if (handled && event.type == WebInputEvent::KeyDown)
166 m_suppressNextCharEvent = true;
167
168 return handled;
125 } 169 }
126 170
127 bool NewEventHandler::handlePointerDownEvent(const WebPointerEvent& event) 171 bool NewEventHandler::handlePointerDownEvent(const WebPointerEvent& event)
128 { 172 {
129 ASSERT(m_targetForPointer.find(event.pointer) == m_targetForPointer.end()); 173 ASSERT(m_targetForPointer.find(event.pointer) == m_targetForPointer.end());
130 HitTestResult hitTestResult = performHitTest(positionForEvent(event)); 174 HitTestResult hitTestResult = performHitTest(positionForEvent(event));
131 RefPtr<Node> target = targetForHitTestResult(hitTestResult); 175 RefPtr<Node> target = targetForHitTestResult(hitTestResult);
176 if (!target)
177 return false;
132 m_targetForPointer[event.pointer] = target; 178 m_targetForPointer[event.pointer] = target;
133 bool eventSwallowed = !dispatchPointerEvent(*target, event); 179 bool eventSwallowed = !dispatchPointerEvent(*target, event);
134 // TODO(abarth): Set the target for the pointer to something determined when 180 // TODO(abarth): Set the target for the pointer to something determined when
135 // dispatching the event. 181 // dispatching the event.
136 updateSelectionForPointerDown(hitTestResult, event); 182 updateSelectionForPointerDown(hitTestResult, event);
137 return eventSwallowed; 183 return eventSwallowed;
138 } 184 }
139 185
140 bool NewEventHandler::handlePointerUpEvent(const WebPointerEvent& event) 186 bool NewEventHandler::handlePointerUpEvent(const WebPointerEvent& event)
141 { 187 {
(...skipping 16 matching lines...) Expand all
158 return target && dispatchPointerEvent(*target.get(), event); 204 return target && dispatchPointerEvent(*target.get(), event);
159 } 205 }
160 206
161 bool NewEventHandler::handlePointerCancelEvent(const WebPointerEvent& event) 207 bool NewEventHandler::handlePointerCancelEvent(const WebPointerEvent& event)
162 { 208 {
163 RefPtr<Node> target = m_targetForPointer[event.pointer]; 209 RefPtr<Node> target = m_targetForPointer[event.pointer];
164 return target && dispatchPointerEvent(*target, event); 210 return target && dispatchPointerEvent(*target, event);
165 } 211 }
166 212
167 } 213 }
OLDNEW
« no previous file with comments | « sky/engine/core/frame/NewEventHandler.h ('k') | sky/engine/core/page/ChromeClient.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698