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