| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/chromeos/events/event_rewriter.h" | 5 #include "chrome/browser/chromeos/events/event_rewriter.h" |
| 6 | 6 |
| 7 #include <X11/keysym.h> | 7 #include <X11/keysym.h> |
| 8 #include <X11/XF86keysym.h> | 8 #include <X11/XF86keysym.h> |
| 9 #include <X11/Xlib.h> | 9 #include <X11/Xlib.h> |
| 10 #undef Bool | 10 #undef Bool |
| 11 #undef None | 11 #undef None |
| 12 #undef RootWindow | 12 #undef RootWindow |
| 13 | 13 |
| 14 #include "ash/test/ash_test_base.h" | 14 #include "ash/test/ash_test_base.h" |
| 15 #include "ash/wm/window_state.h" | 15 #include "ash/wm/window_state.h" |
| 16 #include "base/basictypes.h" | 16 #include "base/basictypes.h" |
| 17 #include "base/command_line.h" | 17 #include "base/command_line.h" |
| 18 #include "base/prefs/pref_member.h" | 18 #include "base/prefs/pref_member.h" |
| 19 #include "base/strings/stringprintf.h" | 19 #include "base/strings/stringprintf.h" |
| 20 #include "chrome/browser/chromeos/input_method/input_method_configuration.h" | 20 #include "chrome/browser/chromeos/input_method/input_method_configuration.h" |
| 21 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" | 21 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" |
| 22 #include "chrome/browser/chromeos/login/mock_user_manager.h" | 22 #include "chrome/browser/chromeos/login/mock_user_manager.h" |
| 23 #include "chrome/browser/chromeos/login/user_manager.h" | 23 #include "chrome/browser/chromeos/login/user_manager.h" |
| 24 #include "chrome/browser/chromeos/preferences.h" | 24 #include "chrome/browser/chromeos/preferences.h" |
| 25 #include "chrome/common/pref_names.h" | 25 #include "chrome/common/pref_names.h" |
| 26 #include "chrome/test/base/testing_pref_service_syncable.h" | 26 #include "chrome/test/base/testing_pref_service_syncable.h" |
| 27 #include "chromeos/chromeos_switches.h" | 27 #include "chromeos/chromeos_switches.h" |
| 28 #include "chromeos/ime/fake_xkeyboard.h" | 28 #include "chromeos/ime/fake_ime_keyboard.h" |
| 29 #include "testing/gtest/include/gtest/gtest.h" | 29 #include "testing/gtest/include/gtest/gtest.h" |
| 30 #include "ui/aura/window.h" | 30 #include "ui/aura/window.h" |
| 31 #include "ui/events/event.h" | 31 #include "ui/events/event.h" |
| 32 #include "ui/events/test/events_test_utils_x11.h" | 32 #include "ui/events/test/events_test_utils_x11.h" |
| 33 #include "ui/events/x/touch_factory_x11.h" | 33 #include "ui/events/x/touch_factory_x11.h" |
| 34 #include "ui/gfx/x/x11_types.h" | 34 #include "ui/gfx/x/x11_types.h" |
| 35 | 35 |
| 36 namespace { | 36 namespace { |
| 37 | 37 |
| 38 std::string GetRewrittenEventAsString(chromeos::EventRewriter* rewriter, | 38 std::string GetRewrittenEventAsString(chromeos::EventRewriter* rewriter, |
| (...skipping 1480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1519 } | 1519 } |
| 1520 | 1520 |
| 1521 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { | 1521 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { |
| 1522 // Remap Search to Caps Lock. | 1522 // Remap Search to Caps Lock. |
| 1523 TestingPrefServiceSyncable prefs; | 1523 TestingPrefServiceSyncable prefs; |
| 1524 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1524 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 1525 IntegerPrefMember search; | 1525 IntegerPrefMember search; |
| 1526 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 1526 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
| 1527 search.SetValue(chromeos::input_method::kCapsLockKey); | 1527 search.SetValue(chromeos::input_method::kCapsLockKey); |
| 1528 | 1528 |
| 1529 chromeos::input_method::FakeXKeyboard xkeyboard; | 1529 chromeos::input_method::FakeImeKeyboard keyboard; |
| 1530 EventRewriter rewriter; | 1530 EventRewriter rewriter; |
| 1531 rewriter.set_pref_service_for_testing(&prefs); | 1531 rewriter.set_pref_service_for_testing(&prefs); |
| 1532 rewriter.set_xkeyboard_for_testing(&xkeyboard); | 1532 rewriter.set_keyboard_for_testing(&keyboard); |
| 1533 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); | 1533 EXPECT_FALSE(keyboard.caps_lock_is_enabled_); |
| 1534 | 1534 |
| 1535 // Press Search. | 1535 // Press Search. |
| 1536 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, | 1536 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
| 1537 ui::EF_CAPS_LOCK_DOWN, | 1537 ui::EF_CAPS_LOCK_DOWN, |
| 1538 ui::ET_KEY_PRESSED, | 1538 ui::ET_KEY_PRESSED, |
| 1539 keycode_caps_lock_, | 1539 keycode_caps_lock_, |
| 1540 0U, | 1540 0U, |
| 1541 KeyPress), | 1541 KeyPress), |
| 1542 GetRewrittenEventAsString(&rewriter, | 1542 GetRewrittenEventAsString(&rewriter, |
| 1543 ui::VKEY_LWIN, | 1543 ui::VKEY_LWIN, |
| 1544 0, | 1544 0, |
| 1545 ui::ET_KEY_PRESSED, | 1545 ui::ET_KEY_PRESSED, |
| 1546 keycode_super_l_, | 1546 keycode_super_l_, |
| 1547 0U)); | 1547 0U)); |
| 1548 // Confirm that the Caps Lock status is changed. | 1548 // Confirm that the Caps Lock status is changed. |
| 1549 EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_); | 1549 EXPECT_TRUE(keyboard.caps_lock_is_enabled_); |
| 1550 | 1550 |
| 1551 // Release Search. | 1551 // Release Search. |
| 1552 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, | 1552 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
| 1553 ui::EF_NONE, | 1553 ui::EF_NONE, |
| 1554 ui::ET_KEY_RELEASED, | 1554 ui::ET_KEY_RELEASED, |
| 1555 keycode_caps_lock_, | 1555 keycode_caps_lock_, |
| 1556 LockMask, | 1556 LockMask, |
| 1557 KeyRelease), | 1557 KeyRelease), |
| 1558 GetRewrittenEventAsString(&rewriter, | 1558 GetRewrittenEventAsString(&rewriter, |
| 1559 ui::VKEY_LWIN, | 1559 ui::VKEY_LWIN, |
| 1560 ui::EF_CAPS_LOCK_DOWN, | 1560 ui::EF_CAPS_LOCK_DOWN, |
| 1561 ui::ET_KEY_RELEASED, | 1561 ui::ET_KEY_RELEASED, |
| 1562 keycode_super_l_, | 1562 keycode_super_l_, |
| 1563 Mod4Mask | LockMask)); | 1563 Mod4Mask | LockMask)); |
| 1564 // Confirm that the Caps Lock status is not changed. | 1564 // Confirm that the Caps Lock status is not changed. |
| 1565 EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_); | 1565 EXPECT_TRUE(keyboard.caps_lock_is_enabled_); |
| 1566 | 1566 |
| 1567 // Press Search. | 1567 // Press Search. |
| 1568 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, | 1568 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
| 1569 ui::EF_CAPS_LOCK_DOWN, | 1569 ui::EF_CAPS_LOCK_DOWN, |
| 1570 ui::ET_KEY_PRESSED, | 1570 ui::ET_KEY_PRESSED, |
| 1571 keycode_caps_lock_, | 1571 keycode_caps_lock_, |
| 1572 LockMask, | 1572 LockMask, |
| 1573 KeyPress), | 1573 KeyPress), |
| 1574 GetRewrittenEventAsString(&rewriter, | 1574 GetRewrittenEventAsString(&rewriter, |
| 1575 ui::VKEY_LWIN, | 1575 ui::VKEY_LWIN, |
| 1576 ui::EF_CAPS_LOCK_DOWN, | 1576 ui::EF_CAPS_LOCK_DOWN, |
| 1577 ui::ET_KEY_PRESSED, | 1577 ui::ET_KEY_PRESSED, |
| 1578 keycode_super_l_, | 1578 keycode_super_l_, |
| 1579 LockMask)); | 1579 LockMask)); |
| 1580 // Confirm that the Caps Lock status is changed. | 1580 // Confirm that the Caps Lock status is changed. |
| 1581 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); | 1581 EXPECT_FALSE(keyboard.caps_lock_is_enabled_); |
| 1582 | 1582 |
| 1583 // Release Search. | 1583 // Release Search. |
| 1584 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, | 1584 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
| 1585 ui::EF_NONE, | 1585 ui::EF_NONE, |
| 1586 ui::ET_KEY_RELEASED, | 1586 ui::ET_KEY_RELEASED, |
| 1587 keycode_caps_lock_, | 1587 keycode_caps_lock_, |
| 1588 LockMask, | 1588 LockMask, |
| 1589 KeyRelease), | 1589 KeyRelease), |
| 1590 GetRewrittenEventAsString(&rewriter, | 1590 GetRewrittenEventAsString(&rewriter, |
| 1591 ui::VKEY_LWIN, | 1591 ui::VKEY_LWIN, |
| 1592 ui::EF_CAPS_LOCK_DOWN, | 1592 ui::EF_CAPS_LOCK_DOWN, |
| 1593 ui::ET_KEY_RELEASED, | 1593 ui::ET_KEY_RELEASED, |
| 1594 keycode_super_l_, | 1594 keycode_super_l_, |
| 1595 Mod4Mask | LockMask)); | 1595 Mod4Mask | LockMask)); |
| 1596 // Confirm that the Caps Lock status is not changed. | 1596 // Confirm that the Caps Lock status is not changed. |
| 1597 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); | 1597 EXPECT_FALSE(keyboard.caps_lock_is_enabled_); |
| 1598 | 1598 |
| 1599 // Press Caps Lock (on an external keyboard). | 1599 // Press Caps Lock (on an external keyboard). |
| 1600 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, | 1600 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
| 1601 ui::EF_CAPS_LOCK_DOWN, | 1601 ui::EF_CAPS_LOCK_DOWN, |
| 1602 ui::ET_KEY_PRESSED, | 1602 ui::ET_KEY_PRESSED, |
| 1603 keycode_caps_lock_, | 1603 keycode_caps_lock_, |
| 1604 0U, | 1604 0U, |
| 1605 KeyPress), | 1605 KeyPress), |
| 1606 GetRewrittenEventAsString(&rewriter, | 1606 GetRewrittenEventAsString(&rewriter, |
| 1607 ui::VKEY_CAPITAL, | 1607 ui::VKEY_CAPITAL, |
| 1608 ui::EF_NONE, | 1608 ui::EF_NONE, |
| 1609 ui::ET_KEY_PRESSED, | 1609 ui::ET_KEY_PRESSED, |
| 1610 keycode_caps_lock_, | 1610 keycode_caps_lock_, |
| 1611 0U)); | 1611 0U)); |
| 1612 | 1612 |
| 1613 // Confirm that calling RewriteForTesting() does not change the state of | 1613 // Confirm that calling RewriteForTesting() does not change the state of |
| 1614 // |xkeyboard|. In this case, X Window system itself should change the | 1614 // |keyboard|. In this case, X Window system itself should change the |
| 1615 // Caps Lock state, not ash::EventRewriter. | 1615 // Caps Lock state, not ash::EventRewriter. |
| 1616 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); | 1616 EXPECT_FALSE(keyboard.caps_lock_is_enabled_); |
| 1617 | 1617 |
| 1618 // Release Caps Lock (on an external keyboard). | 1618 // Release Caps Lock (on an external keyboard). |
| 1619 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, | 1619 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
| 1620 ui::EF_NONE, | 1620 ui::EF_NONE, |
| 1621 ui::ET_KEY_RELEASED, | 1621 ui::ET_KEY_RELEASED, |
| 1622 keycode_caps_lock_, | 1622 keycode_caps_lock_, |
| 1623 LockMask, | 1623 LockMask, |
| 1624 KeyRelease), | 1624 KeyRelease), |
| 1625 GetRewrittenEventAsString(&rewriter, | 1625 GetRewrittenEventAsString(&rewriter, |
| 1626 ui::VKEY_CAPITAL, | 1626 ui::VKEY_CAPITAL, |
| 1627 ui::EF_CAPS_LOCK_DOWN, | 1627 ui::EF_CAPS_LOCK_DOWN, |
| 1628 ui::ET_KEY_RELEASED, | 1628 ui::ET_KEY_RELEASED, |
| 1629 keycode_caps_lock_, | 1629 keycode_caps_lock_, |
| 1630 LockMask)); | 1630 LockMask)); |
| 1631 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); | 1631 EXPECT_FALSE(keyboard.caps_lock_is_enabled_); |
| 1632 } | 1632 } |
| 1633 | 1633 |
| 1634 TEST_F(EventRewriterTest, DISABLED_TestRewriteCapsLock) { | 1634 TEST_F(EventRewriterTest, DISABLED_TestRewriteCapsLock) { |
| 1635 // It seems that the X server running on build servers is too old and does not | 1635 // It seems that the X server running on build servers is too old and does not |
| 1636 // support F16 (i.e. 'XKeysymToKeycode(display_, XF86XK_Launch7)' call). | 1636 // support F16 (i.e. 'XKeysymToKeycode(display_, XF86XK_Launch7)' call). |
| 1637 // TODO(yusukes): Reenable the test once build servers are upgraded. | 1637 // TODO(yusukes): Reenable the test once build servers are upgraded. |
| 1638 | 1638 |
| 1639 TestingPrefServiceSyncable prefs; | 1639 TestingPrefServiceSyncable prefs; |
| 1640 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1640 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 1641 | 1641 |
| 1642 chromeos::input_method::FakeXKeyboard xkeyboard; | 1642 chromeos::input_method::FakeImeKeyboard keyboard; |
| 1643 EventRewriter rewriter; | 1643 EventRewriter rewriter; |
| 1644 rewriter.set_pref_service_for_testing(&prefs); | 1644 rewriter.set_pref_service_for_testing(&prefs); |
| 1645 rewriter.set_xkeyboard_for_testing(&xkeyboard); | 1645 rewriter.set_keyboard_for_testing(&keyboard); |
| 1646 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); | 1646 EXPECT_FALSE(keyboard.caps_lock_is_enabled_); |
| 1647 | 1647 |
| 1648 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask. | 1648 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask. |
| 1649 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, | 1649 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
| 1650 ui::EF_CAPS_LOCK_DOWN, | 1650 ui::EF_CAPS_LOCK_DOWN, |
| 1651 ui::ET_KEY_PRESSED, | 1651 ui::ET_KEY_PRESSED, |
| 1652 keycode_caps_lock_, | 1652 keycode_caps_lock_, |
| 1653 0U, | 1653 0U, |
| 1654 KeyPress), | 1654 KeyPress), |
| 1655 GetRewrittenEventAsString(&rewriter, | 1655 GetRewrittenEventAsString(&rewriter, |
| 1656 ui::VKEY_F16, | 1656 ui::VKEY_F16, |
| 1657 0, | 1657 0, |
| 1658 ui::ET_KEY_PRESSED, | 1658 ui::ET_KEY_PRESSED, |
| 1659 keycode_launch7_, | 1659 keycode_launch7_, |
| 1660 0U)); | 1660 0U)); |
| 1661 EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_); | 1661 EXPECT_TRUE(keyboard.caps_lock_is_enabled_); |
| 1662 } | 1662 } |
| 1663 | 1663 |
| 1664 TEST_F(EventRewriterTest, DISABLED_TestRewriteDiamondKey) { | 1664 TEST_F(EventRewriterTest, DISABLED_TestRewriteDiamondKey) { |
| 1665 // TODO(yusukes): Reenable the test once build servers are upgraded. | 1665 // TODO(yusukes): Reenable the test once build servers are upgraded. |
| 1666 | 1666 |
| 1667 TestingPrefServiceSyncable prefs; | 1667 TestingPrefServiceSyncable prefs; |
| 1668 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1668 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 1669 | 1669 |
| 1670 chromeos::input_method::FakeXKeyboard xkeyboard; | 1670 chromeos::input_method::FakeImeKeyboard keyboard; |
| 1671 EventRewriter rewriter; | 1671 EventRewriter rewriter; |
| 1672 rewriter.set_pref_service_for_testing(&prefs); | 1672 rewriter.set_pref_service_for_testing(&prefs); |
| 1673 rewriter.set_xkeyboard_for_testing(&xkeyboard); | 1673 rewriter.set_keyboard_for_testing(&keyboard); |
| 1674 | 1674 |
| 1675 // F15 should work as Ctrl when --has-chromeos-diamond-key is not specified. | 1675 // F15 should work as Ctrl when --has-chromeos-diamond-key is not specified. |
| 1676 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, | 1676 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 1677 ui::EF_CONTROL_DOWN, | 1677 ui::EF_CONTROL_DOWN, |
| 1678 ui::ET_KEY_PRESSED, | 1678 ui::ET_KEY_PRESSED, |
| 1679 keycode_control_l_, | 1679 keycode_control_l_, |
| 1680 0U, | 1680 0U, |
| 1681 KeyPress), | 1681 KeyPress), |
| 1682 GetRewrittenEventAsString(&rewriter, | 1682 GetRewrittenEventAsString(&rewriter, |
| 1683 ui::VKEY_F15, | 1683 ui::VKEY_F15, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1705 TEST_F(EventRewriterTest, DISABLED_TestRewriteDiamondKeyWithFlag) { | 1705 TEST_F(EventRewriterTest, DISABLED_TestRewriteDiamondKeyWithFlag) { |
| 1706 // TODO(yusukes): Reenable the test once build servers are upgraded. | 1706 // TODO(yusukes): Reenable the test once build servers are upgraded. |
| 1707 | 1707 |
| 1708 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); | 1708 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); |
| 1709 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 1709 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 1710 chromeos::switches::kHasChromeOSDiamondKey, ""); | 1710 chromeos::switches::kHasChromeOSDiamondKey, ""); |
| 1711 | 1711 |
| 1712 TestingPrefServiceSyncable prefs; | 1712 TestingPrefServiceSyncable prefs; |
| 1713 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1713 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 1714 | 1714 |
| 1715 chromeos::input_method::FakeXKeyboard xkeyboard; | 1715 chromeos::input_method::FakeImeKeyboard keyboard; |
| 1716 EventRewriter rewriter; | 1716 EventRewriter rewriter; |
| 1717 rewriter.set_pref_service_for_testing(&prefs); | 1717 rewriter.set_pref_service_for_testing(&prefs); |
| 1718 rewriter.set_xkeyboard_for_testing(&xkeyboard); | 1718 rewriter.set_keyboard_for_testing(&keyboard); |
| 1719 | 1719 |
| 1720 // By default, F15 should work as Control. | 1720 // By default, F15 should work as Control. |
| 1721 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, | 1721 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 1722 ui::EF_CONTROL_DOWN, | 1722 ui::EF_CONTROL_DOWN, |
| 1723 ui::ET_KEY_PRESSED, | 1723 ui::ET_KEY_PRESSED, |
| 1724 keycode_control_l_, | 1724 keycode_control_l_, |
| 1725 0U, | 1725 0U, |
| 1726 KeyPress), | 1726 KeyPress), |
| 1727 GetRewrittenEventAsString(&rewriter, | 1727 GetRewrittenEventAsString(&rewriter, |
| 1728 ui::VKEY_F15, | 1728 ui::VKEY_F15, |
| (...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2472 ui::ScopedXI2Event xev; | 2472 ui::ScopedXI2Event xev; |
| 2473 xev.InitGenericButtonEvent( | 2473 xev.InitGenericButtonEvent( |
| 2474 11, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); | 2474 11, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); |
| 2475 ui::MouseEvent release(xev); | 2475 ui::MouseEvent release(xev); |
| 2476 RewriteMouseEvent(&rewriter, &release); | 2476 RewriteMouseEvent(&rewriter, &release); |
| 2477 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & release.flags()); | 2477 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & release.flags()); |
| 2478 } | 2478 } |
| 2479 } | 2479 } |
| 2480 | 2480 |
| 2481 } // namespace chromeos | 2481 } // namespace chromeos |
| OLD | NEW |