13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file. 43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "remoting/client/plugin/normalizing_input_filter_cros.h" 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "remoting/proto/event.pb.h" 83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "remoting/protocol/protocol_mock_objects.h" 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using ::testing::InSequence; 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using remoting::protocol::InputStub; 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using remoting::protocol::KeyEvent; 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using remoting::protocol::MockInputStub; 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using remoting::protocol::MouseEvent; 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace remoting { 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace { 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const unsigned int kUsbLeftOsKey = 0x0700e3; 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const unsigned int kUsbRightOsKey = 0x0700e7; 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const unsigned int kUsbFunctionKey = 0x07003a; // F1 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const unsigned int kUsbExtendedKey = 0x070049; // Insert 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const unsigned int kUsbOtherKey = 0x07002b; // Tab 283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// A hardcoded value used to verify |lock_states| is preserved. 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)static const uint32 kTestLockStates = protocol::KeyEvent::LOCK_STATES_NUMLOCK; 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)MATCHER_P2(EqualsKeyEvent, usb_keycode, pressed, "") { 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return arg.usb_keycode() == static_cast<uint32>(usb_keycode) && 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) arg.pressed() == pressed && 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) arg.lock_states() == kTestLockStates; 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)KeyEvent MakeKeyEvent(uint32 keycode, bool pressed) { 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) KeyEvent event; 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) event.set_usb_keycode(keycode); 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) event.set_pressed(pressed); 423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) event.set_lock_states(kTestLockStates); 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return event; 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void PressAndReleaseKey(InputStub* input_stub, uint32 keycode) { 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) input_stub->InjectKeyEvent(MakeKeyEvent(keycode, true)); 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) input_stub->InjectKeyEvent(MakeKeyEvent(keycode, false)); 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)MATCHER_P2(EqualsMouseMoveEvent, x, y, "") { 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return arg.x() == x && arg.y() == y; 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)static MouseEvent MakeMouseMoveEvent(int x, int y) { 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MouseEvent event; 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) event.set_x(x); 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) event.set_y(y); 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return event; 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Test OSKey press/release. 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(NormalizingInputFilterCrosTest, PressReleaseOsKey) { 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MockInputStub stub; 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<protocol::InputFilter> processor( 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new NormalizingInputFilterCros(&stub)); 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) InSequence s; 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbLeftOsKey, true))); 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbLeftOsKey, false))); 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbRightOsKey, true))); 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbRightOsKey, false))); 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Inject press & release events for left & right OSKeys. 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PressAndReleaseKey(processor.get(), kUsbLeftOsKey); 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PressAndReleaseKey(processor.get(), kUsbRightOsKey); 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Test OSKey key repeat switches it to "modifying" mode. 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(NormalizingInputFilterCrosTest, OSKeyRepeats) { 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MockInputStub stub; 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<protocol::InputFilter> processor( 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new NormalizingInputFilterCros(&stub)); 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) InSequence s; 933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbLeftOsKey, true))); 953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbLeftOsKey, true))); 963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbLeftOsKey, true))); 973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Inject a press and repeats for the left OSKey, but don't release it, and 1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // verify that the repeats result in press events. 1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) processor->InjectKeyEvent(MakeKeyEvent(kUsbLeftOsKey, true)); 1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) processor->InjectKeyEvent(MakeKeyEvent(kUsbLeftOsKey, true)); 1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) processor->InjectKeyEvent(MakeKeyEvent(kUsbLeftOsKey, true)); 1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Test OSKey press followed by function key press and release results in 1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// just the function key events. 1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(NormalizingInputFilterCrosTest, FunctionKey) { 1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MockInputStub stub; 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<protocol::InputFilter> processor( 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new NormalizingInputFilterCros(&stub)); 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) InSequence s; 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbFunctionKey, true))); 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbFunctionKey, false))); 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Hold the left OSKey while pressing & releasing the function key. 1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) processor->InjectKeyEvent(MakeKeyEvent(kUsbLeftOsKey, true)); 1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PressAndReleaseKey(processor.get(), kUsbFunctionKey); 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) processor->InjectKeyEvent(MakeKeyEvent(kUsbLeftOsKey, false)); 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Test OSKey press followed by extended key press and release results in 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// just the function key events. 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(NormalizingInputFilterCrosTest, ExtendedKey) { 1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MockInputStub stub; 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<protocol::InputFilter> processor( 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new NormalizingInputFilterCros(&stub)); 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) InSequence s; 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbExtendedKey, true))); 1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbExtendedKey, false))); 1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Hold the left OSKey while pressing & releasing the function key. 1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) processor->InjectKeyEvent(MakeKeyEvent(kUsbLeftOsKey, true)); 1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PressAndReleaseKey(processor.get(), kUsbExtendedKey); 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) processor->InjectKeyEvent(MakeKeyEvent(kUsbLeftOsKey, false)); 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Test OSKey press followed by non-function, non-extended key press and release 1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// results in normal-looking sequence. 1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(NormalizingInputFilterCrosTest, OtherKey) { 1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MockInputStub stub; 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<protocol::InputFilter> processor( 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new NormalizingInputFilterCros(&stub)); 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) InSequence s; 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbLeftOsKey, true))); 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbOtherKey, true))); 1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbOtherKey, false))); 1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbLeftOsKey, false))); 1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Hold the left OSKey while pressing & releasing the function key. 1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) processor->InjectKeyEvent(MakeKeyEvent(kUsbLeftOsKey, true)); 1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PressAndReleaseKey(processor.get(), kUsbOtherKey); 1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) processor->InjectKeyEvent(MakeKeyEvent(kUsbLeftOsKey, false)); 1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Test OSKey press followed by extended key press, then normal key press 1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// results in OSKey switching to modifying mode for the normal key. 1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(NormalizingInputFilterCrosTest, ExtendedThenOtherKey) { 1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MockInputStub stub; 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<protocol::InputFilter> processor( 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new NormalizingInputFilterCros(&stub)); 1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) InSequence s; 1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbExtendedKey, true))); 1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbExtendedKey, false))); 1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbLeftOsKey, true))); 1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbOtherKey, true))); 1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbOtherKey, false))); 1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbLeftOsKey, false))); 1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Hold the left OSKey while pressing & releasing the function key. 1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) processor->InjectKeyEvent(MakeKeyEvent(kUsbLeftOsKey, true)); 1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PressAndReleaseKey(processor.get(), kUsbExtendedKey); 1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PressAndReleaseKey(processor.get(), kUsbOtherKey); 1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) processor->InjectKeyEvent(MakeKeyEvent(kUsbLeftOsKey, false)); 1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Test OSKey press followed by mouse event puts the OSKey into modifying mode. 1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(NormalizingInputFilterCrosTest, MouseEvent) { 1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MockInputStub stub; 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<protocol::InputFilter> processor( 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new NormalizingInputFilterCros(&stub)); 1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) InSequence s; 2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbLeftOsKey, true))); 2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectMouseEvent(EqualsMouseMoveEvent(0, 0))); 2043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(stub, InjectKeyEvent(EqualsKeyEvent(kUsbLeftOsKey, false))); 2053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Hold the left OSKey while pressing & releasing the function key. 2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) processor->InjectKeyEvent(MakeKeyEvent(kUsbLeftOsKey, true)); 2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) processor->InjectMouseEvent(MakeMouseMoveEvent(0, 0)); 2103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) processor->InjectKeyEvent(MakeKeyEvent(kUsbLeftOsKey, false)); 2113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace remoting 214