15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/simple_message_box.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/run_loop.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/ui/views/constrained_window_views.h"
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/message_box_view.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/dialog_delegate.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_WIN)
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/win/message_box_win.h"
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/win/hwnd_util.h"
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass SimpleMessageBoxViews : public views::DialogDelegate {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SimpleMessageBoxViews(const base::string16& title,
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        const base::string16& message,
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        MessageBoxType type,
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        const base::string16& yes_text,
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                        const base::string16& no_text,
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        bool is_system_modal);
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~SimpleMessageBoxViews();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MessageBoxResult RunDialogAndGetResult();
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::DialogDelegate:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetDialogButtons() const OVERRIDE;
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetDialogButtonLabel(
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ui::DialogButton button) const OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Cancel() OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Accept() OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::WidgetDelegate:
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetWindowTitle() const OVERRIDE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DeleteDelegate() OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ui::ModalType GetModalType() const OVERRIDE;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual views::View* GetContentsView() OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual views::Widget* GetWidget() OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const views::Widget* GetWidget() const OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This terminates the nested message-loop.
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Done();
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 window_title_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const MessageBoxType type_;
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 yes_text_;
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 no_text_;
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MessageBoxResult* result_;
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool is_system_modal_;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::MessageBoxView* message_box_view_;
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Closure quit_runloop_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SimpleMessageBoxViews);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SimpleMessageBoxViews, public:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)SimpleMessageBoxViews::SimpleMessageBoxViews(const base::string16& title,
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                             const base::string16& message,
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                             MessageBoxType type,
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                             const base::string16& yes_text,
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                             const base::string16& no_text,
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                             bool is_system_modal)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : window_title_(title),
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type_(type),
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      yes_text_(yes_text),
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      no_text_(no_text),
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      result_(NULL),
885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      is_system_modal_(is_system_modal),
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      message_box_view_(new views::MessageBoxView(
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          views::MessageBoxView::InitParams(message))) {
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (yes_text_.empty()) {
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (type_ == MESSAGE_BOX_TYPE_QUESTION)
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      yes_text_ =
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          l10n_util::GetStringUTF16(IDS_CONFIRM_MESSAGEBOX_YES_BUTTON_LABEL);
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    else if (type_ == MESSAGE_BOX_TYPE_OK_CANCEL)
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      yes_text_ = l10n_util::GetStringUTF16(IDS_OK);
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    else
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      yes_text_ = l10n_util::GetStringUTF16(IDS_OK);
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (no_text_.empty()) {
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (type_ == MESSAGE_BOX_TYPE_QUESTION)
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      no_text_ =
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          l10n_util::GetStringUTF16(IDS_CONFIRM_MESSAGEBOX_NO_BUTTON_LABEL);
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    else if (type_ == MESSAGE_BOX_TYPE_OK_CANCEL)
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      no_text_ = l10n_util::GetStringUTF16(IDS_CANCEL);
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochSimpleMessageBoxViews::~SimpleMessageBoxViews() {
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)MessageBoxResult SimpleMessageBoxViews::RunDialogAndGetResult() {
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MessageBoxResult result = MESSAGE_BOX_RESULT_NO;
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  result_ = &result;
11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // TODO(pkotwicz): Exit message loop when the dialog is closed by some other
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // means than |Cancel| or |Accept|. crbug.com/404385
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::RunLoop run_loop;
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  quit_runloop_ = run_loop.QuitClosure();
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  run_loop.Run();
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return result;
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SimpleMessageBoxViews::GetDialogButtons() const {
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (type_ == MESSAGE_BOX_TYPE_QUESTION ||
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      type_ == MESSAGE_BOX_TYPE_OK_CANCEL) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL;
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::DIALOG_BUTTON_OK;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 SimpleMessageBoxViews::GetDialogButtonLabel(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::DialogButton button) const {
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (button == ui::DIALOG_BUTTON_CANCEL)
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return no_text_;
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return yes_text_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SimpleMessageBoxViews::Cancel() {
143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  *result_ = MESSAGE_BOX_RESULT_NO;
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Done();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SimpleMessageBoxViews::Accept() {
149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  *result_ = MESSAGE_BOX_RESULT_YES;
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Done();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 SimpleMessageBoxViews::GetWindowTitle() const {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_title_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SimpleMessageBoxViews::DeleteDelegate() {
159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  delete this;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::ModalType SimpleMessageBoxViews::GetModalType() const {
1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return is_system_modal_ ? ui::MODAL_TYPE_SYSTEM : ui::MODAL_TYPE_WINDOW;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* SimpleMessageBoxViews::GetContentsView() {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return message_box_view_;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::Widget* SimpleMessageBoxViews::GetWidget() {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return message_box_view_->GetWidget();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const views::Widget* SimpleMessageBoxViews::GetWidget() const {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return message_box_view_->GetWidget();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SimpleMessageBoxViews, private:
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void SimpleMessageBoxViews::Done() {
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CHECK(!quit_runloop_.is_null());
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  quit_runloop_.Run();
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_WIN)
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)UINT GetMessageBoxFlagsFromType(MessageBoxType type) {
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  UINT flags = MB_SETFOREGROUND;
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  switch (type) {
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MESSAGE_BOX_TYPE_INFORMATION:
191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return flags | MB_OK | MB_ICONINFORMATION;
192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MESSAGE_BOX_TYPE_WARNING:
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return flags | MB_OK | MB_ICONWARNING;
194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MESSAGE_BOX_TYPE_QUESTION:
195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return flags | MB_YESNO | MB_ICONQUESTION;
196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MESSAGE_BOX_TYPE_OK_CANCEL:
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return flags | MB_OKCANCEL | MB_ICONWARNING;
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NOTREACHED();
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return flags | MB_OK | MB_ICONWARNING;
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)MessageBoxResult ShowMessageBoxImpl(gfx::NativeWindow parent,
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                    const base::string16& title,
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                    const base::string16& message,
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    MessageBoxType type,
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                    const base::string16& yes_text,
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                    const base::string16& no_text) {
210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Views dialogs cannot be shown outside the UI thread message loop or if the
211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // ResourceBundle is not initialized yet.
212e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Fallback to logging with a default response or a Windows MessageBox.
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!base::MessageLoopForUI::IsCurrent() ||
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      !base::MessageLoopForUI::current()->is_running() ||
216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      !ResourceBundle::HasSharedInstance()) {
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int result = ui::MessageBox(views::HWNDForNativeWindow(parent), message,
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                title, GetMessageBoxFlagsFromType(type));
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return (result == IDYES || result == IDOK) ?
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        MESSAGE_BOX_RESULT_YES : MESSAGE_BOX_RESULT_NO;
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
222e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#else
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!base::MessageLoopForUI::IsCurrent() ||
224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      !ResourceBundle::HasSharedInstance()) {
225e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    LOG(ERROR) << "Unable to show a dialog outside the UI thread message loop: "
226e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch               << title << " - " << message;
227e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return MESSAGE_BOX_RESULT_NO;
228e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SimpleMessageBoxViews* dialog =
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new SimpleMessageBoxViews(title,
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                message,
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                type,
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                yes_text,
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                no_text,
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                parent == NULL  // is_system_modal
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                );
239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  CreateBrowserModalDialogViews(dialog, parent)->Show();
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // NOTE: |dialog| may have been deleted by the time |RunDialogAndGetResult()|
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // returns.
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return dialog->RunDialogAndGetResult();
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace
247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)MessageBoxResult ShowMessageBox(gfx::NativeWindow parent,
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                const base::string16& title,
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                const base::string16& message,
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                MessageBoxType type) {
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return ShowMessageBoxImpl(
253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      parent, title, message, type, base::string16(), base::string16());
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)MessageBoxResult ShowMessageBoxWithButtonText(gfx::NativeWindow parent,
257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              const base::string16& title,
258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              const base::string16& message,
259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              const base::string16& yes_text,
260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              const base::string16& no_text) {
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return ShowMessageBoxImpl(
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      parent, title, message, MESSAGE_BOX_TYPE_QUESTION, yes_text, no_text);
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chrome
266