1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/views/javascript_app_modal_dialog_views.h" 6 7 #include "base/strings/utf_string_conversions.h" 8 #include "chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.h" 9 #include "chrome/browser/ui/views/constrained_window_views.h" 10 #include "grit/generated_resources.h" 11 #include "ui/base/l10n/l10n_util.h" 12 #include "ui/events/keycodes/keyboard_codes.h" 13 #include "ui/views/controls/message_box_view.h" 14 #include "ui/views/controls/textfield/textfield.h" 15 #include "ui/views/widget/widget.h" 16 #include "ui/views/window/dialog_client_view.h" 17 18 #if defined(USE_X11) && !defined(OS_CHROMEOS) 19 #include "chrome/browser/ui/views/javascript_app_modal_event_blocker_x11.h" 20 #endif 21 22 //////////////////////////////////////////////////////////////////////////////// 23 // JavaScriptAppModalDialogViews, public: 24 25 JavaScriptAppModalDialogViews::JavaScriptAppModalDialogViews( 26 JavaScriptAppModalDialog* parent) 27 : parent_(parent) { 28 int options = views::MessageBoxView::DETECT_DIRECTIONALITY; 29 if (parent->javascript_message_type() == 30 content::JAVASCRIPT_MESSAGE_TYPE_PROMPT) 31 options |= views::MessageBoxView::HAS_PROMPT_FIELD; 32 33 views::MessageBoxView::InitParams params(parent->message_text()); 34 params.options = options; 35 params.default_prompt = parent->default_prompt_text(); 36 message_box_view_ = new views::MessageBoxView(params); 37 DCHECK(message_box_view_); 38 39 message_box_view_->AddAccelerator( 40 ui::Accelerator(ui::VKEY_C, ui::EF_CONTROL_DOWN)); 41 if (parent->display_suppress_checkbox()) { 42 message_box_view_->SetCheckBoxLabel( 43 l10n_util::GetStringUTF16(IDS_JAVASCRIPT_MESSAGEBOX_SUPPRESS_OPTION)); 44 } 45 } 46 47 JavaScriptAppModalDialogViews::~JavaScriptAppModalDialogViews() { 48 } 49 50 //////////////////////////////////////////////////////////////////////////////// 51 // JavaScriptAppModalDialogViews, NativeAppModalDialog implementation: 52 53 int JavaScriptAppModalDialogViews::GetAppModalDialogButtons() const { 54 return GetDialogButtons(); 55 } 56 57 void JavaScriptAppModalDialogViews::ShowAppModalDialog() { 58 #if defined(USE_X11) && !defined(OS_CHROMEOS) 59 // BrowserView::CanActivate() ensures that other browser windows cannot be 60 // activated for long while the dialog is visible. Block events to other 61 // browser windows so that the user cannot interact with other browser windows 62 // in the short time that the other browser windows are active. This hack is 63 // unnecessary on Windows and Chrome OS. 64 // TODO(pkotwicz): Find a better way of doing this and remove this hack. 65 if (!event_blocker_x11_.get()) { 66 event_blocker_x11_.reset( 67 new JavascriptAppModalEventBlockerX11(GetWidget()->GetNativeView())); 68 } 69 #endif 70 71 GetWidget()->Show(); 72 } 73 74 void JavaScriptAppModalDialogViews::ActivateAppModalDialog() { 75 GetWidget()->Show(); 76 GetWidget()->Activate(); 77 } 78 79 void JavaScriptAppModalDialogViews::CloseAppModalDialog() { 80 GetWidget()->Close(); 81 } 82 83 void JavaScriptAppModalDialogViews::AcceptAppModalDialog() { 84 GetDialogClientView()->AcceptWindow(); 85 } 86 87 void JavaScriptAppModalDialogViews::CancelAppModalDialog() { 88 GetDialogClientView()->CancelWindow(); 89 } 90 91 ////////////////////////////////////////////////////////////////////////////// 92 // JavaScriptAppModalDialogViews, views::DialogDelegate implementation: 93 94 int JavaScriptAppModalDialogViews::GetDefaultDialogButton() const { 95 return ui::DIALOG_BUTTON_OK; 96 } 97 98 int JavaScriptAppModalDialogViews::GetDialogButtons() const { 99 if (parent_->javascript_message_type() == 100 content::JAVASCRIPT_MESSAGE_TYPE_ALERT) 101 return ui::DIALOG_BUTTON_OK; 102 103 return ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL; 104 } 105 106 base::string16 JavaScriptAppModalDialogViews::GetWindowTitle() const { 107 return parent_->title(); 108 } 109 110 void JavaScriptAppModalDialogViews::WindowClosing() { 111 #if defined(USE_X11) && !defined(OS_CHROMEOS) 112 event_blocker_x11_.reset(); 113 #endif 114 } 115 116 void JavaScriptAppModalDialogViews::DeleteDelegate() { 117 delete this; 118 } 119 120 bool JavaScriptAppModalDialogViews::Cancel() { 121 parent_->OnCancel(message_box_view_->IsCheckBoxSelected()); 122 return true; 123 } 124 125 bool JavaScriptAppModalDialogViews::Accept() { 126 parent_->OnAccept(message_box_view_->GetInputText(), 127 message_box_view_->IsCheckBoxSelected()); 128 return true; 129 } 130 131 void JavaScriptAppModalDialogViews::OnClosed() { 132 parent_->OnClose(); 133 } 134 135 views::Widget* JavaScriptAppModalDialogViews::GetWidget() { 136 return message_box_view_->GetWidget(); 137 } 138 139 const views::Widget* JavaScriptAppModalDialogViews::GetWidget() const { 140 return message_box_view_->GetWidget(); 141 } 142 143 base::string16 JavaScriptAppModalDialogViews::GetDialogButtonLabel( 144 ui::DialogButton button) const { 145 if (parent_->is_before_unload_dialog()) { 146 if (button == ui::DIALOG_BUTTON_OK) { 147 return l10n_util::GetStringUTF16( 148 parent_->is_reload() ? 149 IDS_BEFORERELOAD_MESSAGEBOX_OK_BUTTON_LABEL : 150 IDS_BEFOREUNLOAD_MESSAGEBOX_OK_BUTTON_LABEL); 151 } else if (button == ui::DIALOG_BUTTON_CANCEL) { 152 return l10n_util::GetStringUTF16( 153 parent_->is_reload() ? 154 IDS_BEFORERELOAD_MESSAGEBOX_CANCEL_BUTTON_LABEL : 155 IDS_BEFOREUNLOAD_MESSAGEBOX_CANCEL_BUTTON_LABEL); 156 } 157 } 158 return DialogDelegate::GetDialogButtonLabel(button); 159 } 160 161 /////////////////////////////////////////////////////////////////////////////// 162 // JavaScriptAppModalDialogViews, views::WidgetDelegate implementation: 163 164 ui::ModalType JavaScriptAppModalDialogViews::GetModalType() const { 165 return ui::MODAL_TYPE_SYSTEM; 166 } 167 168 views::View* JavaScriptAppModalDialogViews::GetContentsView() { 169 return message_box_view_; 170 } 171 172 views::View* JavaScriptAppModalDialogViews::GetInitiallyFocusedView() { 173 if (message_box_view_->text_box()) 174 return message_box_view_->text_box(); 175 return views::DialogDelegate::GetInitiallyFocusedView(); 176 } 177 178 //////////////////////////////////////////////////////////////////////////////// 179 // NativeAppModalDialog, public: 180 181 // static 182 NativeAppModalDialog* NativeAppModalDialog::CreateNativeJavaScriptPrompt( 183 JavaScriptAppModalDialog* dialog, 184 gfx::NativeWindow parent_window) { 185 JavaScriptAppModalDialogViews* d = new JavaScriptAppModalDialogViews(dialog); 186 CreateBrowserModalDialogViews(d, parent_window); 187 return d; 188 } 189