15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ash/session/session_state_delegate.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/system_modal_container_layout_manager.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/window_properties.h" 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/wm/window_state.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h" 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/command_line.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/focus_change_observer.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/focus_client.h" 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/aura/client/window_tree_client.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_windows.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_tracker.h" 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/base/ime/dummy_text_input_client.h" 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/base/ime/input_method.h" 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/base/ime/text_input_client.h" 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/base/ime/text_input_focus_manager.h" 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/base/ui_base_switches_util.h" 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/event_generator.h" 3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/events/test/test_event_handler.h" 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/keyboard/keyboard_controller_proxy.h" 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/keyboard/keyboard_switches.h" 370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/keyboard/keyboard_util.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_controller.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using aura::Window; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using views::Widget; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestDelegate : public views::WidgetDelegateView { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit TestDelegate(bool system_modal) : system_modal_(system_modal) {} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestDelegate() {} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::WidgetDelegate: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual views::View* GetContentsView() OVERRIDE { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ui::ModalType GetModalType() const OVERRIDE { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return system_modal_ ? ui::MODAL_TYPE_SYSTEM : ui::MODAL_TYPE_NONE; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool system_modal_; 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestDelegate); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DeleteOnBlurDelegate : public aura::test::TestWindowDelegate, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public aura::client::FocusChangeObserver { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteOnBlurDelegate() : window_(NULL) {} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DeleteOnBlurDelegate() {} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetWindow(aura::Window* window) { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_ = window; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::SetFocusChangeObserver(window_, this); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // aura::test::TestWindowDelegate overrides: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CanFocus() OVERRIDE { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // aura::client::FocusChangeObserver implementation: 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowFocused(aura::Window* gained_focus, 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* lost_focus) OVERRIDE { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (window_ == lost_focus) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete window_; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DeleteOnBlurDelegate); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RootWindowControllerTest : public test::AshTestBase { 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget* CreateTestWidget(const gfx::Rect& bounds) { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget* widget = views::Widget::CreateWindowWithContextAndBounds( 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, CurrentContext(), bounds); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->Show(); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return widget; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget* CreateModalWidget(const gfx::Rect& bounds) { 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget* widget = views::Widget::CreateWindowWithContextAndBounds( 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TestDelegate(true), CurrentContext(), bounds); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->Show(); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return widget; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget* CreateModalWidgetWithParent(const gfx::Rect& bounds, 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeWindow parent) { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget* widget = 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::CreateWindowWithParentAndBounds(new TestDelegate(true), 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent, 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bounds); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->Show(); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return widget; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window* GetModalContainer(aura::Window* root_window) { 128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return Shell::GetContainer(root_window, 129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::kShellWindowId_SystemModalContainer); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(RootWindowControllerTest, MoveWindows_Basic) { 1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Windows origin should be doubled when moved to the 1st display. 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateDisplay("600x600,300x300"); 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window::Windows root_windows = Shell::GetAllRootWindows(); 139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RootWindowController* controller = Shell::GetPrimaryRootWindowController(); 140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ShelfLayoutManager* shelf_layout_manager = 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller->GetShelfLayoutManager(); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf_layout_manager->SetAutoHideBehavior( 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* normal = CreateTestWidget(gfx::Rect(650, 10, 100, 100)); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[1], normal->GetNativeView()->GetRootWindow()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("650,10 100x100", normal->GetWindowBoundsInScreen().ToString()); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("50,10 100x100", 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal->GetNativeView()->GetBoundsInRootWindow().ToString()); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* maximized = CreateTestWidget(gfx::Rect(700, 10, 100, 100)); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximized->Maximize(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[1], maximized->GetNativeView()->GetRootWindow()); 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("600,0 300x253", maximized->GetWindowBoundsInScreen().ToString()); 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("0,0 300x253", 156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) maximized->GetNativeView()->GetBoundsInRootWindow().ToString()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* minimized = CreateTestWidget(gfx::Rect(800, 10, 100, 100)); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimized->Minimize(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[1], minimized->GetNativeView()->GetRootWindow()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("800,10 100x100", 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimized->GetWindowBoundsInScreen().ToString()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) views::Widget* fullscreen = CreateTestWidget(gfx::Rect(850, 10, 100, 100)); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen->SetFullscreen(true); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[1], fullscreen->GetNativeView()->GetRootWindow()); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("600,0 300x300", 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen->GetWindowBoundsInScreen().ToString()); 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("0,0 300x300", 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen->GetNativeView()->GetBoundsInRootWindow().ToString()); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget* unparented_control = new Widget; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.bounds = gfx::Rect(650, 10, 100, 100); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.context = CurrentContext(); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.type = Widget::InitParams::TYPE_CONTROL; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unparented_control->Init(params); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(root_windows[1], 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unparented_control->GetNativeView()->GetRootWindow()); 181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(kShellWindowId_UnparentedControlContainer, 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unparented_control->GetNativeView()->parent()->id()); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* panel = CreateTestWindowInShellWithDelegateAndType( 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NULL, ui::wm::WINDOW_TYPE_PANEL, 0, gfx::Rect(700, 100, 100, 100)); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(root_windows[1], panel->GetRootWindow()); 187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(kShellWindowId_PanelContainer, panel->parent()->id()); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure a window that will delete itself when losing focus 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will not crash. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::WindowTracker tracker; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteOnBlurDelegate delete_on_blur_delegate; 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* d2 = CreateTestWindowInShellWithDelegate( 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &delete_on_blur_delegate, 0, gfx::Rect(50, 50, 100, 100)); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete_on_blur_delegate.SetWindow(d2); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(root_windows[0])->FocusWindow(d2); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker.Add(d2); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("600x600"); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // d2 must have been deleted. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tracker.Contains(d2)); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[0], normal->GetNativeView()->GetRootWindow()); 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("100,20 100x100", normal->GetWindowBoundsInScreen().ToString()); 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("100,20 100x100", 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal->GetNativeView()->GetBoundsInRootWindow().ToString()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Maximized area on primary display has 3px (given as 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // kAutoHideSize in shelf_layout_manager.cc) inset at the bottom. 211a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 212a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // First clear fullscreen status, since both fullscreen and maximized windows 213a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // share the same desktop workspace, which cancels the shelf status. 214a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch fullscreen->SetFullscreen(false); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[0], maximized->GetNativeView()->GetRootWindow()); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 600x597", 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximized->GetWindowBoundsInScreen().ToString()); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 600x597", 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximized->GetNativeView()->GetBoundsInRootWindow().ToString()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 221a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Set fullscreen to true. In that case the 3px inset becomes invisible so 222a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // the maximized window can also use the area fully. 223a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch fullscreen->SetFullscreen(true); 224a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EXPECT_EQ(root_windows[0], maximized->GetNativeView()->GetRootWindow()); 225a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EXPECT_EQ("0,0 600x600", 226a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch maximized->GetWindowBoundsInScreen().ToString()); 227a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EXPECT_EQ("0,0 600x600", 228a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch maximized->GetNativeView()->GetBoundsInRootWindow().ToString()); 229a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[0], minimized->GetNativeView()->GetRootWindow()); 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("400,20 100x100", 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minimized->GetWindowBoundsInScreen().ToString()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[0], fullscreen->GetNativeView()->GetRootWindow()); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fullscreen->IsFullscreen()); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 600x600", 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen->GetWindowBoundsInScreen().ToString()); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 600x600", 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen->GetNativeView()->GetBoundsInRootWindow().ToString()); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test if the restore bounds are correctly updated. 24268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) wm::GetWindowState(maximized->GetNativeView())->Restore(); 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("200,20 100x100", maximized->GetWindowBoundsInScreen().ToString()); 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("200,20 100x100", 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maximized->GetNativeView()->GetBoundsInRootWindow().ToString()); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen->SetFullscreen(false); 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("500,20 100x100", 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen->GetWindowBoundsInScreen().ToString()); 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("500,20 100x100", 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen->GetNativeView()->GetBoundsInRootWindow().ToString()); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test if the unparented widget has moved. 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(root_windows[0], 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unparented_control->GetNativeView()->GetRootWindow()); 256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(kShellWindowId_UnparentedControlContainer, 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unparented_control->GetNativeView()->parent()->id()); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test if the panel has moved. 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(root_windows[0], panel->GetRootWindow()); 261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(kShellWindowId_PanelContainer, panel->parent()->id()); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(RootWindowControllerTest, MoveWindows_Modal) { 2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("500x500,500x500"); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window::Windows root_windows = Shell::GetAllRootWindows(); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Emulate virtual screen coordinate system. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_windows[0]->SetBounds(gfx::Rect(0, 0, 500, 500)); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_windows[1]->SetBounds(gfx::Rect(500, 0, 500, 500)); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* normal = CreateTestWidget(gfx::Rect(300, 10, 100, 100)); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[0], normal->GetNativeView()->GetRootWindow()); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(normal->GetNativeView())); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* modal = CreateModalWidget(gfx::Rect(650, 10, 100, 100)); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[1], modal->GetNativeView()->GetRootWindow()); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetModalContainer(root_windows[1])->Contains( 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modal->GetNativeView())); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(modal->GetNativeView())); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator_1st(root_windows[0]); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator_1st.ClickLeftButton(); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(modal->GetNativeView())); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("500x500"); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(root_windows[0], modal->GetNativeView()->GetRootWindow()); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(modal->GetNativeView())); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator_1st.ClickLeftButton(); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(modal->GetNativeView())); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RootWindowControllerTest, ModalContainer) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("600x600"); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell* shell = Shell::GetInstance(); 299c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RootWindowController* controller = shell->GetPrimaryRootWindowController(); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(user::LOGGED_IN_USER, 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shell->system_tray_delegate()->GetUserLoginStatus()); 302a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(controller->GetContainer(kShellWindowId_SystemModalContainer) 303c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ->layout_manager(), 304c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller->GetSystemModalLayoutManager(NULL)); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* session_modal_widget = 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateModalWidget(gfx::Rect(300, 10, 100, 100)); 308a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(controller->GetContainer(kShellWindowId_SystemModalContainer) 309c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ->layout_manager(), 310c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller->GetSystemModalLayoutManager( 311c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch session_modal_widget->GetNativeView())); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell->session_state_delegate()->LockScreen(); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(user::LOGGED_IN_LOCKED, 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shell->system_tray_delegate()->GetUserLoginStatus()); 316a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(controller->GetContainer(kShellWindowId_LockSystemModalContainer) 317c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ->layout_manager(), 318c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller->GetSystemModalLayoutManager(NULL)); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 320a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch aura::Window* lock_container = 321a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch controller->GetContainer(kShellWindowId_LockScreenContainer); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* lock_modal_widget = 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateModalWidgetWithParent(gfx::Rect(300, 10, 100, 100), lock_container); 324a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(controller->GetContainer(kShellWindowId_LockSystemModalContainer) 325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ->layout_manager(), 326c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller->GetSystemModalLayoutManager( 327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch lock_modal_widget->GetNativeView())); 328a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(controller->GetContainer(kShellWindowId_SystemModalContainer) 329c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ->layout_manager(), 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller->GetSystemModalLayoutManager( 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_modal_widget->GetNativeView())); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shell->session_state_delegate()->UnlockScreen(); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RootWindowControllerTest, ModalContainerNotLoggedInLoggedIn) { 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x600"); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell* shell = Shell::GetInstance(); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Configure login screen environment. 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserLoggedIn(false); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(user::LOGGED_IN_NONE, 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shell->system_tray_delegate()->GetUserLoginStatus()); 34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0, shell->session_state_delegate()->NumberOfLoggedInUsers()); 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(shell->session_state_delegate()->IsActiveUserSessionStarted()); 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 347c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RootWindowController* controller = shell->GetPrimaryRootWindowController(); 348a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(controller->GetContainer(kShellWindowId_LockSystemModalContainer) 349c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ->layout_manager(), 350c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller->GetSystemModalLayoutManager(NULL)); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch aura::Window* lock_container = 353a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch controller->GetContainer(kShellWindowId_LockScreenContainer); 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget* login_modal_widget = 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateModalWidgetWithParent(gfx::Rect(300, 10, 100, 100), lock_container); 356a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(controller->GetContainer(kShellWindowId_LockSystemModalContainer) 357c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ->layout_manager(), 358c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller->GetSystemModalLayoutManager( 359c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch login_modal_widget->GetNativeView())); 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) login_modal_widget->Close(); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Configure user session environment. 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserLoggedIn(true); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetSessionStarted(true); 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(user::LOGGED_IN_USER, 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shell->system_tray_delegate()->GetUserLoginStatus()); 36790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1, shell->session_state_delegate()->NumberOfLoggedInUsers()); 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(shell->session_state_delegate()->IsActiveUserSessionStarted()); 369a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(controller->GetContainer(kShellWindowId_SystemModalContainer) 370c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ->layout_manager(), 371c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller->GetSystemModalLayoutManager(NULL)); 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget* session_modal_widget = 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateModalWidget(gfx::Rect(300, 10, 100, 100)); 375a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(controller->GetContainer(kShellWindowId_SystemModalContainer) 376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ->layout_manager(), 377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller->GetSystemModalLayoutManager( 378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch session_modal_widget->GetNativeView())); 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 381bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(RootWindowControllerTest, ModalContainerBlockedSession) { 382bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch UpdateDisplay("600x600"); 383bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch Shell* shell = Shell::GetInstance(); 384c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RootWindowController* controller = shell->GetPrimaryRootWindowController(); 385a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch aura::Window* lock_container = 386a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch controller->GetContainer(kShellWindowId_LockScreenContainer); 387bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch for (int block_reason = FIRST_BLOCK_REASON; 388bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch block_reason < NUMBER_OF_BLOCK_REASONS; 389bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ++block_reason) { 390bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch views::Widget* session_modal_widget = 391bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch CreateModalWidget(gfx::Rect(300, 10, 100, 100)); 392a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(controller->GetContainer(kShellWindowId_SystemModalContainer) 393c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ->layout_manager(), 394c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller->GetSystemModalLayoutManager( 395c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch session_modal_widget->GetNativeView())); 396a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(controller->GetContainer(kShellWindowId_SystemModalContainer) 397c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ->layout_manager(), 398c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller->GetSystemModalLayoutManager(NULL)); 399bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch session_modal_widget->Close(); 400bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 401bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch BlockUserSession(static_cast<UserSessionBlockReason>(block_reason)); 402bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 403a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(controller->GetContainer(kShellWindowId_LockSystemModalContainer) 404c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ->layout_manager(), 405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller->GetSystemModalLayoutManager(NULL)); 406bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 407bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch views::Widget* lock_modal_widget = 408bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch CreateModalWidgetWithParent(gfx::Rect(300, 10, 100, 100), 409bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch lock_container); 410a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(controller->GetContainer(kShellWindowId_LockSystemModalContainer) 411c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ->layout_manager(), 412bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch controller->GetSystemModalLayoutManager( 413bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch lock_modal_widget->GetNativeView())); 414bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 415bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch session_modal_widget = 416bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch CreateModalWidget(gfx::Rect(300, 10, 100, 100)); 417a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(controller->GetContainer(kShellWindowId_SystemModalContainer) 418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ->layout_manager(), 419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch controller->GetSystemModalLayoutManager( 420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch session_modal_widget->GetNativeView())); 421bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch session_modal_widget->Close(); 422bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 423bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch lock_modal_widget->Close(); 424bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch UnblockUserSession(); 425bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 426bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 427bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(RootWindowControllerTest, GetWindowForFullscreenMode) { 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x600"); 430c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RootWindowController* controller = 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->GetPrimaryRootWindowController(); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Widget* w1 = CreateTestWidget(gfx::Rect(0, 0, 100, 100)); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) w1->Maximize(); 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Widget* w2 = CreateTestWidget(gfx::Rect(0, 0, 100, 100)); 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) w2->SetFullscreen(true); 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |w3| is a transient child of |w2|. 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Widget* w3 = Widget::CreateWindowWithParentAndBounds(NULL, 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) w2->GetNativeWindow(), gfx::Rect(0, 0, 100, 100)); 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Test that GetWindowForFullscreenMode() finds the fullscreen window when one 44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // of its transient children is active. 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) w3->Activate(); 444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(w2->GetNativeWindow(), controller->GetWindowForFullscreenMode()); 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If the topmost window is not fullscreen, it returns NULL. 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) w1->Activate(); 448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(NULL, controller->GetWindowForFullscreenMode()); 449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) w1->Close(); 450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) w3->Close(); 45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Only w2 remains, if minimized GetWindowForFullscreenMode should return 453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // NULL. 45458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) w2->Activate(); 455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(w2->GetNativeWindow(), controller->GetWindowForFullscreenMode()); 456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) w2->Minimize(); 457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(NULL, controller->GetWindowForFullscreenMode()); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(RootWindowControllerTest, MultipleDisplaysGetWindowForFullscreenMode) { 461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!SupportsMultipleDisplays()) 462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) UpdateDisplay("600x600,600x600"); 465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Shell::RootWindowControllerList controllers = 466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Shell::GetInstance()->GetAllRootWindowControllers(); 467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Widget* w1 = CreateTestWidget(gfx::Rect(0, 0, 100, 100)); 469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) w1->Maximize(); 470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Widget* w2 = CreateTestWidget(gfx::Rect(0, 0, 100, 100)); 471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) w2->SetFullscreen(true); 472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Widget* w3 = CreateTestWidget(gfx::Rect(600, 0, 100, 100)); 473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(w1->GetNativeWindow()->GetRootWindow(), 475a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch controllers[0]->GetRootWindow()); 476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(w2->GetNativeWindow()->GetRootWindow(), 477a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch controllers[0]->GetRootWindow()); 478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(w3->GetNativeWindow()->GetRootWindow(), 479a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch controllers[1]->GetRootWindow()); 480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) w1->Activate(); 482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(NULL, controllers[0]->GetWindowForFullscreenMode()); 483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(NULL, controllers[1]->GetWindowForFullscreenMode()); 484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) w2->Activate(); 486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(w2->GetNativeWindow(), 487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controllers[0]->GetWindowForFullscreenMode()); 488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(NULL, controllers[1]->GetWindowForFullscreenMode()); 489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify that the first root window controller remains in fullscreen mode 491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // when a window on the other display is activated. 492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) w3->Activate(); 493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(w2->GetNativeWindow(), 494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) controllers[0]->GetWindowForFullscreenMode()); 495a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(NULL, controllers[1]->GetWindowForFullscreenMode()); 496a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 498ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Test that user session window can't be focused if user session blocked by 499ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// some overlapping UI. 500ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(RootWindowControllerTest, FocusBlockedWindow) { 501ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UpdateDisplay("600x600"); 502c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RootWindowController* controller = 503ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch Shell::GetInstance()->GetPrimaryRootWindowController(); 504a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch aura::Window* lock_container = 505a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch controller->GetContainer(kShellWindowId_LockScreenContainer); 506ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch aura::Window* lock_window = Widget::CreateWindowWithParentAndBounds(NULL, 507ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch lock_container, gfx::Rect(0, 0, 100, 100))->GetNativeView(); 508ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch lock_window->Show(); 509ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch aura::Window* session_window = 510ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch CreateTestWidget(gfx::Rect(0, 0, 100, 100))->GetNativeView(); 511ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch session_window->Show(); 512ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 513bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch for (int block_reason = FIRST_BLOCK_REASON; 514bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch block_reason < NUMBER_OF_BLOCK_REASONS; 515bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ++block_reason) { 516bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch BlockUserSession(static_cast<UserSessionBlockReason>(block_reason)); 517bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch lock_window->Focus(); 518bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_TRUE(lock_window->HasFocus()); 519bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch session_window->Focus(); 520bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_FALSE(session_window->HasFocus()); 521bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch UnblockUserSession(); 522bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 523ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 524ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 5254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Tracks whether OnWindowDestroying() has been invoked. 5264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class DestroyedWindowObserver : public aura::WindowObserver { 5274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DestroyedWindowObserver() : destroyed_(false), window_(NULL) {} 5294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual ~DestroyedWindowObserver() { 5304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shutdown(); 5314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 5324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void SetWindow(Window* window) { 5344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_ = window; 5354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window->AddObserver(this); 5364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 5374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool destroyed() const { return destroyed_; } 5394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // WindowObserver overrides: 5414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void OnWindowDestroying(Window* window) OVERRIDE { 5424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) destroyed_ = true; 5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shutdown(); 5444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 5454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void Shutdown() { 5484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!window_) 5494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 5504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_->RemoveObserver(this); 5514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_ = NULL; 5524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 5534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool destroyed_; 5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Window* window_; 5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DestroyedWindowObserver); 5584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 5594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Verifies shutdown doesn't delete windows that are not owned by the parent. 5614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(RootWindowControllerTest, DontDeleteWindowsNotOwnedByParent) { 5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DestroyedWindowObserver observer1; 5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::test::TestWindowDelegate delegate1; 5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::Window* window1 = new aura::Window(&delegate1); 5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window1->SetType(ui::wm::WINDOW_TYPE_CONTROL); 5664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window1->set_owned_by_parent(false); 5674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) observer1.SetWindow(window1); 5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window1->Init(aura::WINDOW_LAYER_NOT_DRAWN); 5691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::client::ParentWindowWithContext( 5701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) window1, Shell::GetInstance()->GetPrimaryRootWindow(), gfx::Rect()); 5714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DestroyedWindowObserver observer2; 5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::Window* window2 = new aura::Window(NULL); 5744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window2->set_owned_by_parent(false); 5754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) observer2.SetWindow(window2); 5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window2->Init(aura::WINDOW_LAYER_NOT_DRAWN); 5774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shell::GetInstance()->GetPrimaryRootWindow()->AddChild(window2); 5784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shell::GetInstance()->GetPrimaryRootWindowController()->CloseChildWindows(); 5804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_FALSE(observer1.destroyed()); 5824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delete window1; 5834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_FALSE(observer2.destroyed()); 5854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delete window2; 5864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 588bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochtypedef test::NoSessionAshTestBase NoSessionRootWindowControllerTest; 589bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 590bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Make sure that an event handler exists for entire display area. 591bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochTEST_F(NoSessionRootWindowControllerTest, Event) { 592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Hide the shelf since it might otherwise get an event target. 593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RootWindowController* controller = Shell::GetPrimaryRootWindowController(); 594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ShelfLayoutManager* shelf_layout_manager = 595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) controller->GetShelfLayoutManager(); 596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) shelf_layout_manager->SetAutoHideBehavior( 597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN); 598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = Shell::GetPrimaryRootWindow(); 600bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const gfx::Size size = root->bounds().size(); 601bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch aura::Window* event_target = root->GetEventHandlerForPoint(gfx::Point(0, 0)); 602bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch EXPECT_TRUE(event_target); 603bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch EXPECT_EQ(event_target, 604bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch root->GetEventHandlerForPoint(gfx::Point(0, size.height() - 1))); 605bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch EXPECT_EQ(event_target, 606bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch root->GetEventHandlerForPoint(gfx::Point(size.width() - 1, 0))); 607bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch EXPECT_EQ(event_target, 608bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch root->GetEventHandlerForPoint(gfx::Point(0, size.height() - 1))); 609bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch EXPECT_EQ(event_target, 610bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch root->GetEventHandlerForPoint( 611bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch gfx::Point(size.width() - 1, size.height() - 1))); 612bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 613bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 6145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class VirtualKeyboardRootWindowControllerTest 6155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : public RootWindowControllerTest { 6163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 6173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) VirtualKeyboardRootWindowControllerTest() {}; 6183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual ~VirtualKeyboardRootWindowControllerTest() {}; 6193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void SetUp() OVERRIDE { 6213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch( 6223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) keyboard::switches::kEnableVirtualKeyboard); 6233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) test::AshTestBase::SetUp(); 6241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetPrimaryRootWindowController()->ActivateKeyboard( 625c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch keyboard::KeyboardController::GetInstance()); 6263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 6273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 6293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VirtualKeyboardRootWindowControllerTest); 6303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 6313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class MockTextInputClient : public ui::DummyTextInputClient { 633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MockTextInputClient() : 635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::DummyTextInputClient(ui::TEXT_INPUT_TYPE_TEXT) {} 636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void EnsureCaretInRect(const gfx::Rect& rect) OVERRIDE { 638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) visible_rect_ = rect; 639cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 640cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 641cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const gfx::Rect& visible_rect() const { 642cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return visible_rect_; 643cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::Rect visible_rect_; 647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockTextInputClient); 649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass TargetHitTestEventHandler : public ui::test::TestEventHandler { 6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TargetHitTestEventHandler() {} 6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ui::test::TestEventHandler overrides. 6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { 6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (event->type() == ui::ET_MOUSE_PRESSED) 6581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::test::TestEventHandler::OnMouseEvent(event); 6591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event->StopPropagation(); 6601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 6611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(TargetHitTestEventHandler); 6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Test for http://crbug.com/297858. Virtual keyboard container should only show 6674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// on primary root window. 6684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(VirtualKeyboardRootWindowControllerTest, 6694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) VirtualKeyboardOnPrimaryRootWindowOnly) { 6704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!SupportsMultipleDisplays()) 6714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 6724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateDisplay("500x500,500x500"); 6744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window::Windows root_windows = Shell::GetAllRootWindows(); 6761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* primary_root_window = Shell::GetPrimaryRootWindow(); 6771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* secondary_root_window = 6784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_windows[0] == primary_root_window ? 6794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_windows[1] : root_windows[0]; 6804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 681c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(Shell::GetContainer(primary_root_window, 682c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch kShellWindowId_VirtualKeyboardContainer)); 683c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_FALSE(Shell::GetContainer(secondary_root_window, 684c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch kShellWindowId_VirtualKeyboardContainer)); 6854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 6864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Test for http://crbug.com/263599. Virtual keyboard should be able to receive 6883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// events at blocked user session. 6893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(VirtualKeyboardRootWindowControllerTest, 6903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ClickVirtualKeyboardInBlockedWindow) { 6911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 692c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch aura::Window* keyboard_container = 693c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Shell::GetContainer(root_window, kShellWindowId_VirtualKeyboardContainer); 6943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(keyboard_container); 6953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) keyboard_container->Show(); 6963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 697c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch aura::Window* keyboard_window = keyboard::KeyboardController::GetInstance()-> 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) proxy()->GetKeyboardWindow(); 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keyboard_container->AddChild(keyboard_window); 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keyboard_window->set_owned_by_parent(false); 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keyboard_window->SetBounds(gfx::Rect()); 7023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) keyboard_window->Show(); 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ui::test::TestEventHandler handler; 7050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch root_window->AddPreTargetHandler(&handler); 7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator event_generator(root_window, keyboard_window); 7083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) event_generator.ClickLeftButton(); 7093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int expected_mouse_presses = 1; 7100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(expected_mouse_presses, handler.num_mouse_events() / 2); 7113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 7123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (int block_reason = FIRST_BLOCK_REASON; 7133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) block_reason < NUMBER_OF_BLOCK_REASONS; 7143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ++block_reason) { 7153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) BlockUserSession(static_cast<UserSessionBlockReason>(block_reason)); 7163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) event_generator.ClickLeftButton(); 7173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) expected_mouse_presses++; 7180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(expected_mouse_presses, handler.num_mouse_events() / 2); 7193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UnblockUserSession(); 7203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 7210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch root_window->RemovePreTargetHandler(&handler); 7223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 7233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 7244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Test for http://crbug.com/299787. RootWindowController should delete 7254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// the old container since the keyboard controller creates a new window in 7264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// GetWindowContainer(). 7274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(VirtualKeyboardRootWindowControllerTest, 7284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DeleteOldContainerOnVirtualKeyboardInit) { 7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 730c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch aura::Window* keyboard_container = 731c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Shell::GetContainer(root_window, kShellWindowId_VirtualKeyboardContainer); 7324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_TRUE(keyboard_container); 7334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Track the keyboard container window. 7344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::WindowTracker tracker; 7354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) tracker.Add(keyboard_container); 736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Mock a login user profile change to reinitialize the keyboard. 737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ash::Shell::GetInstance()->OnLoginUserProfilePrepared(); 7384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // keyboard_container should no longer be present. 7394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(tracker.Contains(keyboard_container)); 7404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 7414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test for crbug.com/342524. After user login, the work space should restore to 7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// full screen. 7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(VirtualKeyboardRootWindowControllerTest, RestoreWorkspaceAfterLogin) { 7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 746c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch aura::Window* keyboard_container = 747c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Shell::GetContainer(root_window, kShellWindowId_VirtualKeyboardContainer); 7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keyboard_container->Show(); 7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keyboard::KeyboardController* controller = 750c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch keyboard::KeyboardController::GetInstance(); 7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::Window* keyboard_window = controller->proxy()->GetKeyboardWindow(); 7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keyboard_container->AddChild(keyboard_window); 7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keyboard_window->set_owned_by_parent(false); 7540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch keyboard_window->SetBounds(keyboard::KeyboardBoundsFromWindowBounds( 7550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch keyboard_container->bounds(), 100)); 7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keyboard_window->Show(); 7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect before = ash::Shell::GetScreen()->GetPrimaryDisplay().work_area(); 7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify keyboard bounds changing. 7615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller->NotifyKeyboardBoundsChanging( 7625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller->proxy()->GetKeyboardWindow()->bounds()); 7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!keyboard::IsKeyboardOverscrollEnabled()) { 7655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gfx::Rect after = ash::Shell::GetScreen()->GetPrimaryDisplay().work_area(); 7665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_LT(after, before); 7675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 7685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Mock a login user profile change to reinitialize the keyboard. 7705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::Shell::GetInstance()->OnLoginUserProfilePrepared(); 7715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ash::Shell::GetScreen()->GetPrimaryDisplay().work_area(), before); 7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 774e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Ensure that system modal dialogs do not block events targeted at the virtual 775e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// keyboard. 776e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochTEST_F(VirtualKeyboardRootWindowControllerTest, ClickWithActiveModalDialog) { 777e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch aura::Window* root_window = Shell::GetPrimaryRootWindow(); 778c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch aura::Window* keyboard_container = 779c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Shell::GetContainer(root_window, kShellWindowId_VirtualKeyboardContainer); 780e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ASSERT_TRUE(keyboard_container); 781e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch keyboard_container->Show(); 782e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 783c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch aura::Window* keyboard_window = keyboard::KeyboardController::GetInstance()-> 784e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch proxy()->GetKeyboardWindow(); 785e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch keyboard_container->AddChild(keyboard_window); 786e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch keyboard_window->set_owned_by_parent(false); 7870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch keyboard_window->SetBounds(keyboard::KeyboardBoundsFromWindowBounds( 7880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch keyboard_container->bounds(), 100)); 789e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 7900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ui::test::TestEventHandler handler; 7910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch root_window->AddPreTargetHandler(&handler); 7925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator root_window_event_generator(root_window); 7935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator keyboard_event_generator(root_window, 7945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) keyboard_window); 795e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 796e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch views::Widget* modal_widget = 797e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch CreateModalWidget(gfx::Rect(300, 10, 100, 100)); 798e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 799e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Verify that mouse events to the root window are block with a visble modal 800e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // dialog. 801e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch root_window_event_generator.ClickLeftButton(); 8020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(0, handler.num_mouse_events()); 803e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 804e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Verify that event dispatch to the virtual keyboard is unblocked. 805e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch keyboard_event_generator.ClickLeftButton(); 8060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(1, handler.num_mouse_events() / 2); 807e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 808e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch modal_widget->Close(); 809e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 810e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Verify that mouse events are now unblocked to the root window. 811e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch root_window_event_generator.ClickLeftButton(); 8120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(2, handler.num_mouse_events() / 2); 8130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch root_window->RemovePreTargetHandler(&handler); 814e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 815e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 816cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Ensure that the visible area for scrolling the text caret excludes the 817cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// region occluded by the on-screen keyboard. 818cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(VirtualKeyboardRootWindowControllerTest, EnsureCaretInWorkArea) { 819cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard::KeyboardController* keyboard_controller = 820cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard::KeyboardController::GetInstance(); 821cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard::KeyboardControllerProxy* proxy = keyboard_controller->proxy(); 822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 823cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MockTextInputClient text_input_client; 824cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::InputMethod* input_method = proxy->GetInputMethod(); 825cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(input_method); 826f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (switches::IsTextInputFocusManagerEnabled()) { 827f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ui::TextInputFocusManager::GetInstance()->FocusTextInputClient( 828f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &text_input_client); 829f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 830f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) input_method->SetFocusedTextInputClient(&text_input_client); 831f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 832cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 833cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 834cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) aura::Window* keyboard_container = 835cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Shell::GetContainer(root_window, kShellWindowId_VirtualKeyboardContainer); 836cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(keyboard_container); 837cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard_container->Show(); 838cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 839cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int keyboard_height = 100; 840cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) aura::Window* keyboard_window =proxy->GetKeyboardWindow(); 841cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard_container->AddChild(keyboard_window); 842cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard_window->set_owned_by_parent(false); 843cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard_window->SetBounds(keyboard::KeyboardBoundsFromWindowBounds( 844cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard_container->bounds(), keyboard_height)); 845cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 846cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) proxy->EnsureCaretInWorkArea(); 847cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(keyboard_container->bounds().width(), 848cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) text_input_client.visible_rect().width()); 849cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(keyboard_container->bounds().height() - keyboard_height, 850cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) text_input_client.visible_rect().height()); 851f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 852f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (switches::IsTextInputFocusManagerEnabled()) { 853f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ui::TextInputFocusManager::GetInstance()->BlurTextInputClient( 854f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &text_input_client); 855f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 856f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) input_method->SetFocusedTextInputClient(NULL); 857f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 858cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 859cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 8601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that the virtual keyboard does not block context menus. The virtual 8611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// keyboard should appear in front of most content, but not context menus. See 8621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// crbug/377180. 8631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(VirtualKeyboardRootWindowControllerTest, ZOrderTest) { 8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci UpdateDisplay("800x600"); 8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci keyboard::KeyboardController* keyboard_controller = 8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci keyboard::KeyboardController::GetInstance(); 8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci keyboard::KeyboardControllerProxy* proxy = keyboard_controller->proxy(); 8681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aura::Window* root_window = Shell::GetPrimaryRootWindow(); 8701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aura::Window* keyboard_container = 8711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Shell::GetContainer(root_window, kShellWindowId_VirtualKeyboardContainer); 8721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(keyboard_container); 8731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci keyboard_container->Show(); 8741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int keyboard_height = 200; 8761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aura::Window* keyboard_window = proxy->GetKeyboardWindow(); 8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci keyboard_container->AddChild(keyboard_window); 8781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci keyboard_window->set_owned_by_parent(false); 8791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect keyboard_bounds = keyboard::KeyboardBoundsFromWindowBounds( 8801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci keyboard_container->bounds(), keyboard_height); 8811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci keyboard_window->SetBounds(keyboard_bounds); 8821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci keyboard_window->Show(); 8831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::test::EventGenerator generator(root_window); 8851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Cover the screen with two windows: a normal window on the left side and a 8871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // context menu on the right side. When the virtual keyboard is displayed it 8881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // partially occludes the normal window, but not the context menu. Compute 8891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // positions for generating synthetic click events to perform hit tests, 8901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ensuring the correct window layering. 'top' is above the VK, whereas 8911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // 'bottom' lies within the VK. 'left' is centered in the normal window, and 8921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // 'right' is centered in the context menu. 8931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int window_height = keyboard_bounds.bottom(); 8941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int window_width = keyboard_bounds.width() / 2; 8951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int left = window_width / 2; 8961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int right = 3 * window_width / 2; 8971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int top = keyboard_bounds.y() / 2; 8981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int bottom = window_height - keyboard_height / 2; 8991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Normal window is partially occluded by the virtual keyboard. 9011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aura::test::TestWindowDelegate delegate; 9021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::Window> normal(CreateTestWindowInShellWithDelegateAndType( 9031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &delegate, 9041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::wm::WINDOW_TYPE_NORMAL, 9051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, 9061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect(0, 0, window_width, window_height))); 9071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci normal->set_owned_by_parent(false); 9081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci normal->Show(); 9091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TargetHitTestEventHandler normal_handler; 9101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci normal->AddPreTargetHandler(&normal_handler); 9111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Test that only the click on the top portion of the window is picked up. The 9131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // click on the bottom hits the virtual keyboard instead. 9141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci generator.MoveMouseTo(left, top); 9151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci generator.ClickLeftButton(); 9161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, normal_handler.num_mouse_events()); 9171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci generator.MoveMouseTo(left, bottom); 9181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci generator.ClickLeftButton(); 9191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, normal_handler.num_mouse_events()); 9201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Menu overlaps virtual keyboard. 9221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aura::test::TestWindowDelegate delegate2; 9231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::Window> menu(CreateTestWindowInShellWithDelegateAndType( 9241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &delegate2, 9251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::wm::WINDOW_TYPE_MENU, 9261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, 9271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect(window_width, 0, window_width, window_height))); 9281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci menu->set_owned_by_parent(false); 9291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci menu->Show(); 9301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TargetHitTestEventHandler menu_handler; 9311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci menu->AddPreTargetHandler(&menu_handler); 9321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Test that both clicks register. 9341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci generator.MoveMouseTo(right, top); 9351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci generator.ClickLeftButton(); 9361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, menu_handler.num_mouse_events()); 9371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci generator.MoveMouseTo(right, bottom); 9381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci generator.ClickLeftButton(); 9391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2, menu_handler.num_mouse_events()); 9401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Cleanup to ensure that the test windows are destroyed before their 9421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // delegates. 9431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci normal.reset(); 9441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci menu.reset(); 9451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 9461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 94734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)// Resolution in UpdateDisplay is not being respected on Windows 8. 94834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#if defined(OS_WIN) 94934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define MAYBE_DisplayRotation DISABLED_DisplayRotation 95034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#else 95134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define MAYBE_DisplayRotation DisplayRotation 95234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif 95334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 95434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)// Tests that the virtual keyboard correctly resizes with a change to display 95534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)// orientation. See crbug/417612. 95634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)TEST_F(VirtualKeyboardRootWindowControllerTest, MAYBE_DisplayRotation) { 95734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) UpdateDisplay("800x600"); 95834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 95934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) aura::Window* keyboard_container = 96034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) Shell::GetContainer(root_window, kShellWindowId_VirtualKeyboardContainer); 96134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) ASSERT_TRUE(keyboard_container); 96234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) keyboard_container->Show(); 96334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) EXPECT_EQ("0,0 800x600", keyboard_container->bounds().ToString()); 96434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 96534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) UpdateDisplay("600x800"); 96634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) EXPECT_EQ("0,0 600x800", keyboard_container->bounds().ToString()); 96734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} 96834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 971