172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/js_modal_dialog_gtk.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <gtk/gtk.h> 8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/logging.h" 10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/utf_string_conversions.h" 1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/js_modal_dialog.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/gtk_util.h" 13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h" 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/locale_settings.h" 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/message_box_flags.h" 17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace { 19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// We stash pointers to widgets on the gtk_dialog so we can refer to them 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// after dialog creation. 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst char kPromptTextId[] = "chrome_prompt_text"; 23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst char kSuppressCheckboxId[] = "chrome_suppress_checkbox"; 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// If there's a text entry in the dialog, get the text from the first one and 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// return it. 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::wstring GetPromptText(GtkDialog* dialog) { 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GtkWidget* widget = static_cast<GtkWidget*>( 29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen g_object_get_data(G_OBJECT(dialog), kPromptTextId)); 30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (widget) 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return UTF8ToWide(gtk_entry_get_text(GTK_ENTRY(widget))); 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return std::wstring(); 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// If there's a toggle button in the dialog, return the toggled state. 36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Otherwise, return false. 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool ShouldSuppressJSDialogs(GtkDialog* dialog) { 38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GtkWidget* widget = static_cast<GtkWidget*>( 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen g_object_get_data(G_OBJECT(dialog), kSuppressCheckboxId)); 40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (widget) 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return false; 43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} // namespace 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// JSModalDialogGtk, public: 49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenJSModalDialogGtk::JSModalDialogGtk(JavaScriptAppModalDialog* dialog, 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::NativeWindow parent_window) 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : dialog_(dialog) { 53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GtkButtonsType buttons = GTK_BUTTONS_NONE; 54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GtkMessageType message_type = GTK_MESSAGE_OTHER; 55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // We add in the OK button manually later because we want to focus it 57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // explicitly. 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (dialog_->dialog_flags()) { 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::MessageBoxFlags::kIsJavascriptAlert: 60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen buttons = GTK_BUTTONS_NONE; 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen message_type = GTK_MESSAGE_WARNING; 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::MessageBoxFlags::kIsJavascriptConfirm: 65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (dialog_->is_before_unload_dialog()) { 66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // onbeforeunload also uses a confirm prompt, it just has custom 67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // buttons. We add the buttons using gtk_dialog_add_button below. 68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen buttons = GTK_BUTTONS_NONE; 69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen buttons = GTK_BUTTONS_CANCEL; 71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen message_type = GTK_MESSAGE_QUESTION; 73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::MessageBoxFlags::kIsJavascriptPrompt: 76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen buttons = GTK_BUTTONS_CANCEL; 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen message_type = GTK_MESSAGE_QUESTION; 78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default: 81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED(); 82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // We want the alert to be app modal so put all the browser windows into the 85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // same window group. 86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gtk_util::MakeAppModalWindowGroup(); 87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gtk_dialog_ = gtk_message_dialog_new(parent_window, 89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GTK_DIALOG_MODAL, message_type, buttons, "%s", 90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen WideToUTF8(dialog_->message_text()).c_str()); 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gtk_util::ApplyMessageDialogQuirks(gtk_dialog_); 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gtk_window_set_title(GTK_WINDOW(gtk_dialog_), 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen WideToUTF8(dialog_->title()).c_str()); 94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Adjust content area as needed. Set up the prompt text entry or 96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // suppression check box. 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (ui::MessageBoxFlags::kIsJavascriptPrompt == dialog_->dialog_flags()) { 98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // TODO(tc): Replace with gtk_dialog_get_content_area() when using GTK 2.14+ 99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GtkWidget* contents_vbox = GTK_DIALOG(gtk_dialog_)->vbox; 100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GtkWidget* text_box = gtk_entry_new(); 101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gtk_entry_set_text(GTK_ENTRY(text_box), 102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen WideToUTF8(dialog_->default_prompt_text()).c_str()); 103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gtk_box_pack_start(GTK_BOX(contents_vbox), text_box, TRUE, TRUE, 0); 104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen g_object_set_data(G_OBJECT(gtk_dialog_), kPromptTextId, text_box); 105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gtk_entry_set_activates_default(GTK_ENTRY(text_box), TRUE); 106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (dialog_->display_suppress_checkbox()) { 109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GtkWidget* contents_vbox = GTK_DIALOG(gtk_dialog_)->vbox; 110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GtkWidget* check_box = gtk_check_button_new_with_label( 111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen l10n_util::GetStringUTF8( 112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_JAVASCRIPT_MESSAGEBOX_SUPPRESS_OPTION).c_str()); 113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gtk_box_pack_start(GTK_BOX(contents_vbox), check_box, TRUE, TRUE, 0); 114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen g_object_set_data(G_OBJECT(gtk_dialog_), kSuppressCheckboxId, check_box); 115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Adjust buttons/action area as needed. 118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (dialog_->is_before_unload_dialog()) { 119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string button_text = l10n_util::GetStringUTF8( 120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_BEFOREUNLOAD_MESSAGEBOX_OK_BUTTON_LABEL); 121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gtk_dialog_add_button(GTK_DIALOG(gtk_dialog_), button_text.c_str(), 122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GTK_RESPONSE_OK); 123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen button_text = l10n_util::GetStringUTF8( 125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_BEFOREUNLOAD_MESSAGEBOX_CANCEL_BUTTON_LABEL); 126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gtk_dialog_add_button(GTK_DIALOG(gtk_dialog_), button_text.c_str(), 127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GTK_RESPONSE_CANCEL); 128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Add the OK button and focus it. 130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GtkWidget* ok_button = gtk_dialog_add_button(GTK_DIALOG(gtk_dialog_), 131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GTK_STOCK_OK, GTK_RESPONSE_OK); 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (ui::MessageBoxFlags::kIsJavascriptPrompt != dialog_->dialog_flags()) 133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gtk_widget_grab_focus(ok_button); 134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gtk_dialog_set_default_response(GTK_DIALOG(gtk_dialog_), GTK_RESPONSE_OK); 137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen g_signal_connect(gtk_dialog_, "response", G_CALLBACK(OnResponseThunk), this); 138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenJSModalDialogGtk::~JSModalDialogGtk() { 141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// JSModalDialogGtk, NativeAppModalDialog implementation: 145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenint JSModalDialogGtk::GetAppModalDialogButtons() const { 147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (dialog_->dialog_flags()) { 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::MessageBoxFlags::kIsJavascriptAlert: 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return ui::MessageBoxFlags::DIALOGBUTTON_OK; 150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::MessageBoxFlags::kIsJavascriptConfirm: 15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return ui::MessageBoxFlags::DIALOGBUTTON_OK | 15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::MessageBoxFlags::DIALOGBUTTON_CANCEL; 154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::MessageBoxFlags::kIsJavascriptPrompt: 15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return ui::MessageBoxFlags::DIALOGBUTTON_OK; 157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default: 159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED(); 160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return 0; 161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid JSModalDialogGtk::ShowAppModalDialog() { 165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen gtk_util::ShowDialogWithMinLocalizedWidth(GTK_WIDGET(gtk_dialog_), 166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_ALERT_DIALOG_WIDTH_CHARS); 167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid JSModalDialogGtk::ActivateAppModalDialog() { 170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(gtk_dialog_); 171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gtk_window_present(GTK_WINDOW(gtk_dialog_));} 172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid JSModalDialogGtk::CloseAppModalDialog() { 174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(gtk_dialog_); 175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen OnResponse(gtk_dialog_, GTK_RESPONSE_DELETE_EVENT); 176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid JSModalDialogGtk::AcceptAppModalDialog() { 179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen OnResponse(gtk_dialog_, GTK_RESPONSE_OK); 180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid JSModalDialogGtk::CancelAppModalDialog() { 183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen OnResponse(gtk_dialog_, GTK_RESPONSE_CANCEL); 184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// JSModalDialogGtk, private: 188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 189dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid JSModalDialogGtk::OnResponse(GtkWidget* dialog, int response_id) { 190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (response_id) { 191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case GTK_RESPONSE_OK: 192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The first arg is the prompt text and the second is true if we want to 193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // suppress additional popups from the page. 19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen dialog_->OnAccept(GetPromptText(GTK_DIALOG(dialog)), 19521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ShouldSuppressJSDialogs(GTK_DIALOG(dialog))); 196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case GTK_RESPONSE_CANCEL: 199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case GTK_RESPONSE_DELETE_EVENT: // User hit the X on the dialog. 20021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen dialog_->OnCancel(ShouldSuppressJSDialogs(GTK_DIALOG(dialog))); 201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default: 204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED(); 205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 206dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen gtk_widget_destroy(dialog); 207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Now that the dialog is gone, we can put all the windows into separate 209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // window groups so other dialogs are no longer app modal. 210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gtk_util::AppModalDismissedUngroupWindows(); 211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete this; 212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// NativeAppModalDialog, public: 216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// static 218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenNativeAppModalDialog* NativeAppModalDialog::CreateNativeJavaScriptPrompt( 219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen JavaScriptAppModalDialog* dialog, 220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::NativeWindow parent_window) { 221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return new JSModalDialogGtk(dialog, parent_window); 222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 223