Upstream version 7.35.144.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / gtk / crypto_module_password_dialog_gtk.cc
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/crypto_module_password_dialog.h"
6
7 #include <gtk/gtk.h>
8
9 #include "base/basictypes.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "chrome/browser/ui/gtk/gtk_util.h"
12 #include "grit/generated_resources.h"
13 #include "ui/base/gtk/gtk_hig_constants.h"
14 #include "ui/base/gtk/gtk_signal.h"
15 #include "ui/base/l10n/l10n_util.h"
16 #include "url/gurl.h"
17
18 namespace {
19
20 // TODO(mattm): change into a constrained dialog.
21 class CryptoModulePasswordDialog {
22  public:
23   CryptoModulePasswordDialog(
24       const std::string& slot_name,
25       bool retry,
26       chrome::CryptoModulePasswordReason reason,
27       const std::string& hostname,
28       gfx::NativeWindow parent,
29       const chrome::CryptoModulePasswordCallback& callback);
30
31   ~CryptoModulePasswordDialog() {}
32
33   void Show();
34
35  private:
36   CHROMEGTK_CALLBACK_1(CryptoModulePasswordDialog, void, OnResponse, int);
37   CHROMEGTK_CALLBACK_0(CryptoModulePasswordDialog, void, OnWindowDestroy);
38
39   chrome::CryptoModulePasswordCallback callback_;
40
41   GtkWidget* dialog_;
42   GtkWidget* password_entry_;
43
44   DISALLOW_COPY_AND_ASSIGN(CryptoModulePasswordDialog);
45 };
46
47 CryptoModulePasswordDialog::CryptoModulePasswordDialog(
48     const std::string& slot_name,
49     bool retry,
50     chrome::CryptoModulePasswordReason reason,
51     const std::string& hostname,
52     gfx::NativeWindow parent,
53     const chrome::CryptoModulePasswordCallback& callback)
54     : callback_(callback) {
55   dialog_ = gtk_dialog_new_with_buttons(
56       l10n_util::GetStringUTF8(IDS_CRYPTO_MODULE_AUTH_DIALOG_TITLE).c_str(),
57       parent,
58       GTK_DIALOG_NO_SEPARATOR,
59       NULL);  // Populate the buttons later, for control over the OK button.
60   gtk_dialog_add_button(GTK_DIALOG(dialog_),
61                         GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
62   GtkWidget* ok_button = gtk_util::AddButtonToDialog(
63       dialog_,
64       l10n_util::GetStringUTF8(
65           IDS_CRYPTO_MODULE_AUTH_DIALOG_OK_BUTTON_LABEL).c_str(),
66       GTK_STOCK_OK,
67       GTK_RESPONSE_ACCEPT);
68   gtk_widget_set_can_default(ok_button, TRUE);
69   gtk_dialog_set_default_response(GTK_DIALOG(dialog_), GTK_RESPONSE_ACCEPT);
70
71   // Select an appropriate text for the reason.
72   std::string text;
73   const base::string16& hostname16 = base::UTF8ToUTF16(hostname);
74   const base::string16& slot16 = base::UTF8ToUTF16(slot_name);
75   switch (reason) {
76     case chrome::kCryptoModulePasswordKeygen:
77       text = l10n_util::GetStringFUTF8(
78           IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_KEYGEN, slot16, hostname16);
79       break;
80     case chrome::kCryptoModulePasswordCertEnrollment:
81       text = l10n_util::GetStringFUTF8(
82           IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CERT_ENROLLMENT,
83           slot16,
84           hostname16);
85       break;
86     case chrome::kCryptoModulePasswordClientAuth:
87       text = l10n_util::GetStringFUTF8(
88           IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CLIENT_AUTH, slot16, hostname16);
89       break;
90     case chrome::kCryptoModulePasswordListCerts:
91       text = l10n_util::GetStringFUTF8(
92           IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_LIST_CERTS, slot16);
93       break;
94     case chrome::kCryptoModulePasswordCertImport:
95       text = l10n_util::GetStringFUTF8(
96           IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CERT_IMPORT, slot16);
97       break;
98     case chrome::kCryptoModulePasswordCertExport:
99       text = l10n_util::GetStringFUTF8(
100           IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CERT_EXPORT, slot16);
101       break;
102     default:
103       NOTREACHED();
104   }
105   GtkWidget* label = gtk_label_new(text.c_str());
106   gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
107   gtk_util::LeftAlignMisc(label);
108   gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_)->vbox), label,
109                      FALSE, FALSE, 0);
110
111   password_entry_ = gtk_entry_new();
112   gtk_entry_set_activates_default(GTK_ENTRY(password_entry_), TRUE);
113   gtk_entry_set_visibility(GTK_ENTRY(password_entry_), FALSE);
114
115   GtkWidget* password_box = gtk_hbox_new(FALSE, ui::kLabelSpacing);
116   gtk_box_pack_start(GTK_BOX(password_box),
117                      gtk_label_new(l10n_util::GetStringUTF8(
118                          IDS_CRYPTO_MODULE_AUTH_DIALOG_PASSWORD_FIELD).c_str()),
119                      FALSE, FALSE, 0);
120   gtk_box_pack_start(GTK_BOX(password_box), password_entry_,
121                      TRUE, TRUE, 0);
122
123   gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_)->vbox), password_box,
124                      FALSE, FALSE, 0);
125
126   g_signal_connect(dialog_, "response",
127                    G_CALLBACK(OnResponseThunk), this);
128   g_signal_connect(dialog_, "destroy",
129                    G_CALLBACK(OnWindowDestroyThunk), this);
130 }
131
132 void CryptoModulePasswordDialog::Show() {
133   gtk_util::ShowDialog(dialog_);
134 }
135
136 void CryptoModulePasswordDialog::OnResponse(GtkWidget* dialog,
137                                             int response_id) {
138   if (response_id == GTK_RESPONSE_ACCEPT)
139     callback_.Run(gtk_entry_get_text(GTK_ENTRY(password_entry_)));
140   else
141     callback_.Run(std::string());
142
143   // This will cause gtk to zero out the buffer.  (see
144   // gtk_entry_buffer_normal_delete_text:
145   // http://git.gnome.org/browse/gtk+/tree/gtk/gtkentrybuffer.c#n187)
146   gtk_editable_delete_text(GTK_EDITABLE(password_entry_), 0, -1);
147   gtk_widget_destroy(dialog_);
148 }
149
150 void CryptoModulePasswordDialog::OnWindowDestroy(GtkWidget* widget) {
151   delete this;
152 }
153
154 }  // namespace
155
156 namespace chrome {
157
158 void ShowCryptoModulePasswordDialog(
159     const std::string& slot_name,
160     bool retry,
161     CryptoModulePasswordReason reason,
162     const std::string& hostname,
163     gfx::NativeWindow parent,
164     const CryptoModulePasswordCallback& callback) {
165   (new CryptoModulePasswordDialog(
166        slot_name, retry, reason, hostname, parent, callback))->Show();
167 }
168
169 }  // namespace chrome