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-05-28 23:54:47 +0000
committertc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-28 23:54:47 +0000
commitf7772088ff4e4579837bc30d862b9290529eea98 (patch)
treef033be4c6f0ad7fbc6d019e80f4dee8b6a5fc1bc /chrome/browser/app_modal_dialog_gtk.cc
parentbaed3d0c300c390e294928d0b79641000522d7b3 (diff)
downloadchromium_src-f7772088ff4e4579837bc30d862b9290529eea98.zip
chromium_src-f7772088ff4e4579837bc30d862b9290529eea98.tar.gz
chromium_src-f7772088ff4e4579837bc30d862b9290529eea98.tar.bz2
Add alert box suppression check box to linux js dialogs.
BUG=12174 Review URL: http://codereview.chromium.org/115893 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17136 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/app_modal_dialog_gtk.cc')
-rw-r--r--chrome/browser/app_modal_dialog_gtk.cc81
1 files changed, 57 insertions, 24 deletions
diff --git a/chrome/browser/app_modal_dialog_gtk.cc b/chrome/browser/app_modal_dialog_gtk.cc
index 1ffbd39..72603a2 100644
--- a/chrome/browser/app_modal_dialog_gtk.cc
+++ b/chrome/browser/app_modal_dialog_gtk.cc
@@ -16,20 +16,29 @@
namespace {
+// We stash pointers to widgets on the gtk_dialog so we can refer to them
+// after dialog creation.
+const char kPromptTextId[] = "chrome_prompt_text";
+const char kSuppressCheckboxId[] = "chrome_suppress_checkbox";
+
// If there's a text entry in the dialog, get the text from the first one and
// return it.
std::wstring GetPromptText(GtkDialog* dialog) {
- std::wstring text;
- // TODO(tc): Replace with gtk_dialog_get_content_area() when using GTK 2.14+
- GtkWidget* contents_vbox = dialog->vbox;
- GList* first_child = gtk_container_get_children(GTK_CONTAINER(contents_vbox));
- for (GList* item = first_child; item; item = g_list_next(item)) {
- if (GTK_IS_ENTRY(item->data)) {
- text = UTF8ToWide(gtk_entry_get_text(GTK_ENTRY(item->data)));
- }
- }
- g_list_free(first_child);
- return text;
+ GtkWidget* widget = static_cast<GtkWidget*>(
+ g_object_get_data(G_OBJECT(dialog), kPromptTextId));
+ if (widget)
+ return UTF8ToWide(gtk_entry_get_text(GTK_ENTRY(widget)));
+ return std::wstring();
+}
+
+// If there's a toggle button in the dialog, return the toggled state.
+// Otherwise, return false.
+bool ShouldSuppressJSDialogs(GtkDialog* dialog) {
+ GtkWidget* widget = static_cast<GtkWidget*>(
+ g_object_get_data(G_OBJECT(dialog), kSuppressCheckboxId));
+ if (widget)
+ return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+ return false;
}
void OnDialogResponse(GtkDialog* dialog, gint response_id,
@@ -38,7 +47,8 @@ void OnDialogResponse(GtkDialog* dialog, gint 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(GetPromptText(dialog), false);
+ app_modal_dialog->OnAccept(GetPromptText(dialog),
+ ShouldSuppressJSDialogs(dialog));
break;
case GTK_RESPONSE_CANCEL:
@@ -61,9 +71,11 @@ AppModalDialog::~AppModalDialog() {
void AppModalDialog::CreateAndShowDialog() {
GtkButtonsType buttons = GTK_BUTTONS_NONE;
GtkMessageType message_type = GTK_MESSAGE_OTHER;
+ // We add in the OK button manually later because we want to focus it
+ // explicitly.
switch (dialog_flags_) {
case MessageBoxFlags::kIsJavascriptAlert:
- buttons = GTK_BUTTONS_OK;
+ buttons = GTK_BUTTONS_NONE;
message_type = GTK_MESSAGE_WARNING;
break;
@@ -73,13 +85,13 @@ void AppModalDialog::CreateAndShowDialog() {
// buttons. We add the buttons using gtk_dialog_add_button below.
buttons = GTK_BUTTONS_NONE;
} else {
- buttons = GTK_BUTTONS_OK_CANCEL;
+ buttons = GTK_BUTTONS_CANCEL;
}
message_type = GTK_MESSAGE_QUESTION;
break;
case MessageBoxFlags::kIsJavascriptPrompt:
- buttons = GTK_BUTTONS_OK_CANCEL;
+ buttons = GTK_BUTTONS_CANCEL;
message_type = GTK_MESSAGE_QUESTION;
break;
@@ -92,6 +104,27 @@ void AppModalDialog::CreateAndShowDialog() {
message_type, buttons, "%s", WideToUTF8(message_text_).c_str());
gtk_window_set_title(GTK_WINDOW(dialog_), WideToUTF8(title_).c_str());
+ // Adjust content area as needed.
+ if (MessageBoxFlags::kIsJavascriptPrompt == dialog_flags_) {
+ // TODO(tc): Replace with gtk_dialog_get_content_area() when using GTK 2.14+
+ GtkWidget* contents_vbox = GTK_DIALOG(dialog_)->vbox;
+ GtkWidget* text_box = gtk_entry_new();
+ gtk_entry_set_text(GTK_ENTRY(text_box),
+ WideToUTF8(default_prompt_text_).c_str());
+ gtk_box_pack_start(GTK_BOX(contents_vbox), text_box, TRUE, TRUE, 0);
+ g_object_set_data(G_OBJECT(dialog_), kPromptTextId, text_box);
+ }
+
+ if (display_suppress_checkbox_) {
+ GtkWidget* contents_vbox = GTK_DIALOG(dialog_)->vbox;
+ GtkWidget* check_box = gtk_check_button_new_with_label(
+ l10n_util::GetStringUTF8(
+ IDS_JAVASCRIPT_MESSAGEBOX_SUPPRESS_OPTION).c_str());
+ gtk_box_pack_start(GTK_BOX(contents_vbox), check_box, TRUE, TRUE, 0);
+ g_object_set_data(G_OBJECT(dialog_), kSuppressCheckboxId, check_box);
+ }
+
+ // Adjust buttons/action area as needed.
if (is_before_unload_dialog_) {
std::string button_text = l10n_util::GetStringUTF8(
IDS_BEFOREUNLOAD_MESSAGEBOX_OK_BUTTON_LABEL);
@@ -102,18 +135,18 @@ void AppModalDialog::CreateAndShowDialog() {
IDS_BEFOREUNLOAD_MESSAGEBOX_CANCEL_BUTTON_LABEL);
gtk_dialog_add_button(GTK_DIALOG(dialog_), button_text.c_str(),
GTK_RESPONSE_CANCEL);
- } else if (MessageBoxFlags::kIsJavascriptPrompt == dialog_flags_) {
- // TODO(tc): Replace with gtk_dialog_get_content_area() when using GTK 2.14+
- GtkWidget* contents_vbox = GTK_DIALOG(dialog_)->vbox;
- GtkWidget* text_box = gtk_entry_new();
- gtk_entry_set_text(GTK_ENTRY(text_box),
- WideToUTF8(default_prompt_text_).c_str());
- gtk_widget_show(text_box);
- gtk_box_pack_start(GTK_BOX(contents_vbox), text_box, TRUE, TRUE, 0);
+ } else {
+ // Add the OK button and focus it.
+ GtkWidget* ok_button = gtk_dialog_add_button(GTK_DIALOG(dialog_),
+ GTK_STOCK_OK, GTK_RESPONSE_OK);
+ if (MessageBoxFlags::kIsJavascriptPrompt != dialog_flags_)
+ gtk_widget_grab_focus(ok_button);
}
+ gtk_dialog_set_default_response(GTK_DIALOG(dialog_), GTK_RESPONSE_OK);
g_signal_connect(dialog_, "response", G_CALLBACK(OnDialogResponse), this);
- gtk_widget_show(GTK_WIDGET(GTK_DIALOG(dialog_)));
+
+ gtk_widget_show_all(GTK_WIDGET(GTK_DIALOG(dialog_)));
}
void AppModalDialog::ActivateModalDialog() {