1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file. 4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/hit_test.h" 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/bubble/bubble_border.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/bubble/bubble_frame_view.h" 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/controls/button/checkbox.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/controls/button/label_button.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/test/views_test_base.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/widget/widget.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/window/dialog_client_view.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/window/dialog_delegate.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace views { 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace { 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class TestDialog : public DialogDelegateView, public ButtonListener { 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TestDialog() 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) : canceled_(false), 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) accepted_(false), 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) closeable_(false), 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) last_pressed_button_(NULL) {} 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual ~TestDialog() {} 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // DialogDelegateView overrides: 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual bool Cancel() OVERRIDE { 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) canceled_ = true; 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return closeable_; 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual bool Accept() OVERRIDE { 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) accepted_ = true; 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return closeable_; 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // DialogDelegateView overrides: 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetPreferredSize() const OVERRIDE { 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return gfx::Size(200, 200); 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual base::string16 GetWindowTitle() const OVERRIDE { return title_; } 44bee9932bab44713b74b422b4b759b49f5a222977Bo Liu virtual bool UseNewStyleForThisDialog() const OVERRIDE { return true; } 45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // ButtonListener override: 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void ButtonPressed(Button* sender, const ui::Event& event) OVERRIDE { 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) last_pressed_button_ = sender; 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Button* last_pressed_button() const { return last_pressed_button_; } 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void PressEnterAndCheckStates(Button* button) { 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ui::KeyEvent key_event(ui::ET_KEY_PRESSED, ui::VKEY_RETURN, 0, false); 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFocusManager()->OnKeyEvent(key_event); 567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const DialogClientView* client_view = GetDialogClientView(); 577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(canceled_, client_view->cancel_button()->is_default()); 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(accepted_, client_view->ok_button()->is_default()); 597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // This view does not listen for ok or cancel clicks, DialogClientView does. 607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CheckAndResetStates(button == client_view->cancel_button(), 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) button == client_view->ok_button(), 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (canceled_ || accepted_ ) ? NULL : button); 637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void CheckAndResetStates(bool canceled, bool accepted, Button* last_pressed) { 667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(canceled, canceled_); 677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) canceled_ = false; 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(accepted, accepted_); 697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) accepted_ = false; 707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(last_pressed, last_pressed_button_); 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) last_pressed_button_ = NULL; 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void TearDown() { 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) closeable_ = true; 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetWidget()->Close(); 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void set_title(const base::string16& title) { title_ = title; } 802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool canceled_; 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool accepted_; 847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Prevent the dialog from closing, for repeated ok and cancel button clicks. 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool closeable_; 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Button* last_pressed_button_; 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 title_; 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestDialog); 90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class DialogTest : public ViewsTestBase { 937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public: 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogTest() : dialog_(NULL) {} 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual ~DialogTest() {} 967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void SetUp() OVERRIDE { 987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ViewsTestBase::SetUp(); 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog_ = new TestDialog(); 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogDelegate::CreateDialogWidget(dialog_, GetContext(), NULL)->Show(); 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void TearDown() OVERRIDE { 1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog_->TearDown(); 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ViewsTestBase::TearDown(); 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TestDialog* dialog() const { return dialog_; } 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private: 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TestDialog* dialog_; 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DialogTest); 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace 117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DialogTest, DefaultButtons) { 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogClientView* client_view = dialog()->GetDialogClientView(); 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LabelButton* ok_button = client_view->ok_button(); 1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // DialogDelegate's default button (ok) should be default (and handle enter). 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(ui::DIALOG_BUTTON_OK, dialog()->GetDefaultDialogButton()); 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->PressEnterAndCheckStates(ok_button); 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Focus another button in the dialog, it should become the default. 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LabelButton* button_1 = new LabelButton(dialog(), base::string16()); 1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->AddChildView(button_1); 1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->OnWillChangeFocus(ok_button, button_1); 1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(button_1->is_default()); 1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->PressEnterAndCheckStates(button_1); 1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Focus a Checkbox (not a push button), OK should become the default again. 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Checkbox* checkbox = new Checkbox(base::string16()); 1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->AddChildView(checkbox); 1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->OnWillChangeFocus(button_1, checkbox); 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(button_1->is_default()); 1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->PressEnterAndCheckStates(ok_button); 1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Focus yet another button in the dialog, it should become the default. 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LabelButton* button_2 = new LabelButton(dialog(), base::string16()); 1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->AddChildView(button_2); 1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->OnWillChangeFocus(checkbox, button_2); 1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(button_1->is_default()); 1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(button_2->is_default()); 1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->PressEnterAndCheckStates(button_2); 1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Focus nothing, OK should become the default again. 1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->OnWillChangeFocus(button_2, NULL); 1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(button_1->is_default()); 1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(button_2->is_default()); 1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->PressEnterAndCheckStates(ok_button); 1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DialogTest, AcceptAndCancel) { 1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogClientView* client_view = dialog()->GetDialogClientView(); 1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LabelButton* ok_button = client_view->ok_button(); 1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LabelButton* cancel_button = client_view->cancel_button(); 1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Check that return/escape accelerators accept/cancel dialogs. 1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const ui::KeyEvent return_key(ui::ET_KEY_PRESSED, ui::VKEY_RETURN, 0, false); 1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->GetFocusManager()->OnKeyEvent(return_key); 1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->CheckAndResetStates(false, true, NULL); 1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const ui::KeyEvent escape_key(ui::ET_KEY_PRESSED, ui::VKEY_ESCAPE, 0, false); 1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->GetFocusManager()->OnKeyEvent(escape_key); 1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->CheckAndResetStates(true, false, NULL); 1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Check ok and cancel button behavior on a directed return key events. 1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ok_button->OnKeyPressed(return_key); 1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->CheckAndResetStates(false, true, NULL); 1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cancel_button->OnKeyPressed(return_key); 1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->CheckAndResetStates(true, false, NULL); 1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Check that return accelerators cancel dialogs if cancel is focused. 1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cancel_button->RequestFocus(); 1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->GetFocusManager()->OnKeyEvent(return_key); 1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->CheckAndResetStates(true, false, NULL); 1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DialogTest, RemoveDefaultButton) { 1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Removing buttons from the dialog here should not cause a crash on close. 1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) delete dialog()->GetDialogClientView()->ok_button(); 1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) delete dialog()->GetDialogClientView()->cancel_button(); 1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(DialogTest, HitTest) { 1872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Ensure that the new style's BubbleFrameView hit-tests as expected. 1882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const NonClientView* view = dialog()->GetWidget()->non_client_view(); 1892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch BubbleFrameView* frame = static_cast<BubbleFrameView*>(view->frame_view()); 1902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const int border = frame->bubble_border()->GetBorderThickness(); 1912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch struct { 1932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const int point; 1942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const int hit; 1952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } cases[] = { 1962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { border, HTSYSMENU }, 1972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { border + 10, HTSYSMENU }, 1982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { border + 20, HTCAPTION }, 1992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { border + 40, HTCLIENT }, 2002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { border + 50, HTCLIENT }, 2012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 1000, HTNOWHERE }, 2022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch }; 2032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 2042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 2052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch gfx::Point point(cases[i].point, cases[i].point); 2062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_EQ(cases[i].hit, frame->NonClientHitTest(point)) 2072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch << " with border: " << border << ", at point " << cases[i].point; 208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(DialogTest, BoundsAccommodateTitle) { 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestDialog* dialog2(new TestDialog()); 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dialog2->set_title(base::ASCIIToUTF16("Title")); 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DialogDelegate::CreateDialogWidget(dialog2, GetContext(), NULL); 2152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 2162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Titled dialogs have taller initial frame bounds than untitled dialogs. 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) View* frame1 = dialog()->GetWidget()->non_client_view()->frame_view(); 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) View* frame2 = dialog2->GetWidget()->non_client_view()->frame_view(); 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_LT(frame1->GetPreferredSize().height(), 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame2->GetPreferredSize().height()); 2212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Giving the default test dialog a title will yield the same bounds. 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dialog()->set_title(base::ASCIIToUTF16("Title")); 2242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch dialog()->GetWidget()->UpdateWindowTitle(); 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(frame1->GetPreferredSize().height(), 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame2->GetPreferredSize().height()); 2272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 2282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace views 230