Index: services/ui/public/cpp/tests/window_unittest.cc |
diff --git a/services/ui/public/cpp/tests/window_unittest.cc b/services/ui/public/cpp/tests/window_unittest.cc |
deleted file mode 100644 |
index 45ec0e831e8d3ea40e03941f58b9946b0f382674..0000000000000000000000000000000000000000 |
--- a/services/ui/public/cpp/tests/window_unittest.cc |
+++ /dev/null |
@@ -1,1265 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "services/ui/public/cpp/window.h" |
- |
-#include <limits.h> |
-#include <stdint.h> |
- |
-#include "base/logging.h" |
-#include "base/macros.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/stringprintf.h" |
-#include "services/ui/common/util.h" |
-#include "services/ui/public/cpp/property_type_converters.h" |
-#include "services/ui/public/cpp/tests/test_window.h" |
-#include "services/ui/public/cpp/window_observer.h" |
-#include "services/ui/public/cpp/window_private.h" |
-#include "services/ui/public/cpp/window_property.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "ui/gfx/geometry/rect.h" |
- |
-namespace ui { |
- |
-namespace { |
- |
-TestWindow* CreateTestWindow(TestWindow* parent) { |
- TestWindow* window = new TestWindow; |
- if (parent) |
- parent->AddChild(window); |
- return window; |
-} |
- |
-TestWindow* CreateTestWindow(int id, TestWindow* parent) { |
- TestWindow* window = new TestWindow(0); |
- window->set_local_id(id); |
- if (parent) |
- parent->AddChild(window); |
- return window; |
-} |
- |
-std::string ChildWindowIDsAsString(TestWindow* parent) { |
- std::string result; |
- for (Window* child : parent->children()) { |
- if (!result.empty()) |
- result += " "; |
- result += base::IntToString(child->local_id()); |
- } |
- return result; |
-} |
- |
-} // namespace |
-// Window --------------------------------------------------------------------- |
- |
-using WindowTest = testing::Test; |
- |
-TEST_F(WindowTest, AddChild) { |
- TestWindow w1; |
- TestWindow w11; |
- w1.AddChild(&w11); |
- EXPECT_EQ(1U, w1.children().size()); |
-} |
- |
-TEST_F(WindowTest, RemoveChild) { |
- TestWindow w1; |
- TestWindow w11; |
- w1.AddChild(&w11); |
- EXPECT_EQ(1U, w1.children().size()); |
- w1.RemoveChild(&w11); |
- EXPECT_EQ(0U, w1.children().size()); |
-} |
- |
-TEST_F(WindowTest, Reparent) { |
- TestWindow w1; |
- TestWindow w2; |
- TestWindow w11; |
- w1.AddChild(&w11); |
- EXPECT_EQ(1U, w1.children().size()); |
- w2.AddChild(&w11); |
- EXPECT_EQ(1U, w2.children().size()); |
- EXPECT_EQ(0U, w1.children().size()); |
-} |
- |
-TEST_F(WindowTest, Contains) { |
- TestWindow w1; |
- |
- // Direct descendant. |
- TestWindow w11; |
- w1.AddChild(&w11); |
- EXPECT_TRUE(w1.Contains(&w11)); |
- |
- // Indirect descendant. |
- TestWindow w111; |
- w11.AddChild(&w111); |
- EXPECT_TRUE(w1.Contains(&w111)); |
-} |
-TEST_F(WindowTest, GetChildByLocalId) { |
- TestWindow w1; |
- w1.set_local_id(0); |
- EXPECT_EQ(&w1, w1.GetChildByLocalId(0)); |
- |
- TestWindow w11; |
- w11.set_local_id(11); |
- w1.AddChild(&w11); |
- |
- TestWindow w12; |
- w12.set_local_id(w1.local_id()); |
- w1.AddChild(&w12); |
- |
- TestWindow w111; |
- w111.set_local_id(111); |
- w11.AddChild(&w111); |
- |
- // Find direct & indirect descendents. |
- EXPECT_EQ(&w11, w1.GetChildByLocalId(w11.local_id())); |
- EXPECT_EQ(&w111, w1.GetChildByLocalId(w111.local_id())); |
- // Verifies parent returned by child with same id. |
- EXPECT_EQ(&w1, w1.GetChildByLocalId(w1.local_id())); |
-} |
- |
-TEST_F(WindowTest, DrawnAndVisible) { |
- TestWindow w1; |
- EXPECT_FALSE(w1.visible()); |
- w1.SetVisible(true); |
- EXPECT_TRUE(w1.visible()); |
- EXPECT_FALSE(w1.IsDrawn()); |
- |
- WindowPrivate(&w1).set_parent_drawn(true); |
- |
- TestWindow w11; |
- w11.SetVisible(true); |
- w1.AddChild(&w11); |
- EXPECT_TRUE(w11.visible()); |
- EXPECT_TRUE(w11.IsDrawn()); |
- |
- w1.RemoveChild(&w11); |
- EXPECT_TRUE(w11.visible()); |
- EXPECT_FALSE(w11.IsDrawn()); |
-} |
- |
-namespace { |
-MUS_DEFINE_WINDOW_PROPERTY_KEY(int, kIntKey, -2); |
-MUS_DEFINE_WINDOW_PROPERTY_KEY(const char*, kStringKey, "squeamish"); |
-} |
- |
-TEST_F(WindowTest, Property) { |
- TestWindow w; |
- |
- // Non-existent properties should return the default values. |
- EXPECT_EQ(-2, w.GetLocalProperty(kIntKey)); |
- EXPECT_EQ(std::string("squeamish"), w.GetLocalProperty(kStringKey)); |
- |
- // A set property value should be returned again (even if it's the default |
- // value). |
- w.SetLocalProperty(kIntKey, INT_MAX); |
- EXPECT_EQ(INT_MAX, w.GetLocalProperty(kIntKey)); |
- w.SetLocalProperty(kIntKey, -2); |
- EXPECT_EQ(-2, w.GetLocalProperty(kIntKey)); |
- w.SetLocalProperty(kIntKey, INT_MIN); |
- EXPECT_EQ(INT_MIN, w.GetLocalProperty(kIntKey)); |
- |
- w.SetLocalProperty(kStringKey, static_cast<const char*>(NULL)); |
- EXPECT_EQ(NULL, w.GetLocalProperty(kStringKey)); |
- w.SetLocalProperty(kStringKey, "squeamish"); |
- EXPECT_EQ(std::string("squeamish"), w.GetLocalProperty(kStringKey)); |
- w.SetLocalProperty(kStringKey, "ossifrage"); |
- EXPECT_EQ(std::string("ossifrage"), w.GetLocalProperty(kStringKey)); |
- |
- // ClearProperty should restore the default value. |
- w.ClearLocalProperty(kIntKey); |
- EXPECT_EQ(-2, w.GetLocalProperty(kIntKey)); |
- w.ClearLocalProperty(kStringKey); |
- EXPECT_EQ(std::string("squeamish"), w.GetLocalProperty(kStringKey)); |
-} |
- |
-namespace { |
- |
-class TestProperty { |
- public: |
- TestProperty() {} |
- virtual ~TestProperty() { last_deleted_ = this; } |
- static TestProperty* last_deleted() { return last_deleted_; } |
- |
- private: |
- static TestProperty* last_deleted_; |
- DISALLOW_COPY_AND_ASSIGN(TestProperty); |
-}; |
- |
-TestProperty* TestProperty::last_deleted_ = NULL; |
- |
-MUS_DEFINE_OWNED_WINDOW_PROPERTY_KEY(TestProperty, kOwnedKey, NULL); |
- |
-} // namespace |
- |
-TEST_F(WindowTest, OwnedProperty) { |
- TestProperty* p3 = NULL; |
- { |
- TestWindow w; |
- EXPECT_EQ(NULL, w.GetLocalProperty(kOwnedKey)); |
- TestProperty* p1 = new TestProperty(); |
- w.SetLocalProperty(kOwnedKey, p1); |
- EXPECT_EQ(p1, w.GetLocalProperty(kOwnedKey)); |
- EXPECT_EQ(NULL, TestProperty::last_deleted()); |
- |
- TestProperty* p2 = new TestProperty(); |
- w.SetLocalProperty(kOwnedKey, p2); |
- EXPECT_EQ(p2, w.GetLocalProperty(kOwnedKey)); |
- EXPECT_EQ(p1, TestProperty::last_deleted()); |
- |
- w.ClearLocalProperty(kOwnedKey); |
- EXPECT_EQ(NULL, w.GetLocalProperty(kOwnedKey)); |
- EXPECT_EQ(p2, TestProperty::last_deleted()); |
- |
- p3 = new TestProperty(); |
- w.SetLocalProperty(kOwnedKey, p3); |
- EXPECT_EQ(p3, w.GetLocalProperty(kOwnedKey)); |
- EXPECT_EQ(p2, TestProperty::last_deleted()); |
- } |
- |
- EXPECT_EQ(p3, TestProperty::last_deleted()); |
-} |
- |
-// WindowObserver -------------------------------------------------------- |
- |
-typedef testing::Test WindowObserverTest; |
- |
-bool TreeChangeParamsMatch(const WindowObserver::TreeChangeParams& lhs, |
- const WindowObserver::TreeChangeParams& rhs) { |
- return lhs.target == rhs.target && lhs.old_parent == rhs.old_parent && |
- lhs.new_parent == rhs.new_parent && lhs.receiver == rhs.receiver; |
-} |
- |
-class TreeChangeObserver : public WindowObserver { |
- public: |
- explicit TreeChangeObserver(Window* observee) : observee_(observee) { |
- observee_->AddObserver(this); |
- } |
- ~TreeChangeObserver() override { observee_->RemoveObserver(this); } |
- |
- void Reset() { received_params_.clear(); } |
- |
- const std::vector<TreeChangeParams>& received_params() { |
- return received_params_; |
- } |
- |
- private: |
- // Overridden from WindowObserver: |
- void OnTreeChanging(const TreeChangeParams& params) override { |
- received_params_.push_back(params); |
- } |
- void OnTreeChanged(const TreeChangeParams& params) override { |
- received_params_.push_back(params); |
- } |
- |
- Window* observee_; |
- std::vector<TreeChangeParams> received_params_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TreeChangeObserver); |
-}; |
- |
-// Adds/Removes w11 to w1. |
-TEST_F(WindowObserverTest, TreeChange_SimpleAddRemove) { |
- TestWindow w1; |
- w1.set_local_id(1); |
- TreeChangeObserver o1(&w1); |
- EXPECT_TRUE(o1.received_params().empty()); |
- |
- TestWindow w11; |
- w11.set_local_id(11); |
- TreeChangeObserver o11(&w11); |
- EXPECT_TRUE(o11.received_params().empty()); |
- |
- // Add. |
- |
- w1.AddChild(&w11); |
- |
- EXPECT_EQ(2U, o1.received_params().size()); |
- WindowObserver::TreeChangeParams p1; |
- p1.target = &w11; |
- p1.receiver = &w1; |
- p1.old_parent = NULL; |
- p1.new_parent = &w1; |
- EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back())); |
- |
- EXPECT_EQ(2U, o11.received_params().size()); |
- WindowObserver::TreeChangeParams p11 = p1; |
- p11.receiver = &w11; |
- EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front())); |
- EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back())); |
- |
- o1.Reset(); |
- o11.Reset(); |
- EXPECT_TRUE(o1.received_params().empty()); |
- EXPECT_TRUE(o11.received_params().empty()); |
- |
- // Remove. |
- |
- w1.RemoveChild(&w11); |
- |
- EXPECT_EQ(2U, o1.received_params().size()); |
- p1.target = &w11; |
- p1.receiver = &w1; |
- p1.old_parent = &w1; |
- p1.new_parent = NULL; |
- EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().front())); |
- |
- EXPECT_EQ(2U, o11.received_params().size()); |
- p11 = p1; |
- p11.receiver = &w11; |
- EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front())); |
- EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back())); |
-} |
- |
-// Creates these two trees: |
-// w1 |
-// +- w11 |
-// w111 |
-// +- w1111 |
-// +- w1112 |
-// Then adds/removes w111 from w11. |
-TEST_F(WindowObserverTest, TreeChange_NestedAddRemove) { |
- TestWindow w1, w11, w111, w1111, w1112; |
- |
- // Root tree. |
- w1.AddChild(&w11); |
- |
- // Tree to be attached. |
- w111.AddChild(&w1111); |
- w111.AddChild(&w1112); |
- |
- TreeChangeObserver o1(&w1), o11(&w11), o111(&w111), o1111(&w1111), |
- o1112(&w1112); |
- WindowObserver::TreeChangeParams p1, p11, p111, p1111, p1112; |
- |
- // Add. |
- |
- w11.AddChild(&w111); |
- |
- EXPECT_EQ(2U, o1.received_params().size()); |
- p1.target = &w111; |
- p1.receiver = &w1; |
- p1.old_parent = NULL; |
- p1.new_parent = &w11; |
- EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back())); |
- |
- EXPECT_EQ(2U, o11.received_params().size()); |
- p11 = p1; |
- p11.receiver = &w11; |
- EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back())); |
- |
- EXPECT_EQ(2U, o111.received_params().size()); |
- p111 = p11; |
- p111.receiver = &w111; |
- EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().front())); |
- EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back())); |
- |
- EXPECT_EQ(2U, o1111.received_params().size()); |
- p1111 = p111; |
- p1111.receiver = &w1111; |
- EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().front())); |
- EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().back())); |
- |
- EXPECT_EQ(2U, o1112.received_params().size()); |
- p1112 = p111; |
- p1112.receiver = &w1112; |
- EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().front())); |
- EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().back())); |
- |
- // Remove. |
- o1.Reset(); |
- o11.Reset(); |
- o111.Reset(); |
- o1111.Reset(); |
- o1112.Reset(); |
- EXPECT_TRUE(o1.received_params().empty()); |
- EXPECT_TRUE(o11.received_params().empty()); |
- EXPECT_TRUE(o111.received_params().empty()); |
- EXPECT_TRUE(o1111.received_params().empty()); |
- EXPECT_TRUE(o1112.received_params().empty()); |
- |
- w11.RemoveChild(&w111); |
- |
- EXPECT_EQ(2U, o1.received_params().size()); |
- p1.target = &w111; |
- p1.receiver = &w1; |
- p1.old_parent = &w11; |
- p1.new_parent = NULL; |
- EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().front())); |
- |
- EXPECT_EQ(2U, o11.received_params().size()); |
- p11 = p1; |
- p11.receiver = &w11; |
- EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front())); |
- |
- EXPECT_EQ(2U, o111.received_params().size()); |
- p111 = p11; |
- p111.receiver = &w111; |
- EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().front())); |
- EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back())); |
- |
- EXPECT_EQ(2U, o1111.received_params().size()); |
- p1111 = p111; |
- p1111.receiver = &w1111; |
- EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().front())); |
- EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().back())); |
- |
- EXPECT_EQ(2U, o1112.received_params().size()); |
- p1112 = p111; |
- p1112.receiver = &w1112; |
- EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().front())); |
- EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().back())); |
-} |
- |
-TEST_F(WindowObserverTest, TreeChange_Reparent) { |
- TestWindow w1, w11, w12, w111; |
- w1.AddChild(&w11); |
- w1.AddChild(&w12); |
- w11.AddChild(&w111); |
- |
- TreeChangeObserver o1(&w1), o11(&w11), o12(&w12), o111(&w111); |
- |
- // Reparent. |
- w12.AddChild(&w111); |
- |
- // w1 (root) should see both changing and changed notifications. |
- EXPECT_EQ(4U, o1.received_params().size()); |
- WindowObserver::TreeChangeParams p1; |
- p1.target = &w111; |
- p1.receiver = &w1; |
- p1.old_parent = &w11; |
- p1.new_parent = &w12; |
- EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().front())); |
- EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back())); |
- |
- // w11 should see changing notifications. |
- EXPECT_EQ(2U, o11.received_params().size()); |
- WindowObserver::TreeChangeParams p11; |
- p11 = p1; |
- p11.receiver = &w11; |
- EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front())); |
- |
- // w12 should see changed notifications. |
- EXPECT_EQ(2U, o12.received_params().size()); |
- WindowObserver::TreeChangeParams p12; |
- p12 = p1; |
- p12.receiver = &w12; |
- EXPECT_TRUE(TreeChangeParamsMatch(p12, o12.received_params().back())); |
- |
- // w111 should see both changing and changed notifications. |
- EXPECT_EQ(2U, o111.received_params().size()); |
- WindowObserver::TreeChangeParams p111; |
- p111 = p1; |
- p111.receiver = &w111; |
- EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().front())); |
- EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back())); |
-} |
- |
-namespace { |
- |
-class OrderChangeObserver : public WindowObserver { |
- public: |
- struct Change { |
- Window* window; |
- Window* relative_window; |
- mojom::OrderDirection direction; |
- }; |
- typedef std::vector<Change> Changes; |
- |
- explicit OrderChangeObserver(Window* observee) : observee_(observee) { |
- observee_->AddObserver(this); |
- } |
- ~OrderChangeObserver() override { observee_->RemoveObserver(this); } |
- |
- Changes GetAndClearChanges() { |
- Changes changes; |
- changes_.swap(changes); |
- return changes; |
- } |
- |
- private: |
- // Overridden from WindowObserver: |
- void OnWindowReordering(Window* window, |
- Window* relative_window, |
- mojom::OrderDirection direction) override { |
- OnWindowReordered(window, relative_window, direction); |
- } |
- |
- void OnWindowReordered(Window* window, |
- Window* relative_window, |
- mojom::OrderDirection direction) override { |
- Change change; |
- change.window = window; |
- change.relative_window = relative_window; |
- change.direction = direction; |
- changes_.push_back(change); |
- } |
- |
- Window* observee_; |
- Changes changes_; |
- |
- DISALLOW_COPY_AND_ASSIGN(OrderChangeObserver); |
-}; |
- |
-} // namespace |
- |
-TEST_F(WindowObserverTest, Order) { |
- TestWindow w1, w11, w12, w13; |
- w1.AddChild(&w11); |
- w1.AddChild(&w12); |
- w1.AddChild(&w13); |
- |
- // Order: w11, w12, w13 |
- EXPECT_EQ(3U, w1.children().size()); |
- EXPECT_EQ(&w11, w1.children().front()); |
- EXPECT_EQ(&w13, w1.children().back()); |
- |
- { |
- OrderChangeObserver observer(&w11); |
- |
- // Move w11 to front. |
- // Resulting order: w12, w13, w11 |
- w11.MoveToFront(); |
- EXPECT_EQ(&w12, w1.children().front()); |
- EXPECT_EQ(&w11, w1.children().back()); |
- |
- OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); |
- ASSERT_EQ(2U, changes.size()); |
- EXPECT_EQ(&w11, changes[0].window); |
- EXPECT_EQ(&w13, changes[0].relative_window); |
- EXPECT_EQ(mojom::OrderDirection::ABOVE, changes[0].direction); |
- |
- EXPECT_EQ(&w11, changes[1].window); |
- EXPECT_EQ(&w13, changes[1].relative_window); |
- EXPECT_EQ(mojom::OrderDirection::ABOVE, changes[1].direction); |
- } |
- |
- { |
- OrderChangeObserver observer(&w11); |
- |
- // Move w11 to back. |
- // Resulting order: w11, w12, w13 |
- w11.MoveToBack(); |
- EXPECT_EQ(&w11, w1.children().front()); |
- EXPECT_EQ(&w13, w1.children().back()); |
- |
- OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); |
- ASSERT_EQ(2U, changes.size()); |
- EXPECT_EQ(&w11, changes[0].window); |
- EXPECT_EQ(&w12, changes[0].relative_window); |
- EXPECT_EQ(mojom::OrderDirection::BELOW, changes[0].direction); |
- |
- EXPECT_EQ(&w11, changes[1].window); |
- EXPECT_EQ(&w12, changes[1].relative_window); |
- EXPECT_EQ(mojom::OrderDirection::BELOW, changes[1].direction); |
- } |
- |
- { |
- OrderChangeObserver observer(&w11); |
- |
- // Move w11 above w12. |
- // Resulting order: w12. w11, w13 |
- w11.Reorder(&w12, mojom::OrderDirection::ABOVE); |
- EXPECT_EQ(&w12, w1.children().front()); |
- EXPECT_EQ(&w13, w1.children().back()); |
- |
- OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); |
- ASSERT_EQ(2U, changes.size()); |
- EXPECT_EQ(&w11, changes[0].window); |
- EXPECT_EQ(&w12, changes[0].relative_window); |
- EXPECT_EQ(mojom::OrderDirection::ABOVE, changes[0].direction); |
- |
- EXPECT_EQ(&w11, changes[1].window); |
- EXPECT_EQ(&w12, changes[1].relative_window); |
- EXPECT_EQ(mojom::OrderDirection::ABOVE, changes[1].direction); |
- } |
- |
- { |
- OrderChangeObserver observer(&w11); |
- |
- // Move w11 below w12. |
- // Resulting order: w11, w12, w13 |
- w11.Reorder(&w12, mojom::OrderDirection::BELOW); |
- EXPECT_EQ(&w11, w1.children().front()); |
- EXPECT_EQ(&w13, w1.children().back()); |
- |
- OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); |
- ASSERT_EQ(2U, changes.size()); |
- EXPECT_EQ(&w11, changes[0].window); |
- EXPECT_EQ(&w12, changes[0].relative_window); |
- EXPECT_EQ(mojom::OrderDirection::BELOW, changes[0].direction); |
- |
- EXPECT_EQ(&w11, changes[1].window); |
- EXPECT_EQ(&w12, changes[1].relative_window); |
- EXPECT_EQ(mojom::OrderDirection::BELOW, changes[1].direction); |
- } |
-} |
- |
-namespace { |
- |
-typedef std::vector<std::string> Changes; |
- |
-std::string RectToString(const gfx::Rect& rect) { |
- return base::StringPrintf("%d,%d %dx%d", rect.x(), rect.y(), rect.width(), |
- rect.height()); |
-} |
- |
-class BoundsChangeObserver : public WindowObserver { |
- public: |
- explicit BoundsChangeObserver(Window* window) : window_(window) { |
- window_->AddObserver(this); |
- } |
- ~BoundsChangeObserver() override { window_->RemoveObserver(this); } |
- |
- Changes GetAndClearChanges() { |
- Changes changes; |
- changes.swap(changes_); |
- return changes; |
- } |
- |
- private: |
- // Overridden from WindowObserver: |
- void OnWindowBoundsChanging(Window* window, |
- const gfx::Rect& old_bounds, |
- const gfx::Rect& new_bounds) override { |
- changes_.push_back(base::StringPrintf( |
- "window=%d old_bounds=%s new_bounds=%s phase=changing", |
- window->local_id(), RectToString(old_bounds).c_str(), |
- RectToString(new_bounds).c_str())); |
- } |
- void OnWindowBoundsChanged(Window* window, |
- const gfx::Rect& old_bounds, |
- const gfx::Rect& new_bounds) override { |
- changes_.push_back(base::StringPrintf( |
- "window=%d old_bounds=%s new_bounds=%s phase=changed", |
- window->local_id(), RectToString(old_bounds).c_str(), |
- RectToString(new_bounds).c_str())); |
- } |
- |
- Window* window_; |
- Changes changes_; |
- |
- DISALLOW_COPY_AND_ASSIGN(BoundsChangeObserver); |
-}; |
- |
-} // namespace |
- |
-TEST_F(WindowObserverTest, SetBounds) { |
- TestWindow w1; |
- w1.set_local_id(1); |
- { |
- BoundsChangeObserver observer(&w1); |
- w1.SetBounds(gfx::Rect(0, 0, 100, 100)); |
- |
- Changes changes = observer.GetAndClearChanges(); |
- ASSERT_EQ(2U, changes.size()); |
- EXPECT_EQ( |
- "window=1 old_bounds=0,0 0x0 new_bounds=0,0 100x100 phase=changing", |
- changes[0]); |
- EXPECT_EQ( |
- "window=1 old_bounds=0,0 0x0 new_bounds=0,0 100x100 phase=changed", |
- changes[1]); |
- } |
-} |
- |
-namespace { |
- |
-class VisibilityChangeObserver : public WindowObserver { |
- public: |
- explicit VisibilityChangeObserver(Window* window) : window_(window) { |
- window_->AddObserver(this); |
- } |
- ~VisibilityChangeObserver() override { window_->RemoveObserver(this); } |
- |
- Changes GetAndClearChanges() { |
- Changes changes; |
- changes.swap(changes_); |
- return changes; |
- } |
- |
- private: |
- // Overridden from WindowObserver: |
- void OnWindowVisibilityChanging(Window* window, bool visible) override { |
- changes_.push_back( |
- base::StringPrintf("window=%d phase=changing visibility=%s", |
- window->local_id(), visible ? "true" : "false")); |
- } |
- void OnChildWindowVisibilityChanged(Window* window, bool visible) override { |
- changes_.push_back( |
- base::StringPrintf("window=%d phase=child-changed visibility=%s", |
- window->local_id(), visible ? "true" : "false")); |
- } |
- void OnWindowVisibilityChanged(Window* window, bool visible) override { |
- changes_.push_back( |
- base::StringPrintf("window=%d phase=changed visibility=%s", |
- window->local_id(), visible ? "true" : "false")); |
- } |
- |
- Window* window_; |
- Changes changes_; |
- |
- DISALLOW_COPY_AND_ASSIGN(VisibilityChangeObserver); |
-}; |
- |
-} // namespace |
- |
-TEST_F(WindowObserverTest, SetVisible) { |
- TestWindow w1; |
- EXPECT_FALSE(w1.visible()); |
- w1.set_local_id(1); |
- w1.SetVisible(true); |
- EXPECT_TRUE(w1.visible()); |
- { |
- // Change visibility from true to false and make sure we get notifications. |
- VisibilityChangeObserver observer(&w1); |
- w1.SetVisible(false); |
- |
- Changes changes = observer.GetAndClearChanges(); |
- ASSERT_EQ(2U, changes.size()); |
- EXPECT_EQ("window=1 phase=changing visibility=false", changes[0]); |
- EXPECT_EQ("window=1 phase=changed visibility=false", changes[1]); |
- } |
- { |
- // Set visible to existing value and verify no notifications. |
- VisibilityChangeObserver observer(&w1); |
- w1.SetVisible(false); |
- EXPECT_TRUE(observer.GetAndClearChanges().empty()); |
- } |
-} |
- |
-TEST_F(WindowObserverTest, SetVisibleParent) { |
- TestWindow parent; |
- parent.SetVisible(true); |
- parent.set_local_id(1); |
- TestWindow child; |
- child.SetVisible(true); |
- child.set_local_id(2); |
- parent.AddChild(&child); |
- EXPECT_TRUE(parent.visible()); |
- EXPECT_TRUE(child.visible()); |
- { |
- // Change visibility from true to false and make sure we get notifications |
- // on the parent. |
- VisibilityChangeObserver observer(&parent); |
- child.SetVisible(false); |
- |
- Changes changes = observer.GetAndClearChanges(); |
- ASSERT_EQ(2U, changes.size()); |
- EXPECT_EQ("window=2 phase=child-changed visibility=false", changes[0]); |
- EXPECT_EQ("window=2 phase=changed visibility=false", changes[1]); |
- } |
-} |
- |
-TEST_F(WindowObserverTest, SetVisibleChild) { |
- TestWindow parent; |
- parent.SetVisible(true); |
- parent.set_local_id(1); |
- TestWindow child; |
- child.SetVisible(true); |
- child.set_local_id(2); |
- parent.AddChild(&child); |
- EXPECT_TRUE(parent.visible()); |
- EXPECT_TRUE(child.visible()); |
- { |
- // Change visibility from true to false and make sure we get notifications |
- // on the child. |
- VisibilityChangeObserver observer(&child); |
- parent.SetVisible(false); |
- |
- Changes changes = observer.GetAndClearChanges(); |
- ASSERT_EQ(1U, changes.size()); |
- EXPECT_EQ("window=1 phase=changed visibility=false", changes[0]); |
- } |
-} |
- |
-namespace { |
- |
-class OpacityChangeObserver : public WindowObserver { |
- public: |
- explicit OpacityChangeObserver(Window* window) : window_(window) { |
- window_->AddObserver(this); |
- } |
- ~OpacityChangeObserver() override { window_->RemoveObserver(this); } |
- |
- Changes GetAndClearChanges() { |
- Changes changes; |
- changes.swap(changes_); |
- return changes; |
- } |
- |
- private: |
- // WindowObserver: |
- void OnWindowOpacityChanged(Window* window, |
- float old_opacity, |
- float new_opacity) override { |
- changes_.push_back( |
- base::StringPrintf("window=%d old_opacity=%.2f new_opacity=%.2f", |
- window->local_id(), old_opacity, new_opacity)); |
- } |
- |
- Window* window_; |
- Changes changes_; |
- |
- DISALLOW_COPY_AND_ASSIGN(OpacityChangeObserver); |
-}; |
- |
-} // namespace |
- |
-// Tests that WindowObserver is only notified when opacity changes. |
-TEST_F(WindowObserverTest, SetOpacity) { |
- TestWindow w1; |
- w1.set_local_id(1); |
- EXPECT_FLOAT_EQ(1.0f, w1.opacity()); |
- |
- // Changing the opacity should trigger a notification. |
- OpacityChangeObserver observer(&w1); |
- w1.SetOpacity(0.5f); |
- EXPECT_FLOAT_EQ(0.5f, w1.opacity()); |
- Changes changes = observer.GetAndClearChanges(); |
- ASSERT_EQ(1u, changes.size()); |
- EXPECT_EQ("window=1 old_opacity=1.00 new_opacity=0.50", changes[0]); |
- |
- // Setting to the same opacity should be rejected, no notification. |
- w1.SetOpacity(0.5f); |
- EXPECT_FLOAT_EQ(0.5f, w1.opacity()); |
- changes = observer.GetAndClearChanges(); |
- EXPECT_TRUE(changes.empty()); |
- |
- // Alternate sources of opacity changes should trigger a notification. |
- WindowPrivate(&w1).LocalSetOpacity(1.0f); |
- EXPECT_FLOAT_EQ(1.0f, w1.opacity()); |
- changes = observer.GetAndClearChanges(); |
- ASSERT_EQ(1u, changes.size()); |
- EXPECT_EQ("window=1 old_opacity=0.50 new_opacity=1.00", changes[0]); |
-} |
- |
-namespace { |
- |
-class SharedPropertyChangeObserver : public WindowObserver { |
- public: |
- explicit SharedPropertyChangeObserver(Window* window) : window_(window) { |
- window_->AddObserver(this); |
- } |
- ~SharedPropertyChangeObserver() override { window_->RemoveObserver(this); } |
- |
- Changes GetAndClearChanges() { |
- Changes changes; |
- changes.swap(changes_); |
- return changes; |
- } |
- |
- private: |
- // Overridden from WindowObserver: |
- void OnWindowSharedPropertyChanged( |
- Window* window, |
- const std::string& name, |
- const std::vector<uint8_t>* old_data, |
- const std::vector<uint8_t>* new_data) override { |
- changes_.push_back(base::StringPrintf( |
- "window=%d shared property changed key=%s old_value=%s new_value=%s", |
- window->local_id(), name.c_str(), VectorToString(old_data).c_str(), |
- VectorToString(new_data).c_str())); |
- } |
- |
- std::string VectorToString(const std::vector<uint8_t>* data) { |
- if (!data) |
- return "NULL"; |
- gfx::Size size = mojo::ConvertTo<gfx::Size>(*data); |
- return base::StringPrintf("%d,%d", size.width(), size.height()); |
- } |
- |
- Window* window_; |
- Changes changes_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SharedPropertyChangeObserver); |
-}; |
- |
-} // namespace |
- |
-TEST_F(WindowObserverTest, SetSharedProperty) { |
- TestWindow w1; |
- w1.set_local_id(1); |
- gfx::Size size(100, 100); |
- |
- { |
- // Change visibility from true to false and make sure we get notifications. |
- SharedPropertyChangeObserver observer(&w1); |
- w1.SetSharedProperty<gfx::Size>("size", size); |
- Changes changes = observer.GetAndClearChanges(); |
- ASSERT_EQ(1U, changes.size()); |
- EXPECT_EQ( |
- "window=1 shared property changed key=size old_value=NULL " |
- "new_value=100,100", |
- changes[0]); |
- EXPECT_EQ(1U, w1.shared_properties().size()); |
- EXPECT_EQ(w1.GetSharedProperty<gfx::Size>("size"), size); |
- EXPECT_TRUE(w1.HasSharedProperty("size")); |
- } |
- { |
- // Set visible to existing value and verify no notifications. |
- SharedPropertyChangeObserver observer(&w1); |
- w1.SetSharedProperty<gfx::Size>("size", size); |
- EXPECT_TRUE(observer.GetAndClearChanges().empty()); |
- EXPECT_EQ(1U, w1.shared_properties().size()); |
- EXPECT_TRUE(w1.HasSharedProperty("size")); |
- } |
- { |
- // Clear the shared property. |
- // Change visibility from true to false and make sure we get notifications. |
- SharedPropertyChangeObserver observer(&w1); |
- w1.ClearSharedProperty("size"); |
- Changes changes = observer.GetAndClearChanges(); |
- ASSERT_EQ(1U, changes.size()); |
- EXPECT_EQ( |
- "window=1 shared property changed key=size old_value=100,100 " |
- "new_value=NULL", |
- changes[0]); |
- EXPECT_EQ(0U, w1.shared_properties().size()); |
- EXPECT_FALSE(w1.HasSharedProperty("size")); |
- } |
- { |
- // Clearing a non-existent property shouldn't update us. |
- SharedPropertyChangeObserver observer(&w1); |
- w1.ClearSharedProperty("size"); |
- EXPECT_TRUE(observer.GetAndClearChanges().empty()); |
- EXPECT_EQ(0U, w1.shared_properties().size()); |
- EXPECT_FALSE(w1.HasSharedProperty("size")); |
- } |
-} |
- |
-namespace { |
- |
-typedef std::pair<const void*, intptr_t> PropertyChangeInfo; |
- |
-class LocalPropertyChangeObserver : public WindowObserver { |
- public: |
- explicit LocalPropertyChangeObserver(Window* window) |
- : window_(window), property_key_(nullptr), old_property_value_(-1) { |
- window_->AddObserver(this); |
- } |
- ~LocalPropertyChangeObserver() override { window_->RemoveObserver(this); } |
- |
- PropertyChangeInfo PropertyChangeInfoAndClear() { |
- PropertyChangeInfo result(property_key_, old_property_value_); |
- property_key_ = NULL; |
- old_property_value_ = -3; |
- return result; |
- } |
- |
- private: |
- void OnWindowLocalPropertyChanged(Window* window, |
- const void* key, |
- intptr_t old) override { |
- property_key_ = key; |
- old_property_value_ = old; |
- } |
- |
- Window* window_; |
- const void* property_key_; |
- intptr_t old_property_value_; |
- |
- DISALLOW_COPY_AND_ASSIGN(LocalPropertyChangeObserver); |
-}; |
- |
-} // namespace |
- |
-TEST_F(WindowObserverTest, LocalPropertyChanged) { |
- TestWindow w1; |
- LocalPropertyChangeObserver o(&w1); |
- |
- static const WindowProperty<int> prop = {-2}; |
- |
- w1.SetLocalProperty(&prop, 1); |
- EXPECT_EQ(PropertyChangeInfo(&prop, -2), o.PropertyChangeInfoAndClear()); |
- w1.SetLocalProperty(&prop, -2); |
- EXPECT_EQ(PropertyChangeInfo(&prop, 1), o.PropertyChangeInfoAndClear()); |
- w1.SetLocalProperty(&prop, 3); |
- EXPECT_EQ(PropertyChangeInfo(&prop, -2), o.PropertyChangeInfoAndClear()); |
- w1.ClearLocalProperty(&prop); |
- EXPECT_EQ(PropertyChangeInfo(&prop, 3), o.PropertyChangeInfoAndClear()); |
- |
- // Sanity check to see if |PropertyChangeInfoAndClear| really clears. |
- EXPECT_EQ(PropertyChangeInfo(reinterpret_cast<const void*>(NULL), -3), |
- o.PropertyChangeInfoAndClear()); |
-} |
- |
-TEST_F(WindowTest, RemoveTransientWindow) { |
- std::unique_ptr<TestWindow> w1(CreateTestWindow(nullptr)); |
- std::unique_ptr<TestWindow> w11(CreateTestWindow(w1.get())); |
- TestWindow* w12 = CreateTestWindow(w1.get()); |
- EXPECT_EQ(2u, w1->children().size()); |
- // w12's lifetime is now tied to w11. |
- w11->AddTransientWindow(w12); |
- w11.reset(); |
- EXPECT_EQ(0u, w1->children().size()); |
-} |
- |
-TEST_F(WindowTest, TransientWindow) { |
- std::unique_ptr<TestWindow> parent(CreateTestWindow(nullptr)); |
- std::unique_ptr<TestWindow> w1(CreateTestWindow(parent.get())); |
- std::unique_ptr<TestWindow> w3(CreateTestWindow(parent.get())); |
- |
- Window* w2 = CreateTestWindow(parent.get()); |
- EXPECT_EQ(w2, parent->children().back()); |
- ASSERT_EQ(3u, parent->children().size()); |
- |
- w1->AddTransientWindow(w2); |
- // Stack w1 at the top (end). This should force w2 to be last (on top of w1). |
- w1->MoveToFront(); |
- ASSERT_EQ(3u, parent->children().size()); |
- EXPECT_EQ(w2, parent->children().back()); |
- |
- // Destroy w1, which should also destroy w3 (since it's a transient child).A |
- w1.reset(); |
- w2 = nullptr; |
- ASSERT_EQ(1u, parent->children().size()); |
- EXPECT_EQ(w3.get(), parent->children()[0]); |
-} |
- |
-// Tests that transient windows are stacked as a unit when using order above. |
-TEST_F(WindowTest, TransientWindowsGroupAbove) { |
- std::unique_ptr<TestWindow> parent(CreateTestWindow(0, nullptr)); |
- std::unique_ptr<TestWindow> w1(CreateTestWindow(1, parent.get())); |
- |
- TestWindow* w11 = CreateTestWindow(11, parent.get()); |
- std::unique_ptr<TestWindow> w2(CreateTestWindow(2, parent.get())); |
- |
- TestWindow* w21 = CreateTestWindow(21, parent.get()); |
- TestWindow* w211 = CreateTestWindow(211, parent.get()); |
- TestWindow* w212 = CreateTestWindow(212, parent.get()); |
- TestWindow* w213 = CreateTestWindow(213, parent.get()); |
- TestWindow* w22 = CreateTestWindow(22, parent.get()); |
- ASSERT_EQ(8u, parent->children().size()); |
- |
- // w11 is now owned by w1. |
- w1->AddTransientWindow(w11); |
- // w21 is now owned by w2. |
- w2->AddTransientWindow(w21); |
- // w22 is now owned by w2. |
- w2->AddTransientWindow(w22); |
- // w211 is now owned by w21. |
- w21->AddTransientWindow(w211); |
- // w212 is now owned by w21. |
- w21->AddTransientWindow(w212); |
- // w213 is now owned by w21. |
- w21->AddTransientWindow(w213); |
- EXPECT_EQ("1 11 2 21 211 212 213 22", ChildWindowIDsAsString(parent.get())); |
- |
- // Stack w1 at the top (end), this should force w11 to be last (on top of w1). |
- w1->MoveToFront(); |
- EXPECT_EQ(w11, parent->children().back()); |
- EXPECT_EQ("2 21 211 212 213 22 1 11", ChildWindowIDsAsString(parent.get())); |
- |
- // This tests that the order in children_ array rather than in |
- // transient_children_ array is used when reinserting transient children. |
- // If transient_children_ array was used '22' would be following '21'. |
- w2->MoveToFront(); |
- EXPECT_EQ(w22, parent->children().back()); |
- EXPECT_EQ("1 11 2 21 211 212 213 22", ChildWindowIDsAsString(parent.get())); |
- |
- w11->Reorder(w2.get(), mojom::OrderDirection::ABOVE); |
- EXPECT_EQ(w11, parent->children().back()); |
- EXPECT_EQ("2 21 211 212 213 22 1 11", ChildWindowIDsAsString(parent.get())); |
- |
- w21->Reorder(w1.get(), mojom::OrderDirection::ABOVE); |
- EXPECT_EQ(w22, parent->children().back()); |
- EXPECT_EQ("1 11 2 21 211 212 213 22", ChildWindowIDsAsString(parent.get())); |
- |
- w21->Reorder(w22, mojom::OrderDirection::ABOVE); |
- EXPECT_EQ(w213, parent->children().back()); |
- EXPECT_EQ("1 11 2 22 21 211 212 213", ChildWindowIDsAsString(parent.get())); |
- |
- w11->Reorder(w21, mojom::OrderDirection::ABOVE); |
- EXPECT_EQ(w11, parent->children().back()); |
- EXPECT_EQ("2 22 21 211 212 213 1 11", ChildWindowIDsAsString(parent.get())); |
- |
- w213->Reorder(w21, mojom::OrderDirection::ABOVE); |
- EXPECT_EQ(w11, parent->children().back()); |
- EXPECT_EQ("2 22 21 213 211 212 1 11", ChildWindowIDsAsString(parent.get())); |
- |
- // No change when stacking a transient parent above its transient child. |
- w21->Reorder(w211, mojom::OrderDirection::ABOVE); |
- EXPECT_EQ(w11, parent->children().back()); |
- EXPECT_EQ("2 22 21 213 211 212 1 11", ChildWindowIDsAsString(parent.get())); |
- |
- // This tests that the order in children_ array rather than in |
- // transient_children_ array is used when reinserting transient children. |
- // If transient_children_ array was used '22' would be following '21'. |
- w2->Reorder(w1.get(), mojom::OrderDirection::ABOVE); |
- EXPECT_EQ(w212, parent->children().back()); |
- EXPECT_EQ("1 11 2 22 21 213 211 212", ChildWindowIDsAsString(parent.get())); |
- |
- w11->Reorder(w213, mojom::OrderDirection::ABOVE); |
- EXPECT_EQ(w11, parent->children().back()); |
- EXPECT_EQ("2 22 21 213 211 212 1 11", ChildWindowIDsAsString(parent.get())); |
-} |
- |
-// Tests that transient children are stacked as a unit when using order below. |
-TEST_F(WindowTest, TransientWindowsGroupBelow) { |
- std::unique_ptr<TestWindow> parent(CreateTestWindow(0, nullptr)); |
- std::unique_ptr<TestWindow> w1(CreateTestWindow(1, parent.get())); |
- |
- TestWindow* w11 = CreateTestWindow(11, parent.get()); |
- std::unique_ptr<TestWindow> w2(CreateTestWindow(2, parent.get())); |
- |
- TestWindow* w21 = CreateTestWindow(21, parent.get()); |
- TestWindow* w211 = CreateTestWindow(211, parent.get()); |
- TestWindow* w212 = CreateTestWindow(212, parent.get()); |
- TestWindow* w213 = CreateTestWindow(213, parent.get()); |
- TestWindow* w22 = CreateTestWindow(22, parent.get()); |
- ASSERT_EQ(8u, parent->children().size()); |
- |
- // w11 is now owned by w1. |
- w1->AddTransientWindow(w11); |
- // w21 is now owned by w2. |
- w2->AddTransientWindow(w21); |
- // w22 is now owned by w2. |
- w2->AddTransientWindow(w22); |
- // w211 is now owned by w21. |
- w21->AddTransientWindow(w211); |
- // w212 is now owned by w21. |
- w21->AddTransientWindow(w212); |
- // w213 is now owned by w21. |
- w21->AddTransientWindow(w213); |
- EXPECT_EQ("1 11 2 21 211 212 213 22", ChildWindowIDsAsString(parent.get())); |
- |
- // Stack w2 at the bottom, this should force w11 to be last (on top of w1). |
- // This also tests that the order in children_ array rather than in |
- // transient_children_ array is used when reinserting transient children. |
- // If transient_children_ array was used '22' would be following '21'. |
- w2->MoveToBack(); |
- EXPECT_EQ(w11, parent->children().back()); |
- EXPECT_EQ("2 21 211 212 213 22 1 11", ChildWindowIDsAsString(parent.get())); |
- |
- w1->MoveToBack(); |
- EXPECT_EQ(w22, parent->children().back()); |
- EXPECT_EQ("1 11 2 21 211 212 213 22", ChildWindowIDsAsString(parent.get())); |
- |
- w21->Reorder(w1.get(), mojom::OrderDirection::BELOW); |
- EXPECT_EQ(w11, parent->children().back()); |
- EXPECT_EQ("2 21 211 212 213 22 1 11", ChildWindowIDsAsString(parent.get())); |
- |
- w11->Reorder(w2.get(), mojom::OrderDirection::BELOW); |
- EXPECT_EQ(w22, parent->children().back()); |
- EXPECT_EQ("1 11 2 21 211 212 213 22", ChildWindowIDsAsString(parent.get())); |
- |
- w22->Reorder(w21, mojom::OrderDirection::BELOW); |
- EXPECT_EQ(w213, parent->children().back()); |
- EXPECT_EQ("1 11 2 22 21 211 212 213", ChildWindowIDsAsString(parent.get())); |
- |
- w21->Reorder(w11, mojom::OrderDirection::BELOW); |
- EXPECT_EQ(w11, parent->children().back()); |
- EXPECT_EQ("2 22 21 211 212 213 1 11", ChildWindowIDsAsString(parent.get())); |
- |
- w213->Reorder(w211, mojom::OrderDirection::BELOW); |
- EXPECT_EQ(w11, parent->children().back()); |
- EXPECT_EQ("2 22 21 213 211 212 1 11", ChildWindowIDsAsString(parent.get())); |
- |
- // No change when stacking a transient parent below its transient child. |
- w21->Reorder(w211, mojom::OrderDirection::BELOW); |
- EXPECT_EQ(w11, parent->children().back()); |
- EXPECT_EQ("2 22 21 213 211 212 1 11", ChildWindowIDsAsString(parent.get())); |
- |
- w1->Reorder(w2.get(), mojom::OrderDirection::BELOW); |
- EXPECT_EQ(w212, parent->children().back()); |
- EXPECT_EQ("1 11 2 22 21 213 211 212", ChildWindowIDsAsString(parent.get())); |
- |
- w213->Reorder(w11, mojom::OrderDirection::BELOW); |
- EXPECT_EQ(w11, parent->children().back()); |
- EXPECT_EQ("2 22 21 213 211 212 1 11", ChildWindowIDsAsString(parent.get())); |
-} |
- |
-// Tests that windows are restacked properly after a call to |
-// AddTransientWindow() or RemoveTransientWindow). |
-TEST_F(WindowTest, RestackUponAddOrRemoveTransientWindow) { |
- std::unique_ptr<TestWindow> parent(CreateTestWindow(0, nullptr)); |
- std::unique_ptr<TestWindow> windows[4]; |
- for (int i = 0; i < 4; i++) |
- windows[i].reset(CreateTestWindow(i, parent.get())); |
- |
- EXPECT_EQ("0 1 2 3", ChildWindowIDsAsString(parent.get())); |
- |
- windows[0]->AddTransientWindow(windows[2].get()); |
- EXPECT_EQ("0 2 1 3", ChildWindowIDsAsString(parent.get())); |
- |
- windows[0]->AddTransientWindow(windows[3].get()); |
- EXPECT_EQ("0 2 3 1", ChildWindowIDsAsString(parent.get())); |
- |
- windows[0]->RemoveTransientWindow(windows[2].get()); |
- EXPECT_EQ("0 3 2 1", ChildWindowIDsAsString(parent.get())); |
- |
- windows[0]->RemoveTransientWindow(windows[3].get()); |
- EXPECT_EQ("0 3 2 1", ChildWindowIDsAsString(parent.get())); |
-} |
- |
-// Tests that transient windows are stacked properly when created. |
-TEST_F(WindowTest, StackUponCreation) { |
- std::unique_ptr<TestWindow> parent(CreateTestWindow(0, nullptr)); |
- std::unique_ptr<TestWindow> window0(CreateTestWindow(1, parent.get())); |
- std::unique_ptr<TestWindow> window1(CreateTestWindow(2, parent.get())); |
- |
- TestWindow* window2 = CreateTestWindow(3, parent.get()); |
- |
- window0->AddTransientWindow(window2); |
- EXPECT_EQ("1 3 2", ChildWindowIDsAsString(parent.get())); |
-} |
- |
-namespace { |
- |
-class TransientWindowObserver : public WindowObserver { |
- public: |
- TransientWindowObserver() {} |
- ~TransientWindowObserver() override {} |
- |
- void ResetCounts() { added_count_ = removed_count_ = 0; } |
- |
- int added_count() const { return added_count_; } |
- int removed_count() const { return removed_count_; } |
- |
- // WindowObserver: |
- void OnTransientChildAdded(ui::Window* window, |
- ui::Window* transient) override { |
- added_count_++; |
- } |
- void OnTransientChildRemoved(ui::Window* window, |
- ui::Window* transient) override { |
- removed_count_++; |
- } |
- |
- private: |
- int added_count_ = 0; |
- int removed_count_ = 0; |
- |
- DISALLOW_COPY_AND_ASSIGN(TransientWindowObserver); |
-}; |
- |
-} // namespace |
- |
-// Verifies WindowObserver is notified of transient windows added/removed. |
-TEST_F(WindowTest, TransientNotifiesObserver) { |
- std::unique_ptr<TestWindow> parent(CreateTestWindow(0, nullptr)); |
- TransientWindowObserver observer; |
- parent->AddObserver(&observer); |
- std::unique_ptr<TestWindow> child(CreateTestWindow(0, nullptr)); |
- parent->AddTransientWindow(child.get()); |
- EXPECT_EQ(1, observer.added_count()); |
- EXPECT_EQ(0, observer.removed_count()); |
- observer.ResetCounts(); |
- |
- parent->RemoveTransientWindow(child.get()); |
- EXPECT_EQ(0, observer.added_count()); |
- EXPECT_EQ(1, observer.removed_count()); |
- observer.ResetCounts(); |
- |
- parent->AddTransientWindow(child.get()); |
- EXPECT_EQ(1, observer.added_count()); |
- EXPECT_EQ(0, observer.removed_count()); |
- observer.ResetCounts(); |
- |
- child.reset(); |
- EXPECT_EQ(0, observer.added_count()); |
- EXPECT_EQ(1, observer.removed_count()); |
- observer.ResetCounts(); |
-} |
- |
-} // namespace ui |