Index: content/renderer/render_widget.cc |
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc |
index cd50991e3b785568574b54c74d85b9582145bc7e..136c7ec2e7944addaa1fbd9c41aca7020281cd44 100644 |
--- a/content/renderer/render_widget.cc |
+++ b/content/renderer/render_widget.cc |
@@ -91,6 +91,7 @@ RenderWidget::RenderWidget(WebKit::WebPopupType popup_type) |
can_compose_inline_(true), |
popup_type_(popup_type), |
pending_window_rect_count_(0), |
+ suppress_next_char_events_(false), |
is_accelerated_compositing_active_(false), |
animation_update_pending_(false), |
animation_task_posted_(false), |
@@ -445,6 +446,11 @@ void RenderWidget::OnHandleInputEvent(const IPC::Message& message) { |
const WebInputEvent* input_event = |
reinterpret_cast<const WebInputEvent*>(data); |
+ bool is_keyboard_shortcut = false; |
+ // is_keyboard_shortcut flag is only available for RawKeyDown events. |
+ if (input_event->type == WebInputEvent::RawKeyDown) |
+ message.ReadBool(&iter, &is_keyboard_shortcut); |
+ |
bool prevent_default = false; |
if (WebInputEvent::isMouseEventType(input_event->type)) { |
prevent_default = WillHandleMouseEvent( |
@@ -452,8 +458,17 @@ void RenderWidget::OnHandleInputEvent(const IPC::Message& message) { |
} |
bool processed = prevent_default; |
- if (!processed && webwidget_) |
- processed = webwidget_->handleInputEvent(*input_event); |
+ if (input_event->type != WebInputEvent::Char || !suppress_next_char_events_) { |
+ suppress_next_char_events_ = false; |
+ if (!processed && webwidget_) |
+ processed = webwidget_->handleInputEvent(*input_event); |
+ } |
+ |
+ // If this RawKeyDown event corresponds to a browser keyboard shortcut and |
+ // it's not processed by webkit, then we need to suppress the upcoming Char |
+ // events. |
+ if (!processed && is_keyboard_shortcut) |
+ suppress_next_char_events_ = true; |
IPC::Message* response = |
new ViewHostMsg_HandleInputEvent_ACK(routing_id_, input_event->type, |