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