Index: ash/sticky_keys/sticky_keys_overlay_unittest.cc |
diff --git a/ash/sticky_keys/sticky_keys_overlay_unittest.cc b/ash/sticky_keys/sticky_keys_overlay_unittest.cc |
index b6078255bb72b2d8ed6a4efe022721518e5430e2..2566a8b0433c2666b59377f7aac2c0bbfa8fc873 100644 |
--- a/ash/sticky_keys/sticky_keys_overlay_unittest.cc |
+++ b/ash/sticky_keys/sticky_keys_overlay_unittest.cc |
@@ -4,18 +4,17 @@ |
#include "ash/sticky_keys/sticky_keys_overlay.h" |
+#include "ash/display/display_controller.h" |
+#include "ash/display/display_manager.h" |
#include "ash/shell.h" |
#include "ash/sticky_keys/sticky_keys_controller.h" |
#include "ash/test/ash_test_base.h" |
#include "ui/events/event.h" |
+#include "ui/views/widget/widget.h" |
namespace ash { |
-class StickyKeysOverlayTest : public test::AshTestBase { |
- public: |
- StickyKeysOverlayTest() {} |
- virtual ~StickyKeysOverlayTest() {} |
-}; |
+using StickyKeysOverlayTest = test::AshTestBase; |
TEST_F(StickyKeysOverlayTest, OverlayVisibility) { |
StickyKeysOverlay overlay; |
@@ -41,6 +40,40 @@ TEST_F(StickyKeysOverlayTest, ModifierKeyState) { |
overlay.GetModifierKeyState(ui::EF_COMMAND_DOWN)); |
} |
+// This test addresses the crash report at crbug.com/435600, speculated to be |
+// caused by using sticky keys with multiple displays. |
+TEST_F(StickyKeysOverlayTest, OverlayNotDestroyedAfterDisplayRemoved) { |
+ // Add a secondary display to the left of the primary one. |
+ UpdateDisplay("1280x1024,1980x1080"); |
+ DisplayManager* display_manager = Shell::GetInstance()->display_manager(); |
+ DisplayIdPair display_ids = display_manager->GetCurrentDisplayIdPair(); |
+ int64_t primary_display_id = display_ids.first; |
+ int64_t secondary_display_id = display_ids.second; |
+ display_manager->SetLayoutForCurrentDisplays( |
+ DisplayLayout(DisplayLayout::LEFT, 0)); |
+ |
+ // The overlay should belong to the secondary root window. |
+ StickyKeysOverlay overlay; |
+ views::Widget* overlay_widget = overlay.GetWidgetForTesting(); |
+ DisplayController* display_controller = |
+ Shell::GetInstance()->display_controller(); |
+ EXPECT_EQ(display_controller->GetRootWindowForDisplayId(secondary_display_id), |
+ overlay_widget->GetNativeWindow()->GetRootWindow()); |
+ |
+ // Removing the second display should move the overlay to the primary root |
+ // window. |
+ UpdateDisplay("1280x1024"); |
+ EXPECT_EQ(display_controller->GetRootWindowForDisplayId(primary_display_id), |
+ overlay_widget->GetNativeWindow()->GetRootWindow()); |
+ |
+ overlay.SetModifierKeyState(ui::EF_SHIFT_DOWN, STICKY_KEY_STATE_ENABLED); |
+ EXPECT_EQ(STICKY_KEY_STATE_ENABLED, |
+ overlay.GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
+ overlay.SetModifierKeyState(ui::EF_SHIFT_DOWN, STICKY_KEY_STATE_DISABLED); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay.GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
+} |
+ |
// Additional sticky key overlay tests that depend on chromeos::EventRewriter |
// are now in chrome/browser/chromeos/events/event_rewriter_unittest.cc . |