2009-12-07 Zhe Su <suzhe@chromium.org>
[WebKit-https.git] / WebKit / chromium / src / WebViewImpl.cpp
index dc87101fe8f9415f9fb4b62524bd07133addbc17..1612b6a4e330ddf8986a36993e4352da8750f2a1 100644 (file)
@@ -464,7 +464,7 @@ bool WebViewImpl::keyEvent(const WebKeyboardEvent& event)
     PlatformKeyboardEventBuilder evt(event);
 
     if (handler->keyEvent(evt)) {
-        if (WebInputEvent::RawKeyDown == event.type && !evt.isSystemKey())
+        if (WebInputEvent::RawKeyDown == event.type)
             m_suppressNextKeypressEvent = true;
         return true;
     }
@@ -529,31 +529,33 @@ bool WebViewImpl::charEvent(const WebKeyboardEvent& event)
     // handled by Webkit. A keyDown event is typically associated with a
     // keyPress(char) event and a keyUp event. We reset this flag here as it
     // only applies to the current keyPress event.
-    if (m_suppressNextKeypressEvent) {
-        m_suppressNextKeypressEvent = false;
-        return true;
-    }
+    bool suppress = m_suppressNextKeypressEvent;
+    m_suppressNextKeypressEvent = false;
 
     Frame* frame = focusedWebCoreFrame();
     if (!frame)
-        return false;
+        return suppress;
 
     EventHandler* handler = frame->eventHandler();
     if (!handler)
-        return keyEventDefault(event);
+        return suppress || keyEventDefault(event);
 
     PlatformKeyboardEventBuilder evt(event);
     if (!evt.isCharacterKey())
         return true;
 
+    // Accesskeys are triggered by char events and can't be suppressed.
+    if (handler->handleAccessKey(evt))
+        return true;
+
     // Safari 3.1 does not pass off windows system key messages (WM_SYSCHAR) to
     // the eventHandler::keyEvent. We mimic this behavior on all platforms since
     // for now we are converting other platform's key events to windows key
     // events.
     if (evt.isSystemKey())
-        return handler->handleAccessKey(evt);
+        return false;
 
-    if (!handler->keyEvent(evt))
+    if (!suppress && !handler->keyEvent(evt))
         return keyEventDefault(event);
 
     return true;