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