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