Index: services/ui/ws/window_manager_client_unittest.cc |
diff --git a/services/ui/ws/window_manager_client_unittest.cc b/services/ui/ws/window_manager_client_unittest.cc |
index 3eb5b13f17eedaf0684709109d6c68960afa60b6..542c38c9dbcfedfc30027ebbd53fe81425d06c6d 100644 |
--- a/services/ui/ws/window_manager_client_unittest.cc |
+++ b/services/ui/ws/window_manager_client_unittest.cc |
@@ -11,6 +11,7 @@ |
#include "base/run_loop.h" |
#include "services/ui/common/util.h" |
#include "services/ui/ws/window_server_test_base.h" |
+#include "ui/aura/client/transient_window_client.h" |
#include "ui/aura/env.h" |
#include "ui/aura/mus/window_port_mus.h" |
#include "ui/aura/mus/window_tree_client.h" |
@@ -111,7 +112,6 @@ bool WaitForBoundsToChange(aura::Window* window) { |
return WindowServerTestBase::DoRunLoopWithTimeout(); |
} |
- |
// Spins a run loop until the tree beginning at |root| has |tree_size| windows |
// (including |root|). |
class TreeSizeMatchesObserver : public aura::WindowObserver { |
@@ -204,7 +204,8 @@ class WindowTracker : public aura::WindowObserver { |
DISALLOW_COPY_AND_ASSIGN(WindowTracker); |
}; |
-// Creates a new Window parented to |parent| that is made visible. |
+// Creates a new visible Window. If |parent| is non-null the newly created |
+// window is added to it. |
aura::Window* NewVisibleWindow(aura::Window* parent, |
aura::WindowTreeClient* client) { |
std::unique_ptr<aura::WindowPortMus> window_port_mus = |
@@ -212,7 +213,8 @@ aura::Window* NewVisibleWindow(aura::Window* parent, |
aura::Window* window = new aura::Window(nullptr, std::move(window_port_mus)); |
window->Init(ui::LAYER_NOT_DRAWN); |
window->Show(); |
- parent->AddChild(window); |
+ if (parent) |
+ parent->AddChild(window); |
return window; |
} |
@@ -718,5 +720,41 @@ TEST_F(WindowServerTest, EstablishConnectionViaFactory) { |
window_tree_host_in_second_client.GetBoundsInPixels()); |
} |
+TEST_F(WindowServerTest, OnWindowHierarchyChangedIncludesTransientParent) { |
+ // Create a second connection. In the second connection create a window, |
+ // parent it to the root, create another window, mark it as a transient parent |
+ // of the first window and then add it. |
+ EstablishConnectionViaFactoryDelegate delegate(window_manager()); |
+ set_window_manager_delegate(&delegate); |
+ aura::WindowTreeClient second_client(connector(), this); |
+ second_client.ConnectViaWindowTreeFactory(); |
+ aura::WindowTreeHostMus window_tree_host_in_second_client(&second_client); |
+ aura::Window* second_client_child = NewVisibleWindow( |
+ window_tree_host_in_second_client.window(), &second_client); |
+ std::unique_ptr<aura::WindowPortMus> window_port_mus = |
+ base::MakeUnique<aura::WindowPortMus>(&second_client, |
+ aura::WindowMusType::LOCAL); |
+ // Create the transient without a parent, set transient parent, then add. |
+ aura::Window* transient = NewVisibleWindow(nullptr, &second_client); |
+ aura::client::TransientWindowClient* transient_window_client = |
+ aura::client::GetTransientWindowClient(); |
+ transient_window_client->AddTransientChild(second_client_child, transient); |
+ second_client_child->AddChild(transient); |
+ |
+ // Wait for the top-level to appear in the window manager. |
+ ASSERT_TRUE(delegate.QuitOnCreate()); |
+ aura::Window* top_level_in_wm = delegate.created_window(); |
+ |
+ // Makes sure the window manager sees the same structure and the transient |
+ // parent is connected correctly. |
+ ASSERT_TRUE(WaitForTreeSizeToMatch(top_level_in_wm, 3u)); |
+ ASSERT_EQ(1u, top_level_in_wm->children().size()); |
+ aura::Window* second_client_child_in_wm = top_level_in_wm->children()[0]; |
+ ASSERT_EQ(1u, second_client_child_in_wm->children().size()); |
+ aura::Window* transient_in_wm = second_client_child_in_wm->children()[0]; |
+ ASSERT_EQ(second_client_child_in_wm, |
+ transient_window_client->GetTransientParent(transient_in_wm)); |
+} |
+ |
} // namespace ws |
} // namespace ui |