diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-21 22:25:14 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-21 22:25:14 +0000 |
commit | fa92e34dd1c84b0a7e1e5042f88280a9c6050b72 (patch) | |
tree | 84ac7e4d51ba40df3a22b6e78510e746b3e78de7 | |
parent | 663589d1aaea88b2ccb0c3b91040e30ab79f0d35 (diff) | |
download | chromium_src-fa92e34dd1c84b0a7e1e5042f88280a9c6050b72.zip chromium_src-fa92e34dd1c84b0a7e1e5042f88280a9c6050b72.tar.gz chromium_src-fa92e34dd1c84b0a7e1e5042f88280a9c6050b72.tar.bz2 |
GTK: add checkbox to external protocol dialog.
BUG=24085
TEST=<a href="aim:goim?screenname=JerseyGrl&message=lol">Click here to message me on AIM!</a>
Review URL: http://codereview.chromium.org/306017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29721 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/gtk/external_protocol_dialog_gtk.cc | 51 | ||||
-rw-r--r-- | chrome/browser/gtk/external_protocol_dialog_gtk.h | 10 |
2 files changed, 48 insertions, 13 deletions
diff --git a/chrome/browser/gtk/external_protocol_dialog_gtk.cc b/chrome/browser/gtk/external_protocol_dialog_gtk.cc index 2202cc1..3111b3a 100644 --- a/chrome/browser/gtk/external_protocol_dialog_gtk.cc +++ b/chrome/browser/gtk/external_protocol_dialog_gtk.cc @@ -44,14 +44,18 @@ ExternalProtocolDialogGtk::ExternalProtocolDialogGtk(const GURL& url) l10n_util::GetStringUTF8(IDS_EXTERNAL_PROTOCOL_TITLE).c_str(), NULL, GTK_DIALOG_NO_SEPARATOR, - GTK_STOCK_CANCEL, - GTK_RESPONSE_REJECT, NULL); + // Add the response buttons. + gtk_util::AddButtonToDialog(dialog_, + l10n_util::GetStringUTF8( + IDS_EXTERNAL_PROTOCOL_CANCEL_BUTTON_TEXT).c_str(), + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT); gtk_util::AddButtonToDialog(dialog_, l10n_util::GetStringUTF8(IDS_EXTERNAL_PROTOCOL_OK_BUTTON_TEXT).c_str(), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT); + // Construct the message text. std::string message_text = l10n_util::GetStringFUTF8( IDS_EXTERNAL_PROTOCOL_INFORMATION, ASCIIToUTF16(url.scheme() + ":"), @@ -63,27 +67,54 @@ ExternalProtocolDialogGtk::ExternalProtocolDialogGtk(const GURL& url) message_text += l10n_util::GetStringUTF8(IDS_EXTERNAL_PROTOCOL_WARNING); + // Create the content-holding vbox. + GtkWidget* vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); + gtk_container_set_border_width(GTK_CONTAINER(vbox), + gtk_util::kContentAreaBorder); + + // Add the message text. GtkWidget* label = gtk_label_new(message_text.c_str()); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_widget_set_size_request(label, kMessageWidth, -1); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_)->vbox), label, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); + + // Add the checkbox. + checkbox_ = gtk_check_button_new_with_label( + l10n_util::GetStringUTF8(IDS_EXTERNAL_PROTOCOL_CHECKBOX_TEXT).c_str()); + gtk_box_pack_start(GTK_BOX(vbox), checkbox_, + FALSE, FALSE, 0); + + // Add our vbox to the dialog. + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_)->vbox), vbox, + FALSE, FALSE, 0); g_signal_connect(dialog_, "response", - G_CALLBACK(OnDialogResponse), this); + G_CALLBACK(OnDialogResponseThunk), this); gtk_window_set_resizable(GTK_WINDOW(dialog_), FALSE); gtk_widget_show_all(dialog_); } -void ExternalProtocolDialogGtk::OnDialogResponse(GtkWidget* widget, - int response, ExternalProtocolDialogGtk* dialog) { +void ExternalProtocolDialogGtk::OnDialogResponse(int response) { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox_))) { + if (response == GTK_RESPONSE_ACCEPT) { + ExternalProtocolHandler::SetBlockState( + UTF8ToWide(url_.scheme()), ExternalProtocolHandler::DONT_BLOCK); + } else if (response == GTK_RESPONSE_REJECT) { + ExternalProtocolHandler::SetBlockState( + UTF8ToWide(url_.scheme()), ExternalProtocolHandler::BLOCK); + } + // If the response is GTK_RESPONSE_DELETE, triggered by the user closing + // the dialog, do nothing. + } + if (response == GTK_RESPONSE_ACCEPT) { UMA_HISTOGRAM_LONG_TIMES("clickjacking.launch_url", - base::Time::Now() - dialog->creation_time_); + base::Time::Now() - creation_time_); - ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(dialog->url_); + ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(url_); } - gtk_widget_destroy(widget); - delete dialog; + gtk_widget_destroy(dialog_); + delete this; } diff --git a/chrome/browser/gtk/external_protocol_dialog_gtk.h b/chrome/browser/gtk/external_protocol_dialog_gtk.h index 0e2cac9..748739a 100644 --- a/chrome/browser/gtk/external_protocol_dialog_gtk.h +++ b/chrome/browser/gtk/external_protocol_dialog_gtk.h @@ -17,11 +17,15 @@ class ExternalProtocolDialogGtk { explicit ExternalProtocolDialogGtk(const GURL& url); private: - static void OnDialogResponse(GtkWidget* widget, - int response, - ExternalProtocolDialogGtk* dialog); + static void OnDialogResponseThunk(GtkWidget* widget, + int response, + ExternalProtocolDialogGtk* dialog) { + dialog->OnDialogResponse(response); + } + void OnDialogResponse(int response); GtkWidget* dialog_; + GtkWidget* checkbox_; GURL url_; base::Time creation_time_; }; |