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(); |
+ } |
} |
} |