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/button_dropdown.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/controls/button/checkbox.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/controls/button/label_button.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/test/views_test_base.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/widget/widget.h" 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/views/window/dialog_client_view.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/window/dialog_delegate.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace views { 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace { 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class TestDialog : public DialogDelegateView, public ButtonListener { 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TestDialog() 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) : canceled_(false), 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) accepted_(false), 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) closeable_(false), 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) last_pressed_button_(NULL) {} 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual ~TestDialog() {} 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // DialogDelegateView overrides: 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual bool Cancel() OVERRIDE { 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) canceled_ = true; 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return closeable_; 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual bool Accept() OVERRIDE { 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) accepted_ = true; 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return closeable_; 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // DialogDelegateView overrides: 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual gfx::Size GetPreferredSize() OVERRIDE { return gfx::Size(200, 200); } 422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch virtual string16 GetWindowTitle() const OVERRIDE { return title_; } 43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // ButtonListener override: 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void ButtonPressed(Button* sender, const ui::Event& event) OVERRIDE { 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) last_pressed_button_ = sender; 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Button* last_pressed_button() const { return last_pressed_button_; } 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void PressEnterAndCheckStates(Button* button) { 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ui::KeyEvent key_event(ui::ET_KEY_PRESSED, ui::VKEY_RETURN, 0, false); 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFocusManager()->OnKeyEvent(key_event); 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const DialogClientView* client_view = GetDialogClientView(); 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(canceled_, client_view->cancel_button()->is_default()); 567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(accepted_, client_view->ok_button()->is_default()); 577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // This view does not listen for ok or cancel clicks, DialogClientView does. 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CheckAndResetStates(button == client_view->cancel_button(), 597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) button == client_view->ok_button(), 607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (canceled_ || accepted_ ) ? NULL : button); 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void CheckAndResetStates(bool canceled, bool accepted, Button* last_pressed) { 647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(canceled, canceled_); 657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) canceled_ = false; 667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(accepted, accepted_); 677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) accepted_ = false; 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(last_pressed, last_pressed_button_); 697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) last_pressed_button_ = NULL; 707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void TearDown() { 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) closeable_ = true; 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetWidget()->Close(); 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch void set_title(const string16& title) { title_ = title; } 782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool canceled_; 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool accepted_; 827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Prevent the dialog from closing, for repeated ok and cancel button clicks. 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool closeable_; 847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Button* last_pressed_button_; 852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch string16 title_; 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestDialog); 88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class DialogTest : public ViewsTestBase { 917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public: 927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogTest() : dialog_(NULL) {} 937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual ~DialogTest() {} 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void SetUp() OVERRIDE { 967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ViewsTestBase::SetUp(); 977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog_ = new TestDialog(); 987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogDelegate::CreateDialogWidget(dialog_, GetContext(), NULL)->Show(); 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void TearDown() OVERRIDE { 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog_->TearDown(); 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ViewsTestBase::TearDown(); 1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TestDialog* dialog() const { return dialog_; } 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private: 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TestDialog* dialog_; 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DialogTest); 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace 115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DialogTest, DefaultButtons) { 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogClientView* client_view = dialog()->GetDialogClientView(); 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LabelButton* ok_button = client_view->ok_button(); 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LabelButton* cancel_button = client_view->cancel_button(); 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // DialogDelegate's default button (ok) should be default (and handle enter). 1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(ui::DIALOG_BUTTON_OK, dialog()->GetDefaultDialogButton()); 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->PressEnterAndCheckStates(ok_button); 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Focus another button in the dialog, it should become the default. 1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LabelButton* button_1 = new LabelButton(dialog(), string16()); 1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->AddChildView(button_1); 1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->OnWillChangeFocus(ok_button, button_1); 1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(button_1->is_default()); 1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->PressEnterAndCheckStates(button_1); 1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Focus a Checkbox (not a push button), OK should become the default again. 1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Checkbox* checkbox = new Checkbox(string16()); 1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->AddChildView(checkbox); 1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->OnWillChangeFocus(button_1, checkbox); 1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(button_1->is_default()); 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->PressEnterAndCheckStates(ok_button); 1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Focus yet another button in the dialog, it should become the default. 1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LabelButton* button_2 = new LabelButton(dialog(), string16()); 1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->AddChildView(button_2); 1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->OnWillChangeFocus(checkbox, button_2); 1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(button_1->is_default()); 1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(button_2->is_default()); 1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->PressEnterAndCheckStates(button_2); 1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Focus nothing, OK should become the default again. 1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->OnWillChangeFocus(button_2, NULL); 1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(button_1->is_default()); 1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(button_2->is_default()); 1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->PressEnterAndCheckStates(ok_button); 1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // A ButtonDropDown will handle events, but ok will be still be default. 1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ButtonDropDown* drop_down = new ButtonDropDown(dialog(), NULL); 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->AddChildView(drop_down); 1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) drop_down->SetBoundsRect(gfx::Rect(0, 0, 100, 100)); 1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const gfx::Point point(1, 1); 1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->OnWillChangeFocus(NULL, drop_down); 1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) drop_down->OnMousePressed(ui::MouseEvent( 1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ui::ET_MOUSE_PRESSED, point, point, ui::EF_LEFT_MOUSE_BUTTON)); 1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) drop_down->OnMouseReleased(ui::MouseEvent( 1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ui::ET_MOUSE_RELEASED, point, point, ui::EF_LEFT_MOUSE_BUTTON)); 1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->CheckAndResetStates(false, false, drop_down); 1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(button_1->is_default()); 1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(button_2->is_default()); 1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->PressEnterAndCheckStates(ok_button); 1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Focus the cancel button, it should become the default. 1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) client_view->OnWillChangeFocus(drop_down, cancel_button); 1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(button_1->is_default()); 1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(button_2->is_default()); 1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->PressEnterAndCheckStates(cancel_button); 1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DialogTest, AcceptAndCancel) { 1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogClientView* client_view = dialog()->GetDialogClientView(); 1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LabelButton* ok_button = client_view->ok_button(); 1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LabelButton* cancel_button = client_view->cancel_button(); 1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Check that return/escape accelerators accept/cancel dialogs. 1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const ui::KeyEvent return_key(ui::ET_KEY_PRESSED, ui::VKEY_RETURN, 0, false); 1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->GetFocusManager()->OnKeyEvent(return_key); 1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->CheckAndResetStates(false, true, NULL); 1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const ui::KeyEvent escape_key(ui::ET_KEY_PRESSED, ui::VKEY_ESCAPE, 0, false); 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->GetFocusManager()->OnKeyEvent(escape_key); 1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->CheckAndResetStates(true, false, NULL); 1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Check ok and cancel button behavior on a directed return key events. 1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ok_button->OnKeyPressed(return_key); 1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->CheckAndResetStates(false, true, NULL); 1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cancel_button->OnKeyPressed(return_key); 1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->CheckAndResetStates(true, false, NULL); 1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Check that return accelerators cancel dialogs if cancel is focused. 1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cancel_button->RequestFocus(); 1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->GetFocusManager()->OnKeyEvent(return_key); 1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dialog()->CheckAndResetStates(true, false, NULL); 1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DialogTest, RemoveDefaultButton) { 2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Removing buttons from the dialog here should not cause a crash on close. 2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) delete dialog()->GetDialogClientView()->ok_button(); 2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) delete dialog()->GetDialogClientView()->cancel_button(); 2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(DialogTest, HitTest) { 2072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!DialogDelegate::UseNewStyle()) 2082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return; 209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Ensure that the new style's BubbleFrameView hit-tests as expected. 2112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const NonClientView* view = dialog()->GetWidget()->non_client_view(); 2122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch BubbleFrameView* frame = static_cast<BubbleFrameView*>(view->frame_view()); 2132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const int border = frame->bubble_border()->GetBorderThickness(); 2142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 2152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch struct { 2162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const int point; 2172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const int hit; 2182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } cases[] = { 2192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { border, HTSYSMENU }, 2202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { border + 10, HTSYSMENU }, 2212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { border + 20, HTCAPTION }, 2222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { border + 40, HTCLIENT }, 2232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { border + 50, HTCLIENT }, 2242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch { 1000, HTNOWHERE }, 2252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch }; 2262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 2272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 2282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch gfx::Point point(cases[i].point, cases[i].point); 2292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_EQ(cases[i].hit, frame->NonClientHitTest(point)) 2302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch << " with border: " << border << ", at point " << cases[i].point; 231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_F(DialogTest, InitialBoundsAccommodateTitle) { 2352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!DialogDelegate::UseNewStyle()) 2362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return; 2372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 2382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch TestDialog* titled_dialog(new TestDialog()); 2392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch titled_dialog->set_title(ASCIIToUTF16("Title")); 2402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch DialogDelegate::CreateDialogWidget(titled_dialog, GetContext(), NULL); 2412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 2422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Titled dialogs have taller initial frame bounds than untitled dialogs. 2432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_GT(titled_dialog->GetWidget()->GetWindowBoundsInScreen().height(), 2442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch dialog()->GetWidget()->GetWindowBoundsInScreen().height()); 2452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 2462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Giving the default test dialog a title will make the bounds the same. 2472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch dialog()->set_title(ASCIIToUTF16("Title")); 2482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch dialog()->GetWidget()->UpdateWindowTitle(); 2492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch View* frame = dialog()->GetWidget()->non_client_view()->frame_view(); 2502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_EQ(titled_dialog->GetWidget()->GetWindowBoundsInScreen().height(), 2512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch frame->GetPreferredSize().height()); 2522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 2532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace views 255