Fix InputEventTracker to track key events based on both VK- and USB-keycodes.

This CL also fixes InputEventTracker to cope with events with missing fields, switches the tracker unit-tests to concentrate on USB-based key events, and adds some tests of handling VK-based, VK&USB-based and invalid key events.

Previously the InputEventTracker required that all events have a VK-style keycode set, and used that to track the pressed keys.  When switching to USB-style events, clients may not transmit a VK-style keycode, or may send a dummy value, which would result in events being incorrectly tracked.

BUG=121696

Review URL: https://chromiumcodereview.appspot.com/9963117

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@130661 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/remoting/protocol/input_event_tracker.cc b/remoting/protocol/input_event_tracker.cc
index 130670b..9fac3b8b 100644
--- a/remoting/protocol/input_event_tracker.cc
+++ b/remoting/protocol/input_event_tracker.cc
@@ -10,8 +10,21 @@
 namespace remoting {
 namespace protocol {
 
+static bool PressedKeysLessThan(const KeyEvent& a, const KeyEvent& b) {
+  if ((!a.has_usb_keycode() && !b.has_usb_keycode()) ||
+      (a.usb_keycode() == b.usb_keycode())) {
+    if (a.has_keycode() && b.has_keycode())
+      return a.keycode() < b.keycode();
+    return b.has_keycode();
+  }
+  if (a.has_usb_keycode() && b.has_usb_keycode())
+    return a.usb_keycode() < b.usb_keycode();
+  return b.has_usb_keycode();
+}
+
 InputEventTracker::InputEventTracker(InputStub* input_stub)
     : input_stub_(input_stub),
+      pressed_keys_(&PressedKeysLessThan),
       mouse_pos_(SkIPoint::Make(0, 0)),
       mouse_button_state_(0) {
 }
@@ -20,12 +33,12 @@
 }
 
 void InputEventTracker::InjectKeyEvent(const KeyEvent& event) {
-  DCHECK(event.has_pressed());
-  DCHECK(event.has_keycode());
-  if (event.pressed()) {
-    pressed_keys_.insert(event.keycode());
-  } else {
-    pressed_keys_.erase(event.keycode());
+  if (event.has_pressed() && (event.has_keycode() || event.has_usb_keycode())) {
+    if (event.pressed()) {
+      pressed_keys_.insert(event);
+    } else {
+      pressed_keys_.erase(event);
+    }
   }
   input_stub_->InjectKeyEvent(event);
 }
@@ -49,10 +62,9 @@
 }
 
 void InputEventTracker::ReleaseAll() {
-  std::set<int>::iterator i;
+  PressedKeySet::iterator i;
   for (i = pressed_keys_.begin(); i != pressed_keys_.end(); ++i) {
-    KeyEvent event;
-    event.set_keycode(*i);
+    KeyEvent event = *i;
     event.set_pressed(false);
     input_stub_->InjectKeyEvent(event);
   }