| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/ash/event_rewriter.h" | 5 #include "chrome/browser/ui/ash/event_rewriter.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/prefs/public/pref_member.h" | 9 #include "base/prefs/public/pref_member.h" |
| 10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
| (...skipping 1790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1801 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, | 1801 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, |
| 1802 ui::VKEY_HOME, keycode_home_, | 1802 ui::VKEY_HOME, keycode_home_, |
| 1803 0, 0, }, | 1803 0, 0, }, |
| 1804 // Ctrl+Alt+Down -> End | 1804 // Ctrl+Alt+Down -> End |
| 1805 { ui::VKEY_DOWN, keycode_down_, | 1805 { ui::VKEY_DOWN, keycode_down_, |
| 1806 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, | 1806 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, |
| 1807 ui::VKEY_END, keycode_end_, | 1807 ui::VKEY_END, keycode_end_, |
| 1808 0, 0, }, | 1808 0, 0, }, |
| 1809 // Period -> Period | 1809 // Period -> Period |
| 1810 { ui::VKEY_OEM_PERIOD, keycode_period_, 0, 0, | 1810 { ui::VKEY_OEM_PERIOD, keycode_period_, 0, 0, |
| 1811 ui::VKEY_OEM_PERIOD, keycode_period_, 0, 0 } | 1811 ui::VKEY_OEM_PERIOD, keycode_period_, 0, 0 }, |
| 1812 }; | |
| 1813 | |
| 1814 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(chromeos_tests); ++i) { | |
| 1815 EXPECT_EQ(GetExpectedResultAsString(chromeos_tests[i].output, | |
| 1816 chromeos_tests[i].output_mods, | |
| 1817 ui::ET_KEY_PRESSED, | |
| 1818 chromeos_tests[i].output_native, | |
| 1819 chromeos_tests[i].output_native_mods, | |
| 1820 KeyPress), | |
| 1821 GetRewrittenEventAsString(&rewriter, | |
| 1822 chromeos_tests[i].input, | |
| 1823 chromeos_tests[i].input_mods, | |
| 1824 ui::ET_KEY_PRESSED, | |
| 1825 chromeos_tests[i].input_native, | |
| 1826 chromeos_tests[i].input_native_mods)); | |
| 1827 | |
| 1828 // Search key as a modifier does not change the outcome. | |
| 1829 EXPECT_EQ(GetExpectedResultAsString(chromeos_tests[i].output, | |
| 1830 chromeos_tests[i].output_mods, | |
| 1831 ui::ET_KEY_PRESSED, | |
| 1832 chromeos_tests[i].output_native, | |
| 1833 Mod4Mask | | |
| 1834 chromeos_tests[i].output_native_mods, | |
| 1835 KeyPress), | |
| 1836 GetRewrittenEventAsString(&rewriter, | |
| 1837 chromeos_tests[i].input, | |
| 1838 chromeos_tests[i].input_mods, | |
| 1839 ui::ET_KEY_PRESSED, | |
| 1840 chromeos_tests[i].input_native, | |
| 1841 Mod4Mask | | |
| 1842 chromeos_tests[i].input_native_mods)); | |
| 1843 } | |
| 1844 | |
| 1845 // Make Search key act like a Function key for accessing extended key | |
| 1846 // bindings. | |
| 1847 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | |
| 1848 switches::kEnableChromebookFunctionKey, ""); | |
| 1849 | |
| 1850 struct { | |
| 1851 ui::KeyboardCode input; | |
| 1852 KeyCode input_native; | |
| 1853 unsigned int input_mods; | |
| 1854 unsigned int input_native_mods; | |
| 1855 ui::KeyboardCode output; | |
| 1856 KeyCode output_native; | |
| 1857 unsigned int output_mods; | |
| 1858 unsigned int output_native_mods; | |
| 1859 } search_tests[] = { | |
| 1860 { ui::VKEY_BACK, keycode_backspace_, | |
| 1861 ui::EF_ALT_DOWN, Mod1Mask, | |
| 1862 ui::VKEY_BACK, keycode_backspace_, | |
| 1863 ui::EF_ALT_DOWN, Mod1Mask, }, | |
| 1864 { ui::VKEY_UP, keycode_up_, | |
| 1865 ui::EF_ALT_DOWN, Mod1Mask, | |
| 1866 ui::VKEY_UP, keycode_up_, | |
| 1867 ui::EF_ALT_DOWN, Mod1Mask, }, | |
| 1868 { ui::VKEY_UP, keycode_up_, | |
| 1869 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, | |
| 1870 ui::VKEY_UP, keycode_up_, | |
| 1871 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, }, | |
| 1872 { ui::VKEY_DOWN, keycode_down_, | |
| 1873 ui::EF_ALT_DOWN, Mod1Mask, | |
| 1874 ui::VKEY_DOWN, keycode_down_, | |
| 1875 ui::EF_ALT_DOWN, Mod1Mask, }, | |
| 1876 { ui::VKEY_LEFT, keycode_left_, 0, 0, | |
| 1877 ui::VKEY_LEFT, keycode_left_, 0, 0 }, | |
| 1878 { ui::VKEY_RIGHT, keycode_right_, 0, 0, | |
| 1879 ui::VKEY_RIGHT, keycode_right_, 0, 0 }, | |
| 1880 | 1812 |
| 1881 // Search+Backspace -> Delete | 1813 // Search+Backspace -> Delete |
| 1882 { ui::VKEY_BACK, keycode_backspace_, | 1814 { ui::VKEY_BACK, keycode_backspace_, |
| 1883 0, Mod4Mask, | 1815 0, Mod4Mask, |
| 1884 ui::VKEY_DELETE, keycode_delete_, | 1816 ui::VKEY_DELETE, keycode_delete_, |
| 1885 0, 0, }, | 1817 0, 0, }, |
| 1886 // Alt+Search+Backspace -> Alt+Delete | 1818 // Alt+Search+Backspace -> Alt+Delete |
| 1887 { ui::VKEY_BACK, keycode_backspace_, | 1819 { ui::VKEY_BACK, keycode_backspace_, |
| 1888 ui::EF_ALT_DOWN, Mod4Mask | Mod1Mask, | 1820 ui::EF_ALT_DOWN, Mod4Mask | Mod1Mask, |
| 1889 ui::VKEY_DELETE, keycode_delete_, | 1821 ui::VKEY_DELETE, keycode_delete_, |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1921 // Search+Period -> Insert | 1853 // Search+Period -> Insert |
| 1922 { ui::VKEY_OEM_PERIOD, keycode_period_, 0, Mod4Mask, | 1854 { ui::VKEY_OEM_PERIOD, keycode_period_, 0, Mod4Mask, |
| 1923 ui::VKEY_INSERT, keycode_insert_, 0, 0 }, | 1855 ui::VKEY_INSERT, keycode_insert_, 0, 0 }, |
| 1924 // Control+Search+Period -> Control+Insert | 1856 // Control+Search+Period -> Control+Insert |
| 1925 { ui::VKEY_OEM_PERIOD, keycode_period_, | 1857 { ui::VKEY_OEM_PERIOD, keycode_period_, |
| 1926 ui::EF_CONTROL_DOWN, Mod4Mask | ControlMask, | 1858 ui::EF_CONTROL_DOWN, Mod4Mask | ControlMask, |
| 1927 ui::VKEY_INSERT, keycode_insert_, | 1859 ui::VKEY_INSERT, keycode_insert_, |
| 1928 ui::EF_CONTROL_DOWN, ControlMask } | 1860 ui::EF_CONTROL_DOWN, ControlMask } |
| 1929 }; | 1861 }; |
| 1930 | 1862 |
| 1863 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(chromeos_tests); ++i) { |
| 1864 EXPECT_EQ(GetExpectedResultAsString(chromeos_tests[i].output, |
| 1865 chromeos_tests[i].output_mods, |
| 1866 ui::ET_KEY_PRESSED, |
| 1867 chromeos_tests[i].output_native, |
| 1868 chromeos_tests[i].output_native_mods, |
| 1869 KeyPress), |
| 1870 GetRewrittenEventAsString(&rewriter, |
| 1871 chromeos_tests[i].input, |
| 1872 chromeos_tests[i].input_mods, |
| 1873 ui::ET_KEY_PRESSED, |
| 1874 chromeos_tests[i].input_native, |
| 1875 chromeos_tests[i].input_native_mods)); |
| 1876 } |
| 1877 |
| 1878 // Disable non-Search key shortcuts. |
| 1879 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 1880 switches::kDisableNonSearchExtendedKeyShortcuts, ""); |
| 1881 |
| 1882 struct { |
| 1883 ui::KeyboardCode input; |
| 1884 KeyCode input_native; |
| 1885 unsigned int input_mods; |
| 1886 unsigned int input_native_mods; |
| 1887 ui::KeyboardCode output; |
| 1888 KeyCode output_native; |
| 1889 unsigned int output_mods; |
| 1890 unsigned int output_native_mods; |
| 1891 } search_tests[] = { |
| 1892 { ui::VKEY_BACK, keycode_backspace_, |
| 1893 ui::EF_ALT_DOWN, Mod1Mask, |
| 1894 ui::VKEY_BACK, keycode_backspace_, |
| 1895 ui::EF_ALT_DOWN, Mod1Mask, }, |
| 1896 { ui::VKEY_UP, keycode_up_, |
| 1897 ui::EF_ALT_DOWN, Mod1Mask, |
| 1898 ui::VKEY_UP, keycode_up_, |
| 1899 ui::EF_ALT_DOWN, Mod1Mask, }, |
| 1900 { ui::VKEY_UP, keycode_up_, |
| 1901 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, |
| 1902 ui::VKEY_UP, keycode_up_, |
| 1903 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, }, |
| 1904 { ui::VKEY_DOWN, keycode_down_, |
| 1905 ui::EF_ALT_DOWN, Mod1Mask, |
| 1906 ui::VKEY_DOWN, keycode_down_, |
| 1907 ui::EF_ALT_DOWN, Mod1Mask, }, |
| 1908 { ui::VKEY_LEFT, keycode_left_, 0, 0, |
| 1909 ui::VKEY_LEFT, keycode_left_, 0, 0 }, |
| 1910 { ui::VKEY_RIGHT, keycode_right_, 0, 0, |
| 1911 ui::VKEY_RIGHT, keycode_right_, 0, 0 }, |
| 1912 }; |
| 1913 |
| 1931 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(search_tests); ++i) { | 1914 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(search_tests); ++i) { |
| 1932 EXPECT_EQ(GetExpectedResultAsString(search_tests[i].output, | 1915 EXPECT_EQ(GetExpectedResultAsString(search_tests[i].output, |
| 1933 search_tests[i].output_mods, | 1916 search_tests[i].output_mods, |
| 1934 ui::ET_KEY_PRESSED, | 1917 ui::ET_KEY_PRESSED, |
| 1935 search_tests[i].output_native, | 1918 search_tests[i].output_native, |
| 1936 search_tests[i].output_native_mods, | 1919 search_tests[i].output_native_mods, |
| 1937 KeyPress), | 1920 KeyPress), |
| 1938 GetRewrittenEventAsString(&rewriter, | 1921 GetRewrittenEventAsString(&rewriter, |
| 1939 search_tests[i].input, | 1922 search_tests[i].input, |
| 1940 search_tests[i].input_mods, | 1923 search_tests[i].input_mods, |
| 1941 ui::ET_KEY_PRESSED, | 1924 ui::ET_KEY_PRESSED, |
| 1942 search_tests[i].input_native, | 1925 search_tests[i].input_native, |
| 1943 search_tests[i].input_native_mods)); | 1926 search_tests[i].input_native_mods)); |
| 1944 } | 1927 } |
| 1945 | 1928 |
| 1946 *CommandLine::ForCurrentProcess() = original_cl; | 1929 *CommandLine::ForCurrentProcess() = original_cl; |
| 1947 } | 1930 } |
| 1948 | 1931 |
| 1949 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { | 1932 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { |
| 1950 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); | 1933 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); |
| 1951 TestingPrefService prefs; | 1934 TestingPrefService prefs; |
| 1952 chromeos::Preferences::RegisterUserPrefs(&prefs); | 1935 chromeos::Preferences::RegisterUserPrefs(&prefs); |
| 1953 EventRewriter rewriter; | 1936 EventRewriter rewriter; |
| 1954 rewriter.set_pref_service_for_testing(&prefs); | 1937 rewriter.set_pref_service_for_testing(&prefs); |
| 1955 | 1938 |
| 1956 struct { | 1939 struct { |
| 1957 ui::KeyboardCode input; | 1940 ui::KeyboardCode input; |
| 1958 KeyCode input_native; | 1941 KeyCode input_native; |
| 1942 unsigned int input_native_mods; |
| 1943 unsigned int input_mods; |
| 1959 ui::KeyboardCode output; | 1944 ui::KeyboardCode output; |
| 1960 KeyCode output_native; | 1945 KeyCode output_native; |
| 1961 } chromeos_tests[] = { | 1946 unsigned int output_native_mods; |
| 1962 { // F1 -> Back | 1947 unsigned int output_mods; |
| 1963 ui::VKEY_F1, keycode_f1_, | 1948 } tests[] = { |
| 1964 ui::VKEY_BROWSER_BACK, keycode_browser_back_ | 1949 // F1 -> Back |
| 1965 }, | 1950 { ui::VKEY_F1, keycode_f1_, 0, 0, |
| 1966 { // F2 -> Forward | 1951 ui::VKEY_BROWSER_BACK, keycode_browser_back_, 0, 0 }, |
| 1967 ui::VKEY_F2, keycode_f2_, | 1952 { ui::VKEY_F1, keycode_f1_, ControlMask, ui::EF_CONTROL_DOWN, |
| 1968 ui::VKEY_BROWSER_FORWARD, keycode_browser_forward_ | 1953 ui::VKEY_BROWSER_BACK, keycode_browser_back_, |
| 1969 }, | 1954 ControlMask, ui::EF_CONTROL_DOWN }, |
| 1970 { // F3 -> Refresh | 1955 { ui::VKEY_F1, keycode_f1_, Mod1Mask, ui::EF_ALT_DOWN, |
| 1971 ui::VKEY_F3, keycode_f3_, | 1956 ui::VKEY_BROWSER_BACK, keycode_browser_back_, |
| 1972 ui::VKEY_BROWSER_REFRESH, keycode_browser_refresh_ | 1957 Mod1Mask, ui::EF_ALT_DOWN }, |
| 1973 }, | 1958 // F2 -> Forward |
| 1974 { // F4 -> Launch App 2 | 1959 { ui::VKEY_F2, keycode_f2_, 0, 0, |
| 1975 ui::VKEY_F4, keycode_f4_, | 1960 ui::VKEY_BROWSER_FORWARD, keycode_browser_forward_, 0, 0 }, |
| 1976 ui::VKEY_MEDIA_LAUNCH_APP2, keycode_media_launch_app2_ | 1961 { ui::VKEY_F2, keycode_f2_, ControlMask, ui::EF_CONTROL_DOWN, |
| 1977 }, | 1962 ui::VKEY_BROWSER_FORWARD, keycode_browser_forward_, |
| 1978 { // F5 -> Launch App 1 | 1963 ControlMask, ui::EF_CONTROL_DOWN }, |
| 1979 ui::VKEY_F5, keycode_f5_, | 1964 { ui::VKEY_F2, keycode_f2_, Mod1Mask, ui::EF_ALT_DOWN, |
| 1980 ui::VKEY_MEDIA_LAUNCH_APP1, keycode_media_launch_app1_ | 1965 ui::VKEY_BROWSER_FORWARD, keycode_browser_forward_, |
| 1981 }, | 1966 Mod1Mask, ui::EF_ALT_DOWN }, |
| 1982 { // F6 -> Brightness down | 1967 // F3 -> Refresh |
| 1983 ui::VKEY_F6, keycode_f6_, | 1968 { ui::VKEY_F3, keycode_f3_, 0, 0, |
| 1984 ui::VKEY_BRIGHTNESS_DOWN, keycode_brightness_down_ | 1969 ui::VKEY_BROWSER_REFRESH, keycode_browser_refresh_, 0, 0 }, |
| 1985 }, | 1970 { ui::VKEY_F3, keycode_f3_, ControlMask, ui::EF_CONTROL_DOWN, |
| 1986 { // F7 -> Brightness up | 1971 ui::VKEY_BROWSER_REFRESH, keycode_browser_refresh_, |
| 1987 ui::VKEY_F7, keycode_f7_, | 1972 ControlMask, ui::EF_CONTROL_DOWN }, |
| 1988 ui::VKEY_BRIGHTNESS_UP, keycode_brightness_up_ | 1973 { ui::VKEY_F3, keycode_f3_, Mod1Mask, ui::EF_ALT_DOWN, |
| 1989 }, | 1974 ui::VKEY_BROWSER_REFRESH, keycode_browser_refresh_, |
| 1990 { // F8 -> Volume Mute | 1975 Mod1Mask, ui::EF_ALT_DOWN }, |
| 1991 ui::VKEY_F8, keycode_f8_, | 1976 // F4 -> Launch App 2 |
| 1992 ui::VKEY_VOLUME_MUTE, keycode_volume_mute_ | 1977 { ui::VKEY_F4, keycode_f4_, 0, 0, |
| 1993 }, | 1978 ui::VKEY_MEDIA_LAUNCH_APP2, keycode_media_launch_app2_, 0, 0 }, |
| 1994 { // F9 -> Volume Down | 1979 { ui::VKEY_F4, keycode_f4_, ControlMask, ui::EF_CONTROL_DOWN, |
| 1995 ui::VKEY_F9, keycode_f9_, | 1980 ui::VKEY_MEDIA_LAUNCH_APP2, keycode_media_launch_app2_, |
| 1996 ui::VKEY_VOLUME_DOWN, keycode_volume_down_ | 1981 ControlMask, ui::EF_CONTROL_DOWN }, |
| 1997 }, | 1982 { ui::VKEY_F4, keycode_f4_, Mod1Mask, ui::EF_ALT_DOWN, |
| 1998 { // F10 -> Volume Up | 1983 ui::VKEY_MEDIA_LAUNCH_APP2, keycode_media_launch_app2_, |
| 1999 ui::VKEY_F10, keycode_f10_, | 1984 Mod1Mask, ui::EF_ALT_DOWN }, |
| 2000 ui::VKEY_VOLUME_UP, keycode_volume_up_ | 1985 // F5 -> Launch App 1 |
| 2001 }, | 1986 { ui::VKEY_F5, keycode_f5_, 0, 0, |
| 2002 { // F11 -> F11 | 1987 ui::VKEY_MEDIA_LAUNCH_APP1, keycode_media_launch_app1_, 0, 0 }, |
| 2003 ui::VKEY_F11, keycode_f11_, | 1988 { ui::VKEY_F5, keycode_f5_, ControlMask, ui::EF_CONTROL_DOWN, |
| 2004 ui::VKEY_F11, keycode_f11_ | 1989 ui::VKEY_MEDIA_LAUNCH_APP1, keycode_media_launch_app1_, |
| 2005 }, | 1990 ControlMask, ui::EF_CONTROL_DOWN }, |
| 2006 { // F12 -> F12 | 1991 { ui::VKEY_F5, keycode_f5_, Mod1Mask, ui::EF_ALT_DOWN, |
| 2007 ui::VKEY_F12, keycode_f12_, | 1992 ui::VKEY_MEDIA_LAUNCH_APP1, keycode_media_launch_app1_, |
| 2008 ui::VKEY_F12, keycode_f12_, | 1993 Mod1Mask, ui::EF_ALT_DOWN }, |
| 2009 }, | 1994 // F6 -> Brightness down |
| 2010 // The number row should not be rewritten. | 1995 { ui::VKEY_F6, keycode_f6_, 0, 0, |
| 2011 { ui::VKEY_1, keycode_1_, ui::VKEY_1, keycode_1_, }, | 1996 ui::VKEY_BRIGHTNESS_DOWN, keycode_brightness_down_, 0, 0 }, |
| 2012 { ui::VKEY_2, keycode_2_, ui::VKEY_2, keycode_2_, }, | 1997 { ui::VKEY_F6, keycode_f6_, ControlMask, ui::EF_CONTROL_DOWN, |
| 2013 { ui::VKEY_3, keycode_3_, ui::VKEY_3, keycode_3_, }, | 1998 ui::VKEY_BRIGHTNESS_DOWN, keycode_brightness_down_, |
| 2014 { ui::VKEY_4, keycode_4_, ui::VKEY_4, keycode_4_, }, | 1999 ControlMask, ui::EF_CONTROL_DOWN }, |
| 2015 { ui::VKEY_5, keycode_5_, ui::VKEY_5, keycode_5_, }, | 2000 { ui::VKEY_F6, keycode_f6_, Mod1Mask, ui::EF_ALT_DOWN, |
| 2016 { ui::VKEY_6, keycode_6_, ui::VKEY_6, keycode_6_, }, | 2001 ui::VKEY_BRIGHTNESS_DOWN, keycode_brightness_down_, |
| 2017 { ui::VKEY_7, keycode_7_, ui::VKEY_7, keycode_7_, }, | 2002 Mod1Mask, ui::EF_ALT_DOWN }, |
| 2018 { ui::VKEY_8, keycode_8_, ui::VKEY_8, keycode_8_, }, | 2003 // F7 -> Brightness up |
| 2019 { ui::VKEY_9, keycode_9_, ui::VKEY_9, keycode_9_, }, | 2004 { ui::VKEY_F7, keycode_f7_, 0, 0, |
| 2020 { ui::VKEY_0, keycode_0_, ui::VKEY_0, keycode_0_, }, | 2005 ui::VKEY_BRIGHTNESS_UP, keycode_brightness_up_, 0, 0 }, |
| 2021 { ui::VKEY_OEM_MINUS, keycode_minus_, ui::VKEY_OEM_MINUS, keycode_minus_, }, | 2006 { ui::VKEY_F7, keycode_f7_, ControlMask, ui::EF_CONTROL_DOWN, |
| 2022 { ui::VKEY_OEM_PLUS, keycode_equal_, ui::VKEY_OEM_PLUS, keycode_equal_, }, | 2007 ui::VKEY_BRIGHTNESS_UP, keycode_brightness_up_, |
| 2008 ControlMask, ui::EF_CONTROL_DOWN }, |
| 2009 { ui::VKEY_F7, keycode_f7_, Mod1Mask, ui::EF_ALT_DOWN, |
| 2010 ui::VKEY_BRIGHTNESS_UP, keycode_brightness_up_, |
| 2011 Mod1Mask, ui::EF_ALT_DOWN }, |
| 2012 // F8 -> Volume Mute |
| 2013 { ui::VKEY_F8, keycode_f8_, 0, 0, |
| 2014 ui::VKEY_VOLUME_MUTE, keycode_volume_mute_, 0, 0 }, |
| 2015 { ui::VKEY_F8, keycode_f8_, ControlMask, ui::EF_CONTROL_DOWN, |
| 2016 ui::VKEY_VOLUME_MUTE, keycode_volume_mute_, |
| 2017 ControlMask, ui::EF_CONTROL_DOWN }, |
| 2018 { ui::VKEY_F8, keycode_f8_, Mod1Mask, ui::EF_ALT_DOWN, |
| 2019 ui::VKEY_VOLUME_MUTE, keycode_volume_mute_, |
| 2020 Mod1Mask, ui::EF_ALT_DOWN }, |
| 2021 // F9 -> Volume Down |
| 2022 { ui::VKEY_F9, keycode_f9_, 0, 0, |
| 2023 ui::VKEY_VOLUME_DOWN, keycode_volume_down_, 0, 0 }, |
| 2024 { ui::VKEY_F9, keycode_f9_, ControlMask, ui::EF_CONTROL_DOWN, |
| 2025 ui::VKEY_VOLUME_DOWN, keycode_volume_down_, |
| 2026 ControlMask, ui::EF_CONTROL_DOWN }, |
| 2027 { ui::VKEY_F9, keycode_f9_, Mod1Mask, ui::EF_ALT_DOWN, |
| 2028 ui::VKEY_VOLUME_DOWN, keycode_volume_down_, |
| 2029 Mod1Mask, ui::EF_ALT_DOWN }, |
| 2030 // F10 -> Volume Up |
| 2031 { ui::VKEY_F10, keycode_f10_, 0, 0, |
| 2032 ui::VKEY_VOLUME_UP, keycode_volume_up_, 0, 0 }, |
| 2033 { ui::VKEY_F10, keycode_f10_, ControlMask, ui::EF_CONTROL_DOWN, |
| 2034 ui::VKEY_VOLUME_UP, keycode_volume_up_, |
| 2035 ControlMask, ui::EF_CONTROL_DOWN }, |
| 2036 { ui::VKEY_F10, keycode_f10_, Mod1Mask, ui::EF_ALT_DOWN, |
| 2037 ui::VKEY_VOLUME_UP, keycode_volume_up_, |
| 2038 Mod1Mask, ui::EF_ALT_DOWN }, |
| 2039 // F11 -> F11 |
| 2040 { ui::VKEY_F11, keycode_f11_, 0, 0, |
| 2041 ui::VKEY_F11, keycode_f11_, 0, 0 }, |
| 2042 { ui::VKEY_F11, keycode_f11_, ControlMask, ui::EF_CONTROL_DOWN, |
| 2043 ui::VKEY_F11, keycode_f11_, ControlMask, ui::EF_CONTROL_DOWN }, |
| 2044 { ui::VKEY_F11, keycode_f11_, Mod1Mask, ui::EF_ALT_DOWN, |
| 2045 ui::VKEY_F11, keycode_f11_, Mod1Mask, ui::EF_ALT_DOWN }, |
| 2046 // F12 -> F12 |
| 2047 { ui::VKEY_F12, keycode_f12_, 0, 0, |
| 2048 ui::VKEY_F12, keycode_f12_, 0, 0 }, |
| 2049 { ui::VKEY_F12, keycode_f12_, ControlMask, ui::EF_CONTROL_DOWN, |
| 2050 ui::VKEY_F12, keycode_f12_, ControlMask, ui::EF_CONTROL_DOWN }, |
| 2051 { ui::VKEY_F12, keycode_f12_, Mod1Mask, ui::EF_ALT_DOWN, |
| 2052 ui::VKEY_F12, keycode_f12_, Mod1Mask, ui::EF_ALT_DOWN }, |
| 2053 |
| 2054 // The number row should not be rewritten without Search key. |
| 2055 { ui::VKEY_1, keycode_1_, 0, 0, |
| 2056 ui::VKEY_1, keycode_1_, 0, 0 }, |
| 2057 { ui::VKEY_2, keycode_2_, 0, 0, |
| 2058 ui::VKEY_2, keycode_2_, 0, 0 }, |
| 2059 { ui::VKEY_3, keycode_3_, 0, 0, |
| 2060 ui::VKEY_3, keycode_3_, 0, 0 }, |
| 2061 { ui::VKEY_4, keycode_4_, 0, 0, |
| 2062 ui::VKEY_4, keycode_4_, 0, 0 }, |
| 2063 { ui::VKEY_5, keycode_5_, 0, 0, |
| 2064 ui::VKEY_5, keycode_5_, 0, 0 }, |
| 2065 { ui::VKEY_6, keycode_6_, 0, 0, |
| 2066 ui::VKEY_6, keycode_6_, 0, 0 }, |
| 2067 { ui::VKEY_7, keycode_7_, 0, 0, |
| 2068 ui::VKEY_7, keycode_7_, 0, 0 }, |
| 2069 { ui::VKEY_8, keycode_8_, 0, 0, |
| 2070 ui::VKEY_8, keycode_8_, 0, 0 }, |
| 2071 { ui::VKEY_9, keycode_9_, 0, 0, |
| 2072 ui::VKEY_9, keycode_9_, 0, 0 }, |
| 2073 { ui::VKEY_0, keycode_0_, 0, 0, |
| 2074 ui::VKEY_0, keycode_0_, 0, 0 }, |
| 2075 { ui::VKEY_OEM_MINUS, keycode_minus_, 0, 0, |
| 2076 ui::VKEY_OEM_MINUS, keycode_minus_, 0, 0 }, |
| 2077 { ui::VKEY_OEM_PLUS, keycode_equal_, 0, 0, |
| 2078 ui::VKEY_OEM_PLUS, keycode_equal_, 0, 0 }, |
| 2079 |
| 2080 // The number row should be rewritten as the F<number> row with Search key. |
| 2081 { ui::VKEY_1, keycode_1_, Mod4Mask, 0, |
| 2082 ui::VKEY_F1, keycode_f1_, 0, 0 }, |
| 2083 { ui::VKEY_2, keycode_2_, Mod4Mask, 0, |
| 2084 ui::VKEY_F2, keycode_f2_, 0, 0 }, |
| 2085 { ui::VKEY_3, keycode_3_, Mod4Mask, 0, |
| 2086 ui::VKEY_F3, keycode_f3_, 0, 0 }, |
| 2087 { ui::VKEY_4, keycode_4_, Mod4Mask, 0, |
| 2088 ui::VKEY_F4, keycode_f4_, 0, 0 }, |
| 2089 { ui::VKEY_5, keycode_5_, Mod4Mask, 0, |
| 2090 ui::VKEY_F5, keycode_f5_, 0, 0 }, |
| 2091 { ui::VKEY_6, keycode_6_, Mod4Mask, 0, |
| 2092 ui::VKEY_F6, keycode_f6_, 0, 0 }, |
| 2093 { ui::VKEY_7, keycode_7_, Mod4Mask, 0, |
| 2094 ui::VKEY_F7, keycode_f7_, 0, 0 }, |
| 2095 { ui::VKEY_8, keycode_8_, Mod4Mask, 0, |
| 2096 ui::VKEY_F8, keycode_f8_, 0, 0 }, |
| 2097 { ui::VKEY_9, keycode_9_, Mod4Mask, 0, |
| 2098 ui::VKEY_F9, keycode_f9_, 0, 0 }, |
| 2099 { ui::VKEY_0, keycode_0_, Mod4Mask, 0, |
| 2100 ui::VKEY_F10, keycode_f10_, 0, 0 }, |
| 2101 { ui::VKEY_OEM_MINUS, keycode_minus_, Mod4Mask, 0, |
| 2102 ui::VKEY_F11, keycode_f11_, 0, 0 }, |
| 2103 { ui::VKEY_OEM_PLUS, keycode_equal_, Mod4Mask, 0, |
| 2104 ui::VKEY_F12, keycode_f12_, 0, 0 }, |
| 2105 |
| 2106 // The function keys should not be rewritten with Search key pressed. |
| 2107 { ui::VKEY_F1, keycode_f1_, Mod4Mask, 0, |
| 2108 ui::VKEY_F1, keycode_f1_, 0, 0 }, |
| 2109 { ui::VKEY_F2, keycode_f2_, Mod4Mask, 0, |
| 2110 ui::VKEY_F2, keycode_f2_, 0, 0 }, |
| 2111 { ui::VKEY_F3, keycode_f3_, Mod4Mask, 0, |
| 2112 ui::VKEY_F3, keycode_f3_, 0, 0 }, |
| 2113 { ui::VKEY_F4, keycode_f4_, Mod4Mask, 0, |
| 2114 ui::VKEY_F4, keycode_f4_, 0, 0 }, |
| 2115 { ui::VKEY_F5, keycode_f5_, Mod4Mask, 0, |
| 2116 ui::VKEY_F5, keycode_f5_, 0, 0 }, |
| 2117 { ui::VKEY_F6, keycode_f6_, Mod4Mask, 0, |
| 2118 ui::VKEY_F6, keycode_f6_, 0, 0 }, |
| 2119 { ui::VKEY_F7, keycode_f7_, Mod4Mask, 0, |
| 2120 ui::VKEY_F7, keycode_f7_, 0, 0 }, |
| 2121 { ui::VKEY_F8, keycode_f8_, Mod4Mask, 0, |
| 2122 ui::VKEY_F8, keycode_f8_, 0, 0 }, |
| 2123 { ui::VKEY_F9, keycode_f9_, Mod4Mask, 0, |
| 2124 ui::VKEY_F9, keycode_f9_, 0, 0 }, |
| 2125 { ui::VKEY_F10, keycode_f10_, Mod4Mask, 0, |
| 2126 ui::VKEY_F10, keycode_f10_, 0, 0 }, |
| 2127 { ui::VKEY_F11, keycode_f11_, Mod4Mask, 0, |
| 2128 ui::VKEY_F11, keycode_f11_, 0, 0 }, |
| 2129 { ui::VKEY_F12, keycode_f12_, Mod4Mask, 0, |
| 2130 ui::VKEY_F12, keycode_f12_, 0, 0 }, |
| 2023 }; | 2131 }; |
| 2024 | 2132 |
| 2025 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(chromeos_tests); ++i) { | 2133 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
| 2026 EXPECT_EQ(GetExpectedResultAsString(chromeos_tests[i].output, | 2134 EXPECT_EQ(GetExpectedResultAsString(tests[i].output, |
| 2027 0, | 2135 tests[i].output_mods, |
| 2028 ui::ET_KEY_PRESSED, | 2136 ui::ET_KEY_PRESSED, |
| 2029 chromeos_tests[i].output_native, | 2137 tests[i].output_native, |
| 2030 0U, | 2138 tests[i].output_native_mods, |
| 2031 KeyPress), | 2139 KeyPress), |
| 2032 GetRewrittenEventAsString(&rewriter, | 2140 GetRewrittenEventAsString(&rewriter, |
| 2033 chromeos_tests[i].input, | 2141 tests[i].input, |
| 2034 0, | 2142 tests[i].input_mods, |
| 2035 ui::ET_KEY_PRESSED, | 2143 ui::ET_KEY_PRESSED, |
| 2036 chromeos_tests[i].input_native, | 2144 tests[i].input_native, |
| 2037 0)); | 2145 tests[i].input_native_mods)); |
| 2038 | |
| 2039 // Search key as a modifier does not change the outcome. | |
| 2040 EXPECT_EQ(GetExpectedResultAsString(chromeos_tests[i].output, | |
| 2041 0, | |
| 2042 ui::ET_KEY_PRESSED, | |
| 2043 chromeos_tests[i].output_native, | |
| 2044 Mod4Mask, | |
| 2045 KeyPress), | |
| 2046 GetRewrittenEventAsString(&rewriter, | |
| 2047 chromeos_tests[i].input, | |
| 2048 0, | |
| 2049 ui::ET_KEY_PRESSED, | |
| 2050 chromeos_tests[i].input_native, | |
| 2051 Mod4Mask)); | |
| 2052 } | 2146 } |
| 2053 | |
| 2054 // Make Search key act like a Function key for accessing extended key | |
| 2055 // bindings. Now Search key as a modifier will make the number row | |
| 2056 // act like the F<number> row. | |
| 2057 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | |
| 2058 switches::kEnableChromebookFunctionKey, ""); | |
| 2059 | |
| 2060 // Without a Search key modifier, the results should be the same as before. | |
| 2061 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(chromeos_tests); ++i) { | |
| 2062 EXPECT_EQ(GetExpectedResultAsString(chromeos_tests[i].output, | |
| 2063 0, | |
| 2064 ui::ET_KEY_PRESSED, | |
| 2065 chromeos_tests[i].output_native, | |
| 2066 0U, | |
| 2067 KeyPress), | |
| 2068 GetRewrittenEventAsString(&rewriter, | |
| 2069 chromeos_tests[i].input, | |
| 2070 0, | |
| 2071 ui::ET_KEY_PRESSED, | |
| 2072 chromeos_tests[i].input_native, | |
| 2073 0)); | |
| 2074 } | |
| 2075 | |
| 2076 struct { | |
| 2077 ui::KeyboardCode input; | |
| 2078 KeyCode input_native; | |
| 2079 ui::KeyboardCode output; | |
| 2080 KeyCode output_native; | |
| 2081 } search_key_tests[] = { | |
| 2082 // The number row should be rewritten as the F<number> row. | |
| 2083 { ui::VKEY_1, keycode_1_, ui::VKEY_F1, keycode_f1_, }, | |
| 2084 { ui::VKEY_2, keycode_2_, ui::VKEY_F2, keycode_f2_, }, | |
| 2085 { ui::VKEY_3, keycode_3_, ui::VKEY_F3, keycode_f3_, }, | |
| 2086 { ui::VKEY_4, keycode_4_, ui::VKEY_F4, keycode_f4_, }, | |
| 2087 { ui::VKEY_5, keycode_5_, ui::VKEY_F5, keycode_f5_, }, | |
| 2088 { ui::VKEY_6, keycode_6_, ui::VKEY_F6, keycode_f6_, }, | |
| 2089 { ui::VKEY_7, keycode_7_, ui::VKEY_F7, keycode_f7_, }, | |
| 2090 { ui::VKEY_8, keycode_8_, ui::VKEY_F8, keycode_f8_, }, | |
| 2091 { ui::VKEY_9, keycode_9_, ui::VKEY_F9, keycode_f9_, }, | |
| 2092 { ui::VKEY_0, keycode_0_, ui::VKEY_F10, keycode_f10_, }, | |
| 2093 { ui::VKEY_OEM_MINUS, keycode_minus_, ui::VKEY_F11, keycode_f11_, }, | |
| 2094 { ui::VKEY_OEM_PLUS, keycode_equal_, ui::VKEY_F12, keycode_f12_, }, | |
| 2095 | |
| 2096 // The function keys should not be rewritten anymore. | |
| 2097 { ui::VKEY_F1, keycode_f1_, ui::VKEY_F1, keycode_f1_, }, | |
| 2098 { ui::VKEY_F2, keycode_f2_, ui::VKEY_F2, keycode_f2_, }, | |
| 2099 { ui::VKEY_F3, keycode_f3_, ui::VKEY_F3, keycode_f3_, }, | |
| 2100 { ui::VKEY_F4, keycode_f4_, ui::VKEY_F4, keycode_f4_, }, | |
| 2101 { ui::VKEY_F5, keycode_f5_, ui::VKEY_F5, keycode_f5_, }, | |
| 2102 { ui::VKEY_F6, keycode_f6_, ui::VKEY_F6, keycode_f6_, }, | |
| 2103 { ui::VKEY_F7, keycode_f7_, ui::VKEY_F7, keycode_f7_, }, | |
| 2104 { ui::VKEY_F8, keycode_f8_, ui::VKEY_F8, keycode_f8_, }, | |
| 2105 { ui::VKEY_F9, keycode_f9_, ui::VKEY_F9, keycode_f9_, }, | |
| 2106 { ui::VKEY_F10, keycode_f10_, ui::VKEY_F10, keycode_f10_, }, | |
| 2107 { ui::VKEY_F11, keycode_f11_, ui::VKEY_F11, keycode_f11_, }, | |
| 2108 { ui::VKEY_F12, keycode_f12_, ui::VKEY_F12, keycode_f12_, }, | |
| 2109 }; | |
| 2110 | |
| 2111 // But with a Search key as a modifier, we should have new rewrite rules now. | |
| 2112 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(search_key_tests); ++i) { | |
| 2113 EXPECT_EQ(GetExpectedResultAsString(search_key_tests[i].output, | |
| 2114 0, | |
| 2115 ui::ET_KEY_PRESSED, | |
| 2116 search_key_tests[i].output_native, | |
| 2117 0, | |
| 2118 KeyPress), | |
| 2119 GetRewrittenEventAsString(&rewriter, | |
| 2120 search_key_tests[i].input, | |
| 2121 0, | |
| 2122 ui::ET_KEY_PRESSED, | |
| 2123 search_key_tests[i].input_native, | |
| 2124 Mod4Mask)); | |
| 2125 | |
| 2126 // Other modifiers should be preserved. | |
| 2127 EXPECT_EQ(GetExpectedResultAsString(search_key_tests[i].output, | |
| 2128 ui::EF_ALT_DOWN, | |
| 2129 ui::ET_KEY_PRESSED, | |
| 2130 search_key_tests[i].output_native, | |
| 2131 Mod1Mask, | |
| 2132 KeyPress), | |
| 2133 GetRewrittenEventAsString(&rewriter, | |
| 2134 search_key_tests[i].input, | |
| 2135 ui::EF_ALT_DOWN, | |
| 2136 ui::ET_KEY_PRESSED, | |
| 2137 search_key_tests[i].input_native, | |
| 2138 Mod4Mask | Mod1Mask)); | |
| 2139 | |
| 2140 EXPECT_EQ(GetExpectedResultAsString(search_key_tests[i].output, | |
| 2141 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | |
| 2142 ui::ET_KEY_PRESSED, | |
| 2143 search_key_tests[i].output_native, | |
| 2144 ControlMask | Mod1Mask, | |
| 2145 KeyPress), | |
| 2146 GetRewrittenEventAsString(&rewriter, | |
| 2147 search_key_tests[i].input, | |
| 2148 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | |
| 2149 ui::ET_KEY_PRESSED, | |
| 2150 search_key_tests[i].input_native, | |
| 2151 Mod4Mask | ControlMask | Mod1Mask)); | |
| 2152 } | |
| 2153 | |
| 2154 *CommandLine::ForCurrentProcess() = original_cl; | |
| 2155 } | 2147 } |
| 2156 | 2148 |
| 2157 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { | 2149 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { |
| 2158 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); | 2150 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); |
| 2159 | 2151 |
| 2160 // Remap Search to Control. | 2152 // Remap Search to Control. |
| 2161 TestingPrefService prefs; | 2153 TestingPrefService prefs; |
| 2162 chromeos::Preferences::RegisterUserPrefs(&prefs); | 2154 chromeos::Preferences::RegisterUserPrefs(&prefs); |
| 2163 IntegerPrefMember search; | 2155 IntegerPrefMember search; |
| 2164 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 2156 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2232 // flag in the event is True. | 2224 // flag in the event is True. |
| 2233 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, | 2225 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 2234 ui::EF_CONTROL_DOWN, | 2226 ui::EF_CONTROL_DOWN, |
| 2235 ui::ET_KEY_PRESSED, | 2227 ui::ET_KEY_PRESSED, |
| 2236 keycode_control_l_, | 2228 keycode_control_l_, |
| 2237 0U, | 2229 0U, |
| 2238 KeyPress), | 2230 KeyPress), |
| 2239 rewritten_event); | 2231 rewritten_event); |
| 2240 } | 2232 } |
| 2241 #endif // OS_CHROMEOS | 2233 #endif // OS_CHROMEOS |
| OLD | NEW |