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)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/window_modality_controller.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ash/test/child_modal_window.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_windows.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_types.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/event_generator.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/test/capture_tracking_view.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/window_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef test::AshTestBase WindowModalityControllerTest;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ValidateStacking(aura::Window* parent, int ids[], int count) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < count; ++i) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent->children().at(i)->id() != ids[i])
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates three windows, w1, w11, and w12. w11 is a non-modal transient, w12 is
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a modal transient.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Validates:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - it should be possible to activate w12 even when w11 is open.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - activating w1 activates w12 and updates stacking order appropriately.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - closing a window passes focus up the stack.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowModalityControllerTest, BasicActivation) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::TestWindowDelegate d;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -1, gfx::Rect()));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w11(
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -11, gfx::Rect()));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w12(
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -12, gfx::Rect()));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::wm::AddTransientChild(w1.get(), w11.get());
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(w1.get());
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w1.get()));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(w11.get());
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w11.get()));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w12->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW);
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::wm::AddTransientChild(w1.get(), w12.get());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(w12.get());
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w12.get()));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(w11.get());
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w11.get()));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int check1[] = { -1, -12, -11 };
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ValidateStacking(w1->parent(), check1, arraysize(check1)));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(w1.get());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w12.get()));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transient children are always stacked above their transient parent, which
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is why this order is not -11, -1, -12.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int check2[] = { -1, -11, -12 };
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ValidateStacking(w1->parent(), check2, arraysize(check2)));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w12.reset();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w11.get()));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w11.reset();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w1.get()));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create two toplevel windows w1 and w2, and nest two modals w11 and w111 below
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// w1.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Validates:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - activating w1 while w11/w111 is showing always activates most deeply nested
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   descendant.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - closing a window passes focus up the stack.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowModalityControllerTest, NestedModals) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::TestWindowDelegate d;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -1, gfx::Rect()));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w11(
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -11, gfx::Rect()));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w111(
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -111, gfx::Rect()));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w2(
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -2, gfx::Rect()));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::wm::AddTransientChild(w1.get(), w11.get());
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::wm::AddTransientChild(w11.get(), w111.get());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(w1.get());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w1.get()));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(w2.get());
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w2.get()));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up modality.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w11->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w111->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(w1.get());
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w111.get()));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int check1[] = { -2, -1, -11, -111 };
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ValidateStacking(w1->parent(), check1, arraysize(check1)));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(w11.get());
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w111.get()));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ValidateStacking(w1->parent(), check1, arraysize(check1)));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(w111.get());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w111.get()));
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ValidateStacking(w1->parent(), check1, arraysize(check1)));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(w2.get());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w2.get()));
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int check2[] = { -1, -11, -111, -2 };
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ValidateStacking(w1->parent(), check2, arraysize(check2)));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w2.reset();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w111.get()));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w111.reset();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w11.get()));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w11.reset();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w1.get()));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create two toplevel windows w1 and w2, and nest two modals w11 and w111 below
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// w1.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Validates:
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - destroying w11 while w111 is focused activates w1.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowModalityControllerTest, NestedModalsOuterClosed) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::TestWindowDelegate d;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -1, gfx::Rect()));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w11(
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -11, gfx::Rect()));
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |w111| will be owned and deleted by |w11|.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* w111 =
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -111, gfx::Rect());
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w2(
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -2, gfx::Rect()));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::wm::AddTransientChild(w1.get(), w11.get());
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::wm::AddTransientChild(w11.get(), w111);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(w1.get());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w1.get()));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(w2.get());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w2.get()));
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up modality.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w11->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w111->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(w1.get());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w111));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w111->Hide();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w11.get()));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(oshima): Re-showing doesn't set the focus back to
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // modal window. There is no such use case right now, but it
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // probably should.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w11.reset();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w1.get()));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Modality also prevents events from being passed to the transient parent.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowModalityControllerTest, Events) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::TestWindowDelegate d;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateTestWindowInShellWithDelegate(&d, -1,
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect(0, 0, 100, 100)));
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> w11(CreateTestWindowInShellWithDelegate(&d, -11,
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect(20, 20, 50, 50)));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::wm::AddTransientChild(w1.get(), w11.get());
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Clicking a point within w1 should activate that window.
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       gfx::Point(10, 10));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.ClickLeftButton();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(wm::IsActiveWindow(w1.get()));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w11->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Clicking a point within w1 should activate w11.
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       gfx::Point(10, 10));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.ClickLeftButton();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(wm::IsActiveWindow(w11.get()));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Events on modal parent activate.
2105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(WindowModalityControllerTest, EventsForEclipsedWindows) {
2115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  aura::test::TestWindowDelegate d;
2125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<aura::Window> w1(CreateTestWindowInShellWithDelegate(&d, -1,
2135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      gfx::Rect(0, 0, 100, 100)));
2145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<aura::Window> w11(CreateTestWindowInShellWithDelegate(&d, -11,
2155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      gfx::Rect(20, 20, 50, 50)));
2165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ::wm::AddTransientChild(w1.get(), w11.get());
2175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<aura::Window> w2(CreateTestWindowInShellWithDelegate(&d, -2,
2185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      gfx::Rect(0, 0, 50, 50)));
2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  w11->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW);
2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Partially eclipse w1 with w2.
2235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  wm::ActivateWindow(w2.get());
2245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {
2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // Clicking a point on w1 that is not eclipsed by w2.
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       gfx::Point(90, 90));
2285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    generator.ClickLeftButton();
2295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_TRUE(wm::IsActiveWindow(w11.get()));
2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates windows w1 and non activatiable child w11. Creates transient window
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// w2 and adds it as a transeint child of w1. Ensures that w2 is parented to
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the parent of w1, and that GetModalTransient(w11) returns w2.
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WindowModalityControllerTest, GetModalTransient) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::test::TestWindowDelegate d;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w1(
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -1, gfx::Rect()));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w11(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aura::test::CreateTestWindowWithDelegate(&d, -11, gfx::Rect(), w1.get()));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> w2(
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -2, gfx::Rect()));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w2->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* wt;
247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  wt = ::wm::GetModalTransient(w1.get());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(static_cast<aura::Window*>(NULL), wt);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parent w2 to w1. It should get parented to the parent of w1.
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::wm::AddTransientChild(w1.get(), w2.get());
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, w1->parent()->children().size());
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(-2, w1->parent()->children().at(1)->id());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Request the modal transient window for w1, it should be w2.
256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  wt = ::wm::GetModalTransient(w1.get());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<aura::Window*>(NULL), wt);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(-2, wt->id());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Request the modal transient window for w11, it should also be w2.
261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  wt = ::wm::GetModalTransient(w11.get());
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<aura::Window*>(NULL), wt);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(-2, wt->id());
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies we generate a capture lost when showing a modal window.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowModalityControllerTest, ChangeCapture) {
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* widget = views::Widget::CreateWindowWithContext(
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL, Shell::GetPrimaryRootWindow());
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> widget_window(widget->GetNativeView());
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::test::CaptureTrackingView* view = new views::test::CaptureTrackingView;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->client_view()->AddChildView(view);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->SetBounds(gfx::Rect(0, 0, 200, 200));
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->SetBoundsRect(widget->client_view()->GetLocalBounds());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Show();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point center(view->width() / 2, view->height() / 2);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View::ConvertPointToScreen(view, &center);
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), center);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.PressLeftButton();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(view->got_press());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* modal_widget =
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      views::Widget::CreateWindowWithParent(NULL, widget->GetNativeView());
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> modal_window(modal_widget->GetNativeView());
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modal_window->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW);
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::test::CaptureTrackingView* modal_view =
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new views::test::CaptureTrackingView;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modal_widget->client_view()->AddChildView(modal_view);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modal_widget->SetBounds(gfx::Rect(50, 50, 200, 200));
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modal_view->SetBoundsRect(modal_widget->client_view()->GetLocalBounds());
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modal_widget->Show();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(view->got_capture_lost());
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.ReleaseLeftButton();
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->reset();
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(modal_view->got_capture_lost());
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(modal_view->got_press());
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point modal_center(modal_view->width() / 2, modal_view->height() / 2);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View::ConvertPointToScreen(modal_view, &modal_center);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.MoveMouseTo(modal_center, 1);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  generator.PressLeftButton();
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(modal_view->got_press());
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(modal_view->got_capture_lost());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(view->got_capture_lost());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(view->got_press());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TouchTrackerWindowDelegate : public aura::test::TestWindowDelegate {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  TouchTrackerWindowDelegate()
3158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      : received_touch_(false),
3168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        last_event_type_(ui::ET_UNKNOWN) {
3178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TouchTrackerWindowDelegate() {}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void reset() {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    received_touch_ = false;
3228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    last_event_type_ = ui::ET_UNKNOWN;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool received_touch() const { return received_touch_; }
3268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ui::EventType last_event_type() const { return last_event_type_; }
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from aura::test::TestWindowDelegate.
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    received_touch_ = true;
3328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    last_event_type_ = event->type();
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::TestWindowDelegate::OnTouchEvent(event);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool received_touch_;
3378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ui::EventType last_event_type_;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TouchTrackerWindowDelegate);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Modality should prevent events from being passed to the transient parent.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowModalityControllerTest, TouchEvent) {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TouchTrackerWindowDelegate d1;
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateTestWindowInShellWithDelegate(&d1,
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      -1, gfx::Rect(0, 0, 100, 100)));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TouchTrackerWindowDelegate d11;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> w11(CreateTestWindowInShellWithDelegate(&d11,
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      -11, gfx::Rect(20, 20, 50, 50)));
3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     gfx::Point(10, 10));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::wm::AddTransientChild(w1.get(), w11.get());
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d1.reset();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d11.reset();
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Clicking a point within w1 should activate that window.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    generator.PressMoveAndReleaseTouchTo(gfx::Point(10, 10));
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(wm::IsActiveWindow(w1.get()));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d1.received_touch());
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d11.received_touch());
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // Adding a modal window while a touch is down should fire a touch cancel.
3678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    generator.PressTouch();
3688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    generator.MoveTouch(gfx::Point(10, 10));
3698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    d1.reset();
3708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    d11.reset();
3718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    w11->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW);
3738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    EXPECT_TRUE(d1.received_touch());
3748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    EXPECT_EQ(ui::ET_TOUCH_CANCELLED, d1.last_event_type());
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d11.received_touch());
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Child-modal test.
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates:
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - A |parent| window that hosts a |modal_parent| window within itself. The
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   |parent| and |modal_parent| windows are not the same window.  The
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   |modal_parent| window is not activatable, because it's contained within the
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   |parent| window.
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - A |child| window with parent window |parent|, but is modal to
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   |modal_parent| window.
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Validates:
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - Clicking on the |modal_parent| should activate the |child| window.
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - Clicking on the |parent| window outside of the |modal_parent| bounds should
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   activate the |parent| window.
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - Clicking on the |child| while |parent| is active should activate the
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   |child| window.
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - Focus should follow the active window.
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WindowModalityControllerTest, ChildModal) {
395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test::ChildModalParent* delegate =
396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new test::ChildModalParent(CurrentContext());
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* widget = views::Widget::CreateWindowWithContextAndBounds(
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate, CurrentContext(), gfx::Rect(0, 0, 400, 400));
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->Show();
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* parent = widget->GetNativeView();
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(parent));
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* modal_parent = delegate->GetModalParent();
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(static_cast<aura::Window*>(NULL), modal_parent);
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(parent, modal_parent);
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wm::IsActiveWindow(modal_parent));
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate->ShowChild();
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* child = delegate->GetChild();
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(static_cast<aura::Window*>(NULL), child);
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(child));
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wm::IsActiveWindow(modal_parent));
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wm::IsActiveWindow(parent));
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(child->HasFocus());
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(modal_parent->HasFocus());
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(parent->HasFocus());
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wm::ActivateWindow(modal_parent);
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(child));
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wm::IsActiveWindow(modal_parent));
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wm::IsActiveWindow(parent));
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(child->HasFocus());
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(modal_parent->HasFocus());
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(parent->HasFocus());
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wm::ActivateWindow(parent);
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wm::IsActiveWindow(child));
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wm::IsActiveWindow(modal_parent));
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(parent));
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(child->HasFocus());
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(modal_parent->HasFocus());
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(parent->HasFocus());
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wm::ActivateWindow(child);
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(child));
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wm::IsActiveWindow(modal_parent));
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wm::IsActiveWindow(parent));
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(child->HasFocus());
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(modal_parent->HasFocus());
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(parent->HasFocus());
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Same as |ChildModal| test, but using |EventGenerator| rather than bypassing
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// it by calling |ActivateWindow|.
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WindowModalityControllerTest, ChildModalEventGenerator) {
455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test::ChildModalParent* delegate =
456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new test::ChildModalParent(CurrentContext());
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* widget = views::Widget::CreateWindowWithContextAndBounds(
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate, CurrentContext(), gfx::Rect(0, 0, 400, 400));
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->Show();
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* parent = widget->GetNativeView();
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(parent));
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* modal_parent = delegate->GetModalParent();
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(static_cast<aura::Window*>(NULL), modal_parent);
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(parent, modal_parent);
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wm::IsActiveWindow(modal_parent));
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate->ShowChild();
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* child = delegate->GetChild();
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(static_cast<aura::Window*>(NULL), child);
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(child));
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wm::IsActiveWindow(modal_parent));
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wm::IsActiveWindow(parent));
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(child->HasFocus());
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(modal_parent->HasFocus());
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(parent->HasFocus());
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::test::EventGenerator generator(
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Shell::GetPrimaryRootWindow(),
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        parent->bounds().origin() +
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            gfx::Vector2d(10, parent->bounds().height() - 10));
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator.ClickLeftButton();
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator.ClickLeftButton();
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(wm::IsActiveWindow(child));
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(wm::IsActiveWindow(modal_parent));
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(wm::IsActiveWindow(parent));
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(child->HasFocus());
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(modal_parent->HasFocus());
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(parent->HasFocus());
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::test::EventGenerator generator(
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Shell::GetPrimaryRootWindow(),
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        parent->bounds().origin() + gfx::Vector2d(10, 10));
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator.ClickLeftButton();
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(wm::IsActiveWindow(child));
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(wm::IsActiveWindow(modal_parent));
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(wm::IsActiveWindow(parent));
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(child->HasFocus());
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(modal_parent->HasFocus());
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(parent->HasFocus());
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::test::EventGenerator generator(
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Shell::GetPrimaryRootWindow(),
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        child->bounds().origin() + gfx::Vector2d(10, 10));
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator.ClickLeftButton();
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(wm::IsActiveWindow(child));
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(wm::IsActiveWindow(modal_parent));
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(wm::IsActiveWindow(parent));
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(child->HasFocus());
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(modal_parent->HasFocus());
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(parent->HasFocus());
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Window-modal test for the case when the originally clicked window is an
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ancestor of the modal parent.
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WindowModalityControllerTest, WindowModalAncestor) {
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::TestWindowDelegate d;
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> w1(
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -1, gfx::Rect()));
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> w2(
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::test::CreateTestWindowWithDelegate(&d, -11, gfx::Rect(), w1.get()));
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> w3(
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::test::CreateTestWindowWithDelegate(&d, -11, gfx::Rect(), w2.get()));
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> w4(
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -2, gfx::Rect()));
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  w4->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW);
542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::wm::AddTransientChild(w1.get(), w4.get());
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wm::ActivateWindow(w1.get());
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w4.get()));
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wm::ActivateWindow(w2.get());
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w4.get()));
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wm::ActivateWindow(w3.get());
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w4.get()));
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wm::ActivateWindow(w4.get());
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w4.get()));
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Child-modal test for the case when the originally clicked window is an
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ancestor of the modal parent.
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WindowModalityControllerTest, ChildModalAncestor) {
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::TestWindowDelegate d;
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> w1(
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -1, gfx::Rect()));
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> w2(
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::test::CreateTestWindowWithDelegate(&d, -11, gfx::Rect(), w1.get()));
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> w3(
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::test::CreateTestWindowWithDelegate(&d, -11, gfx::Rect(), w2.get()));
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> w4(
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithDelegate(&d, -2, gfx::Rect()));
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  w4->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_CHILD);
570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::wm::SetModalParent(w4.get(), w2.get());
571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::wm::AddTransientChild(w1.get(), w4.get());
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wm::ActivateWindow(w1.get());
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w1.get()));
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wm::ActivateWindow(w2.get());
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w4.get()));
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wm::ActivateWindow(w3.get());
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w4.get()));
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wm::ActivateWindow(w4.get());
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wm::IsActiveWindow(w4.get()));
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
587