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

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

Issue 879543004: Fix ASSERT in Sky when dragging outside the window on linux (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: 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 | « no previous file | sky/viewer/converters/input_event_types.cc » ('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"
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 // embedder regardless, so we set m_suppressNextCharEvent, will will prevent 162 // embedder regardless, so we set m_suppressNextCharEvent, will will prevent
163 // us from dispatching the keypress event when we receive that Char event. 163 // us from dispatching the keypress event when we receive that Char event.
164 if (handled && event.type == WebInputEvent::KeyDown) 164 if (handled && event.type == WebInputEvent::KeyDown)
165 m_suppressNextCharEvent = true; 165 m_suppressNextCharEvent = true;
166 166
167 return handled; 167 return handled;
168 } 168 }
169 169
170 bool NewEventHandler::handlePointerDownEvent(const WebPointerEvent& event) 170 bool NewEventHandler::handlePointerDownEvent(const WebPointerEvent& event)
171 { 171 {
172 // In principle, we shouldn't get another pointer down for the same
173 // pointer ID, but for mice, we don't get a pointer cancel when you
174 // drag outside the window frame on Linux. For now, send the pointer
175 // cancel at this point.
176 if (event.kind == WebPointerEvent::Mouse
177 && m_targetForPointer.find(event.pointer) != m_targetForPointer.end()) {
178 WebPointerEvent fakeCancel = event;
179 fakeCancel.type = WebInputEvent::PointerCancel;
180 handlePointerCancelEvent(fakeCancel);
181 }
182
172 ASSERT(m_targetForPointer.find(event.pointer) == m_targetForPointer.end()); 183 ASSERT(m_targetForPointer.find(event.pointer) == m_targetForPointer.end());
173 HitTestResult hitTestResult = performHitTest(positionForEvent(event)); 184 HitTestResult hitTestResult = performHitTest(positionForEvent(event));
174 RefPtr<Node> target = targetForHitTestResult(hitTestResult); 185 RefPtr<Node> target = targetForHitTestResult(hitTestResult);
175 if (!target) 186 if (!target)
176 return false; 187 return false;
177 m_targetForPointer[event.pointer] = target; 188 m_targetForPointer[event.pointer] = target;
178 bool eventSwallowed = !dispatchPointerEvent(*target, event); 189 bool eventSwallowed = !dispatchPointerEvent(*target, event);
179 // TODO(abarth): Set the target for the pointer to something determined when 190 // TODO(abarth): Set the target for the pointer to something determined when
180 // dispatching the event. 191 // dispatching the event.
181 updateSelectionForPointerDown(hitTestResult, event); 192 updateSelectionForPointerDown(hitTestResult, event);
182 return eventSwallowed; 193 return eventSwallowed;
183 } 194 }
184 195
185 bool NewEventHandler::handlePointerUpEvent(const WebPointerEvent& event) 196 bool NewEventHandler::handlePointerUpEvent(const WebPointerEvent& event)
186 { 197 {
187 RefPtr<Node> target = m_targetForPointer[event.pointer]; 198 auto it = m_targetForPointer.find(event.pointer);
188 if (!target) 199 if (it == m_targetForPointer.end())
189 return false; 200 return false;
190 m_targetForPointer.erase(event.pointer); 201 RefPtr<Node> target = it->second;
202 m_targetForPointer.erase(it);
203 ASSERT(target);
191 bool eventSwallowed = !dispatchPointerEvent(*target, event); 204 bool eventSwallowed = !dispatchPointerEvent(*target, event);
192 // When the user releases the primary pointer, we need to dispatch a tap 205 // When the user releases the primary pointer, we need to dispatch a tap
193 // event to the common ancestor for where the pointer went down and where 206 // event to the common ancestor for where the pointer went down and where
194 // it came up. 207 // it came up.
195 if (!dispatchClickEvent(*target, event)) 208 if (!dispatchClickEvent(*target, event))
196 eventSwallowed = true; 209 eventSwallowed = true;
197 return eventSwallowed; 210 return eventSwallowed;
198 } 211 }
199 212
200 bool NewEventHandler::handlePointerMoveEvent(const WebPointerEvent& event) 213 bool NewEventHandler::handlePointerMoveEvent(const WebPointerEvent& event)
201 { 214 {
202 RefPtr<Node> target = m_targetForPointer[event.pointer]; 215 auto it = m_targetForPointer.find(event.pointer);
203 return target && dispatchPointerEvent(*target.get(), event); 216 if (it == m_targetForPointer.end())
217 return false;
218 RefPtr<Node> target = it->second;
219 ASSERT(target);
220 return dispatchPointerEvent(*target.get(), event);
204 } 221 }
205 222
206 bool NewEventHandler::handlePointerCancelEvent(const WebPointerEvent& event) 223 bool NewEventHandler::handlePointerCancelEvent(const WebPointerEvent& event)
207 { 224 {
208 RefPtr<Node> target = m_targetForPointer[event.pointer]; 225 auto it = m_targetForPointer.find(event.pointer);
209 return target && dispatchPointerEvent(*target, event); 226 if (it == m_targetForPointer.end())
227 return false;
228 RefPtr<Node> target = it->second;
229 m_targetForPointer.erase(it);
230 ASSERT(target);
231 return dispatchPointerEvent(*target, event);
210 } 232 }
211 233
212 } 234 }
OLDNEW
« no previous file with comments | « no previous file | sky/viewer/converters/input_event_types.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698