diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-03 21:33:21 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-03 21:33:21 +0000 |
commit | 10f57b9be42b705fd1bed1a97acd90c8c885c396 (patch) | |
tree | 77d5fbbace6a41dc28ace3b4f573fc917aae61da /chrome/browser/gtk/external_protocol_dialog_gtk.cc | |
parent | df891031f2d5bd26eccd180fea4deb4797dd7a60 (diff) | |
download | chromium_src-10f57b9be42b705fd1bed1a97acd90c8c885c396.zip chromium_src-10f57b9be42b705fd1bed1a97acd90c8c885c396.tar.gz chromium_src-10f57b9be42b705fd1bed1a97acd90c8c885c396.tar.bz2 |
Add external protocol dialog for Linux.
This exposes a bug where \n in a string resource is rendered literally when it is displayed. I don't know at what point on Windows the '\' + 'n' is translated to a line return, I have filed crbug.com/20943
BUG=20731
Review URL: http://codereview.chromium.org/194002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@25373 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk/external_protocol_dialog_gtk.cc')
-rw-r--r-- | chrome/browser/gtk/external_protocol_dialog_gtk.cc | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/chrome/browser/gtk/external_protocol_dialog_gtk.cc b/chrome/browser/gtk/external_protocol_dialog_gtk.cc new file mode 100644 index 0000000..538579e --- /dev/null +++ b/chrome/browser/gtk/external_protocol_dialog_gtk.cc @@ -0,0 +1,92 @@ +// 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/gtk/external_protocol_dialog_gtk.h" + +#include <gtk/gtk.h> + +#include "app/l10n_util.h" +#include "base/histogram.h" +#include "chrome/browser/external_protocol_handler.h" +#include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/browser/tab_contents/tab_contents_view.h" +#include "chrome/browser/tab_contents/tab_util.h" +#include "chrome/common/gtk_util.h" +#include "grit/chromium_strings.h" +#include "grit/generated_resources.h" + +namespace { + +const int kMessageWidth = 400; + +} // namespace + +/////////////////////////////////////////////////////////////////////////////// +// ExternalProtocolHandler + +// static +void ExternalProtocolHandler::RunExternalProtocolDialog( + const GURL& url, int render_process_host_id, int routing_id) { + TabContents* tab_contents = tab_util::GetTabContentsByID( + render_process_host_id, routing_id); + new ExternalProtocolDialogGtk(url, tab_contents); +} + +/////////////////////////////////////////////////////////////////////////////// +// ExternalProtocolDialogGtk + +ExternalProtocolDialogGtk::ExternalProtocolDialogGtk( + const GURL& url, TabContents* tab_contents) + : url_(url), + creation_time_(base::Time::Now()) { + GtkWindow* parent = tab_contents ? + tab_contents->view()->GetTopLevelNativeWindow() : NULL; + + dialog_ = gtk_dialog_new_with_buttons( + l10n_util::GetStringUTF8(IDS_EXTERNAL_PROTOCOL_TITLE).c_str(), + parent, + (GtkDialogFlags) (GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR), + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + NULL); + + gtk_util::AddButtonToDialog(dialog_, + l10n_util::GetStringUTF8(IDS_EXTERNAL_PROTOCOL_OK_BUTTON_TEXT).c_str(), + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT); + + std::string message_text = l10n_util::GetStringFUTF8( + IDS_EXTERNAL_PROTOCOL_INFORMATION, + ASCIIToUTF16(url.scheme() + ":"), + ASCIIToUTF16(url.possibly_invalid_spec())) + "\n\n"; + + message_text += l10n_util::GetStringFUTF8( + IDS_EXTERNAL_PROTOCOL_APPLICATION_TO_LAUNCH, + ASCIIToUTF16(std::string("xdg-open ") + url.spec())) + "\n\n"; + + message_text += l10n_util::GetStringUTF8(IDS_EXTERNAL_PROTOCOL_WARNING); + + 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); + + g_signal_connect(dialog_, "response", + G_CALLBACK(OnDialogResponse), this); + + gtk_window_set_resizable(GTK_WINDOW(dialog_), FALSE); + gtk_widget_show_all(dialog_); +} + +void ExternalProtocolDialogGtk::OnDialogResponse(GtkWidget* widget, + int response, ExternalProtocolDialogGtk* dialog) { + if (response == GTK_RESPONSE_ACCEPT) { + UMA_HISTOGRAM_LONG_TIMES("clickjacking.launch_url", + base::Time::Now() - dialog->creation_time_); + + ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(dialog->url_); + } + + gtk_widget_destroy(widget); + delete dialog; +} |