diff options
author | wez@chromium.org <wez@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-04 17:26:37 +0000 |
---|---|---|
committer | wez@chromium.org <wez@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-04 17:26:37 +0000 |
commit | fa8c7292d70c39c154a3957835d01190c82fdc7c (patch) | |
tree | 512d95d2ec9066af5c412a6fb01c30ee1602d871 /remoting/protocol/input_event_tracker.cc | |
parent | 360ba059f7200d138c19bcd6a0593b1e45d44d31 (diff) | |
download | chromium_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.cc | 30 |
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); } |