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, ¢er); 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