Chromium Code Reviews| Index: chrome/browser/renderer_host/render_widget_host.cc |
| =================================================================== |
| --- chrome/browser/renderer_host/render_widget_host.cc (revision 10502) |
| +++ chrome/browser/renderer_host/render_widget_host.cc (working copy) |
| @@ -5,6 +5,7 @@ |
| #include "chrome/browser/renderer_host/render_widget_host.h" |
| #include "base/gfx/native_widget_types.h" |
| +#include "base/histogram.h" |
| #include "base/message_loop.h" |
| #include "base/keyboard_codes.h" |
| #include "chrome/browser/renderer_host/backing_store.h" |
| @@ -305,6 +306,16 @@ |
| if (!process_->channel()) |
| return; |
| + if (input_event.type == WebInputEvent::KEY_DOWN || |
|
darin (slow to review)
2009/02/27 00:15:56
i think we may also need RAW_KEY_DOWN here, right?
Avi (use Gerrit)
2009/02/27 15:12:47
RAW_KEY_DOWN does not yet exist. It will once I na
|
| + input_event.type == WebInputEvent::KEY_UP || |
| + input_event.type == WebInputEvent::CHAR) { |
| + // Put all WebKeyboardEvent objects in a queue since we can't trust the |
| + // renderer and we need to give something to the UnhandledInputEvent |
| + // handler. |
| + key_queue_.push(static_cast<const WebKeyboardEvent&>(input_event)); |
| + HISTOGRAM_COUNTS_100("Renderer.KeyboardQueueSize", key_queue_.size()); |
| + } |
| + |
| IPC::Message* message = new ViewMsg_HandleInputEvent(routing_id_); |
| message->WriteData( |
| reinterpret_cast<const char*>(&input_event), event_size); |
| @@ -554,12 +565,26 @@ |
| } |
| } |
| - const char* data = NULL; |
| - int length = 0; |
| - if (message.ReadData(&iter, &data, &length)) { |
| - const WebInputEvent* input_event = |
| - reinterpret_cast<const WebInputEvent*>(data); |
| - UnhandledInputEvent(*input_event); |
| + if (type == WebInputEvent::KEY_DOWN || |
| + type == WebInputEvent::KEY_UP || |
| + type == WebInputEvent::CHAR) { |
| + if (key_queue_.size() == 0) { |
| + LOG(ERROR) << "Got a KeyEvent back from the renderer but we " |
| + << "don't seem to have sent it to the renderer!"; |
| + } else if (key_queue_.front().type != type) { |
| + LOG(ERROR) << "We seem to have a different key type sent from " |
| + << "the renderer. Ignoring event."; |
| + } else { |
| + bool processed = false; |
| + r = message.ReadBool(&iter, &processed); |
| + DCHECK(r); |
| + |
| + if (!processed) { |
| + UnhandledKeyboardEvent(key_queue_.front()); |
| + } |
| + |
| + key_queue_.pop(); |
| + } |
| } |
| } |