summaryrefslogtreecommitdiffstats
path: root/chrome/browser/app_modal_dialog_gtk.cc
diff options
context:
space:
mode:
authortc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-09 18:17:09 +0000
committertc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-09 18:17:09 +0000
commit464146ec15e527148efee8f6470dc4e6520d0ce4 (patch)
treec401012623265dba9c228dc14d253bc2cfeff9a3 /chrome/browser/app_modal_dialog_gtk.cc
parent0e9020e23d636a40d32e83ce306468683ed03b01 (diff)
downloadchromium_src-464146ec15e527148efee8f6470dc4e6520d0ce4.zip
chromium_src-464146ec15e527148efee8f6470dc4e6520d0ce4.tar.gz
chromium_src-464146ec15e527148efee8f6470dc4e6520d0ce4.tar.bz2
Actually implement js message boxes on linux. This handles
alert, confirm and onbeforeunload. prompt has a dialog, but there's no text field. I'll work on that next. It turns out there's no nested message loop on the windows side, so there's no nested message loop here either. BUG=9493 Review URL: http://codereview.chromium.org/63134 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@13437 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/app_modal_dialog_gtk.cc')
-rw-r--r--chrome/browser/app_modal_dialog_gtk.cc120
1 files changed, 120 insertions, 0 deletions
diff --git a/chrome/browser/app_modal_dialog_gtk.cc b/chrome/browser/app_modal_dialog_gtk.cc
new file mode 100644
index 0000000..37a4ac2
--- /dev/null
+++ b/chrome/browser/app_modal_dialog_gtk.cc
@@ -0,0 +1,120 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/app_modal_dialog.h"
+
+#include <gtk/gtk.h>
+
+#include "base/logging.h"
+#include "base/string_util.h"
+#include "chrome/browser/tab_contents/web_contents.h"
+#include "chrome/browser/tab_contents/web_contents_view.h"
+#include "chrome/common/l10n_util.h"
+#include "chrome/common/message_box_flags.h"
+#include "grit/generated_resources.h"
+
+namespace {
+
+void OnDialogResponse(GtkDialog* dialog, gint response_id,
+ AppModalDialog* app_modal_dialog) {
+ switch (response_id) {
+ case GTK_RESPONSE_OK:
+ // The first arg is the prompt text and the second is true if we want to
+ // suppress additional popups from the page.
+ app_modal_dialog->OnAccept(std::wstring(), false);
+ break;
+
+ case GTK_RESPONSE_CANCEL:
+ case GTK_RESPONSE_DELETE_EVENT: // User hit the X on the dialog.
+ app_modal_dialog->OnCancel();
+ break;
+
+ default:
+ NOTREACHED();
+ }
+ gtk_widget_destroy(GTK_WIDGET(dialog));
+ delete app_modal_dialog;
+}
+
+} // namespace
+
+AppModalDialog::~AppModalDialog() {
+}
+
+void AppModalDialog::CreateAndShowDialog() {
+ GtkButtonsType buttons;
+ GtkMessageType message_type;
+ switch (dialog_flags_) {
+ case MessageBox::kIsJavascriptAlert:
+ buttons = GTK_BUTTONS_OK;
+ message_type = GTK_MESSAGE_WARNING;
+ break;
+
+ case MessageBox::kIsJavascriptConfirm:
+ if (is_before_unload_dialog_) {
+ // onbeforeunload also uses a confirm prompt, it just has custom
+ // buttons. We add the buttons using gtk_dialog_add_button below.
+ buttons = GTK_BUTTONS_NONE;
+ } else {
+ buttons = GTK_BUTTONS_OK_CANCEL;
+ }
+ message_type = GTK_MESSAGE_QUESTION;
+ break;
+
+ case MessageBox::kIsJavascriptPrompt:
+ // We need to make a custom message box for javascript prompts. For now
+ // just have an OK button and send back an empty string. Maybe we can
+ // cram a GtkEntry into the content area of the message box via
+ // gtk_dialog_get_content_area.
+ // http://crbug.com/9623
+ NOTIMPLEMENTED();
+ buttons = GTK_BUTTONS_OK;
+ message_type = GTK_MESSAGE_QUESTION;
+ break;
+
+ default:
+ NOTREACHED();
+ }
+
+ GtkWindow* window = web_contents_->view()->GetTopLevelNativeWindow();
+ dialog_ = gtk_message_dialog_new(window, GTK_DIALOG_MODAL,
+ message_type, buttons, WideToUTF8(message_text_).c_str());
+ gtk_window_set_title(GTK_WINDOW(dialog_), WideToUTF8(title_).c_str());
+
+ if (is_before_unload_dialog_) {
+ std::string button_text = l10n_util::GetStringUTF8(
+ IDS_BEFOREUNLOAD_MESSAGEBOX_OK_BUTTON_LABEL);
+ gtk_dialog_add_button(GTK_DIALOG(dialog_), button_text.c_str(),
+ GTK_RESPONSE_OK);
+
+ button_text = l10n_util::GetStringUTF8(
+ IDS_BEFOREUNLOAD_MESSAGEBOX_CANCEL_BUTTON_LABEL);
+ gtk_dialog_add_button(GTK_DIALOG(dialog_), button_text.c_str(),
+ GTK_RESPONSE_CANCEL);
+ }
+
+ g_signal_connect(dialog_, "response", G_CALLBACK(OnDialogResponse), this);
+ gtk_widget_show(GTK_WIDGET(GTK_DIALOG(dialog_)));
+}
+
+void AppModalDialog::ActivateModalDialog() {
+ NOTIMPLEMENTED();
+}
+
+void AppModalDialog::CloseModalDialog() {
+ NOTIMPLEMENTED();
+}
+
+int AppModalDialog::GetDialogButtons() {
+ NOTIMPLEMENTED();
+ return 0;
+}
+
+void AppModalDialog::AcceptWindow() {
+ NOTIMPLEMENTED();
+}
+
+void AppModalDialog::CancelWindow() {
+ NOTIMPLEMENTED();
+}