view_unittest_aura.cc 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ui/views/view.h"
  5. #include <memory>
  6. #include "ui/aura/window.h"
  7. #include "ui/compositor/layer.h"
  8. #include "ui/compositor/layer_tree_owner.h"
  9. #include "ui/compositor/test/test_layers.h"
  10. #include "ui/gfx/geometry/rect.h"
  11. #include "ui/views/test/views_test_base.h"
  12. #include "ui/views/view_constants_aura.h"
  13. #include "ui/views/widget/widget.h"
  14. #include "ui/wm/core/window_util.h"
  15. namespace views {
  16. namespace {
  17. // Creates a widget of TYPE_CONTROL.
  18. // The caller takes ownership of the returned widget.
  19. Widget* CreateControlWidget(aura::Window* parent, const gfx::Rect& bounds) {
  20. Widget::InitParams params(Widget::InitParams::TYPE_CONTROL);
  21. params.parent = parent;
  22. params.bounds = bounds;
  23. Widget* widget = new Widget();
  24. widget->Init(std::move(params));
  25. return widget;
  26. }
  27. // Returns a view with a layer with the passed in |bounds| and |layer_name|.
  28. // The caller takes ownership of the returned view.
  29. View* CreateViewWithLayer(const gfx::Rect& bounds, const char* layer_name) {
  30. View* view = new View();
  31. view->SetBoundsRect(bounds);
  32. view->SetPaintToLayer();
  33. view->layer()->SetName(layer_name);
  34. return view;
  35. }
  36. } // namespace
  37. class ViewAuraTest : public ViewsTestBase {
  38. public:
  39. ViewAuraTest() = default;
  40. ViewAuraTest(const ViewAuraTest&) = delete;
  41. ViewAuraTest& operator=(const ViewAuraTest&) = delete;
  42. ~ViewAuraTest() override = default;
  43. const View::Views& GetViewsWithLayers(Widget* widget) {
  44. return widget->GetViewsWithLayers();
  45. }
  46. };
  47. // Test that wm::RecreateLayers() recreates the layers for all child windows and
  48. // all child views and that the z-order of the recreated layers matches that of
  49. // the original layers.
  50. // Test hierarchy:
  51. // w1
  52. // +-- v1
  53. // +-- v2 (no layer)
  54. // +-- v3 (no layer)
  55. // +-- v4
  56. // +-- w2
  57. // +-- v5
  58. // +-- v6
  59. // +-- v7
  60. // +-- v8
  61. // +-- v9
  62. TEST_F(ViewAuraTest, RecreateLayersWithWindows) {
  63. Widget* w1 = CreateControlWidget(GetContext(), gfx::Rect(0, 0, 100, 100));
  64. w1->GetNativeView()->layer()->SetName("w1");
  65. View* v2 = new View();
  66. v2->SetBounds(0, 1, 100, 101);
  67. View* v3 = new View();
  68. v3->SetBounds(0, 2, 100, 102);
  69. View* w2_host_view = new View();
  70. View* v1 = CreateViewWithLayer(gfx::Rect(0, 3, 100, 103), "v1");
  71. ui::Layer* v1_layer = v1->layer();
  72. w1->GetRootView()->AddChildView(v1);
  73. w1->GetRootView()->AddChildView(v2);
  74. v2->AddChildView(v3);
  75. View* v4 = CreateViewWithLayer(gfx::Rect(0, 4, 100, 104), "v4");
  76. ui::Layer* v4_layer = v4->layer();
  77. v2->AddChildView(v4);
  78. w1->GetRootView()->AddChildView(w2_host_view);
  79. View* v7 = CreateViewWithLayer(gfx::Rect(0, 4, 100, 104), "v7");
  80. ui::Layer* v7_layer = v7->layer();
  81. w1->GetRootView()->AddChildView(v7);
  82. View* v8 = CreateViewWithLayer(gfx::Rect(0, 4, 100, 104), "v8");
  83. ui::Layer* v8_layer = v8->layer();
  84. v7->AddChildView(v8);
  85. View* v9 = CreateViewWithLayer(gfx::Rect(0, 4, 100, 104), "v9");
  86. ui::Layer* v9_layer = v9->layer();
  87. v7->AddChildView(v9);
  88. Widget* w2 =
  89. CreateControlWidget(w1->GetNativeView(), gfx::Rect(0, 5, 100, 105));
  90. w2->GetNativeView()->layer()->SetName("w2");
  91. w2->GetNativeView()->SetProperty(kHostViewKey, w2_host_view);
  92. View* v5 = CreateViewWithLayer(gfx::Rect(0, 6, 100, 106), "v5");
  93. w2->GetRootView()->AddChildView(v5);
  94. View* v6 = CreateViewWithLayer(gfx::Rect(0, 7, 100, 107), "v6");
  95. ui::Layer* v6_layer = v6->layer();
  96. v5->AddChildView(v6);
  97. // Test the initial order of the layers.
  98. ui::Layer* w1_layer = w1->GetNativeView()->layer();
  99. ASSERT_EQ("w1", w1_layer->name());
  100. ASSERT_EQ("v1 v4 w2 v7", ui::test::ChildLayerNamesAsString(*w1_layer));
  101. ui::Layer* w2_layer = w1_layer->children()[2];
  102. ASSERT_EQ("v5", ui::test::ChildLayerNamesAsString(*w2_layer));
  103. ui::Layer* v5_layer = w2_layer->children()[0];
  104. ASSERT_EQ("v6", ui::test::ChildLayerNamesAsString(*v5_layer));
  105. // Verify the value of Widget::GetRootLayers(). It should only include layers
  106. // from layer-backed Views descended from the Widget's root View.
  107. View::Views old_w1_views_with_layers = GetViewsWithLayers(w1);
  108. ASSERT_EQ(3u, old_w1_views_with_layers.size());
  109. EXPECT_EQ(v1, old_w1_views_with_layers[0]);
  110. EXPECT_EQ(v4, old_w1_views_with_layers[1]);
  111. EXPECT_EQ(v7, old_w1_views_with_layers[2]);
  112. {
  113. std::unique_ptr<ui::LayerTreeOwner> cloned_owner(
  114. wm::RecreateLayers(w1->GetNativeView()));
  115. EXPECT_EQ(w1_layer, cloned_owner->root());
  116. EXPECT_NE(w1_layer, w1->GetNativeView()->layer());
  117. // The old layers should still exist and have the same hierarchy.
  118. ASSERT_EQ("w1", w1_layer->name());
  119. ASSERT_EQ("v1 v4 w2 v7", ui::test::ChildLayerNamesAsString(*w1_layer));
  120. ASSERT_EQ("v5", ui::test::ChildLayerNamesAsString(*w2_layer));
  121. ASSERT_EQ("v6", ui::test::ChildLayerNamesAsString(*v5_layer));
  122. EXPECT_EQ("v8 v9", ui::test::ChildLayerNamesAsString(*v7_layer));
  123. ASSERT_EQ(4u, w1_layer->children().size());
  124. EXPECT_EQ(v1_layer, w1_layer->children()[0]);
  125. EXPECT_EQ(v4_layer, w1_layer->children()[1]);
  126. EXPECT_EQ(w2_layer, w1_layer->children()[2]);
  127. EXPECT_EQ(v7_layer, w1_layer->children()[3]);
  128. ASSERT_EQ(1u, w2_layer->children().size());
  129. EXPECT_EQ(v5_layer, w2_layer->children()[0]);
  130. ASSERT_EQ(1u, v5_layer->children().size());
  131. EXPECT_EQ(v6_layer, v5_layer->children()[0]);
  132. ASSERT_EQ(0u, v6_layer->children().size());
  133. EXPECT_EQ(2u, v7_layer->children().size());
  134. EXPECT_EQ(v8_layer, v7_layer->children()[0]);
  135. EXPECT_EQ(v9_layer, v7_layer->children()[1]);
  136. // The cloned layers should have the same hierarchy as old, but with new
  137. // ui::Layer instances.
  138. ui::Layer* w1_new_layer = w1->GetNativeView()->layer();
  139. EXPECT_EQ("w1", w1_new_layer->name());
  140. EXPECT_NE(w1_layer, w1_new_layer);
  141. ui::Layer* v1_new_layer = w1_new_layer->children()[0];
  142. ui::Layer* v4_new_layer = w1_new_layer->children()[1];
  143. ASSERT_EQ("v1 v4 w2 v7", ui::test::ChildLayerNamesAsString(*w1_new_layer));
  144. EXPECT_NE(v1_layer, v1_new_layer);
  145. EXPECT_NE(v4_layer, v4_new_layer);
  146. ui::Layer* w2_new_layer = w1_new_layer->children()[2];
  147. ASSERT_EQ("v5", ui::test::ChildLayerNamesAsString(*w2_new_layer));
  148. ui::Layer* v5_new_layer = w2_new_layer->children()[0];
  149. ASSERT_EQ("v6", ui::test::ChildLayerNamesAsString(*v5_new_layer));
  150. ui::Layer* v7_new_layer = w1_new_layer->children()[3];
  151. ASSERT_EQ("v8 v9", ui::test::ChildLayerNamesAsString(*v7_new_layer));
  152. EXPECT_NE(v7_layer, v7_new_layer);
  153. // Ensure Widget::GetViewsWithLayers() is correctly updated.
  154. View::Views new_w1_views_with_layers = GetViewsWithLayers(w1);
  155. ASSERT_EQ(3u, new_w1_views_with_layers.size());
  156. EXPECT_EQ(v1, new_w1_views_with_layers[0]);
  157. EXPECT_EQ(v4, new_w1_views_with_layers[1]);
  158. EXPECT_EQ(v7, new_w1_views_with_layers[2]);
  159. }
  160. w1->CloseNow();
  161. }
  162. } // namespace views