Home | History | Annotate | Download | only in layout
      1 // Copyright (c) 2012 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/layout/grid_layout.h"
      6 
      7 #include "base/compiler_specific.h"
      8 #include "testing/gtest/include/gtest/gtest.h"
      9 #include "ui/views/view.h"
     10 
     11 namespace views {
     12 
     13 void ExpectViewBoundsEquals(int x, int y, int w, int h,
     14                             const View* view) {
     15   EXPECT_EQ(x, view->x());
     16   EXPECT_EQ(y, view->y());
     17   EXPECT_EQ(w, view->width());
     18   EXPECT_EQ(h, view->height());
     19 }
     20 
     21 class SettableSizeView : public View {
     22  public:
     23   explicit SettableSizeView(const gfx::Size& pref) {
     24     pref_ = pref;
     25   }
     26 
     27   virtual gfx::Size GetPreferredSize() const OVERRIDE {
     28     return pref_;
     29   }
     30 
     31  private:
     32    gfx::Size pref_;
     33 };
     34 
     35 // A view with fixed circumference that trades height for width.
     36 class FlexibleView : public View {
     37  public:
     38   explicit FlexibleView(int circumference) {
     39     circumference_ = circumference;
     40   }
     41 
     42   virtual gfx::Size GetPreferredSize() const OVERRIDE {
     43     return gfx::Size(0, circumference_ / 2);
     44   }
     45 
     46   virtual int GetHeightForWidth(int width) const OVERRIDE {
     47     return std::max(0, circumference_ / 2 - width);
     48   }
     49 
     50  private:
     51    int circumference_;
     52 };
     53 
     54 class GridLayoutTest : public testing::Test {
     55  public:
     56   GridLayoutTest() : layout(&host) {}
     57 
     58   void RemoveAll() {
     59     for (int i = host.child_count() - 1; i >= 0; i--)
     60       host.RemoveChildView(host.child_at(i));
     61   }
     62 
     63   void GetPreferredSize() {
     64     pref = layout.GetPreferredSize(&host);
     65   }
     66 
     67   gfx::Size pref;
     68   gfx::Rect bounds;
     69   View host;
     70   GridLayout layout;
     71 };
     72 
     73 class GridLayoutAlignmentTest : public testing::Test {
     74  public:
     75    GridLayoutAlignmentTest()
     76        : v1(gfx::Size(10, 20)),
     77          layout(&host) {}
     78 
     79   void RemoveAll() {
     80     for (int i = host.child_count() - 1; i >= 0; i--)
     81       host.RemoveChildView(host.child_at(i));
     82   }
     83 
     84   void TestAlignment(GridLayout::Alignment alignment, gfx::Rect* bounds) {
     85     ColumnSet* c1 = layout.AddColumnSet(0);
     86     c1->AddColumn(alignment, alignment, 1, GridLayout::USE_PREF, 0, 0);
     87     layout.StartRow(1, 0);
     88     layout.AddView(&v1);
     89     gfx::Size pref = layout.GetPreferredSize(&host);
     90     EXPECT_EQ(gfx::Size(10, 20), pref);
     91     host.SetBounds(0, 0, 100, 100);
     92     layout.Layout(&host);
     93     *bounds = v1.bounds();
     94     RemoveAll();
     95   }
     96 
     97   View host;
     98   SettableSizeView v1;
     99   GridLayout layout;
    100 };
    101 
    102 TEST_F(GridLayoutAlignmentTest, Fill) {
    103   gfx::Rect bounds;
    104   TestAlignment(GridLayout::FILL, &bounds);
    105   EXPECT_EQ(gfx::Rect(0, 0, 100, 100), bounds);
    106 }
    107 
    108 TEST_F(GridLayoutAlignmentTest, Leading) {
    109   gfx::Rect bounds;
    110   TestAlignment(GridLayout::LEADING, &bounds);
    111   EXPECT_EQ(gfx::Rect(0, 0, 10, 20), bounds);
    112 }
    113 
    114 TEST_F(GridLayoutAlignmentTest, Center) {
    115   gfx::Rect bounds;
    116   TestAlignment(GridLayout::CENTER, &bounds);
    117   EXPECT_EQ(gfx::Rect(45, 40, 10, 20), bounds);
    118 }
    119 
    120 TEST_F(GridLayoutAlignmentTest, Trailing) {
    121   gfx::Rect bounds;
    122   TestAlignment(GridLayout::TRAILING, &bounds);
    123   EXPECT_EQ(gfx::Rect(90, 80, 10, 20), bounds);
    124 }
    125 
    126 TEST_F(GridLayoutTest, TwoColumns) {
    127   SettableSizeView v1(gfx::Size(10, 20));
    128   SettableSizeView v2(gfx::Size(20, 20));
    129   ColumnSet* c1 = layout.AddColumnSet(0);
    130   c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    131                 0, GridLayout::USE_PREF, 0, 0);
    132   c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    133                 0, GridLayout::USE_PREF, 0, 0);
    134   layout.StartRow(0, 0);
    135   layout.AddView(&v1);
    136   layout.AddView(&v2);
    137 
    138   GetPreferredSize();
    139   EXPECT_EQ(gfx::Size(30, 20), pref);
    140 
    141   host.SetBounds(0, 0, pref.width(), pref.height());
    142   layout.Layout(&host);
    143   ExpectViewBoundsEquals(0, 0, 10, 20, &v1);
    144   ExpectViewBoundsEquals(10, 0, 20, 20, &v2);
    145 
    146   RemoveAll();
    147 }
    148 
    149 TEST_F(GridLayoutTest, ColSpan1) {
    150   SettableSizeView v1(gfx::Size(100, 20));
    151   SettableSizeView v2(gfx::Size(10, 40));
    152   ColumnSet* c1 = layout.AddColumnSet(0);
    153   c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    154                 0, GridLayout::USE_PREF, 0, 0);
    155   c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    156                 1, GridLayout::USE_PREF, 0, 0);
    157   layout.StartRow(0, 0);
    158   layout.AddView(&v1, 2, 1);
    159   layout.StartRow(0, 0);
    160   layout.AddView(&v2);
    161 
    162   GetPreferredSize();
    163   EXPECT_EQ(gfx::Size(100, 60), pref);
    164 
    165   host.SetBounds(0, 0, pref.width(), pref.height());
    166   layout.Layout(&host);
    167   ExpectViewBoundsEquals(0, 0, 100, 20, &v1);
    168   ExpectViewBoundsEquals(0, 20, 10, 40, &v2);
    169 
    170   RemoveAll();
    171 }
    172 
    173 TEST_F(GridLayoutTest, ColSpan2) {
    174   SettableSizeView v1(gfx::Size(100, 20));
    175   SettableSizeView v2(gfx::Size(10, 20));
    176   ColumnSet* c1 = layout.AddColumnSet(0);
    177   c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    178                 1, GridLayout::USE_PREF, 0, 0);
    179   c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    180                 0, GridLayout::USE_PREF, 0, 0);
    181   layout.StartRow(0, 0);
    182   layout.AddView(&v1, 2, 1);
    183   layout.StartRow(0, 0);
    184   layout.SkipColumns(1);
    185   layout.AddView(&v2);
    186 
    187   GetPreferredSize();
    188   EXPECT_EQ(gfx::Size(100, 40), pref);
    189 
    190   host.SetBounds(0, 0, pref.width(), pref.height());
    191   layout.Layout(&host);
    192   ExpectViewBoundsEquals(0, 0, 100, 20, &v1);
    193   ExpectViewBoundsEquals(90, 20, 10, 20, &v2);
    194 
    195   RemoveAll();
    196 }
    197 
    198 TEST_F(GridLayoutTest, ColSpan3) {
    199   SettableSizeView v1(gfx::Size(100, 20));
    200   SettableSizeView v2(gfx::Size(10, 20));
    201   SettableSizeView v3(gfx::Size(10, 20));
    202   ColumnSet* c1 = layout.AddColumnSet(0);
    203   c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    204                 0, GridLayout::USE_PREF, 0, 0);
    205   c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    206                 0, GridLayout::USE_PREF, 0, 0);
    207   layout.StartRow(0, 0);
    208   layout.AddView(&v1, 2, 1);
    209   layout.StartRow(0, 0);
    210   layout.AddView(&v2);
    211   layout.AddView(&v3);
    212 
    213   GetPreferredSize();
    214   EXPECT_EQ(gfx::Size(100, 40), pref);
    215 
    216   host.SetBounds(0, 0, pref.width(), pref.height());
    217   layout.Layout(&host);
    218   ExpectViewBoundsEquals(0, 0, 100, 20, &v1);
    219   ExpectViewBoundsEquals(0, 20, 10, 20, &v2);
    220   ExpectViewBoundsEquals(50, 20, 10, 20, &v3);
    221 
    222   RemoveAll();
    223 }
    224 
    225 
    226 TEST_F(GridLayoutTest, ColSpan4) {
    227   ColumnSet* set = layout.AddColumnSet(0);
    228 
    229   set->AddColumn(GridLayout::LEADING, GridLayout::LEADING, 0,
    230                  GridLayout::USE_PREF, 0, 0);
    231   set->AddColumn(GridLayout::LEADING, GridLayout::LEADING, 0,
    232                  GridLayout::USE_PREF, 0, 0);
    233 
    234   SettableSizeView v1(gfx::Size(10, 10));
    235   SettableSizeView v2(gfx::Size(10, 10));
    236   SettableSizeView v3(gfx::Size(25, 20));
    237   layout.StartRow(0, 0);
    238   layout.AddView(&v1);
    239   layout.AddView(&v2);
    240   layout.StartRow(0, 0);
    241   layout.AddView(&v3, 2, 1);
    242 
    243   GetPreferredSize();
    244   EXPECT_EQ(gfx::Size(25, 30), pref);
    245 
    246   host.SetBounds(0, 0, pref.width(), pref.height());
    247   layout.Layout(&host);
    248   ExpectViewBoundsEquals(0, 0, 10, 10, &v1);
    249   ExpectViewBoundsEquals(12, 0, 10, 10, &v2);
    250   ExpectViewBoundsEquals(0, 10, 25, 20, &v3);
    251 
    252   RemoveAll();
    253 }
    254 
    255 // Verifies the sizing of a view that doesn't start in the first column
    256 // and has a column span > 1 (crbug.com/254092).
    257 TEST_F(GridLayoutTest, ColSpanStartSecondColumn) {
    258   ColumnSet* set = layout.AddColumnSet(0);
    259 
    260   set->AddColumn(GridLayout::FILL, GridLayout::FILL, 0,
    261                  GridLayout::USE_PREF, 0, 0);
    262   set->AddColumn(GridLayout::FILL, GridLayout::FILL, 0,
    263                  GridLayout::USE_PREF, 0, 0);
    264   set->AddColumn(GridLayout::FILL, GridLayout::FILL, 0,
    265                  GridLayout::FIXED, 10, 0);
    266 
    267   SettableSizeView v1(gfx::Size(10, 10));
    268   SettableSizeView v2(gfx::Size(20, 10));
    269 
    270   layout.StartRow(0, 0);
    271   layout.AddView(&v1);
    272   layout.AddView(&v2, 2, 1);
    273 
    274   GetPreferredSize();
    275   EXPECT_EQ(gfx::Size(30, 10), pref);
    276 
    277   host.SetBounds(0, 0, pref.width(), pref.height());
    278   layout.Layout(&host);
    279   ExpectViewBoundsEquals(0, 0, 10, 10, &v1);
    280   ExpectViewBoundsEquals(10, 0, 20, 10, &v2);
    281 
    282   RemoveAll();
    283 }
    284 
    285 TEST_F(GridLayoutTest, SameSizeColumns) {
    286   SettableSizeView v1(gfx::Size(50, 20));
    287   SettableSizeView v2(gfx::Size(10, 10));
    288   ColumnSet* c1 = layout.AddColumnSet(0);
    289   c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    290                 0, GridLayout::USE_PREF, 0, 0);
    291   c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    292                 0, GridLayout::USE_PREF, 0, 0);
    293   c1->LinkColumnSizes(0, 1, -1);
    294   layout.StartRow(0, 0);
    295   layout.AddView(&v1);
    296   layout.AddView(&v2);
    297 
    298   gfx::Size pref = layout.GetPreferredSize(&host);
    299   EXPECT_EQ(gfx::Size(100, 20), pref);
    300 
    301   host.SetBounds(0, 0, pref.width(), pref.height());
    302   layout.Layout(&host);
    303   ExpectViewBoundsEquals(0, 0, 50, 20, &v1);
    304   ExpectViewBoundsEquals(50, 0, 10, 10, &v2);
    305 
    306   RemoveAll();
    307 }
    308 
    309 TEST_F(GridLayoutTest, HorizontalResizeTest1) {
    310   SettableSizeView v1(gfx::Size(50, 20));
    311   SettableSizeView v2(gfx::Size(10, 10));
    312   ColumnSet* c1 = layout.AddColumnSet(0);
    313   c1->AddColumn(GridLayout::FILL, GridLayout::LEADING,
    314                 1, GridLayout::USE_PREF, 0, 0);
    315   c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    316                 0, GridLayout::USE_PREF, 0, 0);
    317   layout.StartRow(0, 0);
    318   layout.AddView(&v1);
    319   layout.AddView(&v2);
    320 
    321   host.SetBounds(0, 0, 110, 20);
    322   layout.Layout(&host);
    323   ExpectViewBoundsEquals(0, 0, 100, 20, &v1);
    324   ExpectViewBoundsEquals(100, 0, 10, 10, &v2);
    325 
    326   RemoveAll();
    327 }
    328 
    329 TEST_F(GridLayoutTest, HorizontalResizeTest2) {
    330   SettableSizeView v1(gfx::Size(50, 20));
    331   SettableSizeView v2(gfx::Size(10, 10));
    332   ColumnSet* c1 = layout.AddColumnSet(0);
    333   c1->AddColumn(GridLayout::FILL, GridLayout::LEADING,
    334                 1, GridLayout::USE_PREF, 0, 0);
    335   c1->AddColumn(GridLayout::TRAILING, GridLayout::LEADING,
    336                 1, GridLayout::USE_PREF, 0, 0);
    337   layout.StartRow(0, 0);
    338   layout.AddView(&v1);
    339   layout.AddView(&v2);
    340 
    341   host.SetBounds(0, 0, 120, 20);
    342   layout.Layout(&host);
    343   ExpectViewBoundsEquals(0, 0, 80, 20, &v1);
    344   ExpectViewBoundsEquals(110, 0, 10, 10, &v2);
    345 
    346   RemoveAll();
    347 }
    348 
    349 // Tests that space leftover due to rounding is distributed to the last
    350 // resizable column.
    351 TEST_F(GridLayoutTest, HorizontalResizeTest3) {
    352   SettableSizeView v1(gfx::Size(10, 10));
    353   SettableSizeView v2(gfx::Size(10, 10));
    354   SettableSizeView v3(gfx::Size(10, 10));
    355   ColumnSet* c1 = layout.AddColumnSet(0);
    356   c1->AddColumn(GridLayout::FILL, GridLayout::LEADING,
    357                 1, GridLayout::USE_PREF, 0, 0);
    358   c1->AddColumn(GridLayout::FILL, GridLayout::LEADING,
    359                 1, GridLayout::USE_PREF, 0, 0);
    360   c1->AddColumn(GridLayout::TRAILING, GridLayout::LEADING,
    361                 0, GridLayout::USE_PREF, 0, 0);
    362   layout.StartRow(0, 0);
    363   layout.AddView(&v1);
    364   layout.AddView(&v2);
    365   layout.AddView(&v3);
    366 
    367   host.SetBounds(0, 0, 31, 10);
    368   layout.Layout(&host);
    369   ExpectViewBoundsEquals(0, 0, 10, 10, &v1);
    370   ExpectViewBoundsEquals(10, 0, 11, 10, &v2);
    371   ExpectViewBoundsEquals(21, 0, 10, 10, &v3);
    372 
    373   RemoveAll();
    374 }
    375 
    376 TEST_F(GridLayoutTest, TestVerticalResize1) {
    377   SettableSizeView v1(gfx::Size(50, 20));
    378   SettableSizeView v2(gfx::Size(10, 10));
    379   ColumnSet* c1 = layout.AddColumnSet(0);
    380   c1->AddColumn(GridLayout::FILL, GridLayout::FILL,
    381                 1, GridLayout::USE_PREF, 0, 0);
    382   layout.StartRow(1, 0);
    383   layout.AddView(&v1);
    384   layout.StartRow(0, 0);
    385   layout.AddView(&v2);
    386 
    387   GetPreferredSize();
    388   EXPECT_EQ(gfx::Size(50, 30), pref);
    389 
    390   host.SetBounds(0, 0, 50, 100);
    391   layout.Layout(&host);
    392   ExpectViewBoundsEquals(0, 0, 50, 90, &v1);
    393   ExpectViewBoundsEquals(0, 90, 50, 10, &v2);
    394 
    395   RemoveAll();
    396 }
    397 
    398 TEST_F(GridLayoutTest, Insets) {
    399   SettableSizeView v1(gfx::Size(10, 20));
    400   ColumnSet* c1 = layout.AddColumnSet(0);
    401   layout.SetInsets(1, 2, 3, 4);
    402   c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    403                 0, GridLayout::USE_PREF, 0, 0);
    404   layout.StartRow(0, 0);
    405   layout.AddView(&v1);
    406 
    407   GetPreferredSize();
    408   EXPECT_EQ(gfx::Size(16, 24), pref);
    409 
    410   host.SetBounds(0, 0, pref.width(), pref.height());
    411   layout.Layout(&host);
    412   ExpectViewBoundsEquals(2, 1, 10, 20, &v1);
    413 
    414   RemoveAll();
    415 }
    416 
    417 TEST_F(GridLayoutTest, FixedSize) {
    418   layout.SetInsets(2, 2, 2, 2);
    419 
    420   ColumnSet* set = layout.AddColumnSet(0);
    421 
    422   int column_count = 4;
    423   int title_width = 100;
    424   int row_count = 2;
    425   int pref_width = 10;
    426   int pref_height = 20;
    427 
    428   for (int i = 0; i < column_count; ++i) {
    429     set->AddColumn(GridLayout::CENTER,
    430                    GridLayout::CENTER,
    431                    0,
    432                    GridLayout::FIXED,
    433                    title_width,
    434                    title_width);
    435   }
    436 
    437   for (int row = 0; row < row_count; ++row) {
    438     layout.StartRow(0, 0);
    439     for (int col = 0; col < column_count; ++col) {
    440       layout.AddView(new SettableSizeView(gfx::Size(pref_width, pref_height)));
    441     }
    442   }
    443 
    444   layout.Layout(&host);
    445 
    446   for (int i = 0; i < column_count; ++i) {
    447     for (int row = 0; row < row_count; ++row) {
    448       View* view = host.child_at(row * column_count + i);
    449       ExpectViewBoundsEquals(
    450           2 + title_width * i + (title_width - pref_width) / 2,
    451           2 + pref_height * row,
    452           pref_width,
    453           pref_height, view);
    454     }
    455   }
    456 
    457   GetPreferredSize();
    458   EXPECT_EQ(gfx::Size(column_count * title_width + 4,
    459                       row_count * pref_height + 4), pref);
    460 }
    461 
    462 TEST_F(GridLayoutTest, RowSpanWithPaddingRow) {
    463   ColumnSet* set = layout.AddColumnSet(0);
    464 
    465   set->AddColumn(GridLayout::CENTER,
    466                  GridLayout::CENTER,
    467                  0,
    468                  GridLayout::FIXED,
    469                  10,
    470                  10);
    471 
    472   layout.StartRow(0, 0);
    473   layout.AddView(new SettableSizeView(gfx::Size(10, 10)), 1, 2);
    474   layout.AddPaddingRow(0, 10);
    475 }
    476 
    477 TEST_F(GridLayoutTest, RowSpan) {
    478   ColumnSet* set = layout.AddColumnSet(0);
    479 
    480   set->AddColumn(GridLayout::LEADING,
    481                  GridLayout::LEADING,
    482                  0,
    483                  GridLayout::USE_PREF,
    484                  0,
    485                  0);
    486   set->AddColumn(GridLayout::LEADING,
    487                  GridLayout::LEADING,
    488                  0,
    489                  GridLayout::USE_PREF,
    490                  0,
    491                  0);
    492 
    493   layout.StartRow(0, 0);
    494   layout.AddView(new SettableSizeView(gfx::Size(20, 10)));
    495   layout.AddView(new SettableSizeView(gfx::Size(20, 40)), 1, 2);
    496   layout.StartRow(1, 0);
    497   View* s3 = new SettableSizeView(gfx::Size(20, 10));
    498   layout.AddView(s3);
    499 
    500   GetPreferredSize();
    501   EXPECT_EQ(gfx::Size(40, 40), pref);
    502 
    503   host.SetBounds(0, 0, pref.width(), pref.height());
    504   layout.Layout(&host);
    505   ExpectViewBoundsEquals(0, 10, 20, 10, s3);
    506 }
    507 
    508 TEST_F(GridLayoutTest, RowSpan2) {
    509   ColumnSet* set = layout.AddColumnSet(0);
    510 
    511   set->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    512                  0, GridLayout::USE_PREF, 0, 0);
    513   set->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    514                  0,GridLayout::USE_PREF, 0, 0);
    515 
    516   layout.StartRow(0, 0);
    517   layout.AddView(new SettableSizeView(gfx::Size(20, 20)));
    518   View* s3 = new SettableSizeView(gfx::Size(64, 64));
    519   layout.AddView(s3, 1, 3);
    520 
    521   layout.AddPaddingRow(0, 10);
    522 
    523   layout.StartRow(0, 0);
    524   layout.AddView(new SettableSizeView(gfx::Size(10, 20)));
    525 
    526   GetPreferredSize();
    527   EXPECT_EQ(gfx::Size(84, 64), pref);
    528 
    529   host.SetBounds(0, 0, pref.width(), pref.height());
    530   layout.Layout(&host);
    531   ExpectViewBoundsEquals(20, 0, 64, 64, s3);
    532 }
    533 
    534 TEST_F(GridLayoutTest, FixedViewWidth) {
    535   ColumnSet* set = layout.AddColumnSet(0);
    536 
    537   set->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    538                  0, GridLayout::USE_PREF, 0, 0);
    539   set->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    540                  0,GridLayout::USE_PREF, 0, 0);
    541 
    542   layout.StartRow(0, 0);
    543   View* view = new SettableSizeView(gfx::Size(30, 40));
    544   layout.AddView(view, 1, 1, GridLayout::LEADING, GridLayout::LEADING, 10, 0);
    545 
    546   GetPreferredSize();
    547   EXPECT_EQ(10, pref.width());
    548   EXPECT_EQ(40, pref.height());
    549 
    550   host.SetBounds(0, 0, pref.width(), pref.height());
    551   layout.Layout(&host);
    552   ExpectViewBoundsEquals(0, 0, 10, 40, view);
    553 }
    554 
    555 TEST_F(GridLayoutTest, FixedViewHeight) {
    556   ColumnSet* set = layout.AddColumnSet(0);
    557 
    558   set->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    559                  0, GridLayout::USE_PREF, 0, 0);
    560   set->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
    561                  0,GridLayout::USE_PREF, 0, 0);
    562 
    563   layout.StartRow(0, 0);
    564   View* view = new SettableSizeView(gfx::Size(30, 40));
    565   layout.AddView(view, 1, 1, GridLayout::LEADING, GridLayout::LEADING, 0, 10);
    566 
    567   GetPreferredSize();
    568   EXPECT_EQ(30, pref.width());
    569   EXPECT_EQ(10, pref.height());
    570 
    571   host.SetBounds(0, 0, pref.width(), pref.height());
    572   layout.Layout(&host);
    573   ExpectViewBoundsEquals(0, 0, 30, 10, view);
    574 }
    575 
    576 // Make sure that for views that span columns the underlying columns are resized
    577 // based on the resize percent of the column.
    578 TEST_F(GridLayoutTest, ColumnSpanResizing) {
    579   ColumnSet* set = layout.AddColumnSet(0);
    580 
    581   set->AddColumn(GridLayout::FILL, GridLayout::CENTER,
    582                  2, GridLayout::USE_PREF, 0, 0);
    583   set->AddColumn(GridLayout::FILL, GridLayout::CENTER,
    584                  4, GridLayout::USE_PREF, 0, 0);
    585 
    586   layout.StartRow(0, 0);
    587   // span_view spans two columns and is twice as big the views added below.
    588   View* span_view = new SettableSizeView(gfx::Size(12, 40));
    589   layout.AddView(span_view, 2, 1, GridLayout::LEADING, GridLayout::LEADING);
    590 
    591   layout.StartRow(0, 0);
    592   View* view1 = new SettableSizeView(gfx::Size(2, 40));
    593   View* view2 = new SettableSizeView(gfx::Size(4, 40));
    594   layout.AddView(view1);
    595   layout.AddView(view2);
    596 
    597   host.SetBounds(0, 0, 12, 80);
    598   layout.Layout(&host);
    599 
    600   ExpectViewBoundsEquals(0, 0, 12, 40, span_view);
    601 
    602   // view1 should be 4 pixels wide
    603   // column_pref + (remaining_width * column_resize / total_column_resize) =
    604   // 2 + (6 * 2 / 6).
    605   ExpectViewBoundsEquals(0, 40, 4, 40, view1);
    606 
    607   // And view2 should be 8 pixels wide:
    608   // 4 + (6 * 4 / 6).
    609   ExpectViewBoundsEquals(4, 40, 8, 40, view2);
    610 }
    611 
    612 // Check that GetPreferredSize() takes resizing of columns into account when
    613 // there is additional space in the case we have column sets of different
    614 // preferred sizes.
    615 TEST_F(GridLayoutTest, ColumnResizingOnGetPreferredSize) {
    616   ColumnSet* set = layout.AddColumnSet(0);
    617   set->AddColumn(GridLayout::FILL, GridLayout::CENTER,
    618                  1, GridLayout::USE_PREF, 0, 0);
    619 
    620   set = layout.AddColumnSet(1);
    621   set->AddColumn(GridLayout::FILL, GridLayout::CENTER,
    622                  1, GridLayout::USE_PREF, 0, 0);
    623 
    624   set = layout.AddColumnSet(2);
    625   set->AddColumn(GridLayout::FILL, GridLayout::CENTER,
    626                  1, GridLayout::USE_PREF, 0, 0);
    627 
    628   // Make a row containing a flexible view that trades width for height.
    629   layout.StartRow(0, 0);
    630   View* view1 = new FlexibleView(100);
    631   layout.AddView(view1, 1, 1, GridLayout::FILL, GridLayout::LEADING);
    632 
    633   // The second row contains a view of fixed size that will enforce a column
    634   // width of 20 pixels.
    635   layout.StartRow(0, 1);
    636   View* view2 = new SettableSizeView(gfx::Size(20, 20));
    637   layout.AddView(view2, 1, 1, GridLayout::FILL, GridLayout::LEADING);
    638 
    639   // Add another flexible view in row three in order to ensure column set
    640   // ordering doesn't influence sizing behaviour.
    641   layout.StartRow(0, 2);
    642   View* view3 = new FlexibleView(40);
    643   layout.AddView(view3, 1, 1, GridLayout::FILL, GridLayout::LEADING);
    644 
    645   // We expect a height of 50: 30 from the variable width view in the first row
    646   // plus 20 from the statically sized view in the second row. The flexible
    647   // view in the third row should contribute no height.
    648   EXPECT_EQ(gfx::Size(20, 50), layout.GetPreferredSize(&host));
    649 }
    650 
    651 TEST_F(GridLayoutTest, MinimumPreferredSize) {
    652   SettableSizeView v1(gfx::Size(10, 20));
    653   ColumnSet* set = layout.AddColumnSet(0);
    654   set->AddColumn(GridLayout::FILL, GridLayout::FILL,
    655                  0, GridLayout::USE_PREF, 0, 0);
    656   layout.StartRow(0, 0);
    657   layout.AddView(&v1);
    658 
    659   GetPreferredSize();
    660   EXPECT_EQ(gfx::Size(10, 20), pref);
    661 
    662   layout.set_minimum_size(gfx::Size(40, 40));
    663   GetPreferredSize();
    664   EXPECT_EQ(gfx::Size(40, 40), pref);
    665 
    666   RemoveAll();
    667 }
    668 
    669 }  // namespace views
    670