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

Unified 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: nits 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
Index: sky/engine/core/frame/NewEventHandler.cpp
diff --git a/sky/engine/core/frame/NewEventHandler.cpp b/sky/engine/core/frame/NewEventHandler.cpp
index ebafd720e8150ad276fcb760f536310b8498c9fc..b150fa410cfb29985794c9938ac41d5fd4783989 100644
--- a/sky/engine/core/frame/NewEventHandler.cpp
+++ b/sky/engine/core/frame/NewEventHandler.cpp
@@ -11,12 +11,14 @@
#include "sky/engine/core/editing/FrameSelection.h"
#include "sky/engine/core/editing/htmlediting.h"
#include "sky/engine/core/events/GestureEvent.h"
+#include "sky/engine/core/events/KeyboardEvent.h"
#include "sky/engine/core/events/PointerEvent.h"
#include "sky/engine/core/frame/LocalFrame.h"
#include "sky/engine/core/frame/FrameView.h"
#include "sky/engine/core/page/EventWithHitTestResults.h"
#include "sky/engine/core/rendering/RenderObject.h"
#include "sky/engine/core/rendering/RenderView.h"
+#include "sky/engine/platform/KeyboardCodes.h"
#include "sky/engine/platform/geometry/FloatPoint.h"
#include "sky/engine/public/platform/WebInputEvent.h"
@@ -39,6 +41,7 @@ static LayoutPoint positionForEvent(const EventType& event)
NewEventHandler::NewEventHandler(LocalFrame& frame)
: m_frame(frame)
+ , m_suppressNextCharEvent(false)
{
}
@@ -46,11 +49,19 @@ NewEventHandler::~NewEventHandler()
{
}
+Node* NewEventHandler::targetForKeyboardEvent() const
+{
+ Document* document = m_frame.document();
+ if (Node* focusedElement = document->focusedElement())
+ return focusedElement;
+ return document->documentElement();
+}
+
Node* NewEventHandler::targetForHitTestResult(const HitTestResult& hitTestResult)
{
Node* node = hitTestResult.innerNode();
if (!node)
- return m_frame.document();
+ return m_frame.document()->documentElement();
if (node->isTextNode())
return NodeRenderingTraversal::parent(node);
return node;
@@ -79,6 +90,12 @@ bool NewEventHandler::dispatchGestureEvent(Node& target, const WebGestureEvent&
return target.dispatchEvent(gestureEvent.release());
}
+bool NewEventHandler::dispatchKeyboardEvent(Node& target, const WebKeyboardEvent& event)
+{
+ RefPtr<KeyboardEvent> keyboardEvent = KeyboardEvent::create(event);
+ return target.dispatchEvent(keyboardEvent.release());
+}
+
bool NewEventHandler::dispatchClickEvent(Node& capturingTarget, const WebPointerEvent& event)
{
ASSERT(event.type == WebInputEvent::PointerUp);
@@ -121,7 +138,34 @@ bool NewEventHandler::handleGestureEvent(const WebGestureEvent& event)
{
HitTestResult hitTestResult = performHitTest(positionForEvent(event));
RefPtr<Node> target = targetForHitTestResult(hitTestResult);
- return !dispatchGestureEvent(*target, event);
+ return target && !dispatchGestureEvent(*target, event);
+}
+
+bool NewEventHandler::handleKeyboardEvent(const WebKeyboardEvent& event)
+{
+ bool shouldSuppressCharEvent = m_suppressNextCharEvent;
+ m_suppressNextCharEvent = false;
+
+ if (event.type == WebInputEvent::Char) {
+ if (shouldSuppressCharEvent)
+ return true;
+ // Do we really need to suppress keypress events for these keys anymore?
ojan 2015/01/26 06:18:51 I think probably we don't need to. Although, reall
abarth-chromium 2015/01/26 06:28:16 Yeah. I wasn't sure how much of the nuttiness to
+ if (event.virtualKeyCode == VKEY_BACK
+ || event.virtualKeyCode == VKEY_ESCAPE)
+ return true;
+ }
+
+ RefPtr<Node> target = targetForKeyboardEvent();
+ bool handled = target && !dispatchKeyboardEvent(*target, event);
+
+ // If the keydown event was handled, we don't want to "generate" a keypress
+ // event for that keystroke. However, we'll receive a Char event from the
+ // embedder regardless, so we set m_suppressNextCharEvent, will will prevent
+ // us from dispatching the keypress event when we receive that Char event.
+ if (handled && event.type == WebInputEvent::KeyDown)
+ m_suppressNextCharEvent = true;
+
+ return handled;
}
bool NewEventHandler::handlePointerDownEvent(const WebPointerEvent& event)
@@ -129,6 +173,8 @@ bool NewEventHandler::handlePointerDownEvent(const WebPointerEvent& event)
ASSERT(m_targetForPointer.find(event.pointer) == m_targetForPointer.end());
HitTestResult hitTestResult = performHitTest(positionForEvent(event));
RefPtr<Node> target = targetForHitTestResult(hitTestResult);
+ if (!target)
ojan 2015/01/26 06:18:51 Presumably this is the fix for https://github.com/
abarth-chromium 2015/01/26 06:28:16 Yeah. I'm checking now. If it is, I'll land sepa
abarth-chromium 2015/01/26 06:38:51 I wasn't able to reproduce the crash...
+ return false;
m_targetForPointer[event.pointer] = target;
bool eventSwallowed = !dispatchPointerEvent(*target, event);
// TODO(abarth): Set the target for the pointer to something determined when

Powered by Google App Engine
This is Rietveld 408576698