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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | sky/viewer/converters/input_event_types.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sky/engine/core/frame/NewEventHandler.cpp
diff --git a/sky/engine/core/frame/NewEventHandler.cpp b/sky/engine/core/frame/NewEventHandler.cpp
index b90330d7957e4d945ef0d362344c3939ae88f8c3..2b0598c720720941601a18aabeac06449af5c6a4 100644
--- a/sky/engine/core/frame/NewEventHandler.cpp
+++ b/sky/engine/core/frame/NewEventHandler.cpp
@@ -169,6 +169,17 @@ bool NewEventHandler::handleKeyboardEvent(const WebKeyboardEvent& event)
bool NewEventHandler::handlePointerDownEvent(const WebPointerEvent& event)
{
+ // In principle, we shouldn't get another pointer down for the same
+ // pointer ID, but for mice, we don't get a pointer cancel when you
+ // drag outside the window frame on Linux. For now, send the pointer
+ // cancel at this point.
+ if (event.kind == WebPointerEvent::Mouse
+ && m_targetForPointer.find(event.pointer) != m_targetForPointer.end()) {
+ WebPointerEvent fakeCancel = event;
+ fakeCancel.type = WebInputEvent::PointerCancel;
+ handlePointerCancelEvent(fakeCancel);
+ }
+
ASSERT(m_targetForPointer.find(event.pointer) == m_targetForPointer.end());
HitTestResult hitTestResult = performHitTest(positionForEvent(event));
RefPtr<Node> target = targetForHitTestResult(hitTestResult);
@@ -184,10 +195,12 @@ bool NewEventHandler::handlePointerDownEvent(const WebPointerEvent& event)
bool NewEventHandler::handlePointerUpEvent(const WebPointerEvent& event)
{
- RefPtr<Node> target = m_targetForPointer[event.pointer];
- if (!target)
+ auto it = m_targetForPointer.find(event.pointer);
+ if (it == m_targetForPointer.end())
return false;
- m_targetForPointer.erase(event.pointer);
+ RefPtr<Node> target = it->second;
+ m_targetForPointer.erase(it);
+ ASSERT(target);
bool eventSwallowed = !dispatchPointerEvent(*target, event);
// When the user releases the primary pointer, we need to dispatch a tap
// event to the common ancestor for where the pointer went down and where
@@ -199,14 +212,23 @@ bool NewEventHandler::handlePointerUpEvent(const WebPointerEvent& event)
bool NewEventHandler::handlePointerMoveEvent(const WebPointerEvent& event)
{
- RefPtr<Node> target = m_targetForPointer[event.pointer];
- return target && dispatchPointerEvent(*target.get(), event);
+ auto it = m_targetForPointer.find(event.pointer);
+ if (it == m_targetForPointer.end())
+ return false;
+ RefPtr<Node> target = it->second;
+ ASSERT(target);
+ return dispatchPointerEvent(*target.get(), event);
}
bool NewEventHandler::handlePointerCancelEvent(const WebPointerEvent& event)
{
- RefPtr<Node> target = m_targetForPointer[event.pointer];
- return target && dispatchPointerEvent(*target, event);
+ auto it = m_targetForPointer.find(event.pointer);
+ if (it == m_targetForPointer.end())
+ return false;
+ RefPtr<Node> target = it->second;
+ m_targetForPointer.erase(it);
+ ASSERT(target);
+ return dispatchPointerEvent(*target, event);
}
}
« 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