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