summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-21 22:25:14 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-21 22:25:14 +0000
commitfa92e34dd1c84b0a7e1e5042f88280a9c6050b72 (patch)
tree84ac7e4d51ba40df3a22b6e78510e746b3e78de7
parent663589d1aaea88b2ccb0c3b91040e30ab79f0d35 (diff)
downloadchromium_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.cc51
-rw-r--r--chrome/browser/gtk/external_protocol_dialog_gtk.h10
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_;
};