summaryrefslogtreecommitdiffstats
path: root/remoting/protocol/input_event_tracker.cc
diff options
context:
space:
mode:
authorwez@chromium.org <wez@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-04 17:26:37 +0000
committerwez@chromium.org <wez@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-04 17:26:37 +0000
commitfa8c7292d70c39c154a3957835d01190c82fdc7c (patch)
tree512d95d2ec9066af5c412a6fb01c30ee1602d871 /remoting/protocol/input_event_tracker.cc
parent360ba059f7200d138c19bcd6a0593b1e45d44d31 (diff)
downloadchromium_src-fa8c7292d70c39c154a3957835d01190c82fdc7c.zip
chromium_src-fa8c7292d70c39c154a3957835d01190c82fdc7c.tar.gz
chromium_src-fa8c7292d70c39c154a3957835d01190c82fdc7c.tar.bz2
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
Diffstat (limited to 'remoting/protocol/input_event_tracker.cc')
-rw-r--r--remoting/protocol/input_event_tracker.cc30
1 files changed, 21 insertions, 9 deletions
diff --git a/remoting/protocol/input_event_tracker.cc b/remoting/protocol/input_event_tracker.cc
index 130670b..9fac3b8 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 @@ InputEventTracker::~InputEventTracker() {
}
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::InjectMouseEvent(const MouseEvent& event) {
}
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);
}