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

Unified Diff: third_party/WebKit/Source/core/input/EventHandler.cpp

Issue 1378583003: Unstrangle unhandled key event callback for webview (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: changed variable names and comments Created 5 years 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 | « third_party/WebKit/Source/core/input/EventHandler.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/input/EventHandler.cpp
diff --git a/third_party/WebKit/Source/core/input/EventHandler.cpp b/third_party/WebKit/Source/core/input/EventHandler.cpp
index 898e7d53aeac75f92ae1735d289de4cfb5aceade..29c4de12caaaff98df42f60c776190d248a33d6a 100644
--- a/third_party/WebKit/Source/core/input/EventHandler.cpp
+++ b/third_party/WebKit/Source/core/input/EventHandler.cpp
@@ -304,6 +304,8 @@ EventHandler::EventHandler(LocalFrame* frame)
, m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired)
, m_lastShowPressTimestamp(0)
, m_deltaConsumedForScrollSequence(false)
+ , m_overrideNextKeyupEvent(false)
+ , m_returnValueForNextKeyupEvent(false)
{
}
@@ -3150,6 +3152,24 @@ bool EventHandler::handleAccessKey(const PlatformKeyboardEvent& evt)
bool EventHandler::keyEvent(const PlatformKeyboardEvent& initialKeyEvent)
{
+ bool overrideKeyupEvent = false;
dtapuska 2015/12/02 14:25:12 Not every keyup corresponds to a keydown. Ctrl-Tab
+ bool returnValueForKeyupEvent = false;
+ switch (initialKeyEvent.type()) {
+ case PlatformEvent::KeyUp:
+ overrideKeyupEvent = m_overrideNextKeyupEvent;
+ returnValueForKeyupEvent = m_returnValueForNextKeyupEvent;
+ m_returnValueForNextKeyupEvent = false;
+ m_overrideNextKeyupEvent = false;
+ break;
+ case PlatformEvent::RawKeyDown:
+ case PlatformEvent::KeyDown:
+ m_returnValueForNextKeyupEvent = false;
+ m_overrideNextKeyupEvent = false;
+ break;
+ default:
+ break;
+ }
+
RefPtrWillBeRawPtr<FrameView> protector(m_frame->view());
m_frame->chromeClient().setToolTip(String(), LTR);
@@ -3184,9 +3204,18 @@ bool EventHandler::keyEvent(const PlatformKeyboardEvent& initialKeyEvent)
if (initialKeyEvent.type() == PlatformEvent::KeyDown)
matchedAnAccessKey = handleAccessKey(initialKeyEvent);
- // FIXME: it would be fair to let an input method handle KeyUp events before DOM dispatch.
- if (initialKeyEvent.type() == PlatformEvent::KeyUp || initialKeyEvent.type() == PlatformEvent::Char)
- return !node->dispatchKeyEvent(initialKeyEvent);
+ if (initialKeyEvent.type() == PlatformEvent::Char) {
+ bool result = !node->dispatchKeyEvent(initialKeyEvent);
+ if (m_overrideNextKeyupEvent) {
+ m_returnValueForNextKeyupEvent |= result;
+ }
+ return result;
+ }
+
+ if (initialKeyEvent.type() == PlatformEvent::KeyUp) {
+ bool result = !node->dispatchKeyEvent(initialKeyEvent);
+ return overrideKeyupEvent ? returnValueForKeyupEvent : result;
+ }
PlatformKeyboardEvent keyDownEvent = initialKeyEvent;
if (keyDownEvent.type() != PlatformEvent::RawKeyDown)
@@ -3200,7 +3229,12 @@ bool EventHandler::keyEvent(const PlatformKeyboardEvent& initialKeyEvent)
node->dispatchEvent(keydown);
// If frame changed as a result of keydown dispatch, then return true to avoid sending a subsequent keypress message to the new frame.
bool changedFocusedFrame = m_frame->page() && m_frame != m_frame->page()->focusController().focusedOrMainFrame();
- return keydown->defaultHandled() || keydown->defaultPrevented() || changedFocusedFrame;
+ bool result = keydown->defaultHandled() || keydown->defaultPrevented() || changedFocusedFrame;
+ // We are returning a value that may be different from the return value of dispatchEvent().
+ // We should return the same value for the next keyup event.
+ m_overrideNextKeyupEvent = true;
+ m_returnValueForNextKeyupEvent = result;
+ return result;
}
node->dispatchEvent(keydown);
« no previous file with comments | « third_party/WebKit/Source/core/input/EventHandler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698