16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file. 46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "athena/wm/window_list_provider_impl.h" 66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <algorithm> 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "athena/test/athena_test_base.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/wm/public/window_list_provider_observer.h" 116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h" 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/aura/window.h" 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace athena { 156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace { 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool AreWindowListsEqual(const aura::Window::Windows& one, 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const aura::Window::Windows& two) { 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return one.size() == two.size() && 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::equal(one.begin(), one.end(), two.begin()); 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)scoped_ptr<aura::Window> CreateWindow(aura::WindowDelegate* delegate, 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::wm::WindowType window_type) { 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<aura::Window> window(new aura::Window(delegate)); 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) window->SetType(window_type); 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) window->Init(aura::WINDOW_LAYER_SOLID_COLOR); 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return window.Pass(); 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Return a string which defines the order of windows in |now| using the indices 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// of |original|. The string will then have the lowest/oldest window on the left 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// and the highest / newest on the right. 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string GetWindowOrder(const aura::Window::Windows& original, 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const aura::Window::Windows& now) { 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (original.size() != now.size()) 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return "size has changed."; 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string output; 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (aura::Window::Windows::const_iterator it = now.begin(); 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it != now.end(); ++it) { 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t i = 0; i < original.size(); i++) { 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if ((*it) == original[i]) { 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output += (output.size() ? " " : std::string()) + 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::to_string(i + 1); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return output; 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass WindowListObserver : public WindowListProviderObserver { 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit WindowListObserver(WindowListProvider* provider) 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : calls_(0), window_removal_calls_(0), provider_(provider) { 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci provider_->AddObserver(this); 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~WindowListObserver() { 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci provider_->RemoveObserver(this); 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int calls() const { return calls_; } 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int window_removal_calls() const { return window_removal_calls_; } 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // WindowListProviderObserver: 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnWindowStackingChanged() OVERRIDE { 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci calls_++; 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnWindowRemoved(aura::Window* removed_window, 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int index) OVERRIDE { 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window_removal_calls_++; 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The number of calls to the observer. 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int calls_; 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int window_removal_calls_; 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The associated WindowListProvider which is observed. 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WindowListProvider* provider_; 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(WindowListObserver); 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace 896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)typedef test::AthenaTestBase WindowListProviderImplTest; 916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Tests that the order of windows match the stacking order of the windows in 936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// the container, even after the order is changed through the aura Window API. 946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(WindowListProviderImplTest, StackingOrder) { 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) aura::test::TestWindowDelegate delegate; 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<aura::Window> container(new aura::Window(&delegate)); 976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<aura::Window> first = 986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); 996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<aura::Window> second = 1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); 1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<aura::Window> third = 1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); 1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) container->AddChild(first.get()); 1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) container->AddChild(second.get()); 1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) container->AddChild(third.get()); 1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<WindowListProvider> list_provider( 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new WindowListProviderImpl(container.get())); 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(AreWindowListsEqual(container->children(), 1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) list_provider->GetWindowList())); 1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) container->StackChildAtTop(first.get()); 1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(AreWindowListsEqual(container->children(), 1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) list_provider->GetWindowList())); 1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(first.get(), container->children().back()); 1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that only normal windows of the associated container will be listed. 1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(WindowListProviderImplTest, ListContainsOnlyNormalWindows) { 1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) aura::test::TestWindowDelegate delegate; 1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<aura::Window> container(new aura::Window(&delegate)); 1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<aura::Window> first = 1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); 1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<aura::Window> second = 1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CreateWindow(&delegate, ui::wm::WINDOW_TYPE_POPUP); 1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<aura::Window> third = 1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); 1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<aura::Window> fourth = 1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CreateWindow(&delegate, ui::wm::WINDOW_TYPE_MENU); 1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) container->AddChild(first.get()); 1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) container->AddChild(second.get()); 1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) container->AddChild(third.get()); 1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) container->AddChild(fourth.get()); 1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<WindowListProvider> list_provider( 1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new WindowListProviderImpl(container.get())); 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const aura::Window::Windows& list = list_provider->GetWindowList(); 1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(list.end(), std::find(list.begin(), list.end(), second.get())); 1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(list.end(), std::find(list.begin(), list.end(), fourth.get())); 1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_NE(list.end(), std::find(list.begin(), list.end(), first.get())); 1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_NE(list.end(), std::find(list.begin(), list.end(), third.get())); 1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Testing that IsValidWidow, IsWindowInList and AddWindow work as expected. 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WindowListProviderImplTest, SimpleChecks) { 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aura::test::TestWindowDelegate delegate; 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::Window> container(new aura::Window(&delegate)); 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::Window> normal_window = 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::Window> popup_window = 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateWindow(&delegate, ui::wm::WINDOW_TYPE_POPUP); 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::Window> menu_window = 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateWindow(&delegate, ui::wm::WINDOW_TYPE_MENU); 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<WindowListProvider> list_provider( 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new WindowListProviderImpl(container.get())); 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Check which windows are valid and which are not. 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(list_provider->IsValidWindow(normal_window.get())); 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(list_provider->IsValidWindow(popup_window.get())); 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(list_provider->IsValidWindow(menu_window.get())); 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Check that no window is currently in the list. 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(list_provider->IsWindowInList(normal_window.get())); 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(list_provider->IsWindowInList(popup_window.get())); 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(list_provider->IsWindowInList(menu_window.get())); 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Check that adding the window will add it to the list. 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci container->AddChild(normal_window.get()); 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(list_provider->IsWindowInList(normal_window.get())); 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Testing that window ordering functions work as expected. 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WindowListProviderImplTest, TestWindowOrderingFunctions) { 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aura::test::TestWindowDelegate delegate; 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::Window> container(new aura::Window(&delegate)); 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::Window> window1 = 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::Window> window2 = 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::Window> window3 = 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<WindowListProvider> list_provider( 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new WindowListProviderImpl(container.get())); 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<WindowListObserver> observer( 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new WindowListObserver(list_provider.get())); 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(list_provider->IsWindowInList(window1.get())); 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(list_provider->IsWindowInList(window2.get())); 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(list_provider->IsWindowInList(window3.get())); 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Add the windows. 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci container->AddChild(window1.get()); 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci container->AddChild(window2.get()); 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci container->AddChild(window3.get()); 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Make a copy of the window-list in the original order. 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aura::Window::Windows original_order = list_provider->GetWindowList(); 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(3U, original_order.size()); 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(original_order[0], window1.get()); 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(original_order[1], window2.get()); 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(original_order[2], window3.get()); 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, observer.get()->calls()); 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Move 1 (from the back) in front of 2. 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci list_provider->StackWindowFrontOf(window1.get(), window2.get()); 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("2 1 3", GetWindowOrder(original_order, 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci list_provider->GetWindowList())); 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, observer->calls()); 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Move 3 (from the front) in front of 2. 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci list_provider->StackWindowFrontOf(window3.get(), window2.get()); 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("2 3 1", GetWindowOrder(original_order, 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci list_provider->GetWindowList())); 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2, observer->calls()); 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Move 1 (from the front) behind 2. 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci list_provider->StackWindowBehindTo(window1.get(), window2.get()); 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("1 2 3", GetWindowOrder(original_order, 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci list_provider->GetWindowList())); 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(3, observer->calls()); 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Move 1 (from the back) in front of 3. 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci list_provider->StackWindowFrontOf(window1.get(), window3.get()); 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("2 3 1", GetWindowOrder(original_order, 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci list_provider->GetWindowList())); 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(4, observer->calls()); 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Test that no change should also report no call. 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci list_provider->StackWindowFrontOf(window1.get(), window3.get()); 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("2 3 1", GetWindowOrder(original_order, 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci list_provider->GetWindowList())); 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(4, observer->calls()); 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci list_provider->StackWindowBehindTo(window3.get(), window1.get()); 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("2 3 1", GetWindowOrder(original_order, 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci list_provider->GetWindowList())); 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(4, observer->calls()); 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(WindowListProviderImplTest, TestWindowRemovalNotification) { 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aura::test::TestWindowDelegate delegate; 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::Window> container(new aura::Window(&delegate)); 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::Window> window1 = 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::Window> window2 = 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::Window> window3 = 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateWindow(&delegate, ui::wm::WINDOW_TYPE_NORMAL); 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::Window> window4 = 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateWindow(&delegate, ui::wm::WINDOW_TYPE_POPUP); 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<WindowListProvider> list_provider( 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new WindowListProviderImpl(container.get())); 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<WindowListObserver> observer( 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new WindowListObserver(list_provider.get())); 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Add the windows. 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci container->AddChild(window1.get()); 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci container->AddChild(window2.get()); 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci container->AddChild(window3.get()); 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci container->AddChild(window4.get()); 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The popup-window (window4) should not be included in the window-list. 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(3U, list_provider->GetWindowList().size()); 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, observer->window_removal_calls()); 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(list_provider->IsWindowInList(window4.get())); 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Destroying the popup window should not trigger the remove notification. 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window4.reset(); 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(3U, list_provider->GetWindowList().size()); 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, observer->window_removal_calls()); 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window2.reset(); 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(2U, list_provider->GetWindowList().size()); 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, observer->window_removal_calls()); 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window1.reset(); 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(1U, list_provider->GetWindowList().size()); 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2, observer->window_removal_calls()); 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window3.reset(); 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(0U, list_provider->GetWindowList().size()); 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(3, observer->window_removal_calls()); 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace athena 291