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