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

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

Issue 823873004: Add basic PointerEvent support in NewEventHandler (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: git cl try Created 5 years, 11 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/rendering/RenderView.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "sky/engine/config.h"
6 #include "sky/engine/core/frame/NewEventHandler.h"
7
8 #include "sky/engine/core/dom/Document.h"
9 #include "sky/engine/core/dom/NodeRenderingTraversal.h"
10 #include "sky/engine/core/dom/TouchList.h"
11 #include "sky/engine/core/editing/Editor.h"
12 #include "sky/engine/core/editing/FrameSelection.h"
13 #include "sky/engine/core/editing/htmlediting.h"
14 #include "sky/engine/core/events/PointerEvent.h"
15 #include "sky/engine/core/frame/LocalFrame.h"
16 #include "sky/engine/core/frame/FrameView.h"
17 #include "sky/engine/core/page/EventWithHitTestResults.h"
18 #include "sky/engine/core/rendering/RenderObject.h"
19 #include "sky/engine/core/rendering/RenderView.h"
20 #include "sky/engine/platform/geometry/FloatPoint.h"
21 #include "sky/engine/public/platform/WebInputEvent.h"
22
23 namespace blink {
24
25 static VisiblePosition visiblePositionForHitTestResult(const HitTestResult& hitT estResult)
26 {
27 Node* innerNode = hitTestResult.innerNode();
28 VisiblePosition position(innerNode->renderer()->positionForPoint(hitTestResu lt.localPoint()));
29 if (!position.isNull())
30 return position;
31 return VisiblePosition(firstPositionInOrBeforeNode(innerNode), DOWNSTREAM);
32 }
33
34 static LayoutPoint positionForEvent(const WebPointerEvent& event)
35 {
36 return roundedLayoutPoint(FloatPoint(event.x, event.y));
37 }
38
39 NewEventHandler::NewEventHandler(LocalFrame& frame)
40 : m_frame(frame)
41 {
42 }
43
44 NewEventHandler::~NewEventHandler()
45 {
46 }
47
48 Node* NewEventHandler::targetForHitTestResult(const HitTestResult& hitTestResult )
49 {
50 Node* node = hitTestResult.innerNode();
51 if (!node)
52 return m_frame.document();
53 if (node->isTextNode())
54 return NodeRenderingTraversal::parent(node);
55 return node;
56 }
57
58 HitTestResult NewEventHandler::performHitTest(const LayoutPoint& point)
59 {
60 HitTestResult result(point);
61 if (!m_frame.contentRenderer())
62 return result;
63 m_frame.contentRenderer()->hitTest(HitTestRequest(HitTestRequest::ReadOnly), result);
64 return result;
65 }
66
67 bool NewEventHandler::dispatchPointerEvent(Node& target, const WebPointerEvent& event)
68 {
69 RefPtr<PointerEvent> pointerEvent = PointerEvent::create(event);
70 // TODO(abarth): Keep track of how many pointers are targeting the same node
71 // and only mark the first one as primary.
72 return target.dispatchEvent(pointerEvent.release());
73 }
74
75 bool NewEventHandler::dispatchClickEvent(Node& capturingTarget, const WebPointer Event& event)
76 {
77 ASSERT(event.type == WebInputEvent::PointerUp);
78 HitTestResult hitTestResult = performHitTest(positionForEvent(event));
79 Node* releaseTarget = targetForHitTestResult(hitTestResult);
80 Node* clickTarget = NodeRenderingTraversal::commonAncestor(*releaseTarget, c apturingTarget);
81 if (!clickTarget)
82 return true;
83 // TODO(abarth): Make a proper gesture event that includes information from the event.
84 return clickTarget->dispatchEvent(Event::createCancelableBubble(EventTypeNam es::click));
85 }
86
87 void NewEventHandler::updateSelectionForPointerDown(const HitTestResult& hitTest Result, const WebPointerEvent& event)
88 {
89 Node* innerNode = hitTestResult.innerNode();
90 if (!innerNode->renderer())
91 return;
92 if (Position::nodeIsUserSelectNone(innerNode))
93 return;
94 if (!innerNode->dispatchEvent(Event::createCancelableBubble(EventTypeNames:: selectstart)))
95 return;
96 VisiblePosition position = visiblePositionForHitTestResult(hitTestResult);
97 // TODO(abarth): Can we change this to setSelectionIfNeeded?
98 m_frame.selection().setNonDirectionalSelectionIfNeeded(VisibleSelection(posi tion), CharacterGranularity);
99 }
100
101 bool NewEventHandler::handlePointerEvent(const WebPointerEvent& event)
102 {
103 if (event.type == WebInputEvent::PointerDown)
104 return handlePointerDownEvent(event);
105 if (event.type == WebInputEvent::PointerUp)
106 return handlePointerUpEvent(event);
107 if (event.type == WebInputEvent::PointerMove)
108 return handlePointerMoveEvent(event);
109 ASSERT(event.type == WebInputEvent::PointerCancel);
110 return handlePointerCancelEvent(event);
111 }
112
113 bool NewEventHandler::handlePointerDownEvent(const WebPointerEvent& event)
114 {
115 ASSERT(!m_targetForPointer.contains(event.pointer));
116 HitTestResult hitTestResult = performHitTest(positionForEvent(event));
117 RefPtr<Node> target = targetForHitTestResult(hitTestResult);
118 m_targetForPointer.set(event.pointer, target);
119 bool eventSwallowed = !dispatchPointerEvent(*target, event);
120 // TODO(abarth): Set the target for the pointer to something determined when
121 // dispatching the event.
122 updateSelectionForPointerDown(hitTestResult, event);
123 return eventSwallowed;
124 }
125
126 bool NewEventHandler::handlePointerUpEvent(const WebPointerEvent& event)
127 {
128 RefPtr<Node> target = m_targetForPointer.take(event.pointer);
129 if (!target)
130 return false;
131 bool eventSwallowed = !dispatchPointerEvent(*target, event);
132 // When the user releases the primary pointer, we need to dispatch a tap
133 // event to the common ancestor for where the pointer went down and where
134 // it came up.
135 if (!dispatchClickEvent(*target, event))
136 eventSwallowed = true;
137 return eventSwallowed;
138 }
139
140 bool NewEventHandler::handlePointerMoveEvent(const WebPointerEvent& event)
141 {
142 RefPtr<Node> target = m_targetForPointer.get(event.pointer);
143 return target && dispatchPointerEvent(*target.get(), event);
144 }
145
146 bool NewEventHandler::handlePointerCancelEvent(const WebPointerEvent& event)
147 {
148 RefPtr<Node> target = m_targetForPointer.take(event.pointer);
149 return target && dispatchPointerEvent(*target, event);
150 }
151
152 }
OLDNEW
« no previous file with comments | « sky/engine/core/frame/NewEventHandler.h ('k') | sky/engine/core/rendering/RenderView.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698