Home | History | Annotate | Download | only in views
      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 
      5 #include "ui/views/view.h"
      6 
      7 #include "base/memory/scoped_ptr.h"
      8 #include "ui/aura/window.h"
      9 #include "ui/compositor/layer.h"
     10 #include "ui/compositor/layer_tree_owner.h"
     11 #include "ui/compositor/test/test_layers.h"
     12 #include "ui/gfx/geometry/rect.h"
     13 #include "ui/views/test/views_test_base.h"
     14 #include "ui/views/view_constants_aura.h"
     15 #include "ui/views/widget/widget.h"
     16 #include "ui/wm/core/window_util.h"
     17 
     18 namespace views {
     19 
     20 namespace {
     21 
     22 // Creates a widget of TYPE_CONTROL.
     23 // The caller takes ownership of the returned widget.
     24 Widget* CreateControlWidget(aura::Window* parent, const gfx::Rect& bounds) {
     25   Widget::InitParams params(Widget::InitParams::TYPE_CONTROL);
     26   params.parent = parent;
     27   params.bounds = bounds;
     28   Widget* widget = new Widget();
     29   widget->Init(params);
     30   return widget;
     31 }
     32 
     33 // Returns a view with a layer with the passed in |bounds| and |layer_name|.
     34 // The caller takes ownership of the returned view.
     35 View* CreateViewWithLayer(const gfx::Rect& bounds, const char* layer_name) {
     36   View* view = new View();
     37   view->SetBoundsRect(bounds);
     38   view->SetPaintToLayer(true);
     39   view->layer()->set_name(layer_name);
     40   return view;
     41 }
     42 
     43 }  // namespace
     44 
     45 typedef ViewsTestBase ViewAuraTest;
     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()->set_name("w1");
     65 
     66   View* v2 = new View();
     67   v2->SetBounds(0, 1, 100, 101);
     68   View* v3 = new View();
     69   v3->SetBounds(0, 2, 100, 102);
     70   View* w2_host_view = new View();
     71 
     72   View* v1 = CreateViewWithLayer(gfx::Rect(0, 3, 100, 103), "v1");
     73   ui::Layer* v1_layer = v1->layer();
     74   w1->GetRootView()->AddChildView(v1);
     75   w1->GetRootView()->AddChildView(v2);
     76   v2->AddChildView(v3);
     77   View* v4 = CreateViewWithLayer(gfx::Rect(0, 4, 100, 104), "v4");
     78   ui::Layer* v4_layer = v4->layer();
     79   v2->AddChildView(v4);
     80 
     81   w1->GetRootView()->AddChildView(w2_host_view);
     82   View* v7 = CreateViewWithLayer(gfx::Rect(0, 4, 100, 104), "v7");
     83   ui::Layer* v7_layer = v7->layer();
     84   w1->GetRootView()->AddChildView(v7);
     85 
     86   View* v8 = CreateViewWithLayer(gfx::Rect(0, 4, 100, 104), "v8");
     87   ui::Layer* v8_layer = v8->layer();
     88   v7->AddChildView(v8);
     89 
     90   View* v9 = CreateViewWithLayer(gfx::Rect(0, 4, 100, 104), "v9");
     91   ui::Layer* v9_layer = v9->layer();
     92   v7->AddChildView(v9);
     93 
     94   Widget* w2 =
     95       CreateControlWidget(w1->GetNativeView(), gfx::Rect(0, 5, 100, 105));
     96   w2->GetNativeView()->layer()->set_name("w2");
     97   w2->GetNativeView()->SetProperty(kHostViewKey, w2_host_view);
     98 
     99   View* v5 = CreateViewWithLayer(gfx::Rect(0, 6, 100, 106), "v5");
    100   w2->GetRootView()->AddChildView(v5);
    101   View* v6 = CreateViewWithLayer(gfx::Rect(0, 7, 100, 107), "v6");
    102   ui::Layer* v6_layer = v6->layer();
    103   v5->AddChildView(v6);
    104 
    105   // Test the initial order of the layers.
    106   ui::Layer* w1_layer = w1->GetNativeView()->layer();
    107   ASSERT_EQ("w1", w1_layer->name());
    108   ASSERT_EQ("v1 v4 w2 v7", ui::test::ChildLayerNamesAsString(*w1_layer));
    109   ui::Layer* w2_layer = w1_layer->children()[2];
    110   ASSERT_EQ("v5", ui::test::ChildLayerNamesAsString(*w2_layer));
    111   ui::Layer* v5_layer = w2_layer->children()[0];
    112   ASSERT_EQ("v6", ui::test::ChildLayerNamesAsString(*v5_layer));
    113 
    114   {
    115     scoped_ptr<ui::LayerTreeOwner> cloned_owner(
    116         wm::RecreateLayers(w1->GetNativeView()));
    117     EXPECT_EQ(w1_layer, cloned_owner->root());
    118     EXPECT_NE(w1_layer, w1->GetNativeView()->layer());
    119 
    120     // The old layers should still exist and have the same hierarchy.
    121     ASSERT_EQ("w1", w1_layer->name());
    122     ASSERT_EQ("v1 v4 w2 v7", ui::test::ChildLayerNamesAsString(*w1_layer));
    123     ASSERT_EQ("v5", ui::test::ChildLayerNamesAsString(*w2_layer));
    124     ASSERT_EQ("v6", ui::test::ChildLayerNamesAsString(*v5_layer));
    125     EXPECT_EQ("v8 v9", ui::test::ChildLayerNamesAsString(*v7_layer));
    126 
    127     ASSERT_EQ(4u, w1_layer->children().size());
    128     EXPECT_EQ(v1_layer, w1_layer->children()[0]);
    129     EXPECT_EQ(v4_layer, w1_layer->children()[1]);
    130     EXPECT_EQ(w2_layer, w1_layer->children()[2]);
    131     EXPECT_EQ(v7_layer, w1_layer->children()[3]);
    132 
    133     ASSERT_EQ(1u, w2_layer->children().size());
    134     EXPECT_EQ(v5_layer, w2_layer->children()[0]);
    135 
    136     ASSERT_EQ(1u, v5_layer->children().size());
    137     EXPECT_EQ(v6_layer, v5_layer->children()[0]);
    138 
    139     ASSERT_EQ(0u, v6_layer->children().size());
    140 
    141     EXPECT_EQ(2u, v7_layer->children().size());
    142     EXPECT_EQ(v8_layer, v7_layer->children()[0]);
    143     EXPECT_EQ(v9_layer, v7_layer->children()[1]);
    144 
    145     // The cloned layers should have the same hierarchy as old.
    146     ui::Layer* w1_new_layer = w1->GetNativeView()->layer();
    147     EXPECT_EQ("w1", w1_new_layer->name());
    148     ASSERT_EQ("v1 v4 w2 v7", ui::test::ChildLayerNamesAsString(*w1_new_layer));
    149     ui::Layer* w2_new_layer = w1_new_layer->children()[2];
    150     ASSERT_EQ("v5", ui::test::ChildLayerNamesAsString(*w2_new_layer));
    151     ui::Layer* v5_new_layer = w2_new_layer->children()[0];
    152     ASSERT_EQ("v6", ui::test::ChildLayerNamesAsString(*v5_new_layer));
    153     ui::Layer* v7_new_layer = w1_new_layer->children()[3];
    154     ASSERT_EQ("v8 v9", ui::test::ChildLayerNamesAsString(*v7_new_layer));
    155   }
    156   // The views and the widgets are destroyed when AuraTestHelper::TearDown()
    157   // destroys root_window().
    158 }
    159 
    160 }  // namespace views
    161