Home | History | Annotate | Download | only in corewm
      1 // Copyright 2013 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/corewm/window_util.h"
      6 
      7 #include "ui/aura/root_window.h"
      8 #include "ui/aura/test/aura_test_base.h"
      9 #include "ui/aura/window.h"
     10 #include "ui/compositor/test/test_layers.h"
     11 #include "ui/views/view_constants_aura.h"
     12 #include "ui/views/widget/widget.h"
     13 
     14 class WindowUtilTest : public aura::test::AuraTestBase {
     15  public:
     16   WindowUtilTest() {
     17   }
     18 
     19   virtual ~WindowUtilTest() {
     20   }
     21 
     22   // Creates a widget of TYPE_CONTROL.
     23   // The caller takes ownership of the returned widget.
     24   views::Widget* CreateControlWidget(
     25       aura::Window* parent,
     26       const gfx::Rect& bounds) const WARN_UNUSED_RESULT {
     27     views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL);
     28     params.parent = parent;
     29     params.bounds = bounds;
     30     views::Widget* widget = new views::Widget();
     31     widget->Init(params);
     32     return widget;
     33   }
     34 
     35   // Returns a view with a layer with the passed in |bounds| and |layer_name|.
     36   // The caller takes ownership of the returned view.
     37   views::View* CreateViewWithLayer(
     38       const gfx::Rect& bounds,
     39       const char* layer_name) const WARN_UNUSED_RESULT {
     40     views::View* view = new views::View();
     41     view->SetBoundsRect(bounds);
     42     view->SetPaintToLayer(true);
     43     view->layer()->set_name(layer_name);
     44     return view;
     45   }
     46 
     47  private:
     48   DISALLOW_COPY_AND_ASSIGN(WindowUtilTest);
     49 };
     50 
     51 // Test that RecreateWindowLayers() recreates the layers for all child windows
     52 // and all child views and that the z-order of the recreated layers matches that
     53 // of the original layers.
     54 // Test hierarchy:
     55 // w1
     56 // +-- v1
     57 // +-- v2 (no layer)
     58 //     +-- v3 (no layer)
     59 //     +-- v4
     60 // +-- w2
     61 //     +-- v5
     62 //         +-- v6
     63 // +-- v7
     64 TEST_F(WindowUtilTest, RecreateWindowLayers) {
     65   views::Widget* w1 = CreateControlWidget(root_window(),
     66                                           gfx::Rect(0, 0, 100, 100));
     67   w1->GetNativeView()->layer()->set_name("w1");
     68 
     69   views::View* v2 = new views::View();
     70   v2->SetBounds(0, 1, 100, 101);
     71   views::View* v3 = new views::View();
     72   v3->SetBounds(0, 2, 100, 102);
     73   views::View* w2_host_view = new views::View();
     74 
     75   w1->GetRootView()->AddChildView(CreateViewWithLayer(
     76       gfx::Rect(0, 3, 100, 103), "v1"));
     77   w1->GetRootView()->AddChildView(v2);
     78   v2->AddChildView(v3);
     79   v2->AddChildView(CreateViewWithLayer(gfx::Rect(0, 4, 100, 104), "v4"));
     80 
     81   w1->GetRootView()->AddChildView(w2_host_view);
     82   w1->GetRootView()->AddChildView(CreateViewWithLayer(
     83       gfx::Rect(0, 4, 100, 104), "v7"));
     84 
     85   views::Widget* w2 = CreateControlWidget(w1->GetNativeView(),
     86                                           gfx::Rect(0, 5, 100, 105));
     87   w2->GetNativeView()->layer()->set_name("w2");
     88   w2->GetNativeView()->SetProperty(views::kHostViewKey, w2_host_view);
     89 
     90   views::View* v5 = CreateViewWithLayer(gfx::Rect(0, 6, 100, 106), "v5");
     91   w2->GetRootView()->AddChildView(v5);
     92   v5->AddChildView(CreateViewWithLayer(gfx::Rect(0, 7, 100, 107), "v6"));
     93 
     94   // Test the initial order of the layers.
     95   ui::Layer* w1_layer = w1->GetNativeView()->layer();
     96   ASSERT_EQ("w1", w1_layer->name());
     97   ASSERT_EQ("v1 v4 w2 v7", ui::test::ChildLayerNamesAsString(*w1_layer));
     98   ui::Layer* w2_layer = w1_layer->children()[2];
     99   ASSERT_EQ("v5", ui::test::ChildLayerNamesAsString(*w2_layer));
    100   ui::Layer* v5_layer = w2_layer->children()[0];
    101   ASSERT_EQ("v6", ui::test::ChildLayerNamesAsString(*v5_layer));
    102 
    103   w1_layer = views::corewm::RecreateWindowLayers(w1->GetNativeView(), false);
    104 
    105   // The order of the layers returned by RecreateWindowLayers() should match the
    106   // order of the layers prior to calling RecreateWindowLayers().
    107   ASSERT_EQ("w1", w1_layer->name());
    108   ASSERT_EQ("v1 v4 w2 v7", ui::test::ChildLayerNamesAsString(*w1_layer));
    109   w2_layer = w1_layer->children()[2];
    110   ASSERT_EQ("v5", ui::test::ChildLayerNamesAsString(*w2_layer));
    111   v5_layer = w2_layer->children()[0];
    112   ASSERT_EQ("v6", ui::test::ChildLayerNamesAsString(*v5_layer));
    113 
    114   views::corewm::DeepDeleteLayers(w1_layer);
    115   // The views and the widgets are destroyed when AuraTestHelper::TearDown()
    116   // destroys root_window().
    117 }
    118